Module:ryn-mut: Difference between revisions

From Laenkea
Jump to navigation Jump to search
No edit summary
No edit summary
 
(27 intermediate revisions by the same user not shown)
Line 4: Line 4:
[1] = {alias_of = "r"},
[1] = {alias_of = "r"},
r = {default = mw.title.getCurrentTitle().text},
r = {default = mw.title.getCurrentTitle().text},
n = {},
i = {},
initial = {alias_of = "i"},
s = {},
soft = {alias_of = "s"},
lenited = {alias_of = "s"},
nocat = {type = "boolean"},
nocat = {type = "boolean"},
}
}
Line 11: Line 15:
local UNCHANGED_MARKER = "<i>unchanged</i>"
local UNCHANGED_MARKER = "<i>unchanged</i>"


local function is_vowel(c)
local lenition = {
return c == "a" or c == "e" or c == "i" or c == "í" or c == "o" or c == "ó" or c == "u"
["b"] = "v",
["k"] = "g",
["d"] = "z",
["f"] = "h",
["g"] = "ŗ",
["ŗ"] = "",
["p"] = "b",
["s"] = "r",
["t"] = "d",
["z"] = "r",
}
 
local function get_radical_data(term, initial_override)
local initial, remainder
initial = initial_override or mw.ustring.sub(term, 1, 1)
remainder = mw.ustring.sub(term, 2)
return initial, remainder
end
end


local function is_labial_consonant(c)
local function mutate_soft(data)
return c == "p" or c == "b"
local change = lenition[data.initial]
if change then
return change .. data.remainder
end
return data.radical
end
end


local function n_is_exempt(c)
function export.mutate(term, initial_override)
return c == "m" or c == "n"
local data = {}
data.radical = term
data.initial, data.remainder = get_radical_data(term, initial_override)
data.soft = mutate_soft(data)
return data
end
end


function export.n_mutate(radical, override)
local function get_mutation_info(radical, override, expected)
local function n_mutate_default(radical)
local irregular = override and (expected ~= override)
local initial = string.sub(radical, 1, 1)
local mutation = override or expected
if n_is_exempt(initial) then return radical end
local changed = mutation ~= radical
if is_vowel(initial) then return "n-" .. radical end
return mutation, changed, irregular
if is_labial_consonant(initial) then return "m" .. radical end
return "n" .. radical
end
local mut = n_mutate_default(radical)
if override and mut ~= override then
return override, true
else
return mut, false
end
end
end


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

Latest revision as of 21:46, 25 February 2024

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},
	i = {},
	initial = {alias_of = "i"},
	s = {},
	soft = {alias_of = "s"},
	lenited = {alias_of = "s"},
	nocat = {type = "boolean"},
}

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

local lenition = {
	["b"] = "v",
	["k"] = "g",
	["d"] = "z",
	["f"] = "h",
	["g"] = "ŗ",
	["ŗ"] = "",
	["p"] = "b",
	["s"] = "r",
	["t"] = "d",
	["z"] = "r",
}

local function get_radical_data(term, initial_override)
	local initial, remainder
	initial = initial_override or mw.ustring.sub(term, 1, 1)
	remainder = mw.ustring.sub(term, 2)
	return initial, remainder
end

local function mutate_soft(data)
	local change = lenition[data.initial]
	if change then
		return change .. data.remainder
	end
	return data.radical
end

function export.mutate(term, initial_override)
	local data = {}
	data.radical = term
	data.initial, data.remainder = get_radical_data(term, initial_override)
	data.soft = mutate_soft(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, args["i"])
	local s_mut, s_changed, s_irregular = get_mutation_info(radical, args["s"], data.soft)
	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=2 | [[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|-'
	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|-'
	if s_irregular then
		ret = ret .. '\n| colspan=2 | <small style="font-size:85%;line-height:1.2;display:block;padding-bottom:6px;">' .. IRREG_MARKER .. 'Irregular.</small>'
	end
	if s_changed then
		ret = ret .. "\n| colspan=2 | <small style=\"font-size:85%;line-height:1.2;display:block;padding-bottom:6px;\">''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 and (not args["nocat"]) then
		ret = ret .. "[[Categories:Riyan terms with irregular mutation]]"
	end
	return ret
end

return export