Module:MonsterVariantsTable: Difference between revisions

From Brighter Shores Wiki
Jump to navigation Jump to search
Content added Content deleted
mNo edit summary
(Remove border between image and name)
 
(6 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'
'?-Has subobject#- = subobject',
}
'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.subobject, 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 09:00, 4 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',
		'?-Has subobject#- = subobject',
		'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.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_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