local p = {}
-- Если передано, например, название "Северо-Западный район (значения)", то оно делится на части:
-- p1="Северо-Западн" - отдельной переменной нет, есть поле в каждом элементе таблицы beginnings (в том числе текущем, который хранится в переменной xx)
-- p2="ый" - отдельной переменной нет, есть список в таблице endings и переменная p2_n, обозначающая его номер по таблице endings
-- p3=" район" - это переменная, которая вычисляется постепенно
-- p4=" (значения)" - отдельной переменной нет, есть константа
-- Первый цикл вычисляет xx, p2_n и p3. Второй цикл строит список. В элементах списка:
-- p1 - даются все варианты, которые существуют и совпадают с заданным по полю group в таблице beginnings
-- p2 - берётся тот же p2_n, что и у заданного (сам p2 может не совпадать с заданным, если пришлось обратиться к таблице endings на уровне элемента списка)
-- p3 - берётся точно такой же, как у заданного
-- p4 - берётся страница с уточнением или без в зависимости от того, какая из них существует
-- (если существуют обе, для текущей страницы приоритет у значения, заданного в параметре, для остальных у страницы с уточнением)
local p4=' (значения)'
local p4_l=mw.ustring.len(p4)
local t=mw.title.new;
local endings = {'ый','ая','ое','ые'}
local beginnings = {
{group='сзюв',p1='Восточн'},
{group='сзюв',p1='Западн'},
{group='сзюв',p1='Северн'},
{group='сзюв',p1='Северо-Восточн'},
{group='сзюв',p1='Северо-Западн'},
{group='сзюв',p1='Центральн'},
{group='сзюв',p1='Юго-Восточн'},
{group='сзюв',p1='Юго-Западн'},
{group='сзюв',p1='Южн'},
{group='радуга',p1='Бел',sq='white'},
{group='радуга',p1='Голуб',sq='lightblue',endings={'ой','ая','ое','ые'}},
{group='радуга',p1='Жёлт',sq='yellow'},
{group='радуга',p1='Зелён',sq='green'},
{group='радуга',p1='Коричнев',sq='brown'},
{group='радуга',p1='Красн',sq='red'},
{group='радуга',p1='Оранжев',sq='darkorange'},
{group='радуга',p1='Розов',sq='pink'},
{group='радуга',p1='Сер',sq='gray'},
{group='радуга',p1='Син',sq='blue',endings={'ий','яя','ее','ие'}},
{group='радуга',p1='Фиолетов',sq='darkviolet'},
{group='радуга',p1='Чёрн',sq='black'},
}
function p.List(frame)
local param=frame.args[1]
local e,xx,p2_n,p3
local rtn=''
for n_,x in pairs(beginnings) do
if x.endings then
e=x.endings
else
e=endings
end
for n=1,4 do
if mw.ustring.sub(param,1,mw.ustring.len(x.p1)+2)==x.p1..e[n] then
xx=x
p2_n=n
p3=mw.ustring.sub(param,mw.ustring.len(x.p1)+3,mw.ustring.len(param))
if mw.ustring.find(p3,p4,1,true)==mw.ustring.len(p3)-p4_l+1 then
p3=mw.ustring.sub(p3,1,mw.ustring.len(p3)-p4_l)
end
end
end
end
for n_,x in pairs(beginnings) do
if x.group==xx.group then
if x.endings then
e=x.endings
else
e=endings
end
local a=x.p1..e[p2_n]..p3
local b=''
if a==param then
b='[['..a..']]'
elseif t(a..p4).exists then
b='[['..a..p4..'|'..a..']]'
elseif t(a).exists then
b='[['..a..']]'
end
if b~='' then
if rtn~='' then
rtn=rtn..' '
end
if x.sq then
rtn=rtn..' '..frame:preprocess('{{Цветной прямоугольник|'..x.sq..'}}')..' '
elseif rtn~='' then
rtn=rtn..'• '
end
rtn=rtn..frame:preprocess('{{d-|'..b..'}}')
end
end
end
return rtn
end
return p