Модуль:Песочница/Vcohen/DisambigNavigation

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Документация

Отладка:

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