Module:affix: difference between revisions

From Wiktionary, the free dictionary
Jump to navigation Jump to search
Content deleted Content added
no "Canonicalname diminutive words" category
don't pluralize if the pos is already pluralized (noun, verb, adjective
Line 16: Line 16:
}
}


local function pluralizePOS(pos)
if pos ~= "nouns" and pos ~= "verbs" and pos ~= "adjectives" then
if pos:find("[sx]$") then
pos = pos .. "es"
else
pos = pos .. "s"
end
end
return pos
end


local function link_term(terminfo, lang, sc)
local function link_term(terminfo, lang, sc)
Line 71: Line 81:
pos = pos or "word"
pos = pos or "word"
pluralizePOS(pos)
-- Pluralize the part of speech name
if pos:find("[sx]$") then
pos = pos .. "es"
else
pos = pos .. "s"
end
-- Process each part
-- Process each part
Line 168: Line 173:
pos = pos or "word"
pos = pos or "word"
pluralizePOS(pos)
-- Pluralize the part of speech name
if pos:find("[sx]$") then
pos = pos .. "es"
else
pos = pos .. "s"
end
-- Hyphenate the affixes
-- Hyphenate the affixes
Line 243: Line 243:
pos = pos or "word"
pos = pos or "word"
pluralizePOS(pos)
-- Pluralize the part of speech name
if pos:find("[sx]$") then
pos = pos .. "es"
else
pos = pos .. "s"
end
-- Hyphenate the affixes
-- Hyphenate the affixes
Line 316: Line 311:
pos = pos or "word"
pos = pos or "word"
pluralizePOS(pos)
-- Pluralize the part of speech name
if pos:find("[sx]$") then
pos = pos .. "es"
else
pos = pos .. "s"
end
-- Hyphenate the affixes
-- Hyphenate the affixes
Line 363: Line 353:
pos = pos or "word"
pos = pos or "word"
pluralizePOS(pos)
-- Pluralize the part of speech name
if pos:find("[sx]$") then
pos = pos .. "es"
else
pos = pos .. "s"
end
-- Hyphenate the affixes
-- Hyphenate the affixes
Line 433: Line 418:
pos = pos or "word"
pos = pos or "word"
pluralizePOS(pos)
-- Pluralize the part of speech name
if pos:find("[sx]$") then
pos = pos .. "es"
else
pos = pos .. "s"
end
-- Hyphenate the affixes
-- Hyphenate the affixes
Line 500: Line 480:
pos = pos or "word"
pos = pos or "word"
pluralizePOS(pos)
-- Pluralize the part of speech name
if pos:find("[sx]$") then
pos = pos .. "es"
else
pos = pos .. "s"
end
-- Hyphenate the affixes
-- Hyphenate the affixes

Revision as of 17:47, 26 January 2017

This module, accessed through Module:affix/templates, powers most of the morphology templates, including {{affix}}, {{prefix}}, {{suffix}}, {{confix}}, {{compound}}, {{blend}}, {{univerbation}} and various others, as well as {{prefixsee}} and {{suffixsee}}.


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

local export = {}

-- FIXME: should be script-based
-- But we can't do that unless we do script detection before linking.
local hyphens = {
	["ar"] = "ـ",
	["fa"] = "ـ",
	["he"] = "־",
	["ja"] = "",
	["ko"] = "",
	["yi"] = "־",
	["zh"] = "",
}

local function pluralizePOS(pos)
	if pos ~= "nouns" and pos ~= "verbs" and pos ~= "adjectives" then
		if pos:find("[sx]$") then
			pos = pos .. "es"
		else
			pos = pos .. "s"
		end
	end
	return pos
end

local function link_term(terminfo, lang, sc)
	local terminfo_new = {}
	
	for key, val in pairs(terminfo) do
		terminfo_new[key] = val
	end
	
	if terminfo_new.lang then
		return require("Module:etymology").format_borrowed(lang, terminfo, sort_key, false, true)
	else
		terminfo_new.lang = lang
		terminfo_new.sc = terminfo_new.sc or sc
		return m_links.full_link(terminfo_new, "term", false)
	end
end


local function get_hyphen(lang, sc)
	--The script will be "Latn" for transliterations.
	if sc and sc:getCode() == "Latn" then
		return "-"
	else
		return hyphens[lang:getCode()] or "-"
	end
end


local function get_affix_type(lang, sc, part)
	if not part then
		return nil
	end
	
	local hyphen = get_hyphen(lang, sc)
	local hyphen_space_hyphen = hyphen .. " " .. hyphen
	
	part = part:gsub("^*", "")

	if mw.ustring.find(part, hyphen_space_hyphen, 1, true) then
		return "circumfix"
	elseif mw.ustring.sub(part, 1, 1) == hyphen and mw.ustring.sub(part, -1) == hyphen then
		return "infix"
	elseif mw.ustring.sub(part, -1) == hyphen then
		return "prefix"
	elseif mw.ustring.sub(part, 1, 1) == hyphen then
		return "suffix"
	else
		return nil
	end
end


function export.show_affixes(lang, sc, parts, pos, sort_key, nocat)
	pos = pos or "word"
	
	pluralizePOS(pos)
	
	-- Process each part
	local parts_formatted = {}
	local categories_formatted = {}
	local whole_words = 0
	
	for i, part in ipairs(parts) do
		-- Make a link for the part
		table.insert(parts_formatted, link_term(part, lang, sc, sort_key))
		
		-- Is it an affix, and if so, what type of affix?
		local affix_type = get_affix_type(part.lang or lang, part.sc or sc, part.term)
		
		if affix_type then
			-- Make a sort key
			-- For the first part, use the second part as the sort key
			local part_sort_base = nil
			local part_sort = part.sort or sort_key
			
			if i == 1 and parts[2] and parts[2].term then
				part_sort_base = lang:makeEntryName(parts[2].term)
			end
			
			if affix_type == "infix" then affix_type = "interfix" end
			
			if part.pos and mw.ustring.match(part.pos, "patronym") then
				table.insert(categories_formatted, m_utilities.format_categories({lang:getCanonicalName() .. " patronymics"}, lang, part_sort, part_sort_base))
			end
			
			if pos ~= "words" and part.pos and mw.ustring.match(part.pos, "diminutive") then
				table.insert(categories_formatted, m_utilities.format_categories({lang:getCanonicalName() .. " diminutive " .. pos}, lang, part_sort, part_sort_base))
			end
			
			table.insert(categories_formatted, m_utilities.format_categories({lang:getCanonicalName() .. " " .. pos .. " " .. affix_type .. "ed with " .. lang:makeEntryName(part.term) .. (part.id and " (" .. part.id .. ")" or "")}, lang, part_sort, part_sort_base))
		else
			whole_words = whole_words + 1
			
			if whole_words == 2 then
				table.insert(categories_formatted, m_utilities.format_categories({lang:getCanonicalName() .. " compound " .. pos}, lang, sort_key))
			end
		end
	end
	
	-- If there are no categories, then there were no actual affixes, only regular words.
	-- This function does not support compounds (yet?), so show an error.
	if #categories_formatted == 0 then
		error("The parameters did not include any affixes, and the word is not a compound. Please provide at least one affix.")
	end
	
	return table.concat(parts_formatted, " +‎ ") .. (nocat and "" or table.concat(categories_formatted))
end


function export.show_compound(lang, sc, parts, pos, sort_key, nocat)
	pos = pos or "words"
	local parts_formatted = {}
	local categories_formatted = {}
	table.insert(categories_formatted, m_utilities.format_categories({lang:getCanonicalName() .. " compound words"}, lang, sort_key))
	
	-- Make links out of all the parts
	local whole_words = 0
	for i, part in ipairs(parts) do
		table.insert(parts_formatted, link_term(part, lang, sc, sort_key))
		
		local affix_type = get_affix_type(part.lang or lang, part.sc or sc, part.term)
		
		if affix_type == "infix" then
			table.insert(categories_formatted, m_utilities.format_categories({lang:getCanonicalName() .. " " .. pos .. " interfixed with " .. lang:makeEntryName(part.term)}, lang, part.sort or sort_key))
		elseif affix_type then
			require("Module:debug").track("compound")
			require("Module:debug").track("compound/" .. affix_type)
			require("Module:debug").track("compound/" .. affix_type .. "/lang/" .. lang:getCode())
		else
			whole_words = whole_words + 1
		end
	end

	if whole_words == 1 then
		require("Module:debug").track("compound/one whole word")
	elseif whole_words == 0 then
		require("Module:debug").track("compound/looks like confix")
	end
	
	return table.concat(parts_formatted, " +‎ ") .. (nocat and "" or table.concat(categories_formatted))
end


function export.show_circumfix(lang, sc, prefix, base, suffix, pos, sort_key, nocat)
	local categories = {}
	pos = pos or "word"
	
	pluralizePOS(pos)
	
	-- Hyphenate the affixes
	prefix.term = export.make_affix(prefix.term, prefix.lang or lang, prefix.sc or sc, "prefix")
	prefix.alt = export.make_affix(prefix.alt, prefix.lang or lang, prefix.sc or sc, "prefix")
	
	if prefix.annotations then
		prefix.annotations.tr = export.make_affix(prefix.annotations.tr, prefix.lang or lang, require("Module:scripts").getByCode("Latn"), "prefix")
	end
	
	suffix.term = export.make_affix(suffix.term, suffix.lang or lang, suffix.sc or sc, "suffix")
	suffix.alt = export.make_affix(suffix.alt, suffix.lang or lang, suffix.sc or sc, "suffix")
	
	if suffix.annotations then
		suffix.annotations.tr = export.make_affix(suffix.annotations.tr, suffix.lang or lang, require("Module:scripts").getByCode("Latn"), "suffix")
	end
	
	local prefix_affix_type = get_affix_type(prefix.lang or lang, prefix.sc or sc, prefix.term)
	if prefix_affix_type ~= "prefix" then
		require("Module:debug").track("circumfix")
		require("Module:debug").track("circumfix/prefix")
		require("Module:debug").track("circumfix/prefix/" .. (prefix_affix_type or "none"))
		require("Module:debug").track("circumfix/prefix/" .. (prefix_affix_type or "none") .. "/lang/" .. lang:getCode())
	end
	
	local base_affix_type = get_affix_type(base.lang or lang, base.sc or sc, base.term)
	if base_affix_type then
		require("Module:debug").track("circumfix")
		require("Module:debug").track("circumfix/base")
		require("Module:debug").track("circumfix/base/" .. base_affix_type)
		require("Module:debug").track("circumfix/base/" .. base_affix_type .. "/lang/" .. lang:getCode())
	end
	
	local suffix_affix_type = get_affix_type(suffix.lang or lang, suffix.sc or sc, suffix.term)
	if suffix_affix_type ~= "suffix" then
		require("Module:debug").track("circumfix")
		require("Module:debug").track("circumfix/suffix")
		require("Module:debug").track("circumfix/suffix/" .. (suffix_affix_type or "none"))
		require("Module:debug").track("circumfix/suffix/" .. (suffix_affix_type or "none") .. "/lang/" .. lang:getCode())
	end
	
	-- Create circumfix term
	local circumfix = nil
	
	if prefix.term and suffix.term then
		circumfix = prefix.term .. " " .. suffix.term
		prefix.alt = prefix.alt or prefix.term
		suffix.alt = suffix.alt or suffix.term
		prefix.term = circumfix
		suffix.term = circumfix
	end
	
	-- Make links out of all the parts
	local parts_formatted = {}
	local sort_base = lang:makeEntryName(base.term)
	
	table.insert(parts_formatted, link_term(prefix, lang, sc, sort_key))
	table.insert(parts_formatted, link_term(base, lang, sc, sort_key))
	table.insert(parts_formatted, link_term(suffix, lang, sc, sort_key))
	
	-- Insert the categories
	table.insert(categories, lang:getCanonicalName() .. " " .. pos .. " circumfixed with " .. lang:makeEntryName(circumfix, lang))
	
	return table.concat(parts_formatted, " +‎ ") .. (nocat and "" or m_utilities.format_categories(categories, lang, sort_key, sort_base))
end


function export.show_confix(lang, sc, prefix, base, suffix, pos, sort_key, nocat)
	pos = pos or "word"
	
	pluralizePOS(pos)
	
	-- Hyphenate the affixes
	prefix.term = export.make_affix(prefix.term, prefix.lang or lang, prefix.sc or sc, "prefix")
	prefix.alt = export.make_affix(prefix.alt, prefix.lang or lang, prefix.sc or sc, "prefix")
	
	if prefix.annotations then
		prefix.annotations.tr = export.make_affix(prefix.annotations.tr, prefix.lang or lang, require("Module:scripts").getByCode("Latn"), "prefix")
	end
	
	suffix.term = export.make_affix(suffix.term, suffix.lang or lang, suffix.sc or sc, "suffix")
	suffix.alt = export.make_affix(suffix.alt, suffix.lang or lang, suffix.sc or sc, "suffix")
	
	if suffix.annotations then
		suffix.annotations.tr = export.make_affix(suffix.annotations.tr, suffix.lang or lang, require("Module:scripts").getByCode("Latn"), "suffix")
	end
	
	local prefix_affix_type = get_affix_type(prefix.lang or lang, prefix.sc or sc, prefix.term)
	if prefix_affix_type ~= "prefix" then
		require("Module:debug").track("confix")
		require("Module:debug").track("confix/prefix")
		require("Module:debug").track("confix/prefix/" .. (prefix_affix_type or "none"))
		require("Module:debug").track("confix/prefix/" .. (prefix_affix_type or "none") .. "/lang/" .. lang:getCode())
	end
	
	if base then
		local base_affix_type = get_affix_type(base.lang or lang, base.sc or sc, base.term)
		if base_affix_type then
			require("Module:debug").track("confix")
			require("Module:debug").track("confix/base")
			require("Module:debug").track("confix/base/" .. base_affix_type)
			require("Module:debug").track("confix/base/" .. base_affix_type .. "/lang/" .. lang:getCode())
		end
	end
	
	local suffix_affix_type = get_affix_type(suffix.lang or lang, suffix.sc or sc, suffix.term)
	if suffix_affix_type ~= "suffix" then
		require("Module:debug").track("confix")
		require("Module:debug").track("confix/suffix")
		require("Module:debug").track("confix/suffix/" .. (suffix_affix_type or "none"))
		require("Module:debug").track("confix/suffix/" .. (suffix_affix_type or "none") .. "/lang/" .. lang:getCode())
	end
	
	-- Make links out of all the parts
	local parts_formatted = {}
	local prefix_sort_base = lang:makeEntryName(suffix.term)
	local prefix_categories = {}
	local suffix_categories = {}
	
	table.insert(parts_formatted, link_term(prefix, lang, sc, sort_key))
	table.insert(prefix_categories, lang:getCanonicalName() .. " " .. pos .. " prefixed with " .. lang:makeEntryName(prefix.term, lang))
	
	if base then
		prefix_sort_base = lang:makeEntryName(base.term)
		table.insert(parts_formatted, link_term(base, lang, sc, sort_key))
	end
	
	table.insert(parts_formatted, link_term(suffix, lang, sc, sort_key))
	table.insert(suffix_categories, lang:getCanonicalName() .. " " .. pos .. " suffixed with " .. lang:makeEntryName(suffix.term, lang))
	
	return table.concat(parts_formatted, " +‎ ") .. (nocat and "" or m_utilities.format_categories(prefix_categories, lang, sort_key, prefix_sort_base) .. m_utilities.format_categories(suffix_categories, lang, sort_key))
end


function export.show_infix(lang, sc, base, infix, pos, sort_key, nocat)
	local categories = {}
	pos = pos or "word"
	
	pluralizePOS(pos)
	
	-- Hyphenate the affixes
	infix.term = export.make_affix(infix.term, infix.lang or lang, infix.sc or sc, "infix")
	infix.alt = export.make_affix(infix.alt, infix.lang or lang, infix.sc or sc, "infix")
	
	if infix.annotations then
		infix.annotations.tr = export.make_affix(infix.annotations.tr, infix.lang or lang, require("Module:scripts").getByCode("Latn"), "infix")
	end
	
	local base_affix_type = get_affix_type(base.lang or lang, base.sc or sc, base.term)
	if base_affix_type then
		require("Module:debug").track("infix")
		require("Module:debug").track("infix/base")
		require("Module:debug").track("infix/base/" .. base_affix_type)
		require("Module:debug").track("infix/base/" .. base_affix_type .. "/lang/" .. lang:getCode())
	end
	
	local infix_affix_type = get_affix_type(infix.lang or lang, infix.sc or sc, infix.term)
	if infix_affix_type ~= "infix" then
		require("Module:debug").track("infix")
		require("Module:debug").track("infix/infix")
		require("Module:debug").track("infix/infix/" .. (infix_affix_type or "none"))
		require("Module:debug").track("infix/infix/" .. (infix_affix_type or "none") .. "/lang/" .. lang:getCode())
	end
	
	-- Make links out of all the parts
	local parts_formatted = {}
	
	table.insert(parts_formatted, link_term(base, lang, sc, sort_key))
	table.insert(parts_formatted, link_term(infix, lang, sc, sort_key))
	
	-- Insert the categories
	table.insert(categories, lang:getCanonicalName() .. " " .. pos .. " infixed with " .. lang:makeEntryName(infix.term))
	
	return table.concat(parts_formatted, " +‎ ") .. (nocat and "" or m_utilities.format_categories(categories, lang, sort_key))
end


function export.show_prefixes(lang, sc, prefixes, base, pos, sort_key, nocat)
	pos = pos or "word"
	
	pluralizePOS(pos)
	
	-- Hyphenate the affixes
	for i, prefix in ipairs(prefixes) do
		prefixes[i].term = export.make_affix(prefix.term, prefix.lang or lang, prefix.sc or sc, "prefix")
		prefixes[i].alt = export.make_affix(prefix.alt, prefix.lang or lang, prefix.sc or sc, "prefix")
		
		if prefix.annotations then
			prefixes[i].annotations.tr = export.make_affix(prefix.annotations.tr, prefix.lang or lang, require("Module:scripts").getByCode("Latn"), "prefix")
		end
	end
	
	for i, prefix in ipairs(prefixes) do
		local prefix_affix_type = get_affix_type(prefix.lang or lang, prefix.sc or sc, prefix.term)
		if prefix_affix_type ~= "prefix" then
			require("Module:debug").track("prefix")
			require("Module:debug").track("prefix/prefix")
			require("Module:debug").track("prefix/prefix/" .. (prefix_affix_type or "none"))
			require("Module:debug").track("prefix/prefix/" .. (prefix_affix_type or "none") .. "/lang/" .. lang:getCode())
		end
	end
	
	if base then
		local base_affix_type = get_affix_type(base.lang or lang, base.sc or sc, base.term)
		if base_affix_type then
			require("Module:debug").track("prefix")
			require("Module:debug").track("prefix/base")
			require("Module:debug").track("prefix/base/" .. base_affix_type)
			require("Module:debug").track("prefix/base/" .. base_affix_type .. "/lang/" .. lang:getCode())
		end
	end
	
	-- Make links out of all the parts
	local parts_formatted = {}
	local first_sort_base = nil
	local categories = {}
	
	for i, prefix in ipairs(prefixes) do
		table.insert(parts_formatted, link_term(prefix, lang, sc, sort_key))
		table.insert(categories, lang:getCanonicalName() .. " " .. pos .. " prefixed with " .. lang:makeEntryName(prefix.term, lang) .. (prefix.id and " (" .. prefix.id .. ")" or ""))
		
		if i > 1 and first_sort_base == nil then
			first_sort_base = lang:makeEntryName(prefix.term)
		end
	end
	
	if base then
		if first_sort_base == nil then
			first_sort_base = lang:makeEntryName(base.term)
		end
		
		table.insert(parts_formatted, link_term(base, lang, sc, sort_key))
	else
		table.insert(parts_formatted, "")
	end
	
	local first_category = table.remove(categories, 1)
	return table.concat(parts_formatted, " +‎ ") .. (nocat and "" or m_utilities.format_categories({first_category}, lang, sort_key, first_sort_base) .. m_utilities.format_categories(categories, lang, sort_key))
end


function export.show_suffixes(lang, sc, base, suffixes, pos, sort_key, nocat)
	local categories = {}
	pos = pos or "word"
	
	pluralizePOS(pos)
	
	-- Hyphenate the affixes
	for i, suffix in ipairs(suffixes) do
		suffixes[i].term = export.make_affix(suffix.term, suffix.lang or lang, suffix.sc or sc, "suffix")
		suffixes[i].alt = export.make_affix(suffix.alt, suffix.lang or lang, suffix.sc or sc, "suffix")
		
		if suffix.annotations then
			suffixes[i].annotations.tr = export.make_affix(suffix.annotations.tr, suffix.lang or lang, require("Module:scripts").getByCode("Latn"), "suffix")
		end
	end
	
	if base then
		local base_affix_type = get_affix_type(base.lang or lang, base.sc or sc, base.term)
		if base_affix_type then
			require("Module:debug").track("suffix")
			require("Module:debug").track("suffix/base")
			require("Module:debug").track("suffix/base/" .. base_affix_type)
			require("Module:debug").track("suffix/base/" .. base_affix_type .. "/lang/" .. lang:getCode())
		end
	end
	
	for i, suffix in ipairs(suffixes) do
		local suffix_affix_type = get_affix_type(suffix.lang or lang, suffix.sc or sc, suffix.term)
		if suffix_affix_type ~= "suffix" then
			require("Module:debug").track("suffix")
			require("Module:debug").track("suffix/suffix")
			require("Module:debug").track("suffix/suffix/" .. (suffix_affix_type or "none"))
			require("Module:debug").track("suffix/suffix/" .. (suffix_affix_type or "none") .. "/lang/" .. lang:getCode())
		end
	end
	
	-- Make links out of all the parts
	local parts_formatted = {}
	
	if base then
		table.insert(parts_formatted, link_term(base, lang, sc, sort_key))
	else
		table.insert(parts_formatted, "")
	end
	
	for i, suffix in ipairs(suffixes) do
		table.insert(parts_formatted, link_term(suffix, lang, sc, sort_key))
	end
	
	-- Insert the categories
	for i, suffix in ipairs(suffixes) do
		table.insert(categories, lang:getCanonicalName() .. " " .. pos .. " suffixed with " .. lang:makeEntryName(suffix.term) .. (suffix.id and " (" .. suffix.id .. ")" or ""))
		
		if suffix.pos and mw.ustring.match(suffix.pos, "patronym") then
			table.insert(categories, lang:getCanonicalName() .. " patronymics")
		end
	end
	
	return table.concat(parts_formatted, " +‎ ") .. (nocat and "" or m_utilities.format_categories(categories, lang, sort_key))
end


function export.show_transfix(lang, sc, base, transfix, pos, sort_key, nocat)
	local categories = {}
	pos = pos or "word"
	
	pluralizePOS(pos)
	
	-- Hyphenate the affixes
	transfix.term = export.make_affix(transfix.term, transfix.lang or lang, transfix.sc or sc, "transfix")
	transfix.alt = export.make_affix(transfix.alt, transfix.lang or lang, transfix.sc or sc, "transfix")
	transfix.tr = export.make_affix(transfix.tr, transfix.lang or lang, require("Module:scripts").getByCode("Latn"), "transfix")
	
	-- Make links out of all the parts
	local parts_formatted = {}
	
	table.insert(parts_formatted, link_term(base, lang, sc, sort_key))
	table.insert(parts_formatted, link_term(transfix, lang, sc, sort_key))
	
	-- Insert the categories
	table.insert(categories, lang:getCanonicalName() .. " " .. pos .. " transfixed with " .. lang:makeEntryName(transfix.term))
	
	return table.concat(parts_formatted, " +‎ ") .. (nocat and "" or m_utilities.format_categories(categories, lang, sort_key))
end


-- Adds a hyphen to a word in the appropriate place
function export.make_affix(term, lang, sc, affixtype)
	if not (affixtype == "prefix" or affixtype == "suffix" or affixtype == "circumfix" or affixtype == "infix" or affixtype == "interfix" or affixtype == "transfix") then
		error("Invalid affix type")
	end
	
	if not term then
		return nil
	elseif affixtype == "circumfix" or affixtype == "transfix" then
		return term
	elseif affixtype == "interfix" then
		affixtype = "infix"
	end
	
	local detected_type = get_affix_type(lang, sc, term)
	
	if affixtype and detected_type == affixtype or (detected_type == "infix" and affixtype == "prefix") or (detected_type == "infix" and affixtype == "suffix") then
		return term
	end
	
	--remove an asterisk if the morpheme is reconstructed and add it in the end
	local reconstructed = ""
	if term:find("^*") then 
		reconstructed = "*"
		term = term:gsub("^*", "")
	end
	
	local hyphen = get_hyphen(lang, sc)
	
	if affixtype == "suffix" then
		term = hyphen .. term
	elseif affixtype == "prefix" then
		term = term .. hyphen
	elseif affixtype == "infix" then
		term = hyphen .. term .. hyphen
	else
		error("Invalid affix type")
	end
	
	return reconstructed .. term
end

return export