Module:Government

From NPOWiki
Revision as of 09:34, 19 September 2020 by Bobogoobo (talk | contribs) (create)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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

local list = mw.loadData('Module:Government/list')
local p = {}

--keys must be lowercase with spaces removed, all input will be converted as such
local shortcuts = {
	admin = 'Administrator',
	io = 'Imperial Officer',
	mod = 'Moderator',
}

local function strip(s)
	--trim, lowercase, and remove non-alphanumeric characters - same as in /list
	return mw.text.trim(mw.ustring.gsub(mw.ustring.lower(s or ''), '%W', ''))
end

local function link(name, game)
	if game == 'Community' then
		return '[' .. '[' .. name .. ']]'
	else
		return mw.getCurrentFrame():expandTemplate({ title='gamepage', args={ name, game=game } })
	end
end

function p.main(frame)
	return p.call(frame:getParent().args)
end

function p.call(args)
	--separator between officeholders in /list
	local sep = ', '
	local game = args[1]
	local position = args[2]
	local bullet = strip(args.bull)
	local text = ''
	local incumbent
	
	if not game or not position then
		return '<span class="error">game and position must be specified</span>'
	end
	if not list[strip(game)] then
		return '<span class="error">invalid government category: ' .. game .. '</span>'
	end
	if shortcuts[strip(position)] then
		position = shortcuts[strip(position)]
	end
	incumbent = list[strip(game)][strip(position)]
	if not incumbent then
		return '<span class="error">invalid government position: ' .. position .. '</span>'
	elseif incumbent == '' then
		return "''vacant''"
	end
	if bullet == 'yes' then bullet = true elseif bullet == 'no' then bullet = false else bullet = nil end
	
	if not mw.ustring.find(incumbent, sep, 1, true) then
		--add bullet only if specified on
		if bullet then text = text .. '*' end
		text = text .. link(incumbent, game)
	else
		--add bullet if not specified off
		if bullet ~= false then bullet = true end
		for holder in mw.text.gsplit(incumbent, sep, true) do
			if bullet then text = text .. '*' end
			text = text .. link(holder, game) .. '\n'
		end
		if not bullet then
			text = mw.ustring.gsub(mw.text.trim(text), '\n', ', ')
		end
	end
	
	return mw.text.trim(text)
end

return p