Документация

Этот модуль содержит основные функции преобразования текста для русского языка.

Функции

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])endfunction 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 'о'    endendlocal cons='бвгджзйклмнпрстфхцчшщ'; -- all consonantslocal cons7='кгхчжшщ'; -- consonants requiring -иlocal adjends={['ой']='ые',['ый']='ые',['ий']='ие',['ое']='ые',['ая']='ые',['яя']='ие',['ое']='ые',['ее']='ие'};local specpl={    ['город']='города',    ['болгарин']='болгары',    ['боярин']='бояре',    ['брат']='братья',    ['век']='века',    ['веко']='веки',    ['вес']='веса',    ['грузин']='грузины',    ['день']='дни',    ['дерево']='деревья',    ['директор']='директора',    ['дитя']='дети',    ['доктор']='доктора',    ['дочь']='дочери',    ['друг']='друзья',    ['звезда']='звёзды',    ['знамя']='знамёна',    ['инспектор']='инспектора',    ['край'] = 'края',    ['мать']='матери',    ['небо']='небеса',    ['озеро']='озёра',    ['перо']='перья',    ['поезд']='поезда',    ['ребёнок']='дети',    ['список']='списки',    ['сын']='сыновья',    ['татарин']='татары',    ['церковь']='церкви',    ['цыган']='цыгане',    ['человек']='люди',    ['чудо']='чудеса'}; -- table of some common special plural casesfunction M.s(f)    return M.so(f.args[1])endfunction 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 'с'    endend 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)]        endelseif 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)..'ы' endelseif 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..'ы'    endelseif 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>"    endend 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'    endend 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 returnedlocal 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    endelse return word endend; return M