Modul:kyn og tal
local export = {} local codes = {} codes["?"] = {type = "anna", display = '?'} -- Kyn codes["m"] = {type = "kyn", cat = "hannkyn POS", display = 'ha'} codes["ha"] = {type = "kyn", cat = "hannkyn POS", display = 'ha'} codes["f"] = {type = "kyn", cat = "hokyn POS", display = 'ho'} codes["ho"] = {type = "kyn", cat = "hokyn POS", display = 'ho'} codes["n"] = {type = "kyn", cat = "neuter POS", display = 'in'} codes["in"] = {type = "kyn", cat = "neuter POS", display = 'in'} -- Tal codes["s"] = {type = "tal", display = 'et'} codes["et"] = {type = "tal", display = 'et'} codes["d"] = {type = "tal", cat = "dualia tantum", display = 'tt'} codes["tt"] = {type = "tal", cat = "dualia tantum", display = 'tt'} codes["p"] = {type = "tal", cat = "pluralia tantum", display = 'mt'} codes["mt"] = {type = "tal", cat = "pluralia tantum", display = 'mt'}
local combined_codes = {} combined_codes["mf"] = {codes = {"m", "f"}} combined_codes["haho"] = {codes = {"m", "f"}} combined_codes["mfbysense"] = {codes = {"m", "f"}, cat = "hannkyn og hokyn POS etter kjensla"}
local codetype_cats = {} codetype_cats["kyn"] = "POS med fleire kyn"
function export.show_list(frame) local args = frame.args local lang = args["lang"]; if lang == "" then lang = nil end local list = {} local i = 1
while args[i] and args[i] ~= "" do table.insert(list, args[i]) i = i + 1 end
return export.format_list(list, lang) end
function export.format_list(specs, lang, pos_for_cat, sort_key) local text, cats = export.format_kyns(specs, lang, pos_for_cat) if #cats == 0 then return text end return text .. require("Module:utilities").format_categories(cats, lang, sort_key) end
function export.format_kyns(specs, lang, pos_for_cat) local formatted_specs = {} local categories = {} local seen_types = {} local category_text = "" local all_is_nounclass = nil
local function do_kyn_spec(spec, parts) local types = {}
for key, code in ipairs(parts) do if not codes[code] then error('The tag "' .. code .. '" in the gender specification "' .. spec.spec .. '" is not valid.') end
local typ = codes[code].type if typ ~= "other" and types[typ] then error('The gender specification "' .. spec.spec .. '" contains multiple tags of type "' .. typ .. '".') end types[typ] = true
if spec.qualifiers and #spec.qualifiers > 0 then parts[key] = require("Module:qualifier").format_qualifier(spec.qualifiers) .. " " .. codes[code].display else parts[key] = codes[code].display end
if lang and pos_for_cat then local cat = codes[code].cat if cat then table.insert(categories, lang:getCanonicalName() .. " " .. cat) end if seen_types[typ] and seen_types[typ] ~= code then cat = codetype_cats[typ] if cat then table.insert(categories, lang:getCanonicalName() .. " " .. cat) end end seen_types[typ] = code end end
if #parts == 1 then return parts[1] end return table.concat(parts, " ") end
for _, spec in ipairs(specs) do if type(spec) ~= "table" then spec = {spec = spec} end local is_nounclass if spec.spec:find("^[1-9]") or spec.spec:find("^c[^-]") then is_nounclass = true code = spec.spec:gsub("^c", "")
local text if code == "?" then text = '?' else text = '' .. code .. "" if lang and pos_for_cat then table.insert(categories, lang:getCanonicalName() .. " class " .. code .. " POS") end end local text_with_qual if spec.qualifiers and #spec.qualifiers > 0 then text_with_qual = require("Module:qualifier").format_qualifier(spec.qualifiers) .. " " .. text else text_with_qual = text end table.insert(formatted_specs, text_with_qual) else local parts = mw.text.split(spec.spec, "%-") local extra_cats = {}
local has_combined = false for _, code in ipairs(parts) do if combined_codes[code] then has_combined = true break end end
if not has_combined then table.insert(formatted_specs, do_kyn_spec(spec, parts)) else local all_parts = {{}}
for i, code in ipairs(parts) do if combined_codes[code] then local new_all_parts = {} for _, one_parts in ipairs(all_parts) do for _, one_code in ipairs(combined_codes[code].codes) do local new_combined_parts = mw.clone(one_parts) table.insert(new_combined_parts, one_code) table.insert(new_all_parts, new_combined_parts) end end all_parts = new_all_parts if lang and pos_for_cat then local extra_cat = combined_codes[code].cat if extra_cat then table.insert(extra_cats, lang:getCanonicalName() .. " " .. extra_cat) end end else for _, one_parts in ipairs(all_parts) do table.insert(one_parts, code) end end end
for _, parts in ipairs(all_parts) do table.insert(formatted_specs, do_kyn_spec(spec, parts)) end end
if #extra_cats > 0 then for _, cat in ipairs(extra_cats) do table.insert(categories, cat) end end
if lang then if spec.spec:find("?") then table.insert(categories, "Requests for kyn in " .. lang:getCanonicalName() .. " entries") end end
is_nounclass = false end
if all_is_nounclass == nil then all_is_nounclass = is_nounclass elseif all_is_nounclass ~= is_nounclass then error("Noun classes and kyns cannot be mixed. Please use either one or the other.") end end
if lang and pos_for_cat then for i, cat in ipairs(categories) do categories[i] = cat:gsub("POS", pos_for_cat) end end
if is_nounclass then return 'class ' .. table.concat(formatted_specs, "/") .. "", categories else return '' .. table.concat(formatted_specs, " eller ") .. "", categories end end
return export