Module:MonsterVariantsTable: Difference between revisions
Jump to navigation
Jump to search
Content added Content deleted
Californ1a (talk | contribs) 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) |
||
local args = frame:getParent().args |
|||
return p._main(args[1] or args.variant or '') |
|||
end |
end |
||
function |
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( |
function p._main(variant) |
||
local |
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) |
|||
-- 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 |
end |
||
function p.insert_row(tbl, entry) |
function p.insert_row(tbl, entry) |
||
local edit = editbutton("'''?''' (edit)", entry.name) |
|||
tbl:tag('tr') |
|||
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() |
||
: |
:td() |
||
:wikitext(entry. |
: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') |
||
: |
:tr() |
||
:th{ 'Monster', attr = { colspan = 2 } }:done() |
|||
:tag('th') |
|||
: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