Module:government: Difference between revisions

From Laenkea
Jump to navigation Jump to search
mNo edit summary
(Added auto decatting of accusative with verbs)
 
(34 intermediate revisions by the same user not shown)
Line 2: Line 2:
local getArgs = require('Module:Arguments').getArgs
local getArgs = require('Module:Arguments').getArgs


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


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


function export.generate(frame)
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.show(frame)
local args = getArgs(frame)
local args = getArgs(frame)
local label = ""
local language, pos
local colour = ""
if mw.ustring.find(args[1], "^[a-z]+%s+[a-z]+$") then
language, pos = mw.ustring.match(args[1], "^([a-z]+)%s+([a-z]+)$")
language = m_languages.find_by_code(language)
pos = ( language ~= nil and (data["pos aliases"][pos] or pos) ) or nil
else
language = m_languages.find_by_code(args[1])
pos = data["pos aliases"][args["pos"]] or args["pos"]
end
if (language and args[2] == nil) or args[1] == nil then error("Entry parameter is missing") end
if language == nil and pos then error("The |pos parameter requires the language code to be specified in the first parameter") end
local show = "["
if not args[1] then
local function append(text)
error("First argument required")
show = show .. text
end
end
if data[args[1]] then
local i = 2
label = data[args[1]].label
colour = args[2] or data[args[1]].colour
if language == nil then i = 1 end
else
label = args[1]
while args[i] do
colour = args[2] or nil
if #show > 1 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 == "+" and not with_needed 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)
form = mw.ustring.gsub(form, "^%*", "")
if mw.ustring.sub(form, 1, 1) == "_" then
return "''" .. mw.ustring.sub(form, 2) .. "''"
else
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
end
local temp_main = ""
local function temp_append(text)
temp_main = temp_main .. text
end
local form, colour
if mw.ustring.find(temp, "^%([^%)]+%)%:") then -- for postpositions
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
if mw.ustring.find(temp, "^%:[^%(%<%[%+%/%:]+") then
if language == nil then error("A language code must be specified in the first parameter for the link function to work") end
temp_append("'''")
while mw.ustring.find(temp, "^%:[^%(%<%[%+%/%:]+") do
local link = mw.ustring.match(temp, "^%:([^%(%<%[%+%/%:]+)")
local spacing = mw.ustring.match(link, "%s+$") or ""
link = mw.ustring.gsub(link, "%s+$", "")
temp_append(m_links.full_link{language = language, term = link} .. spacing)
remove_temp("^%:[^%(%<%[%+%/%:]+")
end
temp_append("'''")
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 language and pos and data[form] then
if not (data[form].label == "accusative" and pos == "verb") then
temp_append("[[Category:" .. language.name .. " " .. pluralize(pos) .. " governing the " .. data[form].label .. "]]")
end
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 .. t .. qq)
end
end
i = i + 1
end
end
if colour then
append("]")
return "[<span style=\"background-color: #" .. colour .. ";\">+" .. label .. "</span>]"
else
return show
return "[+" .. label .. "]"
end
end
end


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

Latest revision as of 12:58, 6 August 2024

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 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.show(frame)
	local args = getArgs(frame)
	local language, pos
	if mw.ustring.find(args[1], "^[a-z]+%s+[a-z]+$") then
		language, pos = mw.ustring.match(args[1], "^([a-z]+)%s+([a-z]+)$")
		language = m_languages.find_by_code(language)
		pos = ( language ~= nil and (data["pos aliases"][pos] or pos) ) or nil
	else
		language = m_languages.find_by_code(args[1])
		pos = data["pos aliases"][args["pos"]] or args["pos"]
	end
	
	if (language and args[2] == nil) or args[1] == nil then error("Entry parameter is missing") end
	if language == nil and pos then error("The |pos parameter requires the language code to be specified in the first parameter") end
	
	local show = "["
	
	local function append(text)
		show = show .. text	
	end
	
	local i = 2
	
	if language == nil then i = 1 end
	
	while args[i] do
		if #show > 1 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 == "+" and not with_needed 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)
					form = mw.ustring.gsub(form, "^%*", "")
					if mw.ustring.sub(form, 1, 1) == "_" then
						return "''" .. mw.ustring.sub(form, 2) .. "''"
					else
						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
				end
				local temp_main = ""
				local function temp_append(text)
					temp_main = temp_main .. text
				end
				local form, colour
				if mw.ustring.find(temp, "^%([^%)]+%)%:") then -- for postpositions
					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
				if mw.ustring.find(temp, "^%:[^%(%<%[%+%/%:]+") then
					if language == nil then error("A language code must be specified in the first parameter for the link function to work") end
					temp_append("'''")
					while mw.ustring.find(temp, "^%:[^%(%<%[%+%/%:]+") do
						local link = mw.ustring.match(temp, "^%:([^%(%<%[%+%/%:]+)")
						local spacing = mw.ustring.match(link, "%s+$") or ""
						link = mw.ustring.gsub(link, "%s+$", "")
						temp_append(m_links.full_link{language = language, term = link} .. spacing)
						remove_temp("^%:[^%(%<%[%+%/%:]+")
					end
					temp_append("'''")
					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 language and pos and data[form] then
						if not (data[form].label == "accusative" and pos == "verb") then
							temp_append("[[Category:" .. language.name .. " " .. pluralize(pos) .. " governing the " .. data[form].label .. "]]")
						end
					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 .. t .. qq)
			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"}})
]]