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:
local editbutton = require('Module:Edit button')
local p = {}
 
Line 6 ⟶ 7:
 
function p.formatProfessionLevel(profession, level, high)
if not (profession or level) then
return nil
end
profession = profession or 'Unknown profession'
local level_text = tostring(level or '?')
Line 17 ⟶ 15:
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',
Line 35 ⟶ 34:
if results == nil or results[1] == nil then
return ":''No datavariants found for table"..variant.."''"
end
Line 72 ⟶ 71:
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
 
Line 93 ⟶ 98:
for _,entry in ipairs(results) do
local edit = editbutton("'''?''' (edit)", entry.name)
local built_entry = {
combat = entryp.combat or get_entry(entry.combat2[1], or entry.combat2'combat') or ''edit,
img = entryp.get_entry(entry, 'img') or entrymw.img2ustring.format('[1[File:%s.png|64px|x64px] or]', entry.img2 or ''name),
unlock = entryp.unlock or get_entry(entry.unlock2[1], or entry.unlock2'unlock') or ''edit,
profession = entryp.profession or get_entry(entry.profession2[1], or entry.profession2'profession') or ''nil,
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