Module:Infobox: Difference between revisions

From WikiPhone
Jump to navigation Jump to search
No edit summary
Tag: Reverted
No edit summary
Tag: Reverted
Line 7: Line 7:
local template = f:getParent():getTitle():lower():gsub('template:', '')
local template = f:getParent():getTitle():lower():gsub('template:', '')
local headerArea = ''
local headerArea = ''
 
local json = {
local json = {
images = {},
images = {},
rows = {}
rows = {}
}
}
 
local imageArea = args.imagearea
local imageArea = args.imagearea
if not imageArea and imageArea ~= 'none' then
if not imageArea and imageArea ~= 'none' then
local images = {}
local images = {}
local defaultImageSize = args.defaultimagesize or '150px'
local defaultImageSize = args.defaultimagesize or '150px'
local defaultImageClass = args.defaultimageclass
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.image1class = args.image1class or args.imageclass
args.image1class = args.image1class or args.imageclass
args.group1 = args.group1 or args.group
args.group1 = args.group1 or args.group
args.group1size = args.group1size or args.groupsize
args.group1size = args.group1size or args.groupsize
args.group1class = args.group1class or args.groupclass
args.group1class = args.group1class or args.groupclass
 
local imgCount = {}
local imgCount = {}
local invImgCount = {}
local invImgCount = {}
local groupCount = {}
local groupCount = {}
local groupImgList = {}
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' and type(v) == '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 group, groupNum = k:match('^(group)(%d+)$')
local groupImg, groupImgNum = k:match('^(%d+)-(%d+)$')
local groupImg, groupImgNum = k:match('^(%d+)-(%d+)$')
if v:lower() ~= 'none' then
if v:lower() ~= 'none' then
if image then
if image then
table.insert(imgCount, tonumber(num))
table.insert(imgCount, tonumber(num))
elseif invImage then
elseif invImage then
table.insert(invImgCount, tonumber(invNum))
table.insert(invImgCount, tonumber(invNum))
elseif group then
elseif group then
table.insert(groupCount, tonumber(groupNum))
table.insert(groupCount, tonumber(groupNum))
if not groupImgList['group' .. groupNum] then
if not groupImgList['group' .. groupNum] then
groupImgList['group' .. groupNum] = {}
groupImgList['group' .. groupNum] = {}
end
end
elseif groupImg then
elseif groupImg then
if not groupImgList['group' .. groupImg] then
if not groupImgList['group' .. groupImg] then
groupImgList['group' .. groupImg] = {}
groupImgList['group' .. groupImg] = {}
end
end
table.insert(groupImgList['group' .. groupImg], tonumber(groupImgNum))
table.insert(groupImgList['group' .. groupImg], tonumber(groupImgNum))
end
end
Line 54: Line 64:
end
end
end
end
 
local animate
local animate
if #groupCount > 0 then
if #groupCount > 0 then
table.sort(groupCount)
table.sort(groupCount)
local tabber = {}
local tabber = {}
for _, v in ipairs(groupCount) do
for _, v in ipairs(groupCount) do
local group = args['group' .. v]
local group = args['group' .. v]
Line 64: Line 77:
local groupClass = args['group' .. v .. 'class'] or defaultImageClass
local groupClass = args['group' .. v .. 'class'] or defaultImageClass
local groupImages = {}
local groupImages = {}
 
table.sort(groupImgList['group' .. v])
if groupImgList['group' .. v] then
for _, w in ipairs(groupImgList['group' .. v]) do
table.sort(groupImgList['group' .. v])
local image = args[v .. '-' .. w]
 
local size = args[v .. '-' .. w .. 'size'] or groupSize
for _, w in ipairs(groupImgList['group' .. v]) do
local class = args[v .. '-' .. w .. 'class'] or groupClass
local image = args[v .. '-' .. w]
local size = args[v .. '-' .. w .. 'size'] or groupSize
if string.match(image, 'UNIQ%-%-gallery%-') then
local class = args[v .. '-' .. w .. 'class'] or groupClass
image = image
 
elseif image:match(';') then
if string.match(image, 'UNIQ%-%-gallery%-') then
if not animate then
image = image
animate = require('Module:Animate').animate
 
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
end
image = animate{image, size, class = class}
 
else
table.insert(groupImages, image)
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
end
table.insert(groupImages, '<div>' .. image .. '</div>')
end
end
 
table.insert(tabber, '|-|' .. group .. '=\n' .. table.concat(groupImages, '\n'))
table.insert(
tabber,
'|-|' .. group .. '=' .. table.concat(groupImages, '')
)
end
end
table.insert(images, '<div>' .. f:extensionTag('tabber', table.concat(tabber, '\n')) .. '</div>')
 
table.insert(
images,
f:extensionTag('tabber', table.concat(tabber, ''))
)
end
end
 
table.sort(imgCount)
table.sort(imgCount)
for _, v in ipairs(imgCount) do
for _, 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 class = args['image' .. v .. 'class'] or defaultImageClass
 
if image == 'title' then
if image == 'title' then
local imageTitle = mw.title.new('Media:' .. title .. '.png')
local imageTitle = mw.title.new('Media:' .. title .. '.png')
if #groupCount == 0 and imageTitle and imageTitle.exists then
if #groupCount == 0 and imageTitle and imageTitle.exists then
json.images[#json.images + 1] = title .. '.png'
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 .. ']]'
local altText =
title ..
'.png: Infobox image for ' ..
title ..
' the ' ..
template ..
'.'
 
image =
'[[File:' ..
title ..
'.png|' ..
size ..
'|class=' ..
(class or '') ..
'|alt=' ..
altText ..
']]'
else
else
image = ''
image = ''
end
end
elseif string.match(image, 'UNIQ%-%-gallery%-') then
elseif string.match(image, 'UNIQ%-%-gallery%-') then
image = image
image = image
else
else
json.images[#json.images + 1] = image
json.images[#json.images + 1] = image
local altText = image .. ': Infobox image for ' .. title .. ' the ' .. template .. '.'
 
image = '[[File:' .. image .. '|' .. size .. '|class=' .. (class or '') .. '|alt=' .. altText .. ']]'
local altText =
image ..
': Infobox image for ' ..
title ..
' the ' ..
template ..
'.'
 
image =
'[[File:' ..
image ..
'|' ..
size ..
'|class=' ..
(class or '') ..
'|alt=' ..
altText ..
']]'
end
 
if image ~= '' then
table.insert(images, image)
end
end
table.insert(images, image)
end
end
 
images = table.concat(images, '\n')
images = table.concat(images, '')
 
if images ~= '' then
if images ~= '' then
imageArea = images
imageArea = images
Line 126: Line 207:
end
end
end
end
 
if imageArea and imageArea ~= 'none' then
if imageArea and imageArea ~= 'none' then
imageArea = '<div class="infobox-imagearea animated-container">' .. imageArea .. '</div>'
imageArea =
'<div class="infobox-imagearea animated-container">' ..
imageArea ..
'</div>'
else
else
local groupArea = args.grouparea
local groupArea = args.grouparea
if groupArea then
if groupArea then
imageArea = groupArea
imageArea = groupArea
Line 137: Line 222:
end
end
end
end
 
local extraText = args.extratext
local extraText = args.extratext
 
if extraText and extraText ~= 'none' then
if extraText and extraText ~= 'none' then
json.extratext = extraText
json.extratext = extraText
extraText = '<div class="infobox-extratext">' .. extraText .. '</div>'
extraText =
'<div class="infobox-extratext">' ..
extraText ..
'</div>'
else
else
extraText = ''
extraText = ''
end
end
 
headerArea = imageArea .. extraText
headerArea = imageArea .. extraText
local footer = args.footer
local footer = args.footer
if footer then
if footer then
json.footer = footer
json.footer = footer
footer = '| class="infobox-footer" colspan="2" | ' .. footer
footer = '| class="infobox-footer" colspan="2" | ' .. footer
end
end
 
json.title = title
json.title = title
 
local html = {
local html = {
'<div class="infobox">',
'<div class="infobox">',
'<div class="infobox-title">' .. title .. '</div>',
'<div class="infobox-title">' .. title .. '</div>',
headerArea,
headerArea,
'{| class="infobox-rows" cellspacing="1" cellpadding="4"',
'{| class="infobox-rows" cellspacing="1" cellpadding="4"',
'|-',
'|-',
args.rows or '',
args.rows or '',
footer or '',
footer or '',
'|}',
'|}',
'</div>'
'</div>'
}
}
 
return table.concat(html, '')
return table.concat(html, '')
end
end


return p
return p

Revision as of 05:25, 23 May 2026

Documentation for this module may be created at Module:Infobox/doc

local p = {}

function p.infobox(f)
	local args = require('Module:Arguments').getArgs(f)
	local titleObject = mw.title.getCurrentTitle()
	local title = args.title or titleObject.baseText
	local template = f:getParent():getTitle():lower():gsub('template:', '')
	local headerArea = ''

	local json = {
		images = {},
		rows = {}
	}

	local imageArea = args.imagearea

	if not imageArea and imageArea ~= 'none' then
		local images = {}
		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.group1 = args.group1 or args.group
		args.group1size = args.group1size or args.groupsize
		args.group1class = args.group1class or args.groupclass

		local imgCount = {}
		local invImgCount = {}
		local groupCount = {}
		local groupImgList = {}

		for k, v in pairs(args) do
			if type(k) == 'string' and type(v) == '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 _, 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 = {}

				if groupImgList['group' .. v] then
					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, image)
					end
				end

				table.insert(
					tabber,
					'|-|' .. group .. '=' .. table.concat(groupImages, '')
				)
			end

			table.insert(
				images,
				f:extensionTag('tabber', table.concat(tabber, ''))
			)
		end

		table.sort(imgCount)

		for _, 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

			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

			if image ~= '' then
				table.insert(images, image)
			end
		end

		images = table.concat(images, '')

		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 html = {
		'<div class="infobox">',
		'<div class="infobox-title">' .. title .. '</div>',
		headerArea,
		'{| class="infobox-rows" cellspacing="1" cellpadding="4"',
		'|-',
		args.rows or '',
		footer or '',
		'|}',
		'</div>'
	}

	return table.concat(html, '')
end

return p