Module:Room features: Difference between revisions

From Brighter Shores Wiki
Jump to navigation Jump to search
Content added Content deleted
(Add text and category when there are no features)
(Make sure empty text shows for pages with results but where none are shown)
Line 3: Line 3:
function p.main(frame)
function p.main(frame)
local args = frame:getParent().args
local args = frame:getParent().args
return p._main(args)
return p._main(args[1] or mw.title.getCurrentTitle().fullText, frame)
end
end


Line 33: Line 33:
end
end


function p._main(args)
function p._main(location, frame)
local frame = mw.getCurrentFrame()
frame = frame or mw.getCurrentFrame()
local ret = mw.html.create()
local ret = mw.html.create()
local location = args[1] or mw.title.getCurrentTitle().fullText


local query = mw.smw.ask(base_query(location))
local query = mw.smw.ask(base_query(location))
local empty = true
if query ~= nil then
if query ~= nil then
mw.logObject(query)
local results_by_type = {}
local results_by_type = {}
for i,v in pairs(infobox_cat_map) do
for i,v in pairs(infobox_cat_map) do
results_by_type[v] = {}
results_by_type[v] = {}
end
end
-- FIXME: Variant category pages (like [[Sparring Guard]]) do not
-- have an infobox so are not shown
for i,v in ipairs(query) do
for i,v in ipairs(query) do
local key = infobox_cat_map[v.infobox_sub or v.infobox]
local key = infobox_cat_map[v.infobox_sub or v.infobox]
Line 53: Line 56:
for cat,results in pairs(results_by_type) do
for cat,results in pairs(results_by_type) do
if #results > 0 then
if #results > 0 then
empty = false
ret
ret
:tag('h3'):wikitext(header_text_override[cat] or cat):done()
:tag('h3'):wikitext(header_text_override[cat] or cat):done()
Line 76: Line 80:
end
end
end
end
end
else

if empty then
ret:tag('dd')
ret:tag('dd')
:wikitext("''No room features found''[[Category:Empty room features]] ")
:wikitext("''No room features found" .. require('Module:Purge')._purge{ anchor = 'roomfeatures_purge', text = '(refresh)', tag = 'sup' } .. "''[[Category:Empty room features]]")
:wikitext(require('Module:Purge')._purge{ anchor = 'roomfeatures_purge', text = '(refresh)' })
:done()
:done()
end
end

Revision as of 18:18, 12 December 2024

Module documentation
This documentation is transcluded from Module:Room features/doc. [edit] [history] [purge]
This module does not have any documentation. Please consider adding documentation at Module:Room features/doc. [edit]
Module:Room features's function main is invoked by Template:Room features.
Module:Room features requires Module:Purge.

local p = {}

function p.main(frame)
	local args = frame:getParent().args
	return p._main(args[1] or mw.title.getCurrentTitle().fullText, frame)
end

local infobox_cat_map = {
	['Monster'] = 'Monsters',
	['NPC'] = 'Non-player characters',
	['Scenery'] = 'Scenery',
	['Skill_node'] = 'Nodes'
}

local header_text_override = {
	['Non-player characters'] = 'Personalities'
}

function base_query(location)
	local ret = {
		'[[Located in::' .. location .. ']]',
		'?Location object#-',
		'?Location object.Name=name_sub',
		'?Location object.Image#-=image_sub',
		'?Location object.Infobox=infobox_sub',
		'?Location quantity',
		'?#-',
		'?Name=name',
		'?Image#-=image',
		'?Infobox=infobox'
	}
	return ret
end

function p._main(location, frame)
	frame = frame or mw.getCurrentFrame()
	local ret = mw.html.create()

	local query = mw.smw.ask(base_query(location))
	local empty = true
	if query ~= nil then
		mw.logObject(query)
		local results_by_type = {}
		for i,v in pairs(infobox_cat_map) do
			results_by_type[v] = {}
		end
		-- FIXME: Variant category pages (like [[Sparring Guard]]) do not
		-- have an infobox so are not shown
		for i,v in ipairs(query) do
			local key = infobox_cat_map[v.infobox_sub or v.infobox]
			-- Can be nil - See East Beach for example
			if key ~= nil then
				table.insert(results_by_type[key], v)
			end
		end
		for cat,results in pairs(results_by_type) do
			if #results > 0 then
				empty = false
				ret
					:tag('h3'):wikitext(header_text_override[cat] or cat):done()

				local gallery_lines = {}
				for i,v in ipairs(results) do
					local image = v.image_sub or v.image or 'File:Unknown episode infobox icon.png'
					local quantity = ''
					if v['Location quantity'] and (v['Location quantity'] ~= 'Unknown' and v['Location quantity'] ~= '1') then
						quantity = string.format('%s × ', v['Location quantity'])
					end
					local obj_name = v['Location object'] or v[1]
					local version_name = ''
					local version = string.match(obj_name, "[^#]+%#([^#]+)")
					if version then
						version_name = string.format(" <sub>''%s''</sub>", version)
					end
					local display_name = v.name_sub or v.name
					table.insert(gallery_lines, string.format('%s|link=%s|%s[[%s|%s%s]]', image, obj_name, quantity, obj_name, display_name, version_name))
				end

				ret:node(frame:extensionTag{ name = 'gallery', content = table.concat(gallery_lines, '\n'), args = {} })
			end
		end
	end

	if empty then
		ret:tag('dd')
			:wikitext("''No room features found" .. require('Module:Purge')._purge{ anchor = 'roomfeatures_purge', text = '(refresh)', tag = 'sup' } .. "''[[Category:Empty room features]]")
		:done()
	end

	return ret
end

return p