Module:MonsterVariantsTable: Difference between revisions

From Brighter Shores Wiki
Jump to navigation Jump to search
Content added Content deleted
mNo edit summary
(look only for version type subobjects, not all subobjects, when filtering)
 
(6 intermediate revisions by 2 users not shown)
Line 1:
require('strict')
require('Module:Mw.html extension')
local editbutton = require('Module:Edit button')
local p = {}
 
function p.main(frame)
returnlocal args = p._main(frame:getParent().args)
return p._main(args[1] or args.variant or '')
end
 
local 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 ⟶ 18:
end
 
function p._main(argsvariant)
local variantresults = args[1] or argsmw.variant or ''smw.ask{
('[[Variant of::%s]]'):format(variant),
local query = {
'?Image#64px;x64px = img',
string.format('[[Variant of::%s]] [[Has query::+]] OR [[Has subobject::<q>[[Variant of::%s]]</q>]]', variant, variant),
'?Name = name',
'?Image#64px;x64px=img',
'?= page',
'?Has subobject.Image#64px;x64px=img2',
'?Unlock_level = unlock_lvl',
'?= page',
'?Unlock profession # = unlock_profession',
'?Unlock_level = unlock',
'?Profession_Level_A = combat',
'?Has subobject.Unlock_level = unlock2',
'?Profession A # = profession',
'?Profession_Level_A = combat',
'?Version default = default',
'?Has subobject.Profession_Level_A = combat2',
'?Variant name = variant',
'?Profession A #=profession',
'?Version anchor = version',
'?Has subobject.Profession A #=profession2'
'?-Version subobject#- = superobject',
}
'sort=Profession Level A',
 
'order=asc'
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.."''"
end
 
local sortedfiltered = p.sort_by_combatfilter_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
end
 
function p.filter_versions(data)
local filtered = {}
for _, entry in ipairs(data) do
if entry.default then
entry.page = ('[[%s|%s]]'):format(entry.superobject, 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.combat2 and a.combat2[1])unlock_lvl or math.huge
local combatB = b.combat or (b.combat2 and b.combat2[1])unlock_lvl 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')
tbl:tagtr('td')
:td{ entry.img, addClass = 'plinkt-image no-border' }:done()
:wikitext(entry.img)
:td{ entry.page, addClass = 'plinkt-link no-border' }:done()
:td()
:IF(entry.unlock_profession)
:wikitext(entry.unlock_lvl and formatProfessionLevel(entry.unlock_profession, entry.unlock_lvl) or edit)
:ELSE()
:addClass('table-na')
:wikitext('N/A')
:END()
:done()
:tag('td'()
:wikitext(entry.pagecombat and formatProfessionLevel(entry.profession, entry.combat) or edit)
: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
Line 76 ⟶ 93:
function p.create_table(results)
local out = mw.html.create('table')
:addClass('wikitable sortable align-right-3 align-right-4')
:tag('tr'()
:th{ 'Monster', attr = { colspan = 2 } }:done()
:tag('th')
:wikitextth('ImageUnlocked at'):done()
:th('Combat level'):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)
local built_entry = {
combat = entry.combat or entry.combat2[1] or entry.combat2 or '',
img = entry.img or entry.img2[1] or entry.img2 or '',
unlock = entry.unlock or entry.unlock2[1] or entry.unlock2 or '',
profession = entry.profession or entry.profession2[1] or entry.profession2 or '',
page = entry.page
}
out = p.insert_row(out, built_entry)
end
 
return out
end

Latest revision as of 13:31, 7 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.
Module:MonsterVariantsTable requires Module:Mw.html extension.
Module:MonsterVariantsTable requires strict.

require('strict')
require('Module:Mw.html extension')
local editbutton = require('Module:Edit button')
local p = {}

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

local function 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(variant)
	local results = mw.smw.ask{
		('[[Variant of::%s]]'):format(variant),
		'?Image#64px;x64px = img',
		'?Name = name',
		'?= page',
		'?Unlock_level = unlock_lvl',
		'?Unlock profession # = unlock_profession',
		'?Profession_Level_A = combat',
		'?Profession A # = profession',
		'?Version default = default',
		'?Variant name = variant',
		'?Version anchor = version',
		'?-Version subobject#- = superobject',
		'sort=Profession Level A',
		'order=asc'
	}
	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 p.create_table(sorted)
end

function p.filter_versions(data)
	local filtered = {}
	for _, entry in ipairs(data) do
		if entry.default then
			entry.page = ('[[%s|%s]]'):format(entry.superobject, 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_lvl or math.huge
		local combatB = b.combat or b.unlock_lvl 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:tr()
		:td{ entry.img, addClass = 'plinkt-image no-border' }:done()
		:td{ entry.page, addClass = 'plinkt-link no-border' }:done()
		:td()
			:IF(entry.unlock_profession)
				:wikitext(entry.unlock_lvl and formatProfessionLevel(entry.unlock_profession, entry.unlock_lvl) or edit)
			:ELSE()
				:addClass('table-na')
				:wikitext('N/A')
			:END()
		:done()
		:td()
			:wikitext(entry.combat and 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 align-right-3 align-right-4')
		:tr()
			:th{ 'Monster', attr = { colspan = 2 } }:done()
			:th('Unlocked at'):done()
			:th('Combat level'):done()
		:done()

	for _, entry in ipairs(results) do
		out = p.insert_row(out, entry)
	end

	return out
end

return p