Module:sju-nominals

From Wiktionary, the free dictionary
Jump to navigation Jump to search

This module needs documentation.
Please document this module by describing its purpose and usage on the documentation page.

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

local export = {}


-- Inflection functions

function export.even(frame)
	local fparams = {
		[1] = {required = true},
		
		["nograd"] = {type = "boolean"},
	}
	
	local fargs = require("Module:parameters").process(frame.args, fparams)
	
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		
		["attr"] = fargs[1] == "adjectives" and {list = true} or nil,
		["n"] = fargs[1] == "nouns" and {} or nil,
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	local stem = require("Module:sju-common").Stem(args[1], not fargs["nograd"])
	
	local data = {
		has_attr = fargs[1] == "adjectives",
		forms = {},
		info = "even " .. require("Module:links").full_link({lang = lang, alt = stem.uvowel}, "term") .. "-stem",
		categories = {},
	}
	
	if stem.gradation then
		data.info = data.info .. ", " ..
			require("Module:links").full_link({lang = lang, alt = stem.gradation.strong.scons}, "term") .. "-" ..
			require("Module:links").full_link({lang = lang, alt = stem.gradation.weak.scons}, "term") .. " gradation"
	else
		data.info = data.info .. ", no gradation"
	end
	
	if not (mw.ustring.find(stem.uvowel, "^[aá]$") or stem.uvowel == "ie" or stem.uvowel == "uo") and mw.title.getCurrentTitle().nsText ~= "Template" then
		error("The final vowel(s) of the stem must be one of a, á, ie, uo.")
	end
	
	table.insert(data.categories, lang:getCanonicalName() .. " even " .. fargs[1])
	table.insert(data.categories, lang:getCanonicalName() .. " even " .. (stem.uvowel or "") .. "-stem " .. fargs[1])
	
	if not stem.gradation then
		table.insert(data.categories, lang:getCanonicalName() .. " non-gradating even " .. fargs[1])
	end
	
	data.forms["nom|s"] = {stem:make_form{grade = "strong"}}
	data.forms["acc|s"] = {stem:make_form{grade = "weak", ending = "v", variant = "v"}, stem:make_form{grade = "weak", ending = "b", variant = "v"}}
	data.forms["gen|s"] = {stem:make_form{grade = "weak", ending = "n"}}
	data.forms["ill|s"] = {stem:make_form{grade = "strong", ending = "je", variant = "je"}}
	data.forms["ine|s"] = {stem:make_form{grade = "weak", ending = "sne"}}
	data.forms["ela|s"] = {stem:make_form{grade = "weak", ending = "ste"}}
	data.forms["com|s"] = {stem:make_form{grade = "weak", ending = "jne", variant = "j"}}
	
	data.forms["nom|p"] = {stem:make_form{grade = "weak", ending = "h"}}
	data.forms["acc|p"] = {stem:make_form{grade = "weak", ending = "jde", variant = "j"}}
	data.forms["gen|p"] = {stem:make_form{grade = "weak", ending = "j", variant = "j"}}
	data.forms["ill|p"] = {stem:make_form{grade = "weak", ending = "jde", variant = "j"}}
	data.forms["ine|p"] = {stem:make_form{grade = "weak", ending = "jne", variant = "j"}}
	data.forms["ela|p"] = {stem:make_form{grade = "weak", ending = "jste", variant = "j"}}
	data.forms["com|p"] = {stem:make_form{grade = "weak", ending = "jgüjme", variant = "j"}}
	
	data.forms["abe"] = {stem:make_form{grade = "weak", ending = "t"}}
	data.forms["ess"] = {stem:make_form{grade = "strong", ending = "ne"}}
	
	postprocess(args, data)
	
	return make_table(data)
end


function postprocess(args, data)
	data.n = args["n"]
	
	if args["n"] == "p" then
		table.insert(data.categories, lang:getCanonicalName() .. " pluralia tantum")
	elseif args["n"] == "s" then
		table.insert(data.categories, lang:getCanonicalName() .. " uncountable nouns")
	elseif args["n"] then
		error("args= must be \"s\" or \"p\".")
	end
	
	for key, form in pairs(data.forms) do
		-- Do not show singular or plural forms for nominals that don't have them
		if (args["n"] == "p" and key:find("|s$")) or (args["n"] == "s" and key:find("|p$")) then
			form = nil
		end
		
		data.forms[key] = form
	end
	
	if data.has_attr then
		if not args["attr"][1] then
			data.forms["attr"] = mw.clone(data.forms["nom|s"])
		elseif args["attr"][1] ~= "-" then
			data.forms["attr"] = args["attr"]
		end
	end
	
	data.lemma = (data.forms["nom|" .. (data.n or "s")] or data.forms["acc|" .. (data.n or "s")])[1]
	
	-- Check if the lemma form matches the page name
	if (lang:makeEntryName(data.lemma)) ~= mw.title.getCurrentTitle().text then
		table.insert(data.categories, lang:getCanonicalName() .. " entries with inflection not matching pagename")
	end
end


-- Make the table
function make_table(data)
	local function repl(param)
		local accel = true
		local no_store = false
		
		if param == "info" then
			return mw.getContentLanguage():ucfirst(data.info or "")
		elseif string.sub(param, 1, 1) == "!" then
			no_store = true
			param = string.sub(param, 2)
		elseif string.sub(param, 1, 1) == "#" then
			accel = false
			param = string.sub(param, 2)
		end
		
		local forms = data.forms[param]
		
		if not forms then
			return "—"
		end
		
		local ret = {}
		
		for key, subform in ipairs(forms) do
			table.insert(ret, require("Module:links").full_link({lang = lang, term = subform, accel = accel and {form = param, lemma = data.lemma, no_store = no_store} or nil}))
		end
		
		return table.concat(ret, "<br/>")
	end
	
	local wikicode = {}
	table.insert(wikicode, [=[
{| class="inflection-table vsSwitcher" data-toggle-category="inflection" style="border:solid 1px #CCCCFF; text-align: left;" cellspacing="1" cellpadding="2"
|- style="background: #E2F6E2; text-align: left;"
! class="vsToggleElement" colspan="3" | {{{info}}}]=])

	if data.has_attr then
		table.insert(wikicode, [=[

|- class="vsShow" style="background: #F2F2FF;"
! style="background: #E2F6E2;" | Attributive
| colspan="2" | {{{!attr}}}]=])
	end
	
	table.insert(wikicode, [=[

|- class="vsShow" style="background: #F2F2FF;"
! style="width: 8em; background: #E2F6E2;" | Nominative
| style="width: 15em;" colspan="2" | {{{!nom|]=] .. (data.n or "s") .. [=[}}}
|- class="vsShow" style="background: #F2F2FF;"
! style="background: #E2F6E2;" | Genitive
| colspan="2" | {{{!gen|]=] .. (data.n or "s") .. [=[}}}]=])
	
	if data.has_attr then
		table.insert(wikicode, [=[

|- class="vsHide" style="background: #F2F2FF;"
! style="background: #E2F6E2;" | Attributive
| colspan="2" | {{{attr}}}
]=])
	end
	
	table.insert(wikicode, [=[

|- class="vsHide"
! style="width: 8em; background: #C0E4C0;" |
! style="width: 12em; background: #C0E4C0;" | Singular
! style="width: 12em; background: #C0E4C0;" | Plural
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #E2F6E2;" | Nominative
| data-accel-col="1" | {{{nom|s}}}
| data-accel-col="2" | {{{nom|p}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #E2F6E2;" | Accusative
| data-accel-col="1" | {{{acc|s}}}
| data-accel-col="2" | {{{acc|p}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #E2F6E2;" | Genitive
| data-accel-col="1" | {{{gen|s}}}
| data-accel-col="2" | {{{gen|p}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #E2F6E2;" | Illative
| data-accel-col="1" | {{{ill|s}}}
| data-accel-col="2" | {{{ill|p}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #E2F6E2;" | Inessive
| data-accel-col="1" | {{{ine|s}}}
| data-accel-col="2" | {{{ine|p}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #E2F6E2;" | Elative
| data-accel-col="1" | {{{ela|s}}}
| data-accel-col="2" | {{{ela|p}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #E2F6E2;" | Comitative
| data-accel-col="1" | {{{com|s}}}
| data-accel-col="2" | {{{com|p}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #E2F6E2;" | Abessive
| colspan="2" | {{{abe}}}
|- class="vsHide" style="background: #F2F2FF;"
! style="background: #E2F6E2;" | Essive
| colspan="2" | {{{ess}}}
|}]=])
	
	return mw.ustring.gsub(table.concat(wikicode), "{{{([#!]?[a-z0-9|]+)}}}", repl) .. require("Module:utilities").format_categories(data.categories, lang)
end

return export