Jump to content
Wikipedia The Free Encyclopedia

Module:Infobox3cols

From Wikipedia, the free encyclopedia
Module documentation[view] [edit] [history] [purge]
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.
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.

 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

AltStyle によって変換されたページ (->オリジナル) /