Module:Gl-plural

-- Gets the plural of Galician nouns and adjectives.
 
local accented_letters = {'á', 'é', 'í', 'ó', 'ú'}
local remove_accent = {['á']='a', ['é']='e', ['í']='i', ['ó']='o', ['ú']='u'}
local vowels = {'a', 'e', 'i', 'o', 'u', 'á', 'é', 'í', 'ó', 'ú'}
local export = {}
 
function export.show(frame)
    local args = frame:getParent().args
    return export.get_plural(args[1])
end
 
-- Returns a singular’s plural if it can be safely guessed, and an empty string
-- otherwise.
function export.get_plural(lemma)
 
	if (has_space_or_hyphen(lemma)) then return nil end
 
	local suf3 = suffix(lemma, 3);
	local pre3 = prefix(lemma, 3);
 
	if (suf3 == "bel") then
		return pre3 .. "beis"
	end
 
	local suf2 = suffix(lemma, 2);
	local pre2 = prefix(lemma, 2);
	local suf1 = suffix(lemma, 1);
	local pre1 = prefix(lemma, 1);
 
	if (suf1 == "l") then
		if (has_multiple_vowels(lemma) and not is_accented(pre2)) then
			if (suf2 == "il") then
				return pre2 .. "is"
			else
				return pre1 .. "is"
			end
		else
			return lemma .. "es"
		end
	end
 
	if (suf1 == "z") then return pre1 .. "ces" end
 
	if (suf1 == "r") then return lemma .. "es" end
 
	if (suf1 == "x") then return lemma end
 
	if (is_vowel(suf1) or suf1 == "n") then return lemma .. "s" end
 
	if (suf1 == "s") then
		local penult = mw.ustring.sub(suf2, 1, 1)
		if (not is_vowel(penult)) then return lemma end
 
		local antepenult = mw.ustring.sub(suf3, 1, 1)
		if (is_vowel(antepenult)) then return lemma .. "es" end
 
 
		if (is_accented(penult)) then
			return pre2 .. remove_accent[penult] .. "ses"
		else
			return lemma
		end
	end
 
	return nil
end
 
 
function suffix(word, length)
	return mw.ustring.sub(word, mw.ustring.len(word) - length + 1)
end
 
 
function prefix(word, suf_length)
	return mw.ustring.sub(word, 1, mw.ustring.len(word) - suf_length)
end
 
-- returns whether it has ´ or ^
function is_accented(word)
	return word_has_letter(word, accented_letters)
end
 
function is_vowel(letter)
	return word_has_letter(letter, vowels)
end
 
function has_space_or_hyphen(word)
	return mw.ustring.find(word, " ") or mw.ustring.find(word, "-")
end
 
function word_has_letter(word, array)
	for c = 1, table.getn(array) do
		if (mw.ustring.find(word, array[c])) then
			return true
		end
	end
	return false
end
 
function has_multiple_vowels(word)
	local vowels = 0;
	for c = 1, mw.ustring.len(word) do
		if (is_vowel(mw.ustring.sub(word, c, c))) then
			vowels = vowels + 1
			if (vowels >= 2) then return true end
		end
	end
	return false
end
 
return export

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.