Wiktionary
omwiktionary
https://om.wiktionary.org/wiki/Fuula_Dura
MediaWiki 1.47.0-wmf.9
case-sensitive
Media
Special
Talk
User
User talk
Wiktionary
Wiktionary talk
File
File talk
MediaWiki
MediaWiki talk
Template
Template talk
Help
Help talk
Category
Category talk
TimedText
TimedText talk
Module
Module talk
Event
Event talk
1
0
9918
81970
37582
2026-07-02T05:11:07Z
EyobAbebe7
3540
/* Hiika */
81970
wikitext
text/x-wiki
{{k}} [[0]], [[2]] {{-mul-}} {{Xinj}}
* 1
==Hiika==
# [[{{#invoke:Numbers|main|1}}]]
h3zmmvmbq60s9dv0wcsi8nd12krhamu
☉
0
24657
81980
39880
2026-07-02T10:04:10Z
EyobAbebe7
3540
/* Mallattoo */
81980
wikitext
text/x-wiki
{{-mul-}}
{{Xinj}}
[[File:Sun symbol (fixed width).svg|80px|right|frameless]]
====Mallattoo====
# (urjii qorachuu fi lakkaa'uu) mallattoo [[aduu|Aduu]]
# (alkeemii) sibiilli pilaaneetii [[warqee]]
{{Dha}}
:[1]: [[L☉|''L''<sub>☉</sub>]], [[M☉|''M''<sub>☉</sub>]], [[R☉|''R''<sub>☉</sub>]]
{{Sadh}}
{{pilaaneetii}}
5qbzib461ziuoxt333xcv7w0z07sb1j
deemicha
0
28618
81968
42858
2026-07-02T04:14:51Z
EyobAbebe7
3540
/* Cibra */
81968
wikitext
text/x-wiki
==Oromoo==
===Afaaneffannoo===
{{syllables}}
**{{Om-audio}}
===Cibra===
{{maq}}
# "[[deemsa]]" ilaalaa.
===Latii Jechootaa===
{{Om-cib1}}
{{dag}}
4gk3shg9ht2b4alzxzuutn2k8ryhx2r
deemuu
0
41219
81967
81942
2026-07-02T04:13:24Z
EyobAbebe7
3540
/* Latii Gochimaa */
81967
wikitext
text/x-wiki
==Oromoo==
===Afaaneffannoo===
{{syllables}}
**{{Om-audio}}
===Gochima===
{{Om-verb}}
# [[karaa]] irra miilla dabaree wal jala qaxxaamursuudhaan yookiin waan akka fardaa irra taa'uudhaan yookiin waan akka konkolaataa, roophilaa, baabura lafaa keessa taa'uudhaan, bakka turanii ka'anii bakka biraa gawuu.
:{{fkn}} ° (Teepha qawwee qabanii, deeman karaa qabanii, taa'an bultii qabanii, waalama maaf dhabanii).
===Sadhatawaa===
{{Om-adj-v|deemuu}}
===Latii Gochimaa===
{{Om-conjug}}
{{dag}}
td90tzez5pnwpx4ktvj0096qt4vcztk
ga'uu
0
42128
81957
56384
2026-07-01T20:35:40Z
EyobAbebe7
3540
/* Gochima */
81957
wikitext
text/x-wiki
==Oromoo==
===Afaaneffannoo===
{{syllables}}
**{{Om-audio}}
===Gochima===
{{Om-verb}}
# bakkee dhaquu yaadan dhaqqabuu yookiin achitti argamuu.
:{{fkn}} ° (ganamaan kaanaan daftee achi ga'uu dandeessa).
# yaanni namaa guutuu, waan yaadan gochuu danda'uu.
:{{fkn}} ° ("Ergan dlhaladhee hinteenye, bakka garaa koo hingeenye").
===Latii Gichimaa===
{{Om-conjug|da'uu}}
{{dag}}
r0a3bwykxwekfw3ot678iwekmijmmgz
81959
81957
2026-07-01T20:46:31Z
EyobAbebe7
3540
/* Gochima */
81959
wikitext
text/x-wiki
==Oromoo==
===Afaaneffannoo===
{{syllables}}
**{{Om-audio}}
===Gochima===
{{Om-verb}}
# bakkee dhaquu yaadan dhaqqabuu yookiin achitti argamuu.
:{{fkn}} ° (ganamaan kaanaan daftee achi ga'uu dandeessa).
# yaanni namaa guutuu, waan yaadan gochuu danda'uu.
:{{fkn}} ° ("Ergan dlhaladhee hinteenye, bakka garaa koo hin geenye").
===Latii Gichimaa===
{{Om-conjug|da'uu}}
{{dag}}
ca64d4ytf07o5yi8tvwh04yvejfssv2
81961
81959
2026-07-01T20:59:54Z
EyobAbebe7
3540
/* Latii Gichimaa */
81961
wikitext
text/x-wiki
==Oromoo==
===Afaaneffannoo===
{{syllables}}
**{{Om-audio}}
===Gochima===
{{Om-verb}}
# bakkee dhaquu yaadan dhaqqabuu yookiin achitti argamuu.
:{{fkn}} ° (ganamaan kaanaan daftee achi ga'uu dandeessa).
# yaanni namaa guutuu, waan yaadan gochuu danda'uu.
:{{fkn}} ° ("Ergan dlhaladhee hinteenye, bakka garaa koo hin geenye").
===Latii Gichimaa===
{{Om-conjug}}
{{dag}}
7kh6l9jn77ui9s6uwt494dr9mlz6pbn
81965
81961
2026-07-02T04:06:45Z
EyobAbebe7
3540
/* Gochima */
81965
wikitext
text/x-wiki
==Oromoo==
===Afaaneffannoo===
{{syllables}}
**{{Om-audio}}
===Gochima===
{{Om-verb}}
# bakkee dhaquu yaadan [[dhaqqabuu]] yookiin achitti argamuu.
:{{fkn}} ° (ganamaan kaanaan daftee achi ga'uu dandeessa).
# yaanni namaa guutuu, waan yaadan gochuu danda'uu.
:{{fkn}} ° ("Ergan dlhaladhee hinteenye, bakka garaa koo hin geenye").
===Latii Gichimaa===
{{Om-conjug}}
{{dag}}
kqubn1fd5hamqkfca9a40eygssi7nvo
81966
81965
2026-07-02T04:10:44Z
EyobAbebe7
3540
/* Gochima */
81966
wikitext
text/x-wiki
==Oromoo==
===Afaaneffannoo===
{{syllables}}
**{{Om-audio}}
===Gochima===
{{Om-verb}}
# bakkee dhaquu yaadan [[dhaqqabuu]] yookiin achitti argamuu. {{fkn}} ° (ganamaan kaanaan daftee achi ga'uu dandeessa).
# yaanni namaa guutuu, waan yaadan gochuu danda'uu.
:{{fkn}} ° ("Ergan dlhaladhee hinteenye, bakka garaa koo hin geenye").
===Latii Gichimaa===
{{Om-conjug}}
{{dag}}
o2l91q0nu2ruu5wir7avnkgvlqislwj
81977
81966
2026-07-02T09:32:58Z
EyobAbebe7
3540
/* Latii Gochimaa */
81977
wikitext
text/x-wiki
==Oromoo==
===Afaaneffannoo===
{{syllables}}
**{{Om-audio}}
===Gochima===
{{Om-verb}}
# bakkee dhaquu yaadan [[dhaqqabuu]] yookiin achitti argamuu. {{fkn}} ° (ganamaan kaanaan daftee achi ga'uu dandeessa).
# yaanni namaa guutuu, waan yaadan gochuu danda'uu.
:{{fkn}} ° ("Ergan dlhaladhee hinteenye, bakka garaa koo hin geenye").
===Latii Gochimaa===
{{Om-conjug}}
{{dag}}
eh0r97trt4ajr9pffa4l2quzz0l99td
Template:fum
10
46129
81978
60392
2026-07-02T09:38:00Z
EyobAbebe7
3540
/* */
81978
wikitext
text/x-wiki
''[[fufata|Fufata]] [[maayyii]] jechootaa.''
480qldey70u0rshlmovb4o4mxaoo7r8
Module:Om-conjug
828
62063
81949
81946
2026-07-01T17:47:08Z
EyobAbebe7
3540
81949
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. FUNCTIONS GARGAARTUU (Helper Functions)
-- ===================================================
local function endsWith(str, suffix)
return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix
end
local function slice(str, cut)
if cut == 0 then return str end
return mw.ustring.sub(str, 1, -(cut + 1))
end
-- ===================================================
-- 2. SEERA YEROO DARBEE (Simple Past Tense Logic)
-- ===================================================
local function get_past_forms(root)
-- Kutaa 1ffaa: Gochimoota seera guutuu jijjiiran (Full form overrides)
local full_rules = {
{"ooch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"och", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"ach", 2, "dhe", "tte", "te", "tte", "nne", "ttan", "tan"},
{"eech", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"ech", 2, "dhe", "tte", "dhe", "tte", "nne", "ttan", "dhan"},
{"kuch", 2, "te", "tte", "te", "tte", "nne", "ttan", "tan"},
{"uch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"odh", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"uudh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"udh", 2, "dhe", "ute", "dhe", "ute", "une", "utan", "dhan"},
{"iidh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"idh", 2, "dhe", "ite", "dhe", "ite", "ine", "itan", "dhan"},
{"aadh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"adh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"eedh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"edh", 2, "dhe", "ete", "dhe", "ete", "ene", "etan", "dhan"},
{"sh", 0, "e", "te", "e", "te", "ne", "tan", "an"},
{"ny", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"uuph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"iph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"yy", 0, "e", "ite", "e", "ite", "ine", "itan", "an"}
}
for _, rule in ipairs(full_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
return {
Ani = base .. rule[3], Ati = base .. rule[4], Inni = base .. rule[5],
Isheen = base .. rule[6], Nuti = base .. rule[7], Isin = base .. rule[8], Isaan = base .. rule[9]
}
end
end
-- Kutaa 2ffaa: Gochimoota walakkaan jijjiiraman (Partial suffix matches)
local partial_rules = {
{"aaw", 3, "oofne", "oofte", "ooftan"}, {"caw", 2, "aane", "aate", "aatan"},
{"aw", 2, "oofne", "oofte", "ooftan"}, {"aay", 3, "oofne", "oofte", "ooftan"},
{"aah", 3, "oofne", "oofte", "ooftan"}, {"ooh", 3, "oone", "oote", "ootan"},
{"ah", 1, "ane", "ate", "atan"}, {"udha'", 1, "ane", "ate", "atan"},
{"aacha'", 2, "ofne", "ofte", "oftan"}, {"ooba'", 2, "ofne", "ofte", "oftan"},
{"dha'", 2, "oofne", "oofte", "ooftan"}, {"msha'", 2, "oofne", "oofte", "ooftan"},
{"iishaa'", 3, "ofne", "ofte", "oftan"}, {"ishaa'", 3, "oofne", "oofte", "ooftan"},
{"uushaa'", 3, "ofne", "ofte", "oftan"}, {"ushaa'", 3, "oofne", "oofte", "ooftan"},
{"uu'", 2, "une", "ute", "utan"}, {"u'", 1, "une", "ute", "utan"},
{"aari'", 1, "ne", "te", "tan"}, {"ooji'", 1, "ne", "te", "tan"},
{"i'", 1, "ine", "ite", "itan"}, {"aafa'", 2, "ofne", "ofte", "oftan"},
{"uufa'", 2, "ofne", "ofte", "oftan"}, {"uusa'", 2, "ofne", "ofte", "oftan"},
{"saasa'", 1, "ane", "ate", "atan"}, {"aassa'", 2, "ofne", "ofte", "oftan"},
{"eessa'", 2, "ofne", "ofte", "oftan"}, {"aasa'", 2, "ofne", "ofte", "oftan"},
{"akaa'", 3, "oofne", "oofte", "ooftan"}, {"naa'", 3, "oofne", "oofte", "ooftan"},
{"ana'", 3, "nofne", "nofte", "noftan"}, {"nna'", 3, "nofne", "nofte", "noftan"},
{"aara'", 2, "ofne", "ofte", "oftan"}, {"bja'", 2, "oofne", "oofte", "ooftan"},
{"jja'", 2, "ofne", "ofte", "oftan"}, {"oonja'", 2, "ofne", "ofte", "oftan"},
{"aaja'", 2, "ofne", "ofte", "oftan"}, {"ooja'", 2, "ofne", "ofte", "oftan"},
{"eeja'", 2, "ofne", "ofte", "oftan"}, {"ucca'", 2, "ofne", "ofte", "oftan"},
{"aanca'", 2, "ofne", "ofte", "oftan"}, {"aanxa'", 2, "ofne", "ofte", "oftan"},
{"aaxa'", 2, "ofne", "ofte", "oftan"}, {"eexa'", 2, "ofne", "ofte", "oftan"},
{"iixa'", 2, "ofne", "ofte", "oftan"}, {"ooxa'", 2, "ofne", "ofte", "oftan"},
{"uuxa'", 2, "ofne", "ofte", "oftan"}, {"uura'", 2, "ofne", "ofte", "oftan"},
{"eela'", 2, "ofne", "ofte", "oftan"}, {"kaakka'", 1, "ane", "ate", "atan"},
{"uuka'", 2, "ofne", "ofte", "oftan"}, {"okka'", 1, "ane", "ate", "atan"},
{"kkaa'", 3, "oofne", "oofte", "ooftan"}, {"ukaa'", 3, "oofne", "oofte", "ooftan"},
{"kaa'", 3, "eenye", "eesse", "eessan"}, {"ottaa'", 3, "oofne", "oofte", "ooftan"},
{"aadda'", 2, "ofne", "ofte", "oftan"}, {"dda'", 1, "ane", "ate", "atan"},
{"ooda'", 2, "ofne", "ofte", "oftan"}, {"eda'", 1, "ane", "ate", "atan"},
{"ida'", 1, "ane", "ate", "atan"}, {"da'", 2, "eenye", "eesse", "eessan"},
{"mtaa'", 3, "oofne", "oofte", "ooftan"}, {"taa'", 3, "eenye", "eesse", "eessan"},
{"nga'", 2, "ofne", "ofte", "oftan"}, {"maaga'", 2, "ofne", "ofte", "oftan"},
{"oga'", 2, "ofne", "ofte", "oftan"}, {"aanga'", 2, "ofne", "ofte", "oftan"},
{"anga'", 1, "ane", "ate", "atan"}, {"rga'", 1, "ane", "ate", "atan"},
{"alga'", 2, "eenye", "eesse", "eessan"}, {"lga'", 1, "ane", "ate", "atan"},
{"enga'", 1, "ane", "ate", "atan"}, {"dhaga'", 2, "eenye", "eesse", "eessan"},
{"eega'", 2, "ane", "ate", "atan"}, {"aga'", 1, "ane", "ate", "atan"},
{"gga'", 1, "ane", "ate", "atan"}, {"ga'", 2, "eenye", "eesse", "eessan"},
{"omma'", 2, "ane", "ate", "atan"}, {"mma'", 2, "ofne", "ofte", "oftan"},
{"uma'", 2, "oofne", "oofte", "ooftan"}, {"aarra'", 2, "ofne", "ofte", "oftan"},
{"aata'", 2, "ofne", "ofte", "oftan"}, {"iita'", 2, "ofne", "ofte", "oftan"},
{"uqqa'", 1, "ane", "ate", "atan"}, {"qa'", 2, "ofne", "ofte", "oftan"},
{"yaa'", 2, "ane", "ate", "atan"}, {"ooyya'", 2, "oofne", "oofte", "ooftan"},
{"aa'", 3, "oofne", "oofte", "ooftan"}, {"a'", 1, "ane", "ate", "atan"},
{"boo'", 1, "nye", "sse", "ssan"}, {"oo'", 1, "ne", "te", "tan"},
{"o'", 1, "one", "ote", "otan"}
}
local nuti, ati, ishee, isin
local matched = false
-- Dubbifamaa dachaa (Double Consonants Pattern ccPattern)
if mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
nuti = root .. "ine"; ati = root .. "ite"; ishee = root .. "ite"; isin = root .. "itan"
matched = true
end
if not matched then
for _, rule in ipairs(partial_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
nuti = base .. rule[3]; ati = base .. rule[4]; ishee = base .. rule[4]; isin = base .. rule[5]
matched = true
break
end
end
end
-- Kutaa 3ffaa: Qubeewwan Dubbifamaa Qeenxee (Single Consonants Fallbacks)
if not matched then
if endsWith(root, "d") then
nuti = slice(root, 1) .. "nne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "l") then
nuti = root .. "le"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "b") then
nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "c") then
nuti = root .. "ne"; ati = root .. "ce"; ishee = root .. "ce"; isin = root .. "can"; matched = true
elseif endsWith(root, "g") then
nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "j") then
nuti = root .. "ne"; ati = root .. "je"; ishee = root .. "je"; isin = root .. "jan"; matched = true
elseif endsWith(root, "q") then
nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
elseif endsWith(root, "r") then
nuti = root .. "re"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "x") then
nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
end
end
-- Kutaa 4ffaa: Fallback Idilee (Default)
if not matched then
nuti = root .. "ne"
ati = root .. "te"
ishee = root .. "te"
isin = root .. "tan"
end
return {
Ani = root .. "e", Ati = ati, Inni = root .. "e",
Isheen = ishee, Nuti = nuti, Isin = isin, Isaan = root .. "an"
}
end
-- ===================================================
-- 3. SEERA AJAJAA (Imperative Form Logic)
-- ===================================================
local function get_imperative_forms(root)
if mw.ustring.match(root, "[aeiou]ch$") then
local base = mw.ustring.sub(root, 1, -3)
local stem = mw.ustring.sub(root, 1, -4)
local vowel = mw.ustring.sub(root, -3, -3)
return {
Ati_aff = base .. "dhu", Isin_aff = base .. "dhaa",
Ati_neg = "hin " .. stem .. vowel .. "tin", Isin_neg = "hin " .. stem .. vowel .. "tinaa"
}
end
return {
Ati_aff = root .. "i", Isin_aff = root .. "aa",
Ati_neg = "hin " .. root .. "in", Isin_neg = "hin " .. root .. "inaa"
}
end
-- ===================================================
-- 4. KUTAA MOOJULII WAAMAMU (Main Generate Function)
-- ===================================================
function p.generate(frame)
local verb = frame.args[1] or frame.args.word or mw.title.getCurrentTitle().text
verb = mw.ustring.lower(mw.text.trim(verb))
-- "-uu" irraa kuta (Remove infinitive suffix)
local root = verb
if endsWith(verb, "uu") then
root = mw.ustring.sub(verb, 1, -3)
end
-- 1. Yeroo Darbee Eeyyamaa (Simple Past Affirmative)
local past_aff = get_past_forms(root)
-- 2. Yeroo Darbee Diigamaa (Negative past hundi isaa hin + nuti result ta'a)
local neg_base = "hin " .. past_aff.Nuti
local past_neg = {
Ani = neg_base, Ati = neg_base, Inni = neg_base,
Isheen = neg_base, Nuti = neg_base, Isin = neg_base, Isaan = neg_base
}
-- 3. Bifa Ajajaa (Imperative)
local cmd = get_imperative_forms(root)
-- Gabatee Uumuu (Building the Wikitext Table)
local html = "{| class=\"wikitable\" style=\"text-align:center;\"\n"
html = html .. "|+ '''Bifa Diigamaa Gochima: " .. verb .. "'''\n"
html = html .. "! Bumbaa Maqaa !! Yeroo Darbee (Past) !! Yeroo Darbee Diigamaa (Neg. Past)\n"
local pronouns = {"Ani", "Ati", "Inni", "Isheen", "Nuti", "Isin", "Isaan"}
for _, p_name in ipairs(pronouns) do
html = html .. "|-\n! " .. p_name .. "\n| " .. past_aff[p_name] .. " || " .. past_neg[p_name] .. "\n"
end
html = html .. "|-\n! colspan=\"3\" style=\"background:#e0e0e0;\" | Bifa Ajajaa (Imperative)\n"
html = html .. "|-\n! Ati\n| " .. cmd.Ati_aff .. " || " .. cmd.Ati_neg .. "\n"
html = html .. "|-\n! Isin\n| " .. cmd.Isin_aff .. " || " .. cmd.Isin_neg .. "\n"
html = html .. "|}"
return html
end
return p
p6eg1hw8wjasg9xtojy3ckwaxi1kv6f
81950
81949
2026-07-01T18:17:56Z
EyobAbebe7
3540
81950
Scribunto
text/plain
local export = {}
-- ===================================================
-- 1. UTILITY FUNCTIONS
-- ===================================================
local function get_verb_root(verb)
local w = mw.ustring.lower(mw.text.trim(verb))
if mw.ustring.match(w, "uu$") then
return mw.ustring.sub(w, 1, -3)
end
return w
end
-- ===================================================
-- 2. AFFIRMATIVE SIMPLE PAST (Yeroo Darbee Eeyyamaa)
-- ===================================================
local function conjugate_past(verb)
local root = get_verb_root(verb)
local ani, ati, inni, isheen, nuti, isin, isaan
if mw.ustring.match(root, "ooch$") then
return { Ani=root.."e", Ati=root.."ite", Inni=root.."e", Isheen=root.."ite", Nuti=root.."ine", Isin=root.."itan", Isaan=root.."an" }
elseif mw.ustring.match(root, "och$") then
local base = mw.ustring.sub(root, 1, -3)
return { Ani=base.."dhe", Ati=base.."ote", Inni=base.."dhe", Isheen=base.."ote", Nuti=base.."one", Isin=base.."otan", Isaan=base.."dhan" }
elseif mw.ustring.match(root, "ach$") then
local base = mw.ustring.sub(root, 1, -3)
return { Ani=base.."dhe", Ati=base.."tte", Inni=base.."te", Isheen=base.."tte", Nuti=base.."nne", Isin=base.."ttan", Isaan=base.."tan" }
elseif mw.ustring.match(root, "edh$") then
local base = mw.ustring.sub(root, 1, -3)
return { Ani=base.."dhe", Ati=base.."ete", Inni=base.."dhe", Isheen=base.."ete", Nuti=base.."ene", Isin=base.."etan", Isaan=base.."dhan" }
elseif mw.ustring.match(root, "sh$") then
return { Ani=root.."e", Ati=root.."te", Inni=root.."e", Isheen=root.."te", Nuti=root.."ne", Isin=root.."tan", Isaan=root.."an" }
end
if mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
nuti = root .. "ine"; ati = root .. "ite"; isheen = root .. "ite"; isin = root .. "itan"
elseif mw.ustring.match(root, "aaw$") then
local base = mw.ustring.sub(root, 1, -4)
nuti = base .. "oofne"; ati = base .. "oofte"; isheen = base .. "oofte"; isin = base .. "ooftan"
elseif mw.ustring.match(root, "l$") then
nuti = root .. "le"; ati = root .. "te"; isheen = root .. "te"; isin = root .. "tan"
elseif mw.ustring.match(root, "d$") then
local base = mw.ustring.sub(root, 1, -2)
nuti = base .. "nne"; ati = root .. "de"; isheen = root .. "de"; isin = root .. "dan"
elseif mw.ustring.match(root, "r$") then
nuti = root .. "re"; ati = root .. "te"; isheen = root .. "te"; isin = root .. "tan"
else
nuti = root .. "ne"; ati = root .. "te"; isheen = root .. "te"; isin = root .. "tan"
end
return { Ani=root.."e", Ati=ati, Inni=root.."e", Isheen=isheen, Nuti=nuti, Isin=isin, Isaan=root.."an" }
end
-- ===================================================
-- 3. NEGATIVE PAST (Yeroo Darbee Diigamaa)
-- ===================================================
local function conjugate_negative_past_perfect(verb)
local past_forms = conjugate_past(verb)
local neg_form = "hin " .. past_forms.Nuti
return { Ani=neg_form, Ati=neg_form, Inni=neg_form, Isheen=neg_form, Nuti=neg_form, Isin=neg_form, Isaan=neg_form }
end
-- ===================================================
-- 4. PRESENT CONTINUOUS (Yeroo Ammaa Itti Fufaa)
-- ===================================================
local function conjugate_present_continuous(verb)
local root = get_verb_root(verb)
return {
Ani = root .. "aan jira", Ati = root .. "aa jirta", Inni = root .. "aa jira",
Isheen = root .. "aa jirti", Nuti = root .. "aa jirra", Isin = root .. "aa jirtu", Isaan = root .. "aa jiru"
}
end
local function conjugate_negative_present_continuous(verb)
local root = get_verb_root(verb)
return {
Ani = root .. "aa hin jiru", Ati = root .. "aa hin jirtu", Inni = root .. "aa hin jiru",
Isheen = root .. "aa hin jirtu", Nuti = root .. "aa hin jirru", Isin = root .. "aa hin jirtan", Isaan = root .. "aa hin jiran"
}
end
-- ===================================================
-- 5. SIMPLE FUTURE (Yeroo Fuulduraa)
-- ===================================================
local function conjugate_future(verb)
local root = get_verb_root(verb)
return {
Ani = "nan " .. root .. "a", Ati = "ni " .. root .. "ta", Inni = "ni " .. root .. "a",
Isheen = "ni " .. root .. "ti", Nuti = "ni " .. root .. "na", Isin = "ni " .. root .. "tu", Isaan = "ni " .. root .. "u"
}
end
local function conjugate_negative_future(verb)
local root = get_verb_root(verb)
return {
Ani = "hin " .. root .. "u", Ati = "hin " .. root .. "tu", Inni = "hin " .. root .. "u",
Isheen = "hin " .. root .. "tu", Nuti = "hin " .. root .. "nu", Isin = "hin " .. root .. "tan", Isaan = "hin " .. root .. "an"
}
end
-- ===================================================
-- 6. PRESENT PERFECT (Yeroo Raawwatamaa Ammaa)
-- ===================================================
local function conjugate_perfect(verb)
local root = get_verb_root(verb)
if mw.ustring.match(root, "ooch$") or mw.ustring.match(root, "eech$") or mw.ustring.match(root, "uch$") or
mw.ustring.match(root, "adh$") or mw.ustring.match(root, "eedh$") or mw.ustring.match(root, "sh$") or
mw.ustring.match(root, "ny$") or mw.ustring.match(root, "yy$") then
local base = root
return { Ani=base.."eera", Ati=base.."iteetta", Inni=base.."eera", Isheen=base.."iteetti", Nuti=base.."ineera", Isin=base.."itaniittu", Isaan=base.."aniiru" }
elseif mw.ustring.match(root, "och$") or mw.ustring.match(root, "odh$") then
local base = mw.ustring.sub(root, 1, -3)
return { Ani=base.."dheera", Ati=base.."oteetta", Inni=base.."dheera", Isheen=base.."oteetti", Nuti=base.."oneerra", Isin=base.."otaniittu", Isaan=base.."dhaniiru" }
end
local past_forms = conjugate_past(verb)
return {
Ani = mw.ustring.sub(past_forms.Ani, 1, -2) .. "eera",
Ati = mw.ustring.sub(past_forms.Ati, 1, -2) .. "eetta",
Inni = mw.ustring.sub(past_forms.Inni, 1, -2) .. "eera",
Isheen = mw.ustring.sub(past_forms.Isheen, 1, -2) .. "eetti",
Nuti = mw.ustring.sub(past_forms.Nuti, 1, -2) .. "eerra",
Isin = past_forms.Isin .. "iittu",
Isaan = past_forms.Isaan .. "iiru"
}
end
-- ===================================================
-- 7. COMMAND FORM (Bifa Ajajaa)
-- ===================================================
local function conjugate_command(verb)
local root = get_verb_root(verb)
return { Ati_aff = root .. "i", Isin_aff = root .. "aa", Ati_neg = "hin " .. root .. "in", Isin_neg = "hin " .. root .. "inaa" }
end
-- ===================================================
-- 8. INTENTIONAL FUTURE ASPECT (Kutaa Karoora Fuulduraa)
-- ===================================================
local function conjugate_aspect(verb)
local root = get_verb_root(verb)
local aff = root .. "uufi"
return { Ani=aff, Ati=aff, Inni=aff, Isheen=aff, Nuti=aff, Isin=aff, Isaan=aff }
end
local function conjugate_negative_aspect(verb)
local root = get_verb_root(verb)
local nf = root .. "uuf miti"
return { Ani=nf, Ati=nf, Inni=nf, Isheen=nf, Nuti=nf, Isin=nf, Isaan=nf }
end
-- ===================================================
-- HTML WIKITABLE GENERATOR
-- ===================================================
function export.generate(frame)
local args = frame.args
if not args[1] and not args.word then args = frame:getParent().args end
local word = args[1] or args.word
if not word or word == "" then word = mw.title.getCurrentTitle().text end
local past_aff = conjugate_past(word)
local neg_past_perf = conjugate_negative_past_perfect(word)
local pres_cont = conjugate_present_continuous(word)
local pres_cont_neg = conjugate_negative_present_continuous(word)
local future_aff = conjugate_future(word)
local future_neg = conjugate_negative_future(word)
local perfect = conjugate_perfect(word)
local aspect_aff = conjugate_aspect(word)
local aspect_neg = conjugate_negative_aspect(word)
local cmd = conjugate_command(word)
local container = mw.html.create('div'):attr('style', 'display: flex; flex-direction: column; gap: 20px;')
local order = { "Ani", "Ati", "Inni", "Isheen", "Nuti", "Isin", "Isaan" }
-- TABLE 1: Simple Past
local table1 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table1:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #d1e7dd; color: #0f5132; text-align: center; font-size: 1.1em;'):wikitext('🟩 Simple Past Tense - [[' .. word .. ']]'):done():done()
for _, pron in ipairs(order) do
table1:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext(pron):done()
:tag('td'):wikitext('[[' .. past_aff[pron] .. ']]'):done()
:tag('td'):wikitext('[[' .. neg_past_perf[pron] .. ']]'):done():done()
end
container:node(table1)
-- TABLE 2: Simple Future / Present
local table2 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table2:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #cff4fc; color: #055160; text-align: center; font-size: 1.1em;'):wikitext('🟦 Simple Future / Present Tense - [[' .. word .. ']]'):done():done()
for _, pron in ipairs(order) do
table2:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext(pron):done()
:tag('td'):wikitext('[[' .. future_aff[pron] .. ']]'):done()
:tag('td'):wikitext('[[' .. future_neg[pron] .. ']]'):done():done()
end
container:node(table2)
-- TABLE 3: Present Perfect
local table3 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table3:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #e2e3e5; color: #41464b; text-align: center; font-size: 1.1em;'):wikitext('⬜ Present Perfect Tense - [[' .. word .. ']]'):done():done()
for _, pron in ipairs(order) do
table3:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext(pron):done()
:tag('td'):wikitext('[[' .. perfect[pron] .. ']]'):done()
:tag('td'):wikitext('[[' .. neg_past_perf[pron] .. ']]'):done():done()
end
container:node(table3)
-- TABLE 4: Present Continuous
local table4 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table4:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #cfe2ff; color: #084298; text-align: center; font-size: 1.1em;'):wikitext('🟪 Present Continuous Tense - [[' .. word .. ']]'):done():done()
for _, pron in ipairs(order) do
table4:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext(pron):done()
:tag('td'):wikitext('[[' .. pres_cont[pron] .. ']]'):done()
:tag('td'):wikitext('[[' .. pres_cont_neg[pron] .. ']]'):done():done()
end
container:node(table4)
-- TABLE 5: Intentional Future Aspect
local table5 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table5:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #f8d7da; color: #842029; text-align: center; font-size: 1.1em;'):wikitext('🟥 Intentional Future Aspect - [[' .. word .. ']]'):done():done()
for _, pron in ipairs(order) do
table5:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext(pron):done()
:tag('td'):wikitext('[[' .. aspect_aff[pron] .. ']]'):done()
:tag('td'):wikitext('[[' .. aspect_neg[pron] .. ']]'):done():done()
end
container:node(table5)
-- TABLE 6: Imperative
local table6 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table6:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #fff3cd; color: #664d03; text-align: center; font-size: 1.1em;'):wikitext('🟨 Imperative (Command Form) - [[' .. word .. ']]'):done():done()
table6:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext('Ati'):done():tag('td'):wikitext('[[' .. cmd.Ati_aff .. ']]'):done():tag('td'):wikitext('[[' .. cmd.Ati_neg .. ']]'):done():done()
table6:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext('Isin'):done():tag('td'):wikitext('[[' .. cmd.Isin_aff .. ']]'):done():tag('td'):wikitext('[[' .. cmd.Isin_neg .. ']]'):done():done()
container:node(table6)
return tostring(container)
end
return export
lj4vx0gouznxhoxyf5n48u2gxszjcye
81951
81950
2026-07-01T18:30:19Z
EyobAbebe7
3540
81951
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. UTILITY FUNCTIONS
-- ===================================================
local function get_verb_root(verb)
local w = mw.ustring.lower(mw.text.trim(verb))
if mw.ustring.match(w, "uu$") then
return mw.ustring.sub(w, 1, -3)
end
return w
end
-- ===================================================
-- 2. AFFIRMATIVE SIMPLE PAST (Yeroo Darbee Eeyyamaa)
-- ===================================================
local function conjugate_past(verb)
local root = get_verb_root(verb)
local ani, ati, inni, isheen, nuti, isin, isaan
-- A. SEERA HUDHAA (') FI KAN BIROO (Glottal Stops & Irregular)
if mw.ustring.match(root, "kaa'$") or mw.ustring.match(root, "taa'$") then
local base = mw.ustring.sub(root, 1, -4)
return { Ani=root.."e", Ati=base.."eesse", Inni=root.."e", Isheen=base.."eesse", Nuti=base.."eenye", Isin=base.."eessan", Isaan=root.."an" }
elseif mw.ustring.match(root, "dhaga'$") then
return { Ani="dhaga'e", Ati="dhageesse", Inni="dhaga'e", Isheen="dhageesse", Nuti="dhageenye", Isin="dhageessan", Isaan="dhaga'an" }
elseif mw.ustring.match(root, "'$") then
local base = mw.ustring.sub(root, 1, -2)
if mw.ustring.match(root, "a'$") then
return { Ani=root.."e", Ati=base.."ate", Inni=root.."e", Isheen=base.."ate", Nuti=base.."ane", Isin=base.."atan", Isaan=root.."an" }
else
return { Ani=root.."e", Ati=base.."te", Inni=root.."e", Isheen=base.."te", Nuti=base.."ne", Isin=base.."tan", Isaan=root.."an" }
end
end
-- B. SEERA CH, DH, SH FI KAN BIROO
if mw.ustring.match(root, "ooch$") then
return { Ani=root.."e", Ati=root.."ite", Inni=root.."e", Isheen=root.."ite", Nuti=root.."ine", Isin=root.."itan", Isaan=root.."an" }
elseif mw.ustring.match(root, "och$") then
local base = mw.ustring.sub(root, 1, -3)
return { Ani=base.."dhe", Ati=base.."ote", Inni=base.."dhe", Isheen=base.."ote", Nuti=base.."one", Isin=base.."otan", Isaan=base.."dhan" }
elseif mw.ustring.match(root, "ach$") then
local base = mw.ustring.sub(root, 1, -3)
return { Ani=base.."dhe", Ati=base.."tte", Inni=base.."te", Isheen=base.."tte", Nuti=base.."nne", Isin=base.."ttan", Isaan=base.."tan" }
elseif mw.ustring.match(root, "edh$") then
local base = mw.ustring.sub(root, 1, -3)
return { Ani=base.."dhe", Ati=base.."ete", Inni=base.."dhe", Isheen=base.."ete", Nuti=base.."ene", Isin=base.."etan", Isaan=base.."dhan" }
elseif mw.ustring.match(root, "sh$") then
return { Ani=root.."e", Ati=root.."te", Inni=root.."e", Isheen=root.."te", Nuti=root.."ne", Isin=root.."tan", Isaan=root.."an" }
end
-- C. QUBEE DACHAA FI SEERA IDILEE (Double Consonants & Regular)
if mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
nuti = root .. "ine"; ati = root .. "ite"; isheen = root .. "ite"; isin = root .. "itan"
elseif mw.ustring.match(root, "aaw$") then
local base = mw.ustring.sub(root, 1, -4)
nuti = base .. "oofne"; ati = base .. "oofte"; isheen = base .. "oofte"; isin = base .. "ooftan"
elseif mw.ustring.match(root, "l$") then
nuti = root .. "le"; ati = root .. "te"; isheen = root .. "te"; isin = root .. "tan"
elseif mw.ustring.match(root, "d$") then
local base = mw.ustring.sub(root, 1, -2)
nuti = base .. "nne"; ati = root .. "de"; isheen = root .. "de"; isin = root .. "dan"
elseif mw.ustring.match(root, "r$") then
nuti = root .. "re"; ati = root .. "te"; isheen = root .. "te"; isin = root .. "tan"
else
nuti = root .. "ne"; ati = root .. "te"; isheen = root .. "te"; isin = root .. "tan"
end
return { Ani=root.."e", Ati=ati, Inni=root.."e", Isheen=isheen, Nuti=nuti, Isin=isin, Isaan=root.."an" }
end
-- ===================================================
-- 3. NEGATIVE PAST (Yeroo Darbee Diigamaa)
-- ===================================================
local function conjugate_negative_past_perfect(verb)
local past_forms = conjugate_past(verb)
local neg_form = "hin " .. past_forms.Nuti
return { Ani=neg_form, Ati=neg_form, Inni=neg_form, Isheen=neg_form, Nuti=neg_form, Isin=neg_form, Isaan=neg_form }
end
-- ===================================================
-- 4. PRESENT CONTINUOUS (Yeroo Ammaa Itti Fufaa)
-- ===================================================
local function conjugate_present_continuous(verb)
local root = get_verb_root(verb)
return {
Ani = root .. "aan jira", Ati = root .. "aa jirta", Inni = root .. "aa jira",
Isheen = root .. "aa jirti", Nuti = root .. "aa jirra", Isin = root .. "aa jirtu", Isaan = root .. "aa jiru"
}
end
local function conjugate_negative_present_continuous(verb)
local root = get_verb_root(verb)
return {
Ani = root .. "aa hin jiru", Ati = root .. "aa hin jirtu", Inni = root .. "aa hin jiru",
Isheen = root .. "aa hin jirtu", Nuti = root .. "aa hin jirru", Isin = root .. "aa hin jirtan", Isaan = root .. "aa hin jiran"
}
end
-- ===================================================
-- 5. SIMPLE FUTURE (Yeroo Fuulduraa)
-- ===================================================
local function conjugate_future(verb)
local root = get_verb_root(verb)
return {
Ani = "nan " .. root .. "a", Ati = "ni " .. root .. "ta", Inni = "ni " .. root .. "a",
Isheen = "ni " .. root .. "ti", Nuti = "ni " .. root .. "na", Isin = "ni " .. root .. "tu", Isaan = "ni " .. root .. "u"
}
end
local function conjugate_negative_future(verb)
local root = get_verb_root(verb)
return {
Ani = "hin " .. root .. "u", Ati = "hin " .. root .. "tu", Inni = "hin " .. root .. "u",
Isheen = "hin " .. root .. "tu", Nuti = "hin " .. root .. "nu", Isin = "hin " .. root .. "tan", Isaan = "hin " .. root .. "an"
}
end
-- ===================================================
-- 6. PRESENT PERFECT (Yeroo Raawwatamaa Ammaa)
-- ===================================================
local function conjugate_perfect(verb)
local root = get_verb_root(verb)
if mw.ustring.match(root, "ooch$") or mw.ustring.match(root, "eech$") or mw.ustring.match(root, "uch$") or
mw.ustring.match(root, "adh$") or mw.ustring.match(root, "eedh$") or mw.ustring.match(root, "sh$") or
mw.ustring.match(root, "ny$") or mw.ustring.match(root, "yy$") then
local base = root
return { Ani=base.."eera", Ati=base.."iteetta", Inni=base.."eera", Isheen=base.."iteetti", Nuti=base.."ineera", Isin=base.."itaniittu", Isaan=base.."aniiru" }
elseif mw.ustring.match(root, "och$") or mw.ustring.match(root, "odh$") then
local base = mw.ustring.sub(root, 1, -3)
return { Ani=base.."dheera", Ati=base.."oteetta", Inni=base.."dheera", Isheen=base.."oteetti", Nuti=base.."oneerra", Isin=base.."otaniittu", Isaan=base.."dhaniiru" }
end
local past_forms = conjugate_past(verb)
return {
Ani = mw.ustring.sub(past_forms.Ani, 1, -2) .. "eera",
Ati = mw.ustring.sub(past_forms.Ati, 1, -2) .. "eetta",
Inni = mw.ustring.sub(past_forms.Inni, 1, -2) .. "eera",
Isheen = mw.ustring.sub(past_forms.Isheen, 1, -2) .. "eetti",
Nuti = mw.ustring.sub(past_forms.Nuti, 1, -2) .. "eerra",
Isin = past_forms.Isin .. "iittu",
Isaan = past_forms.Isaan .. "iiru"
}
end
-- ===================================================
-- 7. COMMAND FORM (Bifa Ajajaa)
-- ===================================================
local function conjugate_command(verb)
local root = get_verb_root(verb)
return { Ati_aff = root .. "i", Isin_aff = root .. "aa", Ati_neg = "hin " .. root .. "in", Isin_neg = "hin " .. root .. "inaa" }
end
-- ===================================================
-- 8. INTENTIONAL FUTURE ASPECT (Kutaa Karoora Fuulduraa)
-- ===================================================
local function conjugate_aspect(verb)
local root = get_verb_root(verb)
local aff = root .. "uufi"
return { Ani=aff, Ati=aff, Inni=aff, Isheen=aff, Nuti=aff, Isin=aff, Isaan=aff }
end
local function conjugate_negative_aspect(verb)
local root = get_verb_root(verb)
local nf = root .. "uuf miti"
return { Ani=nf, Ati=nf, Inni=nf, Isheen=nf, Nuti=nf, Isin=nf, Isaan=nf }
end
-- ===================================================
-- HTML WIKITABLE GENERATOR
-- ===================================================
function p.generate(frame)
local args = frame.args
if not args[1] and not args.word then args = frame:getParent().args end
local word = args[1] or args.word
if not word or word == "" then word = mw.title.getCurrentTitle().text end
local past_aff = conjugate_past(word)
local neg_past_perf = conjugate_negative_past_perfect(word)
local pres_cont = conjugate_present_continuous(word)
local pres_cont_neg = conjugate_negative_present_continuous(word)
local future_aff = conjugate_future(word)
local future_neg = conjugate_negative_future(word)
local perfect = conjugate_perfect(word)
local aspect_aff = conjugate_aspect(word)
local aspect_neg = conjugate_negative_aspect(word)
local cmd = conjugate_command(word)
local container = mw.html.create('div'):attr('style', 'display: flex; flex-direction: column; gap: 20px;')
local order = { "Ani", "Ati", "Inni", "Isheen", "Nuti", "Isin", "Isaan" }
-- TABLE 1: Simple Past
local table1 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table1:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #d1e7dd; color: #0f5132; text-align: center; font-size: 1.1em;'):wikitext('🟩 Simple Past Tense - [[' .. word .. ']]'):done():done()
for _, pron in ipairs(order) do
table1:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext(pron):done()
:tag('td'):wikitext('[[' .. past_aff[pron] .. ']]'):done()
:tag('td'):wikitext('[[' .. neg_past_perf[pron] .. ']]'):done():done()
end
container:node(table1)
-- TABLE 2: Simple Future / Present
local table2 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table2:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #cff4fc; color: #055160; text-align: center; font-size: 1.1em;'):wikitext('🟦 Simple Future / Present Tense - [[' .. word .. ']]'):done():done()
for _, pron in ipairs(order) do
table2:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext(pron):done()
:tag('td'):wikitext('[[' .. future_aff[pron] .. ']]'):done()
:tag('td'):wikitext('[[' .. future_neg[pron] .. ']]'):done():done()
end
container:node(table2)
-- TABLE 3: Present Perfect
local table3 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table3:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #e2e3e5; color: #41464b; text-align: center; font-size: 1.1em;'):wikitext('⬜ Present Perfect Tense - [[' .. word .. ']]'):done():done()
for _, pron in ipairs(order) do
table3:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext(pron):done()
:tag('td'):wikitext('[[' .. perfect[pron] .. ']]'):done()
:tag('td'):wikitext('[[' .. neg_past_perf[pron] .. ']]'):done():done()
end
container:node(table3)
-- TABLE 4: Present Continuous
local table4 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table4:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #cfe2ff; color: #084298; text-align: center; font-size: 1.1em;'):wikitext('🟪 Present Continuous Tense - [[' .. word .. ']]'):done():done()
for _, pron in ipairs(order) do
table4:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext(pron):done()
:tag('td'):wikitext('[[' .. pres_cont[pron] .. ']]'):done()
:tag('td'):wikitext('[[' .. pres_cont_neg[pron] .. ']]'):done():done()
end
container:node(table4)
-- TABLE 5: Intentional Future Aspect
local table5 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table5:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #f8d7da; color: #842029; text-align: center; font-size: 1.1em;'):wikitext('🟥 Intentional Future Aspect - [[' .. word .. ']]'):done():done()
for _, pron in ipairs(order) do
table5:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext(pron):done()
:tag('td'):wikitext('[[' .. aspect_aff[pron] .. ']]'):done()
:tag('td'):wikitext('[[' .. aspect_neg[pron] .. ']]'):done():done()
end
container:node(table5)
-- TABLE 6: Imperative
local table6 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table6:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #fff3cd; color: #664d03; text-align: center; font-size: 1.1em;'):wikitext('🟨 Imperative (Command Form) - [[' .. word .. ']]'):done():done()
table6:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext('Ati'):done():tag('td'):wikitext('[[' .. cmd.Ati_aff .. ']]'):done():tag('td'):wikitext('[[' .. cmd.Ati_neg .. ']]'):done():done()
table6:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext('Isin'):done():tag('td'):wikitext('[[' .. cmd.Isin_aff .. ']]'):done():tag('td'):wikitext('[[' .. cmd.Isin_neg .. ']]'):done():done()
container:node(table6)
return tostring(container)
end
return p
anwdzhu6bqqgkz1qgfroz0sb5kwp6l1
81952
81951
2026-07-01T19:38:45Z
EyobAbebe7
3540
81952
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. UTILITY FUNCTIONS
-- ===================================================
local function get_verb_root(verb)
local w = mw.ustring.lower(mw.text.trim(verb))
if mw.ustring.match(w, "uu$") then
return mw.ustring.sub(w, 1, -3)
end
return w
end
-- ===================================================
-- 2. AFFIRMATIVE SIMPLE PAST (Yeroo Darbee Eeyyamaa)
-- ===================================================
local function conjugate_past(verb)
local root = get_verb_root(verb)
local ani = root .. "e"
local inni = root .. "e"
local isaan = root .. "an"
local ati, isheen, nuti, isin
-- === A. SEERA HUDHAA (') FI JECHOOTA ADDAA (GLOTTAL STOPS & IRREGULAR) ===
if mw.ustring.match(root, "kaa'$") or mw.ustring.match(root, "taa'$") then
local base = mw.ustring.sub(root, 1, -4)
nuti = base .. "eenye"; ati = base .. "eesse"; isheen = base .. "eesse"; isin = base .. "eessan"
elseif mw.ustring.match(root, "yaa'$") then
local base = mw.ustring.sub(root, 1, -3)
nuti = base .. "ane"; ati = base .. "ate"; isheen = base .. "ate"; isin = base .. "atan"
elseif mw.ustring.match(root, "dhaga'$") then
local base = mw.ustring.sub(root, 1, -7)
nuti = base .. "dhageenye"; ati = base .. "dhageesse"; isheen = base .. "dhageesse"; isin = base .. "dhageessan"
elseif mw.ustring.match(root, "aata'$") then
local base = mw.ustring.sub(root, 1, -3)
nuti = base .. "ofne"; ati = base .. "ofte"; isheen = base .. "ofte"; isin = base .. "oftan"
elseif mw.ustring.match(root, "na'$") then
local base = mw.ustring.sub(root, 1, -4)
nuti = base .. "nofne"; ati = base .. "nofte"; isheen = base .. "nofte"; isin = base .. "noftan"
elseif mw.ustring.match(root, "aari'$") then
local base = mw.ustring.sub(root, 1, -2)
nuti = base .. "ne"; ati = base .. "te"; isheen = base .. "te"; isin = base .. "tan"
elseif mw.ustring.match(root, "aaw$") or mw.ustring.match(root, "aay$") or mw.ustring.match(root, "aah$") or mw.ustring.match(root, "naa'$") or mw.ustring.match(root, "aa'$") then
local base = mw.ustring.sub(root, 1, -4)
nuti = base .. "oofne"; ati = base .. "oofte"; isheen = base .. "oofte"; isin = base .. "ooftan"
elseif mw.ustring.match(root, "aw$") then
local base = mw.ustring.sub(root, 1, -3)
nuti = base .. "oofne"; ati = base .. "oofte"; isheen = base .. "oofte"; isin = base .. "ooftan"
elseif mw.ustring.match(root, "ooh$") then
local base = mw.ustring.sub(root, 1, -4)
nuti = base .. "oone"; ati = base .. "oote"; isheen = base .. "oote"; isin = base .. "ootan"
elseif mw.ustring.match(root, "uu'$") then
local base = mw.ustring.sub(root, 1, -3)
nuti = base .. "une"; ati = base .. "ute"; isheen = base .. "ute"; isin = base .. "utan"
elseif mw.ustring.match(root, "u'$") then
local base = mw.ustring.sub(root, 1, -2)
nuti = base .. "une"; ati = base .. "ute"; isheen = base .. "ute"; isin = base .. "utan"
elseif mw.ustring.match(root, "i'$") then
local base = mw.ustring.sub(root, 1, -2)
nuti = base .. "ine"; ati = base .. "ite"; isheen = base .. "ite"; isin = base .. "itan"
elseif mw.ustring.match(root, "a'$") or mw.ustring.match(root, "h$") then
local base = mw.ustring.sub(root, 1, -2)
nuti = base .. "ane"; ati = base .. "ate"; isheen = base .. "ate"; isin = base .. "atan"
elseif mw.ustring.match(root, "udh$") then
local base = mw.ustring.sub(root, 1, -4)
nuti = base .. "une"; ati = base .. "ute"; isheen = base .. "ute"; isin = base .. "utan"
-- === B. SEERA CH, DH, SH FI QUBEE DACHAA (CONSONANT ASSIMILATION) ===
elseif mw.ustring.match(root, "ooch$") or mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
nuti = root .. "ine"; ati = root .. "ite"; isheen = root .. "ite"; isin = root .. "itan"
elseif mw.ustring.match(root, "och$") then
local base = mw.ustring.sub(root, 1, -3)
return { Ani=base.."dhe", Ati=base.."ote", Inni=base.."dhe", Isheen=base.."ote", Nuti=base.."one", Isin=base.."otan", Isaan=base.."dhan" }
elseif mw.ustring.match(root, "ach$") then
local base = mw.ustring.sub(root, 1, -3)
return { Ani=base.."dhe", Ati=base.."tte", Inni=base.."te", Isheen=base.."tte", Nuti=base.."nne", Isin=base.."ttan", Isaan=base.."tan" }
elseif mw.ustring.match(root, "edh$") then
local base = mw.ustring.sub(root, 1, -3)
return { Ani=base.."dhe", Ati=base.."ete", Inni=base.."dhe", Isheen=base.."ete", Nuti=base.."ene", Isin=base.."etan", Isaan=base.."dhan" }
elseif mw.ustring.match(root, "sh$") then
nuti = root .. "ne"; ati = root .. "te"; isheen = root .. "te"; isin = root .. "tan"
-- === C. SEERA IDILEE (REGULAR RULES) ===
elseif mw.ustring.match(root, "l$") then
nuti = root .. "le"; ati = root .. "te"; isheen = root .. "te"; isin = root .. "tan"
elseif mw.ustring.match(root, "d$") then
local base = mw.ustring.sub(root, 1, -2)
nuti = base .. "nne"; ati = root .. "de"; isheen = root .. "de"; isin = root .. "dan"
elseif mw.ustring.match(root, "r$") then
nuti = root .. "re"; ati = root .. "te"; isheen = root .. "te"; isin = root .. "tan"
else
nuti = root .. "ne"; ati = root .. "te"; isheen = root .. "te"; isin = root .. "tan"
end
return { Ani=ani, Ati=ati, Inni=inni, Isheen=isheen, Nuti=nuti, Isin=isin, Isaan=isaan }
end
-- ===================================================
-- 3. NEGATIVE PAST (Yeroo Darbee Diigamaa)
-- ===================================================
local function conjugate_negative_past_perfect(verb)
local past_forms = conjugate_past(verb)
local neg_form = "hin " .. past_forms.Nuti
return { Ani=neg_form, Ati=neg_form, Inni=neg_form, Isheen=neg_form, Nuti=neg_form, Isin=neg_form, Isaan=neg_form }
end
-- ===================================================
-- 4. PRESENT CONTINUOUS (Yeroo Ammaa Itti Fufaa)
-- ===================================================
local function conjugate_present_continuous(verb)
local root = get_verb_root(verb)
return {
Ani = root .. "aan jira", Ati = root .. "aa jirta", Inni = root .. "aa jira",
Isheen = root .. "aa jirti", Nuti = root .. "aa jirra", Isin = root .. "aa jirtu", Isaan = root .. "aa jiru"
}
end
local function conjugate_negative_present_continuous(verb)
local root = get_verb_root(verb)
return {
Ani = root .. "aa hin jiru", Ati = root .. "aa hin jirtu", Inni = root .. "aa hin jiru",
Isheen = root .. "aa hin jirtu", Nuti = root .. "aa hin jirru", Isin = root .. "aa hin jirtan", Isaan = root .. "aa hin jiran"
}
end
-- ===================================================
-- 5. SIMPLE FUTURE (Yeroo Fuulduraa)
-- ===================================================
local function conjugate_future(verb)
local root = get_verb_root(verb)
return {
Ani = "nan " .. root .. "a", Ati = "ni " .. root .. "ta", Inni = "ni " .. root .. "a",
Isheen = "ni " .. root .. "ti", Nuti = "ni " .. root .. "na", Isin = "ni " .. root .. "tu", Isaan = "ni " .. root .. "u"
}
end
local function conjugate_negative_future(verb)
local root = get_verb_root(verb)
return {
Ani = "hin " .. root .. "u", Ati = "hin " .. root .. "tu", Inni = "hin " .. root .. "u",
Isheen = "hin " .. root .. "tu", Nuti = "hin " .. root .. "nu", Isin = "hin " .. root .. "tan", Isaan = "hin " .. root .. "an"
}
end
-- ===================================================
-- 6. PRESENT PERFECT (Yeroo Raawwatamaa Ammaa)
-- ===================================================
local function conjugate_perfect(verb)
local root = get_verb_root(verb)
if mw.ustring.match(root, "ooch$") or mw.ustring.match(root, "eech$") or mw.ustring.match(root, "uch$") or
mw.ustring.match(root, "adh$") or mw.ustring.match(root, "eedh$") or mw.ustring.match(root, "sh$") or
mw.ustring.match(root, "ny$") or mw.ustring.match(root, "yy$") then
local base = root
return { Ani=base.."eera", Ati=base.."iteetta", Inni=base.."eera", Isheen=base.."iteetti", Nuti=base.."ineera", Isin=base.."itaniittu", Isaan=base.."aniiru" }
elseif mw.ustring.match(root, "och$") or mw.ustring.match(root, "odh$") then
local base = mw.ustring.sub(root, 1, -3)
return { Ani=base.."dheera", Ati=base.."oteetta", Inni=base.."dheera", Isheen=base.."oteetti", Nuti=base.."oneerra", Isin=base.."otaniittu", Isaan=base.."dhaniiru" }
end
local past_forms = conjugate_past(verb)
return {
Ani = mw.ustring.sub(past_forms.Ani, 1, -2) .. "eera",
Ati = mw.ustring.sub(past_forms.Ati, 1, -2) .. "eetta",
Inni = mw.ustring.sub(past_forms.Inni, 1, -2) .. "eera",
Isheen = mw.ustring.sub(past_forms.Isheen, 1, -2) .. "eetti",
Nuti = mw.ustring.sub(past_forms.Nuti, 1, -2) .. "eerra",
Isin = past_forms.Isin .. "iittu",
Isaan = past_forms.Isaan .. "iiru"
}
end
-- ===================================================
-- 7. COMMAND FORM (Bifa Ajajaa)
-- ===================================================
local function conjugate_command(verb)
local root = get_verb_root(verb)
return { Ati_aff = root .. "i", Isin_aff = root .. "aa", Ati_neg = "hin " .. root .. "in", Isin_neg = "hin " .. root .. "inaa" }
end
-- ===================================================
-- 8. INTENTIONAL FUTURE ASPECT (Kutaa Karoora Fuulduraa)
-- ===================================================
local function conjugate_aspect(verb)
local root = get_verb_root(verb)
local aff = root .. "uufi"
return { Ani=aff, Ati=aff, Inni=aff, Isheen=aff, Nuti=aff, Isin=aff, Isaan=aff }
end
local function conjugate_negative_aspect(verb)
local root = get_verb_root(verb)
local nf = root .. "uuf miti"
return { Ani=nf, Ati=nf, Inni=nf, Isheen=nf, Nuti=nf, Isin=nf, Isaan=nf }
end
-- ===================================================
-- HTML WIKITABLE GENERATOR
-- ===================================================
function p.generate(frame)
local args = frame.args
if not args[1] and not args.word then args = frame:getParent().args end
local word = args[1] or args.word
if not word or word == "" then word = mw.title.getCurrentTitle().text end
local past_aff = conjugate_past(word)
local neg_past_perf = conjugate_negative_past_perfect(word)
local pres_cont = conjugate_present_continuous(word)
local pres_cont_neg = conjugate_negative_present_continuous(word)
local future_aff = conjugate_future(word)
local future_neg = conjugate_negative_future(word)
local perfect = conjugate_perfect(word)
local aspect_aff = conjugate_aspect(word)
local aspect_neg = conjugate_negative_aspect(word)
local cmd = conjugate_command(word)
local container = mw.html.create('div'):attr('style', 'display: flex; flex-direction: column; gap: 20px;')
local order = { "Ani", "Ati", "Inni", "Isheen", "Nuti", "Isin", "Isaan" }
-- TABLE 1: Simple Past
local table1 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table1:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #d1e7dd; color: #0f5132; text-align: center; font-size: 1.1em;'):wikitext('🟩 Simple Past Tense - [[' .. word .. ']]'):done():done()
for _, pron in ipairs(order) do
table1:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext(pron):done()
:tag('td'):wikitext('[[' .. past_aff[pron] .. ']]'):done()
:tag('td'):wikitext('[[' .. neg_past_perf[pron] .. ']]'):done():done()
end
container:node(table1)
-- TABLE 2: Simple Future / Present
local table2 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table2:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #cff4fc; color: #055160; text-align: center; font-size: 1.1em;'):wikitext('🟦 Simple Future / Present Tense - [[' .. word .. ']]'):done():done()
for _, pron in ipairs(order) do
table2:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext(pron):done()
:tag('td'):wikitext('[[' .. future_aff[pron] .. ']]'):done()
:tag('td'):wikitext('[[' .. future_neg[pron] .. ']]'):done():done()
end
container:node(table2)
-- TABLE 3: Present Perfect
local table3 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table3:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #e2e3e5; color: #41464b; text-align: center; font-size: 1.1em;'):wikitext('⬜ Present Perfect Tense - [[' .. word .. ']]'):done():done()
for _, pron in ipairs(order) do
table3:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext(pron):done()
:tag('td'):wikitext('[[' .. perfect[pron] .. ']]'):done()
:tag('td'):wikitext('[[' .. neg_past_perf[pron] .. ']]'):done():done()
end
container:node(table3)
-- TABLE 4: Present Continuous
local table4 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table4:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #cfe2ff; color: #084298; text-align: center; font-size: 1.1em;'):wikitext('🟪 Present Continuous Tense - [[' .. word .. ']]'):done():done()
for _, pron in ipairs(order) do
table4:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext(pron):done()
:tag('td'):wikitext('[[' .. pres_cont[pron] .. ']]'):done()
:tag('td'):wikitext('[[' .. pres_cont_neg[pron] .. ']]'):done():done()
end
container:node(table4)
-- TABLE 5: Intentional Future Aspect
local table5 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table5:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #f8d7da; color: #842029; text-align: center; font-size: 1.1em;'):wikitext('🟥 Intentional Future Aspect - [[' .. word .. ']]'):done():done()
for _, pron in ipairs(order) do
table5:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext(pron):done()
:tag('td'):wikitext('[[' .. aspect_aff[pron] .. ']]'):done()
:tag('td'):wikitext('[[' .. aspect_neg[pron] .. ']]'):done():done()
end
container:node(table5)
-- TABLE 6: Imperative
local table6 = mw.html.create('table'):attr('class', 'wikitable'):attr('style', 'border-collapse: collapse; text-align: left; width: 100%; max-width: 800px;')
table6:tag('tr'):tag('th'):attr('colspan', '3'):attr('style', 'background-color: #fff3cd; color: #664d03; text-align: center; font-size: 1.1em;'):wikitext('🟨 Imperative (Command Form) - [[' .. word .. ']]'):done():done()
table6:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext('Ati'):done():tag('td'):wikitext('[[' .. cmd.Ati_aff .. ']]'):done():tag('td'):wikitext('[[' .. cmd.Ati_neg .. ']]'):done():done()
table6:tag('tr'):tag('th'):attr('style', 'background-color: #f8f9fa; width: 20%;'):wikitext('Isin'):done():tag('td'):wikitext('[[' .. cmd.Isin_aff .. ']]'):done():tag('td'):wikitext('[[' .. cmd.Isin_neg .. ']]'):done():done()
container:node(table6)
return tostring(container)
end
return p
t7ztqyh0pkwlxyjzse7a8qg0h1c9nou
81953
81952
2026-07-01T20:01:42Z
EyobAbebe7
3540
81953
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. FUNCTIONS GARGAARTUU (Helper Functions)
-- ===================================================
local function endsWith(str, suffix)
return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix
end
local function slice(str, cut)
if cut == 0 then return str end
return mw.ustring.sub(str, 1, -(cut + 1))
end
-- ===================================================
-- 2. SEERA YEROO DARBEE (Simple Past Tense)
-- ===================================================
function p.get_past_forms(root)
local full_rules = {
{"ooch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"och", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"ach", 2, "dhe", "tte", "te", "tte", "nne", "ttan", "tan"},
{"eech", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"ech", 2, "dhe", "tte", "dhe", "tte", "nne", "ttan", "dhan"},
{"kuch", 2, "te", "tte", "te", "tte", "nne", "ttan", "tan"},
{"uch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"odh", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"uudh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"udh", 2, "dhe", "ute", "dhe", "ute", "une", "utan", "dhan"},
{"iidh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"idh", 2, "dhe", "ite", "dhe", "ite", "ine", "itan", "dhan"},
{"aadh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"adh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"eedh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"edh", 2, "dhe", "ete", "dhe", "ete", "ene", "etan", "dhan"},
{"sh", 0, "e", "te", "e", "te", "ne", "tan", "an"},
{"ny", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"uuph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"iph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"yy", 0, "e", "ite", "e", "ite", "ine", "itan", "an"}
}
for _, rule in ipairs(full_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
return {
Ani = base .. rule[3], Ati = base .. rule[4], Inni = base .. rule[5],
Isheen = base .. rule[6], Nuti = base .. rule[7], Isin = base .. rule[8], Isaan = base .. rule[9]
}
end
end
local partial_rules = {
{"aaw", 3, "oofne", "oofte", "ooftan"}, {"caw", 2, "aane", "aate", "aatan"},
{"aw", 2, "oofne", "oofte", "ooftan"}, {"aay", 3, "oofne", "oofte", "ooftan"},
{"aah", 3, "oofne", "oofte", "ooftan"}, {"ooh", 3, "oone", "oote", "ootan"},
{"ah", 1, "ane", "ate", "atan"}, {"udha'", 1, "ane", "ate", "atan"},
{"aacha'", 2, "ofne", "ofte", "oftan"}, {"ooba'", 2, "ofne", "ofte", "oftan"},
{"dha'", 2, "oofne", "oofte", "ooftan"}, {"msha'", 2, "oofne", "oofte", "ooftan"},
{"iishaa'", 3, "ofne", "ofte", "oftan"}, {"ishaa'", 3, "oofne", "oofte", "ooftan"},
{"uushaa'", 3, "ofne", "ofte", "oftan"}, {"ushaa'", 3, "oofne", "oofte", "ooftan"},
{"uu'", 2, "une", "ute", "utan"}, {"u'", 1, "une", "ute", "utan"},
{"aari'", 1, "ne", "te", "tan"}, {"ooji'", 1, "ne", "te", "tan"},
{"i'", 1, "ine", "ite", "itan"}, {"aafa'", 2, "ofne", "ofte", "oftan"},
{"uufa'", 2, "ofne", "ofte", "oftan"}, {"uusa'", 2, "ofne", "ofte", "oftan"},
{"saasa'", 1, "ane", "ate", "atan"}, {"aassa'", 2, "ofne", "ofte", "oftan"},
{"eessa'", 2, "ofne", "ofte", "oftan"}, {"aasa'", 2, "ofne", "ofte", "oftan"},
{"akaa'", 3, "oofne", "oofte", "ooftan"}, {"naa'", 3, "oofne", "oofte", "ooftan"},
{"ana'", 3, "nofne", "nofte", "noftan"}, {"nna'", 3, "nofne", "nofte", "noftan"},
{"aara'", 2, "ofne", "ofte", "oftan"}, {"bja'", 2, "oofne", "oofte", "ooftan"},
{"jja'", 2, "ofne", "ofte", "oftan"}, {"oonja'", 2, "ofne", "ofte", "oftan"},
{"aaja'", 2, "ofne", "ofte", "oftan"}, {"ooja'", 2, "ofne", "ofte", "oftan"},
{"eeja'", 2, "ofne", "ofte", "oftan"}, {"ucca'", 2, "ofne", "ofte", "oftan"},
{"aanca'", 2, "ofne", "ofte", "oftan"}, {"aanxa'", 2, "ofne", "ofte", "oftan"},
{"aaxa'", 2, "ofne", "ofte", "oftan"}, {"eexa'", 2, "ofne", "ofte", "oftan"},
{"iixa'", 2, "ofne", "ofte", "oftan"}, {"ooxa'", 2, "ofne", "ofte", "oftan"},
{"uuxa'", 2, "ofne", "ofte", "oftan"}, {"uura'", 2, "ofne", "ofte", "oftan"},
{"eela'", 2, "ofne", "ofte", "oftan"}, {"kaakka'", 1, "ane", "ate", "atan"},
{"uuka'", 2, "ofne", "ofte", "oftan"}, {"okka'", 1, "ane", "ate", "atan"},
{"kkaa'", 3, "oofne", "oofte", "ooftan"}, {"ukaa'", 3, "oofne", "oofte", "ooftan"},
{"kaa'", 3, "eenye", "eesse", "eessan"}, {"ottaa'", 3, "oofne", "oofte", "ooftan"},
{"aadda'", 2, "ofne", "ofte", "oftan"}, {"dda'", 1, "ane", "ate", "atan"},
{"ooda'", 2, "ofne", "ofte", "oftan"}, {"eda'", 1, "ane", "ate", "atan"},
{"ida'", 1, "ane", "ate", "atan"}, {"da'", 2, "eenye", "eesse", "eessan"},
{"mtaa'", 3, "oofne", "oofte", "ooftan"}, {"taa'", 3, "eenye", "eesse", "eessan"},
{"nga'", 2, "ofne", "ofte", "oftan"}, {"maaga'", 2, "ofne", "ofte", "oftan"},
{"oga'", 2, "ofne", "ofte", "oftan"}, {"aanga'", 2, "ofne", "ofte", "oftan"},
{"anga'", 1, "ane", "ate", "atan"}, {"rga'", 1, "ane", "ate", "atan"},
{"alga'", 2, "eenye", "eesse", "eessan"}, {"lga'", 1, "ane", "ate", "atan"},
{"enga'", 1, "ane", "ate", "atan"}, {"dhaga'", 2, "eenye", "eesse", "eessan"},
{"eega'", 2, "ane", "ate", "atan"}, {"aga'", 1, "ane", "ate", "atan"},
{"gga'", 1, "ane", "ate", "atan"}, {"ga'", 2, "eenye", "eesse", "eessan"},
{"omma'", 2, "ane", "ate", "atan"}, {"mma'", 2, "ofne", "ofte", "oftan"},
{"uma'", 2, "oofne", "oofte", "ooftan"}, {"aarra'", 2, "ofne", "ofte", "oftan"},
{"aata'", 2, "ofne", "ofte", "oftan"}, {"iita'", 2, "ofne", "ofte", "oftan"},
{"uqqa'", 1, "ane", "ate", "atan"}, {"qa'", 2, "ofne", "ofte", "oftan"},
{"yaa'", 2, "ane", "ate", "atan"}, {"ooyya'", 2, "oofne", "oofte", "ooftan"},
{"aa'", 3, "oofne", "oofte", "ooftan"}, {"a'", 1, "ane", "ate", "atan"},
{"boo'", 1, "nye", "sse", "ssan"}, {"oo'", 1, "ne", "te", "tan"},
{"o'", 1, "one", "ote", "otan"}
}
local nuti, ati, ishee, isin
local matched = false
if mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
nuti = root .. "ine"; ati = root .. "ite"; ishee = root .. "ite"; isin = root .. "itan"
matched = true
end
if not matched then
for _, rule in ipairs(partial_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
nuti = base .. rule[3]; ati = base .. rule[4]; ishee = base .. rule[4]; isin = base .. rule[5]
matched = true
break
end
end
end
if not matched then
if endsWith(root, "d") then
nuti = slice(root, 1) .. "nne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "l") then
nuti = root .. "le"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "b") then
nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "c") then
nuti = root .. "ne"; ati = root .. "ce"; ishee = root .. "ce"; isin = root .. "can"; matched = true
elseif endsWith(root, "g") then
nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "r") then
nuti = slice(root, 1) .. "rre"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "n") then
nuti = slice(root, 1) .. "nne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "m") then
nuti = slice(root, 1) .. "mne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
else
nuti = root .. "ne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"
end
end
return { Ani = root .. "e", Ati = ati, Inni = root .. "e", Isheen = ishee, Nuti = nuti, Isin = isin, Isaan = root .. "an" }
end
-- ===================================================
-- 3. SEERA YEROO AMMAA/GARA FUULDURAA (Present/Future)
-- ===================================================
function p.get_present_forms(root)
local ani, ati, inni, ishee, nuti, isin, isaan
-- Seera Gochimoota Addaa (fkn: -ach, -edh, -udh)
if endsWith(root, "ach") or endsWith(root, "adh") then
local base = slice(root, 3)
ani = base .. "adha"; ati = base .. "atta"; inni = base .. "ata"
ishee = base .. "atti"; nuti = base .. "anna"; isin = base .. "attu"; isaan = base .. "atu"
elseif endsWith(root, "och") or endsWith(root, "odh") then
local base = slice(root, 3)
ani = base .. "odha"; ati = base .. "otta"; inni = base .. "ota"
ishee = base .. "otti"; nuti = base .. "onna"; isin = base .. "ottu"; isaan = base .. "otu"
elseif endsWith(root, "edh") or endsWith(root, "ech") then
local base = slice(root, 3)
ani = base .. "edha"; ati = base .. "etta"; inni = base .. "eta"
ishee = base .. "etti"; nuti = base .. "enna"; isin = base .. "ettu"; isaan = base .. "etu"
-- Seera Dubbifamaa Dachaa (Double Consonants)
elseif mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
ani = root .. "a"; ati = root .. "ita"; inni = root .. "a"; ishee = root .. "iti"
nuti = root .. "ina"; isin = root .. "itu"; isaan = root .. "u"
-- Seera Dubbifamaa Qeenxee / Idilee (Single Consonant / Default)
else
ani = root .. "a"; inni = root .. "a"; isaan = root .. "u"
-- Assimilation
if endsWith(root, "d") then
nuti = slice(root, 1) .. "nna"; ati = root .. "da"; ishee = root .. "di"; isin = root .. "du"
elseif endsWith(root, "l") then
nuti = root .. "la"; ati = root .. "ta"; ishee = root .. "ti"; isin = root .. "tu"
elseif endsWith(root, "r") then
nuti = slice(root, 1) .. "rra"; ati = root .. "ta"; ishee = root .. "ti"; isin = root .. "tu"
elseif endsWith(root, "n") then
nuti = slice(root, 1) .. "nna"; ati = root .. "ta"; ishee = root .. "ti"; isin = root .. "tu"
else
nuti = root .. "na"; ati = root .. "ta"; ishee = root .. "ti"; isin = root .. "tu"
end
end
return { Ani = ani, Ati = ati, Inni = inni, Isheen = ishee, Nuti = nuti, Isin = isin, Isaan = isaan }
end
-- ===================================================
-- 4. SEERA AJAJAA (Imperative Forms)
-- ===================================================
function p.get_imperative_forms(root)
local ati_imp, isin_imp
if endsWith(root, "ach") or endsWith(root, "adh") then
local base = slice(root, 3)
ati_imp = base .. "adhu"; isin_imp = base .. "adhaa"
elseif endsWith(root, "och") or endsWith(root, "odh") then
local base = slice(root, 3)
ati_imp = base .. "odhu"; isin_imp = base .. "odhaa"
elseif mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
ati_imp = root .. "i"; isin_imp = root .. "aa"
else
ati_imp = root .. "i"; isin_imp = root .. "aa"
end
return { Ati = ati_imp, Isin = isin_imp }
end
-- ===================================================
-- 5. FUNCTION WALIIGALAA (Main Entry Function)
-- ===================================================
function p.conjugate_all(frame)
local root = frame.args[1] or frame:getParent().args[1]
if not root then return "Gochima sirrii galchi. (Error: Verb root missing)" end
local past = p.get_past_forms(root)
local present = p.get_present_forms(root)
local imperative = p.get_imperative_forms(root)
local result = "=== Yeroo Darbee (Past Tense) ===\n" ..
"Ani " .. past.Ani .. ", Ati " .. past.Ati .. ", Inni " .. past.Inni .. ", Isheen " .. past.Isheen ..
", Nuti " .. past.Nuti .. ", Isin " .. past.Isin .. ", Isaan " .. past.Isaan .. "\n\n" ..
"=== Yeroo Ammaa/Fuulduraa (Present/Future) ===\n" ..
"Ani " .. present.Ani .. ", Ati " .. present.Ati .. ", Inni " .. present.Inni .. ", Isheen " .. present.Isheen ..
", Nuti " .. present.Nuti .. ", Isin " .. present.Isin .. ", Isaan " .. present.Isaan .. "\n\n" ..
"=== Ajaja (Imperative) ===\n" ..
"Ati " .. imperative.Ati .. ", Isin " .. imperative.Isin
return result
end
return p
b4d6ng97xp3636m0j9ml9qtp8m5y3ya
81954
81953
2026-07-01T20:10:46Z
EyobAbebe7
3540
81954
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. FUNCTIONS GARGAARTUU (Helper Functions)
-- ===================================================
local function endsWith(str, suffix)
return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix
end
local function slice(str, cut)
if cut == 0 then return str end
return mw.ustring.sub(str, 1, -(cut + 1))
end
-- ===================================================
-- 2. SEERA YEROO DARBEE (Simple Past Tense)
-- ===================================================
function p.get_past_forms(root)
local full_rules = {
{"ooch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"och", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"ach", 2, "dhe", "tte", "te", "tte", "nne", "ttan", "tan"},
{"eech", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"ech", 2, "dhe", "tte", "dhe", "tte", "nne", "ttan", "dhan"},
{"kuch", 2, "te", "tte", "te", "tte", "nne", "ttan", "tan"},
{"uch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"odh", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"uudh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"udh", 2, "dhe", "ute", "dhe", "ute", "une", "utan", "dhan"},
{"iidh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"idh", 2, "dhe", "ite", "dhe", "ite", "ine", "itan", "dhan"},
{"aadh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"adh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"eedh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"edh", 2, "dhe", "ete", "dhe", "ete", "ene", "etan", "dhan"},
{"sh", 0, "e", "te", "e", "te", "ne", "tan", "an"},
{"ny", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"uuph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"iph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"yy", 0, "e", "ite", "e", "ite", "ine", "itan", "an"}
}
for _, rule in ipairs(full_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
return {
Ani = base .. rule[3], Ati = base .. rule[4], Inni = base .. rule[5],
Isheen = base .. rule[6], Nuti = base .. rule[7], Isin = base .. rule[8], Isaan = base .. rule[9]
}
end
end
local partial_rules = {
{"aaw", 3, "oofne", "oofte", "ooftan"}, {"caw", 2, "aane", "aate", "aatan"},
{"aw", 2, "oofne", "oofte", "ooftan"}, {"aay", 3, "oofne", "oofte", "ooftan"},
{"aah", 3, "oofne", "oofte", "ooftan"}, {"ooh", 3, "oone", "oote", "ootan"},
{"ah", 1, "ane", "ate", "atan"}, {"udha'", 1, "ane", "ate", "atan"},
{"aacha'", 2, "ofne", "ofte", "oftan"}, {"ooba'", 2, "ofne", "ofte", "oftan"},
{"dha'", 2, "oofne", "oofte", "ooftan"}, {"msha'", 2, "oofne", "oofte", "ooftan"},
{"iishaa'", 3, "ofne", "ofte", "oftan"}, {"ishaa'", 3, "oofne", "oofte", "ooftan"},
{"uushaa'", 3, "ofne", "ofte", "oftan"}, {"ushaa'", 3, "oofne", "oofte", "ooftan"},
{"uu'", 2, "une", "ute", "utan"}, {"u'", 1, "une", "ute", "utan"},
{"aari'", 1, "ne", "te", "tan"}, {"ooji'", 1, "ne", "te", "tan"},
{"i'", 1, "ine", "ite", "itan"}, {"aafa'", 2, "ofne", "ofte", "oftan"},
{"uufa'", 2, "ofne", "ofte", "oftan"}, {"uusa'", 2, "ofne", "ofte", "oftan"},
{"saasa'", 1, "ane", "ate", "atan"}, {"aassa'", 2, "ofne", "ofte", "oftan"},
{"eessa'", 2, "ofne", "ofte", "oftan"}, {"aasa'", 2, "ofne", "ofte", "oftan"},
{"akaa'", 3, "oofne", "oofte", "ooftan"}, {"naa'", 3, "oofne", "oofte", "ooftan"},
{"ana'", 3, "nofne", "nofte", "noftan"}, {"nna'", 3, "nofne", "nofte", "noftan"},
{"aara'", 2, "ofne", "ofte", "oftan"}, {"bja'", 2, "oofne", "oofte", "ooftan"},
{"jja'", 2, "ofne", "ofte", "oftan"}, {"oonja'", 2, "ofne", "ofte", "oftan"},
{"aaja'", 2, "ofne", "ofte", "oftan"}, {"ooja'", 2, "ofne", "ofte", "oftan"},
{"eeja'", 2, "ofne", "ofte", "oftan"}, {"ucca'", 2, "ofne", "ofte", "oftan"},
{"aanca'", 2, "ofne", "ofte", "oftan"}, {"aanxa'", 2, "ofne", "ofte", "oftan"},
{"aaxa'", 2, "ofne", "ofte", "oftan"}, {"eexa'", 2, "ofne", "ofte", "oftan"},
{"iixa'", 2, "ofne", "ofte", "oftan"}, {"ooxa'", 2, "ofne", "ofte", "oftan"},
{"uuxa'", 2, "ofne", "ofte", "oftan"}, {"uura'", 2, "ofne", "ofte", "oftan"},
{"eela'", 2, "ofne", "ofte", "oftan"}, {"kaakka'", 1, "ane", "ate", "atan"},
{"uuka'", 2, "ofne", "ofte", "oftan"}, {"okka'", 1, "ane", "ate", "atan"},
{"kkaa'", 3, "oofne", "oofte", "ooftan"}, {"ukaa'", 3, "oofne", "oofte", "ooftan"},
{"kaa'", 3, "eenye", "eesse", "eessan"}, {"ottaa'", 3, "oofne", "oofte", "ooftan"},
{"aadda'", 2, "ofne", "ofte", "oftan"}, {"dda'", 1, "ane", "ate", "atan"},
{"ooda'", 2, "ofne", "ofte", "oftan"}, {"eda'", 1, "ane", "ate", "atan"},
{"ida'", 1, "ane", "ate", "atan"}, {"da'", 2, "eenye", "eesse", "eessan"},
{"mtaa'", 3, "oofne", "oofte", "ooftan"}, {"taa'", 3, "eenye", "eesse", "eessan"},
{"nga'", 2, "ofne", "ofte", "oftan"}, {"maaga'", 2, "ofne", "ofte", "oftan"},
{"oga'", 2, "ofne", "ofte", "oftan"}, {"aanga'", 2, "ofne", "ofte", "oftan"},
{"anga'", 1, "ane", "ate", "atan"}, {"rga'", 1, "ane", "ate", "atan"},
{"alga'", 2, "eenye", "eesse", "eessan"}, {"lga'", 1, "ane", "ate", "atan"},
{"enga'", 1, "ane", "ate", "atan"}, {"dhaga'", 2, "eenye", "eesse", "eessan"},
{"eega'", 2, "ane", "ate", "atan"}, {"aga'", 1, "ane", "ate", "atan"},
{"gga'", 1, "ane", "ate", "atan"}, {"ga'", 2, "eenye", "eesse", "eessan"},
{"omma'", 2, "ane", "ate", "atan"}, {"mma'", 2, "ofne", "ofte", "oftan"},
{"uma'", 2, "oofne", "oofte", "ooftan"}, {"aarra'", 2, "ofne", "ofte", "oftan"},
{"aata'", 2, "ofne", "ofte", "oftan"}, {"iita'", 2, "ofne", "ofte", "oftan"},
{"uqqa'", 1, "ane", "ate", "atan"}, {"qa'", 2, "ofne", "ofte", "oftan"},
{"yaa'", 2, "ane", "ate", "atan"}, {"ooyya'", 2, "oofne", "oofte", "ooftan"},
{"aa'", 3, "oofne", "oofte", "ooftan"}, {"a'", 1, "ane", "ate", "atan"},
{"boo'", 1, "nye", "sse", "ssan"}, {"oo'", 1, "ne", "te", "tan"},
{"o'", 1, "one", "ote", "otan"}
}
local nuti, ati, ishee, isin
local matched = false
if mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
nuti = root .. "ine"; ati = root .. "ite"; ishee = root .. "ite"; isin = root .. "itan"
matched = true
end
if not matched then
for _, rule in ipairs(partial_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
nuti = base .. rule[3]; ati = base .. rule[4]; ishee = base .. rule[4]; isin = base .. rule[5]
matched = true
break
end
end
end
if not matched then
if endsWith(root, "d") then
nuti = slice(root, 1) .. "nne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "l") then
nuti = root .. "le"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "b") then
nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "c") then
nuti = root .. "ne"; ati = root .. "ce"; ishee = root .. "ce"; isin = root .. "can"; matched = true
elseif endsWith(root, "g") then
nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "r") then
nuti = slice(root, 1) .. "rre"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "n") then
nuti = slice(root, 1) .. "nne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "m") then
nuti = slice(root, 1) .. "mne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
else
nuti = root .. "ne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"
end
end
return { Ani = root .. "e", Ati = ati, Inni = root .. "e", Isheen = ishee, Nuti = nuti, Isin = isin, Isaan = root .. "an" }
end
-- ===================================================
-- 3. SEERA YEROO AMMAA/GARA FUULDURAA (Present/Future)
-- ===================================================
function p.get_present_forms(root)
local ani, ati, inni, ishee, nuti, isin, isaan
if endsWith(root, "ach") or endsWith(root, "adh") then
local base = slice(root, 3)
ani = base .. "adha"; ati = base .. "atta"; inni = base .. "ata"
ishee = base .. "atti"; nuti = base .. "anna"; isin = base .. "attu"; isaan = base .. "atu"
elseif endsWith(root, "och") or endsWith(root, "odh") then
local base = slice(root, 3)
ani = base .. "odha"; ati = base .. "otta"; inni = base .. "ota"
ishee = base .. "otti"; nuti = base .. "onna"; isin = base .. "ottu"; isaan = base .. "otu"
elseif endsWith(root, "edh") or endsWith(root, "ech") then
local base = slice(root, 3)
ani = base .. "edha"; ati = base .. "etta"; inni = base .. "eta"
ishee = base .. "etti"; nuti = base .. "enna"; isin = base .. "ettu"; isaan = base .. "etu"
elseif mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
ani = root .. "a"; ati = root .. "ita"; inni = root .. "a"; ishee = root .. "iti"
nuti = root .. "ina"; isin = root .. "itu"; isaan = root .. "u"
else
ani = root .. "a"; inni = root .. "a"; isaan = root .. "u"
if endsWith(root, "d") then
nuti = slice(root, 1) .. "nna"; ati = root .. "da"; ishee = root .. "di"; isin = root .. "du"
elseif endsWith(root, "l") then
nuti = root .. "la"; ati = root .. "ta"; ishee = root .. "ti"; isin = root .. "tu"
elseif endsWith(root, "r") then
nuti = slice(root, 1) .. "rra"; ati = root .. "ta"; ishee = root .. "ti"; isin = root .. "tu"
elseif endsWith(root, "n") then
nuti = slice(root, 1) .. "nna"; ati = root .. "ta"; ishee = root .. "ti"; isin = root .. "tu"
else
nuti = root .. "na"; ati = root .. "ta"; ishee = root .. "ti"; isin = root .. "tu"
end
end
return { Ani = ani, Ati = ati, Inni = inni, Isheen = ishee, Nuti = nuti, Isin = isin, Isaan = isaan }
end
-- ===================================================
-- 4. SEERA AJAJAA (Imperative Forms)
-- ===================================================
function p.get_imperative_forms(root)
local ati_imp, isin_imp
if endsWith(root, "ach") or endsWith(root, "adh") then
local base = slice(root, 3)
ati_imp = base .. "adhu"; isin_imp = base .. "adhaa"
elseif endsWith(root, "och") or endsWith(root, "odh") then
local base = slice(root, 3)
ati_imp = base .. "odhu"; isin_imp = base .. "odhaa"
elseif mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
ati_imp = root .. "i"; isin_imp = root .. "aa"
else
ati_imp = root .. "i"; isin_imp = root .. "aa"
end
return { Ati = ati_imp, Isin = isin_imp }
end
-- ===================================================
-- 5. FUNCTION WALIIGALAA (Main Export: 'generate')
-- ===================================================
function p.generate(frame)
-- Daataa kallattiin ykn Template irraa fudhachuu
local args = frame.args
if frame == mw.getCurrentFrame() then
args = frame:getParent().args
end
local root = args[1]
if not root then
return "Error: Gochima sirrii hin galchine. (Missing root verb)"
end
local past = p.get_past_forms(root)
local present = p.get_present_forms(root)
local imperative = p.get_imperative_forms(root)
local result = "'''Yeroo Darbee (Past)'''<br/>" ..
"Ani " .. past.Ani .. ", Ati " .. past.Ati .. ", Inni " .. past.Inni .. ", Isheen " .. past.Isheen ..
", Nuti " .. past.Nuti .. ", Isin " .. past.Isin .. ", Isaan " .. past.Isaan .. "<br/><br/>" ..
"'''Yeroo Ammaa/Fuulduraa (Present/Future)'''<br/>" ..
"Ani " .. present.Ani .. ", Ati " .. present.Ati .. ", Inni " .. present.Inni .. ", Isheen " .. present.Isheen ..
", Nuti " .. present.Nuti .. ", Isin " .. present.Isin .. ", Isaan " .. present.Isaan .. "<br/><br/>" ..
"'''Ajaja (Imperative)'''<br/>" ..
"Ati " .. imperative.Ati .. ", Isin " .. imperative.Isin
return result
end
return p
i2rusaxtq4y8pizfsh66r8q7jhzye4k
81955
81954
2026-07-01T20:17:51Z
EyobAbebe7
3540
81955
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. FUNCTIONS GARGAARTUU (Helper Functions)
-- ===================================================
local function endsWith(str, suffix)
return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix
end
local function slice(str, cut)
if cut == 0 then return str end
return mw.ustring.sub(str, 1, -(cut + 1))
end
-- ===================================================
-- 2. SEERA YEROO DARBEE (Simple Past Tense Logic)
-- ===================================================
local function get_past_forms(root)
-- Kutaa 1ffaa: Gochimoota seera guutuu jijjiiran (Full form overrides)
local full_rules = {
{"ooch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"och", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"ach", 2, "dhe", "tte", "te", "tte", "nne", "ttan", "tan"},
{"eech", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"ech", 2, "dhe", "tte", "dhe", "tte", "nne", "ttan", "dhan"},
{"kuch", 2, "te", "tte", "te", "tte", "nne", "ttan", "tan"},
{"uch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"odh", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"uudh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"udh", 2, "dhe", "ute", "dhe", "ute", "une", "utan", "dhan"},
{"iidh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"idh", 2, "dhe", "ite", "dhe", "ite", "ine", "itan", "dhan"},
{"aadh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"adh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"eedh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"edh", 2, "dhe", "ete", "dhe", "ete", "ene", "etan", "dhan"},
{"sh", 0, "e", "te", "e", "te", "ne", "tan", "an"},
{"ny", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"uuph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"iph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"yy", 0, "e", "ite", "e", "ite", "ine", "itan", "an"}
}
for _, rule in ipairs(full_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
return {
Ani = base .. rule[3], Ati = base .. rule[4], Inni = base .. rule[5],
Isheen = base .. rule[6], Nuti = base .. rule[7], Isin = base .. rule[8], Isaan = base .. rule[9]
}
end
end
-- Kutaa 2ffaa: Gochimoota walakkaan jijjiiraman (Partial suffix matches)
local partial_rules = {
{"aaw", 3, "oofne", "oofte", "ooftan"}, {"caw", 2, "aane", "aate", "aatan"},
{"aw", 2, "oofne", "oofte", "ooftan"}, {"aay", 3, "oofne", "oofte", "ooftan"},
{"aah", 3, "oofne", "oofte", "ooftan"}, {"ooh", 3, "oone", "oote", "ootan"},
{"ah", 1, "ane", "ate", "atan"}, {"udha'", 1, "ane", "ate", "atan"},
{"aacha'", 2, "ofne", "ofte", "oftan"}, {"ooba'", 2, "ofne", "ofte", "oftan"},
{"dha'", 2, "oofne", "oofte", "ooftan"}, {"msha'", 2, "oofne", "oofte", "ooftan"},
{"iishaa'", 3, "ofne", "ofte", "oftan"}, {"ishaa'", 3, "oofne", "oofte", "ooftan"},
{"uushaa'", 3, "ofne", "ofte", "oftan"}, {"ushaa'", 3, "oofne", "oofte", "ooftan"},
{"uu'", 2, "une", "ute", "utan"}, {"u'", 1, "une", "ute", "utan"},
{"aari'", 1, "ne", "te", "tan"}, {"ooji'", 1, "ne", "te", "tan"},
{"i'", 1, "ine", "ite", "itan"}, {"aafa'", 2, "ofne", "ofte", "oftan"},
{"uufa'", 2, "ofne", "ofte", "oftan"}, {"uusa'", 2, "ofne", "ofte", "oftan"},
{"saasa'", 1, "ane", "ate", "atan"}, {"aassa'", 2, "ofne", "ofte", "oftan"},
{"eessa'", 2, "ofne", "ofte", "oftan"}, {"aasa'", 2, "ofne", "ofte", "oftan"},
{"akaa'", 3, "oofne", "oofte", "ooftan"}, {"naa'", 3, "oofne", "oofte", "ooftan"},
{"ana'", 3, "nofne", "nofte", "noftan"}, {"nna'", 3, "nofne", "nofte", "noftan"},
{"aara'", 2, "ofne", "ofte", "oftan"}, {"bja'", 2, "oofne", "oofte", "ooftan"},
{"jja'", 2, "ofne", "ofte", "oftan"}, {"oonja'", 2, "ofne", "ofte", "oftan"},
{"aaja'", 2, "ofne", "ofte", "oftan"}, {"ooja'", 2, "ofne", "ofte", "oftan"},
{"eeja'", 2, "ofne", "ofte", "oftan"}, {"ucca'", 2, "ofne", "ofte", "oftan"},
{"aanca'", 2, "ofne", "ofte", "oftan"}, {"aanxa'", 2, "ofne", "ofte", "oftan"},
{"aaxa'", 2, "ofne", "ofte", "oftan"}, {"eexa'", 2, "ofne", "ofte", "oftan"},
{"iixa'", 2, "ofne", "ofte", "oftan"}, {"ooxa'", 2, "ofne", "ofte", "oftan"},
{"uuxa'", 2, "ofne", "ofte", "oftan"}, {"uura'", 2, "ofne", "ofte", "oftan"},
{"eela'", 2, "ofne", "ofte", "oftan"}, {"kaakka'", 1, "ane", "ate", "atan"},
{"uuka'", 2, "ofne", "ofte", "oftan"}, {"okka'", 1, "ane", "ate", "atan"},
{"kkaa'", 3, "oofne", "oofte", "ooftan"}, {"ukaa'", 3, "oofne", "oofte", "ooftan"},
{"kaa'", 3, "eenye", "eesse", "eessan"}, {"ottaa'", 3, "oofne", "oofte", "ooftan"},
{"aadda'", 2, "ofne", "ofte", "oftan"}, {"dda'", 1, "ane", "ate", "atan"},
{"ooda'", 2, "ofne", "ofte", "oftan"}, {"eda'", 1, "ane", "ate", "atan"},
{"ida'", 1, "ane", "ate", "atan"}, {"da'", 2, "eenye", "eesse", "eessan"},
{"mtaa'", 3, "oofne", "oofte", "ooftan"}, {"taa'", 3, "eenye", "eesse", "eessan"},
{"nga'", 2, "ofne", "ofte", "oftan"}, {"maaga'", 2, "ofne", "ofte", "oftan"},
{"oga'", 2, "ofne", "ofte", "oftan"}, {"aanga'", 2, "ofne", "ofte", "oftan"},
{"anga'", 1, "ane", "ate", "atan"}, {"rga'", 1, "ane", "ate", "atan"},
{"alga'", 2, "eenye", "eesse", "eessan"}, {"lga'", 1, "ane", "ate", "atan"},
{"enga'", 1, "ane", "ate", "atan"}, {"dhaga'", 2, "eenye", "eesse", "eessan"},
{"eega'", 2, "ane", "ate", "atan"}, {"aga'", 1, "ane", "ate", "atan"},
{"gga'", 1, "ane", "ate", "atan"}, {"ga'", 2, "eenye", "eesse", "eessan"},
{"omma'", 2, "ane", "ate", "atan"}, {"mma'", 2, "ofne", "ofte", "oftan"},
{"uma'", 2, "oofne", "oofte", "ooftan"}, {"aarra'", 2, "ofne", "ofte", "oftan"},
{"aata'", 2, "ofne", "ofte", "oftan"}, {"iita'", 2, "ofne", "ofte", "oftan"},
{"uqqa'", 1, "ane", "ate", "atan"}, {"qa'", 2, "ofne", "ofte", "oftan"},
{"yaa'", 2, "ane", "ate", "atan"}, {"ooyya'", 2, "oofne", "oofte", "ooftan"},
{"aa'", 3, "oofne", "oofte", "ooftan"}, {"a'", 1, "ane", "ate", "atan"},
{"boo'", 1, "nye", "sse", "ssan"}, {"oo'", 1, "ne", "te", "tan"},
{"o'", 1, "one", "ote", "otan"}
}
local nuti, ati, ishee, isin
local matched = false
-- Dubbifamaa dachaa (Double Consonants Pattern ccPattern)
if mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
nuti = root .. "ine"; ati = root .. "ite"; ishee = root .. "ite"; isin = root .. "itan"
matched = true
end
if not matched then
for _, rule in ipairs(partial_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
nuti = base .. rule[3]; ati = base .. rule[4]; ishee = base .. rule[4]; isin = base .. rule[5]
matched = true
break
end
end
end
-- Kutaa 3ffaa: Qubeewwan Dubbifamaa Qeenxee (Single Consonants Fallbacks)
if not matched then
if endsWith(root, "d") then
nuti = slice(root, 1) .. "nne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "l") then
nuti = root .. "le"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "b") then
nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "c") then
nuti = root .. "ne"; ati = root .. "ce"; ishee = root .. "ce"; isin = root .. "can"; matched = true
elseif endsWith(root, "g") then
nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "j") then
nuti = root .. "ne"; ati = root .. "je"; ishee = root .. "je"; isin = root .. "jan"; matched = true
elseif endsWith(root, "q") then
nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
elseif endsWith(root, "r") then
nuti = root .. "re"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "x") then
nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
end
end
-- Kutaa 4ffaa: Fallback Idilee (Default)
if not matched then
nuti = root .. "ne"
ati = root .. "te"
ishee = root .. "te"
isin = root .. "tan"
end
return {
Ani = root .. "e", Ati = ati, Inni = root .. "e",
Isheen = ishee, Nuti = nuti, Isin = isin, Isaan = root .. "an"
}
end
-- ===================================================
-- 3. SEERA AJAJAA (Imperative Form Logic)
-- ===================================================
local function get_imperative_forms(root)
if mw.ustring.match(root, "[aeiou]ch$") then
local base = mw.ustring.sub(root, 1, -3)
local stem = mw.ustring.sub(root, 1, -4)
local vowel = mw.ustring.sub(root, -3, -3)
return {
Ati_aff = base .. "dhu", Isin_aff = base .. "dhaa",
Ati_neg = "hin " .. stem .. vowel .. "tin", Isin_neg = "hin " .. stem .. vowel .. "tinaa"
}
end
return {
Ati_aff = root .. "i", Isin_aff = root .. "aa",
Ati_neg = "hin " .. root .. "in", Isin_neg = "hin " .. root .. "inaa"
}
end
-- ===================================================
-- 4. KUTAA MOOJULII WAAMAMU (Main Generate Function)
-- ===================================================
function p.generate(frame)
local verb = frame.args[1] or frame.args.word or mw.title.getCurrentTitle().text
verb = mw.ustring.lower(mw.text.trim(verb))
-- "-uu" irraa kuta (Remove infinitive suffix)
local root = verb
if endsWith(verb, "uu") then
root = mw.ustring.sub(verb, 1, -3)
end
-- 1. Yeroo Darbee Eeyyamaa (Simple Past Affirmative)
local past_aff = get_past_forms(root)
-- 2. Yeroo Darbee Diigamaa (Negative past hundi isaa hin + nuti result ta'a)
local neg_base = "hin " .. past_aff.Nuti
local past_neg = {
Ani = neg_base, Ati = neg_base, Inni = neg_base,
Isheen = neg_base, Nuti = neg_base, Isin = neg_base, Isaan = neg_base
}
-- 3. Bifa Ajajaa (Imperative)
local cmd = get_imperative_forms(root)
-- Gabatee Uumuu (Building the Wikitext Table)
local html = "{| class=\"wikitable\" style=\"text-align:center;\"\n"
html = html .. "|+ '''Bifa Diigamaa Gochima: " .. verb .. "'''\n"
html = html .. "! Bumbaa Maqaa !! Yeroo Darbee (Past) !! Yeroo Darbee Diigamaa (Neg. Past)\n"
local pronouns = {"Ani", "Ati", "Inni", "Isheen", "Nuti", "Isin", "Isaan"}
for _, p_name in ipairs(pronouns) do
html = html .. "|-\n! " .. p_name .. "\n| " .. past_aff[p_name] .. " || " .. past_neg[p_name] .. "\n"
end
html = html .. "|-\n! colspan=\"3\" style=\"background:#e0e0e0;\" | Bifa Ajajaa (Imperative)\n"
html = html .. "|-\n! Ati\n| " .. cmd.Ati_aff .. " || " .. cmd.Ati_neg .. "\n"
html = html .. "|-\n! Isin\n| " .. cmd.Isin_aff .. " || " .. cmd.Isin_neg .. "\n"
html = html .. "|}"
return html
end
return p
p6eg1hw8wjasg9xtojy3ckwaxi1kv6f
81956
81955
2026-07-01T20:30:51Z
EyobAbebe7
3540
81956
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. FUNCTIONS GARGAARTUU (Helper Functions)
-- ===================================================
local function endsWith(str, suffix)
return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix
end
local function slice(str, cut)
if cut == 0 then return str end
return mw.ustring.sub(str, 1, -(cut + 1))
end
-- ===================================================
-- 2. SEERA YEROO DARBEE (Simple Past Tense Logic)
-- ===================================================
local function get_past_forms(root)
-- Kutaa 1ffaa: Gochimoota seera guutuu jijjiiran (Full form overrides)
local full_rules = {
{"ooch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"och", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"ach", 2, "dhe", "tte", "te", "tte", "nne", "ttan", "tan"},
{"eech", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"ech", 2, "dhe", "tte", "dhe", "tte", "nne", "ttan", "dhan"},
{"kuch", 2, "te", "tte", "te", "tte", "nne", "ttan", "tan"},
{"uch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"odh", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"uudh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"udh", 2, "dhe", "ute", "dhe", "ute", "une", "utan", "dhan"},
{"iidh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"idh", 2, "dhe", "ite", "dhe", "ite", "ine", "itan", "dhan"},
{"aadh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"adh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"eedh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"edh", 2, "dhe", "ete", "dhe", "ete", "ene", "etan", "dhan"},
{"sh", 0, "e", "te", "e", "te", "ne", "tan", "an"},
{"ny", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"uuph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"iph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"yy", 0, "e", "ite", "e", "ite", "ine", "itan", "an"}
}
for _, rule in ipairs(full_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
return {
Ani = base .. rule[3], Ati = base .. rule[4], Inni = base .. rule[5],
Isheen = base .. rule[6], Nuti = base .. rule[7], Isin = base .. rule[8], Isaan = base .. rule[9]
}
end
end
-- Kutaa 2ffaa: Gochimoota walakkaan jijjiiraman (Partial suffix matches)
local partial_rules = {
{"aaw", 3, "oofne", "oofte", "ooftan"}, {"caw", 2, "aane", "aate", "aatan"},
{"aw", 2, "oofne", "oofte", "ooftan"}, {"aay", 3, "oofne", "oofte", "ooftan"},
{"aah", 3, "oofne", "oofte", "ooftan"}, {"ooh", 3, "oone", "oote", "ootan"},
{"ah", 1, "ane", "ate", "atan"}, {"udha'", 1, "ane", "ate", "atan"},
{"aacha'", 2, "ofne", "ofte", "oftan"}, {"ooba'", 2, "ofne", "ofte", "oftan"},
{"dha'", 2, "oofne", "oofte", "ooftan"}, {"msha'", 2, "oofne", "oofte", "ooftan"},
{"iishaa'", 3, "ofne", "ofte", "oftan"}, {"ishaa'", 3, "oofne", "oofte", "ooftan"},
{"uushaa'", 3, "ofne", "ofte", "oftan"}, {"ushaa'", 3, "oofne", "oofte", "ooftan"},
{"uu'", 2, "une", "ute", "utan"}, {"u'", 1, "une", "ute", "utan"},
{"aari'", 1, "ne", "te", "tan"}, {"ooji'", 1, "ne", "te", "tan"},
{"i'", 1, "ine", "ite", "itan"}, {"aafa'", 2, "ofne", "ofte", "oftan"},
{"uufa'", 2, "ofne", "ofte", "oftan"}, {"uusa'", 2, "ofne", "ofte", "oftan"},
{"saasa'", 1, "ane", "ate", "atan"}, {"aassa'", 2, "ofne", "ofte", "oftan"},
{"eessa'", 2, "ofne", "ofte", "oftan"}, {"aasa'", 2, "ofne", "ofte", "oftan"},
{"akaa'", 3, "oofne", "oofte", "ooftan"}, {"naa'", 3, "oofne", "oofte", "ooftan"},
{"ana'", 3, "nofne", "nofte", "noftan"}, {"nna'", 3, "nofne", "nofte", "noftan"},
{"aara'", 2, "ofne", "ofte", "oftan"}, {"bja'", 2, "oofne", "oofte", "ooftan"},
{"jja'", 2, "ofne", "ofte", "oftan"}, {"oonja'", 2, "ofne", "ofte", "oftan"},
{"aaja'", 2, "ofne", "ofte", "oftan"}, {"ooja'", 2, "ofne", "ofte", "oftan"},
{"eeja'", 2, "ofne", "ofte", "oftan"}, {"ucca'", 2, "ofne", "ofte", "oftan"},
{"aanca'", 2, "ofne", "ofte", "oftan"}, {"aanxa'", 2, "ofne", "ofte", "oftan"},
{"aaxa'", 2, "ofne", "ofte", "oftan"}, {"eexa'", 2, "ofne", "ofte", "oftan"},
{"iixa'", 2, "ofne", "ofte", "oftan"}, {"ooxa'", 2, "ofne", "ofte", "oftan"},
{"uuxa'", 2, "ofne", "ofte", "oftan"}, {"uura'", 2, "ofne", "ofte", "oftan"},
{"eela'", 2, "ofne", "ofte", "oftan"}, {"kaakka'", 1, "ane", "ate", "atan"},
{"uuka'", 2, "ofne", "ofte", "oftan"}, {"okka'", 1, "ane", "ate", "atan"},
{"kkaa'", 3, "oofne", "oofte", "ooftan"}, {"ukaa'", 3, "oofne", "oofte", "ooftan"},
{"kaa'", 3, "eenye", "eesse", "eessan"}, {"ottaa'", 3, "oofne", "oofte", "ooftan"},
{"aadda'", 2, "ofne", "ofte", "oftan"}, {"dda'", 1, "ane", "ate", "atan"},
{"ooda'", 2, "ofne", "ofte", "oftan"}, {"eda'", 1, "ane", "ate", "atan"},
{"ida'", 1, "ane", "ate", "atan"}, {"da'", 2, "eenye", "eesse", "eessan"},
{"mtaa'", 3, "oofne", "oofte", "ooftan"}, {"taa'", 3, "eenye", "eesse", "eessan"},
{"nga'", 2, "ofne", "ofte", "oftan"}, {"maaga'", 2, "ofne", "ofte", "oftan"},
{"oga'", 2, "ofne", "ofte", "oftan"}, {"aanga'", 2, "ofne", "ofte", "oftan"},
{"anga'", 1, "ane", "ate", "atan"}, {"rga'", 1, "ane", "ate", "atan"},
{"alga'", 2, "eenye", "eesse", "eessan"}, {"lga'", 1, "ane", "ate", "atan"},
{"enga'", 1, "ane", "ate", "atan"}, {"dhaga'", 2, "eenye", "eesse", "eessan"},
{"eega'", 2, "ane", "ate", "atan"}, {"aga'", 1, "ane", "ate", "atan"},
{"gga'", 1, "ane", "ate", "atan"}, {"ga'", 2, "eenye", "eesse", "eessan"},
{"omma'", 2, "ane", "ate", "atan"}, {"mma'", 2, "ofne", "ofte", "oftan"},
{"uma'", 2, "oofne", "oofte", "ooftan"}, {"aarra'", 2, "ofne", "ofte", "oftan"},
{"aata'", 2, "ofne", "ofte", "oftan"}, {"iita'", 2, "ofne", "ofte", "oftan"},
{"uqqa'", 1, "ane", "ate", "atan"}, {"qa'", 2, "ofne", "ofte", "oftan"},
{"yaa'", 2, "ane", "ate", "atan"}, {"ooyya'", 2, "oofne", "oofte", "ooftan"},
{"aa'", 3, "oofne", "oofte", "ooftan"}, {"a'", 1, "ane", "ate", "atan"},
{"boo'", 1, "nye", "sse", "ssan"}, {"oo'", 1, "ne", "te", "tan"},
{"o'", 1, "one", "ote", "otan"}
}
local nuti, ati, ishee, isin
local matched = false
-- Dubbifamaa dachaa (Double Consonants Pattern)
if mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
nuti = root .. "ine"; ati = root .. "ite"; ishee = root .. "ite"; isin = root .. "itan"
matched = true
end
if not matched then
for _, rule in ipairs(partial_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
nuti = base .. rule[3]; ati = base .. rule[4]; ishee = base .. rule[4]; isin = base .. rule[5]
matched = true
break
end
end
end
-- Kutaa 3ffaa: Qubeewwan Dubbifamaa Qeenxee (Single Consonants Fallbacks)
if not matched then
if endsWith(root, "d") then
nuti = slice(root, 1) .. "nne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "l") then
nuti = root .. "le"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "b") then
nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "c") then
nuti = root .. "ne"; ati = root .. "ce"; ishee = root .. "ce"; isin = root .. "can"; matched = true
elseif endsWith(root, "g") then
nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "n") then
nuti = slice(root, 1) .. "nne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "m") then
nuti = slice(root, 1) .. "mne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "j") then
nuti = root .. "ne"; ati = root .. "je"; ishee = root .. "je"; isin = root .. "jan"; matched = true
elseif endsWith(root, "q") then
nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
elseif endsWith(root, "r") then
nuti = root .. "re"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "x") then
nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
end
end
-- Kutaa 4ffaa: Fallback Idilee (Default)
if not matched then
nuti = root .. "ne"
ati = root .. "te"
ishee = root .. "te"
isin = root .. "tan"
end
return {
Ani = root .. "e", Ati = ati, Inni = root .. "e",
Isheen = ishee, Nuti = nuti, Isin = isin, Isaan = root .. "an"
}
end
-- ===================================================
-- 3. KUTAA MOOJULII WAAMAMU (Main Generate Function)
-- ===================================================
function p.generate(frame)
local verb = frame.args[1] or frame.args.word or mw.title.getCurrentTitle().text
verb = mw.ustring.lower(mw.text.trim(verb))
-- "-uu" irraa kuta (Remove infinitive suffix)
local root = verb
if endsWith(verb, "uu") then
root = mw.ustring.sub(verb, 1, -3)
end
-- 1. Yeroo Darbee Eeyyamaa (Simple Past Affirmative)
local past_aff = get_past_forms(root)
-- 2. Yeroo Darbee Diigamaa (Negative past hundi isaa hin + nuti result ta'a)
local neg_base = "hin " .. past_aff.Nuti
local past_neg = {
Ani = neg_base, Ati = neg_base, Inni = neg_base,
Isheen = neg_base, Nuti = neg_base, Isin = neg_base, Isaan = neg_base
}
-- Gabatee Uumuu (Building the Wikitext Table)
local html = "{| class=\"wikitable\" style=\"text-align:center;\"\n"
html = html .. "|+ '''Bifa Diigamaa Gochima: " .. verb .. "'''\n"
html = html .. "! Bumbaa Maqaa !! Yeroo Darbee (Past) !! Yeroo Darbee Diigamaa (Neg. Past)\n"
local pronouns = {"Ani", "Ati", "Inni", "Isheen", "Nuti", "Isin", "Isaan"}
for _, p_name in ipairs(pronouns) do
html = html .. "|-\n! " .. p_name .. "\n| " .. past_aff[p_name] .. " || " .. past_neg[p_name] .. "\n"
end
html = html .. "|}"
return html
end
return p
mgo2iv0f0ugz3ja7t1a2tueoycn36l6
81958
81956
2026-07-01T20:36:33Z
EyobAbebe7
3540
81958
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. FUNCTIONS GARGAARTUU (Helper Functions)
-- ===================================================
local function endsWith(str, suffix)
return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix
end
local function slice(str, cut)
if cut == 0 then return str end
return mw.ustring.sub(str, 1, -(cut + 1))
end
-- ===================================================
-- 2. SEERA YEROO DARBEE (Simple Past Tense Logic)
-- ===================================================
local function get_past_forms(root)
-- Kutaa 1ffaa: Gochimoota seera guutuu jijjiiran (Full form overrides)
local full_rules = {
{"ooch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"och", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"ach", 2, "dhe", "tte", "te", "tte", "nne", "ttan", "tan"},
{"eech", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"ech", 2, "dhe", "tte", "dhe", "tte", "nne", "ttan", "dhan"},
{"kuch", 2, "te", "tte", "te", "tte", "nne", "ttan", "tan"},
{"uch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"odh", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"uudh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"udh", 2, "dhe", "ute", "dhe", "ute", "une", "utan", "dhan"},
{"iidh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"idh", 2, "dhe", "ite", "dhe", "ite", "ine", "itan", "dhan"},
{"aadh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"adh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"eedh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"edh", 2, "dhe", "ete", "dhe", "ete", "ene", "etan", "dhan"},
{"sh", 0, "e", "te", "e", "te", "ne", "tan", "an"},
{"ny", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"uuph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"iph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"yy", 0, "e", "ite", "e", "ite", "ine", "itan", "an"}
}
for _, rule in ipairs(full_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
return {
Ani = base .. rule[3], Ati = base .. rule[4], Inni = base .. rule[5],
Isheen = base .. rule[6], Nuti = base .. rule[7], Isin = base .. rule[8], Isaan = base .. rule[9]
}
end
end
-- Kutaa 2ffaa: Gochimoota walakkaan jijjiiraman (Partial suffix matches)
local partial_rules = {
{"aaw", 3, "oofne", "oofte", "ooftan"}, {"caw", 2, "aane", "aate", "aatan"},
{"aw", 2, "oofne", "oofte", "ooftan"}, {"aay", 3, "oofne", "oofte", "ooftan"},
{"aah", 3, "oofne", "oofte", "ooftan"}, {"ooh", 3, "oone", "oote", "ootan"},
{"ah", 1, "ane", "ate", "atan"}, {"udha'", 1, "ane", "ate", "atan"},
{"aacha'", 2, "ofne", "ofte", "oftan"}, {"ooba'", 2, "ofne", "ofte", "oftan"},
{"dha'", 2, "oofne", "oofte", "ooftan"}, {"msha'", 2, "oofne", "oofte", "ooftan"},
{"iishaa'", 3, "ofne", "ofte", "oftan"}, {"ishaa'", 3, "oofne", "oofte", "ooftan"},
{"uushaa'", 3, "ofne", "ofte", "oftan"}, {"ushaa'", 3, "oofne", "oofte", "ooftan"},
{"uu'", 2, "une", "ute", "utan"}, {"u'", 1, "une", "ute", "utan"},
{"aari'", 1, "ne", "te", "tan"}, {"ooji'", 1, "ne", "te", "tan"},
{"i'", 1, "ine", "ite", "itan"}, {"aafa'", 2, "ofne", "ofte", "oftan"},
{"uufa'", 2, "ofne", "ofte", "oftan"}, {"uusa'", 2, "ofne", "ofte", "oftan"},
{"saasa'", 1, "ane", "ate", "atan"}, {"aassa'", 2, "ofne", "ofte", "oftan"},
{"eessa'", 2, "ofne", "ofte", "oftan"}, {"aasa'", 2, "ofne", "ofte", "oftan"},
{"akaa'", 3, "oofne", "oofte", "ooftan"}, {"naa'", 3, "oofne", "oofte", "ooftan"},
{"ana'", 3, "nofne", "nofte", "noftan"}, {"nna'", 3, "nofne", "nofte", "noftan"},
{"aara'", 2, "ofne", "ofte", "oftan"}, {"bja'", 2, "oofne", "oofte", "ooftan"},
{"jja'", 2, "ofne", "ofte", "oftan"}, {"oonja'", 2, "ofne", "ofte", "oftan"},
{"aaja'", 2, "ofne", "ofte", "oftan"}, {"ooja'", 2, "ofne", "ofte", "oftan"},
{"eeja'", 2, "ofne", "ofte", "oftan"}, {"ucca'", 2, "ofne", "ofte", "oftan"},
{"aanca'", 2, "ofne", "ofte", "oftan"}, {"aanxa'", 2, "ofne", "ofte", "oftan"},
{"aaxa'", 2, "ofne", "ofte", "oftan"}, {"eexa'", 2, "ofne", "ofte", "oftan"},
{"iixa'", 2, "ofne", "ofte", "oftan"}, {"ooxa'", 2, "ofne", "ofte", "oftan"},
{"uuxa'", 2, "ofne", "ofte", "oftan"}, {"uura'", 2, "ofne", "ofte", "oftan"},
{"eela'", 2, "ofne", "ofte", "oftan"}, {"kaakka'", 1, "ane", "ate", "atan"},
{"uuka'", 2, "ofne", "ofte", "oftan"}, {"okka'", 1, "ane", "ate", "atan"},
{"kkaa'", 3, "oofne", "oofte", "ooftan"}, {"ukaa'", 3, "oofne", "oofte", "ooftan"},
{"kaa'", 3, "eenye", "eesse", "eessan"}, {"ottaa'", 3, "oofne", "oofte", "ooftan"},
{"aadda'", 2, "ofne", "ofte", "oftan"}, {"dda'", 1, "ane", "ate", "atan"},
{"ooda'", 2, "ofne", "ofte", "oftan"}, {"eda'", 1, "ane", "ate", "atan"},
{"ida'", 1, "ane", "ate", "atan"}, {"da'", 2, "eenye", "eesse", "eessan"},
{"mtaa'", 3, "oofne", "oofte", "ooftan"}, {"taa'", 3, "eenye", "eesse", "eessan"},
{"nga'", 2, "ofne", "ofte", "oftan"}, {"maaga'", 2, "ofne", "ofte", "oftan"},
{"oga'", 2, "ofne", "ofte", "oftan"}, {"aanga'", 2, "ofne", "ofte", "oftan"},
{"anga'", 1, "ane", "ate", "atan"}, {"rga'", 1, "ane", "ate", "atan"},
{"alga'", 2, "eenye", "eesse", "eessan"}, {"lga'", 1, "ane", "ate", "atan"},
{"enga'", 1, "ane", "ate", "atan"}, {"dhaga'", 2, "eenye", "eesse", "eessan"},
{"eega'", 2, "ane", "ate", "atan"}, {"aga'", 1, "ane", "ate", "atan"},
{"gga'", 1, "ane", "ate", "atan"}, {"ga'", 2, "eenye", "eesse", "eessan"},
{"omma'", 2, "ane", "ate", "atan"}, {"mma'", 2, "ofne", "ofte", "oftan"},
{"uma'", 2, "oofne", "oofte", "ooftan"}, {"aarra'", 2, "ofne", "ofte", "oftan"},
{"aata'", 2, "ofne", "ofte", "oftan"}, {"iita'", 2, "ofne", "ofte", "oftan"},
{"uqqa'", 1, "ane", "ate", "atan"}, {"qa'", 2, "ofne", "ofte", "oftan"},
{"yaa'", 2, "ane", "ate", "atan"}, {"ooyya'", 2, "oofne", "oofte", "ooftan"},
{"aa'", 3, "oofne", "oofte", "ooftan"}, {"a'", 1, "ane", "ate", "atan"},
{"boo'", 1, "nye", "sse", "ssan"}, {"oo'", 1, "ne", "te", "tan"},
{"o'", 1, "one", "ote", "otan"}
}
local nuti, ati, ishee, isin
local matched = false
-- Dubbifamaa dachaa (Double Consonants Pattern)
if mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
nuti = root .. "ine"; ati = root .. "ite"; ishee = root .. "ite"; isin = root .. "itan"
matched = true
end
if not matched then
for _, rule in ipairs(partial_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
nuti = base .. rule[3]; ati = base .. rule[4]; ishee = base .. rule[4]; isin = base .. rule[5]
matched = true
break
end
end
end
-- Kutaa 3ffaa: Qubeewwan Dubbifamaa Qeenxee (Single Consonants Fallbacks)
if not matched then
if endsWith(root, "d") then
nuti = slice(root, 1) .. "nne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "l") then
nuti = root .. "le"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "b") then
nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "c") then
nuti = root .. "ne"; ati = root .. "ce"; ishee = root .. "ce"; isin = root .. "can"; matched = true
elseif endsWith(root, "g") then
nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "n") then
nuti = slice(root, 1) .. "nne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "m") then
nuti = slice(root, 1) .. "mne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "j") then
nuti = root .. "ne"; ati = root .. "je"; ishee = root .. "je"; isin = root .. "jan"; matched = true
elseif endsWith(root, "q") then
nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
elseif endsWith(root, "r") then
nuti = root .. "re"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "x") then
nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
end
end
-- Kutaa 4ffaa: Fallback Idilee (Default)
if not matched then
nuti = root .. "ne"
ati = root .. "te"
ishee = root .. "te"
isin = root .. "tan"
end
return {
Ani = root .. "e", Ati = ati, Inni = root .. "e",
Isheen = ishee, Nuti = nuti, Isin = isin, Isaan = root .. "an"
}
end
-- ===================================================
-- 3. KUTAA MOOJULII WAAMAMU (Main Generate Function)
-- ===================================================
function p.generate(frame)
local verb = frame.args[1] or frame.args.word or mw.title.getCurrentTitle().text
verb = mw.ustring.lower(mw.text.trim(verb))
-- "-uu" irraa kuta (Remove infinitive suffix)
local root = verb
if endsWith(verb, "uu") then
root = mw.ustring.sub(verb, 1, -3)
end
-- 1. Yeroo Darbee Eeyyamaa (Simple Past Affirmative)
local past_aff = get_past_forms(root)
-- 2. Yeroo Darbee Diigamaa (Negative past hundi isaa hin + nuti result ta'a)
local neg_word = past_aff.Nuti
-- Gabatee Uumuu (Building the Wikitext Table)
local html = "{| class=\"wikitable\" style=\"text-align:center;\"\n"
html = html .. "|+ '''Jijjiirama Gochimaa: [[" .. verb .. "]]'''\n"
html = html .. "! Bumbaa Maqaa !! Yeroo Darbee (Past) !! Yeroo Darbee Diigamaa (Neg. Past)\n"
local pronouns = {"Ani", "Ati", "Inni", "Isheen", "Nuti", "Isin", "Isaan"}
for _, p_name in ipairs(pronouns) do
-- Geessituu (Links) itti dabaluu
local aff_link = "[[" .. past_aff[p_name] .. "]]"
local neg_link = "[[hin]] [[" .. neg_word .. "]]"
html = html .. "|-\n! " .. p_name .. "\n| " .. aff_link .. " || " .. neg_link .. "\n"
end
html = html .. "|}"
return html
end
return p
4cpochnbf4sum0h67x1ys62lzbpazry
81960
81958
2026-07-01T20:52:06Z
EyobAbebe7
3540
81960
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. FUNCTIONS GARGAARTUU (Helper Functions)
-- ===================================================
local function endsWith(str, suffix)
return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix
end
local function slice(str, cut)
if cut == 0 then return str end
return mw.ustring.sub(str, 1, -(cut + 1))
end
-- ===================================================
-- 2. SEERA YEROO DARBEE (Simple Past Tense Logic)
-- ===================================================
local function get_past_forms(root)
-- Kutaa 1ffaa: Gochimoota seera guutuu jijjiiran (Full form overrides)
local full_rules = {
{"ooch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"och", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"ach", 2, "dhe", "tte", "te", "tte", "nne", "ttan", "tan"},
{"eech", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"ech", 2, "dhe", "tte", "dhe", "tte", "nne", "ttan", "dhan"},
{"kuch", 2, "te", "tte", "te", "tte", "nne", "ttan", "tan"},
{"uch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"odh", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"uudh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"udh", 2, "dhe", "ute", "dhe", "ute", "une", "utan", "dhan"},
{"iidh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"idh", 2, "dhe", "ite", "dhe", "ite", "ine", "itan", "dhan"},
{"aadh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"adh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"eedh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"edh", 2, "dhe", "ete", "dhe", "ete", "ene", "etan", "dhan"},
{"sh", 0, "e", "te", "e", "te", "ne", "tan", "an"},
{"ny", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"uuph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"iph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"yy", 0, "e", "ite", "e", "ite", "ine", "itan", "an"}
}
for _, rule in ipairs(full_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
return {
Ani = base .. rule[3], Ati = base .. rule[4], Inni = base .. rule[5],
Isheen = base .. rule[6], Nuti = base .. rule[7], Isin = base .. rule[8], Isaan = base .. rule[9]
}
end
end
-- Kutaa 2ffaa: Gochimoota walakkaan jijjiiraman (Partial suffix matches)
local partial_rules = {
{"aaw", 3, "oofne", "oofte", "ooftan"}, {"caw", 2, "aane", "aate", "aatan"},
{"aw", 2, "oofne", "oofte", "ooftan"}, {"aay", 3, "oofne", "oofte", "ooftan"},
{"aah", 3, "oofne", "oofte", "ooftan"}, {"ooh", 3, "oone", "oote", "ootan"},
{"ah", 1, "ane", "ate", "atan"}, {"udha'", 1, "ane", "ate", "atan"},
{"aacha'", 2, "ofne", "ofte", "oftan"}, {"ooba'", 2, "ofne", "ofte", "oftan"},
{"dha'", 2, "oofne", "oofte", "ooftan"}, {"msha'", 2, "oofne", "oofte", "ooftan"},
{"iishaa'", 3, "ofne", "ofte", "oftan"}, {"ishaa'", 3, "oofne", "oofte", "ooftan"},
{"uushaa'", 3, "ofne", "ofte", "oftan"}, {"ushaa'", 3, "oofne", "oofte", "ooftan"},
{"uu'", 2, "une", "ute", "utan"}, {"u'", 1, "une", "ute", "utan"},
{"aari'", 1, "ne", "te", "tan"}, {"ooji'", 1, "ne", "te", "tan"},
{"i'", 1, "ine", "ite", "itan"}, {"aafa'", 2, "ofne", "ofte", "oftan"},
{"uufa'", 2, "ofne", "ofte", "oftan"}, {"uusa'", 2, "ofne", "ofte", "oftan"},
{"saasa'", 1, "ane", "ate", "atan"}, {"aassa'", 2, "ofne", "ofte", "oftan"},
{"eessa'", 2, "ofne", "ofte", "oftan"}, {"aasa'", 2, "ofne", "ofte", "oftan"},
{"akaa'", 3, "oofne", "oofte", "ooftan"}, {"naa'", 3, "oofne", "oofte", "ooftan"},
{"ana'", 3, "nofne", "nofte", "noftan"}, {"nna'", 3, "nofne", "nofte", "noftan"},
{"aara'", 2, "ofne", "ofte", "oftan"}, {"bja'", 2, "oofne", "oofte", "ooftan"},
{"jja'", 2, "ofne", "ofte", "oftan"}, {"oonja'", 2, "ofne", "ofte", "oftan"},
{"aaja'", 2, "ofne", "ofte", "oftan"}, {"ooja'", 2, "ofne", "ofte", "oftan"},
{"eeja'", 2, "ofne", "ofte", "oftan"}, {"ucca'", 2, "ofne", "ofte", "oftan"},
{"aanca'", 2, "ofne", "ofte", "oftan"}, {"aanxa'", 2, "ofne", "ofte", "oftan"},
{"aaxa'", 2, "ofne", "ofte", "oftan"}, {"eexa'", 2, "ofne", "ofte", "oftan"},
{"iixa'", 2, "ofne", "ofte", "oftan"}, {"ooxa'", 2, "ofne", "ofte", "oftan"},
{"uuxa'", 2, "ofne", "ofte", "oftan"}, {"uura'", 2, "ofne", "ofte", "oftan"},
{"eela'", 2, "ofne", "ofte", "oftan"}, {"kaakka'", 1, "ane", "ate", "atan"},
{"uuka'", 2, "ofne", "ofte", "oftan"}, {"okka'", 1, "ane", "ate", "atan"},
{"kkaa'", 3, "oofne", "oofte", "ooftan"}, {"ukaa'", 3, "oofne", "oofte", "ooftan"},
{"kaa'", 3, "eenye", "eesse", "eessan"}, {"ottaa'", 3, "oofne", "oofte", "ooftan"},
{"aadda'", 2, "ofne", "ofte", "oftan"}, {"dda'", 1, "ane", "ate", "atan"},
{"ooda'", 2, "ofne", "ofte", "oftan"}, {"eda'", 1, "ane", "ate", "atan"},
{"ida'", 1, "ane", "ate", "atan"}, {"da'", 2, "eenye", "eesse", "eessan"},
{"mtaa'", 3, "oofne", "oofte", "ooftan"}, {"taa'", 3, "eenye", "eesse", "eessan"},
{"nga'", 2, "ofne", "ofte", "oftan"}, {"maaga'", 2, "ofne", "ofte", "oftan"},
{"oga'", 2, "ofne", "ofte", "oftan"}, {"aanga'", 2, "ofne", "ofte", "oftan"},
{"anga'", 1, "ane", "ate", "atan"}, {"rga'", 1, "ane", "ate", "atan"},
{"alga'", 2, "eenye", "eesse", "eessan"}, {"lga'", 1, "ane", "ate", "atan"},
{"enga'", 1, "ane", "ate", "atan"}, {"dhaga'", 2, "eenye", "eesse", "eessan"},
{"eega'", 2, "ane", "ate", "atan"}, {"aga'", 1, "ane", "ate", "atan"},
{"gga'", 1, "ane", "ate", "atan"}, {"ga'", 2, "eenye", "eesse", "eessan"},
{"omma'", 2, "ane", "ate", "atan"}, {"mma'", 2, "ofne", "ofte", "oftan"},
{"uma'", 2, "oofne", "oofte", "ooftan"}, {"aarra'", 2, "ofne", "ofte", "oftan"},
{"aata'", 2, "ofne", "ofte", "oftan"}, {"iita'", 2, "ofne", "ofte", "oftan"},
{"uqqa'", 1, "ane", "ate", "atan"}, {"qa'", 2, "ofne", "ofte", "oftan"},
{"yaa'", 2, "ane", "ate", "atan"}, {"ooyya'", 2, "oofne", "oofte", "ooftan"},
{"aa'", 3, "oofne", "oofte", "ooftan"}, {"a'", 1, "ane", "ate", "atan"},
{"boo'", 1, "nye", "sse", "ssan"}, {"oo'", 1, "ne", "te", "tan"},
{"o'", 1, "one", "ote", "otan"}
}
local nuti, ati, ishee, isin
local matched = false
-- Dubbifamaa dachaa (Double Consonants Pattern)
if mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
nuti = root .. "ine"; ati = root .. "ite"; ishee = root .. "ite"; isin = root .. "itan"
matched = true
end
if not matched then
for _, rule in ipairs(partial_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
nuti = base .. rule[3]; ati = base .. rule[4]; ishee = base .. rule[4]; isin = base .. rule[5]
matched = true
break
end
end
end
-- Kutaa 3ffaa: Qubeewwan Dubbifamaa Qeenxee (Single Consonants Fallbacks)
if not matched then
if endsWith(root, "d") then
nuti = slice(root, 1) .. "nne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "l") then
nuti = root .. "le"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "b") then
nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "c") then
nuti = root .. "ne"; ati = root .. "ce"; ishee = root .. "ce"; isin = root .. "can"; matched = true
elseif endsWith(root, "g") then
nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "n") then
nuti = slice(root, 1) .. "nne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "m") then
nuti = slice(root, 1) .. "mne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "j") then
nuti = root .. "ne"; ati = root .. "je"; ishee = root .. "je"; isin = root .. "jan"; matched = true
elseif endsWith(root, "q") then
nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
elseif endsWith(root, "r") then
nuti = root .. "re"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "x") then
nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
end
end
-- Kutaa 4ffaa: Fallback Idilee (Default)
if not matched then
nuti = root .. "ne"
ati = root .. "te"
ishee = root .. "te"
isin = root .. "tan"
end
return {
Ani = root .. "e", Ati = ati, Inni = root .. "e",
Isheen = ishee, Nuti = nuti, Isin = isin, Isaan = root .. "an"
}
end
-- ===================================================
-- 3. KUTAA MOOJULII WAAMAMU (Main Generate Function)
-- ===================================================
function p.generate(frame)
-- Template irraa ragaa argachuu ykn kallattiin argachuu
local args = frame.args
if frame:getParent() then
args = frame:getParent().args
end
-- Jecha parameter 1ffaa ykn maqaa fuulaa irraa fudhachuu
local verb = args[1] or args.word
if not verb or mw.text.trim(verb) == "" then
verb = mw.title.getCurrentTitle().text
end
verb = mw.ustring.lower(mw.text.trim(verb))
-- "-uu" irraa kuta (Remove infinitive suffix)
local root = verb
if endsWith(verb, "uu") then
root = mw.ustring.sub(verb, 1, -3)
end
-- 1. Yeroo Darbee Eeyyamaa (Simple Past Affirmative)
local past_aff = get_past_forms(root)
-- 2. Yeroo Darbee Diigamaa (Negative past hundi isaa hin + nuti result ta'a)
local neg_word = past_aff.Nuti
-- Gabatee Uumuu (Building the Wikitext Table)
local html = "{| class=\"wikitable\" style=\"text-align:center;\"\n"
html = html .. "|+ '''Jijjiirama Gochimaa: [[" .. verb .. "]]'''\n"
html = html .. "! Bumbaa Maqaa !! Yeroo Darbee (Past) !! Yeroo Darbee Diigamaa (Neg. Past)\n"
local pronouns = {"Ani", "Ati", "Inni", "Isheen", "Nuti", "Isin", "Isaan"}
for _, p_name in ipairs(pronouns) do
-- Geessituu (Links) itti dabaluu
local aff_link = "[[" .. past_aff[p_name] .. "]]"
local neg_link = "[[hin]] [[" .. neg_word .. "]]"
html = html .. "|-\n! " .. p_name .. "\n| " .. aff_link .. " || " .. neg_link .. "\n"
end
html = html .. "|}"
return html
end
return p
qllj8w3nklxbhx8da1szk5r3lry8iv4
Template:Om-conjug
10
62064
81963
81947
2026-07-02T03:35:50Z
EyobAbebe7
3540
/* */
81963
wikitext
text/x-wiki
<includeonly>{{#invoke:Om-conjug|generate}}</includeonly><includeonly>{{#invoke:Om-imp|generate}}</includeonly><noinclude>
{{Documentation|content=
== Fayyadama (Usage) ==
Template kun gochimoota Afaan Oromoo (Oromo verbs) haala yeroo garaa garaatiin (Tenses) diiguuf (conjugate) gargaara.
=== Haala itti fayyadamnu ===
Fuula gochimaa tokko irratti (fakkeenyaaf fuula "deemuu" jedhu irratti), koodii armaan gadii qofa barreessaa:
<code><nowiki>{{Om-conjug}}</nowiki></code>
Yookiin, fuula biraa irra teessanii gochima barbaaddan tokkoof gabatee uumuu yoo barbaaddan, maqaa gochimichaa itti dabaluun akkasitti barreessaa:
<code><nowiki>{{Om-conjug|deemuu}}</nowiki></code>
<code><nowiki>{{Om-conjug|word=nyaachuu}}</nowiki></code>
}}
</noinclude>
c7qwv1nlijnzlvcvmbyejqaxy5d39po
81973
81963
2026-07-02T07:55:27Z
EyobAbebe7
3540
/* */
81973
wikitext
text/x-wiki
<includeonly>{{#invoke:Om-conjug|generate}}</includeonly><includeonly>{{#invoke: Present|generate}}</includeonly><includeonly>{{#invoke:Om-imp|generate}}</includeonly><noinclude>
{{Documentation|content=
== Fayyadama (Usage) ==
Template kun gochimoota Afaan Oromoo (Oromo verbs) haala yeroo garaa garaatiin (Tenses) diiguuf (conjugate) gargaara.
=== Haala itti fayyadamnu ===
Fuula gochimaa tokko irratti (fakkeenyaaf fuula "deemuu" jedhu irratti), koodii armaan gadii qofa barreessaa:
<code><nowiki>{{Om-conjug}}</nowiki></code>
Yookiin, fuula biraa irra teessanii gochima barbaaddan tokkoof gabatee uumuu yoo barbaaddan, maqaa gochimichaa itti dabaluun akkasitti barreessaa:
<code><nowiki>{{Om-conjug|deemuu}}</nowiki></code>
<code><nowiki>{{Om-conjug|word=nyaachuu}}</nowiki></code>
}}
</noinclude>
63xslrwpp2vyu52cy9mtbfl2tzxmhrw
81976
81973
2026-07-02T09:13:11Z
EyobAbebe7
3540
/* */
81976
wikitext
text/x-wiki
<includeonly>{{#invoke:Om-conjug|generate}}</includeonly><includeonly>{{#invoke: Present|generate}}</includeonly><includeonly>{{#invoke: Perf|generate}}</includeonly><includeonly>{{#invoke:Om-imp|generate}}</includeonly><noinclude>
{{Documentation|content=
== Fayyadama (Usage) ==
Template kun gochimoota Afaan Oromoo (Oromo verbs) haala yeroo garaa garaatiin (Tenses) diiguuf (conjugate) gargaara.
=== Haala itti fayyadamnu ===
Fuula gochimaa tokko irratti (fakkeenyaaf fuula "deemuu" jedhu irratti), koodii armaan gadii qofa barreessaa:
<code><nowiki>{{Om-conjug}}</nowiki></code>
Yookiin, fuula biraa irra teessanii gochima barbaaddan tokkoof gabatee uumuu yoo barbaaddan, maqaa gochimichaa itti dabaluun akkasitti barreessaa:
<code><nowiki>{{Om-conjug|deemuu}}</nowiki></code>
<code><nowiki>{{Om-conjug|word=nyaachuu}}</nowiki></code>
}}
</noinclude>
gbnk3ox0c9umeh4p3go7ejy60akog9r
81982
81976
2026-07-02T10:38:01Z
EyobAbebe7
3540
/* */
81982
wikitext
text/x-wiki
<includeonly>{{#invoke:Om-conjug|generate}}</includeonly><includeonly>{{#invoke: Present|generate}}</includeonly><includeonly>{{#invoke:Perf|generate}}</includeonly><includeonly>{{#invoke:Continue|generate}}</includeonly><includeonly>{{#invoke:Om-imp|generate}}</includeonly><noinclude>
{{Documentation|content=
== Fayyadama (Usage) ==
Template kun gochimoota Afaan Oromoo (Oromo verbs) haala yeroo garaa garaatiin (Tenses) diiguuf (conjugate) gargaara.
=== Haala itti fayyadamnu ===
Fuula gochimaa tokko irratti (fakkeenyaaf fuula "deemuu" jedhu irratti), koodii armaan gadii qofa barreessaa:
<code><nowiki>{{Om-conjug}}</nowiki></code>
Yookiin, fuula biraa irra teessanii gochima barbaaddan tokkoof gabatee uumuu yoo barbaaddan, maqaa gochimichaa itti dabaluun akkasitti barreessaa:
<code><nowiki>{{Om-conjug|deemuu}}</nowiki></code>
<code><nowiki>{{Om-conjug|word=nyaachuu}}</nowiki></code>
}}
</noinclude>
06j16u8bqnukhhx7r091kpqns6u6qtv
Module:Om-imp
828
62066
81962
2026-07-02T03:32:25Z
EyobAbebe7
3540
Created page with "local p = {} -- =================================================== -- 1. FUNCTIONS GARGAARTUU (Helper Functions) -- =================================================== local function endsWith(str, suffix) return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix end -- =================================================== -- 2. SEERA AJAJAA (Imperative Form Logic) -- =================================================== local function get_imperative_forms(root)..."
81962
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. FUNCTIONS GARGAARTUU (Helper Functions)
-- ===================================================
local function endsWith(str, suffix)
return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix
end
-- ===================================================
-- 2. SEERA AJAJAA (Imperative Form Logic)
-- ===================================================
local function get_imperative_forms(root)
-- Gochimoota dubbifamaa fi 'ch' dhaan xumuraman (Fkn: bitachuu -> root: bitach)
if mw.ustring.match(root, "[aeiou]ch$") then
local base = mw.ustring.sub(root, 1, -3) -- fkn: bita
local stem = mw.ustring.sub(root, 1, -4) -- fkn: bit
local vowel = mw.ustring.sub(root, -3, -3) -- fkn: a
return {
Ati_aff = base .. "dhu",
Isin_aff = base .. "dhaa",
Ati_neg_word = stem .. vowel .. "tin",
Isin_neg_word = stem .. vowel .. "tinaa"
}
end
-- Haala Idilee (Default) (Fkn: deemuu -> root: deem)
return {
Ati_aff = root .. "i",
Isin_aff = root .. "aa",
Ati_neg_word = root .. "in",
Isin_neg_word = root .. "inaa"
}
end
-- ===================================================
-- 3. KUTAA MOOJULII WAAMAMU (Main Generate Function)
-- ===================================================
function p.generate(frame)
-- Template irraa ragaa argachuu ykn kallattiin argachuu
local args = frame.args
if frame:getParent() then
args = frame:getParent().args
end
-- Jecha parameter 1ffaa ykn maqaa fuulaa irraa fudhachuu
local verb = args[1] or args.word
if not verb or mw.text.trim(verb) == "" then
verb = mw.title.getCurrentTitle().text
end
verb = mw.ustring.lower(mw.text.trim(verb))
-- "-uu" irraa kuta (Remove infinitive suffix)
local root = verb
if endsWith(verb, "uu") then
root = mw.ustring.sub(verb, 1, -3)
end
-- Ragaa Ajajaa argachuu
local cmd = get_imperative_forms(root)
-- Gabatee Uumuu (Building the Wikitext Table)
local html = "{| class=\"wikitable\" style=\"text-align:center;\"\n"
html = html .. "|+ '''Bifa Ajajaa Gochimaa: [[" .. verb .. "]]'''\n"
html = html .. "! Bumbaa Maqaa !! Ajajaa Eeyyamaa (Affirmative) !! Ajajaa Diigamaa (Negative)\n"
-- 1. Ati (Singular)
local ati_aff_link = "[[" .. cmd.Ati_aff .. "]]"
local ati_neg_link = "[[hin]] [[" .. cmd.Ati_neg_word .. "]]"
html = html .. "|-\n! Ati (Qeenxee)\n| " .. ati_aff_link .. " || " .. ati_neg_link .. "\n"
-- 2. Isin (Plural / Respectful)
local isin_aff_link = "[[" .. cmd.Isin_aff .. "]]"
local isin_neg_link = "[[hin]] [[" .. cmd.Isin_neg_word .. "]]"
html = html .. "|-\n! Isin (Dachaa/Kabaja)\n| " .. isin_aff_link .. " || " .. isin_neg_link .. "\n"
html = html .. "|}"
return html
end
return p
gzm2ph82q18lztzrp1i1w5ifti1bfos
81964
81962
2026-07-02T03:56:55Z
EyobAbebe7
3540
81964
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. FUNCTIONS GARGAARTUU (Helper Functions)
-- ===================================================
local function endsWith(str, suffix)
return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix
end
-- ===================================================
-- 2. SEERA AJAJAA (Imperative Form Logic)
-- ===================================================
local function get_imperative_forms(root, irreg_imp)
local ati_aff, isin_aff, ati_neg, isin_neg
-- Kutaa 1: Gochimoota 'ch' dhaan xumuraman
if mw.ustring.match(root, "[aeiou]ch$") then
local base = mw.ustring.sub(root, 1, -3) -- fkn: bita
local stem = mw.ustring.sub(root, 1, -4) -- fkn: bit
local vowel = mw.ustring.sub(root, -3, -3) -- fkn: a
-- Diigamaan yeroo hunda idilee dha
ati_neg = stem .. vowel .. "tin"
isin_neg = stem .. vowel .. "tinaa"
-- Yoo jechi addaa (Parameter 2ffaa) kennameera ta'e
if irreg_imp and mw.text.trim(irreg_imp) ~= "" then
ati_aff = mw.text.trim(irreg_imp)
-- Dubbachiiftuu xumuraa [a,e,i,o,u] haquun 'aa' itti dabala
isin_aff = mw.ustring.gsub(ati_aff, "[aeiou]+$", "aa")
else
ati_aff = base .. "dhu"
isin_aff = base .. "dhaa"
end
-- Kutaa 2: Haala Idilee (Default)
else
-- Diigamaan yeroo hunda idilee dha
ati_neg = root .. "in"
isin_neg = root .. "inaa"
-- Yoo jechi addaa (Parameter 2ffaa) kennameera ta'e
if irreg_imp and mw.text.trim(irreg_imp) ~= "" then
ati_aff = mw.text.trim(irreg_imp)
-- Dubbachiiftuu xumuraa hunda [aeiou] haquun 'aa' itti dabala
isin_aff = mw.ustring.gsub(ati_aff, "[aeiou]+$", "aa")
else
ati_aff = root .. "i"
isin_aff = root .. "aa"
end
end
return {
Ati_aff = ati_aff,
Isin_aff = isin_aff,
Ati_neg_word = ati_neg,
Isin_neg_word = isin_neg
}
end
-- ===================================================
-- 3. KUTAA MOOJULII WAAMAMU (Main Generate Function)
-- ===================================================
function p.generate(frame)
-- Template irraa ragaa argachuu
local args = frame.args
if frame:getParent() then
args = frame:getParent().args
end
-- 1. Maqaa gochimaa (Parameter 1ffaa)
local verb = args[1] or args.word
if not verb or mw.text.trim(verb) == "" then
verb = mw.title.getCurrentTitle().text
end
verb = mw.ustring.lower(mw.text.trim(verb))
-- 2. Jecha Ajajaa Addaa (Irregular Imperative - Parameter 2ffaa)
local irreg_imp = args[2]
-- "-uu" irraa kuta (Remove infinitive suffix)
local root = verb
if endsWith(verb, "uu") then
root = mw.ustring.sub(verb, 1, -3)
end
-- Ragaa Ajajaa argachuu
local cmd = get_imperative_forms(root, irreg_imp)
-- Gabatee Uumuu (Building the Wikitext Table)
local html = "{| class=\"wikitable\" style=\"text-align:center;\"\n"
html = html .. "|+ '''Bifa Ajajaa Gochimaa: [[" .. verb .. "]]'''\n"
html = html .. "! Bumbaa Maqaa !! Ajajaa Eeyyamaa (Affirmative) !! Ajajaa Diigamaa (Negative)\n"
-- Ati (Qeenxee)
local ati_aff_link = "[[" .. cmd.Ati_aff .. "]]"
local ati_neg_link = "[[hin]] [[" .. cmd.Ati_neg_word .. "]]"
html = html .. "|-\n! Ati (Qeenxee)\n| " .. ati_aff_link .. " || " .. ati_neg_link .. "\n"
-- Isin (Dachaa/Kabaja)
local isin_aff_link = "[[" .. cmd.Isin_aff .. "]]"
local isin_neg_link = "[[hin]] [[" .. cmd.Isin_neg_word .. "]]"
html = html .. "|-\n! Isin (Dachaa/Kabaja)\n| " .. isin_aff_link .. " || " .. isin_neg_link .. "\n"
html = html .. "|}"
return html
end
return p
qwe06rovzh9euz34l30rv7348cifulv
Module:Numbers
828
62067
81969
2026-07-02T04:44:30Z
EyobAbebe7
3540
Created page with "local p = {} -- ===================================== -- DATA -- ===================================== local ones = { "zeeroo", "tokko", "lama", "sadii", "afur", "shan", "jaha", "torba", "saddeet", "sagal" } local oneSuffix = { "zeeroo", "tokkoo", "lamaa", "sadii", "afurii", "shanii", "jahaa", "torbaa", "saddeetii", "sagalii" } local tensBase = { "kudhan", "digdama", "soddoma"..."
81969
Scribunto
text/plain
local p = {}
-- =====================================
-- DATA
-- =====================================
local ones = {
"zeeroo",
"tokko",
"lama",
"sadii",
"afur",
"shan",
"jaha",
"torba",
"saddeet",
"sagal"
}
local oneSuffix = {
"zeeroo",
"tokkoo",
"lamaa",
"sadii",
"afurii",
"shanii",
"jahaa",
"torbaa",
"saddeetii",
"sagalii"
}
local tensBase = {
"kudhan",
"digdama",
"soddoma",
"afurtama",
"shantama",
"jahaatama",
"torbaatama",
"saddeettama",
"sagaltama"
}
local tensBaseSuffix = {
"kudhanii",
"digdamaa",
"soddomaa",
"afurtamaa",
"shantamaa",
"jahaatamaa",
"torbaatamaa",
"saddeettamaa",
"sagaltamaa"
}
local tensWithSuffix = {
"kudha",
"digdamii",
"soddomii",
"afurtamii",
"shantamii",
"jahaatamii",
"torbaatamii",
"saddeettamii",
"sagaltamii"
}
local hundreds = {"dhibba"}
local thousand = {"kuma"}
local million = {"miiliyoona"}
local billion = {"biiliyoona"}
local trillion = {"tiriliyoona"}
-- =====================================
-- 1 - 99
-- =====================================
local function under100(n)
if n >= 0 and n <= 9 then
return ones[n + 1]
end
if n >= 10 and n <= 90 and n % 10 == 0 then
return tensBase[(n / 10)]
end
if n >= 11 and n <= 99 then
local t = math.floor(n / 10)
local o = n % 10
return tensWithSuffix[t] .. " " .. ones[o + 1]
end
return ""
end
-- =====================================
-- 1 - 999
-- =====================================
local function under1000(n)
if n <= 99 then
return under100(n)
end
if n >= 100 and n <= 900 and n % 100 == 0 then
local h = n / 100
return hundreds[1] .. " " .. ones[h + 1]
end
if n >= 101 and n <= 999 then
local h = math.floor(n / 100)
local r = n % 100
local out = hundreds[1] .. " " .. oneSuffix[h + 1]
if r > 0 then
out = out .. " fi " .. under100(r)
end
return out
end
return ""
end
-- =====================================
-- 1000 - 99,999
-- =====================================
local function toOromo(n)
if n == 0 then
return "zeeroo"
end
if n <= 99 then
return under100(n)
end
if n >= 100 and n <= 900 and n % 100 == 0 then
return hundreds[1] .. " " .. ones[(n / 100) + 1]
end
if n <= 999 then
return under1000(n)
end
-- 1,000 ... 9,000
if n >= 1000 and n <= 9000 and n % 1000 == 0 then
local th = n / 1000
return thousand[1] .. " " .. ones[th + 1]
end
-- 1,001 ... 9,999
if n <= 9999 then
local th = math.floor(n / 1000)
local rem = n % 1000
local out = thousand[1] .. " " .. oneSuffix[th + 1]
if rem > 0 then
out = out .. " fi " .. under1000(rem)
end
return out
end
-- 10,000 ... 90,000
if n >= 10000 and n <= 90000 and n % 10000 == 0 then
local t = (n / 1000) / 10
return thousand[1] .. " " .. tensBase[t]
end
-- 10,001 ... 90,999
if n >= 10001 and n <= 90999 and math.floor(n / 1000) % 10 == 0 then
local thousands = math.floor(n / 1000)
local tensIndex = (thousands / 10)
local rem = n % 1000
local out = thousand[1] .. " " .. tensBaseSuffix[tensIndex]
if rem > 0 then
out = out .. " fi " .. under1000(rem)
end
return out
end
-- 11,000 ... 99,000
if n >= 11000 and n <= 99000 and n % 1000 == 0 then
local thousands = math.floor(n / 1000)
local t = math.floor(thousands / 10)
local o = thousands % 10
return thousand[1] .. " " ..
tensWithSuffix[t] .. " " ..
ones[o + 1]
end
-- 11,001 ... 99,999
if n >= 11001 and n <= 99999 then
local thousands = math.floor(n / 1000)
local t = math.floor(thousands / 10)
local o = thousands % 10
local rem = n % 1000
local out = thousand[1] .. " " ..
tensWithSuffix[t]
if o > 0 then
out = out .. " " .. oneSuffix[o + 1]
end
if rem > 0 then
out = out .. " fi " .. under1000(rem)
end
return out
end
-- 100,000 ... 900,000
if n >= 100000 and n <= 900000 and n % 100000 == 0 then
local h = n / 100000
return thousand[1] .. " " ..
hundreds[1] .. " " ..
ones[h + 1]
end
-- 100,001 ... 999,999
if n >= 100001 and n <= 999999 then
local h = math.floor(n / 100000)
local rem = n % 100000
local out = thousand[1] .. " " ..
hundreds[1] .. " " ..
oneSuffix[h + 1]
if rem > 0 then
out = out .. " fi " .. toOromo(rem)
end
return out
end
-- =====================================
-- MIILIYOONA
-- =====================================
-- 1,000,000 ... 9,000,000
if n >= 1000000 and n <= 9000000 and n % 1000000 == 0 then
local m = n / 1000000
return million[1] .. " " .. ones[m + 1]
end
-- 1,000,001 ... 9,999,999
if n >= 1000001 and n <= 9999999 then
local m = math.floor(n / 1000000)
local rem = n % 1000000
local out = million[1] .. " " .. oneSuffix[m + 1]
if rem > 0 then
out = out .. " fi " .. toOromo(rem)
end
return out
end
-- 10,000,000 ... 90,000,000
if n >= 10000000 and n <= 90000000 and n % 10000000 == 0 then
local t = n / 10000000
return million[1] .. " " .. tensBase[t]
end
-- 10,000,001 ... 90,999,999
if n >= 10000001 and n <= 90999999 and math.floor(n / 1000000) % 10 == 0 then
local millions = math.floor(n / 1000000)
local tensIndex = millions / 10
local rem = n % 1000000
local out = million[1] .. " " .. tensBaseSuffix[tensIndex]
if rem > 0 then
out = out .. " fi " .. toOromo(rem)
end
return out
end
-- 11,000,000 ... 99,000,000
if n >= 11000000 and n <= 99000000 and n % 1000000 == 0 then
local millions = math.floor(n / 1000000)
local t = math.floor(millions / 10)
local o = millions % 10
return million[1] .. " " ..
tensWithSuffix[t] .. " " ..
ones[o + 1]
end
-- 11,000,001 ... 99,999,999
if n >= 11000001 and n <= 99999999 then
local millions = math.floor(n / 1000000)
local t = math.floor(millions / 10)
local o = millions % 10
local rem = n % 1000000
local out = million[1] .. " " ..
tensWithSuffix[t] .. " " ..
oneSuffix[o + 1]
if rem > 0 then
out = out .. " fi " .. toOromo(rem)
end
return out
end
-- 100,000,000 ... 900,000,000
if n >= 100000000 and n <= 900000000 and n % 100000000 == 0 then
local h = n / 100000000
return million[1] .. " " ..
hundreds[1] .. " " ..
ones[h + 1]
end
-- 100,000,001 ... 999,999,999
if n >= 100000001 and n <= 999999999 then
local h = math.floor(n / 100000000)
local rem = n % 100000000
local out = million[1] .. " " ..
hundreds[1] .. " " ..
oneSuffix[h + 1]
if rem > 0 then
out = out .. " fi " .. toOromo(rem)
end
return out
end
-- =====================================
-- BIILIYOONA
-- =====================================
-- 1,000,000,000 ... 9,000,000,000
if n >= 1000000000 and n <= 9000000000 and n % 1000000000 == 0 then
local b = n / 1000000000
return billion[1] .. " " .. ones[b + 1]
end
-- 1,000,000,001 ... 9,999,999,999
if n >= 1000000001 and n <= 9999999999 then
local b = math.floor(n / 1000000000)
local rem = n % 1000000000
local out = billion[1] .. " " .. oneSuffix[b + 1]
if rem > 0 then
out = out .. " fi " .. toOromo(rem)
end
return out
end
-- 10,000,000,000 ... 90,000,000,000
if n >= 10000000000 and n <= 90000000000 and n % 10000000000 == 0 then
local t = n / 10000000000
return billion[1] .. " " .. tensBase[t]
end
-- 10,000,000,001 ... 90,999,999,999
if n >= 10000000001 and n <= 90999999999 and math.floor(n / 1000000000) % 10 == 0 then
local b = math.floor(n / 1000000000)
local tensIndex = b / 10
local rem = n % 1000000000
local out = billion[1] .. " " .. tensBaseSuffix[tensIndex]
if rem > 0 then
out = out .. " fi " .. toOromo(rem)
end
return out
end
-- 11,000,000,000 ... 99,999,999,999
if n >= 11000000001 and n <= 99999999999 then
local b = math.floor(n / 1000000000)
local t = math.floor(b / 10)
local o = b % 10
local rem = n % 1000000000
local out = billion[1] .. " " ..
tensWithSuffix[t] .. " " ..
oneSuffix[o + 1]
if rem > 0 then
out = out .. " fi " .. toOromo(rem)
end
return out
end
-- 100,000,000,000 ... 900,000,000,000
if n >= 100000000000 and n <= 900000000000 and n % 100000000000 == 0 then
local h = n / 100000000000
return billion[1] .. " " ..
hundreds[1] .. " " ..
ones[h + 1]
end
-- 100,000,000,001 ... 999,999,999,999
if n >= 100000000001 and n <= 999999999999 then
local h = math.floor(n / 100000000000)
local rem = n % 100000000000
local out = billion[1] .. " " ..
hundreds[1] .. " " ..
oneSuffix[h + 1]
if rem > 0 then
out = out .. " fi " .. toOromo(rem)
end
return out
end
-- =====================================
-- TIRILIYOONA
-- =====================================
-- 1,000,000,000,000 ... 9,000,000,000,000
if n >= 1000000000000 and n <= 9000000000000 and n % 1000000000000 == 0 then
local t = n / 1000000000000
return trillion[1] .. " " .. ones[t + 1]
end
-- 1,000,000,000,001 ... 9,999,999,999,999
if n >= 1000000000001 and n <= 9999999999999 then
local t = math.floor(n / 1000000000000)
local rem = n % 1000000000000
local out = trillion[1] .. " " .. oneSuffix[t + 1]
if rem > 0 then
out = out .. " fi " .. toOromo(rem)
end
return out
end
-- 10,000,000,000,000 ... 90,000,000,000,000
if n >= 10000000000000 and n <= 90000000000000 and n % 10000000000000 == 0 then
local t = n / 10000000000000
return trillion[1] .. " " .. tensBase[t]
end
-- 10,000,000,000,001 ... 90,999,999,999,999
if n >= 10000000000001 and n <= 90999999999999 and math.floor(n / 1000000000000) % 10 == 0 then
local tr = math.floor(n / 1000000000000)
local tensIndex = tr / 10
local rem = n % 1000000000000
local out = trillion[1] .. " " .. tensBaseSuffix[tensIndex]
if rem > 0 then
out = out .. " fi " .. toOromo(rem)
end
return out
end
-- 11,000,000,000,001 ... 99,999,999,999,999
if n >= 11000000000001 and n <= 99999999999999 then
local tr = math.floor(n / 1000000000000)
local t = math.floor(tr / 10)
local o = tr % 10
local rem = n % 1000000000000
local out = trillion[1] .. " " ..
tensWithSuffix[t] .. " " ..
oneSuffix[o + 1]
if rem > 0 then
out = out .. " fi " .. toOromo(rem)
end
return out
end
-- 100,000,000,000,000 ... 900,000,000,000,000
if n >= 100000000000000 and n <= 900000000000000 and n % 100000000000000 == 0 then
local h = n / 100000000000000
return trillion[1] .. " " ..
hundreds[1] .. " " ..
ones[h + 1]
end
-- 100,000,000,000,001 ... 999,999,999,999,999
if n >= 100000000000001 and n <= 999999999999999 then
local h = math.floor(n / 100000000000000)
local rem = n % 100000000000000
local out = trillion[1] .. " " ..
hundreds[1] .. " " ..
oneSuffix[h + 1]
if rem > 0 then
out = out .. " fi " .. toOromo(rem)
end
return out
end
return ""
end
-- =====================================
-- NEGATIVE
-- =====================================
local function toOromoWithSign(n)
if n < 0 then
return "negatiiva " .. toOromo(math.abs(n))
end
return toOromo(n)
end
-- =====================================
-- DECIMAL
-- =====================================
local function toOromoDecimal(x)
if math.floor(x) == x then
return toOromo(x)
end
local s = tostring(x)
local intStr, decStr = s:match("^(%-?%d+)%.(%d+)$")
local intWord = toOromo(math.abs(tonumber(intStr)))
local parts = {}
for i = 1, #decStr do
local d = tonumber(decStr:sub(i, i))
table.insert(parts, ones[d + 1])
end
local out = intWord .. " tuqaa " .. table.concat(parts, " ")
if x < 0 then
out = "negatiiva " .. out
end
return out
end
-- =====================================
-- MAIN
-- =====================================
function p.main(frame)
local arg = frame.args[1]
if not arg or arg == "" then
return ""
end
local n = tonumber(arg)
if not n then
return ""
end
if math.floor(n) == n then
return toOromoWithSign(n)
else
return toOromoDecimal(n)
end
end
return p
1s6mp3wwcz1v3qf6k6xlijjstwy9jxu
Module:Perf
828
62068
81971
2026-07-02T07:14:02Z
EyobAbebe7
3540
Created page with "local p = {} -- =================================================== -- 1. FUNCTIONS GARGAARTUU (Helper Functions) -- =================================================== local function endsWith(str, suffix) return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix end local function slice(str, cut) if cut == 0 then return str end return mw.ustring.sub(str, 1, -(cut + 1)) end -- =================================================== -- 2. SEERA YEROO DARBEE..."
81971
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. FUNCTIONS GARGAARTUU (Helper Functions)
-- ===================================================
local function endsWith(str, suffix)
return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix
end
local function slice(str, cut)
if cut == 0 then return str end
return mw.ustring.sub(str, 1, -(cut + 1))
end
-- ===================================================
-- 2. SEERA YEROO DARBEE (Bu'uura Yeroo Ammaatiif)
-- ===================================================
local function get_past_forms(root)
local full_rules = {
{"ooch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"och", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"ach", 2, "dhe", "tte", "te", "tte", "nne", "ttan", "tan"},
{"eech", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"ech", 2, "dhe", "tte", "dhe", "tte", "nne", "ttan", "dhan"},
{"kuch", 2, "te", "tte", "te", "tte", "nne", "ttan", "tan"},
{"uch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"odh", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"uudh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"udh", 2, "dhe", "ute", "dhe", "ute", "une", "utan", "dhan"},
{"iidh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"idh", 2, "dhe", "ite", "dhe", "ite", "ine", "itan", "dhan"},
{"aadh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"adh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"eedh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"edh", 2, "dhe", "ete", "dhe", "ete", "ene", "etan", "dhan"},
{"sh", 0, "e", "te", "e", "te", "ne", "tan", "an"},
{"ny", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"uuph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"iph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"yy", 0, "e", "ite", "e", "ite", "ine", "itan", "an"}
}
for _, rule in ipairs(full_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
return {
Ani = base .. rule[3], Ati = base .. rule[4], Inni = base .. rule[5],
Isheen = base .. rule[6], Nuti = base .. rule[7], Isin = base .. rule[8], Isaan = base .. rule[9]
}
end
end
local partial_rules = {
{"aaw", 3, "oofne", "oofte", "ooftan"}, {"caw", 2, "aane", "aate", "aatan"},
{"aw", 2, "oofne", "oofte", "ooftan"}, {"aay", 3, "oofne", "oofte", "ooftan"},
{"aah", 3, "oofne", "oofte", "ooftan"}, {"ooh", 3, "oone", "oote", "ootan"},
{"ah", 1, "ane", "ate", "atan"}, {"udha'", 1, "ane", "ate", "atan"},
{"aacha'", 2, "ofne", "ofte", "oftan"}, {"ooba'", 2, "ofne", "ofte", "oftan"},
{"dha'", 2, "oofne", "oofte", "ooftan"}, {"msha'", 2, "oofne", "oofte", "ooftan"},
{"iishaa'", 3, "ofne", "ofte", "oftan"}, {"ishaa'", 3, "oofne", "oofte", "ooftan"},
{"uushaa'", 3, "ofne", "ofte", "oftan"}, {"ushaa'", 3, "oofne", "oofte", "ooftan"},
{"uu'", 2, "une", "ute", "utan"}, {"u'", 1, "une", "ute", "utan"},
{"aari'", 1, "ne", "te", "tan"}, {"ooji'", 1, "ne", "te", "tan"},
{"i'", 1, "ine", "ite", "itan"}, {"aafa'", 2, "ofne", "ofte", "oftan"},
{"uufa'", 2, "ofne", "ofte", "oftan"}, {"uusa'", 2, "ofne", "ofte", "oftan"},
{"saasa'", 1, "ane", "ate", "atan"}, {"aassa'", 2, "ofne", "ofte", "oftan"},
{"eessa'", 2, "ofne", "ofte", "oftan"}, {"aasa'", 2, "ofne", "ofte", "oftan"},
{"akaa'", 3, "oofne", "oofte", "ooftan"}, {"naa'", 3, "oofne", "oofte", "ooftan"},
{"ana'", 3, "nofne", "nofte", "noftan"}, {"nna'", 3, "nofne", "nofte", "noftan"},
{"aara'", 2, "ofne", "ofte", "oftan"}, {"bja'", 2, "oofne", "oofte", "ooftan"},
{"jja'", 2, "ofne", "ofte", "oftan"}, {"oonja'", 2, "ofne", "ofte", "oftan"},
{"aaja'", 2, "ofne", "ofte", "oftan"}, {"ooja'", 2, "ofne", "ofte", "oftan"},
{"eeja'", 2, "ofne", "ofte", "oftan"}, {"ucca'", 2, "ofne", "ofte", "oftan"},
{"aanca'", 2, "ofne", "ofte", "oftan"}, {"aanxa'", 2, "ofne", "ofte", "oftan"},
{"aaxa'", 2, "ofne", "ofte", "oftan"}, {"eexa'", 2, "ofne", "ofte", "oftan"},
{"iixa'", 2, "ofne", "ofte", "oftan"}, {"ooxa'", 2, "ofne", "ofte", "oftan"},
{"uuxa'", 2, "ofne", "ofte", "oftan"}, {"uura'", 2, "ofne", "ofte", "oftan"},
{"eela'", 2, "ofne", "ofte", "oftan"}, {"kaakka'", 1, "ane", "ate", "atan"},
{"uuka'", 2, "ofne", "ofte", "oftan"}, {"okka'", 1, "ane", "ate", "atan"},
{"kkaa'", 3, "oofne", "oofte", "ooftan"}, {"ukaa'", 3, "oofne", "oofte", "ooftan"},
{"kaa'", 3, "eenye", "eesse", "eessan"}, {"ottaa'", 3, "oofne", "oofte", "ooftan"},
{"aadda'", 2, "ofne", "ofte", "oftan"}, {"dda'", 1, "ane", "ate", "atan"},
{"ooda'", 2, "ofne", "ofte", "oftan"}, {"eda'", 1, "ane", "ate", "atan"},
{"ida'", 1, "ane", "ate", "atan"}, {"da'", 2, "eenye", "eesse", "eessan"},
{"mtaa'", 3, "oofne", "oofte", "ooftan"}, {"taa'", 3, "eenye", "eesse", "eessan"},
{"nga'", 2, "ofne", "ofte", "oftan"}, {"maaga'", 2, "ofne", "ofte", "oftan"},
{"oga'", 2, "ofne", "ofte", "oftan"}, {"aanga'", 2, "ofne", "ofte", "oftan"},
{"anga'", 1, "ane", "ate", "atan"}, {"rga'", 1, "ane", "ate", "atan"},
{"alga'", 2, "eenye", "eesse", "eessan"}, {"lga'", 1, "ane", "ate", "atan"},
{"enga'", 1, "ane", "ate", "atan"}, {"dhaga'", 2, "eenye", "eesse", "eessan"},
{"eega'", 2, "ane", "ate", "atan"}, {"aga'", 1, "ane", "ate", "atan"},
{"gga'", 1, "ane", "ate", "atan"}, {"ga'", 2, "eenye", "eesse", "eessan"},
{"omma'", 2, "ane", "ate", "atan"}, {"mma'", 2, "ofne", "ofte", "oftan"},
{"uma'", 2, "oofne", "oofte", "ooftan"}, {"aarra'", 2, "ofne", "ofte", "oftan"},
{"aata'", 2, "ofne", "ofte", "oftan"}, {"iita'", 2, "ofne", "ofte", "oftan"},
{"uqqa'", 1, "ane", "ate", "atan"}, {"qa'", 2, "ofne", "ofte", "oftan"},
{"yaa'", 2, "ane", "ate", "atan"}, {"ooyya'", 2, "oofne", "oofte", "ooftan"},
{"aa'", 3, "oofne", "oofte", "ooftan"}, {"a'", 1, "ane", "ate", "atan"},
{"boo'", 1, "nye", "sse", "ssan"}, {"oo'", 1, "ne", "te", "tan"},
{"o'", 1, "one", "ote", "otan"}
}
local nuti, ati, ishee, isin
local matched = false
if mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
nuti = root .. "ine"; ati = root .. "ite"; ishee = root .. "ite"; isin = root .. "itan"
matched = true
end
if not matched then
for _, rule in ipairs(partial_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
nuti = base .. rule[3]; ati = base .. rule[4]; ishee = base .. rule[4]; isin = base .. rule[5]
matched = true
break
end
end
end
if not matched then
if endsWith(root, "d") then nuti = slice(root, 1) .. "nne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "l") then nuti = root .. "le"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "b") then nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "c") then nuti = root .. "ne"; ati = root .. "ce"; ishee = root .. "ce"; isin = root .. "can"; matched = true
elseif endsWith(root, "g") then nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "n") then nuti = slice(root, 1) .. "nne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "m") then nuti = slice(root, 1) .. "mne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "j") then nuti = root .. "ne"; ati = root .. "je"; ishee = root .. "je"; isin = root .. "jan"; matched = true
elseif endsWith(root, "q") then nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
elseif endsWith(root, "r") then nuti = root .. "re"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "x") then nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
end
end
if not matched then
nuti = root .. "ne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"
end
return {
Ani = root .. "e", Ati = ati, Inni = root .. "e",
Isheen = ishee, Nuti = nuti, Isin = isin, Isaan = root .. "an"
}
end
-- ===================================================
-- 3. SEERA YEROO AMMAA FI FUULDURAA (Present/Future)
-- ===================================================
local function get_present_forms(past_forms)
local aff = {}
local neg = {}
-- Ani (Xumura 'e' gara 'a' fi 'u' tti jijjiira)
aff.Ani = mw.ustring.sub(past_forms.Ani, 1, -2) .. "a"
neg.Ani = mw.ustring.sub(past_forms.Ani, 1, -2) .. "u"
-- Ati (Xumura 'e' gara 'a' fi 'u' tti jijjiira)
aff.Ati = mw.ustring.sub(past_forms.Ati, 1, -2) .. "a"
neg.Ati = mw.ustring.sub(past_forms.Ati, 1, -2) .. "u"
-- Inni
aff.Inni = mw.ustring.sub(past_forms.Inni, 1, -2) .. "a"
neg.Inni = mw.ustring.sub(past_forms.Inni, 1, -2) .. "u"
-- Isheen (Xumura 'e' gara 'i' fi 'u' tti jijjiira)
aff.Isheen = mw.ustring.sub(past_forms.Isheen, 1, -2) .. "i"
neg.Isheen = mw.ustring.sub(past_forms.Isheen, 1, -2) .. "u"
-- Nuti
aff.Nuti = mw.ustring.sub(past_forms.Nuti, 1, -2) .. "a"
neg.Nuti = mw.ustring.sub(past_forms.Nuti, 1, -2) .. "u"
-- Isin (Xumura 'an' gara 'u' tti jijjiira, diigamaan akkuma jirutti 'an' taha)
aff.Isin = mw.ustring.sub(past_forms.Isin, 1, -3) .. "u"
neg.Isin = past_forms.Isin
-- Isaan
aff.Isaan = mw.ustring.sub(past_forms.Isaan, 1, -3) .. "u"
neg.Isaan = past_forms.Isaan
return aff, neg
end
-- ===================================================
-- 4. KUTAA MOOJULII WAAMAMU (Main Generate Function)
-- ===================================================
function p.generate(frame)
local args = frame.args
if frame:getParent() then
args = frame:getParent().args
end
local verb = args[1] or args.word
if not verb or mw.text.trim(verb) == "" then
verb = mw.title.getCurrentTitle().text
end
verb = mw.ustring.lower(mw.text.trim(verb))
-- "-uu" irraa kuta
local root = verb
if endsWith(verb, "uu") then
root = mw.ustring.sub(verb, 1, -3)
end
-- 1. Yeroo Darbee fiduu
local past_forms = get_past_forms(root)
-- 2. Yeroo Darbee irraa Yeroo Ammaafi Fuulduraa uumuu
local pres_aff, pres_neg = get_present_forms(past_forms)
-- Gabatee Uumuu
local html = "{| class=\"wikitable\" style=\"text-align:center;\"\n"
html = html .. "|+ '''Yeroo Ammaafi Fuulduraa: [[" .. verb .. "]]'''\n"
html = html .. "! Bumbaa Maqaa !! Eeyyamaa (Affirmative) !! Diigamaa (Negative)\n"
local pronouns = {"Ani", "Ati", "Inni", "Isheen", "Nuti", "Isin", "Isaan"}
for _, p_name in ipairs(pronouns) do
local aff_link = "[[" .. pres_aff[p_name] .. "]]"
local neg_link = "[[hin]] [[" .. pres_neg[p_name] .. "]]"
html = html .. "|-\n! " .. p_name .. "\n| " .. aff_link .. " || " .. neg_link .. "\n"
end
html = html .. "|}"
return html
end
return p
at4azuaapizz16wjng7pmrf5ltwkx9v
81975
81971
2026-07-02T09:10:47Z
EyobAbebe7
3540
81975
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. FUNCTIONS GARGAARTUU (Helper Functions)
-- ===================================================
local function endsWith(str, suffix)
return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix
end
local function slice(str, cut)
if cut == 0 then return str end
return mw.ustring.sub(str, 1, -(cut + 1))
end
-- ===================================================
-- 2. SEERA YEROO DARBEE (Bu'uura Yeroo Raawwatamaa Ammaatiif)
-- ===================================================
local function get_past_forms(root)
local full_rules = {
{"ooch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"och", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"ach", 2, "dhe", "tte", "te", "tte", "nne", "ttan", "tan"},
{"eech", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"ech", 2, "dhe", "tte", "dhe", "tte", "nne", "ttan", "dhan"},
{"kuch", 2, "te", "tte", "te", "tte", "nne", "ttan", "tan"},
{"uch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"odh", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"uudh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"udh", 2, "dhe", "ute", "dhe", "ute", "une", "utan", "dhan"},
{"iidh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"idh", 2, "dhe", "ite", "dhe", "ite", "ine", "itan", "dhan"},
{"aadh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"adh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"eedh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"edh", 2, "dhe", "ete", "dhe", "ete", "ene", "etan", "dhan"},
{"sh", 0, "e", "te", "e", "te", "ne", "tan", "an"},
{"ny", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"uuph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"iph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"yy", 0, "e", "ite", "e", "ite", "ine", "itan", "an"}
}
for _, rule in ipairs(full_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
return {
Ani = base .. rule[3], Ati = base .. rule[4], Inni = base .. rule[5],
Isheen = base .. rule[6], Nuti = base .. rule[7], Isin = base .. rule[8], Isaan = base .. rule[9]
}
end
end
local partial_rules = {
{"aaw", 3, "oofne", "oofte", "ooftan"}, {"caw", 2, "aane", "aate", "aatan"},
{"aw", 2, "oofne", "oofte", "ooftan"}, {"aay", 3, "oofne", "oofte", "ooftan"},
{"aah", 3, "oofne", "oofte", "ooftan"}, {"ooh", 3, "oone", "oote", "ootan"},
{"ah", 1, "ane", "ate", "atan"}, {"udha'", 1, "ane", "ate", "atan"},
{"aacha'", 2, "ofne", "ofte", "oftan"}, {"ooba'", 2, "ofne", "ofte", "oftan"},
{"dha'", 2, "oofne", "oofte", "ooftan"}, {"msha'", 2, "oofne", "oofte", "ooftan"},
{"iishaa'", 3, "ofne", "ofte", "oftan"}, {"ishaa'", 3, "oofne", "oofte", "ooftan"},
{"uushaa'", 3, "ofne", "ofte", "oftan"}, {"ushaa'", 3, "oofne", "oofte", "ooftan"},
{"uu'", 2, "une", "ute", "utan"}, {"u'", 1, "une", "ute", "utan"},
{"aari'", 1, "ne", "te", "tan"}, {"ooji'", 1, "ne", "te", "tan"},
{"i'", 1, "ine", "ite", "itan"}, {"aafa'", 2, "ofne", "ofte", "oftan"},
{"uufa'", 2, "ofne", "ofte", "oftan"}, {"uusa'", 2, "ofne", "ofte", "oftan"},
{"saasa'", 1, "ane", "ate", "atan"}, {"aassa'", 2, "ofne", "ofte", "oftan"},
{"eessa'", 2, "ofne", "ofte", "oftan"}, {"aasa'", 2, "ofne", "ofte", "oftan"},
{"akaa'", 3, "oofne", "oofte", "ooftan"}, {"naa'", 3, "oofne", "oofte", "ooftan"},
{"ana'", 3, "nofne", "nofte", "noftan"}, {"nna'", 3, "nofne", "nofte", "noftan"},
{"aara'", 2, "ofne", "ofte", "oftan"}, {"bja'", 2, "oofne", "oofte", "ooftan"},
{"jja'", 2, "ofne", "ofte", "oftan"}, {"oonja'", 2, "ofne", "ofte", "oftan"},
{"aaja'", 2, "ofne", "ofte", "oftan"}, {"ooja'", 2, "ofne", "ofte", "oftan"},
{"eeja'", 2, "ofne", "ofte", "oftan"}, {"ucca'", 2, "ofne", "ofte", "oftan"},
{"aanca'", 2, "ofne", "ofte", "oftan"}, {"aanxa'", 2, "ofne", "ofte", "oftan"},
{"aaxa'", 2, "ofne", "ofte", "oftan"}, {"eexa'", 2, "ofne", "ofte", "oftan"},
{"iixa'", 2, "ofne", "ofte", "oftan"}, {"ooxa'", 2, "ofne", "ofte", "oftan"},
{"uuxa'", 2, "ofne", "ofte", "oftan"}, {"uura'", 2, "ofne", "ofte", "oftan"},
{"eela'", 2, "ofne", "ofte", "oftan"}, {"kaakka'", 1, "ane", "ate", "atan"},
{"uuka'", 2, "ofne", "ofte", "oftan"}, {"okka'", 1, "ane", "ate", "atan"},
{"kkaa'", 3, "oofne", "oofte", "ooftan"}, {"ukaa'", 3, "oofne", "oofte", "ooftan"},
{"kaa'", 3, "eenye", "eesse", "eessan"}, {"ottaa'", 3, "oofne", "oofte", "ooftan"},
{"aadda'", 2, "ofne", "ofte", "oftan"}, {"dda'", 1, "ane", "ate", "atan"},
{"ooda'", 2, "ofne", "ofte", "oftan"}, {"eda'", 1, "ane", "ate", "atan"},
{"ida'", 1, "ane", "ate", "atan"}, {"da'", 2, "eenye", "eesse", "eessan"},
{"mtaa'", 3, "oofne", "oofte", "ooftan"}, {"taa'", 3, "eenye", "eesse", "eessan"},
{"nga'", 2, "ofne", "ofte", "oftan"}, {"maaga'", 2, "ofne", "ofte", "oftan"},
{"oga'", 2, "ofne", "ofte", "oftan"}, {"aanga'", 2, "ofne", "ofte", "oftan"},
{"anga'", 1, "ane", "ate", "atan"}, {"rga'", 1, "ane", "ate", "atan"},
{"alga'", 2, "eenye", "eesse", "eessan"}, {"lga'", 1, "ane", "ate", "atan"},
{"enga'", 1, "ane", "ate", "atan"}, {"dhaga'", 2, "eenye", "eesse", "eessan"},
{"eega'", 2, "ane", "ate", "atan"}, {"aga'", 1, "ane", "ate", "atan"},
{"gga'", 1, "ane", "ate", "atan"}, {"ga'", 2, "eenye", "eesse", "eessan"},
{"omma'", 2, "ane", "ate", "atan"}, {"mma'", 2, "ofne", "ofte", "oftan"},
{"uma'", 2, "oofne", "oofte", "ooftan"}, {"aarra'", 2, "ofne", "ofte", "oftan"},
{"aata'", 2, "ofne", "ofte", "oftan"}, {"iita'", 2, "ofne", "ofte", "oftan"},
{"uqqa'", 1, "ane", "ate", "atan"}, {"qa'", 2, "ofne", "ofte", "oftan"},
{"yaa'", 2, "ane", "ate", "atan"}, {"ooyya'", 2, "oofne", "oofte", "ooftan"},
{"aa'", 3, "oofne", "oofte", "ooftan"}, {"a'", 1, "ane", "ate", "atan"},
{"boo'", 1, "nye", "sse", "ssan"}, {"oo'", 1, "ne", "te", "tan"},
{"o'", 1, "one", "ote", "otan"}
}
local nuti, ati, ishee, isin
local matched = false
if mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
nuti = root .. "ine"; ati = root .. "ite"; ishee = root .. "ite"; isin = root .. "itan"
matched = true
end
if not matched then
for _, rule in ipairs(partial_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
nuti = base .. rule[3]; ati = base .. rule[4]; ishee = base .. rule[4]; isin = base .. rule[5]
matched = true
break
end
end
end
if not matched then
if endsWith(root, "d") then nuti = slice(root, 1) .. "nne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "l") then nuti = root .. "le"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "b") then nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "c") then nuti = root .. "ne"; ati = root .. "ce"; ishee = root .. "ce"; isin = root .. "can"; matched = true
elseif endsWith(root, "g") then nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "n") then nuti = slice(root, 1) .. "nne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "m") then nuti = slice(root, 1) .. "mne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "j") then nuti = root .. "ne"; ati = root .. "je"; ishee = root .. "je"; isin = root .. "jan"; matched = true
elseif endsWith(root, "q") then nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
elseif endsWith(root, "r") then nuti = root .. "re"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "x") then nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
end
end
if not matched then
nuti = root .. "ne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"
end
return {
Ani = root .. "e", Ati = ati, Inni = root .. "e",
Isheen = ishee, Nuti = nuti, Isin = isin, Isaan = root .. "an"
}
end
-- ===================================================
-- 3. SEERA YEROO RAAWWATAMAA AMMAA (Present Perfect)
-- ===================================================
local function get_present_perfect_forms(past_forms)
local aff = {}
local neg = {}
-- Eeyyamaa (Affirmative): Xumura jechoota yeroo darbee irratti jijjiirama gochuu
-- Fkn: 'deeme' -> 'deemeera', 'deemte' -> 'deemteetta'
aff.Ani = mw.ustring.sub(past_forms.Ani, 1, -2) .. "eera"
aff.Ati = mw.ustring.sub(past_forms.Ati, 1, -2) .. "eetta"
aff.Inni = mw.ustring.sub(past_forms.Inni, 1, -2) .. "eera"
aff.Isheen = mw.ustring.sub(past_forms.Isheen, 1, -2) .. "eetti"
aff.Nuti = mw.ustring.sub(past_forms.Nuti, 1, -2) .. "eerra"
-- Isin fi Isaan xumura 'an' qabu. 'an' haquun bakka buusna:
aff.Isin = mw.ustring.sub(past_forms.Isin, 1, -3) .. "aniittu"
aff.Isaan = mw.ustring.sub(past_forms.Isaan, 1, -3) .. "aniiru"
-- Diigamaa (Negative): Yeroo hunda 'hin' + xumura bumbaa maqaa "Nuti" (fkn: deemne, dhufne, binne)
local neg_word = past_forms.Nuti
neg.Ani = neg_word
neg.Ati = neg_word
neg.Inni = neg_word
neg.Isheen = neg_word
neg.Nuti = neg_word
neg.Isin = neg_word
neg.Isaan = neg_word
return aff, neg
end
-- ===================================================
-- 4. KUTAA MOOJULII WAAMAMU (Main Generate Function)
-- ===================================================
function p.generate(frame)
local args = frame.args
if frame:getParent() then
args = frame:getParent().args
end
local verb = args[1] or args.word
if not verb or mw.text.trim(verb) == "" then
verb = mw.title.getCurrentTitle().text
end
verb = mw.ustring.lower(mw.text.trim(verb))
local root = verb
if endsWith(verb, "uu") then
root = mw.ustring.sub(verb, 1, -3)
end
local past_forms = get_past_forms(root)
local perf_aff, perf_neg = get_present_perfect_forms(past_forms)
local pronouns = {"Ani", "Ati", "Inni", "Isheen", "Nuti", "Isin", "Isaan"}
-- GABATEE YEROO RAAWWATAMAA AMMAA
local html = "{| class=\"wikitable\" style=\"text-align:center;\"\n"
html = html .. "|+ '''Yeroo Raawwatamaa Ammaa (Present Perfect Tense): [[" .. verb .. "]]'''\n"
html = html .. "! Bumbaa Maqaa !! Eeyyamaa (Affirmative) !! Diigamaa (Negative)\n"
for _, p_name in ipairs(pronouns) do
local aff_link = "[[" .. perf_aff[p_name] .. "]]"
local neg_link = "[[hin]] [[" .. perf_neg[p_name] .. "]]"
html = html .. "|-\n! " .. p_name .. "\n| " .. aff_link .. " || " .. neg_link .. "\n"
end
html = html .. "|}"
return html
end
return p
7eet72y5o7hborhuvow6l0hp6qxhbfx
81983
81975
2026-07-02T11:49:07Z
EyobAbebe7
3540
81983
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. FUNCTIONS GARGAARTUU (Helper Functions)
-- ===================================================
local function endsWith(str, suffix)
return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix
end
-- ===================================================
-- 2. KUTAA MOOJULII WAAMAMU (Main Generate Function)
-- ===================================================
function p.generate(frame)
local args = frame.args
if frame:getParent() then
args = frame:getParent().args
end
local verb = args[1] or args.word
if not verb or mw.text.trim(verb) == "" then
verb = mw.title.getCurrentTitle().text
end
verb = mw.ustring.lower(mw.text.trim(verb))
-- Hundee gochimaa (root) baasuu: 'uu' dhumaa irraa haquu
local root = verb
if endsWith(verb, "uu") then
root = mw.ustring.sub(verb, 1, -3)
end
-- Bifa itti fufiinsaa uumuu
local cont_base_aa = root .. "aa" -- Fkn: deemaa (Kaan hundaaf)
local cont_base_aan = root .. "aan" -- Fkn: deemaan (Ani qofaaf - eeyyamaa irratti)
-- Gargaaraa Gochimaa (Auxiliary Verbs): Eeyyamaa
local aux_aff = {
Ani = "jira",
Ati = "jirta",
Inni = "jira",
Isheen = "jirti",
Nuti = "jirra",
Isin = "jirtu",
Isaan = "jiru"
}
-- Gargaaraa Gochimaa (Auxiliary Verbs): Diigamaa
local aux_neg = {
Ani = "jiru",
Ati = "jirtu",
Inni = "jiru",
Isheen = "jirtu",
Nuti = "jirru",
Isin = "jirtan",
Isaan = "jiran"
}
local pronouns = {"Ani", "Ati", "Inni", "Isheen", "Nuti", "Isin", "Isaan"}
-- GABATEE YEROO AMMAA ITTI FUFAA (Present Continuous)
local html = "{| class=\"wikitable\" style=\"text-align:center;\"\n"
html = html .. "|+ '''Yeroo Ammaa Itti Fufaa (Present Continuous): [[" .. verb .. "]]'''\n"
html = html .. "! Bumbaa Maqaa !! Eeyyamaa (Affirmative) !! Diigamaa (Negative)\n"
for _, p_name in ipairs(pronouns) do
-- Eeyyamaa irratti 'Ani' qofaaf "-aan", warreen biroof "-aa" fayyadamuu
local current_aff_base = cont_base_aa
if p_name == "Ani" then
current_aff_base = cont_base_aan
end
-- Eeyyamaa: Fkn: [[deemaan]] [[jira]] YKN [[deemaa]] [[jirta]]
local aff_link = "[[" .. current_aff_base .. "]] [[" .. aux_aff[p_name] .. "]]"
-- Diigamaa: Fkn: [[deemaa]] [[hin]] [[jiru]] (Hundaafuu "-aa" dhaan)
local neg_link = "[[" .. cont_base_aa .. "]] [[hin]] [[" .. aux_neg[p_name] .. "]]"
html = html .. "|-\n! " .. p_name .. "\n| " .. aff_link .. " || " .. neg_link .. "\n"
end
html = html .. "|}"
return html
end
return p
b9s7ky07fk2s54vq46u4krh66lnpl2y
Module:Present
828
62069
81972
2026-07-02T07:52:47Z
EyobAbebe7
3540
Created page with "local p = {} -- =================================================== -- 1. FUNCTIONS GARGAARTUU (Helper Functions) -- =================================================== local function endsWith(str, suffix) return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix end local function slice(str, cut) if cut == 0 then return str end return mw.ustring.sub(str, 1, -(cut + 1)) end -- =================================================== -- 2. SEERA YEROO DARBEE..."
81972
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. FUNCTIONS GARGAARTUU (Helper Functions)
-- ===================================================
local function endsWith(str, suffix)
return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix
end
local function slice(str, cut)
if cut == 0 then return str end
return mw.ustring.sub(str, 1, -(cut + 1))
end
-- ===================================================
-- 2. SEERA YEROO DARBEE (Bu'uura Yeroo Ammaatiif)
-- ===================================================
local function get_past_forms(root)
local full_rules = {
{"ooch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"och", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"ach", 2, "dhe", "tte", "te", "tte", "nne", "ttan", "tan"},
{"eech", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"ech", 2, "dhe", "tte", "dhe", "tte", "nne", "ttan", "dhan"},
{"kuch", 2, "te", "tte", "te", "tte", "nne", "ttan", "tan"},
{"uch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"odh", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"uudh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"udh", 2, "dhe", "ute", "dhe", "ute", "une", "utan", "dhan"},
{"iidh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"idh", 2, "dhe", "ite", "dhe", "ite", "ine", "itan", "dhan"},
{"aadh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"adh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"eedh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"edh", 2, "dhe", "ete", "dhe", "ete", "ene", "etan", "dhan"},
{"sh", 0, "e", "te", "e", "te", "ne", "tan", "an"},
{"ny", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"uuph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"iph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"yy", 0, "e", "ite", "e", "ite", "ine", "itan", "an"}
}
for _, rule in ipairs(full_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
return {
Ani = base .. rule[3], Ati = base .. rule[4], Inni = base .. rule[5],
Isheen = base .. rule[6], Nuti = base .. rule[7], Isin = base .. rule[8], Isaan = base .. rule[9]
}
end
end
local partial_rules = {
{"aaw", 3, "oofne", "oofte", "ooftan"}, {"caw", 2, "aane", "aate", "aatan"},
{"aw", 2, "oofne", "oofte", "ooftan"}, {"aay", 3, "oofne", "oofte", "ooftan"},
{"aah", 3, "oofne", "oofte", "ooftan"}, {"ooh", 3, "oone", "oote", "ootan"},
{"ah", 1, "ane", "ate", "atan"}, {"udha'", 1, "ane", "ate", "atan"},
{"aacha'", 2, "ofne", "ofte", "oftan"}, {"ooba'", 2, "ofne", "ofte", "oftan"},
{"dha'", 2, "oofne", "oofte", "ooftan"}, {"msha'", 2, "oofne", "oofte", "ooftan"},
{"iishaa'", 3, "ofne", "ofte", "oftan"}, {"ishaa'", 3, "oofne", "oofte", "ooftan"},
{"uushaa'", 3, "ofne", "ofte", "oftan"}, {"ushaa'", 3, "oofne", "oofte", "ooftan"},
{"uu'", 2, "une", "ute", "utan"}, {"u'", 1, "une", "ute", "utan"},
{"aari'", 1, "ne", "te", "tan"}, {"ooji'", 1, "ne", "te", "tan"},
{"i'", 1, "ine", "ite", "itan"}, {"aafa'", 2, "ofne", "ofte", "oftan"},
{"uufa'", 2, "ofne", "ofte", "oftan"}, {"uusa'", 2, "ofne", "ofte", "oftan"},
{"saasa'", 1, "ane", "ate", "atan"}, {"aassa'", 2, "ofne", "ofte", "oftan"},
{"eessa'", 2, "ofne", "ofte", "oftan"}, {"aasa'", 2, "ofne", "ofte", "oftan"},
{"akaa'", 3, "oofne", "oofte", "ooftan"}, {"naa'", 3, "oofne", "oofte", "ooftan"},
{"ana'", 3, "nofne", "nofte", "noftan"}, {"nna'", 3, "nofne", "nofte", "noftan"},
{"aara'", 2, "ofne", "ofte", "oftan"}, {"bja'", 2, "oofne", "oofte", "ooftan"},
{"jja'", 2, "ofne", "ofte", "oftan"}, {"oonja'", 2, "ofne", "ofte", "oftan"},
{"aaja'", 2, "ofne", "ofte", "oftan"}, {"ooja'", 2, "ofne", "ofte", "oftan"},
{"eeja'", 2, "ofne", "ofte", "oftan"}, {"ucca'", 2, "ofne", "ofte", "oftan"},
{"aanca'", 2, "ofne", "ofte", "oftan"}, {"aanxa'", 2, "ofne", "ofte", "oftan"},
{"aaxa'", 2, "ofne", "ofte", "oftan"}, {"eexa'", 2, "ofne", "ofte", "oftan"},
{"iixa'", 2, "ofne", "ofte", "oftan"}, {"ooxa'", 2, "ofne", "ofte", "oftan"},
{"uuxa'", 2, "ofne", "ofte", "oftan"}, {"uura'", 2, "ofne", "ofte", "oftan"},
{"eela'", 2, "ofne", "ofte", "oftan"}, {"kaakka'", 1, "ane", "ate", "atan"},
{"uuka'", 2, "ofne", "ofte", "oftan"}, {"okka'", 1, "ane", "ate", "atan"},
{"kkaa'", 3, "oofne", "oofte", "ooftan"}, {"ukaa'", 3, "oofne", "oofte", "ooftan"},
{"kaa'", 3, "eenye", "eesse", "eessan"}, {"ottaa'", 3, "oofne", "oofte", "ooftan"},
{"aadda'", 2, "ofne", "ofte", "oftan"}, {"dda'", 1, "ane", "ate", "atan"},
{"ooda'", 2, "ofne", "ofte", "oftan"}, {"eda'", 1, "ane", "ate", "atan"},
{"ida'", 1, "ane", "ate", "atan"}, {"da'", 2, "eenye", "eesse", "eessan"},
{"mtaa'", 3, "oofne", "oofte", "ooftan"}, {"taa'", 3, "eenye", "eesse", "eessan"},
{"nga'", 2, "ofne", "ofte", "oftan"}, {"maaga'", 2, "ofne", "ofte", "oftan"},
{"oga'", 2, "ofne", "ofte", "oftan"}, {"aanga'", 2, "ofne", "ofte", "oftan"},
{"anga'", 1, "ane", "ate", "atan"}, {"rga'", 1, "ane", "ate", "atan"},
{"alga'", 2, "eenye", "eesse", "eessan"}, {"lga'", 1, "ane", "ate", "atan"},
{"enga'", 1, "ane", "ate", "atan"}, {"dhaga'", 2, "eenye", "eesse", "eessan"},
{"eega'", 2, "ane", "ate", "atan"}, {"aga'", 1, "ane", "ate", "atan"},
{"gga'", 1, "ane", "ate", "atan"}, {"ga'", 2, "eenye", "eesse", "eessan"},
{"omma'", 2, "ane", "ate", "atan"}, {"mma'", 2, "ofne", "ofte", "oftan"},
{"uma'", 2, "oofne", "oofte", "ooftan"}, {"aarra'", 2, "ofne", "ofte", "oftan"},
{"aata'", 2, "ofne", "ofte", "oftan"}, {"iita'", 2, "ofne", "ofte", "oftan"},
{"uqqa'", 1, "ane", "ate", "atan"}, {"qa'", 2, "ofne", "ofte", "oftan"},
{"yaa'", 2, "ane", "ate", "atan"}, {"ooyya'", 2, "oofne", "oofte", "ooftan"},
{"aa'", 3, "oofne", "oofte", "ooftan"}, {"a'", 1, "ane", "ate", "atan"},
{"boo'", 1, "nye", "sse", "ssan"}, {"oo'", 1, "ne", "te", "tan"},
{"o'", 1, "one", "ote", "otan"}
}
local nuti, ati, ishee, isin
local matched = false
if mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
nuti = root .. "ine"; ati = root .. "ite"; ishee = root .. "ite"; isin = root .. "itan"
matched = true
end
if not matched then
for _, rule in ipairs(partial_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
nuti = base .. rule[3]; ati = base .. rule[4]; ishee = base .. rule[4]; isin = base .. rule[5]
matched = true
break
end
end
end
if not matched then
if endsWith(root, "d") then nuti = slice(root, 1) .. "nne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "l") then nuti = root .. "le"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "b") then nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "c") then nuti = root .. "ne"; ati = root .. "ce"; ishee = root .. "ce"; isin = root .. "can"; matched = true
elseif endsWith(root, "g") then nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "n") then nuti = slice(root, 1) .. "nne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "m") then nuti = slice(root, 1) .. "mne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "j") then nuti = root .. "ne"; ati = root .. "je"; ishee = root .. "je"; isin = root .. "jan"; matched = true
elseif endsWith(root, "q") then nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
elseif endsWith(root, "r") then nuti = root .. "re"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "x") then nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
end
end
if not matched then
nuti = root .. "ne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"
end
return {
Ani = root .. "e", Ati = ati, Inni = root .. "e",
Isheen = ishee, Nuti = nuti, Isin = isin, Isaan = root .. "an"
}
end
-- ===================================================
-- 3. SEERA YEROO AMMAA FI FUULDURAA (Present/Future)
-- ===================================================
local function get_present_forms(past_forms)
local aff = {}
local neg = {}
aff.Ani = mw.ustring.sub(past_forms.Ani, 1, -2) .. "a"
neg.Ani = mw.ustring.sub(past_forms.Ani, 1, -2) .. "u"
aff.Ati = mw.ustring.sub(past_forms.Ati, 1, -2) .. "a"
neg.Ati = mw.ustring.sub(past_forms.Ati, 1, -2) .. "u"
aff.Inni = mw.ustring.sub(past_forms.Inni, 1, -2) .. "a"
neg.Inni = mw.ustring.sub(past_forms.Inni, 1, -2) .. "u"
aff.Isheen = mw.ustring.sub(past_forms.Isheen, 1, -2) .. "i"
neg.Isheen = mw.ustring.sub(past_forms.Isheen, 1, -2) .. "u"
aff.Nuti = mw.ustring.sub(past_forms.Nuti, 1, -2) .. "a"
neg.Nuti = mw.ustring.sub(past_forms.Nuti, 1, -2) .. "u"
aff.Isin = mw.ustring.sub(past_forms.Isin, 1, -3) .. "u"
neg.Isin = past_forms.Isin
aff.Isaan = mw.ustring.sub(past_forms.Isaan, 1, -3) .. "u"
neg.Isaan = past_forms.Isaan
return aff, neg
end
-- ===================================================
-- 4. KUTAA MOOJULII WAAMAMU (Main Generate Function)
-- ===================================================
function p.generate(frame)
local args = frame.args
if frame:getParent() then
args = frame:getParent().args
end
local verb = args[1] or args.word
if not verb or mw.text.trim(verb) == "" then
verb = mw.title.getCurrentTitle().text
end
verb = mw.ustring.lower(mw.text.trim(verb))
local root = verb
if endsWith(verb, "uu") then
root = mw.ustring.sub(verb, 1, -3)
end
local past_forms = get_past_forms(root)
local pres_aff, pres_neg = get_present_forms(past_forms)
local pronouns = {"Ani", "Ati", "Inni", "Isheen", "Nuti", "Isin", "Isaan"}
-- GABATEE YEROO AMMAA FI FUULDURAA
local html = "{| class=\"wikitable\" style=\"text-align:center;\"\n"
html = html .. "|+ '''Yeroo Ammaa / Fuulduraa (Simple Present & Future): [[" .. verb .. "]]'''\n"
html = html .. "! Bumbaa Maqaa !! Eeyyamaa (Affirmative) !! Diigamaa (Negative)\n"
for _, p_name in ipairs(pronouns) do
html = html .. "|-\n! " .. p_name .. "\n| [[" .. pres_aff[p_name] .. "]] || [[hin]] [[" .. pres_neg[p_name] .. "]]\n"
end
html = html .. "|}"
return html
end
return p
e19usal2rfl8oxkwqamjh10aeemainn
81974
81972
2026-07-02T08:23:32Z
EyobAbebe7
3540
81974
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. FUNCTIONS GARGAARTUU (Helper Functions)
-- ===================================================
local function endsWith(str, suffix)
return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix
end
local function slice(str, cut)
if cut == 0 then return str end
return mw.ustring.sub(str, 1, -(cut + 1))
end
-- ===================================================
-- 2. SEERA YEROO DARBEE (Bu'uura Yeroo Ammaatiif)
-- ===================================================
local function get_past_forms(root)
local full_rules = {
{"ooch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"och", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"ach", 2, "dhe", "tte", "te", "tte", "nne", "ttan", "tan"},
{"eech", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"ech", 2, "dhe", "tte", "dhe", "tte", "nne", "ttan", "dhan"},
{"kuch", 2, "te", "tte", "te", "tte", "nne", "ttan", "tan"},
{"uch", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"odh", 2, "dhe", "ote", "dhe", "ote", "one", "otan", "dhan"},
{"uudh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"udh", 2, "dhe", "ute", "dhe", "ute", "une", "utan", "dhan"},
{"iidh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"idh", 2, "dhe", "ite", "dhe", "ite", "ine", "itan", "dhan"},
{"aadh", 2, "dhe", "te", "dhe", "te", "ne", "tan", "dhan"},
{"adh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"eedh", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"edh", 2, "dhe", "ete", "dhe", "ete", "ene", "etan", "dhan"},
{"sh", 0, "e", "te", "e", "te", "ne", "tan", "an"},
{"ny", 0, "e", "ite", "e", "ite", "ine", "itan", "an"},
{"uuph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"iph", 0, "e", "xe", "e", "xe", "ne", "xan", "an"},
{"yy", 0, "e", "ite", "e", "ite", "ine", "itan", "an"}
}
for _, rule in ipairs(full_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
return {
Ani = base .. rule[3], Ati = base .. rule[4], Inni = base .. rule[5],
Isheen = base .. rule[6], Nuti = base .. rule[7], Isin = base .. rule[8], Isaan = base .. rule[9]
}
end
end
local partial_rules = {
{"aaw", 3, "oofne", "oofte", "ooftan"}, {"caw", 2, "aane", "aate", "aatan"},
{"aw", 2, "oofne", "oofte", "ooftan"}, {"aay", 3, "oofne", "oofte", "ooftan"},
{"aah", 3, "oofne", "oofte", "ooftan"}, {"ooh", 3, "oone", "oote", "ootan"},
{"ah", 1, "ane", "ate", "atan"}, {"udha'", 1, "ane", "ate", "atan"},
{"aacha'", 2, "ofne", "ofte", "oftan"}, {"ooba'", 2, "ofne", "ofte", "oftan"},
{"dha'", 2, "oofne", "oofte", "ooftan"}, {"msha'", 2, "oofne", "oofte", "ooftan"},
{"iishaa'", 3, "ofne", "ofte", "oftan"}, {"ishaa'", 3, "oofne", "oofte", "ooftan"},
{"uushaa'", 3, "ofne", "ofte", "oftan"}, {"ushaa'", 3, "oofne", "oofte", "ooftan"},
{"uu'", 2, "une", "ute", "utan"}, {"u'", 1, "une", "ute", "utan"},
{"aari'", 1, "ne", "te", "tan"}, {"ooji'", 1, "ne", "te", "tan"},
{"i'", 1, "ine", "ite", "itan"}, {"aafa'", 2, "ofne", "ofte", "oftan"},
{"uufa'", 2, "ofne", "ofte", "oftan"}, {"uusa'", 2, "ofne", "ofte", "oftan"},
{"saasa'", 1, "ane", "ate", "atan"}, {"aassa'", 2, "ofne", "ofte", "oftan"},
{"eessa'", 2, "ofne", "ofte", "oftan"}, {"aasa'", 2, "ofne", "ofte", "oftan"},
{"akaa'", 3, "oofne", "oofte", "ooftan"}, {"naa'", 3, "oofne", "oofte", "ooftan"},
{"ana'", 3, "nofne", "nofte", "noftan"}, {"nna'", 3, "nofne", "nofte", "noftan"},
{"aara'", 2, "ofne", "ofte", "oftan"}, {"bja'", 2, "oofne", "oofte", "ooftan"},
{"jja'", 2, "ofne", "ofte", "oftan"}, {"oonja'", 2, "ofne", "ofte", "oftan"},
{"aaja'", 2, "ofne", "ofte", "oftan"}, {"ooja'", 2, "ofne", "ofte", "oftan"},
{"eeja'", 2, "ofne", "ofte", "oftan"}, {"ucca'", 2, "ofne", "ofte", "oftan"},
{"aanca'", 2, "ofne", "ofte", "oftan"}, {"aanxa'", 2, "ofne", "ofte", "oftan"},
{"aaxa'", 2, "ofne", "ofte", "oftan"}, {"eexa'", 2, "ofne", "ofte", "oftan"},
{"iixa'", 2, "ofne", "ofte", "oftan"}, {"ooxa'", 2, "ofne", "ofte", "oftan"},
{"uuxa'", 2, "ofne", "ofte", "oftan"}, {"uura'", 2, "ofne", "ofte", "oftan"},
{"eela'", 2, "ofne", "ofte", "oftan"}, {"kaakka'", 1, "ane", "ate", "atan"},
{"uuka'", 2, "ofne", "ofte", "oftan"}, {"okka'", 1, "ane", "ate", "atan"},
{"kkaa'", 3, "oofne", "oofte", "ooftan"}, {"ukaa'", 3, "oofne", "oofte", "ooftan"},
{"kaa'", 3, "eenye", "eesse", "eessan"}, {"ottaa'", 3, "oofne", "oofte", "ooftan"},
{"aadda'", 2, "ofne", "ofte", "oftan"}, {"dda'", 1, "ane", "ate", "atan"},
{"ooda'", 2, "ofne", "ofte", "oftan"}, {"eda'", 1, "ane", "ate", "atan"},
{"ida'", 1, "ane", "ate", "atan"}, {"da'", 2, "eenye", "eesse", "eessan"},
{"mtaa'", 3, "oofne", "oofte", "ooftan"}, {"taa'", 3, "eenye", "eesse", "eessan"},
{"nga'", 2, "ofne", "ofte", "oftan"}, {"maaga'", 2, "ofne", "ofte", "oftan"},
{"oga'", 2, "ofne", "ofte", "oftan"}, {"aanga'", 2, "ofne", "ofte", "oftan"},
{"anga'", 1, "ane", "ate", "atan"}, {"rga'", 1, "ane", "ate", "atan"},
{"alga'", 2, "eenye", "eesse", "eessan"}, {"lga'", 1, "ane", "ate", "atan"},
{"enga'", 1, "ane", "ate", "atan"}, {"dhaga'", 2, "eenye", "eesse", "eessan"},
{"eega'", 2, "ane", "ate", "atan"}, {"aga'", 1, "ane", "ate", "atan"},
{"gga'", 1, "ane", "ate", "atan"}, {"ga'", 2, "eenye", "eesse", "eessan"},
{"omma'", 2, "ane", "ate", "atan"}, {"mma'", 2, "ofne", "ofte", "oftan"},
{"uma'", 2, "oofne", "oofte", "ooftan"}, {"aarra'", 2, "ofne", "ofte", "oftan"},
{"aata'", 2, "ofne", "ofte", "oftan"}, {"iita'", 2, "ofne", "ofte", "oftan"},
{"uqqa'", 1, "ane", "ate", "atan"}, {"qa'", 2, "ofne", "ofte", "oftan"},
{"yaa'", 2, "ane", "ate", "atan"}, {"ooyya'", 2, "oofne", "oofte", "ooftan"},
{"aa'", 3, "oofne", "oofte", "ooftan"}, {"a'", 1, "ane", "ate", "atan"},
{"boo'", 1, "nye", "sse", "ssan"}, {"oo'", 1, "ne", "te", "tan"},
{"o'", 1, "one", "ote", "otan"}
}
local nuti, ati, ishee, isin
local matched = false
if mw.ustring.match(root, "[bcdfghjklmnpqrstvwxz][bcdfghjklmnpqrstvwxz]$") then
nuti = root .. "ine"; ati = root .. "ite"; ishee = root .. "ite"; isin = root .. "itan"
matched = true
end
if not matched then
for _, rule in ipairs(partial_rules) do
if endsWith(root, rule[1]) then
local base = slice(root, rule[2])
nuti = base .. rule[3]; ati = base .. rule[4]; ishee = base .. rule[4]; isin = base .. rule[5]
matched = true
break
end
end
end
if not matched then
if endsWith(root, "d") then nuti = slice(root, 1) .. "nne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "l") then nuti = root .. "le"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "b") then nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "c") then nuti = root .. "ne"; ati = root .. "ce"; ishee = root .. "ce"; isin = root .. "can"; matched = true
elseif endsWith(root, "g") then nuti = root .. "ne"; ati = root .. "de"; ishee = root .. "de"; isin = root .. "dan"; matched = true
elseif endsWith(root, "n") then nuti = slice(root, 1) .. "nne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "m") then nuti = slice(root, 1) .. "mne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "j") then nuti = root .. "ne"; ati = root .. "je"; ishee = root .. "je"; isin = root .. "jan"; matched = true
elseif endsWith(root, "q") then nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
elseif endsWith(root, "r") then nuti = root .. "re"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"; matched = true
elseif endsWith(root, "x") then nuti = root .. "ne"; ati = root .. "xe"; ishee = root .. "xe"; isin = root .. "xan"; matched = true
end
end
if not matched then
nuti = root .. "ne"; ati = root .. "te"; ishee = root .. "te"; isin = root .. "tan"
end
return {
Ani = root .. "e", Ati = ati, Inni = root .. "e",
Isheen = ishee, Nuti = nuti, Isin = isin, Isaan = root .. "an"
}
end
-- ===================================================
-- 3. SEERA YEROO AMMAA FI FUULDURAA (Present/Future)
-- ===================================================
local function get_present_forms(past_forms)
local aff = {}
local neg = {}
aff.Ani = mw.ustring.sub(past_forms.Ani, 1, -2) .. "a"
neg.Ani = mw.ustring.sub(past_forms.Ani, 1, -2) .. "u"
aff.Ati = mw.ustring.sub(past_forms.Ati, 1, -2) .. "a"
neg.Ati = mw.ustring.sub(past_forms.Ati, 1, -2) .. "u"
aff.Inni = mw.ustring.sub(past_forms.Inni, 1, -2) .. "a"
neg.Inni = mw.ustring.sub(past_forms.Inni, 1, -2) .. "u"
aff.Isheen = mw.ustring.sub(past_forms.Isheen, 1, -2) .. "i"
neg.Isheen = mw.ustring.sub(past_forms.Isheen, 1, -2) .. "u"
aff.Nuti = mw.ustring.sub(past_forms.Nuti, 1, -2) .. "a"
neg.Nuti = mw.ustring.sub(past_forms.Nuti, 1, -2) .. "u"
aff.Isin = mw.ustring.sub(past_forms.Isin, 1, -3) .. "u"
neg.Isin = past_forms.Isin
aff.Isaan = mw.ustring.sub(past_forms.Isaan, 1, -3) .. "u"
neg.Isaan = past_forms.Isaan
return aff, neg
end
-- ===================================================
-- 4. KUTAA MOOJULII WAAMAMU (Main Generate Function)
-- ===================================================
function p.generate(frame)
local args = frame.args
if frame:getParent() then
args = frame:getParent().args
end
local verb = args[1] or args.word
if not verb or mw.text.trim(verb) == "" then
verb = mw.title.getCurrentTitle().text
end
verb = mw.ustring.lower(mw.text.trim(verb))
local root = verb
if endsWith(verb, "uu") then
root = mw.ustring.sub(verb, 1, -3)
end
local past_forms = get_past_forms(root)
local pres_aff, pres_neg = get_present_forms(past_forms)
local pronouns = {"Ani", "Ati", "Inni", "Isheen", "Nuti", "Isin", "Isaan"}
-- GABATEE YEROO AMMAA FI FUULDURAA
local html = "{| class=\"wikitable\" style=\"text-align:center;\"\n"
html = html .. "|+ '''Yeroo Ammaa / Fuulduraa (Simple Present & Future): [[" .. verb .. "]]'''\n"
html = html .. "! Bumbaa Maqaa !! Eeyyamaa (Affirmative) !! Diigamaa (Negative)\n"
for _, p_name in ipairs(pronouns) do
-- 'Ani' yoo ta'e 'nan', kaan hundaaf 'ni'
local aff_particle = "ni"
if p_name == "Ani" then
aff_particle = "nan"
end
local aff_link = "[[" .. aff_particle .. "]] [[" .. pres_aff[p_name] .. "]]"
local neg_link = "[[hin]] [[" .. pres_neg[p_name] .. "]]"
html = html .. "|-\n! " .. p_name .. "\n| " .. aff_link .. " || " .. neg_link .. "\n"
end
html = html .. "|}"
return html
end
return p
nm7igjm1lmfi0fg2dy3pect7zhpe9e7
Template:durar
10
62070
81979
2026-07-02T09:44:03Z
EyobAbebe7
3540
Created page with "Fufata duraa ykn [[hundee]] jechaa irratti dursee kan maxxane"
81979
wikitext
text/x-wiki
Fufata duraa ykn [[hundee]] jechaa irratti dursee kan maxxane
o6cmnwhwn9t19zwkh3y8up9mb9ddk74
Module:Continue
828
62071
81981
2026-07-02T10:32:38Z
EyobAbebe7
3540
Created page with "local p = {} -- =================================================== -- 1. FUNCTIONS GARGAARTUU (Helper Functions) -- =================================================== local function endsWith(str, suffix) return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix end -- =================================================== -- 2. KUTAA MOOJULII WAAMAMU (Main Generate Function) -- =================================================== function p.generate(frame) lo..."
81981
Scribunto
text/plain
local p = {}
-- ===================================================
-- 1. FUNCTIONS GARGAARTUU (Helper Functions)
-- ===================================================
local function endsWith(str, suffix)
return mw.ustring.sub(str, -mw.ustring.len(suffix)) == suffix
end
-- ===================================================
-- 2. KUTAA MOOJULII WAAMAMU (Main Generate Function)
-- ===================================================
function p.generate(frame)
local args = frame.args
if frame:getParent() then
args = frame:getParent().args
end
local verb = args[1] or args.word
if not verb or mw.text.trim(verb) == "" then
verb = mw.title.getCurrentTitle().text
end
verb = mw.ustring.lower(mw.text.trim(verb))
-- Hundee gochimaa (root) baasuu: 'uu' dhumaa irraa haquu
local root = verb
if endsWith(verb, "uu") then
root = mw.ustring.sub(verb, 1, -3)
end
-- Bifa itti fufiinsaa uumuu (Fkn: deem + aa = deemaa)
local cont_base = root .. "aa"
-- Gargaaraa Gochimaa (Auxiliary Verbs): Eeyyamaa
local aux_aff = {
Ani = "jira",
Ati = "jirta",
Inni = "jira",
Isheen = "jirti",
Nuti = "jirra",
Isin = "jirtu",
Isaan = "jiru"
}
-- Gargaaraa Gochimaa (Auxiliary Verbs): Diigamaa
local aux_neg = {
Ani = "jiru",
Ati = "jirtu",
Inni = "jiru",
Isheen = "jirtu",
Nuti = "jirru",
Isin = "jirtan",
Isaan = "jiran"
}
local pronouns = {"Ani", "Ati", "Inni", "Isheen", "Nuti", "Isin", "Isaan"}
-- GABATEE YEROO AMMAA ITTI FUFAA (Present Continuous)
local html = "{| class=\"wikitable\" style=\"text-align:center;\"\n"
html = html .. "|+ '''Yeroo Ammaa Itti Fufaa (Present Continuous): [[" .. verb .. "]]'''\n"
html = html .. "! Bumbaa Maqaa !! Eeyyamaa (Affirmative) !! Diigamaa (Negative)\n"
for _, p_name in ipairs(pronouns) do
-- Eeyyamaa: Fkn: [[deemaa]] [[jira]]
local aff_link = "[[" .. cont_base .. "]] [[" .. aux_aff[p_name] .. "]]"
-- Diigamaa: Fkn: [[deemaa]] [[hin]] [[jiru]]
local neg_link = "[[" .. cont_base .. "]] [[hin]] [[" .. aux_neg[p_name] .. "]]"
html = html .. "|-\n! " .. p_name .. "\n| " .. aff_link .. " || " .. neg_link .. "\n"
end
html = html .. "|}"
return html
end
return p
phjc1rg2mrbrrkhltzmp74xkfrzu670