Модул:el-c-conj
el-cases-conj
el-cases-conj е шаблон за прикажување на деклинацијата на грчките придавки. Шаблонот ја повикува Lua-модулот el-c-conj, кој врз основа на придавката и дополнителниот параметар ја генерира деклинацијата во еднина и множина, за машки, женски и среден род.
Основна употреба
На страницата на придавката се користи како :
{{el-cases-conj|{{PAGENAME}}|svr}
каде:
{{PAGENAME}} автоматски го внесува името на тековната страница, односно придавката што треба да се деклинира. вториот параметар svr ја одредува варијантата на женскиот род кај шемите каде што е потребно.
Параметарот svr може да биде:
празно / η / α / αη
Во зависност од тоа на која буква завршува придавката во номинатив женски род еднина, се избира соодветната вредност α или η. Ако се остави овој параметар празен се подразбира дека придавката во номинатив женски род еднина завршува на η. Параметарот αη се користи ако сакаме да ги имаме и двете форми во исто време.
Што генерира шаблонот
Шаблонот прикажува табела со следната структура како во примерот за придавката δίκαιος
{{el-cases-conj|δίκαιος|αη}}
| Еднина | Множина | |||||
|---|---|---|---|---|---|---|
| Машки род | Женски род | Среден Род | Машки род | Женски род | Среден Род | |
| Номинатив | δίκαιος | δίκαια / δίκαιη | δίκαιο | δίκαιοι | δίκαιες | δίκαια |
| Генитив | δίκαιου | δίκαιας / δίκαιης | δίκαιου | δίκαιων | δίκαιων | δίκαιων |
| Акузатив | δίκαιο | δίκαια / δίκαιη | δίκαιο | δίκαιους | δίκαιες | δίκαια |
| Вокатив | δίκαιε | δίκαια / δίκαιη | δίκαιο | δίκαιοι | δίκαιες | δίκαια |
За секој падеж модулот el-c-conj се повикува со посебна функција:
|-
|Номинатив ||[[]]||η||ο||οι||ες||α
|-
|Генитив ||ου||ης||ου||ων||ων||ων
|-
|Акузатив ||ο||η||ο||ους||ες||α
|-
|Вокатив ||ε||η||ο||οι||ες||α
Функциите ги земаат придавката и параметарот svr, ја одредуваат соодветната деклинациска шема и ги создаваат формите за сите три рода и двата броја.
Параметарот svr svr = α
Вредноста α се користи кога женскиот род се образува со -α.
На пример, кај шемите каде што машката форма завршува на -ός, скриптата го образува женскиот род со:
основа + ά
а генитивот еднина со:
основа + άς
Кај шемата на -ος, женскиот род е:
основа + α
а генитивот:
основа + ας
Ова е директно зададено во логиката на модулот.
svr = η
Вредноста η се користи кога женскиот род се образува со -η.
Кај придавките на -ος, тоа значи:
машки: основа + ος женски: основа + η среден: основа + ο
а во генитив женскиот род завршува на -ης.
Кај стандардната шема, доколку svr не е α, скриптата исто така ја избира варијантата со η.
svr = αη
Вредноста αη се користи кога придавката има две можни форми на женскиот род.
Кај придавките на -ος, скриптата тогаш прикажува:
женски род: основа + α / основа + η
и во генитив:
основа + ας / основа + ης
На пример, логиката во модулот експлицитно создава две форми разделени со /.
Празен параметар
Ако вториот параметар не е наведен, тој се третира како празен:
{{el-cases-conj|{{PAGENAME}}}}'''
Во шемите каде што се очекува избор помеѓу α и η, празната вредност води кон стандардната варијанта со η.
Препознавање на придавките
Модулот не бара рачно да се зададе деклинациската шема. Тој ја анализира завршетната форма на придавката и врз основа на неа ја избира соодветната шема.
Поддржани се, меѓу другото, следните завршетоци:
-ικός -ύς -ός -ος -ων -ών -ως -ής -ης -άρης
Доколку придавката не одговара на некоја од специјалните шеми, се користи основната стандардна шема.
Придавки на -ικός
За придавките на -ικός скриптата ги создава формите со:
-ικός -ική -ικό
а во множина:
-ικοί -ικές -ικά
Постои и посебна форма за вокатив машки род -ικέ.
Придавки на -ύς
За придавките на -ύς се користи посебна деклинациска функција.
Примерот вграден во скриптата е:
μακρύς → μακριά → μακρύ
Соодветно се генерираат и множинските форми.
Придавки и партиципи на -ων / -ών
За -ων и -ών постои посебна логика.
На пример, скриптата го наведува:
παρών → παρόν → παρούσα
и:
επείγων → επείγον → επείγουσα
При овие форми модулот води сметка и за позицијата на акцентот, особено во генитив множина.
Придавки на -ής / -ης
Овие придавки се поделени на два основни типа во зависност од тоа дали основата има акцент.
Скриптата ги наведува примерите:
ακριβής → ακριβές → ακριβείς → ακριβή
и:
ουσιώδης → ουσιώδες → ουσιώδεις → ουσιώδη
Проверката дали основата има акцент се врши автоматски.
Придавки на -άρης
За -άρης постои посебна шема, со форми како:
-άρης -άρα -άρικο
и множински форми:
-άρηδες -άρες -άρικα
Придавки на -ως
Придавките на -ως во моменталната имплементација ја задржуваат истата форма во сите родови, падежи и броеви.
Повик директно кон Lua-модулот
Иако вообичаениот начин на користење е преку:
{{el-cases-conj|{{PAGENAME}}|svr}}
можно е функциите на модулот да се повикаат и директно преку #invoke.
На пример:
{{#invoke:el-c-conj|Nominativ_case|{{{1}}}|{{{2|}}}}}
Постојат четири јавни функции:
Nominativ_case Genitiv_case Acusativ_case Vocativ_case
Секоја функција ја чита првата и втората вредност од аргументите, ги отстранува непотребните празни места и ја повикува главната логика за деклинација.
Тестирање
За проверка на работата на деклинацискиот модул постојат и тест-модули.
Тестовите може да се повикаат од било која Викиречник страница со:
{{#invoke:TestAdjectives|run_tests}}
All 76 test cases passed successfully!
или:
{{#invoke:el-c-conj-tests|run_tests}}
Овие повици се наменети за развој и проверка на правилноста на деклинацијата.
При промена на логиката на el-c-conj, препорачливо е да се извршат тестовите за да се провери дали промената не влијаела врз веќе поддржаните типови на придавки.
Пример на страница
На страницата на конкретна придавка може да се постави:
{{el-cases-conj|{{PAGENAME}}|η}}
или, ако придавката има женска форма на -α:
{{el-cases-conj|{{PAGENAME}}|α}}
Ако се дозволени и двете варијанти:
{{el-cases-conj|{{PAGENAME}}|αη}}
Ако не е потребен избор:
{{el-cases-conj|{{PAGENAME}}}} Забелешка за развој
Деклинациските правила се имплементирани во Lua-модулот el-c-conj. Главната функција прво ја одредува основата и завршетокот на зборот, а потоа избира соодветна деклинациска шема.
При додавање нова деклинациска шема, потребно е:
да се додаде препознавање на соодветниот завршеток; да се дефинираат формите за сите четири падежи; за секој падеж да се зададат машки, женски и среден род во еднина и множина; да се додадат соодветни тестови; да се извршат тестовите преку еден од тест-модулите.
На овој начин деклинацискиот систем може постепено да се проширува без да се менува начинот на кој се повикува шаблонот на страниците на придавките.
local export = {}
------------------------------------------------------------
-- Помошни функции
------------------------------------------------------------
-- Отстранување на акцент од грчки збор
local function remove_accent(str)
return mw.ustring.gsub(str, "[άέήίόύώ]", {
["ά"] = "α",
["έ"] = "ε",
["ή"] = "η",
["ί"] = "ι",
["ό"] = "ο",
["ύ"] = "υ",
["ώ"] = "ω"
})
end
-- Проверка дали зборот/основата има акцент
local function has_accent(str)
return mw.ustring.find(str, "[άέήίόύώ]") ~= nil
end
-- Одредување на коренот и наставката
local function get_base_and_ending(str)
local lstr = mw.ustring.len(str)
-- Наставки од 4 букви
if lstr >= 4 then
local ending4 = mw.ustring.sub(str, lstr - 3, lstr)
if ending4 == "άρης" or ending4 == "ικός" then
return mw.ustring.sub(str, 1, lstr - 4), ending4
end
end
-- Наставки од 3 букви
if lstr >= 3 then
local ending3 = mw.ustring.sub(str, lstr - 2, lstr)
if ending3 == "αντος" or ending3 == "οντας" then
return mw.ustring.sub(str, 1, lstr - 3), ending3
end
end
-- Наставки од 2 букви
if lstr >= 2 then
local ending2 = mw.ustring.sub(str, lstr - 1, lstr)
if ending2 == "ής"
or ending2 == "ης"
or ending2 == "ός"
or ending2 == "ος"
or ending2 == "ων"
or ending2 == "ών"
or ending2 == "ύς"
or ending2 == "ως" then
return mw.ustring.sub(str, 1, lstr - 2), ending2
end
end
-- Последна буква
if lstr > 0 then
return mw.ustring.sub(str, 1, lstr - 1),
mw.ustring.sub(str, lstr, lstr)
end
return str, ""
end
------------------------------------------------------------
-- Придавки / партиципи на -ων / -ών
------------------------------------------------------------
local function get_on_declensions(str, target_case)
local lstr = mw.ustring.len(str)
-- Корен без -ων / -ών
local base_part = mw.ustring.sub(str, 1, lstr - 2)
-- Дали основната форма завршува на -ών
local is_oxytone = (mw.ustring.find(str, "ών$") ~= nil)
--------------------------------------------------------
-- -ών
--
-- пример:
-- παρών
-- παρόν
-- παρούσα
-- παρόντες
-- παρούσες
-- παρόντων
-- παρουσών
--------------------------------------------------------
if is_oxytone then
local f = {}
if target_case == "Nom" then
f.s_m = str
f.s_f = base_part .. "ούσα"
f.s_n = base_part .. "όν"
f.pl_m = base_part .. "όντες"
f.pl_f = base_part .. "ούσες"
f.pl_n = base_part .. "όντα"
elseif target_case == "Gen" then
f.s_m = base_part .. "όντος"
f.s_f = base_part .. "ούσας"
f.s_n = base_part .. "όντος"
f.pl_m = base_part .. "όντων"
f.pl_f = base_part .. "ουσών"
f.pl_n = base_part .. "όντων"
elseif target_case == "Acu" then
f.s_m = base_part .. "όντα"
f.s_f = base_part .. "ούσα"
f.s_n = base_part .. "όν"
f.pl_m = base_part .. "όντες"
f.pl_f = base_part .. "ούσες"
f.pl_n = base_part .. "όντα"
elseif target_case == "Voc" then
f.s_m = str
f.s_f = base_part .. "ούσα"
f.s_n = base_part .. "όν"
f.pl_m = base_part .. "όντες"
f.pl_f = base_part .. "ούσες"
f.pl_n = base_part .. "όντα"
end
return f
end
--------------------------------------------------------
-- -ων
--
-- пример:
-- επείγων
-- επείγον
-- επείγουσα
-- επείγοντες
-- επείγουσες
-- επειγόντων
-- επειγουσών
--------------------------------------------------------
local f = {}
if target_case == "Nom" then
f.s_m = str
f.s_f = base_part .. "ουσα"
f.s_n = base_part .. "ον"
f.pl_m = base_part .. "οντες"
f.pl_f = base_part .. "ουσες"
f.pl_n = base_part .. "οντα"
elseif target_case == "Gen" then
f.s_m = base_part .. "οντος"
f.s_f = base_part .. "ουσας"
f.s_n = base_part .. "οντος"
-- Во генитив множина акцентот е на наставката.
local base_no_accent = remove_accent(base_part)
f.pl_m = base_no_accent .. "όντων"
f.pl_f = base_no_accent .. "ουσών"
f.pl_n = base_no_accent .. "όντων"
elseif target_case == "Acu" then
f.s_m = base_part .. "οντα"
f.s_f = base_part .. "ουσα"
f.s_n = base_part .. "ον"
f.pl_m = base_part .. "οντες"
f.pl_f = base_part .. "ουσες"
f.pl_n = base_part .. "οντα"
elseif target_case == "Voc" then
f.s_m = str
f.s_f = base_part .. "ουσα"
f.s_n = base_part .. "ον"
f.pl_m = base_part .. "οντες"
f.pl_f = base_part .. "ουσες"
f.pl_n = base_part .. "οντα"
end
return f
end
------------------------------------------------------------
-- Придавки на -ύς
--
-- пример:
-- μακρύς → μακριά → μακρύ
------------------------------------------------------------
local function get_ys_declensions(base, target_case)
local decls = {
Nom = {
s_m = base .. "ύς",
s_f = base .. "ιά",
s_n = base .. "ύ",
pl_m = base .. "ιοί",
pl_f = base .. "ιές",
pl_n = base .. "ιά"
},
Gen = {
s_m = base .. "ιού",
s_f = base .. "ιάς",
s_n = base .. "ιού",
pl_m = base .. "ιών",
pl_f = base .. "ιών",
pl_n = base .. "ιών"
},
Acu = {
s_m = base .. "ύ",
s_f = base .. "ιά",
s_n = base .. "ύ",
pl_m = base .. "ιούς",
pl_f = base .. "ιές",
pl_n = base .. "ιά"
},
Voc = {
s_m = base .. "ύ",
s_f = base .. "ιά",
s_n = base .. "ύ",
pl_m = base .. "ιοί",
pl_f = base .. "ιές",
pl_n = base .. "ιά"
}
}
return decls[target_case]
end
------------------------------------------------------------
-- Главна функција
------------------------------------------------------------
local function get_forms(str, svr, target_case)
local base, ending = get_base_and_ending(str)
local f = nil
--------------------------------------------------------
-- -ικός
--------------------------------------------------------
if ending == "ικός" then
if target_case == "Nom" then
f = {
s_m = base .. "ικός",
s_f = base .. "ική",
s_n = base .. "ικό",
pl_m = base .. "ικοί",
pl_f = base .. "ικές",
pl_n = base .. "ικά"
}
elseif target_case == "Gen" then
f = {
s_m = base .. "ικού",
s_f = base .. "ικής",
s_n = base .. "ικού",
pl_m = base .. "ικών",
pl_f = base .. "ικών",
pl_n = base .. "ικών"
}
elseif target_case == "Acu" then
f = {
s_m = base .. "ικό",
s_f = base .. "ική",
s_n = base .. "ικό",
pl_m = base .. "ικούς",
pl_f = base .. "ικές",
pl_n = base .. "ικά"
}
elseif target_case == "Voc" then
f = {
s_m = base .. "ικέ",
s_f = base .. "ική",
s_n = base .. "ικό",
pl_m = base .. "ικοί",
pl_f = base .. "ικές",
pl_n = base .. "ικά"
}
end
--------------------------------------------------------
-- -ύς
--------------------------------------------------------
elseif ending == "ύς" then
f = get_ys_declensions(base, target_case)
--------------------------------------------------------
-- -ός
--------------------------------------------------------
elseif ending == "ός" then
local fem_s =
(svr == "α")
and (base .. "ά")
or (base .. "ή")
local fem_g_s =
(svr == "α")
and (base .. "άς")
or (base .. "ής")
if target_case == "Nom" then
f = {
s_m = base .. "ός",
s_f = fem_s,
s_n = base .. "ό",
pl_m = base .. "οί",
pl_f = base .. "ές",
pl_n = base .. "ά"
}
elseif target_case == "Gen" then
f = {
s_m = base .. "ού",
s_f = fem_g_s,
s_n = base .. "ού",
pl_m = base .. "ών",
pl_f = base .. "ών",
pl_n = base .. "ών"
}
elseif target_case == "Acu" then
f = {
s_m = base .. "ό",
s_f = fem_s,
s_n = base .. "ό",
pl_m = base .. "ούς",
pl_f = base .. "ές",
pl_n = base .. "ά"
}
elseif target_case == "Voc" then
f = {
s_m = base .. "έ",
s_f = fem_s,
s_n = base .. "ό",
pl_m = base .. "οί",
pl_f = base .. "ές",
pl_n = base .. "ά"
}
end
--------------------------------------------------------
-- -ος
--------------------------------------------------------
elseif ending == "ος" then
local fem_s, fem_g_s
if svr == "αη" then
fem_s =
base .. "α / " .. base .. "η"
fem_g_s =
base .. "ας / " .. base .. "ης"
elseif svr == "α" then
fem_s = base .. "α"
fem_g_s = base .. "ας"
else
fem_s = base .. "η"
fem_g_s = base .. "ης"
end
if target_case == "Nom" then
f = {
s_m = base .. "ος",
s_f = fem_s,
s_n = base .. "ο",
pl_m = base .. "οι",
pl_f = base .. "ες",
pl_n = base .. "α"
}
elseif target_case == "Gen" then
f = {
s_m = base .. "ου",
s_f = fem_g_s,
s_n = base .. "ου",
pl_m = base .. "ων",
pl_f = base .. "ων",
pl_n = base .. "ων"
}
elseif target_case == "Acu" then
f = {
s_m = base .. "ο",
s_f = fem_s,
s_n = base .. "ο",
pl_m = base .. "ους",
pl_f = base .. "ες",
pl_n = base .. "α"
}
elseif target_case == "Voc" then
f = {
s_m = base .. "ε",
s_f = fem_s,
s_n = base .. "ο",
pl_m = base .. "οι",
pl_f = base .. "ες",
pl_n = base .. "α"
}
end
--------------------------------------------------------
-- -ων / -ών
--------------------------------------------------------
elseif ending == "ων" or ending == "ών" then
f = get_on_declensions(str, target_case)
--------------------------------------------------------
-- -ως
--------------------------------------------------------
elseif ending == "ως" then
if target_case == "Nom" then
f = {
s_m = str,
s_f = str,
s_n = str,
pl_m = str,
pl_f = str,
pl_n = str
}
elseif target_case == "Gen" then
f = {
s_m = str,
s_f = str,
s_n = str,
pl_m = str,
pl_f = str,
pl_n = str
}
elseif target_case == "Acu" then
f = {
s_m = str,
s_f = str,
s_n = str,
pl_m = str,
pl_f = str,
pl_n = str
}
elseif target_case == "Voc" then
f = {
s_m = str,
s_f = str,
s_n = str,
pl_m = str,
pl_f = str,
pl_n = str
}
end
--------------------------------------------------------
-- -ής / -ης
--
-- Δύο βασικοί τύποι:
--
-- ακριβής → ακριβές → ακριβείς → ακριβή
--
-- ουσιώδης → ουσιώδες → ουσιώδεις → ουσιώδη
--------------------------------------------------------
elseif ending == "ής" or ending == "ης" then
local stem_accented = has_accent(base)
local nom_m_f
local nom_n
local nom_pl_m_f
local nom_pl_n
local gen_s
local gen_pl
local acu_m_f
local acu_n
local voc_m_f
local voc_n
if stem_accented then
------------------------------------------------
-- ουσιώδης
------------------------------------------------
nom_m_f = base .. "ης"
nom_n = base .. "ες"
nom_pl_m_f = base .. "εις"
nom_pl_n = base .. "η"
gen_s = base .. "ους"
-- IMPORTANT:
-- Preserve the accent of the stem.
-- Expected by the test:
-- ουσιώδης → ουσιώδων
gen_pl = base .. "ων"
acu_m_f = base .. "η"
acu_n = base .. "ες"
voc_m_f = base .. "η"
voc_n = base .. "ες"
else
------------------------------------------------
-- ακριβής
------------------------------------------------
nom_m_f = base .. "ής"
nom_n = base .. "ές"
nom_pl_m_f = base .. "είς"
nom_pl_n = base .. "ή"
gen_s = base .. "ούς"
gen_pl = base .. "ών"
acu_m_f = base .. "ή"
acu_n = base .. "ές"
voc_m_f = base .. "ή"
voc_n = base .. "ές"
end
if target_case == "Nom" then
f = {
s_m = nom_m_f,
s_f = nom_m_f,
s_n = nom_n,
pl_m = nom_pl_m_f,
pl_f = nom_pl_m_f,
pl_n = nom_pl_n
}
elseif target_case == "Gen" then
f = {
s_m = gen_s,
s_f = gen_s,
s_n = gen_s,
pl_m = gen_pl,
pl_f = gen_pl,
pl_n = gen_pl
}
elseif target_case == "Acu" then
f = {
s_m = acu_m_f,
s_f = acu_m_f,
s_n = acu_n,
pl_m = nom_pl_m_f,
pl_f = nom_pl_m_f,
pl_n = nom_pl_n
}
elseif target_case == "Voc" then
f = {
s_m = voc_m_f,
s_f = voc_m_f,
s_n = voc_n,
pl_m = nom_pl_m_f,
pl_f = nom_pl_m_f,
pl_n = nom_pl_n
}
end
--------------------------------------------------------
-- -άρης
--------------------------------------------------------
elseif ending == "άρης" then
if target_case == "Nom" then
f = {
s_m = base .. "άρης",
s_f = base .. "άρα",
s_n = base .. "άρικο",
pl_m = base .. "άρηδες",
pl_f = base .. "άρες",
pl_n = base .. "άρικα"
}
elseif target_case == "Gen" then
f = {
s_m = base .. "άρη",
s_f = base .. "άρας",
s_n = base .. "άρικου",
pl_m = base .. "άρηδων",
pl_f = base .. "άρων",
pl_n = base .. "άρικων"
}
elseif target_case == "Acu" then
f = {
s_m = base .. "άρη",
s_f = base .. "άρα",
s_n = base .. "άρικο",
pl_m = base .. "άρηδες",
pl_f = base .. "άρες",
pl_n = base .. "άρικα"
}
elseif target_case == "Voc" then
f = {
s_m = base .. "άρη",
s_f = base .. "άρα",
s_n = base .. "άρικο",
pl_m = base .. "άρηδες",
pl_f = base .. "άρες",
pl_n = base .. "άρικα"
}
end
--------------------------------------------------------
-- Основна стандардна шема
--------------------------------------------------------
else
local fem_s =
(svr == "α")
and (base .. "α")
or (base .. "η")
local fem_g_s =
(svr == "α")
and (base .. "ας")
or (base .. "ης")
if target_case == "Nom" then
f = {
s_m = str,
s_f = fem_s,
s_n = base .. "ο",
pl_m = base .. "οι",
pl_f = base .. "ες",
pl_n = base .. "α"
}
elseif target_case == "Gen" then
f = {
s_m = base .. "ου",
s_f = fem_g_s,
s_n = base .. "ου",
pl_m = base .. "ων",
pl_f = base .. "ων",
pl_n = base .. "ων"
}
elseif target_case == "Acu" then
f = {
s_m = base .. "ο",
s_f = fem_s,
s_n = base .. "ο",
pl_m = base .. "ους",
pl_f = base .. "ες",
pl_n = base .. "α"
}
elseif target_case == "Voc" then
f = {
s_m = base .. "ε",
s_f = fem_s,
s_n = base .. "ο",
pl_m = base .. "οι",
pl_f = base .. "ες",
pl_n = base .. "α"
}
end
end
--------------------------------------------------------
-- Безбедносен fallback
--------------------------------------------------------
if not f then
f = {
s_m = "",
s_f = "",
s_n = "",
pl_m = "",
pl_f = "",
pl_n = ""
}
end
--------------------------------------------------------
-- Излез за Wiktionary
--------------------------------------------------------
return string.format(
"|-\n |'''%s''' ||[[%s]]||[[%s]]||[[%s]]||[[%s]]||[[%s]]||[[%s]]",
target_case == "Nom" and "Номинатив"
or target_case == "Gen" and "Генитив"
or target_case == "Acu" and "Акузатив"
or "Вокатив",
f.s_m,
f.s_f,
f.s_n,
f.pl_m,
f.pl_f,
f.pl_n
)
end
------------------------------------------------------------
-- Експортирани функции за Викиречник
------------------------------------------------------------
function export.Nominativ_case(frame)
local args = frame:getParent().args
return get_forms(
mw.text.trim(args[1] or ""),
mw.text.trim(args[2] or ""),
"Nom"
)
end
function export.Genitiv_case(frame)
local args = frame:getParent().args
return get_forms(
mw.text.trim(args[1] or ""),
mw.text.trim(args[2] or ""),
"Gen"
)
end
function export.Acusativ_case(frame)
local args = frame:getParent().args
return get_forms(
mw.text.trim(args[1] or ""),
mw.text.trim(args[2] or ""),
"Acu"
)
end
function export.Vocativ_case(frame)
local args = frame:getParent().args
return get_forms(
mw.text.trim(args[1] or ""),
mw.text.trim(args[2] or ""),
"Voc"
)
end
return export