Module:government: Difference between revisions

From Laenkea
Jump to navigation Jump to search
(Created page with "local export = {} local getArgs = require('Module:Arguments').getArgs -- COLOUR DATA local data = { -- base cases ["nominative"] = {["label"] = "nominative", ["colour"] = "ffb3ba"}, ["accusative"] = {["label"] = "accusative", ["colour"] = "ffdfba"}, ["dative"] = {["label"] = "dative", ["colour"] = "ffffba"}, ["genitive"] = {["label"] = "genitive", ["colour"] = "baffc9"}, ["locative"] = {["label"] = "locative", ["colour"] = "bae1ff"}, ["instrumental"] = {["label"...")
 
(Added auto decatting of accusative with verbs)
 
(36 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 = {
local data = mw.loadData("Module:government/data")
-- base cases
["nominative"] = {["label"] = "nominative", ["colour"] = "ffb3ba"},
["accusative"] = {["label"] = "accusative", ["colour"] = "ffdfba"},
["dative"] = {["label"] = "dative", ["colour"] = "ffffba"},
["genitive"] = {["label"] = "genitive", ["colour"] = "baffc9"},
["locative"] = {["label"] = "locative", ["colour"] = "bae1ff"},
["instrumental"] = {["label"] = "instrumental", ["colour"] = "f1b3ff"},
-- laefevian cases
["illative"] = {["label"] = "illative", ["colour"] = data["locative"].colour},
}


-- ALIASES
local function pluralize(word)
data["nom"] = data["nominative"]
local ending = mw.ustring.sub(word, -1)
data["acc"] = data["accusative"]
if ending == "h" and mw.ustring.sub(word, -2, -1) == "s" then ending = "sh" end
data["dat"] = data["dative"]
if ending == "s" or ending == "z" or ending == "x" or ending == "sh" then
data["gen"] = data["genitive"]
return word .. "es"
data["loc"] = data["locative"]
end
data["ins"] = data["instrumental"]
return word .. "s"
data["inst"] = data["instrumental"]
end
data["ill"] = data["illative"]


function export.generate(frame)
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 56: 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"}})
]]