Module:Government: Difference between revisions

From NPOWiki
Jump to navigation Jump to search
call abbrgame to allow using shortcuts/lowercase for game names
oh, right
Line 23: Line 23:
local dutiesEnd = mw.ustring.find(name, dutiesClose, 1, true)
local dutiesEnd = mw.ustring.find(name, dutiesClose, 1, true)
local text
local text
local frame = mw.getCurrentFrame()
if dutiesStart and dutiesEnd and dutiesStart < dutiesEnd then
if dutiesStart and dutiesEnd and dutiesStart < dutiesEnd then
Line 34: Line 33:
end
end
if mw.ustring.lower(game) == 'community' then
if game == 'Community' then
text = '[' .. '[' .. person .. ']]'
text = '[' .. '[' .. person .. ']]'
else
else
game = frame:expandTemplate({ title='abbrgame', args={ game, 'full' } })
text = mw.getCurrentFrame():expandTemplate({ title='gamepage', args={ person, game=game } })
text = frame:expandTemplate({ title='gamepage', args={ person, game=game } })
end
end
if showDuties and duties ~= '' then
if showDuties and duties ~= '' then
Line 63: Line 61:
if not game or not position then
if not game or not position then
return '<span class="error">game and position must be specified</span>'
return '<span class="error">game and position must be specified</span>'
end
if strip(game) == 'community' then
game = 'Community'
else
game = mw.getCurrentFrame():expandTemplate({ title='abbrgame', args={ game, 'full' } })
end
end
if not list[strip(game)] then
if not list[strip(game)] then
return '<span class="error">invalid government category: ' .. game .. '</span>'
return '<span class="error">invalid government category: ' .. args[1] .. '</span>'
end
end
if shortcuts[strip(position)] then
if shortcuts[strip(position)] then
Line 72: Line 75:
incumbent = list[strip(game)][strip(position)]
incumbent = list[strip(game)][strip(position)]
if not incumbent then
if not incumbent then
return '<span class="error">invalid government position: ' .. position .. '</span>'
return '<span class="error">invalid government position: ' .. args[2] .. '</span>'
elseif incumbent == '' then
elseif incumbent == '' then
return "''vacant''"
return "''vacant''"

Revision as of 00:56, 7 October 2025

Documentation [edit]

This page is a stub - it only covers the very basics of its subject. More information should be added to make the page informative and useful. If no more information is available, the page should be considered for a merge, redirect, or deletion.

Details: documentation to be written

If you can correct the issue, please edit the page to do so, then remove this notice.
Please see Template:Gov for usage information. Use the template rather than invoking the module. Data for this module is imported from Module:Government/list.

The above documentation is transcluded from 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, showDuties)
	--delimiters for duty descriptions
	local dutiesOpen = '['
	local dutiesClose = ']'
	local person = ''
	local duties = ''
	local dutiesStart = mw.ustring.find(name, dutiesOpen, 1, true)
	local dutiesEnd = mw.ustring.find(name, dutiesClose, 1, true)
	local text
	
	if dutiesStart and dutiesEnd and dutiesStart < dutiesEnd then
		person = mw.text.trim(mw.ustring.sub(name, 1, dutiesStart - 1))
		duties = mw.text.trim(mw.ustring.sub(name, dutiesStart + 1, dutiesEnd - 1))
	elseif dutiesStart or dutiesEnd then
		return '<span class="error">duties parse error: ' .. name .. '</span>'
	else
		person = name
	end
	
	if game == 'Community' then
		text = '[' .. '[' .. person .. ']]'
	else
		text = mw.getCurrentFrame():expandTemplate({ title='gamepage', args={ person, game=game } })
	end
	if showDuties and duties ~= '' then
		text = text .. ' (' .. duties .. ')'
	end
	
	return text
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 desc = strip(args.desc)
	local text = ''
	local incumbent
	
	if not game or not position then
		return '<span class="error">game and position must be specified</span>'
	end
	if strip(game) == 'community' then
		game = 'Community'
	else
		game = mw.getCurrentFrame():expandTemplate({ title='abbrgame', args={ game, 'full' } })
	end
	if not list[strip(game)] then
		return '<span class="error">invalid government category: ' .. args[1] .. '</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: ' .. args[2] .. '</span>'
	elseif incumbent == '' then
		return "''vacant''"
	end
	if bullet == 'yes' then bullet = true elseif bullet == 'no' then bullet = false else bullet = nil end
	desc = desc ~= ''
	
	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, desc)
	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, desc) .. '\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