--[===[
MODULE "MEOFORMO" (esperanto form)
"eo.wiktionary.org/wiki/Modulo:meoformo" <!--2021-Dec-30-->
Purpose: analyzes a flexion non-base form of an -eo- noun or adjective
or verb, and returns selected one of 5 types of information,
it can be the full base form or other
Utilo: analizas fleksian nebazan formon de -eo- substantivo aux adjektivo
aux verbo, kaj redonas elektitan unu el 5 tipoj de informo,
tio povas esti la plena baza formo aux alia
Manfaat: menganalisis sebuah bentuk fleksi pada nomina atau adjektiva
atau verba ...
Syfte: analyserar en boejningsform hos ett -eo- substantiv eller adjektiv
eller verb, och levererar ...
Used by templates / Uzata far sxablonoj:
- only "form-eo" (not to be called from any other place)
Required submodules / Bezonataj submoduloj / Submodul yang diperlukan: none
This module is special in that it takes parameters both those sent
to itself (own frame) and those sent to the caller (caller's frame).
This module needs parameters that are additional to or different from
parameters submitted to the calling template.
The one hidden parameter can be on our own or on the caller's frame. If the
parameter is not found on our own frame, the caller's one is peeked. This
way we can avoid forwarding that does not work for non-existent parameters
(non-existent ie nil becomes empty string, not appreciated).
Parameters: * 1 anonymous obligatory parameter :
type of information requested :
* "B" for base form
* "D" for description, or "T" for
type, or "R" for root, or "F"
anything else is an error
* 1 hidden named parameter :
* "pagenameoverridetestonly="
Returned: * full base form, or description, or flexion type ("OA" or
"VE"), or root, or ending, or empty on error
This module is unbreakable (when called with correct module name
and function name).
Cxi tiu modulo estas nerompebla (kiam vokita kun gxustaj nomo de modulo
kaj nomo de funkcio).
: ---------------------------------------
* #T00 ("B", page "katoj")
* expected result: "kato"
* actual result: "{{#invoke:meoformo|ek|B|pagenameoverridetestonly=katoj}}"
::* #T01 ("D", page "katoj")
::* expected result: "plurala formo de substantivo"
::* actual result: "{{#invoke:meoformo|ek|D|pagenameoverridetestonly=katoj}}"
* #T02 ("B", page "atomojn")
* expected result: "atomo"
* actual result: "{{#invoke:meoformo|ek|B|pagenameoverridetestonly=atomojn}}"
::* #T03 ("D", page "atomojn")
::* expected result: "akuzativa plurala formo de substantivo"
::* actual result: "{{#invoke:meoformo|ek|D|pagenameoverridetestonly=atomojn}}"
* #T04 ("B", page "mojosaj")
* expected result: "mojosa"
* actual result: "{{#invoke:meoformo|ek|B|pagenameoverridetestonly=mojosaj}}"
::* #T05 ("D", page "mojosaj")
::* expected result: "plurala formo de adjektivo"
::* actual result: "{{#invoke:meoformo|ek|D|pagenameoverridetestonly=mojosaj}}"
* #T06 ("B", page "MOjosaj", bad but gives a result nevertheless)
* expected result: "MOjosa"
* actual result: "{{#invoke:meoformo|ek|B|pagenameoverridetestonly=MOjosaj}}"
: ---------------------------------------
* #T10 ("B", page "kato", error since base form)
* expected result: ""
* actual result: "{{#invoke:meoformo|ek|B|pagenameoverridetestonly=kato}}"
::* #T11 ("B", page "oj", error since root empty)
::* expected result: ""
::* actual result: "{{#invoke:meoformo|ek|B|pagenameoverridetestonly=oj}}"
* #T12 ("B", page "katuj", error since invalid form)
* expected result: ""
* actual result: "{{#invoke:meoformo|ek|B|pagenameoverridetestonly=katuj}}"
::* #T13 ("B", page "BANANOJ", error since root uppercase)
::* expected result: ""
::* actual result: "{{#invoke:meoformo|ek|B|pagenameoverridetestonly=BANANOJ}}"
* #T14 ("B|B", page "katoj", error due to excess parameter)
* expected result: ""
* actual result: "{{#invoke:meoformo|ek|B|B|pagenameoverridetestonly=katoj}}"
::* #T15 ("", page "katoj", error due to missing parameter)
::* expected result: ""
::* actual result: "{{#invoke:meoformo|ek|pagenameoverridetestonly=katoj}}"
* #T16 ("d", page "katoj", error due to invalid parameter)
* expected result: ""
* actual result: "{{#invoke:meoformo|ek|d|pagenameoverridetestonly=katoj}}"
: ---------------------------------------
* #T20 ("B", page "klopodas")
* expected result: "klopodi"
* actual result: "{{#invoke:meoformo|ek|B|pagenameoverridetestonly=klopodas}}"
::* #T21 ("D", page "klopodas")
::* expected result: "prezenca formo de verbo"
::* actual result: "{{#invoke:meoformo|ek|D|pagenameoverridetestonly=klopodas}}"
* #T22 ("B", page "klopodis")
* expected result: "klopodi"
* actual result: "{{#invoke:meoformo|ek|B|pagenameoverridetestonly=klopodis}}"
::* #T23 ("D", page "klopodis")
::* expected result: "pasinteca formo de verbo"
::* actual result: "{{#invoke:meoformo|ek|D|pagenameoverridetestonly=klopodis}}"
* #T24 ("D", page "klopodos")
* expected result: "futura formo de verbo"
* actual result: "{{#invoke:meoformo|ek|D|pagenameoverridetestonly=klopodos}}"
::* #T25 ("D", page "klopodu")
::* expected result: "imperativa formo de verbo"
::* actual result: "{{#invoke:meoformo|ek|D|pagenameoverridetestonly=klopodu}}"
: ---------------------------------------
* #T30 ("T", page "klopodu")
* expected result: "VE"
* actual result: "{{#invoke:meoformo|ek|T|pagenameoverridetestonly=klopodu}}"
::* #T31 ("R", page "klopodu")
::* expected result: "klopod"
::* actual result: "{{#invoke:meoformo|ek|R|pagenameoverridetestonly=klopodu}}"
* #T32 ("F", page "klopodu")
* expected result: "u"
* actual result: "{{#invoke:meoformo|ek|F|pagenameoverridetestonly=klopodu}}"
::* #T33 ("T", page "mojosajn")
::* expected result: "OA"
::* actual result: "{{#invoke:meoformo|ek|T|pagenameoverridetestonly=mojosajn}}"
: ---------------------------------------
]===]
local eoformo = {}
------------------------------------------------------------------------
---- CONSTANTS ----
------------------------------------------------------------------------
local contabforms = {}
contabforms[ 0] = {"on" , "o" , "akuzativa formo de substantivo"}
contabforms[ 1] = {"oj" , "o" , "plurala formo de substantivo"}
contabforms[ 2] = {"ojn" , "o" , "akuzativa plurala formo de substantivo"}
contabforms[ 3] = {"an" , "a" , "akuzativa formo de adjektivo"}
contabforms[ 4] = {"aj" , "a" , "plurala formo de adjektivo"}
contabforms[ 5] = {"ajn" , "a" , "akuzativa plurala formo de adjektivo"}
contabforms[ 6] = {"as" , "i" , "prezenca formo de verbo"}
contabforms[ 7] = {"is" , "i" , "pasinteca formo de verbo"}
contabforms[ 8] = {"os" , "i" , "futura formo de verbo"}
contabforms[ 9] = {"us" , "i" , "kondicionala formo de verbo"}
contabforms[10] = {"u" , "i" , "imperativa formo de verbo"}
------------------------------------------------------------------------
---- MAIN EXPORTED FUNCTION ----
------------------------------------------------------------------------
function eoformo.ek (arxframent)
-- general unknown type
local vartmp = 0 -- variable without type
-- special type "args" AKA "arx"
local arxourown = 0 -- metaized "args" from our own "frame"
local arxcaller = 0 -- metaized "args" from caller's "frame"
-- general "str"
local strpagename = ""
local strnebaza = "" -- & from table nebaza finajxo
local strbazafinajx = "" -- & from table baza finajxo
local strpriskribo = "" -- & from table description
local strrootradi = ""
local strtomp = ""
local strret = "" -- result string
-- general "num"
local numlopagena = 0
local numpanj = 0
local numindex3tab = 0
-- general "boo"
local booerr = false
local boohaveboob = false -- "B" or "D" or "T" or "R" or "F"
local boohavedeed = false
local boohavetipp = false
local boohaveroot = false
local boohavefina = false
---- GET THE ARX:ES ----
arxourown = arxframent.args or {} -- "args" fr our own "frame"
arxcaller = arxframent:getParent().args or {} -- "args" fr caller's "frame"
---- PROCESS ONE HIDDEN AND ONE OBLIGATORY ANONYMOUS PARAMETER ----
strpagename = ''
while (true) do -- fake loop
booerr = true -- preliminary
vartmp = arxourown['pagenameoverridetestonly']
if (vartmp==nil) then
vartmp = arxcaller['pagenameoverridetestonly']
end--if
if (type(vartmp)=="string") then
numlopagena=string.len(vartmp)
if ((numlopagena>=3 and numlopagena<=100)) then
strpagename = vartmp -- no error possible here
end--if
end--if
if (arxourown[2]~=nil) then -- undesirable
break -- bad
end--if
vartmp = arxourown[1] -- "B" or "D" or "T" or "R" or "F"
boohaveboob = (vartmp=="B")
boohavedeed = (vartmp=="D")
boohavetipp = (vartmp=="T")
boohaveroot = (vartmp=="R")
boohavefina = (vartmp=="F")
booerr = ((not boohaveboob) and (not boohavedeed) and (not boohavetipp) and (not boohaveroot) and (not boohavefina))
break -- good or bad
end--while -- fake loop
---- SEIZE THE PAGENAME FROM MW AND CHECK IT ----
-- must be 3...100 octet:s keep consistent with "pagenameoverridetestonly="
-- ignore if type not "string", but otherwise do either buy it or brew error
if ((not booerr) and (strpagename=='')) then
vartmp = mw.title.getCurrentTitle().text -- without namespace prefix
if (type(vartmp)=="string") then
numlopagena = string.len(vartmp)
if ((numlopagena>=3) and (numlopagena<=100)) then
strpagename = vartmp
else
booerr = true
end--if
end--if
end--if
booerr = booerr or (strpagename=='')
---- CARRY OUT THE HARD WORK ----
-- example entry {"us" , "i" , "kondicionala formo de verbo"} it is a table
numindex3tab = 0
numlopagena = string.len(strpagename) -- 3...100
while (true) do -- genuine loop walking through the table
if (booerr) then
break -- bad start
end--if
vartmp = contabforms [numindex3tab]
if (type(vartmp)~="table") then
booerr = true
break -- end of outer table, NOT found
end--if
strnebaza = vartmp[1] -- can be "us"
strbazafinajx = vartmp[2] -- can be "i"
strpriskribo = vartmp[3] -- can be "kondicionala formo de verbo"
numpanj = string.len(strnebaza) -- 1...3
if ((numpanj==0) or (numpanj>3)) then
booerr = true
break -- table is broken
end--if
if (numlopagena>numpanj) then
strtomp = string.sub(strpagename,(numlopagena-numpanj+1),numlopagena)
if (strtomp==strnebaza) then
break -- found it
end--if
end--if
numindex3tab = numindex3tab + 1
end--while
if (not booerr) then
strrootradi = string.sub(strpagename,1,(numlopagena-numpanj)) -- nonempty
if (boohaveboob) then -- "B" -- full base form
strret = strrootradi .. strbazafinajx
end--if
if (boohavedeed) then -- "D"
strret = strpriskribo
end--if
if (boohavetipp) then -- "T" -- type (VE vs (SB or AJ))
strret = "OA" -- gluO mojosA
if (strbazafinajx=="i") then
strret = "VE" -- VErbo
end--if
end--if
if (boohaveroot) then -- "R"
strret = strrootradi
end--if
if (boohavefina) then -- "F"
strret = strnebaza
end--if
end--if
---- RETURN THE JUNK STRING ----
return strret -- can be empty
end--function
---- RETURN THE JUNK LUA TABLE ----
return eoformo