local m_utilities = require("Module:utilities")
local m_links = require("Module:links")

local export = {}

local lang = require("Module:languages").getByCode("cel-pro")


local function postprocess(args, data)
	data.sg = true
	data.du = true
	data.pl = true
	
	if args["n"] then
		if not mw.ustring.find(args["n"], "s") then
			data.sg = false
		end
		
		if not mw.ustring.find(args["n"], "d") then
			data.du = false
		end
		
		if not mw.ustring.find(args["n"], "p") then
			data.pl = false
		end
	end
	
	for key, form in pairs(data.forms) do
		-- Do not show singular, dual or plural forms for nouns that don't have them
		if (not data.sg and key:find("_sg$")) or (not data.du and key:find("_du$")) or (not data.pl and key:find("_pl$")) then
			form = nil
		end
		
		data.forms[key] = form
	end
end


-- Inflection functions

export["a-f"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		
		["n"] = {},
		["nopl"] = {},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "陰性ā-詞幹", categories = {lang:getCanonicalName() .. "ā-詞幹名詞"}}
	
	data.forms["nom_sg"] = {args[1] .. "ā"}
	data.forms["voc_sg"] = {args[1] .. "ā"}
	data.forms["acc_sg"] = {args[1] .. "am"}
	data.forms["gen_sg"] = {args[1] .. "ās"}
	data.forms["dat_sg"] = {args[1] .. "āi"}
	data.forms["loc_sg"] = {args[1] .. "ai"}
	data.forms["ins_sg"] = {"?"}

	if not args.nopl then	
		data.forms["nom_du"] = {args[1] .. "ai"}
		data.forms["voc_du"] = {args[1] .. "ai"}
		data.forms["acc_du"] = {args[1] .. "ai"}
		data.forms["gen_du"] = {args[1] .. "ous"}
		data.forms["dat_du"] = {args[1] .. "ābom"}
		data.forms["loc_du"] = {"?"}
		data.forms["ins_du"] = {args[1] .. "ābim"}
		
		data.forms["nom_pl"] = {args[1] .. "ās"}
		data.forms["voc_pl"] = {args[1] .. "ās"}
		data.forms["acc_pl"] = {args[1] .. "āms"}
		data.forms["gen_pl"] = {args[1] .. "om"}
		data.forms["dat_pl"] = {args[1] .. "ābos"}
		data.forms["loc_pl"] = {"?"}
		data.forms["ins_pl"] = {args[1] .. "ābis"}
	end
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["iya-f"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		
		["n"] = {},
		["nopl"] = {},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "陰性ī/yā-詞幹", categories = {lang:getCanonicalName() .. "ī/yā-詞幹名詞"}}
	
	data.forms["nom_sg"] = {args[1] .. "ī"}
	data.forms["voc_sg"] = {args[1] .. "ī"}
	data.forms["acc_sg"] = {args[1] .. "īm"}
	data.forms["gen_sg"] = {args[1] .. "yās"}
	data.forms["dat_sg"] = {args[1] .. "yai"}
	data.forms["loc_sg"] = {"?"}
	data.forms["ins_sg"] = {"?"}

	if not args.nopl then	
		data.forms["nom_du"] = {args[1] .. "ī"}
		data.forms["voc_du"] = {args[1] .. "ī"}
		data.forms["acc_du"] = {args[1] .. "ī"}
		data.forms["gen_du"] = {args[1] .. "yous"}
		data.forms["dat_du"] = {args[1] .. "yābom"}
		data.forms["loc_du"] = {"?"}
		data.forms["ins_du"] = {args[1] .. "yābim"}
		
		data.forms["nom_pl"] = {args[1] .. "yās"}
		data.forms["voc_pl"] = {args[1] .. "yās"}
		data.forms["acc_pl"] = {args[1] .. "īms"}
		data.forms["gen_pl"] = {args[1] .. "yom"}
		data.forms["dat_pl"] = {args[1] .. "yābos"}
		data.forms["loc_pl"] = {"?"}
		data.forms["ins_pl"] = {args[1] .. "yābis"}
	end
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["cons-mf"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		[2] = {},
		
		["n"] = {},
		["nopl"] = {},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	local nomsg = mw.ustring.gsub(args[1], "[bdgkɸst]$", {["b"] = "x", ["d"] = "s", ["g"] = "x", ["k"] = "x", ["ɸ"] = "x", ["s"] = "", ["t"] = "s"})
	
	local data = {forms = {}, info = "陽性/陰性輔音詞幹名詞", categories = {lang:getCanonicalName() .. "輔音詞幹名詞"}}
	
	data.forms["nom_sg"] = {args[2] or nomsg .. "s"}
	data.forms["voc_sg"] = {args[2] or nomsg .. "s"}
	data.forms["acc_sg"] = {args[1] .. "am"}
	data.forms["gen_sg"] = {args[1] .. "os"}
	data.forms["dat_sg"] = {args[1] .. "ei"}
	data.forms["loc_sg"] = {args[1] .. "i"}
	data.forms["ins_sg"] = {args[1] .. "e?"}

	if not args.nopl then	
		data.forms["nom_du"] = {args[1] .. "e"}
		data.forms["voc_du"] = {args[1] .. "e"}
		data.forms["acc_du"] = {args[1] .. "e"}
		data.forms["gen_du"] = {args[1] .. "ou"}
		data.forms["dat_du"] = {args[1] .. "obom"}
		data.forms["ins_du"] = {args[1] .. "obim"}
		
		data.forms["nom_pl"] = {args[1] .. "es"}
		data.forms["voc_pl"] = {args[1] .. "es"}
		data.forms["acc_pl"] = {args[1] .. "ams"}
		data.forms["gen_pl"] = {args[1] .. "om"}
		data.forms["dat_pl"] = {args[1] .. "obos"}
		data.forms["ins_pl"] = {args[1] .. "obis"}
	end
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end

export["cons-n"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		[2] = {},
		
		["n"] = {},
		["nopl"] = {},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "neuter consonant stem", categories = {lang:getCanonicalName() .. " consonant stem nouns"}}
	
	data.forms["nom_sg"] = {args[1]}
	data.forms["voc_sg"] = {args[1]}
	data.forms["acc_sg"] = {args[1]}
	data.forms["gen_sg"] = {args[1] .. "os"}
	data.forms["dat_sg"] = {args[1] .. "ē"}
	data.forms["loc_sg"] = {args[1] .. "i"}
	data.forms["ins_sg"] = {args[1] .. "e?"}

	if not args.nopl then	
		data.forms["nom_du"] = {args[1] .. "e"}
		data.forms["voc_du"] = {args[1] .. "e"}
		data.forms["acc_du"] = {args[1] .. "e"}
		data.forms["gen_du"] = {args[1] .. "ou"}
		data.forms["dat_du"] = {args[1] .. "obom"}
		data.forms["loc_du"] = {"?"}
		data.forms["ins_du"] = {args[1] .. "obim"}
		
		data.forms["nom_pl"] = {args[1] .. "a"}
		data.forms["voc_pl"] = {args[1] .. "a"}
		data.forms["acc_pl"] = {args[1] .. "a"}
		data.forms["gen_pl"] = {args[1] .. "om"}
		data.forms["dat_pl"] = {args[1] .. "obos"}
		data.forms["loc_pl"] = {"?"}
		data.forms["ins_pl"] = {args[1] .. "obis"}
	end
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["i-mf"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		
		["n"] = {},
		["nopl"] = {},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "陽性/陰性i-詞幹", categories = {lang:getCanonicalName() .. "i-詞幹名詞"}}
	
	data.forms["nom_sg"] = {args[1] .. "is"}
	data.forms["voc_sg"] = {args[1] .. "i"}
	data.forms["acc_sg"] = {args[1] .. "im"}
	data.forms["gen_sg"] = {args[1] .. "eis"}
	data.forms["dat_sg"] = {args[1] .. "ei"}
	data.forms["loc_sg"] = {args[1] .. "ei"}
	data.forms["ins_sg"] = {args[1] .. "ī"}

	if not args.nopl then	
		data.forms["nom_du"] = {args[1] .. "ī"}
		data.forms["voc_du"] = {args[1] .. "ī"}
		data.forms["acc_du"] = {args[1] .. "ī"}
		data.forms["gen_du"] = {args[1] .. "yow"}
		data.forms["dat_du"] = {args[1] .. "ibom"}
		data.forms["loc_du"] = {"?"}
		data.forms["ins_du"] = {args[1] .. "ibim"}
		
		data.forms["nom_pl"] = {args[1] .. "īs"}
		data.forms["voc_pl"] = {args[1] .. "īs"}
		data.forms["acc_pl"] = {args[1] .. "ims"}
		data.forms["gen_pl"] = {args[1] .. "yom"}
		data.forms["dat_pl"] = {args[1] .. "ibos"}
		data.forms["loc_pl"] = {"?"}
		data.forms["ins_pl"] = {args[1] .. "ibis"}
	end
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["i-n"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		
		["n"] = {},
		["nopl"] = {},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "中性i-詞幹", categories = {lang:getCanonicalName() .. "i-詞幹名詞"}}
	
	data.forms["nom_sg"] = {args[1] .. "i"}
	data.forms["voc_sg"] = {args[1] .. "i"}
	data.forms["acc_sg"] = {args[1] .. "i"}
	data.forms["gen_sg"] = {args[1] .. "ois"}
	data.forms["dat_sg"] = {args[1] .. "ei"}
	data.forms["loc_sg"] = {args[1] .. "ei"}
	data.forms["ins_sg"] = {args[1] .. "ī"}

	if not args.nopl then	
		data.forms["nom_du"] = {args[1] .. "ī"}
		data.forms["voc_du"] = {args[1] .. "ī"}
		data.forms["acc_du"] = {args[1] .. "ī"}
		data.forms["gen_du"] = {args[1] .. "ois"}
		data.forms["dat_du"] = {args[1] .. "ibom"}
		data.forms["loc_du"] = {"?"}
		data.forms["ins_du"] = {args[1] .. "ibim"}
		
		data.forms["nom_pl"] = {args[1] .. "yā"}
		data.forms["voc_pl"] = {args[1] .. "yā"}
		data.forms["acc_pl"] = {args[1] .. "yā"}
		data.forms["gen_pl"] = {args[1] .. "yom"}
		data.forms["dat_pl"] = {args[1] .. "ibos"}
		data.forms["loc_pl"] = {"?"}
		data.forms["ins_pl"] = {args[1] .. "ibis"}
	end
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["n-mf"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		
		["n"] = {},
		["nopl"] = {},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	local delabial = mw.ustring.gsub(args[1], "ʷ$", "")
	
	local data = {forms = {}, info = "陽性/陰性n-詞幹", categories = {lang:getCanonicalName() .. "n-詞幹名詞"}}
	
	data.forms["nom_sg"] = {delabial .. "ū"}
	data.forms["voc_sg"] = {delabial .. "ū"}
	data.forms["acc_sg"] = {args[1] .. "onam"}
	data.forms["gen_sg"] = {args[1] .. "onos"}
	data.forms["dat_sg"] = {args[1] .. "onei"}
	data.forms["loc_sg"] = {args[1] .. "on(i)"}
	data.forms["ins_sg"] = {args[1] .. "onei"}

	if not args.nopl then	
		data.forms["nom_du"] = {args[1] .. "one?"}
		data.forms["voc_du"] = {args[1] .. "one?"}
		data.forms["acc_du"] = {args[1] .. "one?"}
		data.forms["gen_du"] = {args[1] .. "onows?"}
		data.forms["dat_du"] = {args[1] .. "ombom"}
		data.forms["loc_du"] = {"?"}
		data.forms["ins_du"] = {args[1] .. "ombim"}
		
		data.forms["nom_pl"] = {args[1] .. "ones"}
		data.forms["voc_pl"] = {args[1] .. "ones"}
		data.forms["acc_pl"] = {args[1] .. "onams"}
		data.forms["gen_pl"] = {args[1] .. "onom"}
		data.forms["dat_pl"] = {args[1] .. "ombos"}
		data.forms["loc_pl"] = {"?"}
		data.forms["ins_pl"] = {args[1] .. "ombis"}
	end
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["n-n"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		
		["n"] = {},
		["nopl"] = {},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "中性n-詞幹", categories = {lang:getCanonicalName() .. "n-詞幹名詞"}}
	
	data.forms["nom_sg"] = {args[1] .. "an"}
	data.forms["voc_sg"] = {args[1] .. "an"}
	data.forms["acc_sg"] = {args[1] .. "an"}
	data.forms["gen_sg"] = {args[1] .. "ens"}
	data.forms["dat_sg"] = {args[1] .. "enē"}
	data.forms["loc_sg"] = {args[1] .. "en(i)"}
	data.forms["ins_sg"] = {args[1] .. "enē"}

	if not args.nopl then	
		data.forms["nom_du"] = {args[1] .. "ane?"}
		data.forms["voc_du"] = {args[1] .. "ane?"}
		data.forms["acc_du"] = {args[1] .. "ane?"}
		data.forms["gen_du"] = {args[1] .. "enous?"}
		data.forms["dat_du"] = {args[1] .. "embom"}
		data.forms["loc_du"] = {"?"}
		data.forms["ins_du"] = {args[1] .. "embim"}
		
		data.forms["nom_pl"] = {args[1] .. "ana"}
		data.forms["voc_pl"] = {args[1] .. "ana"}
		data.forms["acc_pl"] = {args[1] .. "ana"}
		data.forms["gen_pl"] = {args[1] .. "enom"}
		data.forms["dat_pl"] = {args[1] .. "embos"}
		data.forms["loc_pl"] = {"?"}
		data.forms["ins_pl"] = {args[1] .. "embis"}
	end
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["o-m"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		
		["n"] = {},
		["nopl"] = {},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	local delabial = mw.ustring.gsub(args[1], "ʷ$", "")
	
	local data = {forms = {}, info = "陽性o-詞幹", categories = {lang:getCanonicalName() .. "o-詞幹名詞"}}
	
	data.forms["nom_sg"] = {args[1] .. "os"}
	data.forms["voc_sg"] = {args[1] .. "e"}
	data.forms["acc_sg"] = {args[1] .. "om"}
	data.forms["gen_sg"] = {args[1] .. "ī"}
	data.forms["dat_sg"] = {delabial .. "ūi"}
	data.forms["loc_sg"] = {args[1] .. "ei"}
	data.forms["ins_sg"] = {delabial .. "ū"}
	
	if not args.nopl then
		data.forms["nom_du"] = {args[1] .. "ou"}
		data.forms["voc_du"] = {args[1] .. "ou"}
		data.forms["acc_du"] = {args[1] .. "ou"}
		data.forms["gen_du"] = {args[1] .. "ous"}
		data.forms["dat_du"] = {args[1] .. "obom"}
		data.forms["loc_du"] = {"?"}
		data.forms["ins_du"] = {args[1] .. "obim"}
	
		data.forms["nom_pl"] = {args[1] .. "oi"}
		data.forms["voc_pl"] = {delabial .. "ūs"}
		data.forms["acc_pl"] = {delabial .. "oms"}
		data.forms["gen_pl"] = {args[1] .. "om"}
		data.forms["dat_pl"] = {args[1] .. "obos"}
		data.forms["loc_pl"] = {"?"}
		data.forms["ins_pl"] = {args[1] .. "ūis"}
	end
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["o-n"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		
		["n"] = {},
		["nopl"] = {},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	local delabial = mw.ustring.gsub(args[1], "ʷ$", "")
	
	local data = {forms = {}, info = "中性o-詞幹", categories = {lang:getCanonicalName() .. "o-詞幹名詞"}}
	
	data.forms["nom_sg"] = {args[1] .. "om"}
	data.forms["voc_sg"] = {args[1] .. "om"}
	data.forms["acc_sg"] = {args[1] .. "om"}
	data.forms["gen_sg"] = {args[1] .. "ī"}
	data.forms["dat_sg"] = {delabial .. "ūi"}
	data.forms["loc_sg"] = {args[1] .. "ei"}
	data.forms["ins_sg"] = {delabial .. "ū"}

	if not args.nopl then	
		data.forms["nom_du"] = {args[1] .. "ou"}
		data.forms["voc_du"] = {args[1] .. "ou"}
		data.forms["acc_du"] = {args[1] .. "ou"}
		data.forms["gen_du"] = {args[1] .. "ous"}
		data.forms["dat_du"] = {args[1] .. "obom"}
		data.forms["loc_du"] = {"?"}
		data.forms["ins_du"] = {args[1] .. "obim"}
	
		data.forms["nom_pl"] = {args[1] .. "ā"}
		data.forms["voc_pl"] = {args[1] .. "ā"}
		data.forms["acc_pl"] = {args[1] .. "ā"}
		data.forms["gen_pl"] = {args[1] .. "om"}
		data.forms["dat_pl"] = {args[1] .. "obos"}
		data.forms["loc_pl"] = {"?"}
		data.forms["ins_pl"] = {args[1] .. "ūis"}
	end
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["r-mf"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		
		["n"] = {},
		["nopl"] = {},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "陽性/陰性r-詞幹", categories = {lang:getCanonicalName() .. "r-詞幹名詞"}}
	
	data.forms["nom_sg"] = {args[1] .. "īr"}
	data.forms["voc_sg"] = {args[1] .. "er"}
	data.forms["acc_sg"] = {args[1] .. "eram"}
	data.forms["gen_sg"] = {args[1] .. "ros"}
	data.forms["dat_sg"] = {args[1] .. "rē"}
	data.forms["loc_sg"] = {args[1] .. "ri"}
	data.forms["ins_sg"] = {args[1] .. "rē"}

	if not args.nopl then
		data.forms["nom_du"] = {args[1] .. "ere"}
		data.forms["voc_du"] = {args[1] .. "ere"}
		data.forms["acc_du"] = {args[1] .. "ere"}
		data.forms["gen_du"] = {args[1] .. "rous"}
		data.forms["dat_du"] = {args[1] .. "arbom"}
		data.forms["loc_du"] = {"?"}
		data.forms["ins_du"] = {args[1] .. "arbim"}

		data.forms["nom_pl"] = {args[1] .. "eres"}
		data.forms["voc_pl"] = {args[1] .. "eres"}
		data.forms["acc_pl"] = {args[1] .. "erams"}
		data.forms["gen_pl"] = {args[1] .. "rom"}
		data.forms["dat_pl"] = {args[1] .. "arbos"}
		data.forms["loc_pl"] = {"?"}
		data.forms["ins_pl"] = {args[1] .. "arbis"}
	end
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["s-n"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		
		["n"] = {},
		["nopl"] = {},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "中性s-詞幹", categories = {lang:getCanonicalName() .. "s-詞幹名詞"}}
	
	data.forms["nom_sg"] = {args[1] .. "os"}
	data.forms["voc_sg"] = {args[1] .. "os"}
	data.forms["acc_sg"] = {args[1] .. "os"}
	data.forms["gen_sg"] = {args[1] .. "esos"}
	data.forms["dat_sg"] = {args[1] .. "esē"}
	data.forms["loc_sg"] = {args[1] .. "esi"}
	data.forms["ins_sg"] = {args[1] .. "esē"}

	if not args.nopl then
		data.forms["nom_du"] = {args[1] .. "ese?"}
		data.forms["voc_du"] = {args[1] .. "ese?"}
		data.forms["acc_du"] = {args[1] .. "ese?"}
		data.forms["gen_du"] = {args[1] .. "esous?"}
		data.forms["dat_du"] = {args[1] .. "esbom"}
		data.forms["loc_du"] = {"?"}
		data.forms["ins_du"] = {args[1] .. "esbim"}
	
		data.forms["nom_pl"] = {args[1] .. "esa"}
		data.forms["voc_pl"] = {args[1] .. "esa"}
		data.forms["acc_pl"] = {args[1] .. "esa"}
		data.forms["gen_pl"] = {args[1] .. "esom"}
		data.forms["dat_pl"] = {args[1] .. "esbos"}
		data.forms["loc_pl"] = {"?"}
		data.forms["ins_pl"] = {args[1] .. "esbis"}
	end
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["u-mf"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		
		["n"] = {},
		["nopl"] = {},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "陽性/陰性u-詞幹", categories = {lang:getCanonicalName() .. "u-詞幹名詞"}}
	
	data.forms["nom_sg"] = {args[1] .. "us"}
	data.forms["voc_sg"] = {args[1] .. "u"}
	data.forms["acc_sg"] = {args[1] .. "um"}
	data.forms["gen_sg"] = {args[1] .. "ous"}
	data.forms["dat_sg"] = {args[1] .. "ou"}
	data.forms["loc_sg"] = {"?"}
	data.forms["ins_sg"] = {args[1] .. "ū"}

	if not args.nopl then	
		data.forms["nom_du"] = {args[1] .. "ū"}
		data.forms["voc_du"] = {args[1] .. "ū"}
		data.forms["acc_du"] = {args[1] .. "ū"}
		data.forms["gen_du"] = {args[1] .. "ous"}
		data.forms["dat_du"] = {args[1] .. "ubom"}
		data.forms["loc_du"] = {"?"}
		data.forms["ins_du"] = {args[1] .. "ubim"}
		
		data.forms["nom_pl"] = {args[1] .. "owes"}
		data.forms["voc_pl"] = {args[1] .. "ūs"}
		data.forms["acc_pl"] = {args[1] .. "ums"}
		data.forms["gen_pl"] = {args[1] .. "owom"}
		data.forms["dat_pl"] = {args[1] .. "ubos"}
		data.forms["loc_pl"] = {"?"}
		data.forms["ins_pl"] = {args[1] .. "ubis"}
	end
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


export["u-n"] = function(frame)
	local params = {
		[1] = {required = true, default = "{{{1}}}"},
		
		["n"] = {},
		["nopl"] = {},
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "中性u-詞幹", categories = {lang:getCanonicalName() .. "u-詞幹名詞"}}
	
	data.forms["nom_sg"] = {args[1] .. "u"}
	data.forms["voc_sg"] = {args[1] .. "u"}
	data.forms["acc_sg"] = {args[1] .. "u"}
	data.forms["gen_sg"] = {args[1] .. "ous"}
	data.forms["dat_sg"] = {args[1] .. "ou"}
	data.forms["loc_sg"] = {"?"}
	data.forms["ins_sg"] = {args[1] .. "ū"}

	if not args.nopl then	
		data.forms["nom_du"] = {args[1] .. "ū"}
		data.forms["voc_du"] = {args[1] .. "ū"}
		data.forms["acc_du"] = {args[1] .. "ū"}
		data.forms["gen_du"] = {args[1] .. "ous"}
		data.forms["dat_du"] = {args[1] .. "ubom"}
		data.forms["loc_du"] = {"?"}
		data.forms["ins_du"] = {args[1] .. "ubim"}
		
		data.forms["nom_pl"] = {args[1] .. "wā"}
		data.forms["voc_pl"] = {args[1] .. "wā"}
		data.forms["acc_pl"] = {args[1] .. "wā"}
		data.forms["gen_pl"] = {args[1] .. "owom"}
		data.forms["dat_pl"] = {args[1] .. "ubos"}
		data.forms["loc_pl"] = {"?"}
		data.forms["ins_pl"] = {args[1] .. "ubis"}
	end
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


-- Irregular nouns

export["benā"] = function(frame)
	local params = {
		}
	
	local args = require("Module:parameters").process(frame:getParent().args, params)
	
	local data = {forms = {}, info = "ā-詞幹,不規則", categories = {lang:getCanonicalName() .. "ā-詞幹名詞", lang:getCanonicalName() .. "不規則名詞"}}
	
	data.forms["nom_sg"] = {"benā"}
	data.forms["voc_sg"] = {"benā"}
	data.forms["acc_sg"] = {"benam"}
	data.forms["gen_sg"] = {"bnās"}
	data.forms["dat_sg"] = {"bnāi"}
	data.forms["loc_sg"] = {"bnai"}
	data.forms["ins_sg"] = {"?"}
	
	data.forms["nom_du"] = {"bnai?"}
	data.forms["voc_du"] = {"bnai?"}
	data.forms["acc_du"] = {"bnai?"}
	data.forms["gen_du"] = {"bnous"}
	data.forms["dat_du"] = {"bnābom"}
	data.forms["loc_du"] = {"?"}
	data.forms["ins_du"] = {"bnābim"}
	
	data.forms["nom_pl"] = {"bnās"}
	data.forms["voc_pl"] = {"bnās"}
	data.forms["acc_pl"] = {"bnams"}
	data.forms["gen_pl"] = {"bnaom?", "bnanom", "banom"}
	data.forms["dat_pl"] = {"bnābos"}
	data.forms["loc_pl"] = {"?"}
	data.forms["ins_pl"] = {"bnābis"}
	
	postprocess(args, data)
	
	return make_table(data) .. m_utilities.format_categories(data.categories, lang)
end


local names = {
	
	["nom"] = "主格",
	["voc"] = "呼格",
	["acc"] = "賓格",
	["gen"] = "屬格",
	["dat"] = "與格",
	["loc"] = "方位格",
	["ins"] = "工具格",
	
	["sg"] = "單數",
	["du"] = "雙數",
	["pl"] = "複數",
	
	["m"] = "陽性",
	["f"] = "陰性",
	["n"] = "中性",
}

-- Make the table
function make_table(data)
	local function repl(param)
		if param == "info" then
			return mw.getContentLanguage():ucfirst(data.info or "")
		end
		
		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 numbers = {"sg", "du", "pl"}
	local cases = {"nom", "voc", "acc", "gen", "dat", "loc", "ins"}
	
	local wikicode = {}
	
	table.insert(wikicode, "{| class=\"inflection-table vsSwitcher\" data-toggle-category=\"inflection\" style=\"background: #FAFAFA; border: 1px solid #d0d0d0; text-align: left;\" cellspacing=\"1\" cellpadding=\"2\"")
	table.insert(wikicode, "|- style=\"background: #CCCCFF;\"\n! class=\"vsToggleElement\" style=\"min-width: 41em;\" colspan=\"" .. (#numbers + 1) .. "\" | {{{info}}}")
	
	table.insert(wikicode, "|- class=\"vsHide\" style=\"background: #CCCCFF;\"")
	table.insert(wikicode, "!")
	
	for _, number in ipairs(numbers) do
		table.insert(wikicode, "! style=\"min-width: 11em; background: #CCCCFF;\" | " .. names[number])
	end
	
	for _, case in ipairs(cases) do
		table.insert(wikicode, "|- class=\"vsHide\" style=\"background-color: #F2F2FF;\"\n! style=\"min-width: 8em; background-color: #E6E6FF;\" | " .. names[case])
		
		for _, number in ipairs(numbers) do
			table.insert(wikicode, "| {{{" .. case .. "_" .. number .. "}}}")
		end
	end
	
	table.insert(wikicode, "|}")
	
	wikicode = table.concat(wikicode, "\n")
	
	return (mw.ustring.gsub(wikicode, "{{{([a-z0-9_]+)}}}", repl))
end

return export