Перейти к содержанию
Главное меню
Главное меню
переместить в боковую панель
скрыть
Темы
Урбанистика
Физическая география
Транспорт
Примите участие!
Поддержите нас
Портал сообщества
Справка
Свежие правки
Янтарная ноосфера
Поиск
Найти
русский
Создать учётную запись
Войти
Персональные инструменты
Создать учётную запись
Войти
Страницы для неавторизованных редакторов
узнать больше
Вклад
Обсуждение
Редактирование:
Модуль: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.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 locend[ec] then return mw.ustring.sub(word,1,-2)..locend[ec] elseif ec=='я' then return mw.ustring.sub(word,1,-2)..'е' elseif mw.ustring.match(ec,'['..cons..']') then return word..'е' elseif ec=='о' then if mw.ustring.match(word,'[оеё]во$') then return mw.ustring.sub(word,1,-2)..'е' else return word end else return word end end; return M
Описание изменений:
Обратите внимание, что все изменения в Янтарная ноосфера рассматриваются как выпущенные на условиях лицензии Creative Commons Attribution Share Alike (см.
Проект:Авторские права
). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника в общественном достоянии или под совместимой лицензией.
Не размещайте без разрешения материалы, защищённые авторским правом!
Отменить
Справка по редактированию
(в новом окне)
Шаблон, используемый на этой странице:
Модуль:Ru/doc
(
посмотреть исходный код
)
Отобразить/Скрыть ограниченную ширину содержимого