Модуль: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