Module:Room features

From Brighter Shores Wiki
Revision as of 21:46, 28 December 2024 by Alsang (talk | contribs) (variant categories will now be sorted by their category type)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
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',
	['venture'] = 'Ventures',
	['shop'] = 'Shops',
	['variant_category'] = 'Variants',
}

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 object.Variant type=vartype_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
		for i,v in ipairs(query) do
			local infobox_type = (v.infobox_sub=='Variant_Category' and v.vartype_sub) or v.infobox_sub or v.infobox or ''
			--convert to all lower case with underscores instead of spaces, for best possible matching
			infobox_type = string.lower(infobox_type)
			infobox_type = string.gsub(infobox_type,' ','_')
			local key = infobox_cat_map[infobox_type]
			-- 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