Module:Room features: Difference between revisions

No edit summary
(Change fallback image to a questionmark, link image to the target page)
 
(12 intermediate revisions by 4 users not shown)
Line 6: Line 6:
end
end


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


local header_text_override = {
function base_query(location, category)
['Non-player characters'] = 'Personalities'
return {
}
'[[Has subobject::<q>[[Located in::' .. location .. ']]</q>]]',

'category=' .. category,
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=name',
'?Image#-',
'?Image#-=image',
'?Infobox=infobox'
}
}
return ret
end
end


function p._main(args)
function p._main(args)
local frame = mw.getCurrentFrame()
local frame = mw.getCurrentFrame()
local ret = ''
local ret = {}
local location = args[1] or mw.title.getCurrentTitle()
local location = args[1] or mw.title.getCurrentTitle().fullText

local query = mw.smw.ask(base_query(location))
for _,cat in ipairs(categories) do
if query ~= nil then
ret = ret .. '===' .. cat .. '===\n'
local results_by_type = {}
local query = mw.smw.ask(base_query(location, cat))
for i,v in pairs(infobox_cat_map) do
results_by_type[v] = {}
local gallery = '<gallery>\n'
end
for i,v in ipairs(query or {}) do
for i,v in ipairs(query) do
gallery = gallery .. (v.Image or 'File:Section anchor light.svg') .. '|' .. '[[' .. v[1] .. '|' .. v.Name .. ']]\n'
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
table.insert(ret, tostring(mw.html.create('h3'):wikitext(header_text_override[cat] or cat)))

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

table.insert(ret, tostring(frame:extensionTag{ name = 'gallery', content = table.concat(gallery_lines, '\n'), args = {} }))
end
end
end
gallery = gallery .. '</gallery>\n'
ret = ret .. frame:preprocess(gallery)
end
end
return table.concat(ret, '')
end
end



Latest revision as of 03:18, 22 November 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.

local p = {}

function p.main(frame)
	local args = frame:getParent().args
	return p._main(args)
end

local infobox_cat_map = {
	['Monster'] = 'Monsters',
	['NPC'] = 'Non-player characters',
	['Scenery'] = 'Scenery',
	['Skill_node'] = 'Skill 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(args)
	local frame = mw.getCurrentFrame()
	local ret = {}
	local location = args[1] or mw.title.getCurrentTitle().fullText

	local query = mw.smw.ask(base_query(location))
	if query ~= nil then
		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 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
				table.insert(ret, tostring(mw.html.create('h3'):wikitext(header_text_override[cat] or cat)))

				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

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

return p