Module:yi-headword
Appearance
- The following documentation is located at Module:yi-headword/documentation. [edit] Categories were auto-generated by Module:module categorization. [edit]
- Useful links: subpage list • links • transclusions • testcases • sandbox
local com = require("Module:yi-common")
local lang = require("Module:languages").getByCode("yi")
local Latn = require("Module:scripts").getByCode("Latn")
local u = mw.ustring
local export = {}
local pos_functions = {}
-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
SUBPAGENAME = mw.title.getCurrentTitle().subpageText
local args = {}
for key, val in pairs(frame:getParent().args) do
if val ~= "" then
args[key] = val
end
end
local poscat = frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.")
local data = {lang = lang, pos_category = poscat, categories = {}, heads = {args["head"]}, translits = {args["tr"]}, genders = {}, inflections = {}, sort_key = args["sort"]}
-- Call POS-specific function
if pos_functions[poscat] then
pos_functions[poscat](args, data)
end
return require("Module:headword").full_headword(data)
end
-- if func(form, formtr) is nil or returns nil, then the default get_form will be used
local function get_form_custom(func, args, argname, trname)
local form = args[argname]
if form then
local formtr = args[trname or (argname .. "tr")]
local ret = func and func(form, formtr)
if ret == nil then
ret = com.form(form, args[trname or (argname .. "tr")])
end
return ret
else
return form
end
end
local function get_form(args, argname, trname)
return get_form_custom(func, args, argname, trname)
end
local function get_numbered_forms_custom(func, args, argname, startat, output)
output = output or {}
while true do
local form = get_form_custom(func, args, argname .. startat)
if form then
table.insert(output, form)
else
break
end
startat = startat + 1
end
return output
end
local function get_numbered_forms(args, argname, startat, output)
return get_numbered_forms_custom(nil, args, argname, startat, output)
end
local function add_inflections(inflections, ...)
for _, inflection in ipairs({...}) do
if inflection[1] then
for i, form in ipairs(inflection) do
if form == "-" then
inflection[i] = {term = "—", translit = "-", nolink = true, sc = Latn}
else
inflection[i] = {term = form.text, translit = form.tr}
end
end
table.insert(inflections, inflection)
end
end
end
pos_functions["adjectives"] = function(args, data)
local comparatives = {get_form(args, 1, "ctr"), label = "comparative", enable_auto_translit = true}
if comparatives[1] then
get_numbered_forms(args, "c", 2, comparatives)
end
local superlatives = {get_form(args, 2, "str"), label = "superlative", enable_auto_translit = true}
if superlatives[1] then
get_numbered_forms(args, "s", 2, superlatives)
end
add_inflections(data.inflections, comparatives, superlatives)
end
pos_functions["verbs"] = function(args, data)
local past_participles = {get_form(args, 1, 2), label = "past participle", enable_auto_translit = true, accel = {form = "past-participle"}}
if past_participles[1] then
get_numbered_forms(args, "p", 2, past_participles)
end
add_inflections(data.inflections, past_participles)
end
local compound_genders = {
["mp"] = {"m-p"},
["np"] = {"n-p"},
["fp"] = {"f-p"},
["mn"] = {"m", "n"},
["mf"] = {"m", "f"},
["fn"] = {"f", "n"},
["mnp"] = {"m-p", "n-p"},
["mfp"] = {"m-p", "f-p"},
["fnp"] = {"f-p", "n-p"},
["mfn"] = {"m", "f", "n"},
["mfnp"] = {"m-p", "f-p", "n-p"},
}
local plural_suffixes = {
["n"] = "ן",
["en"] = "ען",
["s"] = "ס",
["es"] = "עס",
["er"] = "ער",
["ekh"] = "עך",
}
local plural_getter = {}
function plural_getter:__call(f, ftr)
if f == "+" then
return com.form(self.head, ftr)
elseif plural_suffixes[f] then
return com.form(com.suffix(self.head, plural_suffixes[f]), ftr)
else
return nil
end
end
local dim_suffixes = {
["l"] = "ל",
["kl"] = "כל",
["ele"] = "עלע",
}
local dim_getter = {}
function dim_getter:__call(f, ftr)
if dim_suffixes[f] then
return com.form(com.suffix(self.head, dim_suffixes[f]), ftr)
else
return nil
end
end
local gender_endings = {
["עכץ"] = "n",
["עניש"] = "n",
}
local gender_getter = {}
function gender_getter:__call()
for k, v in pairs(gender_endings) do
if u.match(self.head, k .. "$") then
return v
end
end
return nil
end
pos_functions["nouns"] = function(args, data)
local gs = compound_genders[args["g"]]
if gs then
for _, g in ipairs(gs) do
table.insert(data.genders, g)
end
elseif args["g"] then
table.insert(data.genders, args["g"])
local i = 2
while args["g" .. i] do
table.insert(data.genders, args["g" .. i])
i = i + 1
end
else
local get_gender = {head = com.form(args["head"] or SUBPAGENAME, args["tr"])}
setmetatable(get_gender, gender_getter)
data.genders = {get_gender()}
end
local get_plural = {head = com.form(args["head"] or SUBPAGENAME, args["tr"])}
setmetatable(get_plural, plural_getter)
local plurals = {get_form_custom(get_plural, args, "pl"), label = "plural", enable_auto_translit = true}
if plurals[1] then
get_numbered_forms_custom(get_plural, args, "pl", 2, plurals)
end
add_inflections(data.inflections, plurals)
local get_dim = {head = com.form(args["head"] or SUBPAGENAME, args["tr"])}
setmetatable(get_dim, dim_getter)
local dims = {get_form_custom(get_dim, args, "dim"), label = "diminutive", enable_auto_translit = true}
if dims[1] then
get_numbered_forms_custom(get_dim, args, "dim", 2, dims)
end
add_inflections(data.inflections, dims)
end
pos_functions["prepositions"] = function(args, data)
local dem_forms = {get_form(args, "dem", "demtr"), label = "contracted ''dem''-form", enable_auto_translit = true}
if dem_forms[1] == "-" then
dem_forms.label = "no " .. dem_forms.label
dem_forms[1] = nil
table.insert(data.inflections, dem_forms)
elseif dem_forms[1] then
get_numbered_forms(args, "dem", 2, dem_forms)
add_inflections(data.inflections, dem_forms)
end
end
return export