Module:government

Revision as of 22:42, 3 August 2024 by TheNightAvl (talk | contribs)

See {{with}}. To add to the recognised argument list, edit Module:government/data.


local export = {}
local getArgs = require('Module:Arguments').getArgs

local m_languages = require('Module:languages')
local m_links = require('Module:links')

-- COLOUR DATA
local data = mw.loadData("Module:government/data")
local l_data = mw.loadData("Module:languages/data")

local function pluralize(word)
	local ending = mw.ustring.sub(word, -1)
	if ending == "h" and mw.ustring.sub(word, -2, -1) == "s" then ending = "sh" end
	if ending == "s" or ending == "z" or ending == "x" or ending == "sh" then
		return word .. "es"
	end
	return word .. "s"
end

function export.generate(frame)
	local args = getArgs(frame)
	local label = ""
	local colour = ""
	
	if not args[1] then
		error("First argument required")	
	end
	
	if data[args[1]] then
		label = data[args[1]].label
		colour = args[2] or data[args[1]].colour
	else
		label = args[1]
		colour = args[2] or nil
	end
	
	local to_Return = "["
	
	if args["prep"] then
		to_Return = to_Return .. "+ <i>[[" .. args["prep"] .. "#" .. l_data[args["l"]].name .. "|" .. args["prep"] .. "]]</i> "	
	end
	
	if colour then
		to_Return = to_Return .. "<span style=\"background-color: #" .. colour .. ";\">+" .. label .. "</span>"
	else
		to_Return = to_Return .. "+" .. label
	end
	
	if args["t"] then
		to_Return = to_Return .. " = " .. args["t"]	
	end
	
	to_Return = to_Return .. "]"
	
	if args["l"] and args["pos"] then
		to_Return = to_Return .. "[[Category:" .. l_data[args["l"]].name .. " " .. pluralize(args["pos"]) .. " governing the " .. label .. "]]"
	end
	
	return to_Return
end

function export.show(frame)
	local args = getArgs(frame)
	local language = m_languages.get_by_code(args[1])
	if args[2] == nil then error("Second parameter is missing") end
	local show = "["
	
	local function append(text)
		show = show .. text	
	end
	
	local i = 2
	
	while args[i] do
		if i > 2 then
			append("; ''or'' ")
		end
		
		local temp = args[i]
		local with_needed = true
		
		if mw.ustring.sub(temp, 1, 1) == "&" then
			temp = mw.ustring.sub(temp, 2)
		else
			append("''with'' ")
			with_needed = false
		end
		
		while #temp > 0 do
			mw.log(show, temp)
			local function remove_temp(regex)
				temp = mw.ustring.gsub(temp, regex, "")
			end
			local conjunction = mw.ustring.match(temp, "^%s*([%/%+])%s*")
			if conjunction then
				if conjunction == "/" then
					append(" ''or'' ")
				elseif conjunction == "+" then
					append(" ''and'' ")
				end
				remove_temp("^%s*[%/%+]%s*")
				if mw.ustring.sub(temp, 1, 1) == "&" then
					temp = mw.ustring.sub(temp, 2)
				elseif with_needed then
					append("''with'' ")
					with_needed = false
				end
			else
				local function glossary(form, colour)
					if data[form] then
						form = data[form].label
						if colour == nil then colour = data[form].colour end
					end
					local to_Return = "''[[Appendix:Glossary#" .. form .. "|" .. form .. "]]''"
					if colour then
						to_Return = "<span style=\"background-color: #" .. colour .. ";\">" .. to_Return .. "</span>"
					end
					return to_Return
				end
				local temp_main = ""
				local function temp_append(text)
					temp_main = temp_main .. text
				end
				local form, colour
				if mw.ustring.find(temp, "^%:[^%(%<%[%+%/]+") then
					local link = mw.ustring.match(temp, "^%:([^%(%<%[%+%/]+)")
					link = mw.ustring.gsub(link, "%s+$", "")
					temp_append("'''" .. m_links.full_link{language = language, term = link} .. "'''")
					remove_temp("^%:[^%(%<%[%+%/]+")
					if mw.ustring.find(temp, "^%([^%)]+%)") then
						form = mw.ustring.match(temp, "^%(([^%)]+)%)")
						remove_temp("^%([^%)]+%)")
						if mw.ustring.find(temp, "^%[[^%]]+%]") then
							colour = mw.ustring.match(temp, "^%[([^%]]+)%]")
							remove_temp("^%[[^%]]+%]")
						end
						temp_append(" (+ " .. glossary(form, colour) .. ")")
					end
				elseif mw.ustring.match(temp, "^[^%(%<%[%+%/]+") then
					form = mw.ustring.match(temp, "^([^%(%<%[%+%/]+)")
					form = mw.ustring.gsub(form, "%s+$", "")
					remove_temp("^([^%(%<%[%+%/]+)")
					if mw.ustring.find(temp, "^%[[^%]]+%]") then
						colour = mw.ustring.match(temp, "^%[([^%]]+)%]")
						remove_temp("^%[[^%]]+%]")
					end
					temp_append(glossary(form, colour))
					if args["pos"] then
						if data[form] then form = data[form].label end
						temp_append("[[Category:" .. language.name .. " " .. pluralize(args["pos"]) .. " governing the " .. form .. "]]")
					end
				else
					error("Invalid parameter format")
				end
				local t, q, qq = "", "", ""
				while mw.ustring.find(temp, "^%<[^%>]+%>") do
					local content = mw.ustring.match(temp, "^%<([^%>]+)%>")
					if mw.ustring.sub(content, 1, 2) == "q:" then
						q = "(''" .. mw.ustring.sub(content, 3) .. "'') "
					elseif mw.ustring.sub(content, 1, 3) == "qq:" then
						qq = " (''" .. mw.ustring.sub(content, 4) .. "'')"
					elseif mw.ustring.sub(content, 1, 3) == "q*:" then
						show = "[(''" .. mw.ustring.sub(content, 4) .. "'') " .. mw.ustring.sub(show, 2)
					else
						t = " <small>‘".. content .."’</small>"
					end
					remove_temp("^%<[^%>]+%>")
				end
				append(q .. temp_main .. qq .. t)
			end
		end
	
		i = i + 1	
	end
	
	append("]")
	
	return show
end

return export

--[[
Debug console test string:
=p.generate(mw.getCurrentFrame():newChild{title="whatever",args={"accusative"}})
=p.show(mw.getCurrentFrame():newChild{title="whatever",args={"rad", "acc / :la(dat)", ["pos"] = "verb"}})
]]