বিষয়বস্তুতে চলুন

মডিউল:dum-nouns

উইকিঅভিধান, মুক্ত অভিধান থেকে

এই মডিউলের জন্য মডিউল:dum-nouns/নথি-এ নথিপত্র তৈরি করা হয়ে থাকতে পারে

local m_links = require("Module:links")

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

local export = {}

local function devoice(stem)
	stem = mw.ustring.gsub(stem, "ng$", "nc")
	stem = mw.ustring.gsub(stem, "g$", "ch")
	stem = mw.ustring.gsub(stem, "d$", "t")
	stem = mw.ustring.gsub(stem, "b$", "p")
	stem = mw.ustring.gsub(stem, "v$", "f")
	stem = mw.ustring.gsub(stem, "z$", "s")
	return stem
end

local function degeminate(stem)
	stem = mw.ustring.gsub(stem, "([cdghjklmnprstvwz])%1$", "%1")
	stem = mw.ustring.gsub(stem, "ck$", "k")
	return stem
end

local function C_to_K(stem)
    stem = mw.ustring.gsub(stem, "cc$", "ck")
    stem = mw.ustring.gsub(stem, "c$", "k")
    return stem
end

local function K_to_C(stem)
    stem = mw.ustring.gsub(stem, "ck$", "cc")
    stem = mw.ustring.gsub(stem, "k$", "c")
    return stem
end

local function syl_length(stem)
    stem = stem:gsub("([aeiou])([^aeiou]*)$", function(vowel, rest)
        local long = { a = "āe", e = "ēe", i = "ēe", o = "ōo"}
        return (long[vowel] or vowel) .. rest
    end)
    return stem
end

local function contr_long_vowel(stem)
    local replacements = {
        ["āe"] = "ā", ["âe"] = "â", ["ōo"] = "ō", ["ôo"] = "ô",
        ["ēe"] = "ē", ["êe"] = "ê", ["uu"] = "u", ["ij"] = "i"
    }
    for pattern, repl in pairs(replacements) do
        stem = stem:gsub(pattern, repl)
    end
    return stem
end

local function postprocess(args, data)
	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"] == "sg") and not key:find("_sg$")) or ((args["n"] == "pl") and not key:find("_pl$")) then
			form = nil
		end
		
		data.forms[key] = form
	end
end

function export.strong_m(frame)
	local params = {
		[1] = {default = mw.title.getCurrentTitle().nsText == "Template" and "{{{1}}}" or mw.title.getCurrentTitle().subpageText},
		[2] = {},
		["open_syl"] = {},
		["e_sing"] = {},
		["s_plur"] = {},
		["n"] = {},
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "strong masculine noun", categories = {lang:getCanonicalName() .. " strong masculine nouns"}}
	
	stem_1 = degeminate(devoice(args[1]))

	if args.open_syl then
		stem_2 = C_to_K(contr_long_vowel(syl_length(args[1])))
		stem_3 = devoice(syl_length(args[1]))
		table.insert(data.categories, "Middle Dutch nouns with open syllable lengthening")
	else
		stem_2 = C_to_K(contr_long_vowel(args[1]))
		stem_3 = stem_1
	end
	
	if args.e_sing then
		data.forms["nom_sg"] = {stem_2 .. "e"}
		data.forms["acc_sg"] = {stem_2 .. "e"}
	else
		data.forms["nom_sg"] = {stem_1}
		data.forms["acc_sg"] = {stem_1}
	end
	
	if args.open_syl then
		data.forms["gen_sg"] = {degeminate(stem_1 .. "s"), degeminate(stem_3 .. "s"), stem_2 .. "es"}
	else
		data.forms["gen_sg"] = {degeminate(stem_1 .. "s")}
	end
	
	data.forms["dat_sg"] = {stem_2 .. "e"}
	
	if args.s_plur then
		data.forms["nom_pl"] = {stem_2 .. "e", stem_2 .. "s"}
		data.forms["acc_pl"] = {stem_2 .. "e", stem_2 .. "s"}
		table.insert(data.categories, "Middle Dutch nouns with plural in -s")
	else		
		data.forms["nom_pl"] = {stem_2 .. "e"}
		data.forms["acc_pl"] = {stem_2 .. "e"}
	end
	
	data.forms["gen_pl"] = {stem_2 .. "e"}
	data.forms["dat_pl"] = {stem_2 .. "en"}
	
	postprocess(args, data)
	return make_table(data)
end

function export.strong_n(frame)
	local params = {
		[1] = {default = mw.title.getCurrentTitle().nsText == "Template" and "{{{1}}}" or mw.title.getCurrentTitle().subpageText},
		["open_syl"] = {},
		["e_sing"] = {},
		["r_plur"] = {},
		["n"] = {},
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "strong neuter noun", categories = {lang:getCanonicalName() .. " strong neuter nouns"}}
	
	stem_1 = degeminate(devoice(args[1]))

	if args.open_syl then
		stem_2 = C_to_K(contr_long_vowel(syl_length(args[1])))
		stem_3 = devoice(syl_length(args[1]))
		table.insert(data.categories, "Middle Dutch nouns with open syllable lengthening")
	else
		stem_2 = C_to_K(contr_long_vowel(args[1]))
		stem_3 = stem_1
	end
	
	if args.e_sing then
		data.forms["nom_sg"] = {stem_2 .. "e"}
		data.forms["acc_sg"] = {stem_2 .. "e"}
	else
		data.forms["nom_sg"] = {stem_1}
		data.forms["acc_sg"] = {stem_1}
	end
	
	if args.open_syl then
		data.forms["gen_sg"] = {degeminate(stem_1 .. "s"), degeminate(stem_3 .. "s"), stem_2 .. "es"}
	else
		data.forms["gen_sg"] = {degeminate(stem_1 .. "s")}
	end
	
	data.forms["dat_sg"] = {stem_2 .. "e"}
	
	if args.r_plur then
		data.forms["nom_pl"] = {stem_2 .. "er", stem_2 .. "ere"}
		data.forms["acc_pl"] = {stem_2 .. "er", stem_2 .. "ere"}
		data.forms["gen_pl"] = {stem_2 .. "er", stem_2 .. "ere"}
		data.forms["dat_pl"] = {stem_2 .. "eren"}
		table.insert(data.categories, "Middle Dutch nouns with plural in -er")
	elseif args.open_syl then
		data.forms["nom_pl"] = {stem_2 .. "e"}
		data.forms["acc_pl"] = {stem_2 .. "e"}
		data.forms["gen_pl"] = {stem_2 .. "e"}
		data.forms["dat_pl"] = {stem_2 .. "en"}
	elseif args.e_sing then
		data.forms["nom_pl"] = {stem_2 .. "e"}
		data.forms["acc_pl"] = {stem_2 .. "e"}
		data.forms["gen_pl"] = {stem_2 .. "e"}
		data.forms["dat_pl"] = {stem_2 .. "en"}
	else		
		data.forms["nom_pl"] = {stem_1, stem_2 .. "e"}
		data.forms["acc_pl"] = {stem_1, stem_2 .. "e"}
		data.forms["gen_pl"] = {stem_2 .. "e"}
		data.forms["dat_pl"] = {stem_2 .. "en"}
	end
	
	postprocess(args, data)
	return make_table(data)
end

function export.strong_f(frame)
	local params = {
		[1] = {default = mw.title.getCurrentTitle().nsText == "Template" and "{{{1}}}" or mw.title.getCurrentTitle().subpageText},
		[2] = {},
		["n"] = {},
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "strong feminine noun", categories = {lang:getCanonicalName() .. " strong feminine nouns"}}
	
	stem_1 = degeminate(devoice(args[1]))
	stem_2 = C_to_K(contr_long_vowel(args[1]))

	data.forms["nom_sg"] = {stem_1}
	data.forms["acc_sg"] = {stem_1}
	data.forms["gen_sg"] = {stem_1, stem_2 .. "e"}
	data.forms["dat_sg"] = {stem_1, stem_2 .. "e"}

	data.forms["nom_pl"] = {stem_2 .. "e"}
	data.forms["acc_pl"] = {stem_2 .. "e"}
	data.forms["gen_pl"] = {stem_2 .. "e"}
	data.forms["dat_pl"] = {stem_2 .. "en"}
	
	postprocess(args, data)
	return make_table(data)
end


function export.weak_m(frame)
	local params = {
		[1] = {default = mw.title.getCurrentTitle().nsText == "Template" and "{{{1}}}" or mw.title.getCurrentTitle().subpageText},
		[2] = {},
		["n"] = {},
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "weak masculine noun", categories = {lang:getCanonicalName() .. " weak masculine nouns"}}

	stem= args[1]
	
	data.forms["nom_sg"] = {stem}
	data.forms["acc_sg"] = {stem}
	data.forms["gen_sg"] = {stem .. "n"}
	data.forms["dat_sg"] = {stem}
	
	data.forms["nom_pl"] = {stem .. "n"}
	data.forms["acc_pl"] = {stem .. "n"}
	data.forms["gen_pl"] = {stem .. "n"}
	data.forms["dat_pl"] = {stem .. "n"}
	
	postprocess(args, data)
	return make_table(data)
end

function export.weak_n(frame)
	local params = {
		[1] = {default = mw.title.getCurrentTitle().nsText == "Template" and "{{{1}}}" or mw.title.getCurrentTitle().subpageText},	
		["n"] = {},
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "weak neuter noun", categories = {lang:getCanonicalName() .. " weak neuter nouns"}}

	stem= args[1]

	data.forms["nom_sg"] = {stem}
	data.forms["acc_sg"] = {stem}
	data.forms["gen_sg"] = {stem .. "n"}
	data.forms["dat_sg"] = {stem}
	
	data.forms["nom_pl"] = {stem .. "n"}
	data.forms["acc_pl"] = {stem .. "n"}
	data.forms["gen_pl"] = {stem .. "n"}
	data.forms["dat_pl"] = {stem .. "n"}
	
	postprocess(args, data)
	return make_table(data)
end


function export.weak_f(frame)
	local params = {
		[1] = {default = mw.title.getCurrentTitle().nsText == "Template" and "{{{1}}}" or mw.title.getCurrentTitle().subpageText},
		[2] = {},
		["n"] = {},
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "weak feminine noun", categories = {lang:getCanonicalName() .. " weak feminine nouns"}}

	stem=args[1]

	data.forms["nom_sg"] = {stem}
	data.forms["acc_sg"] = {stem}
	data.forms["gen_sg"] = {stem, stem .. "n"}
	data.forms["dat_sg"] = {stem, stem .. "n"}
	
	data.forms["nom_pl"] = {stem .. "n"}
	data.forms["acc_pl"] = {stem .. "n"}
	data.forms["gen_pl"] = {stem .. "n"}
	data.forms["dat_pl"] = {stem .. "n"}
	
	postprocess(args, data)
	return make_table(data)
end

function export.manual(frame)
	local params = {
		[1] = {default = "{{{1}}}" or mw.title.getCurrentTitle().subpageText},
		[2] = {default = "{{{2}}}" or mw.title.getCurrentTitle().subpageText},
		[3] = {default = "{{{3}}}" or mw.title.getCurrentTitle().subpageText},
		[4] = {default = "{{{4}}}" or mw.title.getCurrentTitle().subpageText},
		[5] = {default = "{{{5}}}" or mw.title.getCurrentTitle().subpageText},
		[6] = {default = "{{{6}}}" or mw.title.getCurrentTitle().subpageText},
		[7] = {default = "{{{7}}}" or mw.title.getCurrentTitle().subpageText},
		[8] = {default = "{{{8}}}" or mw.title.getCurrentTitle().subpageText},
		["type"] = {default = "{{{9}}}" or mw.title.getCurrentTitle().subpageText},
		["n"] = {},
	}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = args.type, categories = {lang:getCanonicalName() .. " irregular nouns"}}

	data.forms["nom_sg"] = {args[1]}
	data.forms["acc_sg"] = {args[2]}
	data.forms["gen_sg"] = {args[3]}
	data.forms["dat_sg"] = {args[4]}

	data.forms["nom_pl"] = {args[5]}
	data.forms["acc_pl"] = {args[6]}
	data.forms["gen_pl"] = {args[7]}
	data.forms["dat_pl"] = {args[8]}
	
	postprocess(args, data)
	return make_table(data)
end


-- Make the table
function make_table(data)
	local function repl(param)
		local form = data.forms[param]
		
		if not form or #form == 0 then
			return "—"
		end
		
		local ret = {}
		
		for key, subform in ipairs(form) do
			table.insert(ret, m_links.full_link({lang = lang, alt = subform}))
		end
		
		return table.concat(ret, ", ")
	end
	
	local names = {
		["nom"] = "nominative",
		["acc"] = "accusative",
		["gen"] = "genitive",
		["dat"] = "dative",
		
		["sg"] = "singular",
		["pl"] = "plural",
	}
	
	local cases = {"nom", "acc", "gen", "dat"}
	local numbers = {"sg", "pl"}
	
	local wikicode = {}
	
	table.insert(wikicode, mw.getCurrentFrame():expandTemplate{
		title = 'inflection-table-top',
		args = {
			title = mw.getContentLanguage():ucfirst(data.info or ""),
			palette = 'indigo',
			tall = 'yes',
		},
	})
	table.insert(wikicode, "!")
	
	for _, num in ipairs(numbers) do
		table.insert(wikicode, "! " .. names[num])
	end
	
	for _, case in ipairs(cases) do
		table.insert(wikicode, "|- ")
		table.insert(wikicode, "! " .. names[case])
		
		for _, num in ipairs(numbers) do
			table.insert(wikicode, "| {{{" .. case .. "_" .. num .. "}}}")
		end
	end
	
	table.insert(wikicode, mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' })
	
	wikicode = table.concat(wikicode, "\n")
	
	return (mw.ustring.gsub(wikicode, "{{{([a-z0-9_]+)}}}", repl)) .. require("Module:utilities").format_categories(data.categories, lang)
end

return export