Module:MonsterVariantsTable: Difference between revisions

From Brighter Shores Wiki
Jump to navigation Jump to search
Content added Content deleted
mNo edit summary
m (cleanup)
Line 15: Line 15:
end
end


function p._main(args, Avariant)
function p._main(args)
local variant = args[1] or args.variant or Avariant or ''
local variant = args[1] or args.variant or ''
local query = {
local query = {
string.format('[[Variant of::%s]] [[Has query::+]] OR [[Has subobject::<q>[[Variant of::%s]]</q>]]', variant, variant),
string.format('[[Variant of::%s]]', variant),
'?Image#64px;x64px=img',
'?Image#64px;x64px = img',
'?Has subobject.Image#64px;x64px=img2',
'?Name = name',
'?Name=name',
'?= page',
'?= page',
'?Unlock_level = unlock',
'?Unlock_level = unlock',
'?Has subobject.Unlock_level = unlock2',
'?Profession_Level_A = combat',
'?Profession_Level_A = combat',
'?Has subobject.Profession_Level_A = combat2',
'?Profession A # = profession',
'?Profession A #=profession',
'?Version default = default',
'?Has subobject.Profession A #=profession2'
'?Variant name = variant',
'?Version anchor = version',
'?-Has subobject#- = subobject',
'sort=Profession Level A',
'order=asc'
}
}


local results = mw.smw.ask(query)
local results = mw.smw.ask(query)
mw.logObject(results)
if results == nil or results[1] == nil then
if results == nil or results[1] == nil then
return ":''No variants found for "..variant.."''"
return ":''No variants found for "..variant.."''"
end
end
local sorted = p.sort_by_combat(results)
local filtered = p.filter_versions(results)
local sorted = p.sort_by_combat(filtered)
--local debug_str = '<pre>'..mw.text.jsonEncode(sorted, mw.text.JSON_PRETTY)..'</pre>'

return tostring(p.create_table(sorted))--..debug_str
return tostring(p.create_table(sorted))
end

function p.filter_versions(data)
local filtered = {}
for _,entry in ipairs(data) do
if entry.default == true then
entry.page = ('[[%s|%s]]'):format(entry.subobject, entry.name)
table.insert(filtered, entry)
elseif entry.version == nil then
table.insert(filtered, entry)
end
end
return filtered
end
end


Line 46: Line 61:
table.sort(data, function(a, b)
table.sort(data, function(a, b)
-- Determine combat values
-- Determine combat values
local combatA = a.combat or (a.combat2 and a.combat2[1]) or math.huge
local combatA = a.combat or a.unlock or math.huge
local combatB = b.combat or (b.combat2 and b.combat2[1]) or math.huge
local combatB = b.combat or b.unlock or math.huge
-- Sort in ascending order
-- Sort in ascending order
return combatA < combatB
return combatA < combatB
Line 55: Line 70:


function p.insert_row(tbl, entry)
function p.insert_row(tbl, entry)
local edit = editbutton("'''?''' (edit)", entry.name)
tbl:tag('tr')
tbl:tag('tr')
:tag('td')
:tag('td')
Line 63: Line 79:
:done()
:done()
:tag('td')
:tag('td')
:wikitext(p.formatProfessionLevel(entry.profession, entry.unlock))
:wikitext(entry.unlock and p.formatProfessionLevel(entry.profession, entry.unlock) or edit)
:done()
:done()
:tag('td')
:tag('td')
:wikitext(p.formatProfessionLevel(entry.profession, entry.combat))
:wikitext(entry.combat and p.formatProfessionLevel(entry.profession, entry.combat) or edit)
:done()
:done()
:done()
:done()
return tbl
return tbl
end

function p.get_entry(entry, param)
return entry[param]
or (type(entry[param..'2']) == 'table' and entry[param..'2'][1])
or (type(entry[param..'2']) == 'string' and entry[param..'2'])
end
end


Line 98: Line 108:
for _,entry in ipairs(results) do
for _,entry in ipairs(results) do
local edit = editbutton("'''?''' (edit)", entry.name)
out = p.insert_row(out, entry)
local built_entry = {
combat = p.get_entry(entry, 'combat') or edit,
img = p.get_entry(entry, 'img') or mw.ustring.format('[[File:%s.png|64px|x64px]]', entry.name),
unlock = p.get_entry(entry, 'unlock') or edit,
profession = p.get_entry(entry, 'profession') or nil,
page = entry.page
}
out = p.insert_row(out, built_entry)
end
end

Revision as of 19:06, 2 January 2025

Module documentation
This documentation is transcluded from Module:MonsterVariantsTable/doc. [edit] [history] [purge]
This module does not have any documentation. Please consider adding documentation at Module:MonsterVariantsTable/doc. [edit]
Module:MonsterVariantsTable's function main is invoked by Template:MonsterVariantsTable.
Module:MonsterVariantsTable requires Module:Edit button.

local editbutton = require('Module:Edit button')
local p = {}

function p.main(frame)
	return p._main(frame:getParent().args)
end

function p.formatProfessionLevel(profession, level, high)
	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

function p._main(args)
	local variant = args[1] or args.variant or ''
	local query = {
        string.format('[[Variant of::%s]]', variant),
        '?Image#64px;x64px = img',
        '?Name = name',
        '?= page',
        '?Unlock_level = unlock',
        '?Profession_Level_A = combat',
        '?Profession A # = profession',
        '?Version default = default',
        '?Variant name = variant',
        '?Version anchor = version',
        '?-Has subobject#- = subobject',
        'sort=Profession Level A',
        'order=asc'
    }

    local results = mw.smw.ask(query)
    mw.logObject(results)
    if results == nil or results[1] == nil then
		return ":''No variants found for "..variant.."''"
	end
    
    local filtered = p.filter_versions(results)
    local sorted = p.sort_by_combat(filtered)

    return tostring(p.create_table(sorted))
end

function p.filter_versions(data)
	local filtered = {}
	for _,entry in ipairs(data) do
		if entry.default == true then
			entry.page = ('[[%s|%s]]'):format(entry.subobject, entry.name)
			table.insert(filtered, entry)
		elseif entry.version == nil then
			table.insert(filtered, entry)
		end
	end
	return filtered
end

function p.sort_by_combat(data)
    table.sort(data, function(a, b)
        -- Determine combat values
        local combatA = a.combat or a.unlock or math.huge
        local combatB = b.combat or b.unlock or math.huge
        -- Sort in ascending order
        return combatA < combatB
    end)
    return data
end

function p.insert_row(tbl, entry)
	local edit = editbutton("'''?''' (edit)", entry.name)
	tbl:tag('tr')
		:tag('td')
			:wikitext(entry.img)
		:done()
		:tag('td')
			:wikitext(entry.page)
		:done()
		:tag('td')
			:wikitext(entry.unlock and p.formatProfessionLevel(entry.profession, entry.unlock) or edit)
		:done()
		:tag('td')
			:wikitext(entry.combat and p.formatProfessionLevel(entry.profession, entry.combat) or edit)
		:done()
	:done()
	
	return tbl
end

function p.create_table(results)
	local out = mw.html.create('table')
		:addClass('wikitable sortable')
		:tag('tr')
			:tag('th')
				:wikitext('Image')
			:done()
			:tag('th')
				:wikitext('Monster')
			:done()
			:tag('th')
				:wikitext('Unlocked at')
			:done()
			:tag('th')
				:wikitext('Combat level')
			:done()
		:done()
		
	for _,entry in ipairs(results) do
		out = p.insert_row(out, entry)
	end
	
	return out
end

return p