Module:Infobox Spell

From RuneScape: Dragonwilds Wiki
Jump to navigation Jump to search
Module documentation
This documentation is transcluded from Module:Infobox Spell/doc. [edit] [history] [purge]
This module does not have any documentation. Please consider adding documentation at Module:Infobox Spell/doc. [edit]
Module:Infobox Spell's function main is invoked by Template:Infobox Spell.
Module:Infobox Spell requires Module:Arguments.
Module:Infobox Spell requires Module:Clean image.
Module:Infobox Spell requires Module:InfoboxBuilder.
Module:Infobox Spell requires Module:Paramtest.

local getArgs = require('Module:Arguments').getArgs
local InfoboxBuilder = require('Module:InfoboxBuilder')
local cleanImage = require('Module:Clean image').clean
local edit = require('Module:Paramtest').editbtn

local p = {}

function on_main()
	return mw.title.getCurrentTitle().namespace == 0
end

function unlink(value)
	if value ~= nil then
		return value:gsub('%[',''):gsub('%]','')
	end
end

-- linkifies and removes double square brackets
function link(value)
	if value ~= nil and value ~= "" then
		return string.format("[[%s]]", unlink(value))
	end
end

function table_keys(t)
	local ret = {}

	for k, _ in pairs(t) do
		table.insert(ret, k)
	end
	
	return ret
end

function parse_runes(runes_string)
	local ret = {}

	for count, rune in runes_string:gmatch("<sup>(%d+)</sup><span>%[%[File:(.-)%.png") do
	    local key = rune:gsub("^%s*(.-)%s*$", "%1") -- lowercase and trim
    	ret[key] = tonumber(count)
	end
	
	return ret
end

function p.main(frame)
	return p._main(getArgs(frame))
end

function p._main(args)
	local page = mw.title.getCurrentTitle()
	local ib = InfoboxBuilder()

	args.name = args.name or page.fullText
	
	local ret = tostring(ib
		:title(args.name)
		:image({image=cleanImage{file = args.image, width = args.imagesize or 300}})
		:row({label="Released", value=ib:releaseDate(args.release, args.update, page.fullText)})
		:row({label="[[Skill]]", value=link(args.skill) or edit(page.fullText)})
		:row({label="Level", value=args.level or edit(page.fullText)})
		:row({label="[[Runes]]", value=args.runes or edit(page.fullText)})
		:row({label="Cooldown", value=args.cooldown or edit(page.fullText)})
		:row({label="Description", value=args.description})
	:done())..ib:addCats({"Spells"})
	if page.namespace == 10 and page.text:lower():find("infobox") and page.subpageText == page.text then
		ret = ret..ib:addTemplateCats({"Infoboxes"})
	end
	
	local spell_object = {
		name = args.name,
		image = cleanImage{ file = args.image, width = 32 },
		image_raw = args.image,
		description = args.description,
		runes = args.runes and parse_runes(args.runes),
		cooldown = args.cooldown,
		skill = unlink(args.skill),
		level = args.level,
	}
	
	if on_main() then
		bucket('infobox_spell').put({
			uses_rune = table_keys(spell_object.runes or {}),
			json = mw.text.jsonEncode(spell_object)
		})
	end
	
	return ret
end

return p