Module:snon-mut

From Linguifex
Jump to navigation Jump to search



local gsub = mw.ustring.gsub
local match = mw.ustring.match
local gmatch = mw.ustring.gmatch
local sub = mw.ustring.sub
local upper = mw.ustring.upper

local m_l = require("Module:links")

local lang = require("Module:languages").getByCode("snon")
local PAGENAME = mw.loadData("Module:headword/data").pagename

local export = {}

function export.mutations(ret, args)
	local lower_radical = mw.ustring.lower(ret.radical or args.word)
	local first_letter = match(lower_radical, "^%W*(%w)")
	local is_proper = ret.radical ~= lower_radical
	
	local vowels = "([aeiouàèìòù])"
	local apostrophe
	
	if args.len then
		ret.lenition = args.len
	elseif match(first_letter, "[bcdfgmptsnlrv]") then
		ret.lenition = ret.radical:gsub("^(.)", "%1h")
	elseif match(first_letter, vowels) then -- h-prothesis
		ret.lenition = "h'" .. lower_radical
		apostrophe = true
	elseif match(lower_radical, "^ghi" .. vowels) then
		ret.lenition = gsub(lower_radical, "^ghi" .. vowels, "chi%1")
	else
		ret.lenition = "-"
	end
	
	local eclipsis_prefixes = {
		["b"] = "m", ["c"] = "g", ["d"] = "n", ["f"] = "v", ["g"] = "n",
		["p"] = "b", ["t"] = "d", ["h"] = "g", ["s"] = "z", ["v"] = "b",
	}
	
	if args.ecl then
		ret.eclipsis = args.ecl
	elseif eclipsis_prefixes[first_letter] then
		ret.eclipsis = eclipsis_prefixes[first_letter] .. sub(lower_radical, 2, -1)
	elseif match(first_letter, vowels) then
		ret.eclipsis = "n'" .. lower_radical
		apostrophe = true
	elseif match(lower_radical, "^ghi" .. vowels) then
		ret.eclipsis = gsub(lower_radical, "^ghi" .. vowels, "ni%1")
	else
		ret.eclipsis = "-"
	end
	
	if is_proper then
		if apostrophe then
			ret.eclipsis = "n" .. ret.eclipsis:gsub("^n'(%w)", upper)
			ret.lenition = "h" .. ret.lenition:gsub("^h'(%w)", upper)
		else
			ret.eclipsis = ret.eclipsis:gsub("^(%w)", upper)
			ret.lenition = ret.lenition:gsub("^(%w)", upper)
		end
	end
	
	return ret
end

function export.mutation_table(frame)
	
	local params = {
		[1] = {default = PAGENAME, template_default = "bèdh"},
		["ecl"] = {},
		["len"] = {},
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local ret = {radical = args[1]}
	ret = export.mutations(ret, args)
	
	local links = {}
	for k, v in pairs(ret) do
		if v == "-" then
			links[k] = "''not applicable''"
		else
			links[k] = m_l.full_link{lang = lang, term = v}
		end
	end
	
	local table_args = {
		palette = "blue",
		notes = "Certain mutated forms of some words can never occur in standard Modern Scots Norse.<br>All possible mutated forms are displayed for convenience.",
		title = "[[Scots Norse#Mutation|Mutated forms]] of " .. ret.radical,
		class = "wide",
	}
	
	local contents = [[
	|-
	! radical !! lenition !! eclipsis
	|-
	| {radical} || {lenition} || {eclipsis}
	]]
	contents = require('Module:string utilities').format(contents, links)
	
	return require("Module:inflection table").inflection_table(frame, table_args, contents)
end

return export