Перейти к содержанию
Главное меню
Главное меню
переместить в боковую панель
скрыть
Навигация
Заглавная страница
Указатели
Свежие правки
Случайная страница
Справка по MediaWiki
Народные Сказки
Поиск
Найти
Создать учётную запись
Войти
Персональные инструменты
Создать учётную запись
Войти
Страницы для неавторизованных редакторов
узнать больше
Вклад
Обсуждение
Редактирование:
Модуль:Ru
Модуль
Обсуждение
English
Читать
Править код
История
Инструменты
Инструменты
переместить в боковую панель
скрыть
Действия
Читать
Править код
История
Общие
Ссылки сюда
Связанные правки
Служебные страницы
Сведения о странице
Внимание:
Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы
войдёте
или
создадите учётную запись
, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.
Анти-спам проверка.
Не
заполняйте это!
--[[ Основные функции, касающиеся русского языка ]] 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
Описание изменений:
Пожалуйста, учтите, что любой ваш вклад в проект «Народные Сказки» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см.
РуСказки:Авторские права
).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!
Отменить
Справка по редактированию
(в новом окне)
Отобразить/Скрыть ограниченную ширину содержимого