Модуль:Ru: различия между версиями
Admin (обсуждение | вклад) Нет описания правки |
Admin (обсуждение | вклад) Нет описания правки |
||
| (не показано 13 промежуточных версий этого же участника) | |||
| Строка 3: | Строка 3: | ||
]] | ]] | ||
local M={} | local M={} | ||
function M.o(f) | function M.o(f) | ||
| Строка 153: | Строка 154: | ||
end; | end; | ||
function M.genitive(p) -- Писала сама, чтобы фамилии в браке автособирались в категории. Может не работать. Когда в глобальной вики появится подходящий шаблон, может быть заменю. | function M.genitive(p) -- Писала сама, чтобы фамилии в браке автособирались в категории. Может не работать. Когда в глобальной вики появится подходящий шаблон, может быть заменю. | ||
local word=p.args[1]; | local word=p.args[1]; | ||
local locend={['ий']='их', ['ая']='их', ['ко']='ок', ['ет']="етов", ['ь']='ей'}; | local locend={['ий']='их', ['ая']='их', ['ко']='ок', ['ет']="етов", ['ь']='ей'}; | ||
local ec=mw.ustring.sub(word,-1); | local ec=mw.ustring.sub(word,-1); | ||
if mw.ustring.match(word,'ий$') then return mw.ustring.sub(word,1,-2)..'х' | if mw.ustring.match(word,'ий$') then return mw.ustring.sub(word,1,-2)..'х' | ||
elseif mw.ustring.match(word,' | elseif mw.ustring.match(word,'ая$') then return mw.ustring.sub(word,1,-3)..'их' | ||
elseif mw.ustring.match(word,' | elseif mw.ustring.match(word,'ев$') then return mw.ustring.sub(word,1,-1)..'ых' | ||
elseif mw.ustring.match(word,'ет$') then return mw.ustring.sub(word,1,- | 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,-3)..'ок' | |||
elseif mw.ustring.match(word,'ет$') or mw.ustring.match(word,'як$') then return mw.ustring.sub(word,1,-1)..'ов' | |||
elseif mw.ustring.match(word,'ин$') then return mw.ustring.sub(word,1,-1)..'ых' | |||
elseif mw.ustring.match(word,'ина$') then return mw.ustring.sub(word,1,-2)..'ых' | |||
elseif mw.ustring.match(word,'['..cons..']ь$') then return mw.ustring.sub(word,1,-2)..'ей' | |||
elseif mw.ustring.match(word,'['..cons..']$') then return mw.ustring.sub(word,1,-1)..'ей' | |||
elseif locend[ec] then return mw.ustring.sub(word,1,-2)..locend[ec] | elseif locend[ec] then return mw.ustring.sub(word,1,-2)..locend[ec] | ||
elseif mw.ustring.match(ec,'['..cons..']') then return word..'е' | elseif mw.ustring.match(ec,'['..cons..']') then return word..'е' | ||
Текущая версия от 21:35, 1 января 2023
| Файл:Padlock-silver.svg | Этот модуль относится к критическим. У него очень много включений или он используется с подстановкой. Из-за опасности вандализма или ошибочного редактирования он был защищён. |
Этот модуль содержит основные функции преобразования текста для русского языка.
Функции
genitive
Формирует родительный падеж.
Писала сама, чтобы фамилии в браке автособирались в категории. Может не работать. Когда в глобальной вики появится подходящий шаблон, может быть заменю.
Содержит ошибки, которые правлю только по мере необходимости (когда появляется статья с ошибкой в фамилии из-за этого модуля).
в род {{#invoke:ru|genitive|Пчелинцев}}→ в род Пчелинцевых
в род {{#invoke:ru|genitive|Босяк}}→ в род Босяковв род {{#invoke:ru|genitive|Бэвой-Дебой}}→ в род Бэвой-Дебоевв род {{#invoke:ru|genitive|Буневич}}→ в род Буневичейв род {{#invoke:ru|genitive|Дебой}}→ в род Дебоевв род {{#invoke:ru|genitive|Дударь}}→ в род Дударейв род {{#invoke:ru|genitive|Гуцкин}}→ в род Гуцкиныхв род {{#invoke:ru|genitive|Гуцкина}}→ в род Гуцкиныхв род {{#invoke:ru|genitive|Карчевский}}→ в род Карчевскихв род {{#invoke:ru|genitive|Карчевская}}→ в род Карчевскихв род {{#invoke:ru|genitive|Корытко}}→ в род Корытокв род {{#invoke:ru|genitive|Шеремет}}→ в род Шереметов
locative
Формирует предложный падеж (препозитив), в большинстве случаев совпадающий с местным падежом (локативом):
в {{#invoke:ru|locative|Москва}}→ в Москвев {{#invoke:ru|locative|Казань}}→ в Казани
Существует, однако, большая группа существительных, для которых формы предложного и местного падежей не совпадают (например: «лес» → «о леШаблон:ColorсШаблон:Color», но «в лесШаблон:Color»). Данная функция не учитывает эти исключения — не используйте её в подобных случаях!
о {{#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вместо правильногоШаблон:Nbsp0.
Примеры:
{{#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])
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;
function M.genitive(p) -- Писала сама, чтобы фамилии в браке автособирались в категории. Может не работать. Когда в глобальной вики появится подходящий шаблон, может быть заменю.
local word=p.args[1];
local locend={['ий']='их', ['ая']='их', ['ко']='ок', ['ет']="етов", ['ь']='ей'};
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,'ая$') then return mw.ustring.sub(word,1,-3)..'их'
elseif mw.ustring.match(word,'ев$') then return mw.ustring.sub(word,1,-1)..'ых'
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,-3)..'ок'
elseif mw.ustring.match(word,'ет$') or mw.ustring.match(word,'як$') then return mw.ustring.sub(word,1,-1)..'ов'
elseif mw.ustring.match(word,'ин$') then return mw.ustring.sub(word,1,-1)..'ых'
elseif mw.ustring.match(word,'ина$') then return mw.ustring.sub(word,1,-2)..'ых'
elseif mw.ustring.match(word,'['..cons..']ь$') then return mw.ustring.sub(word,1,-2)..'ей'
elseif mw.ustring.match(word,'['..cons..']$') then return mw.ustring.sub(word,1,-1)..'ей'
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