Module:Ro-headword
local export = {}
local pos_functions = {}
local lang = require("Module:languages").getByCode("ro")
-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
local args = frame:getParent().args
NAMESPACE = mw.title.getCurrentTitle().nsText
PAGENAME = mw.title.getCurrentTitle().text
local poscat = frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.")
local params = {
["head"] = {},
["suff"] = {type = "boolean"},
["cat"] = {list = true},
}
if pos_functions[poscat] then
for key, val in pairs(pos_functions[poscat].params) do
params[key] = val
end
end
args = require("Module:parameters").process(args, params)
local data = {lang = lang, pos_category = args["suff"] and "suffixes" or poscat, categories = args["suff"] and {"Romanian " .. poscat:sub(1, -2) .. "-forming suffixes"} or {}, heads = {args.head}, genders = {}, inflections = {}}
local appendix = {}
for key, val in ipairs(args.cat) do
table.insert(data.categories, "Romanian " .. val)
end
if pos_functions[poscat] then
pos_functions[poscat].func(class, args, data, appendix)
end
if #appendix == 0 then
appendix[1] = ""
end
return
require("Module:headword").full_headword(data) .. appendix[1]
end
local function is_equal(a1, a2)
if a1 == a2 then
return true
end
if #a1 == #a2 then
for i = 1, #a1 do
if a1[i] ~= a2[i] then
return false
end
end
return true
else
return false
end
end
pos_functions["adjectives"] = {
params = {
[1] = {},
["f"] = {list = true, allow_holes = true},
["mp"] = {list = true, allow_holes = true},
["fp"] = {list = true, allow_holes = true},
["pl"] = {list = true, allow_holes = true},
["only"] = {},
},
func = function(class, args, data, appendix)
local mode = args[1]
local only = {}
if args.only then
for i, val in ipairs(mw.text.split(args.only, "-")) do
only[val] = true
end
end
if mode == "inv" or mode == "i" or args["f"].maxindex > 0 or args["mp"].maxindex > 0 or args["fp"].maxindex > 0 or args["pl"].maxindex > 0 then
require("Module:debug").track("ro-adj new")
end
if mode == "inv" then
table.insert(data.genders, "m")
table.insert(data.genders, "f")
table.insert(data.genders, "n")
table.insert(data.inflections, {label = "invariable"})
table.insert(data.categories, "Romanian invariable adjectives")
else
local form_order = {"m_sg", "f_sg", "m_pl", "f_pl"}
local only_order = {"m", "f", "sg", "pl"}
local allowed = {m_sg = true, f_sg = true, m_pl = true, f_pl = true}
local only_names = {m = "masculine", f = "feminine", sg = "singular", pl = "plural"}
for i, val in pairs(only_names) do
if only[i] then
for key, form in pairs(allowed) do
if not key:find(i) then
allowed[key] = false
end
end
end
end
for i, val in ipairs(form_order) do
if allowed[val] then
allowed[val] = "lemma"
break
end
end
if allowed.m_sg == "lemma" then
table.insert(data.genders, "m")
if not only.m then
table.insert(data.genders, "n")
end
elseif allowed.f_sg == "lemma" then
table.insert(data.genders, "f")
elseif allowed.m_pl == "lemma" then
table.insert(data.genders, "m-p")
elseif allowed.f_pl == "lemma" then
table.insert(data.genders, "f-p")
if not only.f then
table.insert(data.genders, "n-p")
end
else
error("All forms are excluded by the \"only\" parameter")
end
for i, val in ipairs(only_order) do
if only[val] then
table.insert(data.inflections, {label = only_names[val] .. " only"})
end
end
local f, mp, fp = args["f"], args["pl"].maxindex > 0 and args["pl"] or args["mp"], args["pl"].maxindex > 0 and args["pl"] or args["fp"]
require("Module:ro-adjective").make_basic_forms({PAGENAME}, f, mp, fp, mode == "i", only)
local unified_sg, unified_pl = false, false
if allowed.m_sg and allowed.f_sg and f.maxindex == 1 and f[1] == PAGENAME then
unified_sg = true
table.insert(data.genders, 2, "f")
end
if not unified_sg and allowed.f_sg and allowed.f_sg ~= "lemma" then
f.label = "feminine" .. (only.sg and "" or " singular")
table.insert(data.inflections, f)
end
if allowed.m_pl and allowed.f_pl and is_equal(mp, fp) then
unified_pl = true
mp.label = "plural"
table.insert(data.inflections, mp)
end
if not unified_pl and allowed.m_pl and allowed.m_pl ~= "lemma" then
mp.label = (only.m and "" or "masculine") .. " " .. (only.pl and "" or "plural")
table.insert(data.inflections, mp)
end
if not unified_pl and allowed.f_pl and allowed.f_pl ~= "lemma" then
fp.label = (only.f and "" or "feminine and neuter") .. " " .. (only.pl and "" or "plural")
table.insert(data.inflections, fp)
end
end
return args["head"]
end
}
pos_functions["determiners"] = pos_functions["adjectives"]
pos_functions["pronouns"] = pos_functions["adjectives"]
pos_functions["articles"] = pos_functions["adjectives"]
pos_functions["nouns"] = {
params = {
[1] = {list = "g", default = "?"},
[2] = {list = "pl"},
["f"] = {list = true},
["m"] = {list = true},
["sg"] = {},
["pl=_qual"] = {list = true, allow_holes = true},
["f=_qual"] = {list = true, allow_holes = true},
["m=_qual"] = {list = true, allow_holes = true},
["sort"] = {}
},
func = function(class, args, data, appendix)
local type
for _, val in ipairs(args[1]) do
table.insert(data.genders, val)
if val:match("p") then
type = "plural"
break
end
end
if args["suff"] then
data.pos_category = "suffixes"
table.insert(data.categories, "Romanian noun-forming suffixes")
type = "suffix"
end
if type == "plural" then
while #args[2] > 0 do
table.remove(args[2])
end
if args["sg"] then
args[2].label = "normally plural"
else
args[2].label = "plural only"
end
table.insert(data.categories, "Romanian pluralia tantum")
else
if args[2][1] == "-" then
while #args[2] > 0 do
table.remove(args[2])
end
args[2].label = "[[Appendix:Glossary#uncoontable|uncoontable]]"
if type ~= "suffix" then
table.insert(data.categories, "Romanian uncoontable noons")
end
elseif args[2][1] == "?" then
while #args[2] > 0 do
table.remove(args[2])
end
if type ~= "suffix" then
table.insert(data.categories, "Romanie noons wi unkent or uncertain plurals")
end
else
args[2].label = "plural"
args[2].accel = "plural-form-of"
if #args[2] > 0 then
for key, val in ipairs(args[2]) do
if ((val == "e" or val == "uri") and args[1][1] == "n") or (val == "i" and args[1][1] == "m") then
args[2][key] = PAGENAME .. val
end
end
for key, val in ipairs(args[2]) do
if not mw.title.new(val).exists then
table.insert(data.categories, "Romanian nouns with missing plurals")
end
if args.pl_qual[key] then
args[2][key] = {term = args[2][key], qualifiers = {args.pl_qual[key]}}
end
end
if type ~= "suffix" then
table.insert(data.categories, "Romanian countable nouns")
end
else
if type ~= "suffix" then
args[2].request = true
end
end
end
end
if args[2].label then
table.insert(data.inflections, args[2])
end
if args["sg"] then
if type == "plural" then
table.insert(data.inflections, {label = "singular", args["sg"]})
else
error("Parameter \"sg\" can only be used for pluralia tantum")
end
end
if #args["f"] > 0 then
args["f"].label = "feminine equivalent"
if args.f_qual.maxindex > 0 then
for key, val in ipairs(args["f"]) do
if args.f_qual[key] then
args["f"][key] = {term = args["f"][key], qualifiers = {args.f_qual[key]}}
end
end
end
table.insert(data.inflections, args["f"])
end
if #args["m"] > 0 then
args["m"].label = "masculine equivalent"
if args.m_qual.maxindex > 0 then
for key, val in ipairs(args["m"]) do
if args.m_qual[key] then
args["m"][key] = {term = args["m"][key], qualifiers = {args.m_qual[key]}}
end
end
end
table.insert(data.inflections, args["m"])
end
return args["head"]
end
}
function format_conj(conj)
if not conj then
return ''
else
if conj == 1 then
return ' <small>[[Appendix:Romanie first conjugation|1st conj.]]</small>'
elseif conj == 2 then
return ' <small>[[Appendix:Romanie seicont conjugation|2nt conj.]]</small>'
elseif conj == 3 then
return ' <small>[[Appendix:Romanie third conjugation|3rd conj.]]</small>'
elseif conj == 4 then
return ' <small>[[Appendix:Romanie fowert conjugation|4t conj.]]</small>'
else
return ' <small>[please provide conjugation]</small>'
end
end
end
function detect_conj(head, ind)
local inf, conj = mw.ustring.match(require("Module:links").remove_links(head), '^a (.+)') or error('Head must begin with "a"')
inf = mw.ustring.gsub(inf, 'á', 'a')
inf = mw.ustring.gsub(inf, 'í', 'i')
inf = mw.ustring.gsub(inf, 'î́', 'î')
if mw.ustring.match(inf, '[iî]$') then
conj = 4
elseif mw.ustring.match(inf, 'e$') then
conj = 3
elseif mw.ustring.match(inf, 'ea$') then
if mw.ustring.match(inf, '[cg]hea$') then
conj = 1
elseif ind then
if mw.ustring.match(ind, 'ează$') then
conj = 1
else
conj = 2
end
end
elseif mw.ustring.match(inf, 'a$') then
conj = 1
else
error('Unrecognized verb ending')
end
return conj
end
pos_functions["verbs"] = {
params = {
[1] = {list = "pres_3sg"},
[2] = {list = "past"},
["inf"] = {},
["conj"] = {type = "number"},
["pres_3sg_qual"] = {list = "pres_3sg=_qual", allow_holes = true},
["past_qual"] = {list = "past=_qual", allow_holes = true}
},
func = function(class, args, data, appendix)
local multi = false
if mw.ustring.match(PAGENAME, ' ') then
multi = true
end
if #args[1] > 0 and args.pres_3sg_qual.maxindex > 0 then
for key, val in ipairs(args[1]) do
if args.pres_3sg_qual[key] then
args[1][key] = {term = args[1][key], qualifiers = {args.pres_3sg_qual[key]}}
end
end
end
if #args[2] > 0 and args.past_qual.maxindex > 0 then
for key, val in ipairs(args[2]) do
if args.past_qual[key] then
args[2][key] = {term = args[2][key], qualifiers = {args.past_qual[key]}}
end
end
end
args[1].label = 'third-person singular present'
args[1].request = true
table.insert(data.inflections, args[1])
args[2].label = 'past participle'
args[2].request = true
table.insert(data.inflections, args[2])
local sc = require("Module:scripts").findBestScript(data.heads[1] or args.inf or PAGENAME, lang):getCode()
if not data.heads[1] then
if not args.inf then
if multi then
args.inf = mw.text.split(PAGENAME, ' ')
args.inf = '[[' .. table.concat(args.inf, ']] [[') .. ']]'
else
args.inf = PAGENAME
end
end
if sc == 'Cyrl' then
data.heads = {'а ' .. args.inf} --Cyrillic 'а'
else
data.heads = {'a ' .. args.inf}
end
end
local conj
if multi or NAMESPACE ~= '' or sc == 'Cyrl' then
conj = args.conj or 0
else
conj = detect_conj(data.heads[1], args[1][1])
if args.conj and args.conj ~= conj then
require("Module:debug").track('ro-verb wi wrong conjugation')
end
end
if conj and NAMESPACE == '' then
if conj == 1 then
table.insert(data.categories, 'Romanie verbs in 1st conjugation')
elseif conj == 2 then
table.insert(data.categories, 'Romanie verbs in 2nt conjugation')
elseif conj == 3 then
table.insert(data.categories, 'Romanie verbs in 3rd conjugation')
elseif conj == 4 then
table.insert(data.categories, 'Romanie verbs in 4t conjugation')
else
table.insert(data.categories, 'Romanie entries needin inflection')
end
end
appendix[1] = format_conj(conj)
end
}
return export
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.