Модуль:Mdf
Тифнень-лядяфнень морафтомасна
Для документации этого модуля может быть создана страница Модуль:Mdf/doc
--[[
Основные функции, касающиеся мокшанского языка
]]
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