<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://station14.ru/history/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Ru?feed=atom</id>
	<title>Модуль:Ru - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://station14.ru/history/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Ru?feed=atom"/>
	<link rel="alternate" type="text/html" href="https://station14.ru/history/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Ru"/>
	<updated>2026-04-05T23:04:35Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://station14.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Ru&amp;diff=77082&amp;oldid=prev</id>
		<title>Pok: Новая страница: «-- source: https://ru.wikipedia.org/wiki/Модуль:Ru -- license: CC BY-SA 4.0   -- Основные функции, касающиеся русского языка  local M={}  function M.o(f)     return M.obo(f.args[1]) end  function M.obo(phr) -- выбирает предлог «о», «об» или «обо» к фразе, в начале которой может быть пунктуация     local w = mw.ustring.match(phr,&quot;[%p%s%c]*(.-)[...»</title>
		<link rel="alternate" type="text/html" href="https://station14.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Ru&amp;diff=77082&amp;oldid=prev"/>
		<updated>2025-04-05T14:11:21Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «-- source: https://ru.wikipedia.org/wiki/Модуль:Ru -- license: CC BY-SA 4.0   --&lt;a href=&quot;/edit/%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?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.obo(phr) -- выбирает предлог «о», «об» или «обо» к фразе, в начале которой может быть пунктуация     local w = mw.ustring.match(phr,&amp;quot;[%p%s%c]*(.-)[...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- source: https://ru.wikipedia.org/wiki/Модуль:Ru&lt;br /&gt;
-- license: CC BY-SA 4.0 &lt;br /&gt;
&lt;br /&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;,&amp;#039; &amp;#039;..mw.ustring.lower(w)..&amp;#039; &amp;#039;,1,true) then return &amp;#039;обо&amp;#039; 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 &amp;#039;об&amp;#039; else return &amp;#039;о&amp;#039; end&lt;br /&gt;
    elseif mw.ustring.match(mw.ustring.upper(w),&amp;quot;^[АОЭИУЫAOIEÖÜÄΑΕΟΥΩ]&amp;quot;) then&lt;br /&gt;
        return &amp;#039;об&amp;#039;&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;#039;о&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local cons=&amp;#039;бвгджзйклмнпрстфхцчшщ&amp;#039;; -- all consonants&lt;br /&gt;
local cons7=&amp;#039;кгхчжшщ&amp;#039;; -- consonants requiring -и&lt;br /&gt;
local adjends={[&amp;#039;ой&amp;#039;]=&amp;#039;ые&amp;#039;,[&amp;#039;ый&amp;#039;]=&amp;#039;ые&amp;#039;,[&amp;#039;ий&amp;#039;]=&amp;#039;ие&amp;#039;,[&amp;#039;ое&amp;#039;]=&amp;#039;ые&amp;#039;,[&amp;#039;ая&amp;#039;]=&amp;#039;ые&amp;#039;,[&amp;#039;яя&amp;#039;]=&amp;#039;ие&amp;#039;,[&amp;#039;ое&amp;#039;]=&amp;#039;ые&amp;#039;,[&amp;#039;ее&amp;#039;]=&amp;#039;ие&amp;#039;};&lt;br /&gt;
local specpl={&lt;br /&gt;
    [&amp;#039;город&amp;#039;]=&amp;#039;города&amp;#039;,&lt;br /&gt;
    [&amp;#039;болгарин&amp;#039;]=&amp;#039;болгары&amp;#039;,&lt;br /&gt;
    [&amp;#039;боярин&amp;#039;]=&amp;#039;бояре&amp;#039;,&lt;br /&gt;
    [&amp;#039;брат&amp;#039;]=&amp;#039;братья&amp;#039;,&lt;br /&gt;
    [&amp;#039;век&amp;#039;]=&amp;#039;века&amp;#039;,&lt;br /&gt;
    [&amp;#039;веко&amp;#039;]=&amp;#039;веки&amp;#039;,&lt;br /&gt;
    [&amp;#039;вес&amp;#039;]=&amp;#039;веса&amp;#039;,&lt;br /&gt;
    [&amp;#039;грузин&amp;#039;]=&amp;#039;грузины&amp;#039;,&lt;br /&gt;
    [&amp;#039;день&amp;#039;]=&amp;#039;дни&amp;#039;,&lt;br /&gt;
    [&amp;#039;дерево&amp;#039;]=&amp;#039;деревья&amp;#039;,&lt;br /&gt;
    [&amp;#039;директор&amp;#039;]=&amp;#039;директора&amp;#039;,&lt;br /&gt;
    [&amp;#039;дитя&amp;#039;]=&amp;#039;дети&amp;#039;,&lt;br /&gt;
    [&amp;#039;доктор&amp;#039;]=&amp;#039;доктора&amp;#039;,&lt;br /&gt;
    [&amp;#039;дочь&amp;#039;]=&amp;#039;дочери&amp;#039;,&lt;br /&gt;
    [&amp;#039;друг&amp;#039;]=&amp;#039;друзья&amp;#039;,&lt;br /&gt;
    [&amp;#039;звезда&amp;#039;]=&amp;#039;звёзды&amp;#039;,&lt;br /&gt;
    [&amp;#039;знамя&amp;#039;]=&amp;#039;знамёна&amp;#039;,&lt;br /&gt;
    [&amp;#039;инспектор&amp;#039;]=&amp;#039;инспектора&amp;#039;,&lt;br /&gt;
    [&amp;#039;край&amp;#039;] = &amp;#039;края&amp;#039;,&lt;br /&gt;
    [&amp;#039;мать&amp;#039;]=&amp;#039;матери&amp;#039;,&lt;br /&gt;
    [&amp;#039;небо&amp;#039;]=&amp;#039;небеса&amp;#039;,&lt;br /&gt;
    [&amp;#039;озеро&amp;#039;]=&amp;#039;озёра&amp;#039;,&lt;br /&gt;
    [&amp;#039;перо&amp;#039;]=&amp;#039;перья&amp;#039;,&lt;br /&gt;
    [&amp;#039;поезд&amp;#039;]=&amp;#039;поезда&amp;#039;,&lt;br /&gt;
    [&amp;#039;ребёнок&amp;#039;]=&amp;#039;дети&amp;#039;,&lt;br /&gt;
    [&amp;#039;список&amp;#039;]=&amp;#039;списки&amp;#039;,&lt;br /&gt;
    [&amp;#039;сын&amp;#039;]=&amp;#039;сыновья&amp;#039;,&lt;br /&gt;
    [&amp;#039;татарин&amp;#039;]=&amp;#039;татары&amp;#039;,&lt;br /&gt;
    [&amp;#039;церковь&amp;#039;]=&amp;#039;церкви&amp;#039;,&lt;br /&gt;
    [&amp;#039;цыган&amp;#039;]=&amp;#039;цыгане&amp;#039;,&lt;br /&gt;
    [&amp;#039;человек&amp;#039;]=&amp;#039;люди&amp;#039;,&lt;br /&gt;
    [&amp;#039;чудо&amp;#039;]=&amp;#039;чудеса&amp;#039;&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, &amp;#039;[%p%s%c]*(.-)[%p%s%c]&amp;#039;) or mw.ustring.match(phr, &amp;#039;[%p%s%c]*(.-)$&amp;#039;)&lt;br /&gt;
    if not w then return nil end&lt;br /&gt;
    -- Здесь не отражены аббревиатуры и буквосочетания на других языках — предполагается, что пока это будут прописывать&lt;br /&gt;
    -- вручную&lt;br /&gt;
    w = mw.language.new(&amp;#039;ru&amp;#039;):lcfirst(w)&lt;br /&gt;
    -- http://new.gramota.ru/spravka/buro/search-answer?s=с%20(со)&lt;br /&gt;
    if mw.ustring.match(w, &amp;#039;^[сзшжрлмв][&amp;#039; .. cons .. &amp;#039;]&amp;#039;) or&lt;br /&gt;
        mw.ustring.match(w, &amp;#039;^ль[&amp;#039; .. cons .. &amp;#039;]&amp;#039;) or&lt;br /&gt;
        mw.ustring.match(w, &amp;#039;^щ&amp;#039;)&lt;br /&gt;
    then&lt;br /&gt;
        return &amp;#039;со&amp;#039;&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;#039;с&amp;#039;&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==&amp;#039;0&amp;#039; then return word&lt;br /&gt;
    elseif d==&amp;#039;a&amp;#039; then&lt;br /&gt;
        if mw.ustring.match(word,&amp;#039;[&amp;#039;..cons7..&amp;#039;]..$&amp;#039;) then&lt;br /&gt;
            return mw.ustring.sub(word,1,-3)..&amp;#039;ие&amp;#039;&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==&amp;#039;1&amp;#039; then&lt;br /&gt;
    if  mw.ustring.sub(word,-1)==&amp;#039;я&amp;#039; or mw.ustring.match(word,&amp;#039;[&amp;#039;..cons7..&amp;#039;]а$&amp;#039;)&lt;br /&gt;
    then return mw.ustring.sub(word,1,-2)..&amp;#039;и&amp;#039;&lt;br /&gt;
    else return mw.ustring.sub(word,1,-2)..&amp;#039;ы&amp;#039; end&lt;br /&gt;
elseif d==&amp;#039;2&amp;#039; then&lt;br /&gt;
    if mw.ustring.match(word,&amp;#039;о$&amp;#039;) then return mw.ustring.sub(word,1,-2)..&amp;#039;а&amp;#039;&lt;br /&gt;
    elseif mw.ustring.match(word,&amp;#039;е$&amp;#039;) then return mw.ustring.sub(word,1,-2)..&amp;#039;я&amp;#039;&lt;br /&gt;
    elseif mw.ustring.match(word,&amp;#039;[ьй]$&amp;#039;) then return mw.ustring.sub(word,1,-2)..&amp;#039;и&amp;#039;&lt;br /&gt;
    elseif mw.ustring.match(word,&amp;#039;онок$&amp;#039;) then return mw.ustring.sub(word,1,-5)..&amp;#039;ата&amp;#039;&lt;br /&gt;
    elseif mw.ustring.match(word,&amp;#039;ёнок$&amp;#039;) then return mw.ustring.sub(word,1,-5)..&amp;#039;ята&amp;#039;&lt;br /&gt;
    elseif mw.ustring.match(word,&amp;#039;анин$&amp;#039;) then return mw.ustring.sub(word,1,-5)..&amp;#039;ане&amp;#039;&lt;br /&gt;
    elseif mw.ustring.match(word,&amp;#039;янин$&amp;#039;) then return mw.ustring.sub(word,1,-5)..&amp;#039;яне&amp;#039;&lt;br /&gt;
    elseif mw.ustring.match(word,&amp;#039;ец$&amp;#039;) and not mw.ustring.match(word,&amp;#039;[&amp;#039;..cons7..&amp;#039;][&amp;#039;..cons7..&amp;#039;]ец$&amp;#039;) then -- !!неправильно для этнохоронимов на -ец типа &amp;quot;ньюйоркцы&amp;quot;&lt;br /&gt;
        if mw.ustring.match(word,&amp;#039;лец$&amp;#039;) then return mw.ustring.sub(word,1,-3)..&amp;#039;ьцы&amp;#039;&lt;br /&gt;
            elseif mw.ustring.match(word,&amp;#039;[аоуыэяёюие]ец$&amp;#039;) then return mw.ustring.sub(word,1,-3)..&amp;#039;ьцы&amp;#039;&lt;br /&gt;
            else return mw.ustring.sub(word,1,-3)..&amp;#039;цы&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
    elseif mw.ustring.match(word,&amp;#039;[&amp;#039;..cons7..&amp;#039;]$&amp;#039;) then return word..&amp;#039;и&amp;#039;&lt;br /&gt;
    else return word..&amp;#039;ы&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
elseif d==&amp;#039;3&amp;#039; then&lt;br /&gt;
    if mw.ustring.match(word,&amp;#039;мя$&amp;#039;) then return mw.ustring.sub(word,1,-3)..&amp;#039;ена&amp;#039;&lt;br /&gt;
        else return mw.ustring.sub(word,1,-2)..&amp;#039;и&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    else return &amp;quot;&amp;lt;span class=error&amp;gt;Wrong declesion &amp;#039;&amp;quot;..d..&amp;quot;&amp;#039; 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,&amp;#039;[&amp;#039;..cons..&amp;#039;][оыи]й$&amp;#039;)&lt;br /&gt;
      or mw.ustring.match(word,&amp;#039;[&amp;#039;..cons..&amp;#039;][ая]я$&amp;#039;)&lt;br /&gt;
      or mw.ustring.match(word,&amp;#039;[&amp;#039;..cons..&amp;#039;][ое]е$&amp;#039;)&lt;br /&gt;
    then return &amp;#039;a&amp;#039; --sometimes wrong&lt;br /&gt;
    elseif mw.ustring.match(word,&amp;#039;[&amp;#039;..cons..&amp;#039;][оеь]?$&amp;#039;) then return &amp;#039;2&amp;#039; --but mb 3, can&amp;#039;t guess w/o dict&lt;br /&gt;
    elseif mw.ustring.match(word,&amp;#039;[&amp;#039;..cons..&amp;#039;][ая]$&amp;#039;) then&lt;br /&gt;
        if mw.ustring.match(word,&amp;#039;[^&amp;#039;..cons..&amp;#039;]мя$&amp;#039;) then return &amp;#039;3&amp;#039; else return &amp;#039;1&amp;#039; end&lt;br /&gt;
    else return &amp;#039;0&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
function M.locative(p) -- Возможно, будет когда-то заменено на функционал mw.language(&amp;#039;ru&amp;#039;):grammar(), которого пока не хватает&lt;br /&gt;
	local word=p.args[1];&lt;br /&gt;
	local locend={[&amp;#039;а&amp;#039;]=&amp;#039;е&amp;#039;, [&amp;#039;я&amp;#039;]=&amp;#039;е&amp;#039;, [&amp;#039;й&amp;#039;]=&amp;#039;е&amp;#039;, [&amp;#039;ы&amp;#039;]=&amp;quot;ах&amp;quot;, [&amp;#039;ь&amp;#039;]=&amp;#039;и&amp;#039;}; --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,&amp;#039;ия$&amp;#039;) then return mw.ustring.sub(word,1,-2)..&amp;#039;и&amp;#039;&lt;br /&gt;
	elseif mw.ustring.match(word,&amp;#039;[&amp;#039;..cons..&amp;#039;]ль$&amp;#039;) or mw.ustring.sub(word,-4)==&amp;#039;поль&amp;#039; then return mw.ustring.sub(word,1,-2)..&amp;#039;е&amp;#039;&lt;br /&gt;
	elseif mw.ustring.match(word,&amp;#039;ской$&amp;#039;) or mw.ustring.match(word,&amp;#039;ское$&amp;#039;) or mw.ustring.match(word,&amp;#039;цкое$&amp;#039;) then return mw.ustring.sub(word,1,-2)..&amp;#039;м&amp;#039;&lt;br /&gt;
	elseif mw.ustring.match(word,&amp;#039;ский$&amp;#039;) or mw.ustring.match(word,&amp;#039;цкий$&amp;#039;) or mw.ustring.match(word,&amp;#039;ный$&amp;#039;) then return mw.ustring.sub(word,1,-3)..&amp;#039;ом&amp;#039;&lt;br /&gt;
	elseif mw.ustring.match(word,&amp;#039;ская$&amp;#039;) or mw.ustring.match(word,&amp;#039;цкая$&amp;#039;) or mw.ustring.match(word,&amp;#039;ная$&amp;#039;) then return mw.ustring.sub(word,1,-3)..&amp;#039;ой&amp;#039;&lt;br /&gt;
	elseif mw.ustring.match(word,&amp;#039;няя$&amp;#039;) then return mw.ustring.sub(word,1,-3)..&amp;#039;ей&amp;#039;&lt;br /&gt;
	elseif locend[ec] then return mw.ustring.sub(word,1,-2)..locend[ec]&lt;br /&gt;
	elseif mw.ustring.match(ec,&amp;#039;[&amp;#039;..cons..&amp;#039;]&amp;#039;) then return word..&amp;#039;е&amp;#039;&lt;br /&gt;
	elseif ec==&amp;#039;о&amp;#039; then&lt;br /&gt;
	    if mw.ustring.match(word,&amp;#039;[оеё]во$&amp;#039;) or mw.ustring.match(word,&amp;#039;[иы]но$&amp;#039;) then return mw.ustring.sub(word,1,-2)..&amp;#039;е&amp;#039;  -- корректно только для топонимов со славянскими корнями&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>Pok</name></author>
	</entry>
</feed>