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

local export = {}


-- Inflection functions (common nouns)

function export.anim(frame)
	local args = frame:getParent().args
		
	local data = {
		forms = {},
		info = "變格:",
		categories = {},
	}
	
	local ending_text = 0
	
	-- add the lemma form
	local base = mw.title.getCurrentTitle().text
	data.forms["absv|indef"] = {base}
	data.info = data.info .. require("Module:links").full_link({lang = lang, alt = base}, "term") .. " (有生,結尾為 "

	-- add the prolative
	data.forms["pro|indef"] = {base .. "tzat"}
	if	base:sub(-2,-1) == "tz" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "ztzat"}
	elseif base:sub(-2,-1) == "ts" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "stzat"}
	elseif base:sub(-2,-1) == "tx" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "xtzat"}
	elseif base:sub(-1) == "t" then
		data.forms["pro|indef"] = {base .. "-tzat"}
	end
	
	-- epenthetic "e" and "r", ending in vowel/-a
	local e = "e"
	if base:sub(-1) == "a"  then 
		e = ""
		ending_text = 1
	elseif base:sub(-1) == "e" or base:sub(-1) == "i" or base:sub(-1) == "o" or base:sub(-1) == "u" then -- FIXME, this can be written in a cleaner way for sure
		e = ""
		ending_text = 2
	end
	local r = "r"
	if e == "e" then
		r = ""
	end
	
	-- exception for monosyllabic nouns ending in a dipthong
	local e2 = ""
	if args.dip then
		e2 = "e"
	end
	
	-- modifications if the word ends in -r
	if	base:sub(-1) == "r" then
		if args.tap then
			ending_text = 3
		else
			base = base .. 'r' --add an r if the word ends in r
			ending_text = 4
		end
	else
		
	end
	
	-- modifications if the word ends in -a
	local base_pl = base
	if base:sub(-1) == "a" then
		base_pl = base:sub(1,-2)
	end
	
	-- write "ending in ..."
	if ending_text == 0 then
		data.info = data.info .. "輔音)"
	elseif ending_text == 1 then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = "-a"}, "term") .. ")"
	elseif ending_text == 2 then
		data.info = data.info .. "元音" .. ")"
	elseif ending_text == 3 then
		data.info = data.info .. "tap " .. require("Module:links").full_link({lang = lang, alt = "-r"}, "term") .. ")"
	elseif ending_text == 4 then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = "-r"}, "term") .. ")"
	end
	
	data.forms["absv|s"] = {base_pl .. "a"}
	data.forms["absv|p"] = {base_pl .. "ak"}

	data.forms["erg|indef"] = {base .. e .. "k"}
	data.forms["erg|s"] = {base_pl .. "ak"}
	data.forms["erg|p"] = {base_pl .. "ek"}
	
	data.forms["dat|indef"] = {base .. r .. "i"}
	data.forms["dat|s"] = {base_pl .. "ari"}
	data.forms["dat|p"] = {base_pl .. "ei"}
	
	data.forms["gen|indef"] = {base .. r .. "en"}
	data.forms["gen|s"] = {base_pl .. "aren"}
	data.forms["gen|p"] = {base_pl .. "en"}
	
	data.forms["com|indef"] = {base .. r .. "ekin"}
	data.forms["com|s"] = {base_pl .. "arekin"}
	data.forms["com|p"] = {base_pl .. "ekin"}
	
	data.forms["caus|indef"] = {base .. r .. "engatik"}
	data.forms["caus|s"] = {base_pl .. "arengatik"}
	data.forms["caus|p"] = {base_pl .. "engatik"}
	
	data.forms["ben|indef"] = {base .. r .. "entzat"}
	data.forms["ben|s"] = {base_pl .. "arentzat"}
	data.forms["ben|p"] = {base_pl .. "entzat"}
	
	data.forms["ins|indef"] = {base .. e .. e2 .. "z"}
	data.forms["ins|s"] = {base_pl .. "az"}
	data.forms["ins|p"] = {base_pl .. "ez"}
	
	data.forms["ine|indef"] = {base .. r .. "engan"}
	data.forms["ine|s"] = {base_pl .. "arengan"}
	data.forms["ine|p"] = {base_pl .. "engan"}
	
	data.forms["all|indef"] = {base .. r .. "engana"}
	data.forms["all|s"] = {base_pl .. "arengana"}
	data.forms["all|p"] = {base_pl .. "engana"}
	
	data.forms["ter|indef"] = {base .. r .. "enganaino"}
	data.forms["ter|s"] = {base_pl .. "arenganaino"}
	data.forms["ter|p"] = {base_pl .. "enganaino"}
	
	data.forms["directive|indef"] = {base .. r .. "enganantz"}
	data.forms["directive|s"] = {base_pl .. "arenganantz"}
	data.forms["directive|p"] = {base_pl .. "enganantz"}
	
	data.forms["destinative|indef"] = {base .. r .. "enganako"}
	data.forms["destinative|s"] = {base_pl .. "arenganako"}
	data.forms["destinative|p"] = {base_pl .. "enganako"}
	
	data.forms["abl|indef"] = {base .. r .. "engandik"}
	data.forms["abl|s"] = {base_pl .. "arengandik"}
	data.forms["abl|p"] = {base_pl .. "engandik"}
	
	data.forms["par|indef"] = {base .. r .. "ik"}

	postprocess(args, data)
	
	return make_table(data)
end

function export.inanim(frame)
	local args = frame:getParent().args
		
	local data = {
		forms = {},
		info = "變格:",
		categories = {},
	}
	
	local ending_text = 0
	
	-- add the lemma form
	local base = mw.title.getCurrentTitle().text
	data.forms["absv|indef"] = {base}
	if args.s then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = base}, "term") .. " (無生,僅單數,結尾為"
	else
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = base}, "term") .. " (無生,結尾為"
	end
	-- add the prolative
	data.forms["pro|indef"] = {base .. "tzat"}
	if	base:sub(-2,-1) == "tz" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "ztzat"}
	elseif base:sub(-2,-1) == "ts" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "stzat"}
	elseif base:sub(-2,-1) == "tx" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "xtzat"}
	elseif base:sub(-1) == "t" then
		data.forms["pro|indef"] = {base .. "-tzat"}
	end
	if args.hyph and args.ending == "V" then 
		data.forms["pro|indef"] = {base .. "-tzat"}
	end
	
	-- epenthetic "e" and "r", ending in vowel/-a. The vocalic ending can be forced in acronyms
	local e = "e"
	if base:sub(-1) == "a"  then 
		e = ""
		ending_text = 1
	elseif base:sub(-1) == "e" or base:sub(-1) == "i" or base:sub(-1) == "o" or base:sub(-1) == "u" or args.ending == "V" then -- FIXME, this can be written in a cleaner way for sure
		e = ""
		ending_text = 2
	end
	local r = "r"
	if e == "e" then
		r = ""
	end
	
	-- exception for monosyllabic nouns ending in a dipthong and the word "gau"
	local e2 = ""
	if args.dip then
		e2 = "e"
	end
	local e3 = ""
	if args.gau then
		e3 = "e"
	end
	
	--modifications if a hyphen is needed
	if args.hyph then
		base = base .. "-"
	end
	
	-- modifications if the word ends in -r
	if	base:sub(-1) == "r" then
		if args.tap then
			ending_text = 3
		else
			base = base .. 'r' --add an r if the word ends in r
			ending_text = 4
		end
	else
		
	end
	
	-- modifications if the word ends in -a
	local base_pl = base
	if base:sub(-1) == "a" then
		base_pl = base:sub(1,-2)
	end
	
	-- write "ending in ..."
	if ending_text == 0 then
		data.info = data.info .. "輔音)"
	elseif ending_text == 1 then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = "-a"}, "term") .. ")"
	elseif ending_text == 2 then
		data.info = data.info .. "元音" .. ")"
	elseif ending_text == 3 then
		data.info = data.info .. "tap " .. require("Module:links").full_link({lang = lang, alt = "-r"}, "term") .. ")"
	elseif ending_text == 4 then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = "-r"}, "term") .. ")"
	end
	
	if not args.s then -- ignore these forms in singular-only nouns
		data.forms["absv|p"] = {base_pl .. "ak"}
		
		data.forms["erg|indef"] = {base .. e .. "k"}
		data.forms["erg|p"] = {base_pl .. "ek"}
	
		data.forms["dat|indef"] = {base .. r .. "i"}
		data.forms["dat|p"] = {base_pl .. "ei"}
	
		data.forms["gen|indef"] = {base .. r .. "en"}
		data.forms["gen|p"] = {base_pl .. "en"}
	
		data.forms["com|indef"] = {base .. r .. "ekin"}
		data.forms["com|p"] = {base_pl .. "ekin"}
	
		data.forms["caus|indef"] = {base .. r .. "engatik"}
		data.forms["caus|p"] = {base_pl .. "engatik"}
	
		data.forms["ben|indef"] = {base .. r .. "entzat"}
		data.forms["ben|p"] = {base_pl .. "entzat"}
	
		data.forms["ins|p"] = {base_pl .. "ez"}
	
		data.forms["ine|indef"] = {base .. e  .. "tan"}
		data.forms["ine|p"] = {base_pl .. "etan"}
	
		data.forms["loc|indef"] = {base .. e .. "tako"}
		data.forms["loc|s"] = {base .. e .. e3 .. "ko"}
		data.forms["loc|p"] = {base_pl .. "etako"}
	
		data.forms["all|indef"] = {base .. e .. "tara"}
		data.forms["all|s"] = {base .. e .. e3 .. "ra"}
		data.forms["all|p"] = {base_pl .. "etara"}
	
		data.forms["ter|indef"] = {base .. e .. "taraino"}
		data.forms["ter|s"] = {base .. e .. e3 .. "raino"}
		data.forms["ter|p"] = {base_pl .. "etaraino"}
	
		data.forms["directive|indef"] = {base .. e .. "tarantz"}
		data.forms["directive|s"] = {base .. e .. e3 .. "rantz"}
		data.forms["directive|p"] = {base_pl .. "etarantz"}
	
		data.forms["destinative|indef"] = {base .. e .. "tarako"}
		data.forms["destinative|s"] = {base .. e .. e3 .. "rako"}
		data.forms["destinative|p"] = {base_pl .. "etarako"}
	
		data.forms["abl|indef"] = {base .. e .. "tatik"}
		data.forms["abl|s"] = {base .. e .. e3 .. "tik"}
		data.forms["abl|p"] = {base_pl .. "etatik"}
	end
	
	data.forms["absv|s"] = {base_pl .. "a"}
	data.forms["erg|s"] = {base_pl .. "ak"}
	data.forms["dat|s"] = {base_pl .. "ari"}
	data.forms["gen|s"] = {base_pl .. "aren"}
	data.forms["com|s"] = {base_pl .. "arekin"}
	data.forms["caus|s"] = {base_pl .. "arengatik"}
	data.forms["ben|s"] = {base_pl .. "arentzat"}
	data.forms["ins|indef"] = {base .. e .. e2 .. e3 .. "z"}
	data.forms["ins|s"] = {base_pl .. "az"}
	data.forms["ine|s"] = {base_pl .. e .. e3 .. "an"}
	data.forms["par|indef"] = {base .. r .. "ik"}

	postprocess(args, data)
	
	return make_table(data)
end

function export.both(frame)
	local args = frame:getParent().args
		
	local data = {
		forms = {},
		info = "變格: ",
		categories = {},
	}
	
	local ending_text = 0
	
	-- add the lemma form
	local base = mw.title.getCurrentTitle().text
	data.forms["absv|indef"] = {base}
	if args.adj then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = base}, "term") .. " (形容詞,結尾為 "
	elseif args.num then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = base}, "term") .. " (數詞,結尾為 "
	else
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = base}, "term") .. " (有生及無生,結尾為 "
	end
	-- add the prolative
	data.forms["pro|indef"] = {base .. "tzat"}
	if	base:sub(-2,-1) == "tz" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "ztzat"}
	elseif base:sub(-2,-1) == "ts" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "stzat"}
	elseif base:sub(-2,-1) == "tx" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "xtzat"}
	elseif base:sub(-1) == "t" then
		data.forms["pro|indef"] = {base .. "-tzat"}
	end
	
	-- epenthetic "e" and "r", ending in vowel/-a
	local e = "e"
	if base:sub(-1) == "a"  then 
		e = ""
		ending_text = 1
	elseif base:sub(-1) == "e" or base:sub(-1) == "i" or base:sub(-1) == "o" or base:sub(-1) == "u" then -- FIXME, this can be written in a cleaner way for sure
		e = ""
		ending_text = 2
	end
	local r = "r"
	if e == "e" then
		r = ""
	end
	
	-- exception for monosyllabic nouns ending in a dipthong and the word "gau"
	local e2 = ""
	if args.dip then
		e2 = "e"
	end
	local e3 = ""
	if args.gau then
		e3 = "e"
	end
	
	-- modifications if the word ends in -r
	if	base:sub(-1) == "r" then
		if args.tap then
			ending_text = 3
		else
			base = base .. 'r' --add an r if the word ends in r
			ending_text = 4
		end
	else
		
	end
	
	-- modifications if the word ends in -a
	local base_pl = base
	if base:sub(-1) == "a" then
		base_pl = base:sub(1,-2)
	end
	
	-- write "ending in ..."
	if ending_text == 0 then
		data.info = data.info .. "輔音)"
	elseif ending_text == 1 then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = "-a"}, "term") .. ")"
	elseif ending_text == 2 then
		data.info = data.info .. "元音" .. ")"
	elseif ending_text == 3 then
		data.info = data.info .. "tap " .. require("Module:links").full_link({lang = lang, alt = "-r"}, "term") .. ")"
	elseif ending_text == 4 then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = "-r"}, "term") .. ")"
	end
	
	data.forms["absv|s"] = {base_pl .. "a"}
	data.forms["absv|p"] = {base_pl .. "ak"}
		
	data.forms["erg|indef"] = {base .. e .. "k"}
	data.forms["erg|s"] = {base_pl .. "ak"}
	data.forms["erg|p"] = {base_pl .. "ek"}
	
	data.forms["dat|indef"] = {base .. r .. "i"}
	data.forms["dat|s"] = {base_pl .. "ari"}
	data.forms["dat|p"] = {base_pl .. "ei"}
	
	data.forms["gen|indef"] = {base .. r .. "en"}
	data.forms["gen|s"] = {base_pl .. "aren"}
	data.forms["gen|p"] = {base_pl .. "en"}
	
	data.forms["com|indef"] = {base .. r .. "ekin"}
	data.forms["com|s"] = {base_pl .. "arekin"}
	data.forms["com|p"] = {base_pl .. "ekin"}
	
	data.forms["caus|indef"] = {base .. r .. "engatik"}
	data.forms["caus|s"] = {base_pl .. "arengatik"}
	data.forms["caus|p"] = {base_pl .. "engatik"}
	
	data.forms["ben|indef"] = {base .. r .. "entzat"}
	data.forms["ben|s"] = {base_pl .. "arentzat"}
	data.forms["ben|p"] = {base_pl .. "entzat"}
	
	data.forms["ins|indef"] = {base .. e .. e2 .. e3 .. "z"}
	data.forms["ins|s"] = {base_pl .. "az"}
	data.forms["ins|p"] = {base_pl .. "ez"}
	
	data.forms["ine|inanimate|indef"] = {base .. e  .. "tan"}
	data.forms["ine|inanimate|s"] = {base_pl .. e .. e3 .. "an"}
	data.forms["ine|inanimate|p"] = {base_pl .. "etan"}
	data.forms["ine|animate|indef"] = {base .. r .. "engan"}
	data.forms["ine|animate|s"] = {base_pl .. "arengan"}
	data.forms["ine|animate|p"] = {base_pl .. "engan"}

	data.forms["loc|inanimate|indef"] = {base .. e .. "tako"}
	data.forms["loc|inanimate|s"] = {base .. e .. e3 .. "ko"}
	data.forms["loc|inanimate|p"] = {base_pl .. "etako"}
	
	data.forms["all|inanimate|indef"] = {base .. e .. "tara"}
	data.forms["all|inanimate|s"] = {base .. e .. e3 .. "ra"}
	data.forms["all|inanimate|p"] = {base_pl .. "etara"}
	data.forms["all|animate|indef"] = {base .. r .. "engana"}
	data.forms["all|animate|s"] = {base_pl .. "arengana"}
	data.forms["all|animate|p"] = {base_pl .. "engana"}

	data.forms["ter|inanimate|indef"] = {base .. e .. "taraino"}
	data.forms["ter|inanimate|s"] = {base .. e .. e3 .. "raino"}
	data.forms["ter|inanimate|p"] = {base_pl .. "etaraino"}
	data.forms["ter|animate|indef"] = {base .. r .. "enganaino"}
	data.forms["ter|animate|s"] = {base_pl .. "arenganaino"}
	data.forms["ter|animate|p"] = {base_pl .. "enganaino"}

	data.forms["directive|inanimate|indef"] = {base .. e .. "tarantz"}
	data.forms["directive|inanimate|s"] = {base .. e .. e3 .. "rantz"}
	data.forms["directive|inanimate|p"] = {base_pl .. "etarantz"}
	data.forms["directive|animate|indef"] = {base .. r .. "enganantz"}
	data.forms["directive|animate|s"] = {base_pl .. "arenganantz"}
	data.forms["directive|animate|p"] = {base_pl .. "enganantz"}

	data.forms["destinative|inanimate|indef"] = {base .. e .. "tarako"}
	data.forms["destinative|inanimate|s"] = {base .. e .. e3 .. "rako"}
	data.forms["destinative|inanimate|p"] = {base_pl .. "etarako"}
	data.forms["destinative|animate|indef"] = {base .. r .. "enganako"}
	data.forms["destinative|animate|s"] = {base_pl .. "arenganako"}
	data.forms["destinative|animate|p"] = {base_pl .. "enganako"}

	data.forms["abl|inanimate|indef"] = {base .. e .. "tatik"}
	data.forms["abl|inanimate|s"] = {base .. e .. e3 .. "tik"}
	data.forms["abl|inanimate|p"] = {base_pl .. "etatik"}
	data.forms["abl|animate|indef"] = {base .. r .. "engandik"}
	data.forms["abl|animate|s"] = {base_pl .. "arengandik"}
	data.forms["abl|animate|p"] = {base_pl .. "engandik"}

	data.forms["par|indef"] = {base .. r .. "ik"}

	postprocess(args, data)
	
	return make_table2(data)
end

-- Inflection functions (proper nouns)
function export.proper_anim(frame)
	local args = frame:getParent().args
		
	local data = {
		forms = {},
		info = "變格: ",
		categories = {},
	}
	
	local ending_text = 0
	
	-- add the lemma form
	local base = mw.title.getCurrentTitle().text
	if args.s then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = base}, "term") .. " (有生、帶冠詞,結尾為 "
		base = args[1]
	else
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = base}, "term") .. " (有生,結尾為 "
	end
	data.forms["absv|indef"] = {base}

	-- add the prolative
	data.forms["pro|indef"] = {base .. "tzat"}
	if	base:sub(-2,-1) == "tz" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "ztzat"}
	elseif base:sub(-2,-1) == "ts" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "stzat"}
	elseif base:sub(-2,-1) == "tx" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "xtzat"}
	elseif base:sub(-1) == "t" then
		data.forms["pro|indef"] = {base .. "-tzat"}
	end
	
	-- epenthetic "e" and "r", ending in vowel/-a
	local e = "e"
	if base:sub(-1) == "a"  then 
		e = ""
		ending_text = 1
	elseif base:sub(-1) == "e" or base:sub(-1) == "i" or base:sub(-1) == "o" or base:sub(-1) == "u" then -- FIXME, this can be written in a cleaner way for sure
		e = ""
		ending_text = 2
	end
	local r = "r"
	if e == "e" then
		r = ""
	end
	
	-- modifications if the word ends in -r
	if	base:sub(-1) == "r" then
		base = base .. "r"
		ending_text = 4
	else
		
	end
	
	-- write "ending in ..."
	if ending_text == 0 then
		data.info = data.info .. "輔音)"
	elseif ending_text == 1 then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = "-a"}, "term") .. ")"
	elseif ending_text == 2 then
		data.info = data.info .. "元音" .. ")"
	elseif ending_text == 3 then
		data.info = data.info .. "tap " .. require("Module:links").full_link({lang = lang, alt = "-r"}, "term") .. ")"
	elseif ending_text == 4 then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = "-r"}, "term") .. ")"
	end

	if args.s then
		data.forms["absv|s"] = {base .. "a"}
		data.forms["erg|s"]  = {base .. "ak"}
		data.forms["dat|s"]  = {base .. "ari"}
		data.forms["gen|s"]  = {base .. "aren"}
		data.forms["com|s"]  = {base .. "arekin"}
		data.forms["caus|s"] = {base .. "arengatik"}
		data.forms["ben|s"]  = {base .. "arentzat"}
		data.forms["ins|s"]  = {base .. "az"}
		data.forms["ine|s"]  = {base .. "arengan"}
		data.forms["all|s"]  = {base .. "arengana"}
		data.forms["ter|s"]  = {base .. "arenganaino"}
		data.forms["directive|s"] = {base .. "arenganantz"}
		data.forms["destinative|s"] = {base .. "arenganako"}
		data.forms["abl|s"]  = {base .. "arengandik"}
	else
		data.forms["erg|indef"]  = {base .. e .. "k"}
		data.forms["dat|indef"]  = {base .. r .. "i"}
		data.forms["gen|indef"]  = {base .. r .. "en"}
		data.forms["com|indef"]  = {base .. r .. "ekin"}
		data.forms["caus|indef"] = {base .. r .. "engatik"}
		data.forms["ben|indef"]  = {base .. r .. "entzat"}
		data.forms["ins|indef"]  = {base .. e .. "z"}
		data.forms["ine|indef"]  = {base .. r .. "engan"}
		data.forms["all|indef"]  = {base .. r .. "engana"}
		data.forms["ter|indef"]  = {base .. r .. "enganaino"}
		data.forms["directive|indef"] = {base .. r .. "enganantz"}
		data.forms["destinative|indef"] = {base .. r .. "enganako"}
		data.forms["abl|indef"]  = {base .. r .. "engandik"}
	end
	
	data.forms["par|indef"] = {base .. r .. "ik"}

	return make_table(data)
end

function export.proper_inanim(frame)
	local args = frame:getParent().args
		
	local data = {
		forms = {},
		info = "變格: ",
		categories = {},
	}
	
	local ending_text = 0
	
	-- add the lemma form
	local base = mw.title.getCurrentTitle().text
	if args.s then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = base}, "term") .. " (無生、帶冠詞,結尾為 "
		base = args[1]
	elseif args.p then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = base}, "term") .. " (無生、唯複,結尾為 "
		base = args[1]		
	else
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = base}, "term") .. " (無生,結尾為 "
	end
	data.forms["absv|indef"] = {base}

	-- add the prolative
	data.forms["pro|indef"] = {base .. "tzat"}
	if	base:sub(-2,-1) == "tz" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "ztzat"}
	elseif base:sub(-2,-1) == "ts" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "stzat"}
	elseif base:sub(-2,-1) == "tx" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "xtzat"}
	elseif base:sub(-1) == "t" then
		data.forms["pro|indef"] = {base .. "-tzat"}
	end
	if args.hyph and args.ending == "V" then 
		data.forms["pro|indef"] = {base .. "-tzat"}
	end
	
	-- epenthetic "e" and "r", ending in vowel/-a. The vocalic ending can be forced in acronyms
	local e = "e"
	if base:sub(-1) == "a"  then 
		e = ""
		ending_text = 1
	elseif base:sub(-1) == "e" or base:sub(-1) == "i" or base:sub(-1) == "o" or base:sub(-1) == "u" or args.ending == "V" then -- FIXME, this can be written in a cleaner way for sure
		e = ""
		ending_text = 2
	end
	local r = "r"
	if e == "e" then
		r = ""
	end
	
	--modifications if a hyphen is needed
	if args.hyph then
		base = base .. "-"
	end
	
	-- modifications if the word ends in -r
	if	base:sub(-1) == "r" then
		if args.tap then
			ending_text = 3
		else
			base = base .. 'r' --add an r if the word ends in r
			ending_text = 4
		end
	else
		
	end
	
	-- modifications if the word ends in -a
	local base_pl = base
	if base:sub(-1) == "a" then
		base_pl = base:sub(1,-2)
	end
	
	-- write "ending in ..."
	if ending_text == 0 then
		data.info = data.info .. "輔音)"
	elseif ending_text == 1 then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = "-a"}, "term") .. ")"
	elseif ending_text == 2 then
		data.info = data.info .. "元音" .. ")"
	elseif ending_text == 3 then
		data.info = data.info .. "tap " .. require("Module:links").full_link({lang = lang, alt = "-r"}, "term") .. ")"
	elseif ending_text == 4 then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = "-r"}, "term") .. ")"
	end
	
	data.forms["par|indef"] = {base .. r .. "ik"}

	if args.p then
		data.forms["absv|p"] = {base_pl .. "ak"}
		data.forms["erg|p"]  = {base_pl .. "ek"}
		data.forms["dat|p"]  = {base_pl .. "ei"}
		data.forms["gen|p"]  = {base_pl .. "en"}
		data.forms["com|p"]  = {base_pl .. "ekin"}
		data.forms["caus|p"] = {base_pl .. "engatik"}
		data.forms["ben|p"]  = {base_pl .. "entzat"}
		data.forms["ine|p"]  = {base_pl .. "etan"}
		data.forms["ins|p"]  = {base_pl .. "ez"}
		data.forms["loc|p"]  = {base_pl .. "etako"}
		data.forms["all|p"]  = {base_pl .. "etara"}
		data.forms["ter|p"]  = {base_pl .. "etaraino"}
		data.forms["directive|p"] = {base_pl .. "etarantz"}
		data.forms["destinative|p"] = {base_pl .. "etarako"}
		data.forms["abl|p"]  = {base_pl .. "etatik"}
	elseif args.s then
		data.forms["absv|s"] = {base_pl .. "a"}
		data.forms["erg|s"]  = {base_pl .. "ak"}
		data.forms["dat|s"]  = {base_pl .. "ari"}
		data.forms["gen|s"]  = {base_pl .. "aren"}
		data.forms["com|s"]  = {base_pl .. "arekin"}
		data.forms["caus|s"] = {base_pl .. "arengatik"}
		data.forms["ben|s"]  = {base_pl .. "arentzat"}
		data.forms["ins|s"]  = {base_pl .. "az"}
		data.forms["ine|s"]  = {base_pl .. e .. "an"}
		data.forms["loc|s"]  = {base .. e .. "ko"}
		data.forms["all|s"]  = {base .. e .. "ra"}
		data.forms["ter|s"]  = {base .. e .. "raino"}
		data.forms["directive|s"] = {base .. e .. "rantz"}
		data.forms["destinative|s"] = {base .. e .. "rako"}
		data.forms["abl|s"]  = {base .. e .. "tik"}
	else
		data.forms["erg|indef"] = {base .. e .. "k"}
		data.forms["dat|indef"] = {base .. r .. "i"}
		data.forms["gen|indef"] = {base .. r .. "en"}
		data.forms["com|indef"] = {base .. r .. "ekin"}
		data.forms["caus|indef"] = {base .. r .. "engatik"}
		data.forms["ben|indef"] = {base .. r .. "entzat"}
		data.forms["ins|indef"] = {base .. e .. "z"}
		data.forms["ine|indef"] = {base .. e  .. "n"}
		data.forms["loc|indef"] = {base .. e .. "ko"}
		data.forms["all|indef"] = {base .. e .. "ra"}
		data.forms["ter|indef"] = {base .. e .. "raino"}
		data.forms["directive|indef"] = {base .. e .. "rantz"}
		data.forms["destinative|indef"] = {base .. e .. "rako"}
		data.forms["abl|indef"] = {base .. e .. "tik"}
		if	base:sub(-2,-1) == "tz" then
			data.forms["loc|indef"] = {base:sub(1,-3) .. "zko"}
			data.forms["abl|indef"] = {base:sub(1,-3) .. "ztik"}
		elseif base:sub(-1,-1) == "z" or base:sub(-1,-1) == "s" then
			data.forms["loc|indef"] = {base .. "ko"}
			data.forms["abl|indef"] = {base .. "tik"}	
		elseif base:sub(-1,-1) == "r" then
			data.forms["loc|indef"] = {base:sub(1,-2) .. "ko"}
			data.forms["abl|indef"] = {base:sub(1,-2) .. "tik"}
		elseif base:sub(-1,-1) == "n" or base:sub(-1,-1) == "l" then
			data.forms["loc|indef"] = {base .. "go"}
			data.forms["abl|indef"] = {base .. "dik"}	
		end
	end
	
	return make_table(data)
end

function export.proper_both(frame)
	local args = frame:getParent().args
		
	local data = {
		forms = {},
		info = "變格: ",
		categories = {},
	}
	
	local ending_text = 0
	
	-- add the lemma form
	local base = mw.title.getCurrentTitle().text
	if args.s then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = base}, "term") .. " (有生及無生、唯單,結尾為 "
		base = args[1]
	elseif args.p then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = base}, "term") .. " (有生及無生、唯複,結尾為 "
		base = args[1]		
	else
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = base}, "term") .. " (有生及無生,結尾為 "
	end
	data.forms["absv|indef"] = {base}

	-- add the prolative
	data.forms["pro|indef"] = {base .. "tzat"}
	if	base:sub(-2,-1) == "tz" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "ztzat"}
	elseif base:sub(-2,-1) == "ts" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "stzat"}
	elseif base:sub(-2,-1) == "tx" then
		data.forms["pro|indef"] = {base:sub(1,-3) .. "xtzat"}
	elseif base:sub(-1) == "t" then
		data.forms["pro|indef"] = {base .. "-tzat"}
	end
	if args.hyph and args.ending == "V" then 
		data.forms["pro|indef"] = {base .. "-tzat"}
	end
	
	-- epenthetic "e" and "r", ending in vowel/-a. The vocalic ending can be forced in acronyms
	local e = "e"
	if base:sub(-1) == "a"  then 
		e = ""
		ending_text = 1
	elseif base:sub(-1) == "e" or base:sub(-1) == "i" or base:sub(-1) == "o" or base:sub(-1) == "u" or args.ending == "V" then -- FIXME, this can be written in a cleaner way for sure
		e = ""
		ending_text = 2
	end
	local r = "r"
	if e == "e" then
		r = ""
	end
	
	--modifications if a hyphen is needed
	if args.hyph then
		base = base .. "-"
	end
	
	-- modifications if the word ends in -r
	if	base:sub(-1) == "r" then
		if args.tap then
			ending_text = 3
		else
			base = base .. 'r' --add an r if the word ends in r
			ending_text = 4
		end
	end
	
	-- write "ending in ..."
	if ending_text == 0 then
		data.info = data.info .. "輔音)"
	elseif ending_text == 1 then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = "-a"}, "term") .. ")"
	elseif ending_text == 2 then
		data.info = data.info .. "元音" .. ")"
	elseif ending_text == 3 then
		data.info = data.info .. "tap " .. require("Module:links").full_link({lang = lang, alt = "-r"}, "term") .. ")"
	elseif ending_text == 4 then
		data.info = data.info .. require("Module:links").full_link({lang = lang, alt = "-r"}, "term") .. ")"
	end
	
	data.forms["par|indef"] = {base .. r .. "ik"}

	data.forms["erg|indef"] = {base .. e .. "k"}
	data.forms["dat|indef"] = {base .. r .. "i"}
	data.forms["gen|indef"] = {base .. r .. "en"}
	data.forms["com|indef"] = {base .. r .. "ekin"}
	data.forms["caus|indef"] = {base .. r .. "engatik"}
	data.forms["ben|indef"] = {base .. r .. "entzat"}
	data.forms["ins|indef"] = {base .. e .. "z"}
	
	data.forms["ine|inanimate|indef"] = {base .. e  .. "n"}
	data.forms["loc|inanimate|indef"] = {base .. e .. "ko"}
	data.forms["all|inanimate|indef"] = {base .. e .. "ra"}
	data.forms["ter|inanimate|indef"] = {base .. e .. "raino"}
	data.forms["directive|inanimate|indef"] = {base .. e .. "rantz"}
	data.forms["destinative|inanimate|indef"] = {base .. e .. "rako"}
	data.forms["abl|inanimate|indef"] = {base .. e .. "tik"}
	
	data.forms["ine|animate|indef"] = {base .. r .. "engan"}
	data.forms["all|animate|indef"] = {base .. r .. "engana"}
	data.forms["ter|animate|indef"] = {base .. r .. "enganaino"}
	data.forms["directive|animate|indef"] = {base .. r .. "enganantz"}
	data.forms["destinative|animate|indef"] = {base .. r .. "enganako"}
	data.forms["abl|animate|indef"] = {base .. r .. "engandik"}
	
	if	base:sub(-2,-1) == "tz" then
		data.forms["loc|inanimate|indef"] = {base:sub(1,-3) .. "zko"}
		data.forms["abl|inanimate|indef"] = {base:sub(1,-3) .. "ztik"}
	elseif base:sub(-1,-1) == "z" or base:sub(-1,-1) == "s" then
		data.forms["loc|inanimate|indef"] = {base .. "ko"}
		data.forms["abl|inanimate|indef"] = {base .. "tik"}	
	elseif base:sub(-1,-1) == "r" then
		data.forms["loc|inanimate|indef"] = {base:sub(1,-2) .. "ko"}
		data.forms["abl|inanimate|indef"] = {base:sub(1,-2) .. "tik"}
	elseif base:sub(-1,-1) == "n" or base:sub(-1,-1) == "l" then
		data.forms["loc|inanimate|indef"] = {base .. "go"}
		data.forms["abl|inanimate|indef"] = {base .. "dik"}
	end
	
	return make_table2(data)
end

function postprocess(args, data)
	data.lemma = data.forms["absv|indef"][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 = [=[
{| class="inflection-table vsSwitcher" data-toggle-category="inflection" style="border: solid 1px #CCCCFF;" cellspacing="1" cellpadding="2"
|- style="background: #d9ebff; text-align: left;"
! class="vsToggleElement" colspan="4" | {{{info}}}
|- class="vsHide"
! style="background: #d9ebff; width: 11em;" |
! style="background: #d9ebff; width: 12em;" | 不定
! style="background: #d9ebff; width: 12em;" | 單數
! style="background: #d9ebff; width: 12em;" | 複數
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 通格
| data-accel-col="1" | {{{absv|indef}}}
| data-accel-col="2" | {{{absv|s}}}
| data-accel-col="3" | {{{absv|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 作格
| data-accel-col="1" | {{{erg|indef}}}
| data-accel-col="2" | {{{erg|s}}}
| data-accel-col="3" | {{{erg|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 與格
| data-accel-col="1" | {{{dat|indef}}}
| data-accel-col="2" | {{{dat|s}}}
| data-accel-col="3" | {{{dat|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 屬格
| data-accel-col="1" | {{{gen|indef}}}
| data-accel-col="2" | {{{gen|s}}}
| data-accel-col="3" | {{{gen|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 共格
| data-accel-col="1" | {{{com|indef}}}
| data-accel-col="2" | {{{com|s}}}
| data-accel-col="3" | {{{com|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 使役格
| data-accel-col="1" | {{{caus|indef}}}
| data-accel-col="2" | {{{caus|s}}}
| data-accel-col="3" | {{{caus|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 受益格
| data-accel-col="1" | {{{ben|indef}}}
| data-accel-col="2" | {{{ben|s}}}
| data-accel-col="3" | {{{ben|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 工具格
| data-accel-col="1" | {{{ins|indef}}}
| data-accel-col="2" | {{{ins|s}}}
| data-accel-col="3" | {{{ins|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 內格
| data-accel-col="1" | {{{ine|indef}}}
| data-accel-col="2" | {{{ine|s}}}
| data-accel-col="3" | {{{ine|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 方位格
| data-accel-col="1" | {{{loc|indef}}}
| data-accel-col="2" | {{{loc|s}}}
| data-accel-col="3" | {{{loc|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 向格
| data-accel-col="1" | {{{all|indef}}}
| data-accel-col="2" | {{{all|s}}}
| data-accel-col="3" | {{{all|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 到格
| data-accel-col="1" | {{{ter|indef}}}
| data-accel-col="2" | {{{ter|s}}}
| data-accel-col="3" | {{{ter|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | directive
| data-accel-col="1" | {{{directive|indef}}}
| data-accel-col="2" | {{{directive|s}}}
| data-accel-col="3" | {{{directive|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | destinative
| data-accel-col="1" | {{{destinative|indef}}}
| data-accel-col="2" | {{{destinative|s}}}
| data-accel-col="3" | {{{destinative|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 奪格
| data-accel-col="1" | {{{abl|indef}}}
| data-accel-col="2" | {{{abl|s}}}
| data-accel-col="3" | {{{abl|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 部分格
| data-accel-col="1" | {{{par|indef}}}
| data-accel-col="2" | {{{par|s}}}
| data-accel-col="3" | {{{par|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 延展格
| data-accel-col="1" | {{{pro|indef}}}
| data-accel-col="2" | {{{pro|s}}}
| data-accel-col="3" | {{{pro|p}}}
|}]=]

	return mw.ustring.gsub(wikicode, "{{{[#!]?([a-z0-9|]+)}}}", repl) .. require("Module:utilities").format_categories(data.categories, lang)
end

function make_table2(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 "&mdash;"
		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 = [=[
{| class="inflection-table vsSwitcher" data-toggle-category="inflection" style="border: solid 1px #CCCCFF;" cellspacing="1" cellpadding="2"
|- style="background: #d9ebff; text-align: left;"
! class="vsToggleElement" colspan="5" | {{{info}}}
|- class="vsHide"
! style="background: #d9ebff; width: 11em;" colspan="2"|
! style="background: #d9ebff; width: 12em;" | 定形
! style="background: #d9ebff; width: 12em;" | 單數
! style="background: #d9ebff; width: 12em;" | 複數
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" colspan="2"| 通格
| data-accel-col="1" | {{{absv|indef}}}
| data-accel-col="2" | {{{absv|s}}}
| data-accel-col="3" | {{{absv|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" colspan="2"| 作格
| data-accel-col="1" | {{{erg|indef}}}
| data-accel-col="2" | {{{erg|s}}}
| data-accel-col="3" | {{{erg|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" colspan="2"| 與格
| data-accel-col="1" | {{{dat|indef}}}
| data-accel-col="2" | {{{dat|s}}}
| data-accel-col="3" | {{{dat|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" colspan="2"| 屬格
| data-accel-col="1" | {{{gen|indef}}}
| data-accel-col="2" | {{{gen|s}}}
| data-accel-col="3" | {{{gen|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" colspan="2"| 共格
| data-accel-col="1" | {{{com|indef}}}
| data-accel-col="2" | {{{com|s}}}
| data-accel-col="3" | {{{com|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" colspan="2"| 使役格
| data-accel-col="1" | {{{caus|indef}}}
| data-accel-col="2" | {{{caus|s}}}
| data-accel-col="3" | {{{caus|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" colspan="2"| 受益格
| data-accel-col="1" | {{{ben|indef}}}
| data-accel-col="2" | {{{ben|s}}}
| data-accel-col="3" | {{{ben|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" colspan="2"| 工具格
| data-accel-col="1" | {{{ins|indef}}}
| data-accel-col="2" | {{{ins|s}}}
| data-accel-col="3" | {{{ins|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" rowspan="2"| 內格
! style="background: #eff7ff;" | 有生
| data-accel-col="1" | {{{ine|animate|indef}}}
| data-accel-col="2" | {{{ine|animate|s}}}
| data-accel-col="3" | {{{ine|animate|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 無生
| data-accel-col="1" | {{{ine|inanimate|indef}}}
| data-accel-col="2" | {{{ine|inanimate|s}}}
| data-accel-col="3" | {{{ine|inanimate|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" rowspan="2"| 方位格
! style="background: #eff7ff;" | 有生
| data-accel-col="1" | {{{loc|animate|indef}}}
| data-accel-col="2" | {{{loc|animate|s}}}
| data-accel-col="3" | {{{loc|animate|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 無生
| data-accel-col="1" | {{{loc|inanimate|indef}}}
| data-accel-col="2" | {{{loc|inanimate|s}}}
| data-accel-col="3" | {{{loc|inanimate|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" rowspan="2"| 向格
! style="background: #eff7ff;" | 有生
| data-accel-col="1" | {{{all|animate|indef}}}
| data-accel-col="2" | {{{all|animate|s}}}
| data-accel-col="3" | {{{all|animate|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 無生
| data-accel-col="1" | {{{all|inanimate|indef}}}
| data-accel-col="2" | {{{all|inanimate|s}}}
| data-accel-col="3" | {{{all|inanimate|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" rowspan="2"| 到格
! style="background: #eff7ff;" | 有生
| data-accel-col="1" | {{{ter|animate|indef}}}
| data-accel-col="2" | {{{ter|animate|s}}}
| data-accel-col="3" | {{{ter|animate|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 無生
| data-accel-col="1" | {{{ter|inanimate|indef}}}
| data-accel-col="2" | {{{ter|inanimate|s}}}
| data-accel-col="3" | {{{ter|inanimate|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" rowspan="2"| directive
! style="background: #eff7ff;" | 有生
| data-accel-col="1" | {{{directive|animate|indef}}}
| data-accel-col="2" | {{{directive|animate|s}}}
| data-accel-col="3" | {{{directive|animate|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 無生
| data-accel-col="1" | {{{directive|inanimate|indef}}}
| data-accel-col="2" | {{{directive|inanimate|s}}}
| data-accel-col="3" | {{{directive|inanimate|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" rowspan="2"| destinative
! style="background: #eff7ff;" | 有生
| data-accel-col="1" | {{{destinative|animate|indef}}}
| data-accel-col="2" | {{{destinative|animate|s}}}
| data-accel-col="3" | {{{destinative|animate|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 無生
| data-accel-col="1" | {{{destinative|inanimate|indef}}}
| data-accel-col="2" | {{{destinative|inanimate|s}}}
| data-accel-col="3" | {{{destinative|inanimate|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" rowspan="2"| 奪格
! style="background: #eff7ff;" | 有生
| data-accel-col="1" | {{{abl|animate|indef}}}
| data-accel-col="2" | {{{abl|animate|s}}}
| data-accel-col="3" | {{{abl|animate|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" | 無生
| data-accel-col="1" | {{{abl|inanimate|indef}}}
| data-accel-col="2" | {{{abl|inanimate|s}}}
| data-accel-col="3" | {{{abl|inanimate|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" colspan="2"| 部分格
| data-accel-col="1" | {{{par|indef}}}
| data-accel-col="2" | {{{par|s}}}
| data-accel-col="3" | {{{par|p}}}
|- class="vsHide" style="background: #F9F9F9;"
! style="background: #eff7ff;" colspan="2"| 延展格
| data-accel-col="1" | {{{pro|indef}}}
| data-accel-col="2" | {{{pro|s}}}
| data-accel-col="3" | {{{pro|p}}}
|}]=]

	return mw.ustring.gsub(wikicode, "{{{[#!]?([a-z0-9|]+)}}}", repl) .. require("Module:utilities").format_categories(data.categories, lang)
end

return export