Module:Sandbox/User:Microbrews/Variants: Difference between revisions

No edit summary
No edit summary
 
(14 intermediate revisions by the same user not shown)
Line 33: Line 33:
function p.variants_header(args)
function p.variants_header(args)
local smw_data = get_table_info(args)
local smw_data = get_table_info(args)
local main_variant = args[1]
local main_variant = args[1]:gsub('%(', '%%%('):gsub('%)', '%%%)') -- it's going to be a pattern, so escape the parentheses
local contents
local contents
if smw_data then
if smw_data then
Line 40: Line 40:
local name = entry['page']
local name = entry['page']
local variant_name = name:gsub(main_variant, '', 1)
local variant_name = name:gsub(main_variant, '', 1)
variant_name = variant_name:gsub('^%s*(.-)%s*$', '%1') -- trim whitespace
table.insert(formatted, main_variant)
variant_name = variant_name:gsub('%((.-)%)$', '%1') -- trim parentheses
variant_name = variant_name:gsub("^%l", string.upper) -- capitalize first letter
table.insert(formatted, '[[' .. name .. '|' .. variant_name .. ']]')
end
end
contents = table.concat(formatted, ' • ')
contents = table.concat(formatted, ' • ')
Line 110: Line 113:
:tag('td')
:tag('td')
:css{ ['border-left'] = 'none' }
:css{ ['border-left'] = 'none' }
:wikitext(entry[1])
:wikitext('[['..entry['page']..']]')
:done()
:done()
:tag('td')
:tag('td')

Latest revision as of 01:42, 26 November 2024

Documentation for this module may be created at Module:Sandbox/User:Microbrews/Variants/doc

require('Module:Mw.html extension')
local p = {}

function sort_entries(entry1, entry2)
	-- Sort the variants based on the sum of the profession levels
	local entry1_value = (entry1['Profession Level A'] or 0) + (entry1['Profession Level B'] or 0)
	local entry2_value = (entry2['Profession Level A'] or 0) + (entry2['Profession Level B'] or 0)
	return entry1_value < entry2_value
end

function get_table_info(args, get_images)
	local variant_name = args.variant or mw.title.getCurrentTitle().fullText
	local query = {
        '[[Variant of::'..variant_name..']]',
        '?#-=page',
        '?Profession A #', -- Adding a # to this query makes it return plaintext instead of a link
        '?Profession B #',
        '?Profession Level A',
        '?Profession Level B',
        '?Profession Level A High',
        '?Profession Level B High',
        get_images and '?Image#64px;x64px = Image' or nil,
        limit = args.limit or 500,
    }
	local smw_data = mw.smw.ask(query)
	if not smw_data then
		return nil
	end
	table.sort(smw_data, sort_entries)
	return smw_data
end

function p.variants_header(args)
	local smw_data = get_table_info(args)
	local main_variant = args[1]:gsub('%(', '%%%('):gsub('%)', '%%%)')  -- it's going to be a pattern, so escape the parentheses
	local contents
	if smw_data then
    	local formatted = {}
    	for _, entry in ipairs(smw_data) do
    		local name = entry['page']
    		local variant_name = name:gsub(main_variant, '', 1)
    		variant_name = variant_name:gsub('^%s*(.-)%s*$', '%1')  -- trim whitespace
    		variant_name = variant_name:gsub('%((.-)%)$', '%1')  -- trim parentheses
    		variant_name = variant_name:gsub("^%l", string.upper)  -- capitalize first letter
    		table.insert(formatted, '[[' .. name .. '|' .. variant_name .. ']]')
    	end
		contents = table.concat(formatted, '&nbsp;•&nbsp;')
	else
		contents = '[[Category:Empty variant list]]'
	end
	return mw.html.create('div')
		:addClass('variants-header')
		:wikitext(contents)
	:done()
end

function p.main(frame)
	local args = frame:getParent().args
	args.variant = args[1] or args.variant
	return p.variants_header(args)
end

function p.variants_table(args)
	local smw_data = get_table_info(args, true)
	if not smw_data then
		return ':No variants found.'
	end
	
	local profession_b_flag = false
	for _, entry in ipairs(smw_data) do
		if entry['Profession B'] or entry['Profession Level B']	then
			profession_b_flag = true
		end
		break
	end
	
	local table = mw.html.create('table')
		:addClass('sortable wikitable')
		:tag('tr')
			:tag('th')
				:attr{ colspan = '2' }
				:wikitext('Item')
			:done()
			:tag('th')
				:wikitext('Level')
				:attrIf(profession_b_flag, 'colspan', 2)
			:done()
		:done()
	
	local function formatProfessionLevel(profession, level, high)
		if not (profession or level) then
			return nil
		end
		profession = profession or 'Unknown profession'
		local level_text = tostring(level or '?')
		if high then
			level_text = ('%s➨%d'):format(level_text, high)
		end
		return ('%s [[File:%s small icon.png|21x21px|link=%s]]'):format(level_text, profession, profession)
	end

	for _, entry in ipairs(smw_data) do
		local profession_level_a = entry['Profession Level A'] or '?'
		local profession_level_b = entry['Profession Level B'] or '?'
		local profession_a = entry['Profession A'] or ''
		local profession_b = entry['Profession B'] or ''
		table
			:tag('tr')
				:tag('td')
					:css{ ['border-right'] = 'none' }
					:wikitext(entry.Image)
				:done()
				:tag('td')
					:css{ ['border-left'] = 'none' }
					:wikitext('[['..entry['page']..']]')
				:done()
				:tag('td')
					:css{ ['text-align'] = 'right' }
					:wikitext(formatProfessionLevel(entry['Profession A'], entry['Profession Level A'], entry['Profession Level A High']))
				:IF(profession_b_flag)
					:tag('td')
					:IF(entry['Profession B'])
						:css{ ['text-align'] = 'right' }
						:wikitext(formatProfessionLevel(entry['Profession B'], entry['Profession Level B'], entry['Profession Level B High']))
					:done()
				:END()
			:done()
	end

	return table
end

function p.main_table(frame)
	local args = frame:getParent().args
	args.variant = args[1] or args.variant
	return p.variants_table(args)
end

return p