A modult a Modul:yi-common/doc lapon tudod dokumentálni

local ex = {}

local lang = require("Module:languages").getByCode("yi")
local sc = require("Module:scripts").getByCode("Hebr")
local u = mw.ustring

local function ptranslit(text)
	return lang:transliterate(text, sc)
end

function ex.form(text, tr)
	if (not text) then
		if tr then
			return { text = "", tr = tr }
		else
			return nil
		end
	elseif text == "-" then
		return text
	elseif type(text) == "table" then
		if tr then
			return { text = text.text, tr = tr }
		else
			return text
		end
	else
		return { text = text, tr = tr }
	end
end

function ex.translit(f)
	f = ex.form(f)
	return f.tr or ptranslit(f.text)
end

local finals = {
	["ך"] = "כ",
	["ם"] = "מ",
	["ן"] = "נ",
	["ף"] = "פֿ",
	["ץ"] = "צ",
}

local simple_finalizers = {
	["כ"] = "ך",
	["מ"] = "ם",
	["נ"] = "ן",
	["פ"] = "ף",
	["צ"] = "ץ",
}

function ex.finalize(f)
	if (not f) or f == "-" then
		return f
	end
	local tmp = f.text
	tmp = u.gsub(tmp, "[כמנפצ]$", simple_finalizers)
	tmp = u.gsub(tmp, "פֿ$", "ף")
	return ex.form(tmp, f.tr)
end

-- For use by template code, e.g. {{yi-noun}}
function ex.make_non_final(frame_or_term)
	local text = frame_or_term
	if type(text) == "table" then
		text = text.args[1]
	end
	-- Discard second return value.
	local retval = u.gsub(text, "[ךםןףץ]$", finals)
	return retval
end
	
local function append2(f0, f1)
	if not (f0 and f1) then
		return f0 or f1 -- if either is nil return the other
	end
	if f0 == "-" or f1 == "-" then
		return "-" -- if either is a dash, return a dash
	end
	f0 = ex.form(f0); f1 = ex.form(f1) -- just in case
	local text = nil
	if u.match(f1.text, "^[א-ת]") then 
		text = u.gsub(f0.text, "[ךםןףץ]$", finals) .. f1.text
	else
		text = f0.text .. f1.text
	end
	local tr = nil
	if f0.tr or f1.tr then
		tr = ex.translit(f0) .. ex.translit(f1)
	end
	return ex.form(text, tr)
end

function ex.suffix(f0, f1)
	if f0 == "-" or f1 == "-" then
		return "-" -- if either is a dash, return a dash
	end
	f0 = ex.form(f0)
	f1 = ex.form(f1)
	if f0.tr and not f1.tr then
		f1.tr = ptranslit("־" .. f1.text):gsub("^-", "")
	end
	return append2(f0, f1)
end

-- no special handling for prefixes, but function exists for consitency
function ex.prefix(f0, f1)
	return append2(f0, f1)
end

function ex.append(...)
	local f0 = nil
	for i, v in ipairs(arg) do
		f0 = append2(f0, v)
	end
	return f0
end

function ex.ends_nasal(f)
	if f == "-" then
		return false
	end
	f = ex.form(f)
	if f.tr then
		return (u.match(f.tr, "[mn]$") or u.match(f.tr, "n[gk]$")) and true or false
	else
		return (u.match(f.text, "[מםנן]$") or u.match(f.text, "נ[גק]$")) and true or false
	end
end

function ex.ends_vowel(f)
	if f == "-" then
		return false
	else
		return u.match(ex.translit(f), "[aeiouy]$") and true or false
	end
end

local pat = {
	["t"] = "ט",
	["d"] = "ד",
	["s"] = "ס",
	["z"] = "ז",
	["ts"] = "[צץ]",
	["i"] = "%f[וי]י",
	["u"] = "%f[ו]ו",
	["d"] = "ד",
	["e"] = "ע",
	["n"] = "[נן]",
	["m"] = "[מם]",
	["ng"] = "נג",
	["nk"] = "נק",
}

function ex.ends_in(f, x)
	if f == "-" then
		return false
	end
	f = ex.form(f)
	if f.tr then
		return u.match(f.tr, x .. "$") and true or false
	else
		return u.match(f.text, pat[x] .. "$") and true or false
	end
end

return ex