-- Common code between [[Module:hi-headword]] and [[Module:pa-headword]].
local export = {}
local m_links = require("Module:links")
export.pos_functions = {}
local rfind = mw.ustring.find
local rmatch = mw.ustring.match
local rsplit = mw.text.split
local function glossary_link(anchor, text)
text = text or anchor
return "[[Appendix:術語表#" .. anchor .. "|" .. text .. "]]"
end
local function process_genders(data, genders)
for _, g in ipairs(genders) do
if g == "m" or g == "f" or g == "m-p" or g == "f-p" or g == "mf" or g == "mf-p" or g == "mfbysense" or g == "mfbysense-p" or g == "?" then
table.insert(data.genders, g)
else
error("Invalid gender: " .. (g or "(nil)"))
end
end
end
export.pos_functions.adjectives = {
params = {
["comparative"] = {},
["superlative"] = {},
[1] = {alias_of = "comparative"},
[2] = {alias_of = "superlative"},
["f"] = {list = true},
["m"] = {list = true},
["ind"] = {type = "boolean"},
},
func = function(args, data)
if args["ind"] then
table.insert(data.inflections, {label = glossary_link("無屈折")})
table.insert(data.categories, data.langname .. "無屈折形容詞")
end
if args["comparative"] then
table.insert(data.inflections, {label = "比較級", args["comparative"]})
end
if args["superlative"] then
table.insert(data.inflections, {label = "最高級", args["superlative"]})
end
if #args["m"] > 0 then
args["m"].label = "陽性"
table.insert(data.inflections, args["m"])
end
if #args["f"] > 0 then
args["f"].label = "陰性"
table.insert(data.inflections, args["f"])
end
end,
}
export.pos_functions.ordinals = {
params = {
["f"] = {list = true},
["m"] = {list = true},
["ind"] = {type = "boolean"},
},
func = function(args, data)
data.pos_category = "形容詞"
table.insert(data.categories, data.langname .. "數詞")
if args["ind"] then
table.insert(data.inflections, {label = glossary_link("無屈折")})
table.insert(data.categories, data.langname .. "無屈折數詞")
end
if #args["m"] > 0 then
args["m"].label = "陽性"
table.insert(data.inflections, args["m"])
end
if #args["f"] > 0 then
args["f"].label = "陰性"
table.insert(data.inflections, args["f"])
end
end,
}
export.pos_functions.cardinals = {
params = {
["g"] = {list = true},
["sym"] = {list = true},
},
func = function(args, data)
data.pos_category = "數詞"
process_genders(data, args["g"])
if #args["sym"] > 0 then
args["sym"].label = "原生文字符號"
table.insert(data.inflections, args["sym"])
end
end,
}
local function nouns(plpos)
return {
params = {
["g"] = {list = true, default = "?"},
["pl"] = {list = true},
["f"] = {list = true},
["m"] = {list = true},
["ind"] = {type = "boolean"},
},
func = function(args, data)
process_genders(data, args["g"])
if args["ind"] then
if #args["pl"] > 0 then
error("不能同時指定 ind= 和 pl=")
end
table.insert(data.inflections, {label = glossary_link("無屈折")})
table.insert(data.categories, data.langname .. "無屈折" .. plpos)
elseif #args["pl"] > 0 then
args["pl"].label = "複數"
table.insert(data.inflections, args["pl"])
end
if #args["m"] > 0 then
args["m"].label = "陽性"
table.insert(data.inflections, args["m"])
end
if #args["f"] > 0 then
args["f"].label = "陰性"
table.insert(data.inflections, args["f"])
end
if #args["m"] > 0 or #args["f"] > 0 then
table.insert(data.categories, data.langname .. " " .. plpos .. " with other-gender equivalents")
end
end,
}
end
export.pos_functions["名詞"] = nouns("名詞")
export.pos_functions["專有名詞"] = nouns("專有名詞")
export.pos_functions.pronouns = {
params = {
["g"] = {list = true},
},
func = function(args, data)
process_genders(data, args["g"])
end,
}
export.pos_functions.verbs = {
params = {
[1] = {},
["g"] = {list = true},
},
func = function(args, data)
data.genders = args["g"]
if args[1] then
local label, cat
if args[1] == "t" then
label = "及物"
table.insert(data.categories, data.langname .. "及物動詞")
elseif args[1] == "i" then
label = "不及物"
table.insert(data.categories, data.langname .. "不及物動詞")
elseif args[1] == "d" then
label = "雙及物"
table.insert(data.categories, data.langname .. "雙及物動詞")
elseif args[1] == "it" or args[1] == "ti" then
label = "可及物可不及物"
table.insert(data.categories, data.langname .. "及物動詞")
table.insert(data.categories, data.langname .. "不及物動詞")
else
error("Unrecognized param 1=" .. args[1] .. ": Should be 'i' = intransitive, 't' = transitive, or 'it'/'ti' = ambitransitive")
end
table.insert(data.inflections, {label = glossary_link(label)})
end
local head = data.heads[1]
if head:find(" ") then
local base_verb = m_links.remove_links(head):gsub("^.* ", "")
table.insert(data.categories, "以" .. base_verb .. "構成的"..data.langname .. "複合動詞")
end
end,
}
local function pos_with_gender()
return {
params = {
["g"] = {list = true},
},
func = function(args, data)
data.genders = args["g"]
end,
}
end
export.pos_functions["數詞"] = pos_with_gender()
export.pos_functions["後綴"] = pos_with_gender()
export.pos_functions["形容詞變格形"] = pos_with_gender()
export.pos_functions["名詞變格形"] = pos_with_gender()
export.pos_functions["代詞變格形"] = pos_with_gender()
export.pos_functions["限定詞變格形"] = pos_with_gender()
export.pos_functions["動詞變位形式"] = pos_with_gender()
export.pos_functions["後置詞變格形"] = pos_with_gender()
export.pos_functions["代詞"] = export.pos_functions["pronouns"]
export.pos_functions["形容詞"] = export.pos_functions["adjectives"]
export.pos_functions["動詞"] = export.pos_functions["verbs"]
export.pos_functions["序數詞"] = export.pos_functions["ordinal"]
export.pos_functions["基數詞"] = export.pos_functions["cardinal"]
return export