Module:Gender and number

--[=[	This module creates standardised displays for gender and number. It converts a gender specification into Wiki/HTML format. A gender specification is a list of one of the elements listed below, separated by hyphens. Examples are: "c", "n", "f-p", "m-an-p" ]=]--

local export = {}

local codes = {}

-- A list of all possible "parts" that a specification can be made out of.

codes["?"] = {type = "other", display = '? '}

-- Genders codes["m"] = {type = "gender", display = 'm '} codes["f"] = {type = "gender", display = 'f '} codes["n"] = {type = "gender", display = 'n '} codes["c"] = {type = "gender", display = 'c '}

-- Animacy codes["an"] = {type = "animacy", display = ' anim '} codes["in"] = {type = "animacy", display = ' inan '}

-- Personal codes["pr"] = {type = "personal", display = ' pers '} codes["np"] = {type = "personal", display = 'npers '}

-- Numbers codes["s"] = {type = "number", display = 'sg '} codes["d"] = {type = "number", display = ' du '} codes["p"] = {type = "number", display = 'pl '}

-- Verb qualifiers codes["impf"] = {type = "perfectivity", display = 'impf '} codes["pf"] = {type = "perfectivity", display = 'pf '}

-- Version of format_list that can be invoked from a template. 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

-- Format one or more gender specifications, in the form of a table of specifications. function export.format_list(list, lang) local is_nounclass = nil -- Iterate over each specification and format it	for key, spec in ipairs(list) do		local nc		list[key], nc = export.format_specification(spec, lang) -- Ensure that the specifications are either all noun classes, or none are. if is_nounclass == nil then is_nounclass = nc		elseif is_nounclass ~= nc then error("Noun classes and genders cannot be mixed. Please use either one or the other.") end end if is_nounclass then -- Add the processed codes together with slashes return "class " .. table.concat(list, "/") .. " "	else -- Add the processed codes together with commas return "" .. table.concat(list, " or ") .. " "	end end

-- Format the sub-parts of a single gender specification. function export.format_specification(spec, lang) local categories = "" local ret = "" local is_nounclass = false -- If the specification starts with cX, then it is a noun class specification. if spec:find("^[1-9]") or spec:find("^c[^-]") then is_nounclass = true code = spec:gsub("^c", "") if code == "?" then ret = "? " else ret = "" .. code .. " "		end else local types = {} -- Split the parts and iterate over each part, converting it into its display form local parts = mw.text.split(spec, "-") for key, code in ipairs(parts) do -- Is this code valid? if not codes[code] then error("The gender specification \"" .. spec .. "\" is not valid.") end if codes[code].type ~= "other" and types[codes[code].type] then --require("Module:debug").track("gender and number/multiple") --require("Module:debug").track("gender and number/multiple/" .. spec) error("The gender specification \"" .. spec .. "\" contains multiple tags of type \"" .. codes[code].type .. "\".") end parts[key] = codes[code].display types[codes[code].type] = true end -- Add the processed codes together with non-breaking spaces ret = table.concat(parts, " ") end -- Do some additional checks if a language was given if lang then -- Is this an incomplete gender? if spec:find("?") then local m_utilities = require("Module:utilities") categories = m_utilities.format_categories({lang:getCanonicalName .. " terms with incomplete gender"}, nil) end -- Check if the specification is valid --elseif langinfo.genders then --	local valid_genders = {} --	for _, g in ipairs(langinfo.genders) do valid_genders[g] = true end --			--	if not valid_genders[spec] then --		local valid_string = {} --		for i, g in ipairs(langinfo.genders) do valid_string[i] = g end --		error("The gender specification \"" .. spec .. "\" is not valid for " .. langinfo.names[1] .. ". Valid are: " .. table.concat(valid_string, ", ")) --	end --end end return ret .. categories, is_nounclass end

return export