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