Module:Infobox: Difference between revisions
Remove 0th edit section. Despite the edit links already all over the page, this one in particular seems to be an idiot magnet. It also didn't work for the few infoboxes that weren't in the 0th section. |
No edit summary |
||
| (29 intermediate revisions by 5 users not shown) | |||
| Line 4: | Line 4: | ||
local titleObject = mw.title.getCurrentTitle() | local titleObject = mw.title.getCurrentTitle() | ||
local title = args.title or titleObject.baseText | local title = args.title or titleObject.baseText | ||
local template = f:getParent():getTitle():lower():gsub( 'template:', '' ):gsub( 'infobox ', '' ) | |||
local headerArea = '' | |||
local json = { | |||
images = {}, | |||
invimages = {}, | |||
rows = {}, | |||
} | |||
local imageArea = args.imagearea | local imageArea = args.imagearea | ||
| Line 10: | Line 18: | ||
local invImages = {} | local invImages = {} | ||
local defaultImageSize = args.defaultimagesize or '150px' | local defaultImageSize = args.defaultimagesize or '150px' | ||
local defaultImageClass = args.defaultimageclass | |||
args.image1 = args.image1 or args.image or 'title' | args.image1 = args.image1 or args.image or 'title' | ||
args.image1size = args.image1size or args.imagesize | args.image1size = args.image1size or args.imagesize | ||
args.invimage1 = args.invimage1 or args.invimage or ' | args.image1class = args.image1class or args.imageclass | ||
args.image1caption = args.image1caption or args.imagecaption or '' | |||
args.invimage1 = args.invimage1 or args.invimage or 'none' | |||
args.group1 = args.group1 or args.group | |||
args.group1size = args.group1size or args.groupsize | |||
args.group1class = args.group1class or args.groupclass | |||
args.group1caption = args.group1caption or args.groupcaption or '' | |||
local imgCount = {} | local imgCount = {} | ||
local invImgCount = {} | local invImgCount = {} | ||
local | local groupCount = {} | ||
local groupImgList = {} | |||
for k, v in pairs( args ) do | for k, v in pairs( args ) do | ||
if type( k ) == 'string' then | if type( k ) == 'string' then | ||
local image, num = k:match( '^(image)(%d+)$' ) | local image, num = k:match( '^(image)(%d+)$' ) | ||
local invImage, invNum = k:match( '^(invimage)(%d+)$' ) | local invImage, invNum = k:match( '^(invimage)(%d+)$' ) | ||
local group, groupNum = k:match( '^(group)(%d+)$' ) | |||
local groupImg, groupImgNum = k:match( '^(%d+)-(%d+)$' ) | |||
if v:lower() ~= 'none' then | if v:lower() ~= 'none' then | ||
if image then | if image then | ||
| Line 26: | Line 44: | ||
elseif invImage then | elseif invImage then | ||
table.insert( invImgCount, tonumber( invNum ) ) | 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 | ||
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 groupCaption = args['group' .. v .. 'caption'] or '' | |||
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 | |||
local caption = args[v .. '-' .. w .. 'caption'] or '' | |||
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 .. ' in Minecraft' | |||
image = '[[File:' .. image .. '|' .. size .. '|class=' .. ( class or '' ) .. '|alt=' .. altText .. ']]' | |||
end | |||
if caption ~= '' then | |||
caption = '<div class="infobox-imagecaption">\n' .. caption .. '\n</div>' | |||
end | |||
table.insert( groupImages, '<div>' .. image .. caption .. '</div>' ) | |||
end | |||
if groupCaption ~= '' then | |||
groupCaption = '<div class="infobox-imagecaption">\n' .. groupCaption .. '\n</div>' | |||
end | |||
table.insert( tabber, '|-|' .. group .. '=\n' .. table.concat( groupImages, '\n' ) .. groupCaption ) | |||
end | |||
table.insert( images, '<div>' .. f:extensionTag( 'tabber', table.concat( tabber, '\n' ) ) .. '</div>' ) | |||
end | end | ||
table.sort( imgCount ) | table.sort( imgCount ) | ||
for k, v in ipairs( imgCount ) do | for k, v in ipairs( imgCount ) do | ||
local image = args['image' .. v] | local image = args['image' .. v] | ||
local size = args['image' .. v .. 'size'] or defaultImageSize | local size = args['image' .. v .. 'size'] or defaultImageSize | ||
local class = args['image' .. v .. 'class'] or defaultImageClass | |||
local caption = args['image' .. v .. 'caption'] or '' | |||
if image == 'title' then | if image == 'title' then | ||
local imageTitle = mw.title.new( ' | local imageTitle = mw.title.new( 'Media:' .. title .. '.png' ) | ||
if imageTitle and imageTitle.exists then | if #groupCount == 0 and imageTitle and imageTitle.exists then | ||
image = '[[File:' .. title .. '.png|' .. size .. ']]' | json.images[#json.images + 1] = title .. '.png' | ||
local altText = title .. '.png: Infobox image for ' .. title .. ' the ' .. template .. ' in Minecraft' | |||
image = '[[File:' .. title .. '.png|' .. size .. '|class=' .. ( class or '' ) .. '|alt=' .. altText .. ']]' | |||
else | |||
image = '' | |||
end | |||
--[=[ | |||
elseif titleObject.namespace == 0 then | elseif titleObject.namespace == 0 then | ||
image = '[[File:No image.svg|' .. size .. '|link=File:' .. title .. '.png|Upload ' .. title .. '.png]]' | image = '[[File:No image.svg|' .. size .. '|link=File:' .. title .. '.png|Upload ' .. title .. '.png]]' | ||
| Line 46: | Line 128: | ||
image = '[[File:No image.svg|' .. size .. '|link=]]' | image = '[[File:No image.svg|' .. size .. '|link=]]' | ||
end | end | ||
]=] | |||
elseif string.match( image, 'UNIQ%-%-gallery%-' ) then | |||
image = image | |||
elseif image:match( ';' ) then | elseif image:match( ';' ) then | ||
if not animate then | if not animate then | ||
animate = require( 'Module:Animate' ).animate | animate = require( 'Module:Animate' ).animate | ||
end | end | ||
image = animate{ image, size } | image = animate{ image, size, class = class } | ||
else | else | ||
image = '[[File:' .. image .. '|' .. size .. ']]' | json.images[#json.images + 1] = image | ||
local altText = image .. ': Infobox image for ' .. title .. ' the ' .. template .. ' in Minecraft' | |||
image = '[[File:' .. image .. '|' .. size .. '|class=' .. ( class or '' ) .. '|alt=' .. altText .. ']]' | |||
end | |||
if caption ~= '' then | |||
caption = '<div class="infobox-imagecaption">\n' .. caption .. '\n</div>' | |||
end | end | ||
table.insert( images, '<div>' .. image .. '</div>' ) | if image ~= '' or caption ~= '' then | ||
table.insert( images, '<div>' .. image .. caption .. '</div>' ) | |||
end | |||
end | end | ||
images = table.concat( images, '\n' ) | images = table.concat( images, '\n' ) | ||
if #invImgCount > 0 then | if #invImgCount > 0 then | ||
table.sort( invImgCount ) | table.sort( invImgCount ) | ||
local | local slot | ||
local invTitle = mw.title.new( 'Media:Invicon ' .. title .. '.png' ) | |||
local invAliases = mw.loadData( 'Module:Inventory slot/Aliases' ) | |||
for k, v in ipairs( invImgCount ) do | for k, v in ipairs( invImgCount ) do | ||
local image = args['invimage' .. v] | local image = args['invimage' .. v] | ||
if image == 'title' then | if image == 'title' then | ||
if invTitle and invTitle.exists or invAliases[title] then | |||
if | |||
image = title | image = title | ||
else | else | ||
| Line 73: | Line 168: | ||
end | end | ||
if image then | if image == '----' then | ||
if not | table.insert( invImages, '</div><div style="padding-top:.5em">' ) | ||
elseif image then | |||
if not slot then | |||
slot = require( 'Module:Inventory slot' ).slot | |||
end | end | ||
table.insert( invImages, | json.invimages[#json.invimages + 1] = image | ||
table.insert( invImages, slot{ image, link = 'none' } ) | |||
end | end | ||
end | end | ||
if #invImages > 0 then | if slot and #invImages > 0 then | ||
invImages = '<div class="infobox-invimages">' .. table.concat( invImages, '' ) .. '</div>' | invImages = '<div class="infobox-invimages"><div>' .. table.concat( invImages, '' ) .. '</div></div>' | ||
else | else | ||
invImages = '' | invImages = '' | ||
| Line 97: | Line 195: | ||
end | end | ||
if imageArea and imageArea ~= 'none' then | if imageArea and imageArea ~= 'none' then | ||
imageArea = '<div class="infobox-imagearea">' .. imageArea .. '</div>' | imageArea = '<div class="infobox-imagearea animated-container">' .. imageArea .. '</div>' | ||
else | else | ||
imageArea = '' | 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 | end | ||
headerArea = imageArea.. '' ..extraText | |||
local footer = args.footer | local footer = args.footer | ||
if footer then | if footer then | ||
json.footer = footer | |||
footer = '| class="infobox-footer" colspan="2" | ' .. footer | footer = '| class="infobox-footer" colspan="2" | ' .. footer | ||
end | 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 ) | |||
args.rows2 = string.gsub( args.rows2 or '', '<code class="history%-json">{"label": (".-"), "field": (".-")}</code>\n', repl ) | |||
local html = { | local html = { | ||
'<div class="notaninfobox">', | '<div class="notaninfobox">', | ||
'<div class="mcwiki-header infobox-title">' .. title .. '</div>', | '<div class="mcwiki-header infobox-title">' .. title .. '</div>', | ||
headerArea, | |||
'{| class="infobox-rows" cellspacing="1" cellpadding="4"', | '{| class="infobox-rows" cellspacing="1" cellpadding="4"', | ||
'|-', | '|-', | ||
args.rows or '', | args.rows or '', | ||
args.rows2 or '', | |||
footer or '', | footer or '', | ||
'|}', | '|}', | ||
'</div>' | '</div>', | ||
f:callParserFunction( '#tag', { 'pre', class = 'history-json noexcerpt navigation-not-searchable', | |||
mw.text.jsonEncode( json, mw.text.JSON_PRETTY ) | |||
} ) | |||
} | } | ||