Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:Cost: Difference between revisions

From Domwiki
Use mw.html node for cost text
Parse cost amounts with string slicing
 
Line 50: Line 50:
local label = labelNames[kind] or kind
local label = labelNames[kind] or kind
return span(class .. ' ' .. class .. '--' .. kind, label, amount .. ' ' .. label)
return span(class .. ' ' .. class .. '--' .. kind, label, amount .. ' ' .. label)
end
local function isDigits(value)
return value ~= '' and value:match('^%d+$') ~= nil
end
local function splitLabelToken(token)
local delimiter = token:find(':', 1, true) or token:find('=', 1, true)
if delimiter then
local key = token:sub(1, delimiter - 1)
local value = token:sub(delimiter + 1)
if key:match('^[%a_]+$') and isDigits(value) then
return key, value
end
end
local key = token:match('^[%a_]+')
if key then
local value = token:sub(#key + 1)
if isDigits(value) then
return key, value
end
end
return nil, nil
end
end


Line 57: Line 82:
raw = mw.text.trim(raw:gsub(',', ' '))
raw = mw.text.trim(raw:gsub(',', ' '))
for token in raw:gmatch('%S+') do
for token in raw:gmatch('%S+') do
local path, amount = token:match('^([FAWESDNGBH])(%d+)$')
local path = token:sub(1, 1)
if path then
local amount = token:sub(2)
if pathNames[path] and isDigits(amount) then
table.insert(output, renderGem(path, amount, class, size))
table.insert(output, renderGem(path, amount, class, size))
else
else
local key, value = token:match('^([%a_]+):(%d+)$')
local key, value = splitLabelToken(token)
if not key then
key, value = token:match('^([%a_]+)=(%d+)$')
end
if not key then
key, value = token:match('^([%a_]+)(%d+)$')
end
if key then
if key then
table.insert(output, renderLabel(key, value, class))
table.insert(output, renderLabel(key, value, class))

Latest revision as of 22:12, 15 May 2026

Documentation for this module may be created at Module:Cost/doc

local p = {}

local pathNames = {
	F = 'Fire',
	A = 'Air',
	W = 'Water',
	E = 'Earth',
	S = 'Astral',
	D = 'Death',
	N = 'Nature',
	G = 'Glamour',
	B = 'Blood',
	H = 'Holy'
}

local labelNames = {
	fatigue = 'fatigue',
	gems = 'gems',
	gold = 'gold',
	res = 'resources',
	resources = 'resources',
	rec = 'recruitment points',
	recruit = 'recruitment points',
	cmd = 'commander points',
	commander = 'commander points'
}

local function span(class, title, contents)
	return tostring(mw.html.create('span')
		:addClass(class)
		:attr('title', title)
		:node(contents))
end

local function renderGem(path, amount, class, size)
	local name = pathNames[path] or path
	local file = string.format('[[File:Gem_%s.png|%s|link=|alt=%s gem]]', path, size, name)
	local root = mw.html.create('span')
		:addClass(class)
		:addClass(class .. '--gem')
		:attr('title', name .. ' gems')
		:wikitext(file)
	root:tag('span')
		:addClass(class .. '__amount')
		:node(amount)
	return tostring(root)
end

local function renderLabel(kind, amount, class)
	local label = labelNames[kind] or kind
	return span(class .. ' ' .. class .. '--' .. kind, label, amount .. ' ' .. label)
end

local function isDigits(value)
	return value ~= '' and value:match('^%d+$') ~= nil
end

local function splitLabelToken(token)
	local delimiter = token:find(':', 1, true) or token:find('=', 1, true)
	if delimiter then
		local key = token:sub(1, delimiter - 1)
		local value = token:sub(delimiter + 1)
		if key:match('^[%a_]+$') and isDigits(value) then
			return key, value
		end
	end

	local key = token:match('^[%a_]+')
	if key then
		local value = token:sub(#key + 1)
		if isDigits(value) then
			return key, value
		end
	end

	return nil, nil
end

local function renderRaw(raw, class, size)
	local output = {}

	raw = mw.text.trim(raw:gsub(',', ' '))
	for token in raw:gmatch('%S+') do
		local path = token:sub(1, 1)
		local amount = token:sub(2)
		if pathNames[path] and isDigits(amount) then
			table.insert(output, renderGem(path, amount, class, size))
		else
			local key, value = splitLabelToken(token)
			if key then
				table.insert(output, renderLabel(key, value, class))
			else
				table.insert(output, token)
			end
		end
	end

	return table.concat(output, ' ')
end

function p.render(frame)
	local raw = frame.args.raw or frame.args[1] or ''
	local class = frame.args.class or 'domwiki-cost'
	local size = frame.args.size or '18x18px'
	return renderRaw(raw, class, size)
end

function p.fromParent(frame)
	local field = frame.args[1] or 'cost'
	local parent = frame:getParent()
	local raw = parent and parent.args[field] or ''
	local class = frame.args.class or 'domwiki-cost'
	local size = frame.args.size or '18x18px'
	return renderRaw(raw, class, size)
end

function p.debugParent(frame)
	local field = frame.args[1] or 'cost'
	local parent = frame:getParent()
	return parent and parent.args[field] or ''
end

return p