Module:siwa-noun/data

From Linguifex
< Module:siwa-noun
Revision as of 19:56, 24 July 2021 by Sware (talk | contribs)
Jump to navigation Jump to search


local data = {}

local sub = mw.ustring.sub
local match = mw.ustring.match
local v = "[aeiouyůõảẻỉỏủỷę]"

local lenition_patterns = {
	{"(.)[vųbhḥg](.)", "%1%2"}, {"bb", "b"}, {"dd", "d"}, {"gg", "g"}, {"ɟ", "į"}, {"mm", "m"}, {"ll", "l"}, {"nn", "n"},
	{"rr", "r"}, {"bġ", "p"}, {"pr", "p"}, {"dġ", "t"}, {"tr", "t"}, {"ḍb", "p"}, {"ð", "hh"},
	{"ḍg", "k"}, {"bm", "m"}, {"dn", "n"}, {"kn", "ng"}, {"([lr])pp", "%1p"}, {"([lr])tt", "%1t"}, {"([lrms])kk", "%1k"},
	{"k([lvs])", "g%1"}, {"ps", "bs"},  {"d[aou]", "l"}, {"ġ[aou]", "vv"}, {"[dġ][eůy]", ""}, {"[rġ]i", "ṡi"},
	{"di", ""}, {"ɲi", "ɟi"}, {"ħį", "ṡ"}, {"[ou]ų", "ů"}, {"ɬ", "l"},
}

local function lenition(word)
	for _, pat in ipairs(lenition_patterns) do
		local lenited = mw.ustring.gsub(word, pat[1], pat[2], 1)
	end
	
	return lenited or word
end

data["a"] = {
	params = {
		[1] = {},
	},
}
setmetatable(data["a"], {__call = function(self, args, data)
	local stem = data.head
	local s2, s3 = sub(lenition(stem), 1, -3), sub(lenition(stem), 1, -4)
	table.insert(data.categories, "Siwa inanimate nouns")
	table.insert(data.categories, "Siwa a-declension nouns")
	
	data.forms["u"] = {stem}
	if stem:match(v.."mm.$") then
		data.forms["m"] = {s3 .. (data.q == "s" and "mġa" or data.q == "l" and "mka" or "kka")}
	elseif stem:match(v.."nn.$") then
		data.forms["m"] = {s3 .. (data.q == "s" and "nka" or "kka")}
	elseif stem:match(v.."vv.$") then
		data.forms["m"] = {lenition(stem)}
	elseif stem:match(v.."[lrs]k.$") then
		data.forms["m"] = {s2 .. "kka"}
	elseif stem:match(v.."m.$") then
		data.forms["m"] = {s2 .. (data.q == "s" and "mġa" or data.q == "l" and "mka" or "kka")}
	elseif stem:match(v.."n.$") then
		data.forms["m"] = {s2 .. (data.q == "s" and "nka" or "kka")}
	elseif stem:match(v.."[pb].$") then
		data.forms["m"] = {s2 .. (data.q == "s" and "pra" or "ḍga")}
	elseif stem:match(v.."t.$") then
		data.forms["m"] = {s2 .. (data.q == "s" and "tra" or "rka")}
	elseif stem:match(v.."r.$") then
		data.forms["m"] = {s3 .. "hka"}
	else
		data.forms["m"] = {stem .. "ka"}
	end
end
})





return data