Module:MonsterVariantsTable: Difference between revisions

From Brighter Shores Wiki
Jump to navigation Jump to search
Content added Content deleted
mNo edit summary
mNo edit summary
(One intermediate revision by the same user not shown)
Line 1: Line 1:
local editbutton = require('Module:Edit button')
local p = {}
local p = {}


Line 6: Line 7:


function p.formatProfessionLevel(profession, level, high)
function p.formatProfessionLevel(profession, level, high)
if not (profession or level) then
return nil
end
profession = profession or 'Unknown profession'
profession = profession or 'Unknown profession'
local level_text = tostring(level or '?')
local level_text = tostring(level or '?')
Line 17: Line 15:
end
end


function p._main(args)
function p._main(args, Avariant)
local variant = args[1] or args.variant or ''
local variant = args[1] or args.variant or Avariant 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]] [[Has query::+]] OR [[Has subobject::<q>[[Variant of::%s]]</q>]]', variant, variant),
'?Image#64px;x64px=img',
'?Image#64px;x64px=img',
'?Has subobject.Image#64px;x64px=img2',
'?Has subobject.Image#64px;x64px=img2',
'?Name=name',
'?= page',
'?= page',
'?Unlock_level = unlock',
'?Unlock_level = unlock',
Line 35: Line 34:
if results == nil or results[1] == nil then
if results == nil or results[1] == nil then
return 'No data found for table'
return ":''No variants found for "..variant.."''"
end
end
Line 72: Line 71:
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 93: Line 98:
for _,entry in ipairs(results) do
for _,entry in ipairs(results) do
local edit = editbutton("'''?''' (edit)", entry.name)
local built_entry = {
local built_entry = {
combat = entry.combat or entry.combat2[1] or entry.combat2 or '',
combat = p.get_entry(entry, 'combat') or edit,
img = entry.img or entry.img2[1] or entry.img2 or '',
img = p.get_entry(entry, 'img') or mw.ustring.format('[[File:%s.png|64px|x64px]]', entry.name),
unlock = entry.unlock or entry.unlock2[1] or entry.unlock2 or '',
unlock = p.get_entry(entry, 'unlock') or edit,
profession = entry.profession or entry.profession2[1] or entry.profession2 or '',
profession = p.get_entry(entry, 'profession') or nil,
page = entry.page
page = entry.page
}
}

Revision as of 16:56, 30 December 2024

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, Avariant)
	local variant = args[1] or args.variant or Avariant or ''
	local query = {
        string.format('[[Variant of::%s]] [[Has query::+]] OR [[Has subobject::<q>[[Variant of::%s]]</q>]]', variant, variant),
        '?Image#64px;x64px=img',
        '?Has subobject.Image#64px;x64px=img2',
        '?Name=name',
        '?= page',
        '?Unlock_level = unlock',
        '?Has subobject.Unlock_level = unlock2',
        '?Profession_Level_A = combat',
        '?Has subobject.Profession_Level_A = combat2',
        '?Profession A #=profession',
        '?Has subobject.Profession A #=profession2'
    }

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

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

function p.insert_row(tbl, entry)
	tbl:tag('tr')
		:tag('td')
			:wikitext(entry.img)
		:done()
		:tag('td')
			:wikitext(entry.page)
		:done()
		:tag('td')
			:wikitext(p.formatProfessionLevel(entry.profession, entry.unlock))
		:done()
		:tag('td')
			:wikitext(p.formatProfessionLevel(entry.profession, entry.combat))
		:done()
	:done()
	
	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

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
		local edit = editbutton("'''?''' (edit)", entry.name)
		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
	
	return out
end

return p