Module:qhv-headword: Difference between revisions

no edit summary
No edit summary
No edit summary
 
(21 intermediate revisions by the same user not shown)
Line 50: Line 50:


local function detect_gender(word)
local function detect_gender(word)
local ending = sub(word, -1)
local ending = word:sub(-1)
if find(word, "[aeioy]$") then
if word:find("illa$") then
return "aq"
elseif word:find("[aeioy]$") then
return "lun"
return "lun"
elseif ending == "r" then
elseif ending == "r" then
Line 85: Line 87:
local parent_args = frame:getParent().args
local parent_args = frame:getParent().args
local head = parent_args["head"]; if head == "" then head = nil end
local head = parent_args["head"] or PAGENAME:match("%s") and require("Module:linkeach").link_for_modules(PAGENAME) or nil
local poscat = frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.")
local poscat = frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.")
Line 92: Line 94:
local data = {
local data = {
lang = lang,
lang = lang,
heads = {head},
heads = head,
inflections = {},
inflections = {},
genders = {},
genders = {},
Line 121: Line 123:
local args = require("Module:parameters").process(args, params)
local args = require("Module:parameters").process(args, params)
data.heads = {args["head"]}
--data.heads = {args["head"]}
table.insert(data.genders, args[1])
table.insert(data.genders, args[1])
Line 157: Line 159:
[3] = {list = "sup"},
[3] = {list = "sup"},
["unc"] = {type = "boolean"},
["unc"] = {type = "boolean"},
["indecl"] = {type = "boolean"},
["head"] = {},
["head"] = {},
}
}
local args = require("Module:parameters").process(args, params)
local args = require("Module:parameters").process(args, params)
local isdet = data.pos_category == "determiners"
data.heads = {args["head"]}
data.heads = {args["head"]}
table.insert(data.categories, "High Valyrian " .. data.pos_category)
table.insert(data.categories, "High Valyrian " .. data.pos_category)
if args["unc"] then
if args["unc"] or isdet then
table.insert(data.inflections, {label = "not " .. glossary_link("comparable")})
table.insert(data.inflections, {label = "not " .. glossary_link("comparable")})
table.insert(data.categories, "High Valyrian uncomparable adjectives")
if not isdet then table.insert(data.categories, "High Valyrian uncomparable adjectives") end
elseif args["indecl"] then
table.insert(data.inflections, {label = glossary_link("indeclinable")})
table.insert(data.categories, "High Valyrian indeclinable " .. data.pos_category)
else
else
args[1] = require("Module:qhv-adj/head").fetch("eq")
args[1] = require("Module:qhv-adj/head").fetch("eq")
args[2] = require("Module:qhv-adj/head").fetch("comp")
args[2] = require("Module:qhv-adj/head").fetch("comp")
args[3] = require("Module:qhv-adj/head").fetch("sup")
args[3] = require("Module:qhv-adj/head").fetch("sup")
args[1].label = "[[wikt:Appendix:Glossary#equative|equative]]"
args[2].label = "[[wikt:Appendix:Glossary#comparative|comparative]]"
args[1].label = glossary_link("equative")
args[3].label = "[[wikt:Appendix:Glossary#suoerlative|superlative]]"
args[2].label = glossary_link("comparative")
args[3].label = glossary_link("superlative")
table.insert(data.inflections, args[1])
table.insert(data.inflections, args[1])
Line 183: Line 191:


pos_functions["proper nouns"] = pos_functions.nouns
pos_functions["proper nouns"] = pos_functions.nouns
pos_functions["determiners"] = pos_functions.adjectives


pos_functions.verbs = function(class, args, data)
pos_functions.verbs = function(class, args, data)
if args[2] then -- old-style
local params = {
local params = {
[1] = {list = "pres"},
[1] = {list = "pres", required = true},
[2] = {list = "subj"},
["pres_qual"] = {list = "pres=_qual", allow_holes = true},
[3] = {list = "pp"},
[2] = {list = "past", required = true},
["head"] = {},
["past_qual"] = {list = "past=_qual", allow_holes = true},
}
[3] = {list = "pp", required = true},
["pp_qual"] = {list = "pp=_qual", allow_holes = true},
local args = require("Module:parameters").process(args, params)
[4] = {list = "pastsubj"},
data.heads = {args["head"]}
["pastsubj_qual"] = {list = "pastsubj=_qual", allow_holes = true},
["aux"] = {list = true},
table.insert(data.categories, "High Valyrian " .. data.pos_category)
["aux_qual"] = {list = "aux=_qual", allow_holes = true},
["head"] = {list = true},
args[1] = require("Module:qhv-verb/head").fetch("act_ind_prs_1sg")
["class"] = {list = true},
args[2] = require("Module:qhv-verb/head").fetch("act_sub_prs_1sg")
}
args[3] = require("Module:qhv-verb/head").fetch("act_part_prf")
 
local args = require("Module:parameters").process(args, params)
args[1].label = "first-person singular present indicative"
data.heads = args["head"]
args[2].label = "first-person singular present subjunctive"
 
args[3].label = "perfect participle"
local function collect_forms(label, accel_form, forms, qualifiers)
if forms[1] == "-" then
table.insert(data.inflections, args[1])
return {label = "no " .. label}
table.insert(data.inflections, args[2])
else
table.insert(data.inflections, args[3])
local into_table = accel_form and {label = label, accel = {form = accel_form}} or {label = label}
for i, form in ipairs(forms) do
table.insert(into_table, {term = form, qualifiers = qualifiers[i] and {qualifiers[i]} or nil})
end
return into_table
end
end
 
if #args.class > 0 then
local class_descs, cats = require("Module:de-verb").process_verb_classes(args.class)
for _, cats in ipairs(cats) do
table.insert(data.categories, cats)
end
table.insert(data.inflections, {label = require("Module:table").serialCommaJoin(class_descs, {conj = "or"})})
end
table.insert(data.inflections, collect_forms("third-person singular present", "3|s|pres", args[1], args.pres_qual))
table.insert(data.inflections, collect_forms("past tense", "1//3|s|pret", args[2], args.past_qual))
table.insert(data.inflections, collect_forms("past participle", "perf|part", args[3], args.pp_qual))
if #args[4] > 0 then
table.insert(data.inflections, collect_forms("past subjunctive", "1//3|s|sub|II", args[4], args.pastsubj_qual))
end
if #args.aux > 0 then
table.insert(data.inflections, collect_forms("auxiliary", nil, args.aux, args.aux_qual))
end
return
end
 
local function get_headword_inflection(forms, label, accel_form)
if forms then
local inflection = accel_form and {label = label, accel = {form = accel_form}} or {label = label}
for _, form in ipairs(forms) do
local qualifiers
if form.footnotes then
qualifiers = {}
for _, footnote in ipairs(form.footnotes) do
footnote = footnote:gsub("^%[(.*)%]$", "%1")
table.insert(qualifiers, footnote)
end
end
table.insert(inflection, {term = form.form, qualifiers = qualifiers})
end
return inflection
elseif label then
return {label = "no " .. label}
else
return {}
end
end
 
local alternant_multiword_spec = require("Module:de-verb").do_generate_forms(args, "from headword")
for _, cat in ipairs(alternant_multiword_spec.categories) do
table.insert(data.categories, cat)
end
table.insert(data.inflections, {label = table.concat(alternant_multiword_spec.verb_types, " or ")})
 
if #data.heads == 0 then
for _, head in ipairs(alternant_multiword_spec.forms.infinitive_linked) do
table.insert(data.heads, head.form)
end
end
table.insert(data.inflections, get_headword_inflection(alternant_multiword_spec.forms.pres_3s,
"third-person singular present", "3|s|pres"))
local pret_3s = alternant_multiword_spec.forms.pret_3s
table.insert(data.inflections, get_headword_inflection(pret_3s, "past tense", "1//3|s|pret"))
table.insert(data.inflections, get_headword_inflection(alternant_multiword_spec.forms.perf_part,
"past participle", "perf|part"))
-- See if we need the past subjunctive, i.e. there exist past subjunctive forms whose stem is not the
-- same as some past tense form. To facilitate comparison, we truncate final -e in both preterite 3s
-- and past subjunctive 3s, to handle cases like subjunctive 'ginge aus' vs. preterite 'ging aus'.
-- We need to compare 3s forms (and not e.g. 3p forms, where the issue with truncating -e doesn't
-- occur) so we work correctly with impersonal verbs.
local need_past_subj
local truncated_pret_3s_forms = {}
if pret_3s then
for _, form in ipairs(pret_3s) do
local truncated_form = form.form:gsub("e$", ""):gsub("e ", " ") -- discard 2nd retval
table.insert(truncated_pret_3s_forms, truncated_form)
end
end
local subii_3s = alternant_multiword_spec.forms.subii_3s
local truncated_subii_3s_forms = {}
if subii_3s then
for _, form in ipairs(subii_3s) do
local truncated_form = form.form:gsub("e$", ""):gsub("e ", " ") -- discard 2nd retval
table.insert(truncated_subii_3s_forms, truncated_form)
end
end
for _, past_subj_form in ipairs(truncated_subii_3s_forms) do
local saw_same = false
for _, pret_3s_form in ipairs(truncated_pret_3s_forms) do
if past_subj_form == pret_3s_form then
saw_same = true
break
end
end
if not saw_same then
need_past_subj = true
break
end
end
if need_past_subj then
table.insert(data.inflections, get_headword_inflection(subii_3s, "past subjunctive", "1//3|s|sub|II"))
end
 
local auxes = alternant_multiword_spec.forms.aux
table.insert(data.inflections, get_headword_inflection(auxes, "auxiliary"))
end
end


return export
return export