Module:Costume thumbnails

From Sekaipedia


To generate {{Costume thumbnails}}, invoke using the main function.


local getArgs       = require('Module:Arguments').getArgs
local ProcessingFns = require('Module:ProcessingFunctions')

local p = {}

local function convertAndFilter(array)
	local validValues = {}
	local keys = {}
	
	for _, value in ipairs(array) do
		if value == 'default' then
			value = 0
		end
		
		value = tonumber(value)
		
		if value ~= nil and value >= 0 and validValues[value] == nil then
			validValues[value] = true
		end
	end
	
	for key, _ in pairs(validValues) do
		table.insert(keys, key)
	end
	
	return keys
end

local function renderHeaderRow(
	hasCostumeVariants, 
	hasAccessoryVariants,
	hasUniqueAccessoryVariants
)
	local row = mw.html.create('tr')
	
	row:tag('th')
		:wikitext('Variant')
		:done()
	
	if hasCostumeVariants then
		row:tag('th')
			:wikitext('Costume')
	end
		
	if hasAccessoryVariants then
		row:tag('th')
			:wikitext('Accessory')
			:done()
	end
	
	if hasUniqueAccessoryVariants then
		row:tag('th')
			:wikitext('Unique accessory')
			:done()
	end
	
	return row
end

local function renderRow(
	basePath,
	hasCostumeVariants,
	hasAccessoryVariants,
	hasUniqueAccessoryVariants,
	variant,
	hasCostume,
	hasAccessory,
	hasUniqueAccessory
)
	local row = mw.html.create('tr')
	
	if variant == 0 then
		variantText = 'Default'
		costumeFileName = string.format(
			'%s %s', 
			basePath,
			'body'
		)
		accessoryFileName = string.format(
			'%s %s', 
			basePath,
			'head'
		)
		uniqueAccessoryFileName = string.format(
			'%s %s', 
			basePath, 
			'unique head'
		)
	else
		variantText = string.format('Variant %d', variant)
		costumeFileName = string.format(
			'%s %s 0%d',
			basePath,
			'body',
			variant
		)
		accessoryFileName = string.format(
			'%s %s 0%d',
			basePath,
			'head',
			variant
		)
		uniqueAccessoryFileName = string.format(
			'%s %s 0%d',
			basePath,
			'unique head',
			variant
		)
	end
	
	row
		:tag('td')
			:wikitext(variantText)
			:done()
	
	if hasCostumeVariants then
		costumeFile = ''
		if hasCostume then
			costumeFile = string.format(
				'[[File:%s.png]]',
				costumeFileName
			)
		end
		
		row:tag('td')
			:wikitext(costumeFile)
			:done()
	end
	
	if hasAccessoryVariants then
		accessoryFile = ''
		if hasAccessory then
			accessoryFile = string.format(
				'[[File:%s.png]]',
				accessoryFileName
			)
		end
		
		row:tag('td')
			:wikitext(accessoryFile)
			:done()
	end
	
	if hasUniqueAccessoryVariants then
		uniqueAccessoryFile = ''
		if hasUniqueAccessory then
			uniqueAccessoryFile = string.format(
				'[[File:%s.png]]',
				uniqueAccessoryFileName
			)
		end
		
		row:tag('td')
			:wikitext(uniqueAccessoryFile)
			:done()
	end
	
	return row
end

local function renderTable(
	base,
	costumeVariants,
	accessoryVariants,
	uniqueAccessoryVariants
)
	local hasCostumeVariants = #costumeVariants > 0
	local hasAccessoryVariants = #accessoryVariants > 0
	local hasUniqueAccessoryVariants = #uniqueAccessoryVariants > 0
	
	local data = {}
	
	for _, variant in ipairs(costumeVariants) do
		if data[variant] == nil then
			data[variant] = {}
		end
		data[variant]['costume'] = true
	end
	
	for _, variant in ipairs(accessoryVariants) do
		if data[variant] == nil then
			data[variant] = {}
		end
		data[variant]['accessory'] = true
	end
	
	for _, variant in ipairs(uniqueAccessoryVariants) do
		if data[variant] == nil then
			data[variant] = {}
		end
		data[variant]['uniqueAccessory'] = true
	end
	
	local variantKeys = {}
	for key, _ in pairs(data) do
		table.insert(variantKeys, key)
	end
	table.sort(variantKeys)
	
	local tbl = mw.html.create('table')
		:addClass('wikitable')
	
	tbl:node(renderHeaderRow(
		hasCostumeVariants,
		hasAccessoryVariants,
		hasUniqueAccessoryVariants
	))

	for _, key in ipairs(variantKeys) do
		value = data[key]
		tbl:node(renderRow(
			base,
			hasCostumeVariants,
			hasAccessoryVariants,
			hasUniqueAccessoryVariants,
			key,
			value['costume'] or false,
			value['accessory'] or false,
			value['uniqueAccessory'] or false
		))
	end
	
	return tbl
end

local split = ProcessingFns.stringToArray(',')


function p.main(frame)
	local args = getArgs(frame)
	
	local basePath = args['base path']
	
	local costumeVariants = convertAndFilter(
		split(args['costumes']) or {}
	)
	local accessoryVariants = convertAndFilter(
		split(args['accessories']) or {}
	)
	local uniqueAccessoryVariants = convertAndFilter(
		split(args['unique accessories']) or {}
	)
	
	tbl = renderTable(
		basePath,
		costumeVariants,
		accessoryVariants,
		uniqueAccessoryVariants
	)

	return tostring(tbl)
end

return p
Cookies help us deliver our services. By using our services, you agree to our use of cookies.