Модуль:Entity Sprite/all: различия между версиями

Нет описания правки
Нет описания правки
 
(не показано 11 промежуточных версий этого же участника)
Строка 1: Строка 1:
local p = {}
local p = {}
local JsonPaths = require('Module:JsonPaths')
local JsonPaths = require('Module:JsonPaths')
local prefix = JsonPaths.prefixFile()


local function normalizeSpritePath(path)
local function normalizeSpritePath(path)
Строка 139: Строка 138:
end
end


local function getParents(entry)
local function getParents(parentData, id)
if not entry then
if not parentData or type(parentData) ~= "table" or not id then
return nil
return nil
end
end


if type(entry.parents) == "table" then
local parents = parentData[id]
return entry.parents
if type(parents) ~= "table" then
return nil
end
end


if type(entry.parents) == "string" then
return parents
return splitCsv(entry.parents)
end
 
local function hasAnyParent(parents, set)
if not parents or not set then
return false
end
end


return nil
for _, parent in ipairs(parents) do
if set[parent] then
return true
end
end
 
return false
end
end


local function shouldIncludeEntry(entry, whitelistSet, blacklistSet)
local function shouldIncludeEntry(id, whitelistSet, blacklistSet, parentData)
local parents = getParents(entry)
local parents = getParents(parentData, id)


if whitelistSet and not hasAnyParent(parents, whitelistSet) then
if whitelistSet and not hasAnyParent(parents, whitelistSet) then
Строка 169: Строка 179:
end
end


local function filterSpriteData(spriteData, prototypeData, whitelistSet, blacklistSet, project)
local function filterSpriteData(spriteData, parentData, whitelistSet, blacklistSet, project)
local result = {}
local result = {}


for id, entry in pairs(spriteData) do
for id, entry in pairs(spriteData) do
local protoEntry = prototypeData and prototypeData[id] or entry
if shouldIncludeEntry(id, whitelistSet, blacklistSet, parentData) then
 
if shouldIncludeEntry(protoEntry, whitelistSet, blacklistSet) then
if project == "" or JsonPaths.has(id, project) then
if project == "" or JsonPaths.has(id, project) then
result[id] = entry
result[id] = entry
Строка 183: Строка 191:


return result
return result
end
local function hasAnyParent(parents, set)
if not parents or not set then
return false
end
for _, parent in ipairs(parents) do
if set[parent] then
return true
end
end
return false
end
local function shouldIncludeEntry(entry, whitelistSet, blacklistSet)
local parents = getParents(entry)
if whitelistSet and not hasAnyParent(parents, whitelistSet) then
return false
end
if blacklistSet and hasAnyParent(parents, blacklistSet) then
return false
end
return true
end
end


local function buildFileLink(id, project)
local function buildFileLink(id, project)
return "[[:Файл:" .. prefix .. id .. ".png]]"
return "[[:Файл:" .. JsonPaths.prefixFile(id) .. ".png]]"
end
end


Строка 289: Строка 269:
table.insert(result, mw.getCurrentFrame():preprocess(
table.insert(result, mw.getCurrentFrame():preprocess(
"{{Entity Sprite/Repeat|файлы=" .. table.concat(idLinks, " ") ..
"{{Entity Sprite/Repeat|файлы=" .. table.concat(idLinks, " ") ..
"|перенаправление=" .. prefix .. firstId ..
"|перенаправление=" .. JsonPaths.prefixFile(firstId) ..
"|id=" .. firstId ..
"|id=" .. firstId ..
"|спрайт=" .. spriteValue ..
"|спрайт=" .. spriteValue ..
Строка 310: Строка 290:


return mw.getCurrentFrame():preprocess(
return mw.getCurrentFrame():preprocess(
"{{Entity Sprite/Image|файл=" .. prefix .. id ..
"{{Entity Sprite/Image|файл=" .. JsonPaths.prefixFile(id) ..
"|id=" .. id ..
"|id=" .. id ..
"|путь=" .. buildSpriteUrl(baseUrl, spritePath) ..
"|путь=" .. buildSpriteUrl(baseUrl, spritePath) ..
Строка 320: Строка 300:
function p.main(frame)
function p.main(frame)
local action = frame.args[1]
local action = frame.args[1]
local json = frame.args.json or "prototype/sprite.json"
local json = frame.args.json or "component/Sprite.json"


local project = JsonPaths.project()
local project = JsonPaths.project()
Строка 326: Строка 306:


local dataPage = JsonPaths.get(json)
local dataPage = JsonPaths.get(json)
local prototypesPage = JsonPaths.get("entity prototypes.json")
local parentPage = JsonPaths.get("entity parent.json")


local spriteDataRaw = mw.loadData(dataPage)
local spriteDataRaw = mw.loadData(dataPage)
local prototypeDataRaw = mw.loadData(prototypesPage)
local parentDataRaw = mw.loadData(parentPage)


local spriteData = normalizeData(spriteDataRaw)
local spriteData = normalizeData(spriteDataRaw)
local prototypeData = normalizeData(prototypeDataRaw)
local parentData = normalizeData(parentDataRaw)


if not spriteData or type(spriteData) ~= "table" then
if not spriteData or type(spriteData) ~= "table" then
Строка 338: Строка 318:
end
end


if not prototypeData or type(prototypeData) ~= "table" then
if not parentData or type(parentData) ~= "table" then
return "Ошибка загрузки JSON: " .. prototypesPage
return "Ошибка загрузки JSON: " .. parentPage
end
end


local whitelistSet = buildSet(frame.args.whitelistParent)
local whitelistSet = buildSet(frame.args.whitelistParent)
local blacklistSet = buildSet(frame.args.blacklistParent)
local blacklistSet = buildSet(frame.args.blacklistParent)
local filteredData = filterSpriteData(spriteData, prototypeData, whitelistSet, blacklistSet, project)
local filteredData = filterSpriteData(spriteData, parentData, whitelistSet, blacklistSet, project)


if action == "repeat" then
if action == "repeat" then