Module:User:Benwing2/it-etymology

local export = {}

local m_links = require("Module:User:Benwing2/links") local affix_module = "Module:User:Benwing2/affix" local com_module = "Module:it-common" local parameter_utilities_module = "Module:User:Benwing2/parameter utilities" local romance_etymology_module = "Module:User:Benwing2/romance etymology" local table_module = "Module:table"

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

local rfind = mw.ustring.find local rsplit = mw.text.split local u = mw.ustring.char

local force_cat = false -- set to true for testing

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

local function looks_like_infinitive(term) return term:find("[aei]re$") end

local function form_imperative(imp, inf, parse_err) if imp ~= "+" then parse_err(("Unrecognized imperative spec '%s'"):format(imp)) end local stem, ending = inf:match("^(.*)([aei]re)$") if not stem then parse_err(("Unrecognized infinitive '%s', doesn't end in -are, -ere or -ire"):format(inf)) end if ending == "are" then return stem .. "a" else return stem .. "i" end end

local function form_plural(pl, term, parse_err) if pl ~= "1" then parse_err(("Unrecognized plural spec '%s'"):format(pl)) end -- "Guess" a gender based on the ending. We can't pass in a "?" because then we'll get an error on terms -- ending in -a because they have different plurals depending on the gender. local gender = term:find("a$") and "f" or "m" return require(com_module).make_plural(term, gender) end

function export.it_verb_obj(frame) local data = { lang = lang, looks_like_infinitive = looks_like_infinitive, default_args = {"lavare", "piatto"}, make_plural = form_plural, make_imperative = form_imperative, }	return require(romance_etymology_module).verb_obj(data, frame) end

function export.it_verb_verb(frame) local data = { lang = lang, looks_like_infinitive = looks_like_infinitive, default_args = {"lavare", "asciugare"}, make_plural = form_plural, make_imperative = form_imperative, }	return require(romance_etymology_module).verb_verb(data, frame) end

function export.it_deverbal(frame) local parent_args = frame:getParent.args

local params = { [1] = {required = true, list = true, disallow_holes = true}, ["nocap"] = {type = "boolean"}, ["notext"] = {type = "boolean"}, ["nocat"] = {type = "boolean"}, ["sort"] = {}, ["pagename"] = {}, -- for testing }

local m_param_utils = require(parameter_utilities_module)

local param_mods = m_param_utils.construct_param_mods { {group = "link", exclude = {"tr", "ts", "sc"}}, -- tr, ts, sc not relevant for Italian -- separate_no_index for compatibility (at least for q/qq); FIXME: consider changing? {group = {"q", "l", "ref"}, separate_no_index = false}, }

local items, args = m_param_utils.process_list_arguments { params = params, param_mods = param_mods, raw_args = parent_args, process_args_before_parsing = function(args) if not args[1][1] then local NAMESPACE = mw.title.getCurrentTitle.nsText if NAMESPACE == "Template" then table.insert(args[1], "cozzare") args.pagename = "cozzo" else error("Internal error: Something went wrong with Module:parameters; it should not allow zero numbered arguments") end end end, termarg = 1, parse_lang_prefix = true, track_module = "it-etymology", lang = lang, }

local pagename = args.pagename or mw.loadData("Module:headword/data").pagename local suffix = pagename:match("([aeo])$") if not suffix then error(("Pagename '%s' does not end in a recognizable deverbal suffix -a, -e or -o"):format(pagename)) end

local suffix_obj = m_links.full_link({		term = "-" .. suffix,		lang = lang,		id = "deverbal",	}, "term")

for i, item in ipairs(items) do		local formatted_part = m_links.full_link(item, "term", "allow self link", "respect qualifiers") items[i] = require(affix_module).join_formatted_parts { data = { lang = lang, nocat = args.nocat, sort_key = args.sort, -- FIXME: should we support lit= here? force_cat = force_cat, },			parts_formatted = {formatted_part, suffix_obj}, categories = {"deverbals", "terms suffixed with -" .. suffix .. " (deverbal)"}, }	end

local result = {} local function ins(text) table.insert(result, text) end

if not args.notext then if args.nocap then ins(glossary_link("Appendix:deverbal", "deverbal")) else ins(glossary_link("Appendix:deverbal", "Deverbal")) end ins(" from ") end

if #items == 1 then ins(items[1]) else ins(require(table_module).serialCommaJoin(items, {conj = "or"})) end

return table.concat(result) end

return export