Модуль:Ru
Файл:Padlock-silver.svg | Этот модуль относится к критическим. У него очень много включений или он используется с подстановкой. Из-за опасности вандализма или ошибочного редактирования он был защищён. |
Этот модуль содержит основные функции преобразования текста для русского языка.
Функции
locative
Формирует предложный падеж (препозитив), в большинстве случаев совпадающий с местным падежом (локативом):
в {{#invoke:Ru|locative|Москва}}
→ в Москвев {{#invoke:Ru|locative|Казань}}
→ в Казани
Существует, однако, большая группа существительных, для которых формы предложного и местного падежей не совпадают (например: «лес» → «о леШаблон:ударениесе», но «в лесу́»). Данная функция не учитывает эти исключения — не используйте её в подобных случаях!
о {{#invoke:Ru|locative|лес}}
→ о лесе
pl
Формирует множественное число (название функции — от англ. plural):
{{#invoke:Ru|pl|шахтёр}}
→ шахтёры{{#invoke:Ru|pl|трава}}
→ травы{{#invoke:Ru|pl|конь}}
→ кони
Данная функция определяет склонение слова с помощью функции guessdecl
(см. ниже). При необходимости (напр., когда guessdecl
ошибается), склонение можно указать в явном виде во втором аргументе:
{{#invoke:Ru|pl|пальто|0}}
→ пальто (без второго аргумента:{{#invoke:Ru|pl|пальто}}
→ ошибочно «пальта»)
guessdecl
Определяет тип склонения (название функции — от англ. guess declension). Данная функция используется функцией pl
(см. выше), если при вызове последней не задан второй параметр. Возвращаемые значения:
0
— для несклоняемых существительных;1
,2
и3
— для существительных I, II и III склонения, соответственно;a
(от англ. adjective) — для прилагательных.
Важно: невозможно без использования словаря различать следующие случаи:
- слова III склонения (напр., «дверь») и оканчивающиеся на «ь» слова II склонения (напр., «конь»). Данная функция возвращает для таких слов значение
2
. Значение3
возвращается только для слов, оканчивающихся на «Xмя», где X — гласная (напр., «время»); в действительности, эти слова являются разносклоняемыми (см. статью Склонение) и склоняются по третьему склонению не во всех формах: исключение — форма творительного падежа единственного числа. - несклоняемые слова, форма которых совпадает с формой какого-либо склонения (напр., «пальто» / «озеро»). Для таких слов будет возвращаться неправильное значение
1
,2
или3
вместо правильного0
.
Примеры:
{{#invoke:Ru|guessdecl|такси}}
→ 0{{#invoke:Ru|guessdecl|юноша}}
→ 1{{#invoke:Ru|guessdecl|дом}}
→ 2{{#invoke:Ru|guessdecl|дверь}}
→ 3{{#invoke:Ru|guessdecl|белый}}
→ a
Примеры ошибок:
{{#invoke:Ru|guessdecl|дверь}}
→ 2 (должно быть3
){{#invoke:Ru|guessdecl|пальто}}
→ 2 (должно быть0
)
o
(латиницей)
Подбирает предлог о/об/обо:
{{#invoke:Ru|o|том}}
→ о{{#invoke:Ru|o|этом}}
→ об{{#invoke:Ru|o|всём}}
→ обо
obo
Используется функцией o
, для экспорта в другие скрипты, в invoke не работает.
require("Module:Ru").obo("слово")
s
Подбирает предлог с/со:
{{#invoke:Ru|s|тем}}
→ с{{#invoke:Ru|s|всем}}
→ со
so
Используется функцией s
--[[ Основные функции, касающиеся русского языка ]] local M={} function M.o(f) return M.obo(f.args[1]) end function M.obo(phr) -- выбирает предлог «о», «об» или «обо» к фразе, в начале которой может быть пунктуация local w = mw.ustring.match(phr,"[%p%s%c]*(.-)[%p%s%c]") or mw.ustring.match(phr,"[%p%s%c]*(.-)$") if not w then return nil end if string.find(" всей всём всех мне ",' '..mw.ustring.lower(w)..' ',1,true) then return 'обо' end local ws=mw.ustring.sub(w,1,2) if ws==mw.ustring.upper(ws) then -- abbrev if mw.ustring.match(ws,"^[ЙУНФЫАРОЛЭСМИRYUIOASFHLXNMÖÜÄΑΕΟΥΩ]") then return 'об' else return 'о' end elseif mw.ustring.match(mw.ustring.upper(w),"^[АОЭИУЫAOIEÖÜÄΑΕΟΥΩ]") then return 'об' else return 'о' end end local cons='бвгджзйклмнпрстфхцчшщ'; -- all consonants local cons7='кгхчжшщ'; -- consonants requiring -и local adjends={['ой']='ые',['ый']='ые',['ий']='ие',['ое']='ые',['ая']='ые',['яя']='ие',['ое']='ые',['ее']='ие'}; local specpl={ ['город']='города', ['болгарин']='болгары', ['боярин']='бояре', ['брат']='братья', ['век']='века', ['веко']='веки', ['вес']='веса', ['грузин']='грузины', ['день']='дни', ['дерево']='деревья', ['директор']='директора', ['дитя']='дети', ['доктор']='доктора', ['дочь']='дочери', ['друг']='друзья', ['звезда']='звёзды', ['знамя']='знамёна', ['инспектор']='инспектора', ['край'] = 'края', ['мать']='матери', ['небо']='небеса', ['озеро']='озёра', ['перо']='перья', ['поезд']='поезда', ['ребёнок']='дети', ['список']='списки', ['сын']='сыновья', ['татарин']='татары', ['церковь']='церкви', ['цыган']='цыгане', ['человек']='люди', ['чудо']='чудеса' }; -- table of some common special plural cases function M.s(f) return M.so(f.args[1]) end function M.so(phr) -- выбирает предлог «с» или «со» к фразе, в начале которой может быть пунктуация local w = mw.ustring.match(phr, '[%p%s%c]*(.-)[%p%s%c]') or mw.ustring.match(phr, '[%p%s%c]*(.-)$') if not w then return nil end -- Здесь не отражены аббревиатуры и буквосочетания на других языках — предполагается, что пока это будут прописывать -- вручную w = mw.language.new('ru'):lcfirst(w) -- http://new.gramota.ru/spravka/buro/search-answer?s=с%20(со) if mw.ustring.match(w, '^[сзшжрлмв][' .. cons .. ']') or mw.ustring.match(w, '^ль[' .. cons .. ']') or mw.ustring.match(w, '^щ') then return 'со' else return 'с' end end function M.pl(p) -- множественное число, 2-й аргумент 0 (нескл.), 1, 2, 3 или a (adjective - прилагательное) --Поддержка словосочетаний планируется потом local word = p.args[1]; if specpl[word] then return specpl[word] end; local d=p.args[2]; if d==nil then d=M.guessdecl(p) end; if d=='0' then return word elseif d=='a' then if mw.ustring.match(word,'['..cons7..']..$') then return mw.ustring.sub(word,1,-3)..'ие' else return mw.ustring.sub(word,1,-3)..adjends[mw.ustring.sub(word,-2)] end elseif d=='1' then if mw.ustring.sub(word,-1)=='я' or mw.ustring.match(word,'['..cons7..']а$') then return mw.ustring.sub(word,1,-2)..'и' else return mw.ustring.sub(word,1,-2)..'ы' end elseif d=='2' then if mw.ustring.match(word,'о$') then return mw.ustring.sub(word,1,-2)..'а' elseif mw.ustring.match(word,'е$') then return mw.ustring.sub(word,1,-2)..'я' elseif mw.ustring.match(word,'[ьй]$') then return mw.ustring.sub(word,1,-2)..'и' elseif mw.ustring.match(word,'онок$') then return mw.ustring.sub(word,1,-5)..'ата' elseif mw.ustring.match(word,'ёнок$') then return mw.ustring.sub(word,1,-5)..'ята' elseif mw.ustring.match(word,'анин$') then return mw.ustring.sub(word,1,-5)..'ане' elseif mw.ustring.match(word,'янин$') then return mw.ustring.sub(word,1,-5)..'яне' elseif mw.ustring.match(word,'ец$') and not mw.ustring.match(word,'['..cons7..']['..cons7..']ец$') then -- !!неправильно для этнохоронимов на -ец типа "ньюйоркцы" if mw.ustring.match(word,'лец$') then return mw.ustring.sub(word,1,-3)..'ьцы' elseif mw.ustring.match(word,'[аоуыэяёюие]ец$') then return mw.ustring.sub(word,1,-3)..'ьцы' else return mw.ustring.sub(word,1,-3)..'цы' end elseif mw.ustring.match(word,'['..cons7..']$') then return word..'и' else return word..'ы' end elseif d=='3' then if mw.ustring.match(word,'мя$') then return mw.ustring.sub(word,1,-3)..'ена' else return mw.ustring.sub(word,1,-2)..'и' end else return "<span class=error>Wrong declesion '"..d.."' in RuGrammar::pl()</span>" end end function M.guessdecl(p) -- угадывает тип склонения local word=p.args[1]; if mw.ustring.match(word,'['..cons..'][оыи]й$') or mw.ustring.match(word,'['..cons..'][ая]я$') or mw.ustring.match(word,'['..cons..'][ое]е$') then return 'a' --sometimes wrong elseif mw.ustring.match(word,'['..cons..'][оеь]?$') then return '2' --but mb 3, can't guess w/o dict elseif mw.ustring.match(word,'['..cons..'][ая]$') then if mw.ustring.match(word,'[^'..cons..']мя$') then return '3' else return '1' end else return '0' end end function M.locative(p) -- Возможно, будет когда-то заменено на функционал mw.language('ru'):grammar(), которого пока не хватает local word=p.args[1]; local locend={['а']='е', ['я']='е', ['й']='е', ['ы']="ах", ['ь']='и'}; --the last one is disputed: most Russian cities ending with -ь are 3rd declesion, but some foreign ones are 2nd decl., so -е should be returned local ec=mw.ustring.sub(word,-1); if mw.ustring.match(word,'ия$') then return mw.ustring.sub(word,1,-2)..'и' elseif mw.ustring.match(word,'['..cons..']ль$') or mw.ustring.sub(word,-4)=='поль' then return mw.ustring.sub(word,1,-2)..'е' elseif mw.ustring.match(word,'ской$') or mw.ustring.match(word,'ское$') or mw.ustring.match(word,'цкое$') then return mw.ustring.sub(word,1,-2)..'м' elseif mw.ustring.match(word,'ский$') or mw.ustring.match(word,'цкий$') or mw.ustring.match(word,'ный$') then return mw.ustring.sub(word,1,-3)..'ом' elseif mw.ustring.match(word,'ская$') or mw.ustring.match(word,'цкая$') or mw.ustring.match(word,'ная$') then return mw.ustring.sub(word,1,-3)..'ой' elseif mw.ustring.match(word,'няя$') then return mw.ustring.sub(word,1,-3)..'ей' elseif locend[ec] then return mw.ustring.sub(word,1,-2)..locend[ec] elseif mw.ustring.match(ec,'['..cons..']') then return word..'е' elseif ec=='о' then if mw.ustring.match(word,'[оеё]во$') or mw.ustring.match(word,'[иы]но$') then return mw.ustring.sub(word,1,-2)..'е' -- корректно только для топонимов со славянскими корнями else return word end else return word end end; return M