Module:Infobox3cols
- Afrikaans
- العربية
- Asturianu
- Azərbaycanca
- تۆرکجه
- বাংলা
- Беларуская
- भोजपुरी
- Bikol Central
- Bosanski
- Català
- Cebuano
- Chi-Chewa
- Cymraeg
- Dansk
- Eesti
- Ελληνικά
- فارسی
- Gàidhlig
- Galego
- Gĩkũyũ
- 한국어
- Հայերեն
- Ilokano
- Bahasa Indonesia
- Íslenska
- Jawa
- ಕನ್ನಡ
- ქართული
- Kurdî
- Latviešu
- Lëtzebuergesch
- Madhurâ
- मैथिली
- Македонски
- മലയാളം
- مصرى
- Bahasa Melayu
- Монгол
- မြန်မာဘာသာ
- Nederlands
- नेपाली
- 日本語
- Norsk nynorsk
- ଓଡ଼ିଆ
- Oʻzbekcha / ўзбекча
- ਪੰਜਾਬੀ
- Português
- Qaraqalpaqsha
- Română
- سرائیکی
- Scots
- සිංහල
- Simple English
- Slovenščina
- کوردی
- Српски / srpski
- Suomi
- Tagalog
- தமிழ்
- Taqbaylit
- တႆး
- తెలుగు
- ไทย
- Türkçe
- Türkmençe
- Українська
- اردو
- Vèneto
- Tiếng Việt
- 吴语
- Xitsonga
- 粵語
- 中文
- Jaku Iban
Appearance
From Wikipedia, the free encyclopedia
Warning This Lua module is used on approximately 317,000 pages .
To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Consider discussing changes on the talk page before implementing them.
To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Consider discussing changes on the talk page before implementing them.
This module depends on the following other modules:
Implements {{Infobox3cols }}.
The above documentation is transcluded from Module:Infobox3cols/doc. (edit | history)
Editors can experiment in this module's sandbox (edit | diff) and testcases (create) pages.
Subpages of this module.
Editors can experiment in this module's sandbox (edit | diff) and testcases (create) pages.
Subpages of this module.
localcheck_for_unknown_parameters=require("Module:Check for unknown parameters")._check localp={} localargs={} localorigArgs={} localroot locallists={ plainlist_t={ patterns={ '^plainlist$', '%splainlist$', '^plainlist%s', '%splainlist%s' }, found=false, styles='Plainlist/styles.css' }, hlist_t={ patterns={ '^hlist$', '%shlist$', '^hlist%s', '%shlist%s' }, found=false, styles='Hlist/styles.css' } } localfunctionhas_list_class(args_to_check) for_,listinpairs(lists)do ifnotlist.foundthen for_,arginpairs(args_to_check)do for_,patterninipairs(list.patterns)do ifmw.ustring.find(argor'',pattern)then list.found=true break end end iflist.foundthenbreakend end end end end -- Returns the union of the values of two tables, as a sequence. localfunctionunion(t1,t2) localvals={} fork,vinpairs(t1)do vals[v]=true end fork,vinpairs(t2)do vals[v]=true end localret={} fork,vinpairs(vals)do table.insert(ret,k) end returnret 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}. localfunctiongetArgNums(prefix,suffix) localnums={} fork,vinpairs(args)do localnum=tostring(k):match('^'..prefix..'([0-9]%d*)'..suffix..'$') ifnumthentable.insert(nums,tonumber(num))end end table.sort(nums) returnnums end -- Adds a row to the infobox, with either a header cell -- or a label/data cell combination. localfunctionaddRow(rowArgs) ifrowArgs.headerthen has_list_class({rowArgs.rowclass,rowArgs.class,args.headerclass}) root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :tag('th') :attr('colspan','4') :addClass('infobox-header') :addClass(rowArgs.class) :addClass(args.headerclass) -- @deprecated next; target .infobox-<name> .infobox-header :cssText(args.headerstyle) :cssText(rowArgs.rowcellstyle) :cssText(args.extracellstyles[rowArgs.num..'h']) :wikitext(rowArgs.header) elseifrowArgs.labelthen ifrowArgs.datathen has_list_class({rowArgs.rowclass,rowArgs.class}) localrow=root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row :tag('th') :attr('scope','row') :addClass('infobox-label') :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :cssText(args.extracellstyles[rowArgs.num..'l']) :wikitext(rowArgs.label) :done() localdataCell=row:tag('td') dataCell :attr('colspan','3') :addClass('infobox-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :cssText(args.extracellstyles[rowArgs.num]) :newline() :wikitext(rowArgs.data) elseifrowArgs.dataaorrowArgs.databorrowArgs.datacthen has_list_class({rowArgs.rowclass,rowArgs.classa}) localrow=root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row :tag('th') :attr('scope','row') :addClass('infobox-label') :cssText(args.labelstyle) :cssText(rowArgs.rowcellstyle) :cssText(args.extracellstyles[rowArgs.num..'l']) :wikitext(rowArgs.label) :done() localdataCella=row:tag('td') dataCella :addClass('infobox-data infobox-data-a') :addClass(rowArgs.classa) -- @deprecated next; target .infobox-<name> .infobox-data-a :cssText(rowArgs.dataastyle) :cssText(rowArgs.rowcellstyle) :cssText(args.extracellstyles[rowArgs.num..'a']) :newline() :wikitext(rowArgs.dataa) ifrowArgs.renderbthen has_list_class({rowArgs.classb}) localdataCellb=row:tag('td') dataCellb :addClass('infobox-data infobox-data-b') :addClass(rowArgs.classb) -- @deprecated next; target .infobox-<name> .infobox-data-b :cssText(rowArgs.databstyle) :cssText(rowArgs.rowcellstyle) :cssText(args.extracellstyles[rowArgs.num..'b']) :newline() :wikitext(rowArgs.datab) end ifrowArgs.rendercthen has_list_class({rowArgs.classc}) localdataCellc=row:tag('td') dataCellc :addClass('infobox-data infobox-data-c') :addClass(rowArgs.classc) -- @deprecated next; target .infobox-<name> .infobox-data-c :cssText(rowArgs.datacstyle) :cssText(rowArgs.rowcellstyle) :cssText(args.extracellstyles[rowArgs.num..'c']) :newline() :wikitext(rowArgs.datac) end end elseifrowArgs.datathen has_list_class({rowArgs.rowclass,rowArgs.class}) localrow=root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) localdataCell=row:tag('td') dataCell :attr('colspan','4') :addClass('infobox-full-data') :addClass(rowArgs.class) -- @deprecated next; target .infobox-<name> .infobox-full-data :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :cssText(args.extracellstyles[rowArgs.num]) :newline() :wikitext(rowArgs.data) end end localfunctionrenderTitle() ifnotargs.titlethenreturnend has_list_class({args.titleclass}) root :tag('caption') :addClass('infobox-title') :addClass(args.titleclass) -- @deprecated next; target .infobox-<name> .infobox-title :cssText(args.titlestyle) :wikitext(args.title) end localfunctionrenderAboveRow() ifnotargs.abovethenreturnend has_list_class({args.aboveclass}) root :tag('tr') :tag('th') :attr('colspan','4') :addClass('infobox-above') :addClass(args.aboveclass) -- @deprecated next; target .infobox-<name> .infobox-above :cssText(args.abovestyle) :wikitext(args.above) end localfunctionrenderBelowRow() ifnotargs.belowthenreturnend has_list_class({args.belowclass}) root :tag('tr') :tag('td') :attr('colspan','4') :addClass('infobox-below') :addClass(args.belowclass) -- @deprecated next; target .infobox-<name> .infobox-below :cssText(args.belowstyle) :newline() :wikitext(args.below) end localfunctionaddSubheaderRow(subheaderArgs) ifnotsubheaderArgs.datathenreturnend has_list_class({subheaderArgs.rowclass,subheaderArgs.class}) localrow=root:tag('tr') row:addClass(subheaderArgs.rowclass) localdataCell=row:tag('td') dataCell :attr('colspan','4') :addClass('infobox-subheader') :addClass(subheaderArgs.class) :cssText(subheaderArgs.datastyle) :cssText(subheaderArgs.rowcellstyle) :newline() :wikitext(subheaderArgs.data) end localfunctionrenderSubheaders() ifargs.subheaderthen args.subheader1=args.subheader end ifargs.subheaderrowclassthen args.subheaderrowclass1=args.subheaderrowclass end localsubheadernums=getArgNums('subheader','') fork,numinipairs(subheadernums)do addSubheaderRow({ data=args['subheader'..tostring(num)], -- @deprecated next; target .infobox-<name> .infobox-subheader datastyle=args.subheaderstyle, rowcellstyle=args['subheaderstyle'..tostring(num)], class=args.subheaderclass, rowclass=args['subheaderrowclass'..tostring(num)] }) end end localfunctionaddImageRow(imageArgs) ifnotimageArgs.datathenreturnend has_list_class({imageArgs.rowclass,imageArgs.class}) localrow=root:tag('tr') row:addClass(imageArgs.rowclass) localdataCell=row:tag('td') dataCell :attr('colspan','4') :addClass('infobox-image') :addClass(imageArgs.class) :cssText(imageArgs.datastyle) :newline() :wikitext(imageArgs.data) end localfunctionrenderImages() ifargs.imagethen args.image1=args.image end ifargs.captionthen args.caption1=args.caption end localimagenums=getArgNums('image','') fork,numinipairs(imagenums)do localcaption=args['caption'..tostring(num)] localdata=mw.html.create():wikitext(args['image'..tostring(num)]) ifcaptionthen data :tag('div') :addClass('infobox-caption') -- @deprecated next; target .infobox-<name> .infobox-caption :cssText(args.captionstyle) :wikitext(caption) end addImageRow({ data=tostring(data), -- @deprecated next; target .infobox-<name> .infobox-image datastyle=args.imagestyle, class=args.imageclass, rowclass=args['imagerowclass'..tostring(num)] }) end end -- Gets the union of the header and data argument numbers, -- and renders them all in order localfunctionrenderRows() localrownums=union(getArgNums('header',''),getArgNums('data','[abc]?')) localdatab_count=#(getArgNums('data','b')) localdatac_count=#(getArgNums('data','c')) table.sort(rownums) fork,numinipairs(rownums)do addRow({ num=tostring(num), renderb=datab_count>0, renderc=datac_count>0, header=args['header'..tostring(num)], label=args['label'..tostring(num)], data=args['data'..tostring(num)], datastyle=args.datastyle, class=args['class'..tostring(num)], dataa=args['data'..tostring(num)..'a'], dataastyle=args.datastylea, classa=args['class'..tostring(num)..'a'], datab=args['data'..tostring(num)..'b'], databstyle=args.datastyleb, classb=args['class'..tostring(num)..'b'], datac=args['data'..tostring(num)..'c'], datacstyle=args.datastylec, classc=args['class'..tostring(num)..'c'], rowclass=args['rowclass'..tostring(num)], -- @deprecated next; target .infobox-<name> rowclass rowstyle=args['rowstyle'..tostring(num)], rowcellstyle=args['rowcellstyle'..tostring(num)], }) end end localfunctionrenderNavBar() ifnotargs.namethenreturnend root :tag('tr') :tag('td') :attr('colspan','4') :addClass('infobox-navbar') :wikitext(require('Module:Navbar')._navbar{ args.name, mini=1, }) end localfunctionrenderItalicTitle() localitalicTitle=args['italic title']andmw.ustring.lower(args['italic title']) ifitalicTitle==''oritalicTitle=='force'oritalicTitle=='yes'then root:wikitext(require('Module:Italic title')._main({})) end end -- Render tracking categories. args.decat == turns off tracking categories. localfunctionrenderTrackingCategories() localtitle=mw.title.getCurrentTitle() ifargs.decat=='yes'thenreturnend if#(getArgNums('data','[abc]?'))==0andtitle.namespace==0then root:wikitext('[[Category:Articles using infobox templates with no data rows]]') end root:wikitext(check_for_unknown_parameters({ checkpositional="y", ignoreblank="y", regexp1="header[%d]+", regexp2="label[%d]+", regexp3="data[%d]+[abc]?", regexp4="class[%d]+[abc]?", regexp5="rowclass[%d]+", regexp6="rowstyle[%d]+", regexp7="rowcellstyle[%d]+", unknown="[[Category:Pages using infobox3cols with undocumented parameters|_VALUE_"..title.text.."]]", "above","aboveclass","aboverowclass","abovestyle","below","belowclass", "belowrowclass","belowstyle","bodyclass","bodystyle","caption","caption1", "caption2","captionstyle","child","datastyle","datastylea","datastyleb", "datastylec","extracellstyles","headerstyle","image","image1","image2", "imageclass","imagerowclass1","imagerowclass2","imagestyle","labelstyle", "name","subbox","subheader","subheader2","subheaderclass", "subheaderrowclass1","subheaderrowclass2","subheaderstyle","templatestyles", "title","titleclass","titlestyle", },origArgs)) iforigArgs.header0ororigArgs.label0ororigArgs.data0ororigArgs.data0a ororigArgs.data0bororigArgs.data0cororigArgs.class0ororigArgs.rowclass0then root:wikitext("[[Category:Pages using infobox3cols with header0 or label0 or data0]]") end iftitle.namespace==10andmw.ustring.sub(title.text,1,7)=="Infobox"then root:wikitext("[[Category:Infobox templates|"..mw.ustring.sub(title.text,9).."]]") 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. ]=] localfunctionloadTemplateStyles() localframe=mw.getCurrentFrame() localhlist_templatestyles='' iflists.hlist_t.foundthen hlist_templatestyles=frame:extensionTag{ name='templatestyles',args={src=lists.hlist_t.styles} } end localplainlist_templatestyles='' iflists.plainlist_t.foundthen plainlist_templatestyles=frame:extensionTag{ name='templatestyles',args={src=lists.plainlist_t.styles} } end -- See function description localbase_templatestyles=frame:extensionTag{ name='templatestyles',args={src='Module:Infobox/styles.css'} } localtemplatestyles='' ifargs['templatestyles']then templatestyles=frame:extensionTag{ name='templatestyles',args={src=args['templatestyles']} } end localchild_templatestyles='' ifargs['child templatestyles']then child_templatestyles=frame:extensionTag{ name='templatestyles',args={src=args['child templatestyles']} } end localgrandchild_templatestyles='' ifargs['grandchild templatestyles']then grandchild_templatestyles=frame:extensionTag{ name='templatestyles',args={src=args['grandchild templatestyles']} } end returntable.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 localfunctionstructure_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. localfunction_infobox() root=mw.html.create('table') has_list_class({args.bodyclass}) root :addClass((args.child=='yes'orargs.subbox=='yes')and'infobox-subbox'or'infobox') :addClass(args.child=='yes'and'infobox-3cols-child'ornil) -- avoid https://phabricator.wikimedia.org/F55300125 :addClass('infobox-table') :addClass(args.bodyclass) -- @deprecated next; target .infobox-<name> :cssText(args.bodystyle) renderTitle() renderAboveRow() structure_infobox_common() returnloadTemplateStyles()..tostring(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. localfunctionpreprocessSingleArg(argName) iforigArgs[argName]andorigArgs[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. localfunctionpreprocessArgs(prefixTable,step) iftype(prefixTable)~='table'then error("Non-table value detected for the prefix table",2) end iftype(step)~='number'then error("Invalid step value detected",2) end -- Get arguments without a number suffix, and check for bad input. fori,vinipairs(prefixTable)do iftype(v)~='table'ortype(v.prefix)~="string"or (v.dependandtype(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. ifargs[v.prefix]andv.dependthen forj,dependValueinipairs(v.depend)do iftype(dependValue)~='string'then error('Invalid "depend" parameter value detected in preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Get arguments with number suffixes. locala=0-- Counter variable. localmoreArgumentsExist=true whilemoreArgumentsExist==truedo moreArgumentsExist=false fori=a,a+step-1do forj,vinipairs(prefixTable)do localprefixArgName=v.prefix..tostring(i)..(v.suffixor'') iforigArgs[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. ifv.dependand(args[prefixArgName]or(i==1andargs[v.prefix]))then forj,dependValueinipairs(v.depend)do localdependArgName=dependValue..tostring(i)..(v.dependsuffixor'') 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. localfunctionparseDataParameters() 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') preprocessSingleArg('image') preprocessSingleArg('caption') preprocessArgs({ {prefix='image',depend={'caption','imagerowclass'}} },10) preprocessSingleArg('captionstyle') preprocessSingleArg('imagestyle') preprocessSingleArg('imageclass') preprocessArgs({ {prefix='header'}, {prefix='data',depend={'label'}}, {prefix='data',suffix='a',depend={'label'}}, {prefix='data',suffix='a'}, {prefix='data',suffix='b',depend={'label'}}, {prefix='data',suffix='b'}, {prefix='data',suffix='c',depend={'label'}}, {prefix='data',suffix='c'}, {prefix='rowclass'}, {prefix='rowstyle'}, {prefix='rowcellstyle'}, {prefix='class'}, {prefix='class',suffix='a'}, {prefix='class',suffix='b'}, {prefix='class',suffix='c'} },50) preprocessSingleArg('headerclass') preprocessSingleArg('headerstyle') preprocessSingleArg('labelstyle') preprocessSingleArg('datastyle') preprocessSingleArg('datastylea') preprocessSingleArg('datastyleb') preprocessSingleArg('datastylec') preprocessSingleArg('below') preprocessSingleArg('belowclass') preprocessSingleArg('belowstyle') preprocessSingleArg('name') -- different behaviour for italics if blank or absent args['italic title']=origArgs['italic title'] preprocessSingleArg('decat') preprocessSingleArg('templatestyles') preprocessSingleArg('child templatestyles') preprocessSingleArg('grandchild templatestyles') args['extracellstyles']={} forlineinmw.text.gsplit(origArgs['extracellstyles']or'','\n')do localequals=line:find('=') ifequalsthen foriinmw.text.gsplit(line:sub(1,equals-1),'%s*,%s*')do args.extracellstyles[i]=line:sub(equals+1) end end end end -- If called via #invoke, use the args passed into the invoking template. -- Otherwise, for testing purposes, assume args are being passed directly in. functionp.infobox(frame) ifframe==mw.getCurrentFrame()then origArgs=frame:getParent().args else origArgs=frame end parseDataParameters() return_infobox() end -- For calling via #invoke within a template functionp.infoboxTemplate(frame,extra_args) origArgs=extra_argsor{} fork,vinpairs(frame.args)doorigArgs[k]=mw.text.trim(v)end parseDataParameters() return_infobox() end -- Shortcut for making child infoboxes via #invoke. functionp.child(frame) returnp.infoboxTemplate(frame,{child="yes"}) end returnp