Module:User:Benwing2/it-form of

-- This module implements. local export = {}

local m_table = require("Module:table") local rmatch = mw.ustring.match

local lang = require("Module:languages").getByCode("it")

local force_cat = true -- for testing; if true, categories appear in non-mainspace pages

local function glossary_link(entry, text) text = text or entry return "" .. text .. "" end

local pronoun_suffixes = { "mi", "me", "ti", "te", "si", "se", "ci", "ce", "vi", "ve", "gli", -- must precede li "glie", "lo", "la", "li", "le", "ne", } local pronoun_suffix_set = m_table.listToSet(pronoun_suffixes)

local conjunctive_pronouns = { ["me"] = "mi", ["te"] = "ti", ["se"] = "si", ["ce"] = "ci", ["ve"] = "vi", ["glie"] = "gli", }

local imp = glossary_link("imperative") .. " form" local inf = glossary_link("infinitive") local parts_of_speech = { ["ger"] = glossary_link("gerund"), ["inf"] = inf, ["inf1s"] = "first-person singular " .. inf, ["inf2s"] = "second-person singular " .. inf, ["inf1p"] = "first-person plural " .. inf, ["inf2p"] = "second-person plural " .. inf, ["imp2s"] = "second-person singular " .. imp, ["imp1p"] = "first-person plural " .. imp, ["imp2p"] = "second-person plural " .. imp, }

local pp = glossary_link("past") .. " " .. glossary_link("participle") local pres = glossary_link("present") .. " " .. glossary_link("indicative") .. " form" local phis = glossary_link("past historic") .. " form"

local archaic_parts_of_speech = { ["ppms"] = "masculine singular " .. pp, ["ppfs"] = "feminine singular " .. pp, ["ppmp"] = "masculine plural " .. pp, ["ppfp"] = "feminine plural " .. pp, ["presp"] = glossary_link("present") .. " " .. glossary_link("participle"), ["pres1s"] = "first-person singular " .. pres, ["pres2s"] = "second-person singular " .. pres, ["pres3s"] = "third-person singular " .. pres, ["pres1p"] = "first-person plural " .. pres, ["pres2p"] = "first-person plural " .. pres, ["pres3p"] = "first-person plural " .. pres, ["phis1s"] = "first-person singular " .. phis, ["phis2s"] = "second-person singular " .. phis, ["phis3s"] = "third-person singular " .. phis, ["phis1p"] = "first-person plural " .. phis, ["phis2p"] = "first-person plural " .. phis, ["phis3p"] = "first-person plural " .. phis, }

-- The main entry point. -- FIXME: Convert itprop to go through this. function export.it_compound(frame) local params = { [1] = {list = true}, ["inf"] = {}, ["pos"] = {}, ["t"] = {}, ["gloss"] = {alias_of = "t"}, ["sort"] = {}, ["pagename"] = {}, -- for testing }

local parargs = frame:getParent.args

local args = require("Module:parameters").process(parargs, params) local curtitle = mw.title.getCurrentTitle local pagename = args.pagename or curtitle.subpageText local base local prons = {} local suff = "" if #args[1] == 0 and not args.inf and not args.pos and curtitle.nsText == "Template" and curtitle.subpageText == "it-compound of" then pagename = "abbracciatela" args.pos = "imp2p" args.inf = "abbracciare" end if #args[1] > 0 then local ind if not pronoun_suffix_set[args[1][1]] then base = args[1][1] ind = 2 else ind = 1 end while ind <= #args[1] do			if not pronoun_suffix_set[args[1][ind]] then error("Unrecognized pronoun suffix '" .. args[1][ind] .. "'") end table.insert(prons, args[1][ind]) suff = suff .. args[1][ind] ind = ind + 1 end if not base then base = rmatch(pagename, "^(.*)" .. suff .. "$") if not base and args.pos == "inf" and args.inf then -- adeguarvisi, pron = vi, inf/base = adeguarsi base = args.inf end if not base then error("Unable to extract base form from pagename " .. pagename .. "; pagename should end in '" .. suff .. "'") end if base:find("r$") then base = base .. "e" end end else for _, pronsuf in ipairs(pronoun_suffixes) do base = rmatch(pagename, "^(.*)" .. pronsuf .. "$") if base then table.insert(prons, pronsuf) break end end if not base then error("Unable to extract pronominal suffix from pagename " .. pagename) end if base:find("r$") then base = base .. "e" end end local pos = args.pos if pos then if not parts_of_speech[pos] and not archaic_parts_of_speech[pos] then error("Unrecognized part of speech '" .. pos .. "'") end else if base:find("ndo$") then pos = "ger" elseif base:find("re$") then pos = "inf" elseif base:find("mo$") then pos = "imp1p" else error("Unable to determine part of speech of base '" .. base .. "'") end end local inf = args.inf if not inf then if pos == "inf" then inf = base elseif pos:find("^inf") then inf = base:gsub("[mtcv]i$", "si") elseif pos == "ger" and base:find("ando$") then inf = base:gsub("ando$", "are") else error("With part of speech '" .. pos .. "', must specify infinitive using inf=") end end

local parts = {} local posdesc = parts_of_speech[pos] local function ins(text) table.insert(parts, text) end if not posdesc then posdesc = archaic_parts_of_speech[pos] if not posdesc then error("Internal error: Unrecognized part of speech '" .. pos .. "'") end ins(" ") end table.insert(parts, "''compound of ") if pos == "inf" then ins("the infinitive ") else ins(", the ") ins(posdesc .. " of ,") end ins(" with ") local pronparts = {} for _, pron in ipairs(prons) do		if conjunctive_pronouns[pron] then table.insert(pronparts, "' (the conjunctive variant of ')") else table.insert(pronparts, "") end end if #pronparts == 1 then ins(pronparts[1]) else ins(m_table.serialCommaJoin(pronparts)) end ins("''") if args.t then ins(" " .. require("Module:links").format_link_annotations({lang = lang, gloss = args.t})) end local desc = mw.getCurrentFrame:preprocess(table.concat(parts)) return desc .. require("Module:utilities").format_categories({"Italian combined forms"}, lang, args.sort, nil, force_cat) end

return export