Modul:Genitiv

Fra MotorWiki
Hopp til navigering Hopp til søk

Dokumentasjon for denne modulen kan opprettes på Modul:Genitiv/dok

local p = {}

function p.genitiv(frame)
	-- get the argument
	local ord = frame.args[1]
	if ord == nil then
		ord = frame:getParent().args[1]
	end
	-- check if an argument is found
	if ord == nil then
		return "<strong class='error'>Malen «genitiv» må ha ett argument</strong>"
	end
	-- get the determiner
	local det = frame.args['det']
	if det == nil then
		det = frame:getParent().args['det']
	end
	-- try to rewrite, but note that this could fail
	local status, str = pcall(function() return p._genitiv(ord, det) end)
	-- rewrite is done, should happen in most cases
	if status == true then
		return str
	end
	-- rewrite is not done, this is a fallback but is probably an error
	return ord
end

function p._genitiv(ord, det)
	-- fallback for domain, use determinative for genitive
	if mw.ustring.find(ord, '^%S%s%S$ ') -- any space
		or (det and mw.ustring.find(ord, '%s%l+$') )-- can be a full name
	then
		return ord .. " " .. (det or "sin")
	end
	-- various overrides where a determinative should be used for genitive
	if mw.ustring.find(ord, '%A$') -- trailing non-letter
		or (det and mw.ustring.find(ord, '%s%l+$') ) -- full name
		or (not mw.ustring.find(ord, '%s') and mw.ustring.find(ord, '^%w+%.%a+$') ) -- url
	then
		return ord .. " " .. (det or "sin")
	end
	-- single word, prepare to rewrite special cases
	local sv = "sxzşŝșšśßžżź" -- a few letters that needs special treatment
	local sb = mw.ustring.toNFC(mw.ustring.lower(mw.ustring.sub(ord, -1)))
	if mw.ustring.find(sv, sb, nil, true) then
		-- use modifier letter apostrophe as genitive marker
		return ord .. "ʼ"
	else
		-- just add the 's' genitive marker
		return ord .. "s"
	end
end

return p