local m_headword = require("Module:headword")
local com = require("Module:he-common")
local export = {}
local pos_functions = {}
local lang = require("Module:languages").getByCode("he")
local function get_params_list(args, argprefix)
local export = {}
i = 1
term = argprefix
while args[term] ~= nil and args[term] ~= "" do
table.insert(export, term)
i = i + 1
term = argprefix .. i
end
return export
end
local function make_params_array(args, params)
local export = {}
for _, param in ipairs(params) do
table.insert(export, args[param])
end
return export
end
local function maybe_get_inflection(args, name, params, list, accel, is_construct)
if list then
params = get_params_list(args, params)
end
local tbl = {}
if type(params) ~= "table" then
params = {params}
end
for _, param in ipairs(params) do
local paramwv = param .. "wv"
local paramdwv = param .. "dwv"
if args[param] or args[paramwv] or args[paramdwv] then
tbl.label = name
tbl.accel = accel
if is_construct == true then
table.insert(tbl, com.gen_link_ending_with_makaf(args[param], args[paramwv], args[paramdwv]))
else
table.insert(tbl, com.gen_link(args[param], args[paramwv], args[paramdwv]))
end
end
if args[param] == "" or args[paramwv] == "" or args[paramdwv] == "" then
require('Module:debug').track("he-noun/empty-form-param")
elseif args[param] ~= nil and args[paramwv] ~= nil then
require('Module:debug').track("he-noun/param-and-paramwv")
end
end
return next(tbl) and tbl
end
-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
local args = {}
for k, v in pairs(frame:getParent().args) do
if v ~= "" then
args[k] = v
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 poscat_th = require("Module:th-utilities").th_pos(poscat)
if frame.args["auto"] and (args["auto"] == "" or not args["auto"]) then args["auto"] = frame.args["auto"] end
local data = {lang = lang, pos_category = poscat, categories = {}, heads = make_params_array(args, get_params_list(args, "head")), translits = make_params_array(args, get_params_list(args, "tr")), genders = {}, inflections = {}}
local head = args["head"]; if head == "" then head = nil end; data.heads[1] = head
data.sort_key = args["sort"]; if data.sort_key == "" then data.sort_key = nil end
if data.sort_key then
data.sort_key = data.sort_key .. "a" .. mw.title.getCurrentTitle().subpageText
end
local wv = args["wv"] or mw.title.getCurrentTitle().subpageText
local dwv = args["dwv"]
if not data.heads[1] then
if dwv then
data.heads[1] = wv .. " \\ " .. '<span class="inflection-table">' .. "[[" .. dwv .. "]]" .. "</span>" -- not really an inflection table but for the black links
else
data.heads[1] = wv
end
end
if dwv and mw.ustring.match(dwv, "%[%[") then
require('Module:debug').track("he-noun/link-in-dwv")
end
if not (args["wv"] or args["dwv"] or args["head"]) then
require('Module:debug').track("he-noun/no-nikud")
end
if mw.ustring.match(wv, "׳") then
table.insert(data.categories, "ศัพท์ภาษาฮีบรูที่สะกดด้วย ׳")
end
if mw.ustring.match(wv, "״") then
table.insert(data.categories, "ศัพท์ภาษาฮีบรูที่สะกดด้วย ״")
end
local begedkefet = "בגדכפת"
local vowels = "ְֱֲֳִֵֶַָֹֻ"
local dagesh = "ּֿ"
local begedkefet_regex = "[" .. begedkefet .. "]"
local vowels_regex = "[" .. vowels .. "]"
local dagesh_regex = "[" .. dagesh .. "]"
if args["unchangeablebegedkefet"] == "1" or mw.ustring.match(com.fix_nikud(dwv or wv), "^" .. begedkefet_regex .. vowels_regex) then
table.insert(data.categories, "Hebrew terms beginning with an unchangeable begedkefet letter")
elseif mw.ustring.match(com.fix_nikud(dwv or wv), "^" .. begedkefet_regex .. dagesh_regex) then
table.insert(data.categories, "Hebrew terms beginning with a begedkefet letter")
end
local pattern_link = ""
if args["pat"] and args["pat"] ~= "" and poscat_th ~= "คำกริยา" then
table.insert(data.categories, "ศัพท์ภาษาฮีบรูที่อยู่ในแบบรูป " .. args["pat"]) -- must use ศัพท์...ที่
local patfmt = require("Module:links").full_link({lang = lang, alt = args["pat"], tr = "-"})
pattern_link = " <small>[[ภาคผนวก:แบบรูปภาษาฮีบรู/" .. args["pat"] .. "|[แบบรูป: " .. patfmt .. "] ]]</small>"
end
if pos_functions[poscat_th] then
pos_functions[poscat_th](args, data, wv)
end
table.insert(data.inflections, maybe_get_inflection(args, "Biblical Hebrew [[w:Pausa|pausal form]]", "pausal", false))
return (m_headword.full_headword(data)) .. pattern_link
end
local final_to_nonfinal = {
["ך"]="כ",
["ם"]="מ",
["ן"]="נ",
["ף"]="פ",
["ץ"]="צ",
}
local function stemify_helper(letter, rest)
return (final_to_nonfinal[letter] or letter) .. rest
end
local function stemify(x)
if x then
x = mw.ustring.gsub(x, "ְ([^א-תﭏ]*)$", "%1")
x = mw.ustring.gsub(x, "([ךםןףץ])([^א-תﭏ]*)$", stemify_helper)
end
return x
end
local function gen_fem_t(stemwv)
local stub, vowel, final, dagesh = mw.ustring.match(com.fix_nikud(stemwv), "^(.*)([ְֲִָ])([א-ת][ׁׂ]?)(ּ?)$")
if not stub then
error("Error attaching feminine ת suffix, please check vocalization.")
end
if final == "י" then
if vowel ~= "ִ" or dagesh ~= "ּ" then
error("Error attaching feminine ת suffix, please check vocalization.")
end
return stub .. vowel .. final .. "ת"
end
if vowel == "ִ" or dagesh ~= "" then
error("Error attaching feminine ת suffix, please check vocalization.")
end
if final == "א" then
return stub .. "ֵ" .. final .. "ת"
end
if final == "ה" or final == "ח" or final == "ע" then
return stub .. "ַ" .. final .. "ַ" .. "ת"
end
return stub .. "ֶ" .. final .. "ֶ" .. "ת"
end
pos_functions["คำคุณศัพท์"] = function(args, data)
-- table.insert(genders, "m")
if args["auto"] == nil or args["auto"] == "" then
-- Use only provided inflections
table.insert(data.inflections, maybe_get_inflection(args, "เพศหญิง", {"f", "f2"}, false))
table.insert(data.inflections, maybe_get_inflection(args, "เพศชายพหูพจน์", {"mp", "mp2"}, false))
table.insert(data.inflections, maybe_get_inflection(args, "เพศหญิงพหูพจน์", "fp", true))
else
require("Module:debug").track("he-adj/auto")
-- Automatically generate inflections
local stem = args["stem"]
local stemwv = args["stemwv"]
local stemdwv = args["stemdwv"]
local e = false
if not stem then
if stemwv then
stem = com.remove_nikud(stemwv)
else
stem = stemify(mw.title.getCurrentTitle().subpageText)
if not stemdwv then
stemwv = stemify(args["wv"])
stemdwv = stemify(args["dwv"])
end
local fstemwv = stemwv and com.fix_nikud(stemwv)
local fstemdwv = stemdwv and com.fix_nikud(stemdwv)
if (fstemwv or fstemdwv) and (stem ~= nil or stem:match("ה$")) and (fstemwv == nil or fstemwv:match("ֶה$")) and (fstemdwv == nil or fstemdwv:match("ֶה$")) then
e = true
stem = stem and stem:gsub("ה$", "")
stemwv = fstemwv and fstemwv:gsub("ֶה$", "")
stemdwv = fstemdwv and fstemdwv:gsub("ֶה$", "")
end
end
end
stem, stemwv, stemdwv = com.process_wv_triad(stem, stemwv, stemdwv)
local f, fwv, fdwv = com.process_wv_triad(args["f"], args["fwv"], args["fdwv"])
local f2, f2wv, f2dwv = com.process_wv_triad(args["f2"], args["f2wv"], args["f2dwv"])
local mp, mpwv, mpdwv = com.process_wv_triad(args["mp"], args["mpwv"], args["mpdwv"])
local mp2, mp2wv, mp2dwv = com.process_wv_triad(args["mp2"], args["mp2wv"], args["mp2dwv"])
local fp, fpwv, fpdwv = com.process_wv_triad(args["fp"], args["fpwv"], args["fpdwv"])
if f ~= "-" then
if not (f or fwv or fdwv) then
f = stem and (stem .. "ה")
fwv = stemwv and (stemwv .. "ָה")
fdwv = stemdwv and (stemdwv .. "ָה")
elseif f == "ת" and not (fwv or fdwv) then
f = stem and (stem .. (e and "ית" or "ת"))
fwv = stemwv and (e and (stemwv .. "ֵית") or gen_fem_t(stemwv))
fdwv = stemdwv and (e and (stemdwv .. "ֵית") or gen_fem_t(stemdwv))
end
if f2 == "ת" and not (f2wv or f2dwv) then
f2 = stem and (stem .. (e and "ית" or "ת"))
f2wv = stemwv and (e and (stemwv .. "ֵית") or gen_fem_t(stemwv))
f2dwv = stemdwv and (e and (stemdwv .. "ֵית") or gen_fem_t(stemdwv))
end
tbl = {label = "เพศหญิง", com.gen_link(f, fwv, fdwv)}
if f2 or f2wv or f2dwv then
table.insert(tbl, com.gen_link(f2, f2wv, f2dwv))
end
table.insert(data.inflections, tbl)
end
if mp ~= "-" then
if not (mp or mpwv or mpdwv) then
mp = stem and (stem .. "ים")
mpwv = stemwv and (stemwv .. "ִים")
mpdwv = stemdwv and (stemdwv .. "ִים")
end
tbl = {label = "เพศชายพหูพจน์", com.gen_link(mp, mpwv, mpdwv)}
if mp2 or mp2wv or mp2dwv then
table.insert(tbl, com.gen_link(mp2, mp2wv, mp2dwv))
end
table.insert(data.inflections, tbl)
end
if fp ~= "-" then
if not (fp or fpwv or fpdwv) then
fp = stem and (stem .. "ות")
fpwv = stemwv and (stemwv .. "וֹת")
fpdwv = stemdwv and (stemdwv .. "וֹת")
end
tbl = {label = "เพศหญิงพหูพจน์", com.gen_link(fp, fpwv, fpdwv)}
table.insert(data.inflections, tbl)
end
end
end
pos_functions["คำลักษณนาม"] = function(args, data, wv)
if args["g"] == "m" or args["g"] == "m-p" then
table.insert(data.genders, args["g"])
table.insert(data.inflections, maybe_get_inflection(args, "คู่ศัพท์เพศหญิง", "f", true))
elseif args["g"] == "f" or args["g"] == "f-p" then
table.insert(data.genders, args["g"])
table.insert(data.inflections, maybe_get_inflection(args, "คู่ศัพท์เพศชาย", "m", false))
elseif args["g"] == "m-f" or args["g"] == "m-f-p" then
table.insert(data.genders, args["g"])
end
end
pos_functions["คำนาม"] = function(args, data, wv)
local origin = " origin-" .. wv:gsub("%%", "."):gsub(" ", "_")
if args["g"] == "m" or args["g"] == "f" or args["g"] == "m-f" then
table.insert(data.genders, args["g"])
if args["sg"] ~= nil then
require('Module:debug').track("he-noun/sg-for-head")
end
elseif args["g"] == "m-d" or args["g"] == "f-d" or args["g"] == "m-f-d" then
table.insert(data.genders, args["g"])
table.insert(data.categories, "คำนามทวิพจน์เท่านั้นภาษาฮีบรู")
table.insert(data.inflections, maybe_get_inflection(args, "เอกพจน์ไม่ชี้เฉพาะ", "sg", false))
elseif args["g"] == "m-p" or args["g"] == "f-p" or args["g"] == "m-f-p" then
table.insert(data.genders, args["g"])
table.insert(data.categories, "คำนามพหูพจน์เท่านั้นภาษาฮีบรู")
table.insert(data.inflections, maybe_get_inflection(args, "เอกพจน์ไม่ชี้เฉพาะ", "sg", false))
elseif args["g"] == "" or args["g"] == nil then
table.insert(data.genders, "?")
table.insert(data.categories, "Hebrew terms with incomplete gender")
end
-- Dual forms rare enough that there's no need for without/missing categoristion
table.insert(data.inflections, maybe_get_inflection(args, "ทวิพจน์ไม่ชี้เฉพาะ", "dual", true))
if args["pl"] == "-" then
table.insert(data.inflections, {label = "ไม่มีรูปผันพหูพจน์"})
table.insert(data.categories, "Hebrew nouns without plural forms")
elseif args["pl"] == "" or args["pl"] == nil then
table.insert(data.categories, "Hebrew noun entries missing plural forms")
else
table.insert(data.inflections, maybe_get_inflection(args, "พหูพจน์ไม่ชี้เฉพาะ", "pl", true, "plural-form-of" .. origin))
if args["g"] == "m" and mw.ustring.sub(com.remove_nikud(args["pl"]), -2, -1) == "ות" then
table.insert(data.categories, "คำนามเพศชายภาษาฮีบรูที่พหูพจน์ลงท้ายด้วย ־ות")
elseif args["g"] == "f" and mw.ustring.sub(com.remove_nikud(args["pl"]), -2, -1) == "ים" then
table.insert(data.categories, "คำนามเพศหญิงภาษาฮีบรูที่พหูพจน์ลงท้ายด้วย ־ים")
elseif mw.ustring.sub(com.remove_nikud(args["pl"]), -3, -1) == "יים" then
table.insert(data.categories, "คำนามภาษาฮีบรูที่พหูพจน์ลงท้ายด้วย ־יים")
end
end
if args["cons"] == "-" then
table.insert(data.inflections, {label = "ไม่มีรูปผันสมาส"})
table.insert(data.categories, "Hebrew nouns without construct forms")
else
if args["cons"] == "" or args["cons"] == nil then
table.insert(data.categories, "Hebrew noun entries missing singular construct forms")
else
table.insert(data.inflections, maybe_get_inflection(args, "สมาสเอกพจน์", "cons", true, "construct-form-of" .. origin, true))
end
table.insert(data.inflections, maybe_get_inflection(args, "สมาสทวิพจน์", "dualcons", true , nil, true))
if (args["plcons"] == "" or args["plcons"] == nil) and args["pl"] ~= "-" then
table.insert(data.categories, "Hebrew noun entries missing plural construct forms")
else
table.insert(data.inflections, maybe_get_inflection(args, "สมาสพหูพจน์", "plcons", true, "plural-construct-form-of" .. origin, true))
end
end
table.insert(data.inflections, maybe_get_inflection(args, "คู่ศัพท์เพศชาย", "m", true))
table.insert(data.inflections, maybe_get_inflection(args, "คู่ศัพท์เพศหญิง", "f", true))
if args["g"] == "m" and mw.ustring.sub((com.remove_nikud(args["wv"] or args["dwv"] or mw.title.getCurrentTitle().subpageText)), -1) == "ת" then
table.insert(data.categories, "คำนามเพศชายภาษาฮีบรูที่ลงท้ายด้วย ־ת")
elseif args["g"] == "m" and mw.ustring.sub((com.remove_nikud(args["wv"] or args["dwv"] or mw.title.getCurrentTitle().subpageText)), -1) == "ה" then
table.insert(data.categories, "คำนามเพศชายภาษาฮีบรูที่ลงท้ายด้วย ־ה")
end
end
pos_functions["ตัวเลข"] = function(args, data)
table.insert(data.inflections, maybe_get_inflection(args, "สมาส", "cons", true))
table.insert(data.inflections, maybe_get_inflection(args, "คู่ศัพท์เพศชาย", "m", true))
table.insert(data.inflections, maybe_get_inflection(args, "คู่ศัพท์เพศหญิง", "f", true))
end
pos_functions["คำสรรพนาม"] = function(args, data)
if args["g"] == "m" or args["g"] == "f" or args["g"] == "m-f" or args["g"] == "m-p" or args["g"] == "f-p" or args["g"] == "m-f-p" then
table.insert(data.genders, args["g"])
elseif args["n"] then
require('Module:debug').track("he-pron/param-n")
end
end
pos_functions["คำวิสามานยนาม"] = function(args, data, wv)
local origin = " origin-" .. wv:gsub("%%", "."):gsub(" ", "_")
if args["pl"] and args["pl"] ~= "-" and args["pl"] ~= "" then
table.insert(data.inflections, maybe_get_inflection(args, "พหูพจน์ไม่ชี้เฉพาะ", "pl", true, "plural-form-of" .. origin))
if args["g"] == "m" and mw.ustring.sub(com.remove_nikud(args["pl"]), -2, -1) == "ות" then
table.insert(data.categories, "คำนามเพศชายภาษาฮีบรูที่พหูพจน์ลงท้ายด้วย ־ות")
elseif args["g"] == "f" and mw.ustring.sub(com.remove_nikud(args["pl"]), -2, -1) == "ים" then
table.insert(data.categories, "คำนามเพศหญิงภาษาฮีบรูที่พหูพจน์ลงท้ายด้วย ־ים")
elseif mw.ustring.sub(com.remove_nikud(args["pl"]), -3, -1) == "יים" then
table.insert(data.categories, "คำนามภาษาฮีบรูที่พหูพจน์ลงท้ายด้วย ־יים")
end
end
if args["g"] == "m" or args["g"] == "f" or args["g"] == "m-f" then
table.insert(data.genders, args["g"])
elseif args["g"] == "m-d" or args["g"] == "f-d" or args["g"] == "m-f-d" then
table.insert(data.genders, args["g"])
table.insert(data.categories, "คำนามทวิพจน์เท่านั้นภาษาฮีบรู")
elseif args["g"] == "m-p" or args["g"] == "f-p" or args["g"] == "m-f-p" then
table.insert(data.genders, args["g"])
table.insert(data.categories, "คำนามพหูพจน์เท่านั้นภาษาฮีบรู")
elseif args["g"] == "" or args["g"] == nil then
table.insert(data.categories, "Hebrew proper nouns with incomplete gender")
elseif args["g"] == "-" then --surnames don't really have gender
table.insert(data.categories, "Hebrew proper nouns without gender")
else
table.insert(data.genders, "?")
end
end
local binyanim = {
["pa"] = "ปาอัล",
["pi"] = "ปีเอ็ล",
["hif"] = "ฮิฟอิล",
["hit"] = "ฮิตปาเอ็ล",
["huf"] = "ฮุฟอัล",
["pu"] = "ปูอัล",
["nif"] = "นิฟอัล",
["hitpu'al"] = "ฮิตปูอัล", -- should this be included?
}
local weakroots = {
["פ"] = {
["א"] = true,
["ה"] = true,
["ח"] = true,
["י"] = true,
["ל"] = true,
["נ"] = true,
["ע"] = true,
},
["ע"] = {
["א"] = true,
["ה"] = true,
["ו"] = true,
["ח"] = true,
["י"] = true,
["ע"] = true,
["ר"] = true,
},
["ל"] = {
["א"] = true,
["ה"] = true,
["ח"] = true,
["נ"] = true,
["ע"] = true,
},
}
local function maybe_get_weakcat(args, pos, binyan)
if weakroots[pos][args[pos]] then
if binyan then
return "คำกริยา" .. binyan .. " " .. pos .. "״" .. args[pos] .. " ภาษาฮีบรู"
else
return "คำกริยา " .. pos .. "״" .. args[pos] .. " ภาษาฮีบรู"
end
else
return nil -- perhaps track error if args[pos] ~= ""
end
end
pos_functions["คำกริยา"] = function(args, data)
local binyan = binyanim[args[1]]
if binyan then
table.insert(data.inflections, { label="[[ภาคผนวก:คำกริยาภาษาฮีบรู|บินยัน " .. binyan .. "]]" })
table.insert(data.categories, "คำกริยา" .. binyanim[args[1]] .. "ภาษาฮีบรู")
elseif args[1] ~= "-" then
table.insert(data.categories, "Hebrew verbs lacking binyan")
end
table.insert(data.categories, maybe_get_weakcat(args, "פ", binyan))
table.insert(data.categories, maybe_get_weakcat(args, "ע", binyan))
table.insert(data.categories, maybe_get_weakcat(args, "ל", binyan))
table.insert(data.inflections, maybe_get_inflection(args, "infinitive", "inf", true))
table.insert(data.inflections, maybe_get_inflection(args, "ปัจจุบันกาล", "pres", true))
table.insert(data.inflections, maybe_get_inflection(args, "อนาคตกาล", "fut", true))
table.insert(data.inflections, maybe_get_inflection(args, "imperative", "imp", true))
table.insert(data.inflections, maybe_get_inflection(args, "passive participle", "passp", true))
table.insert(data.inflections, maybe_get_inflection(args, "คู่ศัพท์กรรมวาจก", "pass", true))
table.insert(data.inflections, maybe_get_inflection(args, "คู่ศัพท์กรรตุวาจก", "act", true))
end
return export