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