Module:Infobox: Difference between revisions

2,960 bytes added ,  6 November 2018
fix for spurious <p> tag per talk page
No edit summary
 
(fix for spurious <p> tag per talk page)
Line 2: Line 2:
-- This module implements {{Infobox}}
-- This module implements {{Infobox}}
--
--
 
local p = {}
local p = {}
 
local HtmlBuilder = require('Module:HtmlBuilder')
local navbar = require('Module:Navbar')._navbar
 
local args = {}
local args = {}
local origArgs
local origArgs
local root
local root
   
 
function union(t1, t2)
local function notempty( s ) return s and s:match( '%S' ) end
 
local function fixChildBoxes(sval, tt)
if notempty(sval) then
local marker = '<span class=special_infobox_marker>'
local s = sval
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
-- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=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
 
local function union(t1, t2)
     -- Returns the union of the values of two tables, as a sequence.
     -- Returns the union of the values of two tables, as a sequence.
     local vals = {}
     local vals = {}
Line 45: Line 96:
     if rowArgs.header then
     if rowArgs.header then
         root
         root
             .tag('tr')
             :tag('tr')
                 .addClass(rowArgs.rowclass)
                 :addClass(rowArgs.rowclass)
                 .tag('th')
                 :cssText(rowArgs.rowstyle)
                     .attr('colspan', 2)
                :attr('id', rowArgs.rowid)
                     .addClass(rowArgs.class)
                :tag('th')
                     .css('text-align', 'center')
                     :attr('colspan', 2)
                     .cssText(args.headerstyle)
                     :attr('id', rowArgs.headerid)
                     .wikitext(rowArgs.header)
                    :addClass(rowArgs.class)
                     :addClass(args.headerclass)
                    :css('text-align', 'center')
                     :cssText(args.headerstyle)
                     :cssText(rowArgs.rowcellstyle)
                    :wikitext(fixChildBoxes(rowArgs.header, 'th'))
     elseif rowArgs.data then
     elseif rowArgs.data then
         local row = root.tag('tr')
         local row = root:tag('tr')
         row.addClass(rowArgs.rowclass)
         row:addClass(rowArgs.rowclass)
        row:cssText(rowArgs.rowstyle)
        row:attr('id', rowArgs.rowid)
         if rowArgs.label then
         if rowArgs.label then
             row
             row
                 .tag('th')
                 :tag('th')
                     .attr('scope', 'row')
                     :attr('scope', 'row')
                     .css('text-align', 'left')
                     :attr('id', rowArgs.labelid)
                     .cssText(args.labelstyle)
                     :cssText(args.labelstyle)
                     .wikitext(rowArgs.label)
                     :cssText(rowArgs.rowcellstyle)
                     .done()
                    :wikitext(rowArgs.label)
                     :done()
         end
         end
          
          
         local dataCell = row.tag('td')
         local dataCell = row:tag('td')
         if not rowArgs.label then  
         if not rowArgs.label then  
             dataCell
             dataCell
                 .attr('colspan', 2)
                 :attr('colspan', 2)
                 .css('text-align', 'center')  
                 :css('text-align', 'center')  
         end
         end
         dataCell
         dataCell
             .addClass(rowArgs.class)
             :attr('id', rowArgs.dataid)
             .cssText(rowArgs.datastyle)
            :addClass(rowArgs.class)
             .newline()
             :cssText(rowArgs.datastyle)
             .wikitext(rowArgs.data)
             :cssText(rowArgs.rowcellstyle)
             :wikitext(fixChildBoxes(rowArgs.data, 'td'))
     end
     end
end
end
Line 84: Line 144:


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


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


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


Line 130: Line 189:
         addRow({
         addRow({
             data = args['subheader' .. tostring(num)],
             data = args['subheader' .. tostring(num)],
             datastyle = args.subheaderstyle or args['subheaderstyle' .. tostring(num)],
             datastyle = args.subheaderstyle,
            rowcellstyle = args['subheaderstyle' .. tostring(num)],
             class = args.subheaderclass,
             class = args.subheaderclass,
             rowclass = args['subheaderrowclass' .. tostring(num)]
             rowclass = args['subheaderrowclass' .. tostring(num)]
Line 147: Line 207:
     for k, num in ipairs(imagenums) do
     for k, num in ipairs(imagenums) do
         local caption = args['caption' .. tostring(num)]
         local caption = args['caption' .. tostring(num)]
         local data = HtmlBuilder.create().wikitext(args['image' .. tostring(num)])
         local data = mw.html.create():wikitext(args['image' .. tostring(num)])
         if caption then
         if caption then
             data
             data
                 .tag('br', {selfClosing = true})
                 :tag('div')
                    .done()
                     :cssText(args.captionstyle)
                .tag('div')
                     :wikitext(caption)
                     .cssText(args.captionstyle)
                     .wikitext(caption)
         end
         end
         addRow({
         addRow({
Line 177: Line 235:
             datastyle = args.datastyle,
             datastyle = args.datastyle,
             class = args['class' .. tostring(num)],
             class = args['class' .. tostring(num)],
             rowclass = args['rowclass' .. 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
Line 186: Line 250:
      
      
     root
     root
         .tag('tr')
         :tag('tr')
             .tag('td')
             :tag('td')
                 .attr('colspan', '2')
                 :attr('colspan', '2')
                 .css('text-align', 'right')
                 :css('text-align', 'right')
                 .wikitext(mw.getCurrentFrame():expandTemplate({  
                 :wikitext(navbar{
                    title = 'navbar',
                     args.name,
                     args = { args.name, mini = 1 }
                    mini = 1,
                 }))
                 })
end
end


Line 199: Line 263:
     local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
     local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
     if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
     if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
         root.wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
         root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'italic title'}))
     end
     end
end
end
Line 205: Line 269:
local function renderTrackingCategories()
local function renderTrackingCategories()
     if args.decat ~= 'yes' then
     if args.decat ~= 'yes' then
        if #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
    if args.child == 'yes' then
            root.wikitext('[[Category:Articles which use infobox templates with no data rows]]')
        if args.title then
        end
            root:wikitext('[[Category:Pages which use embedded infobox templates with the title parameter]]')
         if args.child == 'yes' and args.title then
        end
             root.wikitext('[[Category:Articles which use embedded infobox templates with the title parameter]]')
         elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
             root:wikitext('[[Category:Articles which use infobox templates with no data rows]]')
         end
         end
     end
     end
Line 218: Line 283:
     -- if the infobox is used as a 'child' inside another infobox.
     -- if the infobox is used as a 'child' inside another infobox.
     if args.child ~= 'yes' then
     if args.child ~= 'yes' then
         root = HtmlBuilder.create('table')
         root = mw.html.create('table')
          
          
         root
         root
             .addClass('infobox')
             :addClass((args.subbox ~= 'yes') and 'infobox' or nil)
             .addClass(args.bodyclass)
             :addClass(args.bodyclass)
            .attr('cellspacing', 3)
            .css('border-spacing', '3px')
              
              
             if args.subbox == 'yes' then
             if args.subbox == 'yes' then
                 root
                 root
                     .css('padding', '0')
                     :css('padding', '0')
                     .css('border', 'none')
                     :css('border', 'none')
                     .css('margin', '-3px')
                     :css('margin', '-3px')
                     .css('width', 'auto')
                     :css('width', 'auto')
                     .css('min-width', '100%')
                     :css('min-width', '100%')
                     .css('font-size', '100%')
                     :css('font-size', '100%')
                     .css('clear', 'none')
                     :css('clear', 'none')
                     .css('float', 'none')
                     :css('float', 'none')
                     .css('background-color', 'transparent')
                     :css('background-color', 'transparent')
             else
             else
                 root
                 root
                     .css('width', '22em')
                     :css('width', '22em')
             end
             end
         root
         root
             .cssText(args.bodystyle)
             :cssText(args.bodystyle)
      
      
         renderTitle()
         renderTitle()
         renderAboveRow()
         renderAboveRow()
     else
     else
         root = HtmlBuilder.create()
         root = mw.html.create()
          
          
         root
         root
             .wikitext(args.title)
             :wikitext(args.title)
     end
     end


Line 368: Line 431:
         {prefix = 'data', depend = {'label'}},
         {prefix = 'data', depend = {'label'}},
         {prefix = 'rowclass'},
         {prefix = 'rowclass'},
         {prefix = 'class'}
        {prefix = 'rowstyle'},
        {prefix = 'rowcellstyle'},
         {prefix = 'class'},
        {prefix = 'dataid'},
        {prefix = 'labelid'},
        {prefix = 'headerid'},
        {prefix = 'rowid'}
     }, 50)
     }, 50)
    preprocessSingleArg('headerclass')
     preprocessSingleArg('headerstyle')
     preprocessSingleArg('headerstyle')
     preprocessSingleArg('labelstyle')
     preprocessSingleArg('labelstyle')
Anonymous user