Перейти к содержанию

Модуль:Wikidata/P166

Википедия деп сайттан

WikiDataValueToArray(strSrc)

[вики-сөзүглелди эдер]

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

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

getOneMedal(medal, wd, frame)

[вики-сөзүглелди эдер]

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

formatOneItems(medals, wd, frame)

[вики-сөзүглелди эдер]

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

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

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

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

formatMedals(medal, 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