<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.dzmuh.com/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3ARu</id>
	<title>Модуль:Ru - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dzmuh.com/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3ARu"/>
	<link rel="alternate" type="text/html" href="https://wiki.dzmuh.com/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Ru&amp;action=history"/>
	<updated>2026-05-05T16:35:53Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>https://wiki.dzmuh.com/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Ru&amp;diff=68&amp;oldid=prev</id>
		<title>Dzmuh: Новая страница: «-- Основные функции, касающиеся русского языка  local M={}  function M.o(f)     return M.obo(f.args[1]) end  function M....»</title>
		<link rel="alternate" type="text/html" href="https://wiki.dzmuh.com/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Ru&amp;diff=68&amp;oldid=prev"/>
		<updated>2021-04-23T23:47:44Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «--&lt;a href=&quot;/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8,_%D0%BA%D0%B0%D1%81%D0%B0%D1%8E%D1%89%D0%B8%D0%B5%D1%81%D1%8F_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Основные функции, касающиеся русского языка (страница не существует)&quot;&gt;Основные функции, касающиеся русского языка &lt;/a&gt; local M={}  function M.o(f)     return M.obo(f.args[1]) end  function M....»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[&lt;br /&gt;
Основные функции, касающиеся русского языка&lt;br /&gt;
]]&lt;br /&gt;
local M={}&lt;br /&gt;
&lt;br /&gt;
function M.o(f)&lt;br /&gt;
    return M.obo(f.args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function M.obo(phr) -- выбирает предлог «о», «об» или «обо» к фразе, в начале которой может быть пунктуация&lt;br /&gt;
    local w = mw.ustring.match(phr,&amp;quot;[%p%s%c]*(.-)[%p%s%c]&amp;quot;) or mw.ustring.match(phr,&amp;quot;[%p%s%c]*(.-)$&amp;quot;)&lt;br /&gt;
    if not w then return nil end&lt;br /&gt;
    if string.find(&amp;quot; всей всём всех мне &amp;quot;,' '..mw.ustring.lower(w)..' ',1,true) then return 'обо' end&lt;br /&gt;
    local ws=mw.ustring.sub(w,1,2)&lt;br /&gt;
    if ws==mw.ustring.upper(ws) then -- abbrev&lt;br /&gt;
        if mw.ustring.match(ws,&amp;quot;^[ЙУНФЫАРОЛЭСМИRYUIOASFHLXNMÖÜÄΑΕΟΥΩ]&amp;quot;) then return 'об' else return 'о' end&lt;br /&gt;
    elseif mw.ustring.match(mw.ustring.upper(w),&amp;quot;^[АОЭИУЫAOIEÖÜÄΑΕΟΥΩ]&amp;quot;) then&lt;br /&gt;
        return 'об'&lt;br /&gt;
    else&lt;br /&gt;
        return 'о'&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local cons='бвгджзйклмнпрстфхцчшщ'; -- all consonants&lt;br /&gt;
local cons7='кгхчжшщ'; -- consonants requiring -и&lt;br /&gt;
local adjends={['ой']='ые',['ый']='ые',['ий']='ие',['ое']='ые',['ая']='ые',['яя']='ие',['ое']='ые',['ее']='ие'};&lt;br /&gt;
local specpl={&lt;br /&gt;
    ['город']='города',&lt;br /&gt;
    ['болгарин']='болгары',&lt;br /&gt;
    ['боярин']='бояре',&lt;br /&gt;
    ['брат']='братья',&lt;br /&gt;
    ['век']='века',&lt;br /&gt;
    ['веко']='веки',&lt;br /&gt;
    ['вес']='веса',&lt;br /&gt;
    ['грузин']='грузины',&lt;br /&gt;
    ['день']='дни',&lt;br /&gt;
    ['дерево']='деревья',&lt;br /&gt;
    ['директор']='директора',&lt;br /&gt;
    ['дитя']='дети',&lt;br /&gt;
    ['доктор']='доктора',&lt;br /&gt;
    ['дочь']='дочери',&lt;br /&gt;
    ['друг']='друзья',&lt;br /&gt;
    ['звезда']='звёзды',&lt;br /&gt;
    ['знамя']='знамёна',&lt;br /&gt;
    ['инспектор']='инспектора',&lt;br /&gt;
    ['край'] = 'края',&lt;br /&gt;
    ['мать']='матери',&lt;br /&gt;
    ['небо']='небеса',&lt;br /&gt;
    ['озеро']='озёра',&lt;br /&gt;
    ['перо']='перья',&lt;br /&gt;
    ['поезд']='поезда',&lt;br /&gt;
    ['ребёнок']='дети',&lt;br /&gt;
    ['список']='списки',&lt;br /&gt;
    ['сын']='сыновья',&lt;br /&gt;
    ['татарин']='татары',&lt;br /&gt;
    ['церковь']='церкви',&lt;br /&gt;
    ['цыган']='цыгане',&lt;br /&gt;
    ['человек']='люди',&lt;br /&gt;
    ['чудо']='чудеса'&lt;br /&gt;
}; -- table of some common special plural cases&lt;br /&gt;
&lt;br /&gt;
function M.s(f)&lt;br /&gt;
    return M.so(f.args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function M.so(phr) -- выбирает предлог «с» или «со» к фразе, в начале которой может быть пунктуация&lt;br /&gt;
    local w = mw.ustring.match(phr, '[%p%s%c]*(.-)[%p%s%c]') or mw.ustring.match(phr, '[%p%s%c]*(.-)$')&lt;br /&gt;
    if not w then return nil end&lt;br /&gt;
    -- Здесь не отражены аббревиатуры и буквосочетания на других языках — предполагается, что пока это будут прописывать&lt;br /&gt;
    -- вручную&lt;br /&gt;
    w = mw.language.new('ru'):lcfirst(w)&lt;br /&gt;
    -- http://new.gramota.ru/spravka/buro/search-answer?s=с%20(со)&lt;br /&gt;
    if mw.ustring.match(w, '^[сзшжрлмв][' .. cons .. ']') or&lt;br /&gt;
        mw.ustring.match(w, '^ль[' .. cons .. ']') or&lt;br /&gt;
        mw.ustring.match(w, '^щ')&lt;br /&gt;
    then&lt;br /&gt;
        return 'со'&lt;br /&gt;
    else&lt;br /&gt;
        return 'с'&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function M.pl(p) -- множественное число, 2-й аргумент 0 (нескл.), 1, 2, 3 или a (adjective - прилагательное)&lt;br /&gt;
--Поддержка словосочетаний планируется потом&lt;br /&gt;
    local word = p.args[1];&lt;br /&gt;
    if specpl[word] then return specpl[word] end;&lt;br /&gt;
    local d=p.args[2];&lt;br /&gt;
    if d==nil then d=M.guessdecl(p) end;&lt;br /&gt;
    if d=='0' then return word&lt;br /&gt;
    elseif d=='a' then&lt;br /&gt;
        if mw.ustring.match(word,'['..cons7..']..$') then&lt;br /&gt;
            return mw.ustring.sub(word,1,-3)..'ие'&lt;br /&gt;
        else return mw.ustring.sub(word,1,-3)..adjends[mw.ustring.sub(word,-2)]&lt;br /&gt;
        end&lt;br /&gt;
elseif d=='1' then&lt;br /&gt;
    if  mw.ustring.sub(word,-1)=='я' or mw.ustring.match(word,'['..cons7..']а$')&lt;br /&gt;
    then return mw.ustring.sub(word,1,-2)..'и'&lt;br /&gt;
    else return mw.ustring.sub(word,1,-2)..'ы' end&lt;br /&gt;
elseif d=='2' then&lt;br /&gt;
    if mw.ustring.match(word,'о$') then return mw.ustring.sub(word,1,-2)..'а'&lt;br /&gt;
    elseif mw.ustring.match(word,'е$') then return mw.ustring.sub(word,1,-2)..'я'&lt;br /&gt;
    elseif mw.ustring.match(word,'[ьй]$') then return mw.ustring.sub(word,1,-2)..'и'&lt;br /&gt;
    elseif mw.ustring.match(word,'онок$') then return mw.ustring.sub(word,1,-5)..'ата'&lt;br /&gt;
    elseif mw.ustring.match(word,'ёнок$') then return mw.ustring.sub(word,1,-5)..'ята'&lt;br /&gt;
    elseif mw.ustring.match(word,'анин$') then return mw.ustring.sub(word,1,-5)..'ане'&lt;br /&gt;
    elseif mw.ustring.match(word,'янин$') then return mw.ustring.sub(word,1,-5)..'яне'&lt;br /&gt;
    elseif mw.ustring.match(word,'ец$') and not mw.ustring.match(word,'['..cons7..']['..cons7..']ец$') then -- !!неправильно для этнохоронимов на -ец типа &amp;quot;ньюйоркцы&amp;quot;&lt;br /&gt;
        if mw.ustring.match(word,'лец$') then return mw.ustring.sub(word,1,-3)..'ьцы'&lt;br /&gt;
            elseif mw.ustring.match(word,'[аоуыэяёюие]ец$') then return mw.ustring.sub(word,1,-3)..'ьцы'&lt;br /&gt;
            else return mw.ustring.sub(word,1,-3)..'цы'&lt;br /&gt;
        end&lt;br /&gt;
    elseif mw.ustring.match(word,'['..cons7..']$') then return word..'и'&lt;br /&gt;
    else return word..'ы'&lt;br /&gt;
    end&lt;br /&gt;
elseif d=='3' then&lt;br /&gt;
    if mw.ustring.match(word,'мя$') then return mw.ustring.sub(word,1,-3)..'ена'&lt;br /&gt;
        else return mw.ustring.sub(word,1,-2)..'и'&lt;br /&gt;
    end&lt;br /&gt;
    else return &amp;quot;&amp;lt;span class=error&amp;gt;Wrong declesion '&amp;quot;..d..&amp;quot;' in RuGrammar::pl()&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function M.guessdecl(p) -- угадывает тип склонения&lt;br /&gt;
    local word=p.args[1];&lt;br /&gt;
    if mw.ustring.match(word,'['..cons..'][оыи]й$')&lt;br /&gt;
      or mw.ustring.match(word,'['..cons..'][ая]я$')&lt;br /&gt;
      or mw.ustring.match(word,'['..cons..'][ое]е$')&lt;br /&gt;
    then return 'a' --sometimes wrong&lt;br /&gt;
    elseif mw.ustring.match(word,'['..cons..'][оеь]?$') then return '2' --but mb 3, can't guess w/o dict&lt;br /&gt;
    elseif mw.ustring.match(word,'['..cons..'][ая]$') then&lt;br /&gt;
        if mw.ustring.match(word,'[^'..cons..']мя$') then return '3' else return '1' end&lt;br /&gt;
    else return '0'&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function M.locative(p) -- Возможно, будет когда-то заменено на функционал mw.language('ru'):grammar(), которого пока не хватает&lt;br /&gt;
	local word=p.args[1];&lt;br /&gt;
	local locend={['а']='е', ['я']='е', ['й']='е', ['ы']=&amp;quot;ах&amp;quot;, ['ь']='и'}; --the last one is disputed: most Russian cities ending with -ь are 3rd declesion, but some foreign ones are 2nd decl., so -е should be returned&lt;br /&gt;
	local ec=mw.ustring.sub(word,-1);&lt;br /&gt;
	if mw.ustring.match(word,'ия$') then return mw.ustring.sub(word,1,-2)..'и'&lt;br /&gt;
	elseif mw.ustring.match(word,'['..cons..']ль$') or mw.ustring.sub(word,-4)=='поль' then return mw.ustring.sub(word,1,-2)..'е'&lt;br /&gt;
	elseif mw.ustring.match(word,'ской$') or mw.ustring.match(word,'ское$') or mw.ustring.match(word,'цкое$') then return mw.ustring.sub(word,1,-2)..'м'&lt;br /&gt;
	elseif mw.ustring.match(word,'ский$') or mw.ustring.match(word,'цкий$') or mw.ustring.match(word,'ный$') then return mw.ustring.sub(word,1,-3)..'ом'&lt;br /&gt;
	elseif mw.ustring.match(word,'ская$') or mw.ustring.match(word,'цкая$') or mw.ustring.match(word,'ная$') then return mw.ustring.sub(word,1,-3)..'ой'&lt;br /&gt;
	elseif mw.ustring.match(word,'няя$') then return mw.ustring.sub(word,1,-3)..'ей'&lt;br /&gt;
	elseif locend[ec] then return mw.ustring.sub(word,1,-2)..locend[ec]&lt;br /&gt;
	elseif mw.ustring.match(ec,'['..cons..']') then return word..'е'&lt;br /&gt;
	elseif ec=='о' then&lt;br /&gt;
	    if mw.ustring.match(word,'[оеё]во$') or mw.ustring.match(word,'[иы]но$') then return mw.ustring.sub(word,1,-2)..'е'  -- корректно только для топонимов со славянскими корнями&lt;br /&gt;
	        else return word&lt;br /&gt;
	    end&lt;br /&gt;
	else return word end&lt;br /&gt;
end;&lt;br /&gt;
 &lt;br /&gt;
return M&lt;/div&gt;</summary>
		<author><name>Dzmuh</name></author>
	</entry>
</feed>