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)
 
(7 intermediate revisions by 2 users not shown)
Line 1: Line 1:
require('strict')
require('Module:Mw.html extension')
local editbutton = require('Module:Edit button')
local p = {}
local p = {}


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


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


function p._main(args)
function p._main(variant)
local variant = args[1] or args.variant or ''
local results = mw.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'
}
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 results = mw.smw.ask(query)
local filtered = {}
for _, entry in ipairs(data) do
if results == nil or results[1] == nil then
if entry.default then
return 'No data found for table'
entry.page = ('[[%s|%s]]'):format(entry.superobject, entry.name)
table.insert(filtered, entry)
elseif entry.version == nil then
table.insert(filtered, entry)
end
end
end
return filtered
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
end


function p.sort_by_combat(data)
function p.sort_by_combat(data)
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_lvl or math.huge
local combatB = b.combat or (b.combat2 and b.combat2[1]) or math.huge
local combatB = b.combat or b.unlock_lvl or math.huge
-- Sort in ascending order
-- Sort in ascending order
return combatA < combatB
return combatA < combatB
end)
end)
return data
return data
end
end


function p.insert_row(tbl, entry)
function p.insert_row(tbl, entry)
local edit = editbutton("'''?''' (edit)", entry.name)
tbl:tag('tr')
:tag('td')
tbl:tr()
: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()
:done()
:tag('td')
:td()
:wikitext(entry.page)
:wikitext(entry.combat 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()
:done()
:done()

return tbl
return tbl
end
end
Line 76: Line 93:
function p.create_table(results)
function p.create_table(results)
local out = mw.html.create('table')
local out = mw.html.create('table')
:addClass('wikitable sortable')
:addClass('wikitable sortable align-right-3 align-right-4')
:tag('tr')
:tr()
:th{ 'Monster', attr = { colspan = 2 } }:done()
:tag('th')
:wikitext('Image')
:th('Unlocked at'):done()
:done()
:th('Combat level'):done()
:tag('th')
:wikitext('Monster')
:done()
:tag('th')
:wikitext('Unlocked at')
:done()
:tag('th')
:wikitext('Combat level')
:done()
:done()
:done()

for _,entry in ipairs(results) do
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
end

return out
return out
end
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