| Module:ca-headword Mar 25th 2013, 02:37 | | | | Line 231: | Line 231: | | | local past_part = "" | | local past_part = "" | | | | | | | − | if conjtype == "" and not PAGENAME:find(" ") then | + | local base = PAGENAME:gsub("r%-se$", "r"):gsub("re's$", "re") | | − | if PAGENAME:find("ar$") or PAGENAME:find("ar%-se") then | + | | | | + | if conjtype == "" and not base:find(" ") then | | | + | if base:find("ar$") then | | | conjtype = "ar" | | conjtype = "ar" | | | table.insert(categories, "CodeCat's test category") | | table.insert(categories, "CodeCat's test category") | | − | elseif PAGENAME:find("ir$") or PAGENAME:find("ir%-se") then | + | elseif base:find("ir$") and not base:find("[tv]enir$") then | | | conjtype = "ir" | | conjtype = "ir" | | | table.insert(categories, "CodeCat's test category") | | table.insert(categories, "CodeCat's test category") | | Line 242: | Line 242: | | | | | | | | if conjtype ~= "" then | | if conjtype ~= "" then | | − | local base = PAGENAME:gsub("r%-se$", "r"):gsub("re's$", "re") | | | − | | | | | if conjtype == "ar" then | | if conjtype == "ar" then | | | local stem = base:gsub("ar$", "") | | local stem = base:gsub("ar$", "") | local com = require("Module:ca-common") local gen = require("Module:gender and number") -- A list of valid gender codes, used by nouns local valid_genders = {} valid_genders["m"] = true valid_genders["f"] = true valid_genders["m-p"] = true valid_genders["f-p"] = true local export = {} -- The main entry point. -- This is the only function that can be invoked from a template. function export.show(frame) local args = frame:getParent().args PAGENAME = frame:preprocess("{{PAGENAME}}") NAMESPACE = frame:preprocess("{{NAMESPACE}}") local ret = "" local categories = {} -- The part of speech. This is also the name of the category that -- entries go in. However, the two are separate (the "cat" parameter) -- because you sometimes want something to behave as an adjective without -- putting it in the adjectives category. local poscat = frame.args[1] or error("Part of speech has not been specified. Please pass parameter 1 to the module invocation.") if poscat == "nouns" then ret, categories = noun(args) elseif poscat == "proper nouns" then ret, categories = noun_gender(args) elseif poscat == "adjectives" then ret, categories = adjective(args) elseif poscat == "verbs" then ret, categories = verb(args) elseif poscat == "numerals" then ret, categories = numeral(args) end ret = "<strong class=\"headword\" lang=\"ca\">" .. (args["head"] or PAGENAME) .. "</strong>" .. ret table.insert(categories, 1, "Catalan " .. (args["cat"] or poscat)) if args["sort"] then table.insert(categories, "CodeCat's test category") end if NAMESPACE == "" then local sort_key = com.sort_key(PAGENAME) for key, cat in ipairs(categories) do ret = ret .. "[[Category:" .. cat .. "|" .. sort_key .. "]]" end end return ret end -- Display information for a noun's gender -- This is separate so that it can also be used for proper nouns function noun_gender(args) local ret = " " local categories = {} local gender = args[1] or "" if valid_genders[gender] then ret = ret .. gen.format({gender}) if gender == "m-p" or gender == "f-p" then table.insert(categories, "Catalan pluralia tantum") end elseif gender == "mf" then ret = ret .. gen.format({"m", "f"}) else ret = ret .. "<span class=\"gender\" title=\"gender unspecified\">''?''</span>" table.insert(categories, "Catalan nouns lacking gender") end if not PAGENAME:find(" ") then if PAGENAME:find("a$") and (gender == "m" or gender == "mf") then table.insert(categories, "Catalan masculine nouns ending in -a") elseif not (PAGENAME:find("a$") or PAGENAME:find("ió$") or PAGENAME:find("tat$") or PAGENAME:find("tud$") or PAGENAME:find("[dt]riu$")) and gender == "f" then table.insert(categories, "Catalan feminine nouns with no feminine ending") end end return ret, categories end -- Display additional inflection information for a noun function noun(args) local ret = "" local categories = {} local gender = args[1] or "" -- Gender ret, categories = noun_gender(args) ret = ret .. " (" -- Plural if gender == "m-p" or gender == "f-p" then ret = ret .. "''[[Appendix:Glossary#plurale tantum|plurale tantum]]''" else local plural = args[2] or "" if plural == "-" then ret = ret .. "''[[Appendix:Glossary#uncountable|uncountable]]''" table.insert(categories, "Catalan uncountable nouns") else local plural2 = args["pl2"] or "" local p, p2 = make_plural(PAGENAME, gender) if plural == "" then plural = p end if plural2 == "" then plural2 = p2 or "" end ret = ret .. "''plural'' <span class=\"form-of plural-form-of lang-ca\">" .. com.link_form(plural, "b") .. "</span>" if plural2 ~= "" then ret = ret .. " ''or'' <span class=\"form-of plural-form-of lang-ca\">" .. com.link_form(plural2, "b") .. "</span>" end end end -- Gendered forms local feminine = args["f"] or "" if feminine ~= "" then ret = ret .. ", ''feminine'' " .. com.link_form(feminine, "b") end local masculine = args["m"] or "" if masculine ~= "" then ret = ret .. ", ''masculine'' " .. com.link_form(masculine, "b") end ret = ret .. ")" return ret, categories end -- Display additional inflection information for an adjective function adjective(args) local ret = " " local categories = {} local feminine = args[1] or "" local masculine_plural = "" local masculine_plural2 = "" local feminine_plural = "" -- Invariable adjectives if feminine == "inv" then table.insert(categories, "Catalan invariable adjectives") ret = ret .. gen.format({"m", "f"}) .. " (''invariable'')" else -- Adjectives with identical forms in the masculine and feminine singular if feminine == "mf" or PAGENAME:find("a$") then feminine = PAGENAME table.insert(categories, "Catalan epicene adjectives") -- Adjectives ending in -ç behave as mf-type in the singular, but -- regular type in the plural. if PAGENAME:find("ç$") then masculine_plural = make_plural(PAGENAME, "m") feminine_plural = make_plural(PAGENAME .. "a", "f") else masculine_plural = make_plural(PAGENAME, "m") feminine_plural = masculine_plural end -- Has anyone provided forms to override the defaults? masculine_plural = args["pl"] or masculine_plural feminine_plural = args["pl"] or feminine_plural masculine_plural2 = args["pl2"] or masculine_plural2 -- Adjectives with distinct masculine and feminine singular forms -- (the majority) else if feminine == "" then feminine = make_feminine(PAGENAME) end feminine_plural = make_plural(feminine, "f") -- If the feminine ends in -ssa, assume that the -ss- is also in the -- masculine plural form if feminine:find("ssa$") then masculine_plural = feminine:gsub("a$", "os") elseif feminine == PAGENAME .. "na" then masculine_plural = PAGENAME .. "ns" -- Adjectives in -ig have two masculine plural forms, one derived from -- the m.sg. and the other derived from the f.sg. elseif PAGENAME:find("ig$") then masculine_plural = PAGENAME .. "s" masculine_plural2 = feminine:gsub("ja$", "jos") else masculine_plural, masculine_plural2 = make_plural(PAGENAME, "m") end end -- Display the forms if feminine == PAGENAME then ret = ret .. gen.format({"m", "f"}) .. " (" else ret = ret .. gen.format({"m"}) .. " (''feminine'' <span class=\"form-of positive-form-of gender-f lang-ca\" lang=\"ca\">" .. com.link_form(feminine, "b") .. "</span>, " end if masculine_plural == feminine_plural then ret = ret .. "''masculine and feminine plural'' <span class=\"form-of positive-form-of lang-ca gender-mfpl\" lang=\"ca\">" .. com.link_form(masculine_plural, "b") .. "</span>" if masculine_plural2 ~= "" then ret = ret .. " ''or'' <span class=\"form-of positive-form-of lang-ca gender-mfpl\" lang=\"ca\">" .. com.link_form(masculine_plural2, "b") .. "</span>" end else ret = ret .. "''masculine plural'' <span class=\"form-of positive-form-of gender-mpl lang-ca\" lang=\"ca\">" .. com.link_form(masculine_plural, "b") .. "</span>" if masculine_plural2 ~= "" then ret = ret .. " ''or'' <span class=\"form-of positive-form-of lang-ca gender-mpl\" lang=\"ca\">" .. com.link_form(masculine_plural2, "b") .. "</span>" end ret = ret .. ", ''feminine plural'' <span class=\"form-of positive-form-of gender-fpl lang-ca\" lang=\"ca\">" .. com.link_form(feminine_plural, "b") .. "</span>" end ret = ret .. ")" end return ret, categories end -- Display additional inflection information for a verb function verb(args) local ret = "" local categories = {} local conjtype = args[1] or "" local pres_1_sg = "" local past_part = "" local base = PAGENAME:gsub("r%-se$", "r"):gsub("re's$", "re") if conjtype == "" and not base:find(" ") then if base:find("ar$") then conjtype = "ar" table.insert(categories, "CodeCat's test category") elseif base:find("ir$") and not base:find("[tv]enir$") then conjtype = "ir" table.insert(categories, "CodeCat's test category") end end if conjtype ~= "" then if conjtype == "ar" then local stem = base:gsub("ar$", "") pres_1_sg = stem .. "o" past_part = stem .. "at" elseif conjtype == "ir" then local stem = base:gsub("ir$", "") pres_1_sg = stem .. "eixo" if stem:find("[aeiou]$") and not stem:find("[gq]u$") then past_part = stem .. "ït" else past_part = stem .. "it" end else error("'" .. conjtype .. "' is not a valid conjugation type") end elseif PAGENAME:find("[ai]r$") or PAGENAME:find("[ai]r%-se") then --table.insert(categories, "CodeCat's test category") end --if args["pres_1_sg"] == pres_1_sg then pres_1_sg = args["pres_1_sg"] or pres_1_sg past_part = args["past_part"] or past_part if pres_1_sg ~= "" and past_part ~= "" then ret = ret .. " (''first-person singular present'' " .. com.link_form(pres_1_sg, "b") .. ", " ret = ret .. "''past participle'' " .. com.link_form(past_part, "b") .. ")" end return ret, categories end -- Display additional inflection information for a numeral function numeral(args) local ret = " " local categories = {} local feminine = args[1] or "" local noun_form = args[2] or "" if feminine ~= "" then ret = ret .. gen.format({"m"}) .. " (''feminine'' " .. com.link_form(feminine, "b") if noun_form ~= "" then ret = ret .. ", ''noun form'' " .. com.link_form(noun_form, "b") end ret = ret .. ")" else ret = ret .. gen.format({"m", "f"}) end return ret, categories end function make_feminine(base) if base:find("a$") then return base end if base:find("o$") then return (base:gsub("o$", "a")) end if base:find("ce$") then return (base:gsub("ce$", "ça")) end if base:find("que$") then return (base:gsub("que$", "ca")) end if base:find("qüe$") then return (base:gsub("qüe$", "qua")) end if base:find("ge$") then return (base:gsub("ge$", "ja")) end if base:find("gue$") then return (base:gsub("gue$", "ga")) end if base:find("güe$") then return (base:gsub("güe$", "gua")) end if base:find("e$") then return (base:gsub("e$", "a")) end if base:find("[aeiou]u$") then return (base:gsub("u$", "v")) .. "a" end if base:find("à$") then return (base:gsub("à$", "ana")) end if base:find("è$") then return (base:gsub("è$", "ena")) end if base:find("é$") then return (base:gsub("é$", "ena")) end if base:find("ò$") then return (base:gsub("ò$", "ona")) end if base:find("ó$") then return (base:gsub("ó$", "ona")) end if base:find("[gq]uí$") then return (base:gsub("í$", "ina")) end if base:find("[aeiou]í$") then return (base:gsub("í$", "ïna")) end if base:find("í$") then return (base:gsub("í$", "ina")) end if base:find("ú$") then return (base:gsub("ú$", "una")) end if base:find("às$") then return (base:gsub("às$", "asa")) end if base:find("ès$") then return (base:gsub("ès$", "esa")) end if base:find("és$") then return (base:gsub("és$", "esa")) end if base:find("òs$") then return (base:gsub("òs$", "osa")) end if base:find("ós$") then return (base:gsub("ós$", "osa")) end if base:find("[gq]uís$") then return (base:gsub("ís$", "isa")) end if base:find("[aeiou]ís$") then return (base:gsub("ís$", "ïsa")) end if base:find("ís$") then return (base:gsub("ís$", "isa")) end if base:find("ús$") then return (base:gsub("ús$", "usa")) end return base .. "a" end function make_plural(base, gender) -- The extra brackets are needed because gsub returns a pair, but this -- function should only return a single value if base:find("ça$") then return (base:gsub("ça$", "ces")), "" end if base:find("ca$") then return (base:gsub("ca$", "ques")), "" end if base:find("qua$") then return (base:gsub("qua$", "qües")), "" end if base:find("ja$") then return (base:gsub("ja$", "ges")), "" end if base:find("ga$") then return (base:gsub("ga$", "gues")), "" end if base:find("gua$") then return (base:gsub("gua$", "gües")), "" end if base:find("a$") then return (base:gsub("a$", "es")), "" end if base:find("à$") then return (base:gsub("à$", "ans")), "" end if base:find("è$") then return (base:gsub("è$", "ens")), "" end if base:find("é$") then return (base:gsub("é$", "ens")), "" end if base:find("ò$") then return (base:gsub("ò$", "ons")), "" end if base:find("ó$") then return (base:gsub("ó$", "ons")), "" end if base:find("[gq]uí$") then return (base:gsub("í$", "ins")), "" end if base:find("[aeiou]í$") then return (base:gsub("í$", "ïns")), "" end if base:find("í$") then return (base:gsub("í$", "ins")), "" end if base:find("ú$") then return (base:gsub("ú$", "uns")), "" end if gender == "m" or gender == "mf" then if base:find("às$") then return (base:gsub("às$", "asos")), "" end if base:find("ès$") then return (base:gsub("ès$", "esos")), "" end if base:find("és$") then return (base:gsub("és$", "esos")), "" end if base:find("òs$") then return (base:gsub("òs$", "osos")), "" end if base:find("ós$") then return (base:gsub("ós$", "osos")), "" end if base:find("[gq]uís$") then return (base:gsub("ís$", "isos")), "" end if base:find("[aeiou]ís$") then return (base:gsub("ís$", "ïsos")), "" end if base:find("ís$") then return (base:gsub("ís$", "isos")), "" end if base:find("ús$") then return (base:gsub("ús$", "usos")), "" end if base:find("s$") or base:find("ç$") or base:find("x$") or base:find("z$") then return base .. "os", "" end if base:find("sc$") or base:find("st$") or base:find("xt$") then return base .. "s", base .. "os" end end if gender == "f" then if base:find("s$") then return base end if base:find("sc$") or base:find("st$") or base:find("xt$") then return base .. "s", base .. "es" end end return base .. "s", "" end return export | |