Модуль:Wikidata/P166

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

Функции[править код]

WikiDataValueToArray(strSrc)[править код]

Функция преобразует строку в массив по запятым.

sortOneRank(medals)[править код]

Функция сортирует полученный массив в три массива: ордена, медали и другое.

getOneMedal(medal, wd, frame)[править код]

Функция получает одну единственную медаль из переданного значения и, при необходимости, форматирует её так, чтобы это был шаблон. Если такой страницы нет, то вставит «красную ссылку» для провокации на создание шаблона.

formatOneItems(medals, wd, frame)[править код]

Функция форматирует одну ранг медалей.

getAllMedals(frame)[править код]

Функция получает все доступные на странице медали.

Приоритет отдаётся параметрам шаблона на странице и не пересекается с Тептар данными никогда.

sorting(medals)[править код]

Функция сортирует переданные ей параметры, при условии, что они из Тептар данных.

formatMedals(medal, frame)[править код]

Функция форматирует медали в Тептар-таблицу.

Методы[править код]

p.display(frame)[править код]

Функция последовательно получает список всех доступных медалей, сортирует их и выводит в формате Тептар-таблицы.


-- https://www.mediawiki.org/wiki/Wikibase/DataModel
-- https://www.wikidata.org/wiki/Wikidata:Glossary/ru
-- https://www.mediawiki.org/wiki/Extension:Wikibase_Client/Lua/ru
-- https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru

local p = {}

local function WikiDataValueToArray(strSrc)
	local result = {}
	for str in string.gmatch(strSrc, "[^,]+") do
		str = str:match'^%s*(.*%S)' or '' -- trim
		if str ~= 'значение неизвестно' and str ~= 'значение отсутствует' then
			table.insert(result, str)
		end
	end
	return result
end

local function sortOneRank(medals)
	local result = {
		medals = {},
		orders = {},
		others = {}
	}
	
	for i, value in ipairs(medals) do
		if string.find(value, '[Мм]едаль') ~= nil then
			table.insert(result.medals, value)
		elseif string.find(value, '[Оо]рден') ~= nil then
			table.insert(result.orders, value)
		else
			table.insert(result.others, value)
		end
	end
	
	return result
end

local function getOneMedal(medal, wd, frame)
	local result = ''
	
	if wd == 1 then
		local title = mw.title.new('Шаблон:' .. medal)
		if title.exists then
			result = frame:expandTemplate{ title = medal, args = {} }
		else
			result = '[[Шаблон:' .. medal .. ']]'
		end
	else
		result = medal
	end
	
	return result
end

local function formatOneItems(medals, wd, frame)
	local result = ''
	
	for i, value in pairs(medals) do
		result = result .. '|' .. getOneMedal(value, wd, frame) .. '\n'
		if math.fmod(i, 4) == 0 then
			result = result .. '|-\n'
		end
	end
	
	return result .. '|-\n'
end

local function getAllMedals(frame)
	local result = {
		wd    = 0,
		items = {}
	}
	
	for key, value in pairs( frame.args ) do
		if string.sub(value, 0, 1) ~= '{' then
			table.insert(result.items, value)
		end
	end
	
	if next(result.items) == nil then -- если пусто, используем ВД
		result.wd = 1
		
		local entity = mw.wikibase.getEntityObject()
		local valuePref = entity:formatPropertyValues('P166', { mw.wikibase.entity.claimRanks.RANK_PREFERRED } ).value
		local valueNorm = entity:formatPropertyValues('P166', { mw.wikibase.entity.claimRanks.RANK_NORMAL } ).value
		local valueDepr = entity:formatPropertyValues('P166', { mw.wikibase.entity.claimRanks.RANK_DEPRECATED } ).value

		table.insert(result.items, WikiDataValueToArray(valuePref))
		table.insert(result.items, WikiDataValueToArray(valueNorm))
		table.insert(result.items, WikiDataValueToArray(valueDepr))
	end
	
	return result
end

local function sorting(medals)
	local result = {
		wd = medals.wd,
		items = {}
	}
	
	-- Не сортировать, если источник ВП или пусто.
	if medals.wd == 1 and next(medals.items) ~= nil then
		table.insert(result.items, sortOneRank(medals.items[1]))
		table.insert(result.items, sortOneRank(medals.items[2]))
		table.insert(result.items, sortOneRank(medals.items[3]))
	else
		result.items[1] = medals.items
	end
	
	return result
end

local function formatMedals(medal, frame)
	local startStr, result, endStr = '{| style="background:transparent"\n', '', '|}'
	
	if next(medal.items) ~= nil then
		for i, value in ipairs(medal.items) do
			if medal.wd == 1 then
				result = result .. formatOneItems(value.orders, medal.wd, frame)
				result = result .. formatOneItems(value.medals, medal.wd, frame)
				result = result .. formatOneItems(value.others, medal.wd, frame)
			else
				result = result .. formatOneItems(value, medal.wd, frame)
			end
		end
	end
	return startStr .. result .. endStr
end

function p.display(frame)
	local medals = getAllMedals(frame)
	local sortedMedals = sorting(medals)
	return formatMedals(sortedMedals, frame)
end

return p