Module:Gl-plural
Appearance
-- 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