Module:nl-verb

Definition from Wiktionary, the free dictionary
Jump to: navigation, search
The following documentation is located at Module:nl-verb/documentation. [edit]
Useful links: subpage listtransclusionstestcases

This module contains functions for creating inflection tables for Dutch verbs.

The bot User:MewBot uses this module to automatically create entries for verb forms. This is done through the make_bot_list function. If you want to change how the module works and it may affect the parameters or the output generated by this function, please discuss this first, in case your changes prevent the bot from working correctly.


local m_utilities = require("Module:utilities")
local m_links = require("Module:links")
 
local lang = require("Module:languages").getByCode("nl")
 
local export = {}
 
-- Within this module, conjugations are the functions that do the actual
-- conjugating by creating the forms of a basic verb (not prefixed or
-- separable). They are defined further down.
local conjugations = {}
 
-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.conjugate(frame)
	local conj_type = frame.args[1] or error("Conjugation type has not been specified. Please pass parameter 1 to the module invocation.")
	local args = frame:getParent().args
	PAGENAME = mw.title.getCurrentTitle().text
	NAMESPACE = mw.title.getCurrentTitle().nsText
 
	local data = {forms = {}, title = nil, categories = {}}
 
	if conjugations[conj_type] then
		conjugations[conj_type](args, data)
	else
		error("Unknown conjugation type '" .. conj_type .. "'")
	end
 
	local pref = args["pref"]; if pref == "" then pref = nil end
	local sep = args["sep"]; if sep == "" then sep = nil end
 
	if pref then
		table.insert(data.categories, "Dutch prefixed verbs")
		table.insert(data.categories, "Dutch prefixed verbs with " .. pref .. "-")
		data.title = data.title .. ", prefixed"
	end
 
	if sep then
		table.insert(data.categories, "Dutch separable verbs")
		table.insert(data.categories, "Dutch separable verbs with " .. sep)
		data.title = data.title .. ", separable"
	end
 
	if not pref and not sep then
		table.insert(data.categories, "Dutch basic verbs")
	end
 
	add_pref(data, pref)
	add_sep(data, sep)
 
	data.aux = args["aux"]; if not data.aux or data.aux == "" then data.aux = "hebben" end
 
	if args["aux"] then
		if args["aux"] == "zijn" then
			require("Module:debug").track("nl-verb/zijn")
		else
			require("Module:debug").track("nl-verb/aux")
		end
	end
 
	if args["aux2"] then
		require("Module:debug").track("nl-verb/aux2")
	end
 
	data.trans = args["trans"]; if data.trans == "" then data.trans = nil end
 
	if data.trans then
		if data.trans == "acc" then
			table.insert(data.categories, "Dutch accusative verbs")
		elseif data.trans == "erg" then
			table.insert(data.categories, "Dutch ergative verbs")
		elseif data.trans == "unerg" then
			table.insert(data.categories, "Dutch unergative verbs")
		elseif data.trans == "unacc" then
			table.insert(data.categories, "Dutch unaccusative verbs")
		else
			error("The \"trans=\" parameter has an invalid value. Valid are: acc, erg, unerg, unacc.")
		end
	end
 
	data.trans2 = args["trans2"]; if data.trans2 == "" then data.trans2 = nil end
 
	if data.trans2 then
		if data.trans2 == "acc" then
			table.insert(data.categories, "Dutch accusative verbs")
		elseif data.trans2 == "erg" then
			table.insert(data.categories, "Dutch ergative verbs")
		elseif data.trans2 == "unerg" then
			table.insert(data.categories, "Dutch unergative verbs")
		elseif data.trans2 == "unacc" then
			table.insert(data.categories, "Dutch unaccusative verbs")
		else
			error("The \"trans2=\" parameter has an invalid value. Valid are: acc, erg, unerg, unacc.")
		end
	end
 
	if not args["trans"] then
		require("Module:debug").track("nl-verb/no trans")
	end
 
	if (args["bot"] or "") ~= "" then
		return make_bot_list(data, sep)
	else
		return make_table(data, sep) .. m_utilities.format_categories(data.categories, lang)
	end
end
 
 
-- Add the unstressed prefix to all the verb forms, or
-- if there is no prefix, add ge- to the past participle
function add_pref(data, pref)
	if pref then
		-- Add prefix before every form
		for key, form in pairs(data.forms) do
			for i, subform in ipairs(form) do
				data.forms[key][i] = pref .. subform
			end
		end
	else
		-- Add ge- prefix before past participle
		if data.forms["past_ptc"] then
			for i, subform in ipairs(data.forms["past_ptc"]) do
				-- Place a diaeresis on the initial vowel of the stem if necessary
				if mw.ustring.find(subform, "^[eiu]") and not mw.ustring.find(subform, "^ij") then
					subform = subform:gsub("^e", "ë"):gsub("^i", "ï"):gsub("^u", "ü")
				end
 
				data.forms["past_ptc"][i] = "ge" .. subform
			end
		end
	end
end
 
-- Add the separable part to all the verb forms
function add_sep(data, sep)
	if not sep then
		return
	end
 
	-- Add main clause forms
	local mainforms = {}
 
	for key, form in pairs(data.forms) do
		if (key:find("^pres_") or key:find("^past_")) and not key:find("_ptc$") then
			mainforms[key .. "_main"] = mw.clone(form)
		end
	end
 
	for key, form in pairs(mainforms) do
		data.forms[key] = form
	end
 
	-- Add separable part to forms
	for key, form in pairs(data.forms) do
		if key:find("_main$") or key:find("^impr_") then
			-- For main-clause finite forms, add the separable part after the form, separated by a space
			for i, subform in ipairs(data.forms[key]) do
				data.forms[key][i] = data.forms[key][i] .. " " .. sep
			end
		else
			-- For all other forms, add the separable part before the form, with no space
			for i, subform in ipairs(data.forms[key]) do
				-- Add a hyphen after the separable part if it ends with the same vowel
				-- that the main/prefixed verb begins with, for verbs like na-apen
				if mw.ustring.find("aeiou", sep:sub(-1)) and sep:sub(-1) == subform:sub(1, 1) then
					subform = sep .. "-" .. subform
				else
					subform = sep .. subform
				end
 
				data.forms[key][i] = subform
			end
		end
	end
end
 
 
--[=[
	*** REGULAR VERBS (mostly) ***
]=]--
 
local function addform(data, key, form, index)
	if data.forms[key] then
		if index then
			table.insert(data.forms[key], index, form)
		else
			table.insert(data.forms[key], form)
		end
	else
		data.forms[key] = {form}
	end
end
 
-- Conjugate a weak verb
conjugations["weak"] = function(args, data)
	table.insert(data.categories, "Dutch weak verbs")
	data.title = "weak"
 
	local pres_stem = args[1] or (NAMESPACE == "Template" and "(1)") or error("The first parameter is missing")
	local pres_stemE = (args[2] or ""); if pres_stemE == "" then pres_stemE = pres_stem .. "e" else pres_stemE = pres_stemE end
 
	local dt = args["dt"] or ""; if dt == "" then if pres_stemE:find("[cfhkpqstx]e$") then dt = "t" else dt = "d" end end
	local past_stem = pres_stem:gsub("([^aeiou])i$", "%1ie") .. dt .. "e"
 
	local past_ptc_stem = (args[3] or ""); if past_ptc_stem == "" then past_ptc_stem = make_long(pres_stem) .. (pres_stem:find("[dt]$") and "" or dt) end
 
	if past_ptc_stem:find("n$") then
		table.insert(data.categories, "Dutch weak verbs with strong past participles")
		data.title = data.title .. " with strong past participle"
	end
 
	present(data, pres_stem, pres_stemE)
	past(data, past_stem, past_stem, past_stem)
	data.forms["past_ptc"] = {past_ptc_stem}
 
	-- "zeggen" has an irregular past tense alongside the regular one
	if pres_stem == "zeg" then
		past(data, "zei", "zeide", "zeidt", 1)
		table.insert(data.categories, "Dutch irregular weak verbs")
		data.title = data.title .. ", irregular"
	end
end
 
-- Conjugate a weak verb with a past tense in -cht
conjugations["weak-cht"] = function(args, data)
	table.insert(data.categories, "Dutch weak verbs (-cht)")
	data.title = "weak with past in ''-cht''"
 
	local pres_stem = args[1] or (NAMESPACE == "Template" and "(1)") or error("The first parameter is missing")
	local pres_stemE = args[2] or ""; if pres_stemE == "" then pres_stemE = pres_stem .. "e" end
 
	local past_stem = (args[3] or (NAMESPACE == "Template" and "(3)") or error("The third parameter is missing")) .. "cht"
 
	present(data, pres_stem, pres_stemE)
	past(data, past_stem, past_stem .. "e", past_stem)
	data.forms["past_ptc"] = {past_stem}
end
 
-- Conjugate a strong verb
conjugations["strong"] = function(args, data)
	local class = args["class"] or ""; if class ~= "" then class = " class " .. class end
	table.insert(data.categories, "Dutch" .. class .. " strong verbs")
	data.title = "strong" .. class
 
	local pres_stem = args[1] or (NAMESPACE == "Template" and "(1)") or error("The first parameter is missing")
	local pres_stemE = args[4] or ""; if pres_stemE == "" then pres_stemE = pres_stem .. "e" end
 
	local past_stem = args[2] or (NAMESPACE == "Template" and "(2)") or error("The second parameter is missing")
	local past_stemT = args[6] or ""; if past_stemT == "" then past_stemT = past_stem .. (past_stem:find("t$") and "" or "t") end
	local past_stemE = args[5] or ""; if past_stemE == "" then past_stemE = past_stem .. "e" end
 
	local past_ptc_stem = args[3] or (NAMESPACE == "Template" and "(3)") or error("The third parameter is missing")
 
	-- If the final consonant of the past participle is not n, then it is a weak past participle.
	if not past_ptc_stem:find("n$") then
		table.insert(data.categories, "Dutch strong verbs with weak past participles")
		data.title = data.title .. " with weak past participle"
	end
 
	present(data, pres_stem, pres_stemE)
	past(data, past_stem, past_stemE, past_stemT)
	data.forms["past_ptc"] = {past_ptc_stem}
 
	-- "houden" and "snijden" have alternative forms without the final -d
	if pres_stem == "houd" then
		addform(data, "pres_indc_1sg", "hou", 1)
		addform(data, "impr_sg", "hou", 1)
		table.insert(data.categories, "Dutch irregular strong verbs")
		data.title = data.title .. ", irregular"
	elseif pres_stem == "snijd" then
		addform(data, "pres_indc_1sg", "snij", 1)
		addform(data, "impr_sg", "snij", 1)
		table.insert(data.categories, "Dutch irregular strong verbs")
		data.title = data.title .. ", irregular"
	-- If the initial or final consonants of the present stem don't match, then this verb is irregular.
	elseif pres_stem:match("^([^aeiouyj]*)") ~= past_stem:match("^([^aeiouyj]*)") or pres_stem:match("([^aeiouyj]*)$") ~= past_stem:match("([^aeiouyj]*)$") then
		table.insert(data.categories, "Dutch irregular strong verbs")
		data.title = data.title .. ", irregular"
	end
end
 
 
--[=[
	*** IRREGULAR VERBS ***
]=]--
 
conjugations["hebben"] = function(args, data)
	table.insert(data.categories, "Dutch irregular weak verbs")
	data.title = "weak, irregular"
 
	present(data, "heb", "hebbe")
	past(data, "had", "hadde", "hadt")
	data.forms["past_ptc"] = {"had"}
 
	addform(data, "pres_indc_u", "heeft")
	data.forms["pres_indc_3sg"] = {"heeft"}
end
 
conjugations["kunnen"] = function(args, data)
	table.insert(data.categories, "Dutch preterite-present verbs")
	data.title = "preterite-present"
 
	data.forms["pres_indc_1sg"] = {"kan"}
	data.forms["pres_indc_2sg"] = {"kunt", "kan"}
	data.forms["pres_indc_gij"] = {"kunt"}
	data.forms["pres_indc_3sg"] = {"kan"}
	data.forms["pres_indc_pl"]  = {"kunnen"}
	data.forms["pres_subj_sg"]  = {"kunne"}
	data.forms["infinitive"]  = {"kunnen"}
	data.forms["pres_ptc"] = {"kunnend"}
 
	past(data, "kon", "konde", "kondt")
 
	data.forms["past_ptc"] = {"kund"}
end
 
conjugations["moeten"] = function(args, data)
	table.insert(data.categories, "Dutch preterite-present verbs")
	data.title = "preterite-present"
 
	present(data, "moet", "moete")
	past(data, "moest", "moeste", "moest")
	data.forms["past_ptc"] = {"moeten"}
end
 
conjugations["mogen"] = function(args, data)
	table.insert(data.categories, "Dutch preterite-present verbs")
	data.title = "preterite-present"
 
	data.forms["pres_indc_1sg"] = {"mag"}
	data.forms["pres_indc_2sg"] = {"mag"}
	data.forms["pres_indc_gij"] = {"moogt"}
	data.forms["pres_indc_3sg"] = {"mag"}
	data.forms["pres_indc_pl"]  = {"mogen"}
	data.forms["pres_subj_sg"]  = {"moge"}
	data.forms["infinitive"]  = {"mogen"}
	data.forms["pres_ptc"] = {"mogend"}
 
	past(data, "mocht", "mochte", "mocht")
 
	data.forms["past_ptc"] = {"mogen"}
end
 
conjugations["weten"] = function(args, data)
	table.insert(data.categories, "Dutch preterite-present verbs")
	data.title = "preterite-present"
 
	present(data, "weet", "wete")
	past(data, "wist", "wiste", "wist")
	data.forms["past_ptc"] = {"weten"}
end
 
conjugations["willen"] = function(args, data)
	table.insert(data.categories, "Dutch irregular verbs")
	data.title = "irregular"
 
	present(data, "wil", "wille")
	past(data, "wou", "woude", "woudt")
	past(data, "wilde", "wilde", "wilde")
	data.forms["past_ptc"] = {"wild"}
 
	addform(data, "pres_indc_2sg", "wil", 1)
	data.forms["pres_indc_3sg"] = {"wil"}
end
 
conjugations["zijn"] = function(args, data)
	table.insert(data.categories, "Dutch irregular verbs")
	data.title = "irregular, suppletive"
 
	present(data, "ben", "zij")
	past(data, "was", "ware", "waart")
	data.forms["past_ptc"] = {"weest"}
 
	data.forms["pres_indc_gij"] = {"zijt"}
	data.forms["pres_indc_3sg"] = {"is"}
	data.forms["impr_sg"] = {"wees", "ben"}
	data.forms["impr_pl"] = {"weest", "zijt"}
end
 
conjugations["zullen"] = function(args, data)
	table.insert(data.categories, "Dutch preterite-present verbs")
	data.title = "preterite-present"
 
	data.forms["pres_indc_1sg"] = {"zal"}
	data.forms["pres_indc_2sg"] = {"zult", "zal"}
	data.forms["pres_indc_3sg"] = {"zal"}
	data.forms["pres_indc_gij"] = {"zult"}
	data.forms["pres_indc_pl"]  = {"zullen"}
	data.forms["pres_subj_sg"]  = {"zulle"}
	data.forms["infinitive"]    = {"zullen"}
	data.forms["pres_ptc"]      = {"zullend"}
 
	past(data, "zou", "zoude", "zoudt")
end
 
 
--[=[
	*** HELPER FUNCTIONS ***
]=]--
 
-- Create regular present-tense forms
function present(data, pres_stem, pres_stemE, index)
	local pres_stemT = make_long(pres_stem) .. (pres_stem:find("t$") and "" or "t")
 
	addform(data, "pres_indc_1sg", pres_stem, index)
	addform(data, "pres_indc_2sg", pres_stemT, index)
	addform(data, "pres_indc_gij", pres_stemT, index)
	addform(data, "pres_indc_3sg", pres_stemT, index)
	addform(data, "pres_indc_pl" , make_long(pres_stemE) .. "n", index)
	addform(data, "pres_subj_sg" , pres_stemE, index)
 
	addform(data, "impr_sg", pres_stem, index)
	addform(data, "impr_pl", pres_stemT, index)
 
	addform(data, "infinitive", make_long(pres_stemE) .. "n", index)
	addform(data, "pres_ptc", make_long(pres_stemE) .. "nd", index)
end
 
 
-- Create regular past-tense forms
function past(data, past_stem, past_stemE, past_stemT, index)
	addform(data, "past_indc_sg"  , past_stem, index)
	addform(data, "past_indc_gij" , past_stemT, index)
	addform(data, "past_indc_pl"  , past_stemE .. "n", index)
	addform(data, "past_subj_sg"  , past_stemE, index)
end
 
 
-- A small helper function for those few verbs that have a stem ending in a
-- vowel (like gaan, staan, skiën, echoën). This lengthens the stem-final vowel.
function make_long(form)
	return form:gsub("([^aeiou])([ao])$", "%1%2%2"):gsub("([^aeiou])i$", "%1ie")
end
 
 
local function show_form(form)
	if not form then
		return "—"
	elseif type(form) ~= "table" then
		error("a non-table value was given in the list of inflected forms.")
	end
 
	local ret = {}
 
	for key, subform in ipairs(form) do
		table.insert(ret, m_links.full_link(subform, nil, lang, nil, nil, nil, {}, false))
	end
 
	return table.concat(ret, ", ")
end
 
-- Make the table
function make_table(data, hasSep)
	return [=[
<div class="NavFrame" style="width: ]=] .. (hasSep and 72 or 42) .. [=[em;">
<div class="NavHead" style="background: #CCCCFF; text-align: left;">Conjugation of ]=] .. m_links.full_link(nil, data.forms["infinitive"][1], lang, nil, "term", nil, {}, false) .. (data.title and " (" .. data.title .. ")" or "") .. [=[</div>
<div class="NavContent">
{| style="width:100%; border:1px solid #CCCCFF; text-align:center; line-height:125%" class="inflection-table" cellspacing="1" cellpadding="3"
|- style="background: #F2F2FF;"
! style="background: #CCCCFF;" | [[infinitive]]
| colspan="4" | ]=] .. show_form(data.forms["infinitive"]) .. [=[
 
]=] .. (hasSep and [=[|- style="background: #E6E6FF;"
|
| colspan="2" style="font-weight: bold;" | [[main&nbsp;clause]]
| colspan="2" style="font-weight: bold;" | [[subordinate&nbsp;clause]]
|- style="background: #E6E6FF;"
| 
| style="width: 25%; font-weight: bold" | [[present&nbsp;tense]]
| style="width: 25%; font-weight: bold" | [[past&nbsp;tense]]
| style="width: 25%; font-weight: bold" | [[present&nbsp;tense]]
| style="width: 25%; font-weight: bold" | [[past&nbsp;tense]]]=] or [=[
 
|- style="background: #E6E6FF;"
| 
| style="width: 50%; font-weight: bold" | [[present&nbsp;tense]]
| style="width: 50%; font-weight: bold" | [[past&nbsp;tense]]]=]) .. [=[
 
|- style="background: #F2F2FF;"
! style="background: #CCCCFF;" | [[first-person|1st&nbsp;person]]&nbsp;[[singular]]
| ]=] .. (hasSep and show_form(data.forms["pres_indc_1sg_main"]) .. " || " .. show_form(data.forms["past_indc_sg_main"]) .. " || " or "") .. show_form(data.forms["pres_indc_1sg"]) .. " || " .. show_form(data.forms["past_indc_sg"]) .. [=[
 
|- style="background: #F2F2FF;"
! style="background: #CCCCFF;" | [[second-person|2nd&nbsp;person]]&nbsp;[[singular]]
| ]=] .. (hasSep and show_form(data.forms["pres_indc_2sg_main"]) .. " || " .. show_form(data.forms["past_indc_sg_main"]) .. " || " or "") .. show_form(data.forms["pres_indc_2sg"]) .. " || " .. show_form(data.forms["past_indc_sg"]) .. [=[
 
]=] .. (data.forms["pres_indc_u"] and [=[|- style="background: #F2F2FF;"
! style="background: #CCCCFF;" | [[second-person|2nd&nbsp;person]]&nbsp;[[singular|sing.]]&nbsp;(<span lang="nl">[[u#Dutch|u]]</span>)
| ]=] .. (hasSep and show_form(data.forms["pres_indc_u_main"]) .. " || " .. show_form(data.forms["past_indc_sg_main"]) .. " || " or "") .. show_form(data.forms["pres_indc_u"]) .. " || " .. show_form(data.forms["past_indc_sg"]) .. [=[
 
]=] or "") .. ((data.forms["pres_indc_gij"] ~= data.forms["pres_indc_2sg"] or data.forms["past_indc_gij"] ~= data.forms["past_indc_sg"]) and [=[|- style="background: #F2F2FF;"
! style="background: #CCCCFF;" | [[second-person|2nd&nbsp;person]]&nbsp;[[singular|sing.]]&nbsp;(<span lang="nl">[[gij#Dutch|gij]]</span>)
| ]=] .. (hasSep and show_form(data.forms["pres_indc_gij_main"]) .. " || " .. show_form(data.forms["past_indc_gij_main"]) .. " || " or "") .. show_form(data.forms["pres_indc_gij"]) .. " || " .. show_form(data.forms["past_indc_gij"]) .. [=[
 
]=] or "") .. [=[|- style="background: #F2F2FF;"
! style="background: #CCCCFF;" | [[third-person|3rd&nbsp;person]]&nbsp;[[singular]]
| ]=] .. (hasSep and show_form(data.forms["pres_indc_3sg_main"]) .. " || " .. show_form(data.forms["past_indc_sg_main"]) .. " || " or "") .. show_form(data.forms["pres_indc_3sg"]) .. " || " .. show_form(data.forms["past_indc_sg"]) .. [=[
 
|- style="background: #F2F2FF;"
! style="background: #CCCCFF;" | [[plural]]
| ]=] .. (hasSep and show_form(data.forms["pres_indc_pl_main"]) .. " || " .. show_form(data.forms["past_indc_pl_main"]) .. " || " or "") .. show_form(data.forms["pres_indc_pl"]) .. " || " .. show_form(data.forms["past_indc_pl"]) .. [=[
 
|- style="background: #E6E6FF; height: 0.5em"
|
| colspan="2" |]=] .. (hasSep and [=[ || colspan="2" |]=] or "") .. [=[
 
|- style="background: #F2F2FF;"
! style="background: #CCCCFF;" | [[subjunctive]]&nbsp;[[singular|sing.]]<sup>1</sup>
| ]=] .. (hasSep and show_form(data.forms["pres_subj_sg_main"]) .. " || " .. show_form(data.forms["past_subj_sg_main"]) .. " || " or "") .. show_form(data.forms["pres_subj_sg"]) .. " || " .. show_form(data.forms["past_subj_sg"]) .. [=[
 
|- style="background: #F2F2FF;"
! style="background: #CCCCFF;" | [[subjunctive]]&nbsp;[[plural|plur.]]<sup>1</sup>
| ]=] .. (hasSep and show_form(data.forms["pres_indc_pl_main"]) .. " || " .. show_form(data.forms["past_indc_pl_main"]) .. " || " or "") .. show_form(data.forms["pres_indc_pl"]) .. " || " .. show_form(data.forms["past_indc_pl"]) .. [=[
 
|- style="background: #E6E6FF; height: 0.5em"
|
| colspan="2" |]=] .. (hasSep and [=[ || rowspan="5" colspan="2" |]=] or "") .. [=[
 
|- style="background: #F2F2FF;"
! style="background: #CCCCFF;" | [[imperative]]&nbsp;[[singular|sing.]]
| ]=] .. show_form(data.forms["impr_sg"]) .. [=[
 
| rowspan="2" style="background: #E6E6FF;" |
|- style="background: #F2F2FF;"
! style="background: #CCCCFF;" | [[imperative]]&nbsp;[[plural|plur.]]<sup>1</sup>
| ]=] .. show_form(data.forms["impr_pl"]) .. [=[
 
|- style="background: #E6E6FF; height: 0.5em"
|
| colspan="2" |
|- style="background: #F2F2FF;"
! style="background: #CCCCFF;" | [[participles]]
| ]=] .. show_form(data.forms["pres_ptc"]) .. " || " .. show_form(data.forms["past_ptc"]) .. [=[
 
|- style="background: #E6E6FF;"
| colspan="5" style="text-align:left; vertical-align:top; font-size: smaller; line-height: 1em" | <sup>1)</sup> [[Wiktionary:Glossary#archaic|Archaic]].
|}</div></div>]=]
end
 
function make_bot_list(data, hasSep)
	local ret = ""
 
	if hasSep then
		ret = ret .. "* sep=1\n"
	end
 
	for key, form in pairs(data.forms) do
		if type(form) == "table" then
			for key2, subform in ipairs(form) do
				ret = ret .. "* " .. key .. "_" .. key2 .. "=" .. subform .. "\n"
			end
		else
			ret = ret .. "* " .. key .. "=" .. form .. "\n"
		end
	end
 
	return ret
end
 
return export