Module:nb-noun

From Wiktionary, the free dictionary
Jump to navigation Jump to search
This module needs documentation.
Please document this module by describing its purpose and usage on the documentation page.

local lang = require("Module:languages").getByCode("nb")
local accents = require("Module:no-diacritics")

local export = {}

function export.regular(frame)
	local PAGENAME = mw.title.getCurrentTitle().text
	local args = frame:getParent().args
	local class = frame.args[1]
	
	local data = {lang = lang, pos_category = "nouns", categories = {}, genders = {}, inflections = {}}
	
	-- Gather parameters
	local root = PAGENAME:gsub("e$", "")
	
	local root_pl = nil
	local root_sg = nil
	if args[1] and args[1] ~= '' and not args[2] then
		root_sg = args[1]
		root_pl = args[1]
	elseif args[2] and args[2] ~= '' then
		root_pl = args[2]
		if args[1] and args[1] ~= '' then
			root_sg = args[1]
		end
	end
	
	-- check for accents
	hasAccents = false
	if accents.hasAccents(PAGENAME) then
		hasAccents = true
	end
	
	local gen_dsg = args['gen_dsg']; if gen_dsg == "" then gen_dsg = nil end
	local uncountable = class:find('u$')
	
	if not root_pl then
		if PAGENAME:find("kel$") then
			root_pl = PAGENAME:gsub("k?kel$", "kl")
		elseif PAGENAME:find("tel$") and not PAGENAME:find('mittel$') and not PAGENAME:find('pitel$')then
			root_pl = PAGENAME:gsub("t?tel$", "tl")
		else
			root_pl = root
		end
	end

	if not root_sg then
		root_sg = root
	end
	
	-- Create forms
	data.genders = {class:sub(1, 1)} -- extracts e.g. "m" from "m1"
	local definite_singular = {label = "definite singular"}
	local indefinite_plural = {label = "indefinite plural"}
	local definite_plural = {label = "definite plural"}
	
	if class == 'm1' then
		table.insert(definite_singular, root_sg .. 'en')
		table.insert(indefinite_plural, root_pl .. 'er')
		table.insert(definite_plural, root_pl .. 'ene')
	elseif class == 'm2' then
		table.insert(definite_singular, root_sg .. 'en')
		table.insert(indefinite_plural, root_pl .. 'e')
		table.insert(definite_plural, root_pl .. 'ne')
	elseif class == 'm3' then
		root_pl = PAGENAME:gsub("er$", "")
		table.insert(definite_singular, root_sg .. 'en')
		table.insert(indefinite_plural, root_sg .. 'e')
		table.insert(indefinite_plural, root_pl .. 're')
		table.insert(indefinite_plural, root_pl .. 'rer')
		table.insert(definite_plural, root_pl .. 'erne')
		table.insert(definite_plural, root_pl .. 'rene')
	elseif class == 'mu' then
		table.insert(definite_singular, root_sg .. 'en')
	elseif class == 'c' then
		data.genders = {'f', 'm'}
		table.insert(definite_singular, root_sg .. 'a')
		table.insert(definite_singular, root_sg .. 'en')
		table.insert(indefinite_plural, root_pl .. 'er')
		table.insert(definite_plural, root_pl .. 'ene')
	elseif class == 'c2' then
		data.genders = {'m', 'n'}
		table.insert(definite_singular, root_sg .. 'en')
		table.insert(definite_singular, root_sg .. 'et')
		table.insert(indefinite_plural, root_pl .. 'er')
		table.insert(indefinite_plural, root_pl)
		table.insert(definite_plural, root_pl .. 'ene')
		table.insert(definite_plural, root_pl .. 'a')
	elseif class == 'fmu' or class == 'cu' then
		data.genders = {'f', 'm'}
		table.insert(definite_singular, root_sg .. 'a')
		table.insert(definite_singular, root_sg .. 'en')
	elseif class == 'n1' then
		table.insert(definite_singular, root_sg .. 'et')
		table.insert(indefinite_plural, root_pl)
		table.insert(definite_plural, root_pl .. 'a')
		table.insert(definite_plural, root_pl .. 'ene')
	elseif class == 'n2' then
		table.insert(definite_singular, root_sg .. 'et')
		table.insert(indefinite_plural, root_pl .. 'er')
		table.insert(definite_plural, root_pl .. 'a')
		table.insert(definite_plural, root_pl .. 'ene')
	elseif class == 'n3' then
		table.insert(definite_singular, root_sg .. 'et')
		table.insert(indefinite_plural, PAGENAME)
		table.insert(indefinite_plural, root_pl .. 'er')
		table.insert(definite_plural, root_pl .. 'a')
		table.insert(definite_plural, root_pl .. 'ene')
	elseif class == 'nu' then
		table.insert(definite_singular, root_sg .. 'et')
	end
	
	-- Add inflections
	data.inflections = {definite_singular}
	
	if #indefinite_plural > 0 then
		table.insert(data.inflections, indefinite_plural)
	end
	
	if #definite_plural > 0 then
		table.insert(data.inflections, definite_plural)
	end
 	
 	if gen_dsg then
		table.insert(data.inflections, {label = "genitive definite singular", gen_dsg})
	end
	
	if hasAccents then
		for key, value in pairs(data.inflections) do --iterate over all generated forms
			for i = 1, #data.inflections[key] do
				if data.inflections[key][i] ~= PAGENAME then -- inflected forms identical to the singular indefinite retain their accents
					table.insert(data.inflections[key], accents.removeAccents(data.inflections[key][i])) -- insert non-accented form
				end
			end
		end
	end
	
	if uncountable then
		table.insert(data.inflections, {label = '[[Appendix:Glossary#uncountable|uncountable]]'})
		table.insert(data.categories, lang:getCanonicalName() .. " uncountable nouns")
	end
	
	return require("Module:headword").full_headword(data)
end

function export.irregular(frame)
	local PAGENAME = mw.title.getCurrentTitle().text
	local args = frame:getParent().args
	local uncountable = false
	
	local data = {lang = lang, pos_category = "nouns", categories = {}, genders = {}, inflections = {}}
	
	-- Gather parameters
	local gen_dsg = args['gen_dsg']; if gen_dsg == "" then gen_dsg = nil end
	
	if args['uncountable'] or args['unc'] then
		uncountable = true
	end
	
	if args[1] == 'c' then
		table.insert(data.genders, 'f')
		table.insert(data.genders, 'm')
	else
		table.insert(data.genders, args[1])
	end
	if args['g2'] then
		table.insert(data.genders, args['g2'])
	end
	if args['g3'] then
		table.insert(data.genders, args['g3'])
	end
	
	-- Insert inflected forms
	local definite_singular = {label = "definite singular"}
	local indefinite_plural = {label = "indefinite plural"}
	local definite_plural = {label = "definite plural"}
	

	table.insert(definite_singular, args[2])
	if args['ds2'] then
		table.insert(definite_singular, args['ds2'])
	end
	table.insert(data.inflections, definite_singular)
	
	if not uncountable then
		table.insert(indefinite_plural, args[3])
		if args['ip2'] then
			table.insert(indefinite_plural, args['ip2'])
		end
		table.insert(data.inflections, indefinite_plural)
		
		table.insert(definite_plural, args[4])
		if args['dp2'] then
			table.insert(definite_plural, args['dp2'])
		end
		table.insert(data.inflections, definite_plural)
	else
		table.insert(data.inflections, {label = '[[Appendix:Glossary#uncountable|uncountable]]'})
		table.insert(data.categories, lang:getCanonicalName() .. " uncountable nouns")
	end
	
	if gen_dsg then
		table.insert(data.inflections, {label = "genitive definite singular", gen_dsg})
	end
	
	return require("Module:headword").full_headword(data)
end

return export