Module:Room features

From Brighter Shores Wiki
Revision as of 17:53, 14 December 2024 by Alsang (talk | contribs) (Infobox Variant was renamed to Infobox Variant Category, so this needed to be changed to notice them properly)
Jump to navigation Jump to search
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',
	['Shop'] = 'Shops',
	['Variant Category'] = 'Nodes', -- merge with nodes, since the only variants with locations should be 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