Module:Room features: Difference between revisions

From Brighter Shores Wiki
Jump to navigation Jump to search
Content added Content deleted
No edit summary
(variant categories will now be sorted by their category type)
 
Line 7: Line 7:


local infobox_cat_map = {
local infobox_cat_map = {
['Monster'] = 'Monsters',
['monster'] = 'Monsters',
['NPC'] = 'Non-player characters',
['npc'] = 'Non-player characters',
['Scenery'] = 'Scenery',
['scenery'] = 'Scenery',
['Skill_node'] = 'Nodes',
['skill_node'] = 'Nodes',
['Venture'] = 'Ventures',
['venture'] = 'Ventures',
['Shop'] = 'Shops',
['shop'] = 'Shops',
['variant_category'] = 'Variants',
['Variant_Category'] = 'Nodes', -- merge with nodes, since the only variants with locations should be nodes
}
}


Line 27: Line 27:
'?Location object.Image#-=image_sub',
'?Location object.Image#-=image_sub',
'?Location object.Infobox=infobox_sub',
'?Location object.Infobox=infobox_sub',
'?Location object.Variant type=vartype_sub',
'?Location quantity',
'?Location quantity',
'?#-',
'?#-',
Line 48: Line 49:
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 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
-- Can be nil - See East Beach for example
if key ~= nil then
if key ~= nil then

Latest revision as of 21:46, 28 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',
	['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