Modul:Infobox

Technology
12 hours ago
8
4
2
Avatar
Author
Albert Flores

Modul:Infobox je rozšíření české Wikipedie, které umožňuje vytváření infoboxů pro články. Infobox je speciální panel umístěný na pravé straně článku, který obsahuje klíčové informace o daném tématu. Infobox je široce využíván v různých oblastech jako například geografie, biologie, historie nebo popkultura. Modul:Infobox umožňuje vytváření infoboxů s různými parametry, které lze přizpůsobit potřebám konkrétního článku. Infobox obsahuje výchozí parametry, které se nejčastěji využívají jako název, obrázek, popis, zeměpisné souřadnice, datum založení, přehledný seznam informací, atd. Tyto parametry lze dále rozšiřovat a upravovat podle specifických potřeb. Modul:Infobox umožňuje také přidávat různé části do infoboxu, jako například sekcí o historii, demografii, ekonomii, kultuře apod. Každá sekce může obsahovat další parametry a informace, které pomáhají lépe strukturovat a prezentovat informace v infoboxu. Modul:Infobox je důležitým nástrojem pro vytváření encyklopedických článků na české Wikipedii. Zlepšuje vizuální vzhled článku a umožňuje rychlý přehled důležitých informací o daném tématu. Modul je kontrolován a aktualizován komunitou Wikipedie, což zaručuje jeho kvalitu a spolehlivost.

-- -- This module implements -- --[url=://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remove when [[:phab:T191516][ keywords are used for languages: they are the names of the actual parameters of the template ]] require 'strict'

local keywords = { name = 'název', child = 'dceřiný', -- subbox = 'subbox', decat = 'bez kategorie', bodystyle = 'styl těla', bodyclass = 'třída těla', title = 'titulek', titlestyle = 'styl titulku', titleclass = 'třída titulku', above = 'záhlaví', abovestyle = 'styl záhlaví', aboveclass = 'třída záhlaví', subheader = 'podzáhlaví', subheaderstyle = 'styl podzáhlaví', subheaderclass = 'třída podzáhlaví', subheaderrowclass = 'třída řádku podzáhlaví', autoheaders = 'automatické nadpisy', image = 'obrázek', imagestyle = 'styl obrázku', imageclass = 'třída obrázku', imagerowclass = 'třída řádku obrázku', caption = 'popisek', captionstyle = 'styl popisku', headerstyle = 'styl nadpisů', labelstyle = 'styl popisů', datastyle = 'styl dat', rowid = 'id řádků', headerid = 'id nadpisů', labelid = 'id popisů', dataid = 'id dat', header = 'nadpis', label = 'popis', data = 'data', rowstyle = 'styl řádku', rowcellstyle = 'styl buňky řádku', rowclass = 'třída řádku', class = 'třída', below = 'zápatí', belowstyle = 'styl zápatí', belowclass = 'třída zápatí', ['italic title'] = 'název kurzívou', } -- here is what you want to translate

local p = {}

local args = {} local origArgs = {} local root

local function notempty( s ) return s and s:match( '%S' ) end

local function yes( s ) return ({ ['yes'] = 1, ['ano'] = 1, ['true'] = 1, ['1'] = 1, })[s] == 1 end

local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '' local s = sval s = mw. ustring. +moregsub(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, '(%s*)' . marker, '%1') s = mw. ustring. gsub(s, '(]*>%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*)', '%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] . '' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = end s = s . '\n' . subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s . subcells[k] else s = s . '\n' . subcells[k] . '' end end end end -- the next two lines add a newline at the end of lists for the PHP parser --[/url]] 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.

local function union(t1, t2) -- Returns the union of the values of two tables, as a sequence. 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. +moreinsert(ret, k) end return ret end.

local function getArgNums(prefix) -- 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}. +more 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.

local function addRow(rowArgs) -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. if rowArgs. +moreheader and rowArgs. header ~= '_BLANK_' then root :tag('tr') :addClass(rowArgs. rowclass) :cssText(rowArgs. rowstyle) :attr('id', rowArgs. rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs. headerid) :addClass(rowArgs. class) :addClass(args. headerclass) :css('text-align', 'center') :cssText(args. headerstyle) :cssText(rowArgs. rowcellstyle) :wikitext(fixChildBoxes(rowArgs. header, 'th')) if (rowArgs. data or rowArgs. label) and not yes(args. decat) then root:wikitext('Kategorie:Údržba:Chybné navržení infoboxu') end elseif rowArgs. data then if not rowArgs. data:gsub('%[%[%s*[Kk]ategorie%s*:[^]]*]]'):match('^%S') then rowArgs. rowstyle = 'display:none' end local row = root:tag('tr') row:addClass(rowArgs. rowclass) row:cssText(rowArgs. rowstyle) row:attr('id', rowArgs. rowid) if rowArgs. label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs. labelid) :cssText(args. labelstyle) :cssText(rowArgs. rowcellstyle) :css('text-align', 'left') -- PONECHAT :wikitext(rowArgs. label) :done end.

local dataCell = row:tag('td') if not rowArgs. label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs. +moredataid) :addClass(rowArgs. class) :cssText(rowArgs. datastyle) :cssText(rowArgs. rowcellstyle) :wikitext(fixChildBoxes(rowArgs. data, 'td')) end end.

local function renderTitle if not args.title then return end

root :tag('caption') :addClass(args.titleclass) :cssText(args.titlestyle) :wikitext(args.title) end

local function renderAboveRow if not args.above then return end

root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args. aboveclass) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args. +moreabovestyle) :wikitext(fixChildBoxes(args. above,'th')) end.

local function renderBelowRow if not args.below then return end

root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass) :css('text-align', 'center') :cssText(args.belowstyle) :wikitext(fixChildBoxes(args.below,'td')) end

local function renderSubheaders if args. subheader then args. +moresubheader1 = args. subheader end if args. subheaderrowclass then args. subheaderrowclass1 = args. subheaderrowclass end local subheadernums = getArgNums('subheader') for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' . tostring(num)], datastyle = args. subheaderstyle, rowcellstyle = args['subheaderstyle' . tostring(num)], class = args. subheaderclass, rowclass = args['subheaderrowclass' . tostring(num)] }) end end.

local function renderImages if args. image then args. +moreimage1 = args. image end if args. caption then args. caption1 = args. caption end local imagenums = getArgNums('image') for k, num in ipairs(imagenums) do local caption = args['caption' . tostring(num)] local data = mw. html. create:wikitext(args['image' . tostring(num)]) if caption then data :tag('div') :cssText(args. captionstyle) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args. imagestyle, class = args. imageclass, rowclass = args['imagerowclass' . tostring(num)] }) end end.

local function preprocessRows -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table. +moresort(rownums) local lastheader for k, num in ipairs(rownums) do if args['header' . tostring(num)] then if lastheader then args['header' . tostring(lastheader)] = nil end lastheader = num elseif args['data' . tostring(num)] and args['data' . tostring(num)]:gsub('%[%[%s*[Kk]ategorie%s*:[^]]*]]'):match('^%S') then local data = args['data' . tostring(num)] if data:gsub('%[%[%s*[Kk]ategorie%s*:[^]]*]]'):match('%S') then lastheader = nil end end end if lastheader then args['header' . tostring(lastheader)] = nil end end.

local function renderRows -- Gets the union of the header and data argument numbers, -- and renders them all in order using addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table. +moresort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' . tostring(num)], label = args['label' . tostring(num)], data = args['data' . tostring(num)], datastyle = args. datastyle, class = args['class' . tostring(num)], rowclass = args['rowclass' . tostring(num)], rowstyle = args['rowstyle' . tostring(num)], rowcellstyle = args['rowcellstyle' . tostring(num)], dataid = args['dataid' . tostring(num)], labelid = args['labelid' . tostring(num)], headerid = args['headerid' . tostring(num)], rowid = args['rowid' . tostring(num)] }) end end.

local function renderNavBar if not args.name then return end

local navbar = require('Module:Navbar')._navbar root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ args.name, noedit = true, }) end

local function renderItalicTitle local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle

or italicTitle

'vynutit' or yes(italicTitle) then root:wikitext(mw.getCurrentFrame:expandTemplate({title = 'název kurzívou'})) end end

local function renderTrackingCategories if not yes(args. decat) then if yes(args. +morechild) then if args. title then root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]') end elseif #(getArgNums('data')).

0 and mw.title.getCurrentTitle.namespace

0 then root:wikitext('Kategorie:Údržba:Články s infoboxy bez údajů') end end end

local function _infobox -- Specify the overall layout of the infobox, with special settings -- if the infobox is used as a 'child' inside another infobox. if not yes(args. +morechild) then root = mw. html. create('table').

root :addClass((not yes(args.subbox)) and 'infobox' or nil) :addClass(args.bodyclass)

if yes(args. subbox) then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args. +morebodystyle).

renderTitle renderAboveRow else root = mw.html.create

root :wikitext(args.title) end

renderSubheaders renderImages if args.autoheaders then preprocessRows end renderRows renderBelowRow renderNavBar renderItalicTitle renderTrackingCategories

return tostring(root) end

local function preprocessSingleArg(argName, app) -- 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. +more local translated = keywords[argName] app = app or argName = argName . app if translated and origArgs[translated . app] and origArgs[translated . app] ~= then args[argName] = origArgs[translated . app] elseif origArgs[argName] and origArgs[argName] ~= then args[argName] = origArgs[argName] end end.

local function preprocessArgs(prefixTable, step) -- 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. +more 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. 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 _, v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v. +moreprefix) ~= "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 _, 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. +more local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for _, v in ipairs(prefixTable) do local prefixArgName = v. prefix . tostring(i) local transPrefixArgName = (keywords[v. prefix] or v. prefix) . tostring(i) if origArgs[transPrefixArgName] or origArgs[prefixArgName] then moreArgumentsExist = true -- Do another loop if any arguments are found, even blank ones. preprocessSingleArg(v. prefix, tostring(i)) 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 _, dependValue in ipairs(v. depend) do preprocessSingleArg(dependValue, tostring(i)) end end end end a = a + step end end.

local function parseDataParameters -- Parse the data parameters in the same order that the old did, so that -- references etc. will display in the expected places. +more Parameters that depend on -- another parameter are only processed if that parameter is present, to avoid -- phantom references appearing in article reference lists. preprocessSingleArg('autoheaders') preprocessSingleArg('child') preprocessSingleArg('bodyclass') preprocessSingleArg('subbox') preprocessSingleArg('bodystyle') preprocessSingleArg('title') preprocessSingleArg('titleclass') preprocessSingleArg('titlestyle') preprocessSingleArg('above') preprocessSingleArg('aboveclass') preprocessSingleArg('abovestyle') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subheaderclass') preprocessArgs({ {prefix = 'image', depend = {'caption', 'imagerowclass'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') args['italic title'] = origArgs['italic title'] -- different behaviour if blank or absent args['italic title'] = origArgs[keywords['italic title']] preprocessSingleArg('decat') end.

function p. infobox(frame) -- If called via #invoke, use the args passed into the invoking template. +more -- Otherwise, for testing purposes, assume args are being passed directly in. if frame == mw. getCurrentFrame then origArgs = frame:getParent. args else origArgs = frame end.

parseDataParameters

return _infobox end

function p.infoboxTemplate(frame) -- For calling via #invoke within a template origArgs = {} for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end

parseDataParameters

return _infobox end

return p

5 min read
Share this post:
Like it 8

Leave a Comment

Please, enter your name.
Please, provide a valid email address.
Please, enter your comment.
Enjoy this post? Join Cesko.wiki
Don’t forget to share it
Top