Module:Infobox: Difference between revisions

From Modded Wiki
Jump to navigation Jump to search
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.
m 52 revisions imported
 
(27 intermediate revisions by 4 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 'title'
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 grid
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
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
end
table.insert( groupImages, '<div>' .. image .. caption .. '</div>' )
end
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
end
table.insert( images, '<div>' .. f:extensionTag( 'tabber', table.concat( tabber, '\n' ) ) .. '</div>' )
end
end
table.sort( imgCount )
table.sort( imgCount )
local animate
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( 'File:' .. title .. '.png' )
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 grid
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
local imageTitle = mw.title.new( 'File:Grid ' .. title .. '.png' )
if invTitle and invTitle.exists or invAliases[title] then
if imageTitle and imageTitle.exists then
image = title
image = title
else
else
Line 73: Line 168:
end
end
if image then
if image == '----' then
if not grid then
table.insert( invImages, '</div><div style="padding-top:.5em">' )
grid = require( 'Module:Grid' ).cell
elseif image then
if not slot then
slot = require( 'Module:Inventory slot' ).slot
end
end
table.insert( invImages, grid{ image, link = 'none' } )
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
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
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 )
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>',
imageArea,
headerArea,
'{| class="infobox-rows" cellspacing="1" cellpadding="4"',
'{| class="infobox-rows" cellspacing="1" cellpadding="4"',
'|-',
'|-',
Line 116: Line 240:
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 )
} )
}
}

Latest revision as of 07:52, 4 July 2024

Implements {{Infobox}}

Usage

de:Modul:Infobox es:Módulo:Infobox fr:Module:Infobox it:Modulo:Infobox ja:モジュール:Infobox ko:모듈:Infobox lzh:模組:Infobox nl:Module:Infobox pl:Moduł:Infobox pt:Módulo:Infobox ru:Модуль:Карточка th:มอดูล:Infobox uk:Модуль:Картка zh:Module:Infobox


local p = {}
function p.infobox( f )
	local args = require( 'Module:ProcessArgs' ).merge( true )
	local titleObject = mw.title.getCurrentTitle()
	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
	if not imageArea and imageArea ~= 'none' then
		local images = {}
		local invImages = {}
		local defaultImageSize = args.defaultimagesize or '150px'
		local defaultImageClass = args.defaultimageclass
		args.image1 = args.image1 or args.image or 'title'
		args.image1size = args.image1size or args.imagesize
		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 invImgCount = {}
		local groupCount = {}
		local groupImgList = {}
		for k, v in pairs( args ) do
			if type( k ) == 'string' then
				local image, num = k:match( '^(image)(%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 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 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
		
		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
			local caption = args['image' .. v .. 'caption'] or ''
			
			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 .. ' in Minecraft'
					image = '[[File:' .. title .. '.png|' .. size .. '|class=' .. ( class or '' ) .. '|alt=' .. altText .. ']]'
				else
					image = ''
				end
			--[=[
				elseif titleObject.namespace == 0 then
					image = '[[File:No image.svg|' .. size .. '|link=File:' .. title .. '.png|Upload ' .. title .. '.png]]'
				else
					image = '[[File:No image.svg|' .. size .. '|link=]]'
				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 .. ' 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
			
			if image ~= '' or caption ~= '' then
				table.insert( images, '<div>' .. image .. caption .. '</div>' )
			end
		end
		
		images = table.concat( images, '\n' )
		
		if #invImgCount > 0 then
			table.sort( invImgCount )
			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
				local image = args['invimage' .. v]
				if image == 'title' then
					if invTitle and invTitle.exists or invAliases[title] then
						image = title
					else
						image = false
					end
				end
				
				if image == '----' then
					table.insert( invImages, '</div><div style="padding-top:.5em">' )
				elseif image then
					if not slot then
						slot = require( 'Module:Inventory slot' ).slot
					end
					json.invimages[#json.invimages + 1] = image
					table.insert( invImages, slot{ image, link = 'none' } )
				end
			end
			
			if slot and #invImages > 0 then
				invImages = '<div class="infobox-invimages"><div>' .. table.concat( invImages, '' ) .. '</div></div>'
			else
				invImages = ''
			end
		else
			invImages = ''
		end
		
		if images ~= '' or invImages ~= '' then
			imageArea = images .. '\n' .. invImages
		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="notaninfobox">',
			'<div class="mcwiki-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

return p