Module:gmh-decl-adj


local export = {}

local m_links = require("Module:links")
local m_utils = require("Module:utilities")
local rmatch = mw.ustring.match

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

local decl_data = {}

decl_data["adj"] = {
	params = {
		[1] = {},
		[2] = {},
		["alt1"] = {},
		["alt2"] = {},
		["comp"] = {},
		["sup"] = {},
		["sup2"] = {},
		["umlaut"] = {},
		["lr"] = {}
	},
}
setmetatable(decl_data["adj"], {__call = function(self, args, data)
	data.decl_type = "masculine, a-stem"
	
	local a1 = args.alt1 or args[1]
	local a2 = args.alt2 or args[2] or a1
	local a3 = args.umlaut or a2
	comp = args.comp
	local sup = args.sup
	local sup2 = args.sup2 or sup
	
	data.forms["bare"] = {a1}
	
if args.lr == "+" then

	data.forms["snsm"] = {a2 .. "er"}
	data.forms["snsf"] = {a3 .. "iu"}
	data.forms["snsn"] = {a2 .. "ȥ", a2 .. "eȥ"}
	data.forms["sgsm"] = {a2 .. "s", a2 .. "es"}
	data.forms["sgsf"] = {a2 .. "re", a2 .. "er"}
	data.forms["sdsm"] = {a2 .. "m", a2 .. "me", a2 .. "em"}
	data.forms["sasm"] = {a2 .. "n", a2 .. "en"}
	data.forms["sasf"] = {a2, a2 .. "e"}

	data.forms["wns"] = {a2, a2 .. "e"}
	data.forms["wnp"] = {a2 .. "n", a2 .. "en"}


else

	data.forms["snsm"] = {a2 .. "er"}
	data.forms["snsf"] = {a3 .. "iu"}
	data.forms["snsn"] = {a2 .. "eȥ"}
	data.forms["sgsm"] = {a2 .. "es"}
	data.forms["sgsf"] = {a2 .. "er"}
	data.forms["sdsm"] = {a2 .. "em"}
	data.forms["sasm"] = {a2 .. "en"}
	data.forms["sasf"] = {a2 .. "e"}

	data.forms["wns"] = {a2 .. "e"}
	data.forms["wnp"] = {a2 .. "en"}

end

if comp then

	data.forms["cwns"] = {comp .. "e"}
	data.forms["cwnp"] = {comp .. "en"}

	data.forms["ssnsm"] = {sup2 .. "er"}
	data.forms["ssnsf"] = {sup2 .. "iu"}
	data.forms["ssnsn"] = {sup2 .. "eȥ"}
	data.forms["ssgsm"] = {sup2 .. "es"}
	data.forms["ssgsf"] = {sup2 .. "er"}
	data.forms["ssdsm"] = {sup2 .. "em"}
	data.forms["ssasm"] = {sup2 .. "en"}
	data.forms["ssasf"] = {sup2 .. "e"}

	data.forms["swns"] = {sup2 .. "e"}
	data.forms["swnp"] = {sup2 .. "en"}

end
	
end
})

-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)

	local parent_args = frame:getParent().args
	local decl_type = (frame.args["decl"] or parent_args["decl"]) or "a-m"

	if not decl_data[decl_type] then
		error("Unknown declension '" .. decl_type .. "'")
	end
	
	local data = {forms = {}, categories = {}}
	
	data.head = parent_args["head"] or nil

	local args = require("Module:parameters").process(parent_args, decl_data[decl_type].params, true)
	
	-- Override for templates
	if not args[1] then
		setmetatable(args, {__index = function(self, key)
			return "{{{" .. key .. "}}}"
		end
		})
	end
	
	-- Generate the forms
	if parent_args.irr then
		table.insert(data.categories, "Old High German irregular nouns")
		if decl_data.irregular[parent_args.irr] then
			decl_data.irregular[parent_args.irr](data)
		else
			decl_data[decl_type](args, data)
		end
	else
		decl_data[decl_type](args, data)
	end

	-- Make the table
	return make_table(data)
end

function make_table(data)
	local function show_form(form)
		if not form then
			return "—"
		end
		
		local ret = {}
		
		for key, subform in ipairs(form) do
			if mw.title.getCurrentTitle().nsText == "Reconstruction" and subform ~= "—" then
				subform = "*" .. subform
			end
			table.insert(ret, m_links.full_link({lang = lang, term = subform}))
		end
			
		return table.concat(ret, ", ")
	end
	
	local function repl(param)
		if param == "decl_type" then
			return data.decl_type
		else
			return show_form(data.forms[param])
		end
	end

	local wikicode1 = [=[<div class="NavFrame" style="width:30em">
<div class="NavHead" style="">Positive forms of {{{bare}}}</div>
<div class="NavContent">

{| style="background:#F9F9F9;text-align:center;width:30em" class="inflection-table" border="1px solid #505050"
|-
! colspan="2" rowspan="2" style="background:#C0C0C0" |  number & gender
! colspan="3" style="background:#C0C0C0" | singular
! colspan="2" style="background:#C0C0C0" | plural
|-
! style="background:#C0C0C0" | masculine
! style="background:#C0C0C0" | feminine
! style="background:#C0C0C0" | neuter
! style="background:#C0C0C0" | nonneuter
! style="background:#C0C0C0" | neuter
|-
! rowspan="4" style="background:#c0cfe4" | strong declension
! style="background:#c0cfe4" | nominative
| {{{snsm}}}
| {{{snsf}}}
| {{{snsn}}}
| {{{sasf}}}
| {{{snsf}}}
|-
! style="background:#c0cfe4" | genitive
| {{{sgsm}}}
| {{{sgsf}}}(e)
| {{{sgsm}}}
| colspan="2" | {{{sgsf}}}(e)
|-
! style="background:#c0cfe4" | dative
| {{{sdsm}}}(e)
| {{{sgsf}}}(e)
| {{{sdsm}}}(e)
| colspan="2" | {{{sasm}}}
|-
! style="background:#c0cfe4" | accusative
| {{{sasm}}}
| {{{sasf}}}
| {{{snsn}}}
| {{{sasf}}}
| {{{snsf}}}
|-
! rowspan="4" style="background:#c0e4c0" | weak declension
! style="background:#c0e4c0" | nominative
| dër {{{wns}}}
| diu {{{wns}}}
| daȥ {{{wns}}}
| die {{{wnp}}}
| diu {{{wnp}}}
|-
! style="background:#c0e4c0" | genitive
| dës {{{wnp}}}
| dër {{{wnp}}}
| dës {{{wnp}}}
| colspan="2" | dër {{{wnp}}}
|-
! style="background:#c0e4c0" | dative
| dëm {{{wnp}}}
| dër {{{wnp}}}
| dëm {{{wnp}}}
| colspan="2" | dën {{{wnp}}}
|-
! style="background:#c0e4c0" | accusative
| dën {{{wnp}}}
| die {{{wnp}}}
| daȥ {{{wns}}}
| die {{{wnp}}}
| diu {{{wnp}}}
]=]

 local wikicode2 = [=[<div class="NavFrame" style="width:30em">
<div class="NavHead" style="">Positive forms of {{{bare}}}</div>
<div class="NavContent">

{| style="background:#F9F9F9;text-align:center;width:30em" class="inflection-table" border="1px solid #505050"
|-
! colspan="2" rowspan="2" style="background:#C0C0C0" |  number & gender
! colspan="3" style="background:#C0C0C0" | singular
! colspan="2" style="background:#C0C0C0" | plural
|-
! style="background:#C0C0C0" | masculine
! style="background:#C0C0C0" | feminine
! style="background:#C0C0C0" | neuter
! style="background:#C0C0C0" | nonneuter
! style="background:#C0C0C0" | neuter
|-
! rowspan="4" style="background:#c0cfe4" | strong declension
! style="background:#c0cfe4" | nominative
| {{{snsm}}}
| {{{snsf}}}
| {{{snsn}}}
| {{{sasf}}}
| {{{snsf}}}
|-
! style="background:#c0cfe4" | genitive
| {{{sgsm}}}
| {{{sgsf}}}(e)
| {{{sgsm}}}
| colspan="2" | {{{sgsf}}}(e)
|-
! style="background:#c0cfe4" | dative
| {{{sdsm}}}(e)
| {{{sgsf}}}(e)
| {{{sdsm}}}(e)
| colspan="2" | {{{sasm}}}
|-
! style="background:#c0cfe4" | accusative
| {{{sasm}}}
| {{{sasf}}}
| {{{snsn}}}
| {{{sasf}}}
| {{{snsf}}}
|-
! rowspan="4" style="background:#c0e4c0" | weak declension
! style="background:#c0e4c0" | nominative
| dër {{{wns}}}
| diu {{{wns}}}
| daȥ {{{wns}}}
| die {{{wnp}}}
| diu {{{wnp}}}
|-
! style="background:#c0e4c0" | genitive
| dës {{{wnp}}}
| dër {{{wnp}}}
| dës {{{wnp}}}
| colspan="2" | dër {{{wnp}}}
|-
! style="background:#c0e4c0" | dative
| dëm {{{wnp}}}
| dër {{{wnp}}}
| dëm {{{wnp}}}
| colspan="2" | dën {{{wnp}}}
|-
! style="background:#c0e4c0" | accusative
| dën {{{wnp}}}
| die {{{wnp}}}
| daȥ {{{wns}}}
| die {{{wnp}}}
| diu {{{wnp}}}
|}</div></div>

<div class="NavFrame" style="width:30em">
<div class="NavHead" style="">Comparative forms of {{{bare}}}</div>
<div class="NavContent">

{| style="background:#F9F9F9;text-align:center;width:30em" class="inflection-table" border="1px solid #505050"
|-
! colspan="2" rowspan="2" style="background:#C0C0C0" |  number & gender
! colspan="3" style="background:#C0C0C0" | singular
! colspan="2" style="background:#C0C0C0" | plural
|-
! style="background:#C0C0C0" | masculine
! style="background:#C0C0C0" | feminine
! style="background:#C0C0C0" | neuter
! style="background:#C0C0C0" | nonneuter
! style="background:#C0C0C0" | neuter
|-
! rowspan="4" style="background:#c0e4c0" | weak declension
! style="background:#c0e4c0" | nominative
| dër {{{cwns}}}
| diu {{{cwns}}}
| daȥ {{{cwns}}}
| die {{{cwnp}}}
| diu {{{cwnp}}}
|-
! style="background:#c0e4c0" | genitive
| dës {{{cwnp}}}
| dër {{{cwnp}}}
| dës {{{cwnp}}}
| colspan="2" | dër {{{cwnp}}}
|-
! style="background:#c0e4c0" | dative
| dëm {{{cwnp}}}
| dër {{{cwnp}}}
| dëm {{{cwnp}}}
| colspan="2" | dën {{{cwnp}}}
|-
! style="background:#c0e4c0" | accusative
| dën {{{cwnp}}}
| die {{{cwnp}}}
| daȥ {{{cwns}}}
| die {{{cwnp}}}
| diu {{{cwnp}}}
|}</div></div>

<div class="NavFrame" style="width:30em">
<div class="NavHead" style="">Superlative forms of {{{bare}}}</div>
<div class="NavContent">

{| style="background:#F9F9F9;text-align:center;width:30em" class="inflection-table" border="1px solid #505050"
|-
! colspan="2" rowspan="2" style="background:#C0C0C0" |  number & gender
! colspan="3" style="background:#C0C0C0" | singular
! colspan="2" style="background:#C0C0C0" | plural
|-
! style="background:#C0C0C0" | masculine
! style="background:#C0C0C0" | feminine
! style="background:#C0C0C0" | neuter
! style="background:#C0C0C0" | nonneuter
! style="background:#C0C0C0" | neuter
|-
! rowspan="4" style="background:#c0cfe4" | strong declension
! style="background:#c0cfe4" | nominative
| {{{ssnsm}}}
| {{{ssnsf}}}
| {{{ssnsn}}}
| {{{ssasf}}}
| {{{ssnsf}}}
|-
! style="background:#c0cfe4" | genitive
| {{{ssgsm}}}
| {{{ssgsf}}}(e)
| {{{ssgsm}}}
| colspan="2" | {{{ssgsf}}}(e)
|-
! style="background:#c0cfe4" | dative
| {{{ssdsm}}}(e)
| {{{ssgsf}}}(e)
| {{{ssdsm}}}(e)
| colspan="2" | {{{ssasm}}}
|-
! style="background:#c0cfe4" | accusative
| {{{ssasm}}}
| {{{ssasf}}}
| {{{ssnsn}}}
| {{{ssasf}}}
| {{{ssnsf}}}
|-
! rowspan="4" style="background:#c0e4c0" | weak declension
! style="background:#c0e4c0" | nominative
| dër {{{swns}}}
| diu {{{swns}}}
| daȥ {{{swns}}}
| die {{{swnp}}}
| diu {{{swnp}}}
|-
! style="background:#c0e4c0" | genitive
| dës {{{swnp}}}
| dër {{{swnp}}}
| dës {{{swnp}}}
| colspan="2" | dër {{{swnp}}}
|-
! style="background:#c0e4c0" | dative
| dëm {{{swnp}}}
| dër {{{swnp}}}
| dëm {{{swnp}}}
| colspan="2" | dën {{{swnp}}}
|-
! style="background:#c0e4c0" | accusative
| dën {{{swnp}}}
| die {{{swnp}}}
| daȥ {{{swns}}}
| die {{{swnp}}}
| diu {{{swnp}}}
]=]

if comp then
	wikicode = wikicode2 .. "|}</div></div>"
else
	wikicode = wikicode1 .. "|}</div></div>"
end

	return (mw.ustring.gsub(wikicode, "{{{([a-z0-9_]+)}}}", repl)) .. m_utils.format_categories(data.categories, lang)
end

return export