Уикиречник
bgwiktionary
https://bg.wiktionary.org/wiki/%D0%A3%D0%B8%D0%BA%D0%B8%D1%80%D0%B5%D1%87%D0%BD%D0%B8%D0%BA:%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D0%BD%D0%B0_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0
MediaWiki 1.47.0-wmf.24
case-sensitive
Медия
Специални
Беседа
Потребител
Потребител беседа
Уикиречник
Уикиречник беседа
Файл
Файл беседа
МедияУики
МедияУики беседа
Шаблон
Шаблон беседа
Помощ
Помощ беседа
Категория
Категория беседа
Словоформи
Словоформи беседа
TimedText
TimedText talk
Модул
Модул беседа
Event
Event talk
Шаблон:Noun
10
1882
1147612
1147488
2026-10-19T11:21:16Z
Златарка
21355
1147612
wikitext
text/x-wiki
<div>
[[Категория:Съществителни имена ({{{{{ЕЗИК}}}}})]] __БЕЗ_РЕДАКТИРАНЕ_НА_РАЗДЕЛИ__
{{#if:{{{ЗНАЧЕНИЕ|}}}|
=== Съществително име{{#if:{{{РОД|}}}|, ''{{#switch: {{{РОД}}}
| м
| мъжки = {{-м}}
| ж
| женски = {{-ж}}
| ср
| среден = {{-ср}}
| ''Кодове за род: м, ж, ср''
}}''|}}===
{{{ЗНАЧЕНИЕ}}}
|}}
{{#if:{{{МФА|}}}|
==== Произношение ====
* МФА: {{{МФА}}}
|}}
{{#if:{{{АУДИО|}}}|
* Звук: {{{АУДИО}}}
|}}
{{#if:{{{ЕТИМОЛОГИЯ|}}}|
==== Етимология ====
{{{ЕТИМОЛОГИЯ}}}
|}}
{{#if:{{{СИНОНИМИ|}}}|
==== Синоними ====
{{{СИНОНИМИ}}}
|}}
{{#if:{{{АНТОНИМИ|}}}|
==== Антоними ====
{{{АНТОНИМИ}}}
|}}
{{#if:{{{СРОДНИ ДУМИ|}}}|
==== Сродни думи ====
{{{СРОДНИ ДУМИ}}}
|}}
{{#if:{{{ПРОИЗВОДНИ ДУМИ|}}}|
==== Производни думи ====
{{{ПРОИЗВОДНИ ДУМИ}}}
|}}
{{#if:{{{ИЗРАЗИ|}}}|
==== Фразеологични изрази ====
{{{ИЗРАЗИ}}}
|}}
{{#if:{{{ИЗТОЧНИЦИ|}}}|
==== Източници ====
{{{ИЗТОЧНИЦИ}}}
|}}
{{#if:{{{ДРУГИ|}}}|
==== Други ====
{{{ДРУГИ}}}
|}}
</div>
<noinclude>
<nowiki>{{Noun</nowiki>
<br>| ID =
<br>| ЕЗИК =
<br>| ЗНАЧЕНИЕ =
<br>| РОД =
<br>| МФА =
<br>| ЗВУК =
<br>| ЕТИМОЛОГИЯ =
<br>| ИЗРАЗИ =
<br>| СИНОНИМИ =
<br>| АНТОНИМИ =
<br>| СРОДНИ ДУМИ =
<br>| ПРОИЗВОДНИ ДУМИ =
<br>| ИЗТОЧНИЦИ =
<br>| ДРУГИ =
<br>}}
</noinclude>
o2wszldrw9bc68yzs33qcs7uezlgpxl
момиче
0
214703
1147609
1147604
2026-10-19T10:40:24Z
Златарка
21355
1147609
wikitext
text/x-wiki
{{Уикипедия}}
{{-bg-}}
{{Съществително нарицателно име|
ID = момиче
| ЗНАЧЕНИЕ =
'''момѝче'''
# Женско дете {{рне|човек от женски пол на малка възраст}}
#: {{пру|език=български|откъс=Един цар напуснал жена си, която чакала дете, и се оженил за друга. Дал на изгонената царица една голяма къща с много земя и й заръчал: ако роди {{ц|момиче}}, да го задържи при себе си, а добие ли момче, да го изпрати при него, щом порасне.|съчинител=Български народ|година=1995|произведение=Жива вода, в сборника „Български народни вълшебни приказки“|връзка=https://chitanka.info/text/29391-zhiva-voda}}
#: {{пру|език=български|откъс=— Аз ще попътувам, мамо – каза сънено малкото {{ц|момиче}}. — Добре, миличка. Лека нощ – отвърна майка ѝ. Така наричаше съня си малката Теди – пътуване. И по време на тези нейни „разходки” тя виждаше всякакви чудеса и изживяваше многобройни приключения. Често 8-годишното {{ц|момиче}} не можеше да направи ясна разлика между будното и заспалото състояние.|съчинител=Алманах „Нова българска литература“|година=2019|произведение=Нощен свят|връзка=https://www.bukvite.bg/e-book/pdf/proza2019.pdf}} {{Снимка|файл2=Dimitar Dobrovich - Portret na momiche.jpg|файл=Никола Маринов - Портрет на момиче.jpg|ширина=220|ширина2=220|разполагане=отвесно дясно|кутии=да|тясно=да}}
# Дъщеря {{рне|нечие дете от женски пол}} {{рне|със съгласувано или несъгласувано определение}}
#: {{пру|език=български|откъс=Скоро той довел вкъщи новата си жена. Мащехата също си имала {{ц|момиче}} и така намразила заварената си дъщеря, че не можела да я търпи.|съчинител=Български народ|година=1995|произведение=Златното момиче, в сборника „Български народни вълшебни приказки“|връзка=https://chitanka.info/text/29396}}
# Мома, девойка, млада жена {{рне|човек от женски пол на млада възраст}}
#: {{пру|език=български|откъс=— Милка — {{ц|момиче}} младо, хубаво. Ех, грешило, бъркало от глупост, с тоя ум не ще остане я! Умът дохожда по-нататък. Па като се обичат, нека се вземат. С обич и сговор да си живуват, както господ дал.|съчинител=Иван Вазов|произведение=Под игото, глава 89|връзка=https://chitanka.info/text/3753/89}}
#: {{пру|език=български|откъс=Може би не беше, а може би беше. Не правим ли всички ние един човек най, най-нашият — и той е с черен поглед, черна коса, черна брада. Този на дъщеря й, вероятно беше намерил някое друго {{ц|момиче}} — което е напълно естествено.|съчинител=Пламък|година=2025|произведение=Щастлив разказ за Ели, сп. „Пламък“, бр. 2, с. 47|връзка=https://sbp.bg/wp-content/uploads/2025/07/Pl-2-edit.pdf}}
# {{упо|bg|разг.}} Гадже, приятелка {{рне|любима млада жена}} {{рне|със притежателно местоимение, обикн. в ед.ч.}}
# {{упо|bg|остар.}} Прислужница
| РОД = ср
| ТИП = 65
| ЕТИМОЛОГИЯ =
Производна от [[мома]], чрез основата мом- и разширената наставка -(и)че. Първоначално е употребявана като умалително-гальовно название, впоследствие придобило неутрално значение.
| ИЗГОВОР =
* {{звук}}: {{аудио|LL-Q7918 (bul)-Kiril kovachev-момиче.wav|момиче|bg}}
| ИЗРАЗИ =
* (ирон.) ''Язък за момичето, изгоря момчето''; ''Язък за момичето, че изгори момчето.'' "момиче и момче които са дружки или двойка и имат еднакви недостатъци"
| ПРЕВОД1 =
* албански: {{п|sq|vajzë}}
* английски: {{п|en|girl|произ=гъръл}}
* арабски: {{п|ar|بنت|ж|произ=бинт}} (bint)
* арменски: {{п|hy|աղջիկ|произ=ахчик}} (ałǰik)
* африкаанс: {{п|af|meisie}}
* баски: {{п|eu|neska}}
* белоруски: {{п|be|дзяўчына|f}}
* гръцки: {{п|el|κορίτσι}}
*: старогръцки: {{п|grc|κόρη}}
* датски: {{п|da|pige}}
* есперанто: {{п|eo|knabino}}
* естонски: {{п|et|tüdruk}}
* иврит: {{п|he|ילדה}} (yaldá)
* индонезийски: {{п|id|gadis}}
* ирландски: {{п|ga|cailín}}
* исландски: {{п|is|stúlka}}
* испански: {{п|es|niña}}
* италиански: {{п|it|ragazza}}
* китайски: {{п|zh|女孩}}
* корейски: {{п|ko|소녀}}
* латвийски: {{п|lv|meitene}}
* латински: {{п|la|puella}}
* литовски: {{п|lt|mergina}}
| ПРЕВОД2 =
* македонски: {{п|mk|девојка}}, {{п|mk|девојче}}, {{п|mk|чупе}}
* немски: {{п|de|Mädchen|произ=метхен}}
* норвежки: {{п|no|jente}}
* персийски: {{п|fa|دختر|произ=дохтар}} (doxtar)
* полски: {{п|pl|dziewczyna}}
* португалски: {{п|pt|garota}}
* румънски: {{п|ro|fată}}
* руски: {{п|ru|девушка}}, {{п|ru|девочка}}
* словашки: {{п|sk|dievča}}
* словенски: {{п|sl|dekle}}
* сръбски: {{п|sr|девојка}}
* тайландски: {{п|th|เด็กผู้หญิง}}
* турски: {{п|tr|kız}}
* украински: {{п|uk|дівчина}}
* унгарски: {{п|hu|lány}}
* фински: {{п|fi|tyttö}}
* френски: {{п|fr|fille}}
* холандски: {{п|nl|meisje}}
* хърватски: {{п|hr|devojka}}
* чешки: {{п|cs|holka}}
* шведски: {{п|sv|flicka}}
* японски: {{п|ja|女の子}}
| СИНОНИМИ =
* [[девойче]], [[хлапачка]], [[госпожичка]], [[малка]]
* [[дъщеря]], [[щерка]], [[малката]]
* [[девойка]], млада жена, [[госпожица]]
* [[девойка]], [[приятелка]], [[гадже]], [[дама]], [[любима]]
* [[прислужница]], [[слугиня]], [[слугинче]]
| АНТОНИМИ =
''по пол''
* [[момче]], [[хлапак]], [[малък]], [[господинчо]]
* [[момче]], [[син]], [[малкия]]/[[малкият]]
* [[момче]], [[момък]], [[младеж]], [[господинчо]]
* [[момче]], [[прислужник]], [[слуга]]
''по възраст''
* [[възрастна]], [[старица]], [[баба]]
| СРОДНИ ДУМИ =
* ''същ.'' [[мома]] (и производните ѝ)
* ''прил.'' [[момински]]
* ''глаг.'' [[момея се]], [[момувам]]
| ПРОИЗВОДНИ ДУМИ =
* ''същ.'' [[момичество]], [[момичетия]]
** ''умал.'' [[момиченце]]
** ''увел.'' [[момичище]]
* ''прил.'' [[момичешки]]
| НАДСЛОВИЯ =
* [[жена]] {{рне|човек от женски пол}}
* [[човек]], [[личност]], [[лице]], [[особа]]
| ПОДСЛОВИЯ =
* [[момиченце]] {{рне|малко момиче}}
| ИЗТОЧНИЦИ =
# {{ИБЕМ}}
# {{РБЕ}}
| ДРУГИ =
}}
{{-mk-}}
{{Уикиречник|език-код=mk|език-име=македонски}}
{{Noun|
ID = мòмиче
| ЕЗИК = mk
| ЗНАЧЕНИЕ =
'''мо̀миче''' ({{упо|mk|диал.|обхват=дума}}) {{мак-същ|момиче|ср}}
# [[мома]]
# момиче {{рне|дете от женски пол}}
| IPA =
| РОД = ж
| ЕТИМОЛОГИЯ = Производна от [[мома]], чрез основата мом- и разширената наставка -(и)че.
| ИЗРАЗИ =
| СИНОНИМИ =
* [[девојка]], [[девојче]], [[чупе]]
| АНТОНИМИ =
* ''по пол'' [[момче]]
| СРОДНИ ДУМИ =
* [[мома]], [[момок]]
| ИЗТОЧНИЦИ =
# {{РМАК}}
}}
2bzz7zey6tuofxctrtgduj0tu4mj872
девојка
0
909361
1147615
1132185
2026-10-19T11:46:22Z
Златарка
21355
1147615
wikitext
text/x-wiki
{{-mk-}}
{{друга-Уикипедия|език-код=mk|език-име=македонски}}{{Уикиречник|език-код=mk|език-име=македонски}}
{{Noun|
ID = девојка
| ЕЗИК = bg
| ЗНАЧЕНИЕ = '''дèвоjка''' {{мак-същ|девоjка|ж|зв=девоjко}}
# [[девойка]], [[момиче]] {{рне|млад човек от женски пол}}
# [[приятелка]], женско [[гадже]]
| IPA =
| РОД = ж
| ЕТИМОЛОГИЯ =
| ИЗРАЗИ =
| СИНОНИМИ =
| СРОДНИ ДУМИ =
| ПРОИЗВОДНИ ДУМИ =
* ''същ.'' [[девоjче]]
* ''прил.'' [[девоjкин]]
| ИЗТОЧНИЦИ =
# {{РМАК}}
}}
{{-sr-}}
{{Noun|
ID = девојка
| ЕЗИК = sr
| ЗНАЧЕНИЕ = '''дѐво̄јка'''
# [[момиче]]
| IPA = [ˈdɛvɔjka]
| РОД = ж
| ЕТИМОЛОГИЯ =
| ИЗРАЗИ =
| СИНОНИМИ =
| АНТОНИМИ =
* ''по пол'' [[дечко]], [[дјечак]]
| СРОДНИ ДУМИ =
| ПРОИЗВОДНИ ДУМИ =
}}
84vdu6t0bdrzguweugyosde1lw6td8g
Модул:Упо
828
912597
1147616
1147591
2026-10-19T11:54:28Z
Златарка
21355
1147616
Scribunto
text/plain
local p = {}
local labels = {
['разг.'] = {
whole = 'Разговорни думи',
sense = 'Думи с разговорни значения'
},
['жарг.'] = {
whole = 'Жаргонни думи',
sense = 'Думи с жаргонни значения'
},
['диал.'] = {
whole = 'Диалектни думи',
sense = 'Думи с диалектни значения'
},
['остар.'] = {
whole = 'Остарели думи',
sense = 'Думи с остарели значения'
},
['прен.'] = {
whole = 'Думи с преносна употреба',
sense = 'Думи с преносни значения'
},
['руг.'] = {
whole = 'Ругателно думи',
sense = 'Думи с ругателни значения'
},
['спец.'] = {
whole = 'Специализирани термини',
sense = 'Специализирани значения'
},
['обикн. в мн.'] = {
whole = 'обикновено в множествено число',
sense = '',
category = false
},
['само мн.'] = {
whole = 'само в множествено число',
sense = '',
category = false
},
['само ед.'] = {
whole = 'само в единствено число',
sense = '',
category = false
},
['обикн. в ед.'] = {
whole = 'обикновено в единствено число',
sense = '',
category = false
},
['разш.'] = {
whole = 'с разширено значение',
sense = '',
category = false
}
}
local languageForms = {
['bg'] = 'българския език',
['en'] = 'английския език',
['de'] = 'немския език',
['fr'] = 'френския език',
['ru'] = 'руския език',
['es'] = 'испанския език',
['it'] = 'италианския език',
['el'] = 'гръцкия език',
['tr'] = 'турския език',
['ro'] = 'румънския език',
['sr'] = 'сръбския език',
['mk'] = 'македонския език',
['uk'] = 'украинския език',
['pl'] = 'полския език',
['la'] = 'латинския език'
}
local languageShortForms = {
['bg'] = 'български',
['en'] = 'английски',
['de'] = 'немски',
['fr'] = 'френски',
['ru'] = 'руски',
['es'] = 'испански',
['it'] = 'италиански',
['el'] = 'гръцки',
['tr'] = 'турски',
['ro'] = 'румънски',
['sr'] = 'сръбски',
['mk'] = 'македонски',
['uk'] = 'украински',
['pl'] = 'полски',
['la'] = 'латински'
}
local areas = {
['селско стопанство'] = 'селското стопанство',
['строителство'] = 'строителството',
['медицина'] = 'медицината',
['право'] = 'правото',
['ботаника'] = 'ботаниката',
['зоология'] = 'зоологията',
['химия'] = 'химията',
['биология'] = 'биологията',
['математика'] = 'математиката',
['физика'] = 'физиката',
['лингвистика'] = 'лингвистиката',
['техника'] = 'техниката',
['музика'] = 'музиката',
['спорт'] = 'спорта',
['мореплаване'] = 'мореплаването',
['земеделие'] = 'земеделието',
['кулинария'] = 'кулинарията'
}
local function getLanguageName(lang, withArticle)
local forms = withArticle and languageForms
or languageShortForms
if forms[lang] then
return forms[lang]
end
local name = mw.language.fetchLanguageName(lang, 'bg')
if not name or name == '' then
return lang
end
return name
end
function p.main(frame)
local args = frame:getParent().args
local lang = mw.text.trim(args[1] or '')
local label = mw.text.trim(args[2] or '')
local scope = mw.text.trim(args['обхват'] or 'значение')
local area = mw.text.trim(args['област'] or '')
local data = labels[label]
if lang == '' or not mw.language.isKnownLanguageTag(lang) then
return '<strong class="error">Посочете валиден езиков код.</strong>'
end
if not data then
return '<strong class="error">Неизвестно означение.</strong>'
end
if scope ~= 'дума' and scope ~= 'значение' then
return '<strong class="error">Обхватът трябва да бъде „дума“ или „значение“.</strong>'
end
local reference = 'Уикиречник:Български/Съкращения'
local output = '[[' .. reference .. '#' .. label .. '|' .. label .. ']]'
if area ~= '' then
output = output .. ' <span style="color:#777; font-size:90%;">('
.. area .. ')</span>'
end
-- Създаване на категория само ако е разрешено за означението.
if mw.title.getCurrentTitle().namespace == 0
and data.category ~= false then
local category
if scope == 'дума' then
category = data.whole
else
category = data.sense
end
-- Не създаваме категория, ако името ѝ е празно или липсва.
if category and category ~= '' then
if area ~= '' then
local areaKey = mw.ustring.lower(area)
local areaName = areas[areaKey] or area
local langName = getLanguageName(lang, false)
category = category .. ' в ' .. areaName ..
' (' .. langName .. ')'
else
local langName = getLanguageName(lang, true)
category = category .. ' в ' .. langName
end
output = output .. '[[Категория:' .. category .. ']]'
end
end
return output
end
return p
sjvv7w532udk7rvznh6wc15je49t2cu
1147617
1147616
2026-10-19T11:55:59Z
Златарка
21355
1147617
Scribunto
text/plain
local p = {}
local labels = {
['разг.'] = {
whole = 'Разговорни думи',
sense = 'Думи с разговорни значения'
},
['жарг.'] = {
whole = 'Жаргонни думи',
sense = 'Думи с жаргонни значения'
},
['диал.'] = {
whole = 'Диалектни думи',
sense = 'Думи с диалектни значения'
},
['остар.'] = {
whole = 'Остарели думи',
sense = 'Думи с остарели значения'
},
['прен.'] = {
whole = 'Думи с преносна употреба',
sense = 'Думи с преносни значения'
},
['руг.'] = {
whole = 'Ругателно думи',
sense = 'Думи с ругателни значения'
},
['спец.'] = {
whole = 'Специализирани термини',
sense = 'Специализирани значения'
},
['обикн. в мн.'] = {
whole = 'обикновено в множествено число',
sense = '',
category = false
},
['само мн.'] = {
whole = 'само в множествено число',
sense = '',
category = false
},
['само ед.'] = {
whole = 'само в единствено число',
sense = '',
category = false
},
['обикн. в ед.'] = {
whole = 'обикновено в единствено число',
sense = '',
category = false
},
['само член.'] = {
whole = 'само членувано',
sense = '',
category = false
},
['само нечлен.'] = {
whole = 'само нечленувано',
sense = '',
category = false
},
['разш.'] = {
whole = 'с разширено значение',
sense = '',
category = false
}
}
local languageForms = {
['bg'] = 'българския език',
['en'] = 'английския език',
['de'] = 'немския език',
['fr'] = 'френския език',
['ru'] = 'руския език',
['es'] = 'испанския език',
['it'] = 'италианския език',
['el'] = 'гръцкия език',
['tr'] = 'турския език',
['ro'] = 'румънския език',
['sr'] = 'сръбския език',
['mk'] = 'македонския език',
['uk'] = 'украинския език',
['pl'] = 'полския език',
['la'] = 'латинския език'
}
local languageShortForms = {
['bg'] = 'български',
['en'] = 'английски',
['de'] = 'немски',
['fr'] = 'френски',
['ru'] = 'руски',
['es'] = 'испански',
['it'] = 'италиански',
['el'] = 'гръцки',
['tr'] = 'турски',
['ro'] = 'румънски',
['sr'] = 'сръбски',
['mk'] = 'македонски',
['uk'] = 'украински',
['pl'] = 'полски',
['la'] = 'латински'
}
local areas = {
['селско стопанство'] = 'селското стопанство',
['строителство'] = 'строителството',
['медицина'] = 'медицината',
['право'] = 'правото',
['ботаника'] = 'ботаниката',
['зоология'] = 'зоологията',
['химия'] = 'химията',
['биология'] = 'биологията',
['математика'] = 'математиката',
['физика'] = 'физиката',
['лингвистика'] = 'лингвистиката',
['техника'] = 'техниката',
['музика'] = 'музиката',
['спорт'] = 'спорта',
['мореплаване'] = 'мореплаването',
['земеделие'] = 'земеделието',
['кулинария'] = 'кулинарията'
}
local function getLanguageName(lang, withArticle)
local forms = withArticle and languageForms
or languageShortForms
if forms[lang] then
return forms[lang]
end
local name = mw.language.fetchLanguageName(lang, 'bg')
if not name or name == '' then
return lang
end
return name
end
function p.main(frame)
local args = frame:getParent().args
local lang = mw.text.trim(args[1] or '')
local label = mw.text.trim(args[2] or '')
local scope = mw.text.trim(args['обхват'] or 'значение')
local area = mw.text.trim(args['област'] or '')
local data = labels[label]
if lang == '' or not mw.language.isKnownLanguageTag(lang) then
return '<strong class="error">Посочете валиден езиков код.</strong>'
end
if not data then
return '<strong class="error">Неизвестно означение.</strong>'
end
if scope ~= 'дума' and scope ~= 'значение' then
return '<strong class="error">Обхватът трябва да бъде „дума“ или „значение“.</strong>'
end
local reference = 'Уикиречник:Български/Съкращения'
local output = '[[' .. reference .. '#' .. label .. '|' .. label .. ']]'
if area ~= '' then
output = output .. ' <span style="color:#777; font-size:90%;">('
.. area .. ')</span>'
end
-- Създаване на категория само ако е разрешено за означението.
if mw.title.getCurrentTitle().namespace == 0
and data.category ~= false then
local category
if scope == 'дума' then
category = data.whole
else
category = data.sense
end
-- Не създаваме категория, ако името ѝ е празно или липсва.
if category and category ~= '' then
if area ~= '' then
local areaKey = mw.ustring.lower(area)
local areaName = areas[areaKey] or area
local langName = getLanguageName(lang, false)
category = category .. ' в ' .. areaName ..
' (' .. langName .. ')'
else
local langName = getLanguageName(lang, true)
category = category .. ' в ' .. langName
end
output = output .. '[[Категория:' .. category .. ']]'
end
end
return output
end
return p
ipp0dc8ljkz9ky0r8kx5gyka7bh5eg6
Модул:мак-същ
828
912600
1147606
1147596
2026-10-19T10:02:16Z
Златарка
21355
1147606
Scribunto
text/plain
local p = {}
local function trim(value)
return mw.text.trim(tostring(value or ''))
end
local function getArg(args, name)
local value = trim(args[name])
if value ~= '' then
return value
end
return nil
end
local function endsWith(word, ending)
if ending == '' then
return false
end
return mw.ustring.sub(
word,
-mw.ustring.len(ending)
) == ending
end
local function removeEnding(word, ending)
if endsWith(word, ending) then
return mw.ustring.sub(
word,
1,
-mw.ustring.len(ending) - 1
)
end
return word
end
local function isVowel(char)
return char == 'а'
or char == 'е'
or char == 'и'
or char == 'о'
or char == 'у'
end
local function isVowelEnding(word)
return endsWith(word, 'а')
or endsWith(word, 'е')
or endsWith(word, 'и')
or endsWith(word, 'о')
or endsWith(word, 'у')
end
local function syllabify(word)
word = trim(word)
if word == '' then
return word
end
if mw.ustring.find(word, '·', 1, true) then
return word
end
local chars = {}
for _, char in mw.ustring.gmatch(
word,
'([%z\1-\127\194-\244][\128-\191]*)'
) do
chars[#chars + 1] = char
end
local length = #chars
local vowelPositions = {}
for i = 1, length do
if isVowel(chars[i]) then
vowelPositions[#vowelPositions + 1] = i
end
end
if #vowelPositions <= 1 then
return word
end
local boundaries = {}
for i = 1, #vowelPositions - 1 do
local currentVowel = vowelPositions[i]
local nextVowel = vowelPositions[i + 1]
local consonantsBetween =
nextVowel - currentVowel - 1
local boundary
if consonantsBetween <= 0 then
-- Съседни гласни: разделяме между тях.
boundary = nextVowel
else
-- При съгласна или група съгласни
-- оставяме последната при следващата сричка.
boundary = nextVowel - 1
end
boundaries[#boundaries + 1] = boundary
end
local result = {}
local start = 1
for _, boundary in ipairs(boundaries) do
local part = {}
for i = start, boundary do
part[#part + 1] = chars[i]
end
result[#result + 1] = table.concat(part)
start = boundary + 1
end
local lastPart = {}
for i = start, length do
lastPart[#lastPart + 1] = chars[i]
end
if #lastPart > 0 then
result[#result + 1] = table.concat(lastPart)
end
return table.concat(result, '·')
end
local function displayForm(args, key, form)
local manual = getArg(args, key .. '.слогове')
if manual then
return manual
end
return syllabify(form)
end
local function getPlural(word, gender, args)
local explicit = getArg(args, 'мн')
if explicit then
return explicit
end
if gender == 'ж' then
if endsWith(word, 'а') then
return removeEnding(word, 'а') .. 'и'
end
return word .. 'и'
end
if gender == 'ср' then
if endsWith(word, 'че') then
return removeEnding(word, 'е') .. 'иња'
elseif endsWith(word, 'е') then
return removeEnding(word, 'е') .. 'иња'
elseif endsWith(word, 'о') then
return removeEnding(word, 'о') .. 'а'
end
return word .. 'а'
end
if gender == 'м' then
local pluralType = getArg(args, 'мн.тип')
if pluralType == 'ови' then
return word .. 'ови'
elseif pluralType == 'еви' then
return word .. 'еви'
elseif pluralType == 'и' then
return word .. 'и'
end
if mw.ustring.len(word) <= 4 then
return word .. 'ови'
end
return word .. 'и'
end
return word
end
local singularSuffixes = {
['м'] = {
['а'] = { 'та', 'ва', 'на' },
['vowel'] = { 'то', 'во', 'но' },
['consonant'] = { 'от', 'ов', 'он' }
},
['ж'] = {
['default'] = { 'та', 'ва', 'на' }
},
['ср'] = {
['default'] = { 'то', 'во', 'но' }
}
}
local function getSingularArticle(word, gender, suffixType)
local suffix
if gender == 'м' then
if endsWith(word, 'а') then
suffix = singularSuffixes['м']['а'][suffixType]
elseif isVowelEnding(word) then
suffix = singularSuffixes['м']['vowel'][suffixType]
else
suffix = singularSuffixes['м']['consonant'][suffixType]
end
elseif gender == 'ж' then
suffix = singularSuffixes['ж']['default'][suffixType]
else
suffix = singularSuffixes['ср']['default'][suffixType]
end
return word .. suffix
end
local function getPluralArticle(plural, suffixType)
local suffixes
if endsWith(plural, 'а') then
suffixes = { 'та', 'ва', 'на' }
else
suffixes = { 'те', 'ве', 'не' }
end
return plural .. suffixes[suffixType]
end
local function addCell(row, tagName, content, attrs)
local cell = row:tag(tagName)
if attrs then
for name, value in pairs(attrs) do
cell:attr(name, value)
end
end
cell:wikitext(content)
return cell
end
local STYLE = {
table = table.concat({
'border-collapse:collapse',
'border:1px solid #bfc1c3',
'background:#fff',
'color:#202122',
'font-size:100%',
'line-height:1.6',
'text-align:left',
'width:auto',
'max-width:100%',
'margin:0 0 1em 1em',
'float:right',
'clear:right'
}, ';') .. ';',
title = table.concat({
'background:#fff',
'border:0',
'padding:0 0 3px 0',
'text-align:center',
'font-size:110%',
'font-weight:700',
'white-space:nowrap'
}, ';') .. ';',
category = table.concat({
'background:#dfe2e4',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'font-weight:700',
'vertical-align:middle',
'white-space:nowrap'
}, ';') .. ';',
number = table.concat({
'background:#dfe2e4',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'font-weight:700',
'text-align:center',
'vertical-align:middle',
'white-space:nowrap'
}, ';') .. ';',
form = table.concat({
'background:#fff',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'text-align:left',
'white-space:nowrap'
}, ';') .. ';',
formLabel = table.concat({
'background:#fff',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'text-align:left',
'white-space:nowrap'
}, ';') .. ';',
vocativeLabel = table.concat({
'background:#dfe2e4',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'font-weight:700',
'text-align:left',
'white-space:nowrap'
}, ';') .. ';'
}
local function addInflectionGroup(
tableNode,
numberLabel,
baseForm,
commonForm,
nearForm,
farForm,
args,
prefix
)
local row = tableNode:tag('tr')
addCell(row, 'th', numberLabel, {
['rowspan'] = '4',
['style'] = STYLE.number
})
addCell(row, 'td', 'нечленувано', {
['style'] = STYLE.category
})
addCell(
row,
'td',
displayForm(args, prefix .. '.слогове', baseForm),
{
['style'] = STYLE.form
}
)
row = tableNode:tag('tr')
addCell(row, 'th', 'членувано', {
['rowspan'] = '3',
['style'] = STYLE.category
})
addCell(
row,
'td',
'<small>общо:</small> '
.. displayForm(
args,
prefix .. '.член.слогове',
commonForm
),
{
['style'] = STYLE.formLabel
}
)
row = tableNode:tag('tr')
addCell(
row,
'td',
'<small>близко:</small> '
.. displayForm(
args,
prefix .. '.близ.слогове',
nearForm
),
{
['style'] = STYLE.formLabel
}
)
row = tableNode:tag('tr')
addCell(
row,
'td',
'<small>далечно:</small> '
.. displayForm(
args,
prefix .. '.дал.слогове',
farForm
),
{
['style'] = STYLE.formLabel
}
)
end
function p.main(frame)
local args = frame:getParent().args
local word = trim(args[1])
local gender = getArg(args, 'род') or trim(args[2])
if word == '' then
word = mw.title.getCurrentTitle().text
end
if gender ~= 'м'
and gender ~= 'ж'
and gender ~= 'ср'
then
return '<strong class="error">'
.. 'Посочете род: м, ж или ср.'
.. '</strong>'
end
local plural = getPlural(word, gender, args)
local singularCommon =
getArg(args, 'ед.ч.член')
or getSingularArticle(word, gender, 1)
local singularNear =
getArg(args, 'ед.ч.близ')
or getSingularArticle(word, gender, 2)
local singularFar =
getArg(args, 'ед.ч.дал')
or getSingularArticle(word, gender, 3)
local pluralCommon =
getArg(args, 'мн.ч.член')
or getPluralArticle(plural, 1)
local pluralNear =
getArg(args, 'мн.ч.близ')
or getPluralArticle(plural, 2)
local pluralFar =
getArg(args, 'мн.ч.дал')
or getPluralArticle(plural, 3)
local vocative = getArg(args, 'зв') or word
local tableNode = mw.html.create('table')
:addClass('wikitable')
:addClass('inflection-table')
:cssText(STYLE.table)
local titleRow = tableNode:tag('tr')
addCell(titleRow, 'th', mw.ustring.upper(word), {
['colspan'] = '3',
['style'] = STYLE.title
})
addInflectionGroup(
tableNode,
'ед.ч.',
word,
singularCommon,
singularNear,
singularFar,
args,
'ед.ч'
)
addInflectionGroup(
tableNode,
'мн.ч.',
plural,
pluralCommon,
pluralNear,
pluralFar,
args,
'мн.ч'
)
local vocativeRow = tableNode:tag('tr')
addCell(vocativeRow, 'th', 'звателна форма', {
['colspan'] = '2',
['style'] = STYLE.vocativeLabel
})
addCell(
vocativeRow,
'td',
displayForm(args, 'зв.слогове', vocative),
{
['style'] = STYLE.form
}
)
return tostring(tableNode)
end
return p
5pvjnca3ccypkn9iqy6q6umrugms1el
1147607
1147606
2026-10-19T10:09:44Z
Златарка
21355
1147607
Scribunto
text/plain
local p = {}
local function trim(value)
return mw.text.trim(tostring(value or ''))
end
local function getArg(args, name)
local value = trim(args[name])
if value ~= '' then
return value
end
return nil
end
local function endsWith(word, ending)
if ending == '' then
return false
end
return mw.ustring.sub(
word,
-mw.ustring.len(ending)
) == ending
end
local function removeEnding(word, ending)
if endsWith(word, ending) then
return mw.ustring.sub(
word,
1,
-mw.ustring.len(ending) - 1
)
end
return word
end
local function isVowel(char)
return char == 'а'
or char == 'е'
or char == 'и'
or char == 'о'
or char == 'у'
end
local function isVowelEnding(word)
return endsWith(word, 'а')
or endsWith(word, 'е')
or endsWith(word, 'и')
or endsWith(word, 'о')
or endsWith(word, 'у')
end
local function syllabify(word)
word = trim(word)
if word == '' then
return word
end
if mw.ustring.find(word, '·', 1, true) then
return word
end
local chars = {}
local length = mw.ustring.len(word)
for i = 1, length do
chars[#chars + 1] = mw.ustring.sub(word, i, i)
end
local vowelPositions = {}
for i = 1, #chars do
if isVowel(chars[i]) then
vowelPositions[#vowelPositions + 1] = i
end
end
if #vowelPositions <= 1 then
return word
end
local result = {}
local start = 1
for i = 1, #vowelPositions - 1 do
local currentVowel = vowelPositions[i]
local nextVowel = vowelPositions[i + 1]
local consonantsBetween = nextVowel - currentVowel - 1
if consonantsBetween == 0 then
local part = {}
for j = start, currentVowel do
part[#part + 1] = chars[j]
end
result[#result + 1] = table.concat(part)
start = currentVowel + 1
elseif consonantsBetween == 1 then
local part = {}
for j = start, currentVowel do
part[#part + 1] = chars[j]
end
result[#result + 1] = table.concat(part)
start = currentVowel + 1
else
local boundary = currentVowel + 1
local part = {}
for j = start, boundary do
part[#part + 1] = chars[j]
end
result[#result + 1] = table.concat(part)
start = boundary + 1
end
end
local lastPart = {}
for i = start, length do
lastPart[#lastPart + 1] = chars[i]
end
if #lastPart > 0 then
result[#result + 1] = table.concat(lastPart)
end
return table.concat(result, '·')
end
local function displayForm(args, key, form)
local manual = getArg(args, key .. '.слогове')
if manual then
return manual
end
return syllabify(form)
end
local function getPlural(word, gender, args)
local explicit = getArg(args, 'мн')
if explicit then
return explicit
end
if gender == 'ж' then
if endsWith(word, 'а') then
return removeEnding(word, 'а') .. 'и'
end
return word .. 'и'
end
if gender == 'ср' then
if endsWith(word, 'че') then
return removeEnding(word, 'е') .. 'иња'
elseif endsWith(word, 'е') then
return removeEnding(word, 'е') .. 'иња'
elseif endsWith(word, 'о') then
return removeEnding(word, 'о') .. 'а'
end
return word .. 'а'
end
if gender == 'м' then
local pluralType = getArg(args, 'мн.тип')
if pluralType == 'ови' then
return word .. 'ови'
elseif pluralType == 'еви' then
return word .. 'еви'
elseif pluralType == 'и' then
return word .. 'и'
end
if mw.ustring.len(word) <= 4 then
return word .. 'ови'
end
return word .. 'и'
end
return word
end
local singularSuffixes = {
['м'] = {
['а'] = { 'та', 'ва', 'на' },
['vowel'] = { 'то', 'во', 'но' },
['consonant'] = { 'от', 'ов', 'он' }
},
['ж'] = {
['default'] = { 'та', 'ва', 'на' }
},
['ср'] = {
['default'] = { 'то', 'во', 'но' }
}
}
local function getSingularArticle(word, gender, suffixType)
local suffix
if gender == 'м' then
if endsWith(word, 'а') then
suffix = singularSuffixes['м']['а'][suffixType]
elseif isVowelEnding(word) then
suffix = singularSuffixes['м']['vowel'][suffixType]
else
suffix = singularSuffixes['м']['consonant'][suffixType]
end
elseif gender == 'ж' then
suffix = singularSuffixes['ж']['default'][suffixType]
else
suffix = singularSuffixes['ср']['default'][suffixType]
end
return word .. suffix
end
local function getPluralArticle(plural, suffixType)
local suffixes
if endsWith(plural, 'а') then
suffixes = { 'та', 'ва', 'на' }
else
suffixes = { 'те', 'ве', 'не' }
end
return plural .. suffixes[suffixType]
end
local function addCell(row, tagName, content, attrs)
local cell = row:tag(tagName)
if attrs then
for name, value in pairs(attrs) do
cell:attr(name, value)
end
end
cell:wikitext(content)
return cell
end
local STYLE = {
table = table.concat({
'border-collapse:collapse',
'border:1px solid #bfc1c3',
'background:#fff',
'color:#202122',
'font-size:100%',
'line-height:1.6',
'text-align:left',
'width:auto',
'max-width:100%',
'margin:0 0 1em 1em',
'float:right',
'clear:right'
}, ';') .. ';',
title = table.concat({
'background:#fff',
'border:0',
'padding:0 0 3px 0',
'text-align:center',
'font-size:110%',
'font-weight:700',
'white-space:nowrap'
}, ';') .. ';',
category = table.concat({
'background:#dfe2e4',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'font-weight:700',
'vertical-align:middle',
'white-space:nowrap'
}, ';') .. ';',
number = table.concat({
'background:#dfe2e4',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'font-weight:700',
'text-align:center',
'vertical-align:middle',
'white-space:nowrap'
}, ';') .. ';',
form = table.concat({
'background:#fff',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'text-align:left',
'white-space:nowrap'
}, ';') .. ';',
formLabel = table.concat({
'background:#fff',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'text-align:left',
'white-space:nowrap'
}, ';') .. ';',
vocativeLabel = table.concat({
'background:#dfe2e4',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'font-weight:700',
'text-align:left',
'white-space:nowrap'
}, ';') .. ';'
}
local function addInflectionGroup(
tableNode,
numberLabel,
baseForm,
commonForm,
nearForm,
farForm,
args,
prefix
)
local row = tableNode:tag('tr')
addCell(row, 'th', numberLabel, {
['rowspan'] = '4',
['style'] = STYLE.number
})
addCell(row, 'td', 'нечленувано', {
['style'] = STYLE.category
})
addCell(
row,
'td',
displayForm(args, prefix .. '.слогове', baseForm),
{
['style'] = STYLE.form
}
)
row = tableNode:tag('tr')
addCell(row, 'th', 'членувано', {
['rowspan'] = '3',
['style'] = STYLE.category
})
addCell(
row,
'td',
'<small>общо:</small> '
.. displayForm(
args,
prefix .. '.член.слогове',
commonForm
),
{
['style'] = STYLE.formLabel
}
)
row = tableNode:tag('tr')
addCell(
row,
'td',
'<small>близко:</small> '
.. displayForm(
args,
prefix .. '.близ.слогове',
nearForm
),
{
['style'] = STYLE.formLabel
}
)
row = tableNode:tag('tr')
addCell(
row,
'td',
'<small>далечно:</small> '
.. displayForm(
args,
prefix .. '.дал.слогове',
farForm
),
{
['style'] = STYLE.formLabel
}
)
end
function p.main(frame)
local args = frame:getParent().args
local word = trim(args[1])
local gender = getArg(args, 'род') or trim(args[2])
if word == '' then
word = mw.title.getCurrentTitle().text
end
if gender ~= 'м'
and gender ~= 'ж'
and gender ~= 'ср'
then
return '<strong class="error">'
.. 'Посочете род: м, ж или ср.'
.. '</strong>'
end
local plural = getPlural(word, gender, args)
local singularCommon =
getArg(args, 'ед.ч.член')
or getSingularArticle(word, gender, 1)
local singularNear =
getArg(args, 'ед.ч.близ')
or getSingularArticle(word, gender, 2)
local singularFar =
getArg(args, 'ед.ч.дал')
or getSingularArticle(word, gender, 3)
local pluralCommon =
getArg(args, 'мн.ч.член')
or getPluralArticle(plural, 1)
local pluralNear =
getArg(args, 'мн.ч.близ')
or getPluralArticle(plural, 2)
local pluralFar =
getArg(args, 'мн.ч.дал')
or getPluralArticle(plural, 3)
local vocative = getArg(args, 'зв') or word
local tableNode = mw.html.create('table')
:addClass('wikitable')
:addClass('inflection-table')
:cssText(STYLE.table)
local titleRow = tableNode:tag('tr')
addCell(titleRow, 'th', mw.ustring.upper(word), {
['colspan'] = '3',
['style'] = STYLE.title
})
addInflectionGroup(
tableNode,
'ед.ч.',
word,
singularCommon,
singularNear,
singularFar,
args,
'ед.ч'
)
addInflectionGroup(
tableNode,
'мн.ч.',
plural,
pluralCommon,
pluralNear,
pluralFar,
args,
'мн.ч'
)
local vocativeRow = tableNode:tag('tr')
addCell(vocativeRow, 'th', 'звателна форма', {
['colspan'] = '2',
['style'] = STYLE.vocativeLabel
})
addCell(
vocativeRow,
'td',
displayForm(args, 'зв.слогове', vocative),
{
['style'] = STYLE.form
}
)
return tostring(tableNode)
end
return p
nxicxvhvzyhojcen0o59636my71xlsx
1147608
1147607
2026-10-19T10:18:33Z
Златарка
21355
1147608
Scribunto
text/plain
local p = {}
local function trim(value)
return mw.text.trim(tostring(value or ''))
end
local function getArg(args, name)
local value = trim(args[name])
if value ~= '' then
return value
end
return nil
end
local function endsWith(word, ending)
if ending == '' then
return false
end
return mw.ustring.sub(word, -mw.ustring.len(ending)) == ending
end
local function removeEnding(word, ending)
if endsWith(word, ending) then
return mw.ustring.sub(word, 1, -mw.ustring.len(ending) - 1)
end
return word
end
local function isVowel(char)
return char == 'а'
or char == 'е'
or char == 'и'
or char == 'о'
or char == 'у'
end
local function isVowelEnding(word)
return endsWith(word, 'а')
or endsWith(word, 'е')
or endsWith(word, 'и')
or endsWith(word, 'о')
or endsWith(word, 'у')
end
local function syllabify(word)
word = trim(word)
if word == '' then
return word
end
if mw.ustring.find(word, '·', 1, true) then
return word
end
local chars = {}
local length = mw.ustring.len(word)
for i = 1, length do
chars[#chars + 1] = mw.ustring.sub(word, i, i)
end
local vowelPositions = {}
for i = 1, #chars do
if isVowel(chars[i]) then
vowelPositions[#vowelPositions + 1] = i
end
end
if #vowelPositions <= 1 then
return word
end
local result = {}
local start = 1
for i = 1, #vowelPositions - 1 do
local currentVowel = vowelPositions[i]
local nextVowel = vowelPositions[i + 1]
local consonantsBetween = nextVowel - currentVowel - 1
local boundary
if consonantsBetween <= 1 then
boundary = currentVowel
else
boundary = currentVowel + 1
end
if boundary >= start and boundary < length then
local part = {}
for j = start, boundary do
part[#part + 1] = chars[j]
end
result[#result + 1] = table.concat(part)
start = boundary + 1
end
end
local lastPart = {}
for i = start, length do
lastPart[#lastPart + 1] = chars[i]
end
if #lastPart > 0 then
result[#result + 1] = table.concat(lastPart)
end
return table.concat(result, '·')
end
local function displayForm(args, key, form)
local manual = getArg(args, key .. '.слогове')
if manual then
return manual
end
return syllabify(form)
end
local function getPlural(word, gender, args)
local explicit = getArg(args, 'мн')
if explicit then
return explicit
end
if gender == 'ж' then
if endsWith(word, 'а') then
return removeEnding(word, 'а') .. 'и'
end
return word .. 'и'
end
if gender == 'ср' then
if endsWith(word, 'че') then
return removeEnding(word, 'е') .. 'иња'
elseif endsWith(word, 'е') then
return removeEnding(word, 'е') .. 'иња'
elseif endsWith(word, 'о') then
return removeEnding(word, 'о') .. 'а'
end
return word .. 'а'
end
if gender == 'м' then
local pluralType = getArg(args, 'мн.тип')
if pluralType == 'ови' then
return word .. 'ови'
elseif pluralType == 'еви' then
return word .. 'еви'
elseif pluralType == 'и' then
return word .. 'и'
end
if mw.ustring.len(word) <= 4 then
return word .. 'ови'
end
return word .. 'и'
end
return word
end
local singularSuffixes = {
['м'] = {
['а'] = { 'та', 'ва', 'на' },
['vowel'] = { 'то', 'во', 'но' },
['consonant'] = { 'от', 'ов', 'он' }
},
['ж'] = {
['default'] = { 'та', 'ва', 'на' }
},
['ср'] = {
['default'] = { 'то', 'во', 'но' }
}
}
local function getSingularArticle(word, gender, suffixType)
local suffix
if gender == 'м' then
if endsWith(word, 'а') then
suffix = singularSuffixes['м']['а'][suffixType]
elseif isVowelEnding(word) then
suffix = singularSuffixes['м']['vowel'][suffixType]
else
suffix = singularSuffixes['м']['consonant'][suffixType]
end
elseif gender == 'ж' then
suffix = singularSuffixes['ж']['default'][suffixType]
else
suffix = singularSuffixes['ср']['default'][suffixType]
end
return word .. suffix
end
local function getPluralArticle(plural, suffixType)
local suffixes
if endsWith(plural, 'а') then
suffixes = { 'та', 'ва', 'на' }
else
suffixes = { 'те', 'ве', 'не' }
end
return plural .. suffixes[suffixType]
end
local function addCell(row, tagName, content, attrs)
local cell = row:tag(tagName)
if attrs then
for name, value in pairs(attrs) do
cell:attr(name, value)
end
end
cell:wikitext(content)
return cell
end
local STYLE = {
table = table.concat({
'border-collapse:collapse',
'border:1px solid #bfc1c3',
'background:#fff',
'color:#202122',
'font-size:100%',
'line-height:1.6',
'text-align:left',
'width:auto',
'max-width:100%',
'margin:0 0 1em 1em',
'float:right',
'clear:right'
}, ';') .. ';',
title = table.concat({
'caption-side:top',
'border:0',
'padding:0 0 3px 0',
'text-align:center',
'font-size:100%',
'font-weight:700',
'line-height:1.3',
'white-space:nowrap',
'background:transparent'
}, ';') .. ';',
category = table.concat({
'background:#dfe2e4',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'font-weight:700',
'vertical-align:middle',
'white-space:nowrap'
}, ';') .. ';',
number = table.concat({
'background:#dfe2e4',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'font-weight:700',
'text-align:center',
'vertical-align:middle',
'white-space:nowrap'
}, ';') .. ';',
subtype = table.concat({
'background:#fff',
'border:1px solid #bfc1c3',
'padding:3px 8px',
'text-align:left',
'white-space:nowrap'
}, ';') .. ';',
form = table.concat({
'background:#fff',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'text-align:left',
'vertical-align:middle'
}, ';') .. ';',
vocativeLabel = table.concat({
'background:#dfe2e4',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'font-weight:700',
'text-align:left',
'white-space:nowrap'
}, ';') .. ';'
}
local variantLabels = {
{ key = 'диал', label = 'диал.' },
{ key = 'пренебр', label = 'пренебр.' },
{ key = 'разг', label = 'разг.' },
{ key = 'остар', label = 'остар.' }
}
local function addFormContent(cell, args, key, form)
cell:wikitext(displayForm(args, key, form))
for _, variant in ipairs(variantLabels) do
local variantKey = key .. '.' .. variant.key
local variantForm = getArg(args, variantKey)
if variantForm then
local variantSyllables = getArg(
args,
variantKey .. '.слогове'
)
if variantSyllables then
variantForm = variantSyllables
else
variantForm = syllabify(variantForm)
end
cell:tag('br')
cell:wikitext(
'<i>' .. variant.label .. '</i> '
.. variantForm
)
end
end
end
local function addInflectionGroup(
tableNode,
numberLabel,
baseForm,
commonForm,
nearForm,
farForm,
args,
prefix
)
local row = tableNode:tag('tr')
addCell(row, 'th', numberLabel, {
['rowspan'] = '4',
['style'] = STYLE.number
})
addCell(row, 'th', 'нечленувано', {
['colspan'] = '2',
['style'] = STYLE.category
})
local baseCell = addCell(row, 'td', '', {
['style'] = STYLE.form
})
addFormContent(
baseCell,
args,
prefix,
baseForm
)
row = tableNode:tag('tr')
addCell(row, 'th', 'членувано', {
['rowspan'] = '3',
['style'] = STYLE.category
})
addCell(row, 'td', 'общо', {
['style'] = STYLE.subtype
})
local commonCell = addCell(row, 'td', '', {
['style'] = STYLE.form
})
addFormContent(
commonCell,
args,
prefix .. '.член',
commonForm
)
row = tableNode:tag('tr')
addCell(row, 'td', 'близко', {
['style'] = STYLE.subtype
})
local nearCell = addCell(row, 'td', '', {
['style'] = STYLE.form
})
addFormContent(
nearCell,
args,
prefix .. '.близ',
nearForm
)
row = tableNode:tag('tr')
addCell(row, 'td', 'далечно', {
['style'] = STYLE.subtype
})
local farCell = addCell(row, 'td', '', {
['style'] = STYLE.form
})
addFormContent(
farCell,
args,
prefix .. '.дал',
farForm
)
end
function p.main(frame)
local args = frame:getParent().args
local word = trim(args[1])
local gender = getArg(args, 'род') or trim(args[2])
if word == '' then
word = mw.title.getCurrentTitle().text
end
if gender ~= 'м'
and gender ~= 'ж'
and gender ~= 'ср'
then
return '<strong class="error">'
.. 'Посочете род: м, ж или ср.'
.. '</strong>'
end
local plural = getPlural(word, gender, args)
local singularCommon =
getArg(args, 'ед.ч.член')
or getSingularArticle(word, gender, 1)
local singularNear =
getArg(args, 'ед.ч.близ')
or getSingularArticle(word, gender, 2)
local singularFar =
getArg(args, 'ед.ч.дал')
or getSingularArticle(word, gender, 3)
local pluralCommon =
getArg(args, 'мн.ч.член')
or getPluralArticle(plural, 1)
local pluralNear =
getArg(args, 'мн.ч.близ')
or getPluralArticle(plural, 2)
local pluralFar =
getArg(args, 'мн.ч.дал')
or getPluralArticle(plural, 3)
local vocative = getArg(args, 'зв') or word
local tableNode = mw.html.create('table')
:addClass('wikitable')
:addClass('inflection-table')
:cssText(STYLE.table)
addCell(
tableNode,
'caption',
mw.ustring.upper(word),
{
['style'] = STYLE.title
}
)
addInflectionGroup(
tableNode,
'ед.ч.',
word,
singularCommon,
singularNear,
singularFar,
args,
'ед.ч'
)
addInflectionGroup(
tableNode,
'мн.ч.',
plural,
pluralCommon,
pluralNear,
pluralFar,
args,
'мн.ч'
)
local vocativeRow = tableNode:tag('tr')
addCell(vocativeRow, 'th', 'звателна форма', {
['colspan'] = '3',
['style'] = STYLE.vocativeLabel
})
local vocativeCell = addCell(
vocativeRow,
'td',
'',
{
['style'] = STYLE.form
}
)
addFormContent(
vocativeCell,
args,
'зв',
vocative
)
return tostring(tableNode)
end
return p
f8zi9pktsbc6vagem7aacpi286qrt79
1147610
1147608
2026-10-19T10:54:07Z
Златарка
21355
1147610
Scribunto
text/plain
local p = {}
local function trim(value)
return mw.text.trim(tostring(value or ''))
end
local function getArg(args, name)
local value = trim(args[name])
if value ~= '' then
return value
end
return nil
end
local function endsWith(word, ending)
if ending == '' then
return false
end
return mw.ustring.sub(word, -mw.ustring.len(ending)) == ending
end
local function removeEnding(word, ending)
if endsWith(word, ending) then
return mw.ustring.sub(word, 1, -mw.ustring.len(ending) - 1)
end
return word
end
local function isVowel(char)
return char == 'а'
or char == 'е'
or char == 'и'
or char == 'о'
or char == 'у'
end
local function isVowelEnding(word)
return endsWith(word, 'а')
or endsWith(word, 'е')
or endsWith(word, 'и')
or endsWith(word, 'о')
or endsWith(word, 'у')
end
local function syllabify(word)
word = trim(word)
if word == '' then
return word
end
if mw.ustring.find(word, '·', 1, true) then
return word
end
local chars = {}
local length = mw.ustring.len(word)
for i = 1, length do
chars[#chars + 1] = mw.ustring.sub(word, i, i)
end
local vowelPositions = {}
for i = 1, #chars do
if isVowel(chars[i]) then
vowelPositions[#vowelPositions + 1] = i
end
end
if #vowelPositions <= 1 then
return word
end
local result = {}
local start = 1
for i = 1, #vowelPositions - 1 do
local currentVowel = vowelPositions[i]
local nextVowel = vowelPositions[i + 1]
local consonantsBetween = nextVowel - currentVowel - 1
local boundary
if consonantsBetween <= 1 then
boundary = currentVowel
else
boundary = currentVowel + 1
end
if boundary >= start and boundary < length then
local part = {}
for j = start, boundary do
part[#part + 1] = chars[j]
end
result[#result + 1] = table.concat(part)
start = boundary + 1
end
end
local lastPart = {}
for i = start, length do
lastPart[#lastPart + 1] = chars[i]
end
if #lastPart > 0 then
result[#result + 1] = table.concat(lastPart)
end
return table.concat(result, '·')
end
local function displayForm(args, key, form)
local manual = getArg(args, key .. '.слогове')
if manual then
return manual
end
return syllabify(form)
end
local function getPlural(word, gender, args)
local explicit = getArg(args, 'мн')
if explicit then
return explicit
end
if gender == 'ж' then
if endsWith(word, 'а') then
return removeEnding(word, 'а') .. 'и'
end
return word .. 'и'
end
if gender == 'ср' then
if endsWith(word, 'че') then
return removeEnding(word, 'е') .. 'иња'
elseif endsWith(word, 'е') then
return removeEnding(word, 'е') .. 'иња'
elseif endsWith(word, 'о') then
return removeEnding(word, 'о') .. 'а'
end
return word .. 'а'
end
if gender == 'м' then
local pluralType = getArg(args, 'мн.тип')
if pluralType == 'ови' then
return word .. 'ови'
elseif pluralType == 'еви' then
return word .. 'еви'
elseif pluralType == 'и' then
return word .. 'и'
end
if mw.ustring.len(word) <= 4 then
return word .. 'ови'
end
return word .. 'и'
end
return word
end
local singularSuffixes = {
['м'] = {
['а'] = { 'та', 'ва', 'на' },
['vowel'] = { 'то', 'во', 'но' },
['consonant'] = { 'от', 'ов', 'он' }
},
['ж'] = {
['default'] = { 'та', 'ва', 'на' }
},
['ср'] = {
['default'] = { 'то', 'во', 'но' }
}
}
local function getSingularArticle(word, gender, suffixType)
local suffix
if gender == 'м' then
if endsWith(word, 'а') then
suffix = singularSuffixes['м']['а'][suffixType]
elseif isVowelEnding(word) then
suffix = singularSuffixes['м']['vowel'][suffixType]
else
suffix = singularSuffixes['м']['consonant'][suffixType]
end
elseif gender == 'ж' then
suffix = singularSuffixes['ж']['default'][suffixType]
else
suffix = singularSuffixes['ср']['default'][suffixType]
end
return word .. suffix
end
local function getPluralArticle(plural, suffixType)
local suffixes
if endsWith(plural, 'а') then
suffixes = { 'та', 'ва', 'на' }
else
suffixes = { 'те', 'ве', 'не' }
end
return plural .. suffixes[suffixType]
end
local function addCell(row, tagName, content, attrs)
local cell = row:tag(tagName)
if attrs then
for name, value in pairs(attrs) do
cell:attr(name, value)
end
end
cell:wikitext(content)
return cell
end
local STYLE = {
table = table.concat({
'border-collapse:collapse',
'border:1px solid #bfc1c3',
'background:#fff',
'color:#202122',
'font-size:100%',
'line-height:1.6',
'text-align:left',
'width:auto',
'max-width:100%',
'margin:0 0 1em 1em',
'float:right',
'clear:right'
}, ';') .. ';',
title = table.concat({
'caption-side:top',
'border:0',
'padding:0 0 3px 0',
'text-align:center',
'font-size:100%',
'font-weight:700',
'line-height:1.3',
'white-space:nowrap',
'background:transparent'
}, ';') .. ';',
category = table.concat({
'background:#dfe2e4',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'font-weight:700',
'vertical-align:middle',
'white-space:nowrap'
}, ';') .. ';',
number = table.concat({
'background:#dfe2e4',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'font-weight:700',
'text-align:center',
'vertical-align:middle',
'white-space:nowrap'
}, ';') .. ';',
subtype = table.concat({
'background:#dfe2e4',
'border:1px solid #bfc1c3',
'padding:3px 8px',
'font-weight:700',
'text-align:left',
'vertical-align:middle',
'white-space:nowrap'
}, ';') .. ';',
form = table.concat({
'background:#fff',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'text-align:left',
'vertical-align:middle'
}, ';') .. ';',
vocativeLabel = table.concat({
'background:#dfe2e4',
'border:1px solid #bfc1c3',
'padding:3px 10px',
'font-weight:700',
'text-align:center',
'vertical-align:middle',
'white-space:nowrap'
}, ';') .. ';'
}
local variantLabels = {
{ key = 'диал', label = 'диал.' },
{ key = 'пренебр', label = 'пренебр.' },
{ key = 'разг', label = 'разг.' },
{ key = 'остар', label = 'остар.' }
}
local function addFormContent(cell, args, key, form)
cell:wikitext(displayForm(args, key, form))
for _, variant in ipairs(variantLabels) do
local variantKey = key .. '.' .. variant.key
local variantForm = getArg(args, variantKey)
if variantForm then
local variantSyllables = getArg(
args,
variantKey .. '.слогове'
)
if variantSyllables then
variantForm = variantSyllables
else
variantForm = syllabify(variantForm)
end
cell:tag('br')
cell:wikitext(
'<i>' .. variant.label .. '</i> '
.. variantForm
)
end
end
end
local function addInflectionGroup(
tableNode,
numberLabel,
baseForm,
commonForm,
nearForm,
farForm,
args,
prefix
)
local row = tableNode:tag('tr')
addCell(row, 'th', numberLabel, {
['rowspan'] = '4',
['style'] = STYLE.number
})
addCell(row, 'th', 'нечленувано', {
['colspan'] = '2',
['style'] = STYLE.category
})
local baseCell = addCell(row, 'td', '', {
['style'] = STYLE.form
})
addFormContent(baseCell, args, prefix, baseForm)
row = tableNode:tag('tr')
addCell(row, 'th', 'членувано', {
['rowspan'] = '3',
['style'] = STYLE.category
})
addCell(row, 'td', 'общо', {
['style'] = STYLE.subtype
})
local commonCell = addCell(row, 'td', '', {
['style'] = STYLE.form
})
addFormContent(
commonCell,
args,
prefix .. '.член',
commonForm
)
row = tableNode:tag('tr')
addCell(row, 'td', 'близко', {
['style'] = STYLE.subtype
})
local nearCell = addCell(row, 'td', '', {
['style'] = STYLE.form
})
addFormContent(
nearCell,
args,
prefix .. '.близ',
nearForm
)
row = tableNode:tag('tr')
addCell(row, 'td', 'далечно', {
['style'] = STYLE.subtype
})
local farCell = addCell(row, 'td', '', {
['style'] = STYLE.form
})
addFormContent(
farCell,
args,
prefix .. '.дал',
farForm
)
end
function p.main(frame)
local args = frame:getParent().args
local word = trim(args[1])
local gender = getArg(args, 'род') or trim(args[2])
if word == '' then
word = mw.title.getCurrentTitle().text
end
if gender ~= 'м'
and gender ~= 'ж'
and gender ~= 'ср'
then
return '<strong class="error">'
.. 'Посочете род: м, ж или ср.'
.. '</strong>'
end
local plural = getPlural(word, gender, args)
local singularCommon =
getArg(args, 'ед.ч.член')
or getSingularArticle(word, gender, 1)
local singularNear =
getArg(args, 'ед.ч.близ')
or getSingularArticle(word, gender, 2)
local singularFar =
getArg(args, 'ед.ч.дал')
or getSingularArticle(word, gender, 3)
local pluralCommon =
getArg(args, 'мн.ч.член')
or getPluralArticle(plural, 1)
local pluralNear =
getArg(args, 'мн.ч.близ')
or getPluralArticle(plural, 2)
local pluralFar =
getArg(args, 'мн.ч.дал')
or getPluralArticle(plural, 3)
local vocative = getArg(args, 'зв') or word
local tableNode = mw.html.create('table')
:addClass('wikitable')
:addClass('inflection-table')
:cssText(STYLE.table)
addCell(tableNode, 'caption', word, {
['style'] = STYLE.title
})
addInflectionGroup(
tableNode,
'ед.ч.',
word,
singularCommon,
singularNear,
singularFar,
args,
'ед.ч'
)
addInflectionGroup(
tableNode,
'мн.ч.',
plural,
pluralCommon,
pluralNear,
pluralFar,
args,
'мн.ч'
)
local vocativeRow = tableNode:tag('tr')
addCell(vocativeRow, 'th', 'звателна форма', {
['colspan'] = '3',
['style'] = STYLE.vocativeLabel
})
local vocativeCell = addCell(
vocativeRow,
'td',
'',
{
['style'] = STYLE.form
}
)
addFormContent(
vocativeCell,
args,
'зв',
vocative
)
return tostring(tableNode)
end
return p
bq29qv7jfgr6opfhw378socsn2avxvh
Категория:Шаблони за източници/македонски
14
912601
1147611
2026-10-19T11:03:22Z
Златарка
21355
Нова страница: „{{Категория А до Я}} <br/> [[Категория:Шаблони за източници]]“
1147611
wikitext
text/x-wiki
{{Категория А до Я}}
<br/>
[[Категория:Шаблони за източници]]
p8aqbtpzu83qeiu2oilvfuip71jh5ud
Шаблон:друга-Уикипедия
10
912602
1147613
2026-10-19T11:38:53Z
Златарка
21355
Нова страница: „<templatestyles src="Шаблон:Уикипедия-кутия/styles.css" /> <table class="bgwik-wp-box"> <tr> <td class="bgwik-wp-logo">[[File:Wikipedia-logo-bg.png|45px|link=w:{{{език-код|en}}}:{{{1|{{PAGENAME}}}}}|Емблемата на Уикипедия]]</td> <td class="bgwik-wp-text">[[w:{{{език-код|en}}}:|Уикипедия]] разполага със статия за '''w:{{{език-код|en}}}:{{{1|{{PAGENAME}}}}}|{{{2|{{{1|{{...“
1147613
wikitext
text/x-wiki
<templatestyles src="Шаблон:Уикипедия-кутия/styles.css" />
<table class="bgwik-wp-box">
<tr>
<td class="bgwik-wp-logo">[[File:Wikipedia-logo-bg.png|45px|link=w:{{{език-код|en}}}:{{{1|{{PAGENAME}}}}}|Емблемата на Уикипедия]]</td>
<td class="bgwik-wp-text">[[w:{{{език-код|en}}}:|Уикипедия]] разполага със статия за '''[[w:{{{език-код|en}}}:{{{1|{{PAGENAME}}}}}|{{{2|{{{1|{{PAGENAME}}}}}}}}]]'''.</td>
</tr>
</table><noinclude>{{Документация}}</noinclude>
3yjvyav48h87tvj6hnvndelm4tfhhn0
1147614
1147613
2026-10-19T11:42:04Z
Златарка
21355
1147614
wikitext
text/x-wiki
<templatestyles src="Шаблон:Уикипедия-кутия/styles.css" />
<table class="bgwik-wp-box">
<tr>
<td class="bgwik-wp-logo">[[File:Wikipedia-logo-bg.png|45px|link=w:{{{език-код|}}}:{{{1|{{PAGENAME}}}}}|Емблемата на Уикипедия]]</td>
<td class="bgwik-wp-text">[[w:{{{език-код|}}}:|Уикипедия]] разполага със статия на '''{{{език-име}}}''' език за '''[[w:{{{език-код|}}}:{{{1|{{PAGENAME}}}}}|{{{2|{{{1|{{PAGENAME}}}}}}}}]]'''.</td>
</tr>
</table><noinclude>
{{Документация}}
</noinclude>
gmv63plperqgn2xmpin08hbb1ugcvqi