Module:ryn-mut: Difference between revisions

From Laenkea
Jump to navigation Jump to search
No edit summary
No edit summary
Line 59: Line 59:
local change = mutation_rules[data.initial][1]
local change = mutation_rules[data.initial][1]
if change then return change .. data.remainder end
if change then return change .. data.remainder end
if data.prevowel then return data.initial .. "i" .. data.remainder end
if data.prevowel and (not mw.ustring.sub(data.remainder, 1, 1) == "i") then
return data.initial .. "i" .. data.remainder
end
return data.radical
return data.radical
end
end

Revision as of 18:08, 7 August 2023

Documentation for this module may be created at Module:ryn-mut/documentation

local export = {}

local params = {
	[1] = {alias_of = "r"},
	r = {default = mw.title.getCurrentTitle().text},
	n = {},
	s = {},
	nocat = {type = "boolean"},
}

local IRREG_MARKER = "<sup>△</sup>"
local UNCHANGED_MARKER = "<i>unchanged</i>"

local mutation_rules = {
	["b"] = {"bh", "mb"},
	["bh"] = {nil, "mbh"},
	["c"] = {"ch", "nc"},
	["ch"] = {nil, "nch"},
	["d"] = {"d̦", "nd"},
	["d̦"] = {"d̦", "nd̦"},
	["dh"] = {nil, "ndh"},
	["f"] = {nil, "mf"},
	["g"] = {"gh", "ng"},
	["gh"] = {nil, "ngh"},
	["l"] = {nil, "nl"},
	["lh"] = {"l", "nlh"},
	["m"] = {},
	["n"] = {},
	["p"] = {"b", "mp"},
	["r"] = {nil, "dr"},
	["rh"] = {"r", "dr"},
	["s"] = {"ș", "ns"},
	["ș"] = {"ș", "nș"},
	["t"] = {"ț", "nt"},
	["ț"] = {"ț", "nț"},
}
local vowel_pattern = "[aeiíoóu]"

local function get_radical_data(term)
	local initial, prevowel, remainder
	if mw.ustring.sub(term, 2, 2) == "h" then
		initial = mw.ustring.sub(term, 1, 2)
		remainder = mw.ustring.sub(term, 3)
		prevowel = mw.ustring.find(mw.ustring.sub(term, 3, 3), vowel_pattern) and true or false
	else
		initial = mw.ustring.sub(term, 1, 1)
		remainder = mw.ustring.sub(term, 2)
		prevowel = mw.ustring.find(mw.ustring.sub(term, 2, 2), vowel_pattern) and true or false
	end
	local vowel = mw.ustring.find(initial, vowel_pattern) and true or false
	return initial, vowel, prevowel, remainder
end

local function mutate_soft(data)
	if data.vowel then
		if data.initial == "i" then return data.radical end
		return "i" .. data.radical
	end
	local change = mutation_rules[data.initial][1]
	if change then return change .. data.remainder end
	if data.prevowel and (not mw.ustring.sub(data.remainder, 1, 1) == "i") then
		return data.initial .. "i" .. data.remainder
	end
	return data.radical
end

local function mutate_nasal(data)
	if data.vowel then return "n-" .. data.radical end
	local change = mutation_rules[data.initial][2]
	if change then return change .. data.remainder end
	return data.radical
end

function export.mutate(term)
	local data = {}
	data.radical = term
	data.initial, data.vowel, data.prevowel, data.remainder = get_radical_data(term)
	data.soft = mutate_soft(data)
	data.nasal = mutate_nasal(data)
	return data
end

local function get_mutation_info(radical, override, expected)
	local irregular = override and (expected ~= override)
	local mutation = override or expected
	local changed = mutation ~= radical
	return mutation, changed, irregular
end

function export.show(frame)
	local args = require("Module:parameters").process(frame:getParent().args, params)
	local radical = args["r"]
	local data = export.mutate(radical)
	local s_mut, s_changed, s_irregular = get_mutation_info(radical, args["s"], data.soft)
	local n_mut, n_changed, n_irregular = get_mutation_info(radical, args["n"], data.nasal)
	local ret = '{| style="display:table; width:54%; border: 1px solid #b3b3b3; font-size: 95%; text-align: center;'
	ret = ret .. '\n|-'
	ret = ret .. '\n! style="background:#efefef" colspan=3 | [[Appendix:Riyan mutation|Riyan mutation]]'
	ret = ret .. '\n|-'
	ret = ret .. '\n! style="padding-top:4px;" | [[Appendix:Glossary#radical|radical]]'
	ret = ret .. '\n! style="padding-top:4px; | [[Appendix:Glossary#lenition|lenited]]'
	ret = ret .. '\n! style="padding-top:4px; | [[Appendix:Glossary#nasal|nasal]]'
	ret = ret .. '\n|-'
	ret = ret .. '\n| style="padding-bottom:4px;" | ' .. radical
	ret = ret .. '\n| style="padding-bottom:4px;" | ' .. (s_changed and s_mut or UNCHANGED_MARKER) .. (s_irregular and IRREG_MARKER or "")
	ret = ret .. '\n| style="padding-bottom:4px;" | ' .. (n_changed and n_mut or UNCHANGED_MARKER) .. (n_irregular and IRREG_MARKER or "")
	ret = ret .. '\n|-'
	if s_irregular or n_irregular then
		ret = ret .. '\n| colspan=3 | <small style="font-size:85%;">' .. IRREG_MARKER .. 'Irregular.</small>'
	end
	if s_changed or n_changed then
		ret = ret .. "\n| colspan=3 | <small style=\"font-size:85%;\">''Note:'' Some of these forms may be hypothetical. Not every possible mutated form of every word actually occurs.</small>"
	end
	ret = ret .. '\n|}'
	if (s_irregular or n_irregular) and (not args["nocat"]) then
		ret = ret .. "[[Categories:Riyan terms with irregular mutation]]"
	end
	return ret
end

return export