Module:rad-stem/templates: Difference between revisions

From Laenkea
Jump to navigation Jump to search
mNo edit summary
(Finished)
Line 1: Line 1:
--[[
WORK IN PROGRESS
]]--
local export = {}
local export = {}
local getArgs = require('Module:Arguments').getArgs
local getArgs = require('Module:Arguments').getArgs
Line 92: Line 88:
adj_broken = args['adjbreak'] or break_adj(adj)  
adj_broken = args['adjbreak'] or break_adj(adj)  
adj_broken_e = mw.ustring.gsub(adj_broken, "(uș)$", "ûș")
adj_broken_e = mw.ustring.gsub(adj_broken, "(uș)$", "ûș")
adj_broken_e = mw.ustring.gsub(adj_broken, "(aûș)$", "auș")
adj_broken_e = mw.ustring.gsub(adj_broken_e, "(aûș)$", "auș")
adj_broken_e = mw.ustring.gsub(adj_broken, "(aùș)$", "aûș")
adj_broken_e = mw.ustring.gsub(adj_broken_e, "(aùș)$", "aûș")
adj_broken_e = adj_broken_e .. "e"
adj_broken_e = adj_broken_e .. "e"
adj = mw.ustring.gsub(adj, "(°)", "")
adj = mw.ustring.gsub(adj, "(°)", "")
Line 142: Line 138:
local nom_cite = nom
local nom_cite = nom
nom = rad_link_IPA(nom)
nom = rad_link_IPA(nom)
local gen = stems.gen
local function get_forms(case, base, adj_base, adj_ending, nolink)
if adj_broken then gen = gen .. adj_broken .. "k" end
if adj_base then
if post then gen = gen .. post end
base = base .. adj_base
if args['altgen'] then
if adj_ending then base = base .. adj_ending end
end
if post then base = base .. post end
if args['alt' .. case] then
local list = {
local list = {
[1] = {['word'] = gen},
[1] = {['word'] = base},
[2] = {['word'] = args['altgen'], ['note'] = args['altgen_note']}
[2] = {['word'] = args['alt' .. case], ['note'] = args['alt' .. case .. '_note']}
}
}
if adj_broken then list[2]['word'] = list[2]['word'] .. adj_broken .. "k" end
if adj_base then
list[2]['word'] = list[2]['word'] .. adj_base
if adj_ending then list[2]['word'] = list[2]['word'] .. adj_ending end
end
if post then list[2]['word'] = list[2]['word'] .. post end
if post then list[2]['word'] = list[2]['word'] .. post end
local counter = 2
local counter = 2
while args['altgen' .. counter] do
while args['alt' .. case .. counter] do
local temp = args['altgen' .. counter]
local temp = args['alt' .. case .. counter]
if adj_broken then temp = temp .. adj_broken .. "k" end
if adj_base then
temp = temp .. adj_base
if adj_ending then temp = temp .. adj_ending end
end
if post then temp = temp .. post end
if post then temp = temp .. post end
list[counter + 1] = {['word'] = temp, ['note'] = args['altgen' .. counter .. "_note"]}
list[counter + 1] = {['word'] = temp, ['note'] = args['alt' .. case .. counter .. "_note"]}
counter = counter + 1
counter = counter + 1
end
end
gen = rad_link_IPA(list)
return rad_link_IPA(list)
else
else
gen = rad_link_IPA(gen)
if nolink then
return base
else
return rad_link_IPA(base)
end
end
end
end
local gen = get_forms("gen", stems.gen, adj_broken, "k")
local dat = get_forms("dat", stems.dat, adj, "a")
local acc = get_forms("acc", stems.acc, adj_broken, "t")
local ins = get_forms("ins", stems.ins, adj, "úr")
local nompl = get_forms("nompl", stems.nompl, adj_broken_e)
local nompl_cite = get_forms("nompl", stems.nompl, adj_broken_e, "", true)
local genpl = get_forms("genpl", stems.genpl .. "ris", adj, "eris")
local genpl_short = get_forms("genpl_short", stems.genpl_short, adj, "es")
local datpl = get_forms("genpl", stems.genpl .. "rín", adj, "erín")
local accpl = get_forms("accpl", stems.genpl .. "rid", adj, "erid")
local inspl = get_forms("inspl", stems.genpl .. "ríe", adj, "eríe")
local nomdu = get_forms("nomdu", stems.dat .. "te", adj_broken_e)
local nomdu_cite = get_forms("nomdu", stems.dat .. "te", adj_broken_e, "", true)
local gendu = get_forms("gendu", stems.dat .. "tis", adj, "eris")
local gendu_short = get_forms("gendu_short", stems.dat .. "ts", adj, "es")
local datdu = get_forms("datdu", stems.dat .. "tín", adj, "erín")
local accdu = get_forms("accdu", stems.dat .. "tid", adj, "erid")
local insdu = get_forms("insdu", stems.dat .. "tíe", adj, "eríe")
add("<table class=\"mw-collapsible mw-collapsed wikitable inflection table\" style=\"text-align: center\">")
add("<table class=\"mw-collapsible mw-collapsed wikitable inflection table\" style=\"text-align: center\">")
if table_type == "sgpl" then
if table_type == "sgpl" then
th("Declension of <i>" .. nom_cite .. "</i> (" .. type_name .. ") &nbsp", 1, 4)
th("Declension of <i>" .. nom_cite .. "</i> (" .. type_name .. ") &nbsp;", 1, 4)
add("<tr>")
th("", 1, 2)
th("singular")
th("plural")
add("</tr>")
add("<tr>")
add("<tr>")
th("nominative", 1, 2)
th("nominative", 1, 2)
Line 176: Line 211:
else
else
td(nom)
td(nom)
td(nompl)
end
end
add("</tr>")
add("</tr>")
add("<tr>")
add("<tr>")
th("genitive", 2, 1)
th("genitive", 2, 1)
th("proper")
th("long")
td(gen, 2, 1)
td(genpl)
add("</tr>")
add("<tr>")
th("short")
td(genpl_short)
add("</tr>")
add("<tr>")
th("dative", 1, 2)
td(dat)
td(datpl)
add("</tr>")
add("<tr>")
th("accusative", 1, 2)
td(acc)
td(accpl)
add("</tr>")
add("<tr>")
th("instrumental", 1, 2)
td(ins)
td(inspl)
add("</tr>")
elseif table_type == "sg" then
th("Declension of <i>" .. nom_cite .. "</i> (" .. type_name .. ") &nbsp;", 1, 2)
add("<tr>")
th("")
th("singular")
add("</tr>")
add("<tr>")
th("nominative")
td(nom)
add("</tr>")
add("<tr>")
th("genitive")
td(gen)
td(gen)
add("</tr>")
add("</tr>")
elseif table_type == "sg" then
add("<tr>")
th("dative")
td(dat)
add("</tr>")
add("<tr>")
th("accusative")
td(acc)
add("</tr>")
add("<tr>")
th("instrumental")
td(ins)
add("</tr>")
elseif table_type == "pl" then
elseif table_type == "pl" then
th("Declension of <i>" .. nompl_cite .. "</i> (" .. type_name .. ") &nbsp;", 1, 3)
add("<tr>")
th("", 1, 2)
th("plural")
add("</tr>")
add("<tr>")
th("nominative", 1, 2)
td(nompl)
add("</tr>")
add("<tr>")
th("genitive", 2, 1)
th("long")
td(genpl)
add("</tr>")
add("<tr>")
th("short")
td(genpl_short)
add("</tr>")
add("<tr>")
th("dative", 1, 2)
td(datpl)
add("</tr>")
add("<tr>")
th("accusative", 1, 2)
td(accpl)
add("</tr>")
add("<tr>")
th("instrumental", 1, 2)
td(inspl)
add("</tr>")
elseif table_type == "du" then
elseif table_type == "du" then
th("Declension of <i>" .. nom_cite .. "</i> (" .. type_name .. ") &nbsp;", 1, 5)
add("<tr>")
th("", 2, 2)
th("singular", 2, 1)
th("plural", 1, 2)
add("</tr>")
add("<tr>")
th("binary")
th("true")
add("</tr>")
add("<tr>")
th("nominative", 1, 2)
td(nom)
td(nomdu)
td(nompl)
add("</tr>")
add("<tr>")
th("genitive", 2, 1)
th("long")
td(gen, 2, 1)
td(gendu)
td(genpl)
add("</tr>")
add("<tr>")
th("short")
td(gendu_short)
td(genpl_short)
add("</tr>")
add("<tr>")
th("dative", 1, 2)
td(dat)
td(datdu)
td(datpl)
add("</tr>")
add("<tr>")
th("accusative", 1, 2)
td(acc)
td(accdu)
td(accpl)
add("</tr>")
add("<tr>")
th("instrumental", 1, 2)
td(ins)
td(insdu)
td(inspl)
add("</tr>")
elseif table_type == "dupl" then
elseif table_type == "dupl" then
th("Declension of <i>" .. nomdu_cite .. "</i> (" .. type_name .. ") &nbsp;", 1, 3)
add("<tr>")
th("", 1, 2)
th("binary plural")
add("</tr>")
add("<tr>")
th("nominative", 1, 2)
td(nomdu)
add("</tr>")
add("<tr>")
th("genitive", 2, 1)
th("long")
td(gendu)
add("</tr>")
add("<tr>")
th("short")
td(gendu_short)
add("</tr>")
add("<tr>")
th("dative", 1, 2)
td(datdu)
add("</tr>")
add("<tr>")
th("accusative", 1, 2)
td(accdu)
add("</tr>")
add("<tr>")
th("instrumental", 1, 2)
td(insdu)
add("</tr>")
end
end
add("</table>")
add("</table>")
add("<includeonly>")
if args['notags'] ~= "true" or args['notags'] == nil then
add("[[Category:" .. m_languages.get_by_code("rad").name .. " " .. type_name .. " stems]]")
add("<includeonly>")
if table_type == "sg" then add("[[Category:" .. m_languages.get_by_code("rad").name .. " singularia tantum]]")
add("[[Category:" .. m_languages.get_by_code("rad").name .. " " .. type_name .. " stems]]")
elseif table_type == "pl" then add("[[Category:" .. m_languages.get_by_code("rad").name .. " pluralia tantum]]")
if table_type == "sg" then add("[[Category:" .. m_languages.get_by_code("rad").name .. " singularia tantum]]")
elseif table_type == "du" then add("[[Category:" .. m_languages.get_by_code("rad").name .. " pluralia binaria]]")
elseif table_type == "pl" then add("[[Category:" .. m_languages.get_by_code("rad").name .. " pluralia tantum]]")
elseif table_type == "dupl" then add("[[Category:" .. m_languages.get_by_code("rad").name .. " pluralia binaria tantum]]")
elseif table_type == "du" then add("[[Category:" .. m_languages.get_by_code("rad").name .. " pluralia binaria]]")
end
elseif table_type == "dupl" then add("[[Category:" .. m_languages.get_by_code("rad").name .. " pluralia binaria tantum]]")
add("</includeonly>")
end
add("</includeonly>")
end
return table.concat(format_table, string.char(10))
return table.concat(format_table, string.char(10))

Revision as of 16:52, 1 December 2023

Underlies:


local export = {}
local getArgs = require('Module:Arguments').getArgs

local m_stem = require("Module:rad-stem")
local m_parameters = require("Module:parameters")
local m_links = require("Module:links")
local m_languages = require("Module:languages")

function get_stems(args)
	local shifted = {"noun", "_"}
	
	local i = 1
	while args[i] do
		shifted[i+2] = args[i]
		i = i + 1
	end
	
	return m_stem.getNounStem(shifted)
end

function break_adj(adj)
	local C = "bcdðfghħjĵkķlmnņpqrsștvwxzþ°"
	local temp = adj

	temp = mw.ustring.gsub(temp, "([" .. C .. "])([" .. C .. "])íș$", "%1%2ieș")
	temp = mw.ustring.gsub(temp, "(°)", "")
	temp = mw.ustring.gsub(temp, "(íș)$", "jeș")
	temp = mw.ustring.gsub(temp, "(úș)$", "uoș")
	temp = mw.ustring.gsub(temp, "(ýș)$", "yeș")
	temp = mw.ustring.gsub(temp, "(oș)$", "uș")

	return temp
end

function rad_link(word)
	return m_links.full_link{
    term = word,
    language = m_languages.get_by_code("rad")
}
end

function rad_IPA(word)
	local IPA = require("Module:rad-IPA").generate{
		word,
		"format",
		"nolarge"
	}
	return "<span style=\"color:dimgrey\">" .. IPA .. "</span>" 
end

function rad_link_IPA(word)
	if type(word) == "string" then
		return rad_link(word) .. "<br>" .. rad_IPA(word)
	elseif type(word) == "table" then
		local links = {}
		local IPAs = {}
		for _, i in ipairs(word) do
			local new_link = rad_link(i['word'])
			if i['note'] then new_link = new_link .. " <small>(<i>" .. i['note'] .. "</i>)</small>" end
			table.insert(links, new_link)
			table.insert(IPAs, rad_IPA(i['word']))
		end
		return table.concat(links, ", ") .. "<br>" .. table.concat(IPAs, " ")
	else error("Incompatible input type for rad_link_IPA")
	end
end

function export.show(frame)
	local args = getArgs(frame)
	local stem_gen = get_stems(args)
	local stems = {
		nom = args['nom'] or stem_gen.nom,
		acc = args['acc'] or stem_gen.acc,
		dat = args['dat'] or stem_gen.dat,
		gen = args['gen'] or stem_gen.gen,
		ins = args['ins'] or stem_gen.ins,
		nompl = args['nompl'] or stem_gen.nompl,
		genpl = args['genpl'] or stem_gen.genpl,
		genpl_short = args['genpl_short'] or stem_gen.genpl_short,
		['type'] = stem_gen['type'],
		}
	local adj = args['adj']
	local adj_broken = ""
	local adj_broken_e = ""
	if adj then
		if not mw.ustring.match(adj, "(ș)$") then error("All adjectives must end in -ș") end
		adj = " " .. adj
		adj_broken = args['adjbreak'] or break_adj(adj) 
		adj_broken_e = mw.ustring.gsub(adj_broken, "(uș)$", "ûș")
		adj_broken_e = mw.ustring.gsub(adj_broken_e, "(aûș)$", "auș")
		adj_broken_e = mw.ustring.gsub(adj_broken_e, "(aùș)$", "aûș")
		adj_broken_e = adj_broken_e .. "e"
		adj = mw.ustring.gsub(adj, "(°)", "")
	else
		adj_broken = nil
		adj_broken_e = nil
	end
	local post = args['post']
	
	local format_table = {}
	
	local decl_type = {
		["C"] = "heavy",
		["CH"] = "heavy spirant",
		["VH"] = "light spirant",
		["V"] = "light",
		["G"] = "semi-light"
	}
	
	local type_name = decl_type[stems['type']]
	
	local table_type = args['type'] or "sgpl"
	
	local function add(code)
		table.insert(format_table, code)
	end
	
	local function th(data, rowspan, colspan)
		local to_add = "<th"
		if rowspan and rowspan~=1 then to_add = to_add .. " rowspan=" .. rowspan end
		if colspan and colspan~=1 then to_add = to_add .. " colspan=" .. colspan end
		to_add = to_add .. ">" .. data .. "</th>"
		add(to_add)
	end
	
	local function td(data, rowspan, colspan)
		local to_add = "<td"
		if rowspan and rowspan~=1 then to_add = to_add .. " rowspan=" .. rowspan end
		if colspan and colspan~=1 then to_add = to_add .. " colspan=" .. colspan end
		to_add = to_add .. ">" .. data .. "</td>"
		add(to_add)
	end
	
	-- generate forms --
	local nom = stems.nom
		if adj_broken_e then nom = nom .. adj_broken_e end
		if post then nom = nom .. post end
	local nom_cite = nom
	nom = rad_link_IPA(nom)
	
	local function get_forms(case, base, adj_base, adj_ending, nolink)
		if adj_base then
			base = base .. adj_base
			if adj_ending then base = base .. adj_ending end
		end
		if post then base = base .. post end
		if args['alt' .. case] then
			local list = {
				[1] = {['word'] = base},
				[2] = {['word'] = args['alt' .. case], ['note'] = args['alt' .. case .. '_note']}
			}
			if adj_base then
				list[2]['word'] = list[2]['word'] .. adj_base
				if adj_ending then list[2]['word'] = list[2]['word'] .. adj_ending end
			end
			if post then list[2]['word'] = list[2]['word'] .. post end
			local counter = 2
			while args['alt' .. case .. counter] do
				local temp = args['alt' .. case .. counter]
				if adj_base then
					temp = temp .. adj_base
					if adj_ending then temp = temp .. adj_ending end
				end
				if post then temp = temp .. post end
				list[counter + 1] = {['word'] = temp, ['note'] = args['alt' .. case .. counter .. "_note"]}
				counter = counter + 1	
			end
			return rad_link_IPA(list)
		else
			if nolink then
				return base
			else
				return rad_link_IPA(base)
			end
		end
	end
		
	local gen = get_forms("gen", stems.gen, adj_broken, "k")
	local dat = get_forms("dat", stems.dat, adj, "a")
	local acc = get_forms("acc", stems.acc, adj_broken, "t")
	local ins = get_forms("ins", stems.ins, adj, "úr")
	
	local nompl = get_forms("nompl", stems.nompl, adj_broken_e)
	local nompl_cite = get_forms("nompl", stems.nompl, adj_broken_e, "", true)
	local genpl = get_forms("genpl", stems.genpl .. "ris", adj, "eris")
	local genpl_short = get_forms("genpl_short", stems.genpl_short, adj, "es")
	local datpl = get_forms("genpl", stems.genpl .. "rín", adj, "erín")
	local accpl = get_forms("accpl", stems.genpl .. "rid", adj, "erid")
	local inspl = get_forms("inspl", stems.genpl .. "ríe", adj, "eríe")
	
	local nomdu = get_forms("nomdu", stems.dat .. "te", adj_broken_e)
	local nomdu_cite = get_forms("nomdu", stems.dat .. "te", adj_broken_e, "", true)
	local gendu = get_forms("gendu", stems.dat .. "tis", adj, "eris")
	local gendu_short = get_forms("gendu_short", stems.dat .. "ts", adj, "es")
	local datdu = get_forms("datdu", stems.dat .. "tín", adj, "erín")
	local accdu = get_forms("accdu", stems.dat .. "tid", adj, "erid")
	local insdu = get_forms("insdu", stems.dat .. "tíe", adj, "eríe")

	add("<table class=\"mw-collapsible mw-collapsed wikitable inflection table\" style=\"text-align: center\">")
		if table_type == "sgpl" then
			th("Declension of <i>" .. nom_cite .. "</i> (" .. type_name .. ") &nbsp;", 1, 4)
			add("<tr>")
				th("", 1, 2)
				th("singular")
				th("plural")
			add("</tr>")
			add("<tr>")
				th("nominative", 1, 2)
				if nom == nompl then
					td(nom, 1, 2)
				else
					td(nom)
					td(nompl)
				end
			add("</tr>")
			add("<tr>")
				th("genitive", 2, 1)
				th("long")
				td(gen, 2, 1)
				td(genpl)
			add("</tr>")
			add("<tr>")
				th("short")
				td(genpl_short)
			add("</tr>")
			add("<tr>")
				th("dative", 1, 2)
				td(dat)
				td(datpl)
			add("</tr>")
			add("<tr>")
				th("accusative", 1, 2)
				td(acc)
				td(accpl)
			add("</tr>")
			add("<tr>")
				th("instrumental", 1, 2)
				td(ins)
				td(inspl)
			add("</tr>")
		elseif table_type == "sg" then
			th("Declension of <i>" .. nom_cite .. "</i> (" .. type_name .. ") &nbsp;", 1, 2)
			add("<tr>")
				th("")
				th("singular")
			add("</tr>")
			add("<tr>")
				th("nominative")
				td(nom)
			add("</tr>")
			add("<tr>")
				th("genitive")
				td(gen)
			add("</tr>")
			add("<tr>")
				th("dative")
				td(dat)
			add("</tr>")
			add("<tr>")
				th("accusative")
				td(acc)
			add("</tr>")
			add("<tr>")
				th("instrumental")
				td(ins)
			add("</tr>")
		elseif table_type == "pl" then
			th("Declension of <i>" .. nompl_cite .. "</i> (" .. type_name .. ") &nbsp;", 1, 3)
			add("<tr>")
				th("", 1, 2)
				th("plural")
			add("</tr>")
			add("<tr>")
				th("nominative", 1, 2)
				td(nompl)
			add("</tr>")
			add("<tr>")
				th("genitive", 2, 1)
				th("long")
				td(genpl)
			add("</tr>")
			add("<tr>")
				th("short")
				td(genpl_short)
			add("</tr>")
			add("<tr>")
				th("dative", 1, 2)
				td(datpl)
			add("</tr>")
			add("<tr>")
				th("accusative", 1, 2)
				td(accpl)
			add("</tr>")
			add("<tr>")
				th("instrumental", 1, 2)
				td(inspl)
			add("</tr>")
		elseif table_type == "du" then
			th("Declension of <i>" .. nom_cite .. "</i> (" .. type_name .. ") &nbsp;", 1, 5)
			add("<tr>")
				th("", 2, 2)
				th("singular", 2, 1)
				th("plural", 1, 2)
			add("</tr>")
			add("<tr>")
				th("binary")
				th("true")
			add("</tr>")
			add("<tr>")
				th("nominative", 1, 2)
				td(nom)
				td(nomdu)
				td(nompl)
			add("</tr>")
			add("<tr>")
				th("genitive", 2, 1)
				th("long")
				td(gen, 2, 1)
				td(gendu)
				td(genpl)
			add("</tr>")
			add("<tr>")
				th("short")
				td(gendu_short)
				td(genpl_short)
			add("</tr>")
			add("<tr>")
				th("dative", 1, 2)
				td(dat)
				td(datdu)
				td(datpl)
			add("</tr>")
			add("<tr>")
				th("accusative", 1, 2)
				td(acc)
				td(accdu)
				td(accpl)
			add("</tr>")
			add("<tr>")
				th("instrumental", 1, 2)
				td(ins)
				td(insdu)
				td(inspl)
			add("</tr>")
		elseif table_type == "dupl" then
			th("Declension of <i>" .. nomdu_cite .. "</i> (" .. type_name .. ") &nbsp;", 1, 3)
			add("<tr>")
				th("", 1, 2)
				th("binary plural")
			add("</tr>")
			add("<tr>")
				th("nominative", 1, 2)
				td(nomdu)
			add("</tr>")
			add("<tr>")
				th("genitive", 2, 1)
				th("long")
				td(gendu)
			add("</tr>")
			add("<tr>")
				th("short")
				td(gendu_short)
			add("</tr>")
			add("<tr>")
				th("dative", 1, 2)
				td(datdu)
			add("</tr>")
			add("<tr>")
				th("accusative", 1, 2)
				td(accdu)
			add("</tr>")
			add("<tr>")
				th("instrumental", 1, 2)
				td(insdu)
			add("</tr>")
		end
	add("</table>")
	
	if args['notags'] ~= "true" or args['notags'] == nil then
		add("<includeonly>")
			add("[[Category:" .. m_languages.get_by_code("rad").name .. " " .. type_name .. " stems]]")
			if table_type == "sg" then add("[[Category:" .. m_languages.get_by_code("rad").name .. " singularia tantum]]")
			elseif table_type == "pl" then add("[[Category:" .. m_languages.get_by_code("rad").name .. " pluralia tantum]]")
			elseif table_type == "du" then add("[[Category:" .. m_languages.get_by_code("rad").name .. " pluralia binaria]]")
			elseif table_type == "dupl" then add("[[Category:" .. m_languages.get_by_code("rad").name .. " pluralia binaria tantum]]")
			end
		add("</includeonly>")
	end
	
	return table.concat(format_table, string.char(10))
end

return export

--[[
Debug console test string:
=p.show(mw.getCurrentFrame():newChild{title="whatever",args={"hv", "o~u^u", "þ"}})
]]--