Modül:Bilgi kutusu

Vikipedi, özgür ansiklopedi

Modül belgelemesi[gör] [değiştir] [geçmiş] [temizle]

Bu modülle {{Bilgi kutusu}} şablonu yürütülür.

-- {{Bilgi kutusu}} modülüdür local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]' local has_rows = false local lists = { 	plainlist_t = { 		patterns = { 			'^plainlist$', 			'%splainlist$', 			'^plainlist%s', 			'%splainlist%s' 		}, 		found = false, 		styles = 'Yalın liste/styles.css' 	}, 	hlist_t = { 		patterns = { 			'^hlist$', 			'%shlist$', 			'^hlist%s', 			'%shlist%s' 		}, 		found = false, 		styles = 'Yatay liste/styles.css' 	} }  local function has_list_class(args_to_check) 	for _, list in pairs(lists) do 		if not list.found then 			for _, arg in pairs(args_to_check) do 				for _, pattern in ipairs(list.patterns) do 					if mw.ustring.find(arg or '', pattern) then 						list.found = true 						break 					end 				end 				if list.found then break end 			end 		end 	end end  local function fixChildBoxes(sval, tt) 	local function notempty( s ) return s and s:match( '%S' ) end 	 	if notempty(sval) then 		local marker = '<span class=special_infobox_marker>' 		local s = sval 		-- start moving templatestyles and categories inside of table rows 		local slast = '' 		while slast ~= s do 			slast = s 			s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1') 			s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1') 		end 		-- end moving templatestyles and categories inside of table rows 		s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') 		s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) 		if s:match(marker) then 			s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') 			s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') 			s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') 			s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') 			s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') 			s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') 			s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') 			s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') 			s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') 		end 		if s:match(marker) then 			local subcells = mw.text.split(s, marker) 			s = '' 			for k = 1, #subcells do 				if k == 1 then 					s = s .. subcells[k] .. '</' .. tt .. '></tr>' 				elseif k == #subcells then 					local rowstyle = ' style="display:none"' 					if notempty(subcells[k]) then rowstyle = ''	end 					s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. 						subcells[k] 				elseif notempty(subcells[k]) then 					if (k % 2) == 0 then 						s = s .. subcells[k] 					else 						s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. 							subcells[k] .. '</' .. tt .. '></tr>' 					end 				end 			end 		end 		-- the next two lines add a newline at the end of lists for the PHP parser 		-- [[Special:Diff/849054481]] 		-- remove when [[:phab:T191516]] is fixed or OBE 		s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') 		s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') 		s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') 		s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') 		return s 	else 		return sval 	end end  -- Cleans empty tables local function cleanInfobox() 	root = tostring(root) 	if has_rows == false then 		root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '') 	end end  -- Returns the union of the values of two tables, as a sequence. local function union(t1, t2)  	local vals = {} 	for k, v in pairs(t1) do 		vals[v] = true 	end 	for k, v in pairs(t2) do 		vals[v] = true 	end 	local ret = {} 	for k, v in pairs(vals) do 		table.insert(ret, k) 	end 	return ret end  -- Returns a table containing the numbers of the arguments that exist -- for the specified prefix. For example, if the prefix was 'data', and -- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}. local function getArgNums(prefix) 	local nums = {} 	for k, v in pairs(args) do 		local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') 		if num then table.insert(nums, tonumber(num)) end 	end 	table.sort(nums) 	return nums end  -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. local function addRow(rowArgs) 	 	if rowArgs.header and rowArgs.header ~= '_BLANK_' then 		has_rows = true 		has_list_class({ rowArgs.rowclass, rowArgs.class, args['başlıksınıfı'] }) 		 		root 			:tag('tr') 				:addClass(rowArgs.rowclass) 				:cssText(rowArgs.rowstyle) 				:tag('th') 					:attr('colspan', '2') 					:addClass('infobox-header') 					:addClass(rowArgs.class) 					:addClass(args['başlıksınıfı']) 					-- @deprecated next; target .infobox-<name> .infobox-header 					:cssText(args['başlıkbiçimi']) 					:cssText(rowArgs.rowcellstyle) 					:wikitext(fixChildBoxes(rowArgs.header, 'th'))  	elseif rowArgs.data then 		has_rows = true 		has_list_class({ rowArgs.rowclass, rowArgs.class }) 		 		local row = root:tag('tr') 		row:addClass(rowArgs.rowclass) 		row:cssText(rowArgs.rowstyle) 		if rowArgs.label then 			row 				:tag('th') 					:attr('scope', 'row') 					:addClass('infobox-label') 					-- @deprecated next; target .infobox-<name> .infobox-label 					:cssText(args['etiketbiçimi']) 					:cssText(rowArgs.rowcellstyle) 					:wikitext(rowArgs.label) 					:done() 		end  		local dataCell = row:tag('td') 		dataCell 			:attr('colspan', not rowArgs.label and '2' or nil) 			:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data') 			:addClass(rowArgs.class) 			-- @deprecated next; target .infobox-<name> .infobox(-full)-data 			:cssText(rowArgs.datastyle) 			:cssText(rowArgs.rowcellstyle) 			:wikitext(fixChildBoxes(rowArgs.data, 'td')) 	else 		table.insert(empty_row_categories, rowArgs.data or '') 	end end  local function renderTitle() 	if not args['anabaşlık'] then return end  	has_rows = true 	has_list_class({args['anabaşlıksınıfı']}) 	 	root 		:tag('caption') 			:addClass('infobox-title') 			:addClass(args['anabaşlıksınıfı']) 			-- @deprecated next; target .infobox-<name> .infobox-title 			:cssText(args['anabaşlıkbiçimi']) 			:wikitext(args['anabaşlık']) 	 end  local function renderAboveRow() 	if not args['üst'] then return end  	has_rows = true 	has_list_class({ args['üstsınıf'] }) 	 	root 		:tag('tr') 			:tag('th') 				:attr('colspan', '2') 				:addClass('infobox-above') 				:addClass(args['üstsınıf']) 				-- @deprecated next; target .infobox-<name> .infobox-above 				:cssText(args['üstbiçim']) 				:wikitext(fixChildBoxes(args['üst'],'th')) end  local function renderBelowRow() 	if not args['alt'] then return end  	has_rows = true 	has_list_class({ args['altsınıf'] }) 	 	root 		:tag('tr') 			:tag('td') 				:attr('colspan', '2') 				:addClass('infobox-below') 				:addClass(args['altsınıf']) 				-- @deprecated next; target .infobox-<name> .infobox-below 				:cssText(args['altbiçim']) 				:wikitext(fixChildBoxes(args['alt'],'td')) end  local function addSubheaderRow(subheaderArgs) 	if subheaderArgs.data and 		subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then 		has_rows = true 		has_list_class({ subheaderArgs.rowclass, subheaderArgs.class }) 		 		local row = root:tag('tr') 		row:addClass(subheaderArgs.rowclass)  		local dataCell = row:tag('td') 		dataCell 			:attr('colspan', '2') 			:addClass('infobox-subheader') 			:addClass(subheaderArgs.class) 			:cssText(subheaderArgs.datastyle) 			:cssText(subheaderArgs.rowcellstyle) 			:wikitext(fixChildBoxes(subheaderArgs.data, 'td')) 	else 		table.insert(empty_row_categories, subheaderArgs.data or '') 	end end  local function renderSubheaders() 	if args['altbaşlık'] then 		args['altbaşlık1'] = args['altbaşlık'] 	end 	if args['altbaşlıksırasınıfı'] then 		args['altbaşlıksırasınıfı1'] = args['altbaşlıksırasınıfı'] 	end 	local subheadernums = getArgNums('altbaşlık') 	for k, num in ipairs(subheadernums) do 		addSubheaderRow({ 			data = args['altbaşlık' .. tostring(num)], 			-- @deprecated next; target .infobox-<name> .infobox-subheader 			datastyle = args['altbaşlıkbiçimi'], 			rowcellstyle = args['altbaşlıkbiçimi' .. tostring(num)], 			class = args['altbaşlıkbiçimi'], 			rowclass = args['altbaşlıksırasınıfı' .. tostring(num)] 		}) 	end end  local function addImageRow(imageArgs)  	if imageArgs.data and 		imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then  		has_rows = true 		has_list_class({ imageArgs.rowclass, imageArgs.class }) 		 		local row = root:tag('tr') 		row:addClass(imageArgs.rowclass)  		local dataCell = row:tag('td') 		dataCell 			:attr('colspan', '2') 			:addClass('infobox-image') 			:addClass(imageArgs.class) 			:cssText(imageArgs.datastyle) 			:wikitext(fixChildBoxes(imageArgs.data, 'td')) 	else 		table.insert(empty_row_categories, imageArgs.data or '') 	end end  local function renderImages() 	if args['resim'] then 		args['resim1'] = args['resim'] 	end 	if args['altyazı'] then 		args['altyazı1'] = args['altyazı'] 	end 	local imagenums = getArgNums('resim') 	for k, num in ipairs(imagenums) do 		local caption = args['altyazı' .. tostring(num)] 		local data = mw.html.create():wikitext(args['resim' .. tostring(num)]) 		if caption then 			data 				:tag('div') 					:addClass('infobox-caption') 					-- @deprecated next; target .infobox-<name> .infobox-caption 					:cssText(args['altyazıbiçimi']) 					:wikitext(caption) 		end 		addImageRow({ 			data = tostring(data), 			-- @deprecated next; target .infobox-<name> .infobox-image 			datastyle = args['resimbiçimi'], 			class = args['resimsınıfı'], 			rowclass = args['resimsırasınıfı' .. tostring(num)] 		}) 	end end  -- When autoheaders are turned on, preprocesses the rows local function preprocessRows() 	if not args['otobaşlıklar'] then return end 	 	local rownums = union(getArgNums('başlık'), getArgNums('veri')) 	table.sort(rownums) 	local lastheader 	for k, num in ipairs(rownums) do 		if args['başlık' .. tostring(num)] then 			if lastheader then 				args['başlık' .. tostring(lastheader)] = nil 			end 			lastheader = num 		elseif args['veri' .. tostring(num)] and 			args['veri' .. tostring(num)]:gsub( 				category_in_empty_row_pattern, '' 			):match('^%S') then 			local data = args['veri' .. tostring(num)] 			if data:gsub(category_in_empty_row_pattern, ''):match('%S') then 				lastheader = nil 			end 		end 	end 	if lastheader then 		args['başlık' .. tostring(lastheader)] = nil 	end end  -- Gets the union of the header and data argument numbers, -- and renders them all in order local function renderRows()  	local rownums = union(getArgNums('başlık'), getArgNums('veri')) 	table.sort(rownums) 	for k, num in ipairs(rownums) do 		addRow({ 			header = args['başlık' .. tostring(num)], 			label = args['etiket' .. tostring(num)], 			data = args['veri' .. tostring(num)], 			datastyle = args['veribiçimi'], 			class = args['sınıf' .. tostring(num)], 			rowclass = args['sırasınıfı' .. tostring(num)], 			-- @deprecated next; target .infobox-<name> rowclass 			rowstyle = args['sırabiçimi' .. tostring(num)], 			rowcellstyle = args['sırahücrebiçimi' .. tostring(num)],             dataid = args['veriid' .. tostring(num)],             labelid = args['etiketid' .. tostring(num)],             headerid = args['başlıkid' .. tostring(num)],             rowid = args['sıraid' .. tostring(num)]			 		}) 	end end  local function renderNavBar() 	if not args['ad'] then return end  	has_rows = true 	root 		:tag('tr') 			:tag('td') 				:attr('colspan', '2') 				:addClass('infobox-navbar') 				:wikitext(require('Modül:Dolçub')._navbar{ 					args['ad'], 					mini = 1, 				}) end  local function renderItalicTitle() 	local italicTitle = args['Eğikbaşlık'] and mw.ustring.lower(args['eğikbaşlık']) 	if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' or italicTitle == 'zorla' then 		root:wikitext(require('Modül:Eğik sayfa adı')._main({})) 	end end  -- Categories in otherwise empty rows are collected in empty_row_categories. -- This function adds them to the module output. It is not affected by -- args.decat because this module should not prevent module-external categories -- from rendering. local function renderEmptyRowCategories() 	for _, s in ipairs(empty_row_categories) do 		root:wikitext(s) 	end end  local function renderTrackingCategories()     if args['decat'] ~= 'yes' then 	--Burada hata cikabilir. Dikkat et!         if #(getArgNums('veri')) == 0 and mw.title.getCurrentTitle().namespace == 0 then             root:wikitext('[[Kategori:Hiçbir veri sırasıyla bilgi kutusu şablonlarını kullanan maddeler]]')         end         if args['child'] == 'yes' and args['anabaşlık'] then             root:wikitext('[[Kategori:Başlık parametresiyle gömülü bilgi kutusu şablonu kullanan sayfalar]]')         end     end end  --[=[ Loads the templatestyles for the infobox.  TODO: FINISH loading base templatestyles here rather than in MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables. See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :). When we do this we should clean up the inline CSS below too. Will have to do some bizarre conversion category like with sidebar.  ]=] local function loadTemplateStyles() 	local frame = mw.getCurrentFrame() 	 	local hlist_templatestyles = '' 	if lists.hlist_t.found then 		hlist_templatestyles = frame:extensionTag{ 			name = 'templatestyles', args = { src = lists.hlist_t.styles } 		} 	end 	 	local plainlist_templatestyles = '' 	if lists.plainlist_t.found then 		plainlist_templatestyles = frame:extensionTag{ 			name = 'templatestyles', args = { src = lists.plainlist_t.styles } 		} 	end 	 	-- See function description 	local base_templatestyles = frame:extensionTag{ 		name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' } 	}  	local templatestyles = '' 	if args['templatestyles'] then 		templatestyles = frame:extensionTag{ 			name = 'templatestyles', args = { src = args['templatestyles'] } 		} 	end 	 	local child_templatestyles = '' 	if args['child templatestyles'] then 		child_templatestyles = frame:extensionTag{ 			name = 'templatestyles', args = { src = args['child templatestyles'] } 		} 	end 	 	local grandchild_templatestyles = '' 	if args['grandchild templatestyles'] then 		grandchild_templatestyles = frame:extensionTag{ 			name = 'templatestyles', args = { src = args['grandchild templatestyles'] } 		} 	end 	 	return table.concat({ 		-- hlist -> plainlist -> base is best-effort to preserve old Common.css ordering. 		-- this ordering is not a guarantee because the rows of interest invoking 		-- each class may not be on a specific page 		hlist_templatestyles, 		plainlist_templatestyles, 		base_templatestyles, 		templatestyles, 		child_templatestyles, 		grandchild_templatestyles 	}) end  -- common functions between the child and non child cases local function structure_infobox_common() 	renderSubheaders() 	renderImages() 	preprocessRows() 	renderRows() 	renderBelowRow() 	renderNavBar() 	renderItalicTitle() 	renderEmptyRowCategories() 	renderTrackingCategories() 	cleanInfobox() end  -- Specify the overall layout of the infobox, with special settings if the -- infobox is used as a 'child' inside another infobox. local function _infobox() 	if args.child ~= 'yes' then 		root = mw.html.create('table')  		root 			:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox') 			:addClass(args['gövdesınıfı']) 			-- @deprecated next; target .infobox-<name> 			:cssText(args['gövdebiçimi']) 		 		has_list_class({ args['gövdesınıfı'] })  		renderTitle() 		renderAboveRow() 	else 		root = mw.html.create()  		root 			:wikitext(args['anabaşlık']) 	end 	structure_infobox_common() 	 	return loadTemplateStyles() .. root end  -- If the argument exists and isn't blank, add it to the argument table. -- Blank arguments are treated as nil to match the behaviour of ParserFunctions. local function preprocessSingleArg(argName) 	if origArgs[argName] and origArgs[argName] ~= '' then 		args[argName] = origArgs[argName] 	end end  -- Assign the parameters with the given prefixes to the args table, in order, in -- batches of the step size specified. This is to prevent references etc. from -- appearing in the wrong order. The prefixTable should be an array containing -- tables, each of which has two possible fields, a "prefix" string and a -- "depend" table. The function always parses parameters containing the "prefix" -- string, but only parses parameters in the "depend" table if the prefix -- parameter is present and non-blank. local function preprocessArgs(prefixTable, step) 	if type(prefixTable) ~= 'table' then 		error("Non-table value detected for the prefix table", 2) 	end 	if type(step) ~= 'number' then 		error("Invalid step value detected", 2) 	end  	-- Get arguments without a number suffix, and check for bad input. 	for i,v in ipairs(prefixTable) do 		if type(v) ~= 'table' or type(v.prefix) ~= "string" or 			(v.depend and type(v.depend) ~= 'table') then 			error('Invalid input detected to preprocessArgs prefix table', 2) 		end 		preprocessSingleArg(v.prefix) 		-- Only parse the depend parameter if the prefix parameter is present 		-- and not blank. 		if args[v.prefix] and v.depend then 			for j, dependValue in ipairs(v.depend) do 				if type(dependValue) ~= 'string' then 					error('Invalid "depend" parameter value detected in preprocessArgs') 				end 				preprocessSingleArg(dependValue) 			end 		end 	end  	-- Get arguments with number suffixes. 	local a = 1 -- Counter variable. 	local moreArgumentsExist = true 	while moreArgumentsExist == true do 		moreArgumentsExist = false 		for i = a, a + step - 1 do 			for j,v in ipairs(prefixTable) do 				local prefixArgName = v.prefix .. tostring(i) 				if origArgs[prefixArgName] then 					-- Do another loop if any arguments are found, even blank ones. 					moreArgumentsExist = true 					preprocessSingleArg(prefixArgName) 				end 				-- Process the depend table if the prefix argument is present 				-- and not blank, or we are processing "prefix1" and "prefix" is 				-- present and not blank, and if the depend table is present. 				if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then 					for j,dependValue in ipairs(v.depend) do 						local dependArgName = dependValue .. tostring(i) 						preprocessSingleArg(dependArgName) 					end 				end 			end 		end 		a = a + step 	end end  -- Parse the data parameters in the same order that the old {{infobox}} did, so -- that references etc. will display in the expected places. Parameters that -- depend on another parameter are only processed if that parameter is present, -- to avoid phantom references appearing in article reference lists. local function parseDataParameters()  	preprocessSingleArg('otobaşlıklar') 	preprocessSingleArg('child') 	preprocessSingleArg('gövdesınıfı') 	preprocessSingleArg('subbox') 	preprocessSingleArg('gövdebiçimi') 	preprocessSingleArg('anabaşlık') 	preprocessSingleArg('anabaşlıksınıfı') 	preprocessSingleArg('anabaşlıkbiçimi') 	preprocessSingleArg('üst') 	preprocessSingleArg('üstsınıf') 	preprocessSingleArg('üstbiçim') 	preprocessArgs({ 		{prefix = 'altbaşlık', depend = {'altbaşlıkbiçimi', 'altbaşlıksırasınıfı'}} 	}, 10) 	preprocessSingleArg('altbaşlıkbiçimi') 	preprocessSingleArg('altbaşlıksınıfı') 	preprocessArgs({ 		{prefix = 'resim', depend = {'altyazı', 'resimsırasınıfı'}} 	}, 10) 	preprocessSingleArg('altyazıbiçimi') 	preprocessSingleArg('resimbiçimi') 	preprocessSingleArg('resimsınıfı') 	preprocessArgs({ 		{prefix = 'başlık'}, 		{prefix = 'veri', depend = {'etiket'}}, 		{prefix = 'sırasınıfı'}, 		{prefix = 'sırabiçimi'}, 		{prefix = 'sırahücrebiçimi'}, 		{prefix = 'sınıf'},         {prefix = 'veriid'},         {prefix = 'etiketid'},         {prefix = 'başlıkid'},         {prefix = 'sıraid'} 	}, 50)     preprocessSingleArg('başlıksınıfı')     preprocessSingleArg('başlıkbiçimi')     preprocessSingleArg('etiketbiçimi')     preprocessSingleArg('veribiçimi')     preprocessSingleArg('alt')     preprocessSingleArg('altsınıfı')     preprocessSingleArg('altbiçim')     preprocessSingleArg('ad') 	-- different behaviour for italics if blank or absent 	args['Eğikbaşlık'] = origArgs['Eğikbaşlık'] 	preprocessSingleArg('decat') 	preprocessSingleArg('templatestyles') 	preprocessSingleArg('child templatestyles') 	preprocessSingleArg('grandchild templatestyles') end  -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. function p.infobox(frame) 	if frame == mw.getCurrentFrame() then 		origArgs = frame:getParent().args 	else 		origArgs = frame 	end 	 	parseDataParameters() 	 	return _infobox() end  --Bu fonksiyon infobox'ın aynısı, fakat diğer modüllerden --çağırılabilir versiyonudur. function p.infoboxModule(moduleArgs) 	return p.infobox(nil, moduleArgs) end  -- For calling via #invoke within a template function p.infoboxTemplate(frame) 	origArgs = {} 	for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end 	 	parseDataParameters() 	 	return _infobox() end  return p