|
|
| Line 1: |
Line 1: |
| | -- Module:Infobox |
| local p = {} | | local p = {} |
| function p.infobox( f ) | | |
| local args = require( 'Module:ProcessArgs' ).merge( true )
| | function p.infobox(frame) |
| local titleObject = mw.title.getCurrentTitle()
| | local args = frame:getParent().args |
| local title = args.title or titleObject.baseText
| | local html = mw.html.create('table'):addClass('infobox') |
| local template = f:getParent():getTitle():lower():gsub( 'template:', '' )
| | |
| local headerArea = ''
| | -- Title |
|
| | if args.title then |
| local json = {
| | html:tag('tr') |
| images = {},
| | :tag('th') |
| rows = {}
| | :addClass('infobox-title') |
| }
| | :wikitext(args.title) |
|
| | end |
| local imageArea = args.imagearea
| | |
| if not imageArea and imageArea ~= 'none' then
| | -- Image |
| local images = {}
| | if args.image then |
| local defaultImageSize = args.defaultimagesize or '150px'
| | html:tag('tr') |
| local defaultImageClass = args.defaultimageclass
| | :tag('td') |
| args.image1 = args.image1 or args.image or 'title'
| | :addClass('infobox-image') |
| args.image1size = args.image1size or args.imagesize
| | :wikitext('[[File:' .. args.image .. '|200px]]') |
| args.image1class = args.image1class or args.imageclass
| | end |
| args.group1 = args.group1 or args.group
| | |
| args.group1size = args.group1size or args.groupsize
| | -- Rows |
| args.group1class = args.group1class or args.groupclass
| | if args.rows then |
|
| | html:wikitext(args.rows) |
| local imgCount = {}
| | end |
| local invImgCount = {}
| | |
| local groupCount = {}
| | -- Footer |
| local groupImgList = {}
| | if args.footer then |
| for k, v in pairs( args ) do
| | html:tag('tr') |
| if type( k ) == 'string' then
| | :tag('td') |
| local image, num = k:match( '^(image)(%d+)$' )
| | :addClass('infobox-footer') |
| local invImage, invNum = k:match( '^(invimage)(%d+)$' )
| | :wikitext(args.footer) |
| local group, groupNum = k:match( '^(group)(%d+)$' )
| | end |
| local groupImg, groupImgNum = k:match( '^(%d+)-(%d+)$' )
| | |
| if v:lower() ~= 'none' then
| | return tostring(html) |
| if image then
| |
| table.insert( imgCount, tonumber( num ) )
| |
| elseif invImage then
| |
| table.insert( invImgCount, tonumber( invNum ) )
| |
| elseif group then
| |
| table.insert( groupCount, tonumber( groupNum ) )
| |
| if not groupImgList['group' .. groupNum] then
| |
| groupImgList['group' .. groupNum] = {}
| |
| end
| |
| elseif groupImg then
| |
| if not groupImgList['group' .. groupImg] then
| |
| groupImgList['group' .. groupImg] = {}
| |
| end
| |
| table.insert( groupImgList['group' .. groupImg], tonumber( groupImgNum ) )
| |
| end
| |
| end
| |
| end
| |
| end
| |
|
| |
| local animate
| |
| if #groupCount > 0 then
| |
| table.sort( groupCount )
| |
| local tabber = {}
| |
| for k, v in ipairs( groupCount ) do
| |
| local group = args['group' .. v]
| |
| local groupSize = args['group' .. v .. 'size'] or defaultImageSize
| |
| local groupClass = args['group' .. v .. 'class'] or defaultImageClass
| |
| local groupImages = {}
| |
|
| |
| table.sort( groupImgList['group' .. v] )
| |
| for _, w in ipairs( groupImgList['group' .. v] ) do
| |
| local image = args[v .. '-' .. w]
| |
| local size = args[v .. '-' .. w .. 'size'] or groupSize
| |
| local class = args[v .. '-' .. w .. 'class'] or groupClass
| |
|
| |
| if string.match( image, 'UNIQ%-%-gallery%-' ) then
| |
| image = image
| |
| elseif image:match( ';' ) then
| |
| if not animate then
| |
| animate = require( 'Module:Animate' ).animate
| |
| end
| |
| image = animate{ image, size, class = class }
| |
| else
| |
| json.images[#json.images + 1] = image
| |
| local altText = image .. ': Infobox image for ' .. title .. ' the ' .. template .. '.'
| |
| image = '[[File:' .. image .. '|' .. size .. '|class=' .. ( class or '' ) .. '|alt=' .. altText .. ']]'
| |
| end
| |
|
| |
| table.insert( groupImages, '<div>' .. image .. '</div>' )
| |
| end
| |
|
| |
| table.insert( tabber, '|-|' .. group .. '=\n' .. table.concat( groupImages, '\n' ) )
| |
| end
| |
| table.insert( images, '<div>' .. f:extensionTag( 'tabber', table.concat( tabber, '\n' ) ) .. '</div>' )
| |
| end
| |
|
| |
| table.sort( imgCount )
| |
| for k, v in ipairs( imgCount ) do
| |
| local image = args['image' .. v]
| |
| local size = args['image' .. v .. 'size'] or defaultImageSize
| |
| local class = args['image' .. v .. 'class'] or defaultImageClass
| |
|
| |
| if image == 'title' then
| |
| local imageTitle = mw.title.new( 'Media:' .. title .. '.png' )
| |
| if #groupCount == 0 and imageTitle and imageTitle.exists then
| |
| json.images[#json.images + 1] = title .. '.png'
| |
| local altText = title .. '.png: Infobox image for ' .. title .. ' the ' .. template .. '.'
| |
| image = '[[File:' .. title .. '.png|' .. size .. '|class=' .. ( class or '' ) .. '|alt=' .. altText .. ']]'
| |
| else
| |
| image = ''
| |
| end
| |
| elseif string.match( image, 'UNIQ%-%-gallery%-' ) then
| |
| image = image
| |
| --[[elseif image:match( ';' ) then
| |
| if not animate then
| |
| animate = require( 'Module:Animate' ).animate
| |
| end
| |
| image = animate{ image, size, class = class }--]]
| |
| else
| |
| json.images[#json.images + 1] = image
| |
| local altText = image .. ': Infobox image for ' .. title .. ' the ' .. template .. '.'
| |
| image = '[[File:' .. image .. '|' .. size .. '|class=' .. ( class or '' ) .. '|alt=' .. altText .. ']]'
| |
| end
| |
|
| |
| table.insert( images, '<div>' .. image .. '</div>' )
| |
| end
| |
|
| |
| images = table.concat( images, '\n' )
| |
|
| |
| if images ~= '' then
| |
| imageArea = images
| |
| else
| |
| imageArea = 'none'
| |
| end
| |
| end
| |
| if imageArea and imageArea ~= 'none' then
| |
| imageArea = '<div class="infobox-imagearea animated-container">' .. imageArea .. '</div>'
| |
| else
| |
| local groupArea = args.grouparea
| |
| if groupArea then
| |
| imageArea = groupArea
| |
| else
| |
| imageArea = ''
| |
| end
| |
| end
| |
|
| |
| local extraText = args.extratext
| |
|
| |
| if extraText and extraText ~= 'none' then
| |
| json.extratext = extraText
| |
| extraText = '<div class="infobox-extratext">'.. extraText ..'</div>'
| |
| else
| |
| extraText = ''
| |
| end
| |
|
| |
| headerArea = imageArea.. '' ..extraText
| |
| local footer = args.footer
| |
| if footer then
| |
| json.footer = footer
| |
| footer = '| class="infobox-footer" colspan="2" | ' .. footer
| |
| end
| |
|
| |
| json.title = title
| |
| --[[local repl = function( label, field )
| |
| json.rows[#json.rows + 1] = {
| |
| label = mw.text.jsonDecode( label:gsub( '\n', '\\n' ) ),
| |
| field = mw.text.jsonDecode( field:gsub( '\n', '\\n' ) )
| |
| }
| |
| return ''
| |
| end
| |
| args.rows = string.gsub( args.rows or '', '<code class="history%-json">{"label": (".-"), "field": (".-")}</code>\n', repl )--]]
| |
|
| |
| local html = {
| |
| '<div class="infobox">',
| |
| '<div class="tfpwiki-header infobox-title">' .. title .. '</div>',
| |
| headerArea,
| |
| '{| class="infobox-rows" cellspacing="1" cellpadding="4"',
| |
| '|-',
| |
| args.rows or '',
| |
| footer or '',
| |
| '|}',
| |
| '</div>',
| |
| f:callParserFunction( '#tag', { 'pre', class = 'history-json noexcerpt navigation-not-searchable',
| |
| mw.text.jsonEncode( json, mw.text.JSON_PRETTY )
| |
| } )
| |
| }
| |
|
| |
| return table.concat( html, '\n' )
| |
| end | | end |
|
| |
|
| return p | | return p |
Documentation for this module may be created at Module:Infobox/doc
-- Module:Infobox
local p = {}
function p.infobox(frame)
local args = frame:getParent().args
local html = mw.html.create('table'):addClass('infobox')
-- Title
if args.title then
html:tag('tr')
:tag('th')
:addClass('infobox-title')
:wikitext(args.title)
end
-- Image
if args.image then
html:tag('tr')
:tag('td')
:addClass('infobox-image')
:wikitext('[[File:' .. args.image .. '|200px]]')
end
-- Rows
if args.rows then
html:wikitext(args.rows)
end
-- Footer
if args.footer then
html:tag('tr')
:tag('td')
:addClass('infobox-footer')
:wikitext(args.footer)
end
return tostring(html)
end
return p