Уикиречник 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