Модуль:Av
Внешний вид
Для документации этого модуля может быть создана страница Модуль:Av/doc
--[[
Авар мацІалда хурхарал аслиял функциял
]]
local M={}
function M.o(f)
return M.obo(f.args[1])
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