モジュール:la-headword
表示
このモジュールについての説明文ページを モジュール:la-headword/doc に作成できます
local export = {}
local pos_functions = {}
-- FIXME: Replace with Module:table
local ut = require("モジュール:utils")
local legal_gender = {
["m"] = true,
["f"] = true,
["n"] = true,
["?"] = true,
}
local declension_to_english = {
["1"] = "第一",
["2"] = "第二",
["3"] = "第三",
["4"] = "第四",
["5"] = "第五",
}
local gender_names = {
["m"] = "男性",
["f"] = "女性",
["n"] = "中性",
["?"] = "性不明",
}
local lang = require("モジュール:languages").getByCode("la")
local u = mw.ustring.char
local rfind = mw.ustring.find
local rmatch = mw.ustring.match
local rsplit = mw.text.split
local rsubn = mw.ustring.gsub
local ulower = mw.ustring.lower
local MACRON = u(0x0304)
local BREVE = u(0x0306)
local DIAER = u(0x0308)
local DOUBLE_INV_BREVE = u(0x0361)
local accents = MACRON .. BREVE .. DIAER .. DOUBLE_INV_BREVE
-- version of rsubn() that discards all but the first return value
local function rsub(term, foo, bar)
local retval = rsubn(term, foo, bar)
return retval
end
local function track(page)
require("モジュール:debug").track("la-headword/" .. page)
return true
end
local function format(array, concatenater)
if #array == 0 then
return ""
else
local concatenated = table.concat(array, concatenater)
if concatenated == "" then
return ""
elseif rfind(concatenated, "'$") then
concatenated = concatenated .. " "
end
return "; ''" .. concatenated .. "''"
end
end
local function glossary_link(anchor, text)
text = text or anchor
return "[[付録:用語集#" .. anchor .. "|" .. text .. "]]"
end
-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
local NAMESPACE = mw.title.getCurrentTitle().nsText
local PAGENAME = mw.title.getCurrentTitle().text
local iparams = {
[1] = {required = true},
["def"] = {},
["suff_type"] = {},
}
local iargs = require("モジュール:parameters").process(frame.args, iparams)
local args = frame:getParent().args
local poscat = iargs[1]
local def = iargs.def
local suff_type = iargs.suff_type
local postype = nil
if suff_type then
postype = poscat .. '-' .. suff_type
else
postype = poscat
end
local data = {lang = lang, categories = {}, heads = {}, genders = {}, inflections = {}}
local infl_classes = {}
local appendix = {}
local postscript = {}
if poscat == "suffixes" then
table.insert(data.categories, "Latin " .. suff_type .. "-forming suffixes")
end
if pos_functions[postype] then
local new_poscat = pos_functions[postype](def, args, data, infl_classes, appendix, postscript)
if new_poscat then
poscat = new_poscat
end
end
if not rfind(poscat, " forms?$") then
for _, head in ipairs(data.heads) do
-- Don't trigger on prefixes or suffixes.
if (rfind(head, " ") or rfind(head, ".%-.")) then
table.insert(data.categories, "Latin multiword terms")
break
end
end
end
data.pos_category = (NAMESPACE == "Reconstruction" and "reconstructed " or "") .. poscat
postscript = table.concat(postscript, ", ")
return
require("モジュール:headword").full_headword(data)
.. format(infl_classes, "/")
.. format(appendix, ", ")
.. (postscript ~= "" and " (" .. postscript .. ")" or "")
end
local function process_num_type(numtype, categories)
if numtype == "card" then
table.insert(categories, "ラテン語 基数")
elseif numtype == "ord" then
table.insert(categories, "ラテン語 序数")
elseif numtype == "dist" then
-- FIXME, should be named 'Latin distributive numbers'
table.insert(categories, "la:Distributive numbers")
elseif numtype == "mul" then
-- FIXME, should be named 'Latin multiplicative numbers'
table.insert(categories, "la:Multiplicative numbers")
elseif numtype == "coll" then
-- FIXME, should be named 'Latin collective numbers'
table.insert(categories, "la:Collective numbers")
elseif numtype then
error("Unrecognized numeral type '" .. numtype .. "'")
end
end
local function nouns(pos, def, args, data, infl_classes, appendix)
local NAMESPACE = mw.title.getCurrentTitle().nsText
local is_num = pos == "numerals"
local is_pn = false
if pos == "proper nouns" then
is_pn = true
pos = "nouns"
end
local decldata = require("モジュール:la-nominal").do_generate_noun_forms(
args, pos, true, def, is_num)
local lemma = decldata.overriding_lemma
local lemma_num = decldata.num == "pl" and "pl" or "sg"
if not lemma or #lemma == 0 then
lemma = decldata.forms["linked_nom_" .. lemma_num]
end
data.heads = lemma
data.id = decldata.id
local genders = decldata.overriding_genders
if #genders == 0 then
if decldata.gender then
genders = {ulower(decldata.gender)}
elseif not is_num then
error("No gender explicitly specified in headword template using g=, and can't infer gender from lemma spec")
end
end
if is_num then
process_num_type(decldata.num_type, data.categories)
end
if decldata.indecl then
table.insert(data.inflections, {label = glossary_link("indeclinable")})
table.insert(data.categories, "ラテン語 不変化" .. decldata.pos)
for _, g in ipairs(genders) do
local gender, number = rmatch(g, "^(.)%-([sp])$")
if not gender then
gender = g
end
if not legal_gender[gender] then
error("Gender “" .. gender .. "” is not a valid Latin gender.")
end
table.insert(data.genders, g)
local gender_name = gender_names[gender]
table.insert(data.categories, "ラテン語 " .. gender_name .. decldata.pos)
table.insert(data.categories, "ラテン語 " .. gender_name .. "不変化" .. decldata.pos)
if number == "p" and NAMESPACE == '' then
table.insert(data.categories, "ラテン語 絶対複数")
elseif number == "s" and NAMESPACE == '' then
table.insert(data.categories, "ラテン語 絶対単数")
end
end
else
local is_irreg = false
local is_indecl = false
local is_decl = false
local has_multiple_decls = false
local has_multiple_variants = false
-- flatten declension specs
local decls = {}
for _, g in ipairs(genders) do
if not legal_gender[g] then
error("Gender “" .. g .. "” is not a valid Latin gender.")
end
local gender_name = gender_names[g]
if decldata.num == "pl" then
g = g .. "-p"
elseif decldata.num == "sg" then
g = g .. "-s"
end
table.insert(data.genders, g)
table.insert(data.categories, "ラテン語 " .. gender_name .. decldata.pos)
end
if decldata.num == "pl" and NAMESPACE == '' then
table.insert(data.categories, "ラテン語 絶対複数")
elseif decldata.num == "sg" and NAMESPACE == '' then
table.insert(data.categories, "ラテン語 絶対単数")
end
local function process_decl(decl_list, decl)
-- skip adjectival declensions
if not rfind(decl, "%+$") then
local irreg_decl_spec = rmatch(decl, "^irreg/(.*)$")
if irreg_decl_spec then
is_irreg = true
local irreg_decls = rsplit(irreg_decl_spec, ",")
if #irreg_decls > 1 then
has_multiple_decls = true
end
for _, d in ipairs(irreg_decls) do
if d == "indecl" or decl == "0" then
is_indecl = true
else
is_decl = true
end
ut.insert_if_not(decl_list, d)
end
else
if decl == "indecl" or decl == "0" then
is_indecl = true
else
is_decl = true
end
ut.insert_if_not(decl_list, decl)
end
end
end
for _, props in ipairs(decldata.propses) do
if props.headword_decl then
process_decl(decls, props.headword_decl)
else
local alternant_decls = {}
for _, alternant in ipairs(props) do
for _, single_props in ipairs(alternant) do
process_decl(alternant_decls, single_props.headword_decl)
end
end
if #alternant_decls > 1 then
has_multiple_decls = true
elseif #decls > 1 then
has_multiple_variants = true
end
for _, d in ipairs(alternant_decls) do
ut.insert_if_not(decls, d)
end
end
end
if is_indecl and is_decl then
has_multiple_decls = true
end
if has_multiple_decls then
table.insert(data.categories, "Latin " .. decldata.pos .. " with multiple declensions")
end
if has_multiple_variants then
table.insert(data.categories, "Latin " .. decldata.pos .. " with multiple variants of a single declension")
end
if is_irreg then
table.insert(data.inflections, {label = glossary_link("不規則")})
table.insert(data.categories, "ラテン語 " .. decldata.pos .. " 不規則変化")
for _, g in ipairs(genders) do
table.insert(data.categories, "ラテン語 " .. gender_names[g] .. decldata.pos .. " 不規則変化")
end
end
if is_indecl then
if is_decl then
table.insert(appendix, glossary_link("不変化"))
else
table.insert(data.inflections, {label = glossary_link("不変化")})
end
table.insert(data.categories, "ラテン語 " .. decldata.pos .. " 不変化")
for _, g in ipairs(genders) do
table.insert(data.categories, "ラテン語 " .. gender_names[g] .. decldata.pos .. " 不変化")
end
end
if #decls > 1 then
table.insert(data.inflections, {label = 'variously declined'})
--This causes multipart nouns composed of two nouns of different declensions
--to go into the category. The above code only triggers if a given term has
--multiple declensions.
--table.insert(data.categories, "Latin " .. decldata.pos .. " with multiple declensions")
end
for _, decl in ipairs(decls) do
if decl ~= "irreg" and decl ~= "indecl" and decl ~= "0" then
local decl_class = declension_to_english[decl]
if not decl_class then
error("Something wrong with declension '" .. decl .. "', don't recognize it")
end
table.insert(appendix, decl_class .. "変化")
table.insert(data.categories, "ラテン語 " .. decl_class .. "変化" .. decldata.pos)
for _, g in ipairs(genders) do
table.insert(data.categories, "ラテン語 " .. decl_class .. "変化の" .. gender_names[g] .. decldata.pos)
end
end
end
local gen = decldata.forms["gen_" .. lemma_num]
if gen and gen ~= "" and gen ~= "—" and #gen > 0 then
if is_decl then
-- Skip displaying the genitive for nouns that are only
-- indeclinable. But we do display it for nouns like Abrahām
-- and Ādām that can be either indeclinable or declined.
gen.label = "属格"
table.insert(data.inflections, gen)
end
else
table.insert(data.inflections, {label = "属格なし"})
table.insert(data.categories, "ラテン語 " .. decldata.pos .. " 単数属格なし")
end
end
if #decldata.m > 0 then
decldata.m.label = "男性"
table.insert(data.inflections, decldata.m)
end
if #decldata.f > 0 then
decldata.f.label = "女性"
table.insert(data.inflections, decldata.f)
end
for _, cat in ipairs(decldata.categories) do
ut.insert_if_not(data.categories, cat)
end
for _, cat in ipairs(decldata.cat) do
ut.insert_if_not(data.categories, "ラテン語 " .. cat)
end
return is_pn and decldata.pos == "名詞" and "固有名詞" or decldata.pos
end
pos_functions["名詞"] = function(def, args, data, infl_classes, appendix)
return nouns("名詞", def, args, data, infl_classes, appendix)
end
pos_functions["固有名詞"] = function(def, args, data, infl_classes, appendix)
return nouns("固有名詞", def, args, data, infl_classes, appendix)
end
pos_functions["suffixes-noun"] = function(def, args, data, infl_classes, appendix)
return nouns("suffixes", def, args, data, infl_classes, appendix)
end
pos_functions["numerals-noun"] = function(def, args, data, infl_classes, appendix)
return nouns("numerals", def, args, data, infl_classes, appendix)
end
export.allowed_subtypes = {
["impers"] = true,
["3only"] = true,
["depon"] = true,
["semidepon"] = true,
["optsemidepon"] = true,
["nopass"] = true,
["pass3only"] = true,
["passimpers"] = true,
["perfaspres"] = true,
["noperf"] = true,
["nopasvperf"] = true,
["nosup"] = true,
["supfutractvonly"] = true,
["noimp"] = true,
["nofut"] = true,
["p3inf"] = true,
["poetsyncperf"] = true,
["optsyncperf"] = true,
["alwayssyncperf"] = true,
["m"] = true,
["f"] = true,
["n"] = true,
["mp"] = true,
["fp"] = true,
["np"] = true,
-- can be specified manually in the headword to display "highly defective"
-- in the title (e.g. aveō)
["highlydef"] = true,
}
pos_functions["動詞"] = function(def, args, data, infl_classes, appendix)
local m_la_verb = require("モジュール:la-verb")
local NAMESPACE = mw.title.getCurrentTitle().nsText
local def1, def2
if def then
def1, def2 = rmatch(def, "^(.*):(.*)$")
end
local conjdata, typeinfo = m_la_verb.make_data(args, true, def1, def2)
local lemma_forms = conjdata.overriding_lemma
if not lemma_forms or #lemma_forms == 0 then
lemma_forms = m_la_verb.get_lemma_forms(conjdata, true)
end
local first_lemma = ""
if #lemma_forms > 0 then
first_lemma = require("モジュール:links").remove_links(lemma_forms[1])
end
data.heads = lemma_forms
data.id = conjdata.id
local conj = typeinfo.conj_type
local subconj = typeinfo.conj_subtype
local subtypes = typeinfo.subtypes
local perf_only = false
local function insert_inflection(infl, label)
for _, form in ipairs(infl) do
if rsub(form, "^[*%[%]|%-a-zA-ZĀāĒēĪīŌōŪūȲȳÄäËëÏïÖöÜüŸÿĂăĔĕĬĭŎŏŬŭ " .. accents .. "]+$", "") ~= "" then
table.insert(data.categories, "la-verb invalid parameters")
end
end
infl.label = label
table.insert(data.inflections, infl)
end
local inf = m_la_verb.get_valid_forms(conjdata.forms["pres_actv_inf"])
if #inf > 0 then
insert_inflection(inf, "不定法現在")
else
inf = m_la_verb.get_valid_forms(conjdata.forms["perf_actv_inf"])
if #inf > 0 then
perf_only = true
insert_inflection(inf, "不定法完了")
end
end
local depon = typeinfo.subtypes.depon or typeinfo.subtypes.semidepon
if not perf_only then
local perf
if depon then
local sup = m_la_verb.get_valid_forms(conjdata.forms["sup_acc"])
perf = {}
for _, form in ipairs(sup) do
if typeinfo.subtypes.impers then
form = rsub(form, "^(.*)m$", "[[%1s|%1m]] est")
elseif typeinfo.subtypes["3only"] then
form = rsub(form, "^(.*)m$", "[[%1s]] est")
else
form = rsub(form, "^(.*)m$", "[[%1s]] sum")
end
table.insert(perf, form)
end
else
perf = m_la_verb.get_valid_forms(conjdata.forms["1s_perf_actv_indc"])
if #perf == 0 then
perf = m_la_verb.get_valid_forms(conjdata.forms["3s_perf_actv_indc"])
end
end
if #perf > 0 then
insert_inflection(perf, "完了分詞")
end
end
if not depon then
local sup = m_la_verb.get_valid_forms(conjdata.forms["sup_acc"])
if #sup > 0 then
insert_inflection(sup, "スピーヌム")
else
local fap = m_la_verb.get_valid_forms(conjdata.forms["futr_actv_ptc"])
if #fap > 0 then
insert_inflection(fap, "未来分詞")
end
end
end
if conj == "1st" or subconj == "1st" then
table.insert(appendix, "[[付録:ラテン語 第一変化動詞|第一変化]]")
elseif conj == "2nd" or subconj == "2nd" then
table.insert(appendix, "[[付録:ラテン語 第二変化動詞|第二変化]]")
elseif conj == "3rd" or subconj == "3rd" then
table.insert(appendix, "[[付録:ラテン語 第三変化動詞|第三変化]]")
elseif conj == "3rd-io" or subconj == "3rd-io" then
table.insert(appendix, "[[付録:ラテン語 第三変化動詞|第三変化]] iō型")
elseif conj == "4th" or subconj == "4th" then
table.insert(appendix, "[[付録:ラテン語 第四変化動詞|第四変化]]")
elseif conj == "irreg" then --sum
table.insert(appendix, "[[付録:ラテン語 不規則動詞|不規則変化]]")
else
if NAMESPACE == "テンプレート" then
table.insert(appendix, "? declension")
else
table.insert(data.categories, "Latin verbs without the conjugation in their headwords")
end
end
if conj == "irreg" and subconj == "irreg" or subtypes.irreg then
--sum, volō, ferō etc.
table.insert(appendix, "[[不規則]]")
end
if subtypes.highlydef then
-- āiō, inquam
table.insert(appendix, "highly [[defective#English|defective]]")
end
if subtypes.perfaspres then
-- ōdī, meminī, commeminī
table.insert(appendix, "[[perfect#English|perfect]] forms have [[present#English|present]] meaning")
end
if subtypes.impers then
-- decet
-- advesperāscit (also nopass)
table.insert(appendix, "[[非人称]]")
end
if subtypes.nopass then
--coacēscō
table.insert(appendix, "[[所相]]なし")
end
if subtypes.depon then
-- dēmōlior
-- calvor (also noperf)
table.insert(appendix, "[[擬受動形]]")
end
if subtypes.semidepon then
-- fīdō, gaudeō
table.insert(appendix, "[[semi-deponent#English|semi-deponent]]")
end
if subtypes.optsemidepon then
-- audeō, placeō, soleō, pudeō
table.insert(appendix, "optionally [[semi-deponent#English|semi-deponent]]")
end
if subtypes.nosup and subtypes.noperf then
-- many verbs
table.insert(appendix, "[[完了形]]または[[スピーヌム]]なし")
elseif subtypes.noperf then
-- īnsolēscō etc.
table.insert(appendix, "[[完了形]]なし")
elseif subtypes.nosup then
-- deeō etc.
table.insert(appendix, "[[スピーヌム]]なし")
elseif subtypes.supfutractvonly then
-- sum, dēpereō, etc.
table.insert(appendix, "能相未来分詞を除き[[スピーヌム]]なし")
end
if typeinfo.subtypes.nopasvperf and not typeinfo.subtypes.nosup and
not typeinfo.subtypes.supfutractvonly then
table.insert(appendix, "所相完了形なし")
end
if subtypes.pass3only then
--praefundō
table.insert(appendix, "limited [[passive#English|passive]]")
end
if subtypes.passimpers then
--abambulō
table.insert(appendix, "所相で[[非人称]]")
end
if rfind(first_lemma, "faciō$") then
--faciō
table.insert(appendix, "不規則な[[所相]]")
end
if subtypes["3only"] then
--decet
table.insert(appendix,"第三人称のみ")
end
if subtypes.noimp then
--volō
table.insert(appendix, "[[命令法]]なし")
end
if rfind(first_lemma, "d[īū]cō$") then
--dīcō
table.insert(appendix, "irregular short [[imperative#English|imperative]]")
end
if subtypes.nofut then
--soleō
table.insert(appendix, "[[未来形]]なし")
end
end
pos_functions["suffixes-verb"] = pos_functions["verbs"]
local function adjectives(pos, def, args, data, infl_classes, appendix)
local is_num = pos == "numerals"
local decldata = require("モジュール:la-nominal").do_generate_adj_forms(
args, pos, true, def, is_num)
local lemma = decldata.overriding_lemma
local lemma_num = decldata.num == "pl" and "pl" or "sg"
if not lemma or #lemma == 0 then
lemma = decldata.forms["linked_nom_" .. lemma_num .. "_m"]
end
data.heads = lemma
data.id = decldata.id
if is_num then
process_num_type(decldata.num_type, data.categories)
end
if decldata.num == "pl" then
table.insert(data.categories, "ラテン語 複数形のみの" .. decldata.pos)
end
if decldata.indecl then
table.insert(data.inflections, {label = glossary_link("不変化")})
if decldata.pos == "分詞" then
if rfind(lemma[1], "[stxu]um$") then
table.insert(data.categories, "ラテン語 完了分詞")
end
end
else
local masc = decldata.forms["nom_" .. lemma_num .. "_m"]
local fem = decldata.forms["nom_" .. lemma_num .. "_f"]
local neut = decldata.forms["nom_" .. lemma_num .. "_n"]
local gen = decldata.forms["gen_" .. lemma_num .. "_m"]
if decldata.pos == "分詞" then
if rfind(masc[1], "ūrus$") then
table.insert(data.categories, "ラテン語 未来分詞")
elseif rfind(masc[1], "ndus$") then
-- FIXME, should rename to "Latin gerundives")
table.insert(data.categories, "ラテン語 所相未来分詞")
elseif rfind(masc[1], "[stxu]us$") then
table.insert(data.categories, "ラテン語 完了分詞")
elseif rfind(masc[1], "ns$") then
table.insert(data.categories, "ラテン語 現在分詞")
else
error("Unrecognized participle ending: " .. masc[1])
end
end
local function is_missing(form)
return not form or form == "" or form == "—" or #form == 0
end
-- We display the inflections in three different ways to mimic the
-- old way of doing things:
--
-- 1. If masc and fem are different, show masc, fem and neut.
-- 2. Otherwise, if masc and neut are different, show masc and neut.
-- 3. Otherwise, show masc nominative and masc genitive.
if not is_missing(fem) and not ut.equals(masc, fem) then
fem.label = "女性"
table.insert(data.inflections, fem)
if not is_missing(neut) then
neut.label = "中性"
table.insert(data.inflections, neut)
end
elseif not is_missing(neut) and not ut.equals(masc, neut) then
neut.label = "中性"
table.insert(data.inflections, neut)
elseif not is_missing(gen) then
gen.label = "属格"
table.insert(data.inflections, gen)
end
table.insert(infl_classes, decldata.title)
end
if #decldata.comp > 0 then
decldata.comp.label = "比較級"
table.insert(data.inflections, decldata.comp)
end
if #decldata.sup > 0 then
decldata.sup.label = "最上級"
table.insert(data.inflections, decldata.sup)
end
if #decldata.adv > 0 then
decldata.adv.label = "副詞"
table.insert(data.inflections, decldata.adv)
end
for _, cat in ipairs(decldata.categories) do
ut.insert_if_not(data.categories, cat)
end
for _, cat in ipairs(decldata.cat) do
ut.insert_if_not(data.categories, "ラテン語 " .. cat)
end
return decldata.pos
end
local function adjectives_comp(pos, def, args, data, infl_classes, appendix)
local params = {
[1] = {alias_of = 'head'},
[2] = {alias_of = 'pos'},
["head"] = {list = true, default = mw.title.getCurrentTitle().text},
["pos"] = {list = true},
["is_lemma"] = {type = "boolean"},
["id"] = {},
}
local args = require("モジュール:parameters").process(args, params)
data.heads = args.head
data.id = args.id
if args.is_lemma then
-- See below. This happens automatically by virtue of the default POS
-- unless we overrride it, which we do when is_lemma.
table.insert(data.categories, "ラテン語 比較級 " .. pos)
end
table.insert(infl_classes, "第三変化")
local n = {label = "中性"}
for _, head in ipairs(args.head) do
local neuter = mw.ustring.gsub(head, "or$", "us")
table.insert(n, neuter)
end
table.insert(data.inflections, n)
if #args.pos > 0 then
args.pos.label = "原級"
table.insert(data.inflections, args.pos)
end
if args.is_lemma then
-- If is_lemma, we're a comparative adjective without positive form,
-- so we're treated as a lemma. In that case, we return "adjectives" as
-- the part of speech, which will automatically categorize into
-- "Latin adjectives" and "Latin lemmas", otherwise we don't return
-- anything, which defaults to the passed-in POS (usually
-- "comparative adjectives"), which will automatically categorize into
-- that POS (e.g. "Latin comparative adjectives") and into
-- "Latin non-lemma forms".
return pos
end
end
local function adjectives_sup(pos, def, args, data, infl_classes, appendix)
local params = {
[1] = {alias_of = 'head'},
[2] = {alias_of = 'pos'},
["head"] = {list = true, default = mw.title.getCurrentTitle().text},
["pos"] = {list = true},
["is_lemma"] = {type = "boolean"},
["id"] = {},
}
local args = require("モジュール:parameters").process(args, params)
data.heads = args.head
data.id = args.id
if args.is_lemma then
-- See below. This happens automatically by virtue of the default POS
-- unless we overrride it, which we do when is_lemma.
table.insert(data.categories, "Latin superlative " .. pos)
end
table.insert(infl_classes, "第一変化")
table.insert(infl_classes, "第二変化")
local f, n = {label = "女性"}, {label = "中性"}
for _, head in ipairs(args.head) do
local stem = mw.ustring.gsub(head, "us$", "")
table.insert(f, stem .. "a")
table.insert(n, stem .. "um")
end
table.insert(data.inflections, f)
table.insert(data.inflections, n)
if #args.pos > 0 then
args.pos.label = "原級"
table.insert(data.inflections, args.pos)
end
if args.is_lemma then
-- If is_lemma, we're a superlative adjective without positive form,
-- so we're treated as a lemma. In that case, we return "adjectives" as
-- the part of speech, which will automatically categorize into
-- "Latin adjectives" and "Latin lemmas", otherwise we don't return
-- anything, which defaults to the passed-in POS (usually
-- "superlative adjectives"), which will automatically categorize into
-- that POS (e.g. "Latin superlative adjectives") and into
-- "Latin non-lemma forms".
return pos
end
end
pos_functions["形容詞"] = function(def, args, data, infl_classes, appendix)
return adjectives("形容詞", def, args, data, infl_classes, appendix)
end
pos_functions["形容詞 比較級"] = function(def, args, data, infl_classes, appendix)
return adjectives_comp("形容詞", def, args, data, infl_classes, appendix)
end
pos_functions["形容詞 最上級"] = function(def, args, data, infl_classes, appendix)
return adjectives_sup("形容詞", def, args, data, infl_classes, appendix)
end
pos_functions["分詞"] = function(def, args, data, infl_classes, appendix)
return adjectives("分詞", def, args, data, infl_classes, appendix)
end
pos_functions["限定詞"] = function(def, args, data, infl_classes, appendix)
return adjectives("限定詞", def, args, data, infl_classes, appendix)
end
pos_functions["代名詞"] = function(def, args, data, infl_classes, appendix)
return adjectives("代名詞", def, args, data, infl_classes, appendix)
end
pos_functions["suffixes-adjective"] = function(def, args, data, infl_classes, appendix)
return adjectives("接尾辞", def, args, data, infl_classes, appendix)
end
pos_functions["numerals-adjective"] = function(def, args, data, infl_classes, appendix)
return adjectives("数詞", def, args, data, infl_classes, appendix)
end
pos_functions["副詞"] = function(def, args, data, infl_classes, appendix)
local params = {
[1] = {alias_of = 'head'},
[2] = {alias_of = 'comp'},
[3] = {alias_of = 'sup'},
["head"] = {list = true, required = true},
["comp"] = {list = true},
["sup"] = {list = true},
["id"] = {},
}
local args = require("モジュール:parameters").process(args, params)
data.heads = args.head
data.id = args.id
local comp, sup
local irreg = false
if args.comp[1] == "-" then
comp = "-"
elseif #args.comp > 0 then
args.comp.label = glossary_link("比較級")
comp = args.comp
irreg = true
end
if args.comp[1] == "-" or args.sup[1] == "-" then
sup = "-"
elseif #args.sup > 0 then
args.sup.label = glossary_link("最上級")
sup = args.sup
irreg = true
end
if irreg then
table.insert(data.categories, "ラテン語 副詞 不規則変化")
end
if not comp or not sup then
local default_comp = {label = glossary_link("比較級")}
local default_sup = {label = glossary_link("最上級")}
for _, head in ipairs(args.head) do
local stem = nil
for _, suff in ipairs({"iter", "nter", "ter", "er", "iē", "ē", "im", "ō"}) do
stem = mw.ustring.match(head, "(.*)" .. suff .. "$")
if stem ~= nil then
if suff == "nter" then
stem = stem .. "nt"
suff = "er"
end
table.insert(default_comp, stem .. "ius")
table.insert(default_sup, stem .. "issimē")
break
end
end
if not stem then
error("Unrecognized adverb type, recognized types are “-ē”, “-er”, “-ter”, “-iter”, “-im”, or “-ō” or specify irregular forms or “-” if incomparable.")
end
end
comp = comp or default_comp
sup = sup or default_sup
end
if comp == "-" then
table.insert(data.inflections, {label = "比較形なし"})
table.insert(data.categories, "ラテン語 副詞 比較形なし")
else
table.insert(data.inflections, comp)
end
if sup == "-" then
if comp ~= "-" then
table.insert(data.inflections, {label = "[[最上級]]なし"})
end
else
table.insert(data.inflections, sup)
end
end
pos_functions["suffixes-adverb"] = pos_functions["副詞"]
local prepositional_cases = {
genitive = true, accusative = true, ablative = true,
}
pos_functions["前置詞"] = function(def, args, data, infl_classes, appendix, postscript)
local params = {
[1] = {list = true, required = true}, -- headword or cases
["head"] = {list = true},
["id"] = {},
}
local args = require("モジュール:parameters").process(args, params)
-- Case names are supplied in numbered arguments, optionally preceded by
-- headwords.
local cases = {}
while prepositional_cases[args[1][#args[1]]] do
table.insert(cases, 1, table.remove(args[1]))
end
for i = 1, #cases do
for j = i + 1, #cases do
if cases[i] == cases[j] then
error("Duplicate case")
end
end
local case = cases[i]
local appendix_link = glossary_link(case)
if i == 1 then
appendix_link = "+ " .. appendix_link
end
table.insert(postscript, appendix_link)
table.insert(data.categories, "ラテン語 " .. case .. " 前置詞")
end
for _, v in ipairs(args[1]) do
table.insert(args.head, 1, v)
end
data.heads = args.head
data.id = args.id
end
pos_functions["gerunds"] = function(def, args, data, infl_classes, appendix, postscript)
local params = {
[1] = {required = true, default = "labōrandum"}, -- headword
[2] = {}, -- gerundive
}
local args = require("モジュール:parameters").process(args, params)
data.heads = {args[1]}
table.insert(data.inflections, {label = "[[対格]]"})
local stem = rmatch(args[1], "^(.*)um$")
if not stem then
error("Unrecognized gerund ending: " .. stem)
end
if args[2] == "-" then
table.insert(data.inflections, {label = "no [[Appendix:Glossary#gerundive|gerundive]]"})
else
table.insert(data.inflections, {[1] = args[2] or stem .. "us", label = "[[Appendix:Glossary#gerundive|gerundive]]"})
end
end
local function non_lemma_forms(def, args, data, infl_classes, appendix, postscript)
local params = {
[1] = {required = true, default = def}, -- headword or cases
["head"] = {list = true, require_index = true},
["g"] = {list = true},
["id"] = {},
}
local args = require("モジュール:parameters").process(args, params)
local heads = {args[1]}
for _, head in ipairs(args.head) do
table.insert(heads, head)
end
data.heads = heads
data.genders = args.g
data.id = args.id
end
pos_functions["noun forms"] = non_lemma_forms
pos_functions["proper noun forms"] = non_lemma_forms
pos_functions["pronoun forms"] = non_lemma_forms
pos_functions["verb forms"] = non_lemma_forms
pos_functions["gerund forms"] = non_lemma_forms
pos_functions["adjective forms"] = non_lemma_forms
pos_functions["participle forms"] = non_lemma_forms
pos_functions["determiner forms"] = non_lemma_forms
pos_functions["numeral forms"] = non_lemma_forms
pos_functions["suffix forms"] = non_lemma_forms
return export
-- For Vim, so we get 4-space tabs
-- vim: set ts=4 sw=4 noet: