Модуль:Serialization/EntityTableSelector: различия между версиями

Новая страница: «local p = {} local getArgs = require('Module:Arguments').getArgs local JsonPaths = require('Module:JsonPaths') local entityTableDataCache local function trim(value) return mw.text.trim(value or "") end local function deepCopy(source) if type(source) ~= "table" then return source end local copy = {} for key, value in pairs(source) do copy[key] = deepCopy(value) end return copy end local function deepMerge(tar...»
 
Нет описания правки
(не показано 16 промежуточных версий этого же участника)
Строка 190: Строка 190:
     end
     end


     return "{{LinkCard|название={{#invoke:Entity Lookup|getname|" .. id .. "}} {{#invoke:Prototypes/Хранилище/Предмет|main|framing|stack|" .. id .. "}} " .. amount .. " <span>" .. prob .. "</span>|пин={{#invoke:Prototypes/Хранилище/Предмет|main|framing|contained|" .. id .. "}} {{#invoke:Prototypes/Хранилище/Предмет|main|framing|slot|" .. id .. "}} {{#invoke:Prototypes/Хранилище/Предмет|main|framing|chem|" .. id .. "}}|изображение=[[Файл:" .. id .. ".png|32px]]|горизонт_стиль=1}}"
     return "{{предмет|" .. id .. "|" .. amount .. " <span>" .. prob .. "</span>|wrapper=1|repository=1}}"
end
end


Строка 196: Строка 196:
local renderTableById
local renderTableById


local function renderChildren(children, visited)
local function hasNestedCollapsible(content)
    if type(content) ~= "string" or content == "" then
        return false
    end
 
    return string.find(content, "{{LinkCard/Сollapsible|", 1, true) ~= nil
end
 
local function wrapCollapsible(title, content, depth)
    if trim(title) == "" then
        return content or ""
    end
 
    local prefix = "{{LinkCard/Сollapsible|"
    if (depth or 0) > 0 and not hasNestedCollapsible(content) then
        prefix = prefix .. "развернуть=1|"
    end
 
    return prefix .. "название=" .. title .. "|содержание=" .. (content or "") .. "}}"
end
 
local function renderPlainEntries(entries)
    if type(entries) ~= "table" then
        return ""
    end
 
    local result = {}
    for _, entry in ipairs(entries) do
        if type(entry) == "table" and trim(entry.id) ~= "" then
            result[#result + 1] = formatContent(entry)
        end
    end
 
    return table.concat(result)
end
 
local function renderPlainEntry(entry)
    if type(entry) ~= "table" or trim(entry.id) == "" then
        return ""
    end
 
    return formatContent(entry)
end
 
local function renderChildren(children, visited, depth)
     if type(children) ~= "table" then
     if type(children) ~= "table" then
         return ""
         return ""
Строка 205: Строка 249:
         local selector = normalizeSelector(child)
         local selector = normalizeSelector(child)
         if selector then
         if selector then
             local rendered = renderSelector(selector, visited, false)
             local rendered = renderSelector(selector, visited, true, depth)
            if rendered ~= "" then
                result[#result + 1] = rendered
            end
        else
            local rendered = renderPlainEntry(child)
             if rendered ~= "" then
             if rendered ~= "" then
                 result[#result + 1] = rendered
                 result[#result + 1] = rendered
Строка 215: Строка 264:
end
end


local function renderAllSelector(selector, visited)
local function renderAllSelector(selector, visited, depth)
     return renderChildren(selector.children, visited)
     return renderChildren(selector.children, visited, depth)
end
end


local function renderNestedSelector(selector, visited, wrapped)
local function renderNestedSelector(selector, visited, wrapped, depth)
     if trim(selector.tableId) == "" then
     if trim(selector.tableId) == "" then
         return ""
         return ""
     end
     end


    local result = {}
     local suffix = ""
     local suffix = ""


Строка 242: Строка 290:


         suffix = suffix .. prob
         suffix = suffix .. prob
        if suffix ~= "" then
            result[#result + 1] = "{{LinkCard/Сollapsible|название=Группа предметов" .. suffix .. "|содержание="
        end
     end
     end


     result[#result + 1] = renderTableById(selector.tableId, visited)
     local content = renderTableById(selector.tableId, visited, depth)
 
     if wrapped and suffix ~= "" then
     if wrapped and suffix ~= "" then
         result[#result + 1] = "}}"
         return wrapCollapsible("Группа предметов" .. suffix, content, depth)
     end
     end


     return table.concat(result)
     return content
end
end


local function renderGroupSelector(selector, visited)
local function renderGroupSelector(selector, visited, depth)
     if type(selector.children) ~= "table" then
     if type(selector.children) ~= "table" then
         return ""
         return ""
     end
     end


     local wrapperStart = ""
     local title = ""
     local wrapperEnd = ""
     local hasWeight = rawget(selector, "weight") ~= nil


     if selector.weight ~= nil and selector.weight ~= "default" then
     if hasWeight and selector.weight ~= "default" then
         wrapperStart = "{{LinkCard/Сollapsible|название=Группа предметов " .. normalizePercent(selector.weight, false) .. "|содержание="
         title = "Группа предметов " .. normalizePercent(selector.weight, false)
        wrapperEnd = "}}"
     elseif not hasWeight then
     elseif selector.weight == nil then
         title = "Может выпасть лишь один из:"
         wrapperStart = "{{LinkCard/Сollapsible|название=Может выпасть лишь один из:|содержание="
        wrapperEnd = "}}"
     end
     end


Строка 278: Строка 319:
         if childSelector then
         if childSelector then
             if childSelector["!type"] == "AllSelector" then
             if childSelector["!type"] == "AllSelector" then
                 local rendered = renderAllSelector(childSelector, visited)
                 local rendered = renderAllSelector(childSelector, visited, (depth or 0) + 1)
                 if rendered ~= "" then
                 if rendered ~= "" then
                     result[#result + 1] = "{{LinkCard/Сollapsible|название=Выпадают только вместе:|содержание=" .. rendered .. "}}"
                     result[#result + 1] = wrapCollapsible("Выпадают только вместе:", rendered, (depth or 0) + 1)
                 end
                 end
             elseif childSelector["!type"] == "GroupSelector" then
             elseif childSelector["!type"] == "GroupSelector" then
                 result[#result + 1] = renderGroupSelector(childSelector, visited)
                 result[#result + 1] = renderGroupSelector(childSelector, visited, (depth or 0) + 1)
             elseif childSelector["!type"] == "NestedSelector" then
             elseif childSelector["!type"] == "NestedSelector" then
                 result[#result + 1] = renderNestedSelector(childSelector, visited, true)
                 result[#result + 1] = renderNestedSelector(childSelector, visited, true, (depth or 0) + 1)
             elseif childSelector["!type"] == "EntSelector" then
             elseif childSelector["!type"] == "EntSelector" then
                 result[#result + 1] = formatContent(childSelector)
                 result[#result + 1] = formatContent(childSelector)
Строка 292: Строка 333:
     end
     end


     return wrapperStart .. table.concat(result) .. wrapperEnd
     return wrapCollapsible(title, table.concat(result), depth)
end
end


renderTableById = function(tableId, visited)
renderTableById = function(tableId, visited, depth)
     visited = visited or {}
     visited = visited or {}
     tableId = trim(tableId)
     tableId = trim(tableId)
Строка 313: Строка 354:


     if not selector then
     if not selector then
        visited[tableId] = nil
         return "Таблица не найдена."
         return "Таблица не найдена."
     end
     end


     return renderSelector(selector, visited, false)
     local result = renderSelector(selector, visited, false, depth)
    visited[tableId] = nil
    return result
end
end


renderSelector = function(selector, visited, wrapped)
renderSelector = function(selector, visited, wrapped, depth)
     selector = normalizeSelector(selector)
     selector = normalizeSelector(selector)
     if not selector then
     if not selector then
Строка 328: Строка 372:
         return formatContent(selector)
         return formatContent(selector)
     elseif selector["!type"] == "AllSelector" then
     elseif selector["!type"] == "AllSelector" then
         return renderAllSelector(selector, visited)
         return renderAllSelector(selector, visited, depth)
     elseif selector["!type"] == "GroupSelector" then
     elseif selector["!type"] == "GroupSelector" then
         return renderGroupSelector(selector, visited)
         return renderGroupSelector(selector, visited, depth)
     elseif selector["!type"] == "NestedSelector" then
     elseif selector["!type"] == "NestedSelector" then
         return renderNestedSelector(selector, visited, wrapped ~= false)
         return renderNestedSelector(selector, visited, wrapped ~= false, depth)
     end
     end


Строка 343: Строка 387:


     if trim(jsonText) == "" then
     if trim(jsonText) == "" then
         return "Не указан JSON."
         return ""
     end
     end


     local ok, data = pcall(mw.text.jsonDecode, jsonText)
     local ok, data = pcall(mw.text.jsonDecode, jsonText)
     if not ok or type(data) ~= "table" then
     if not ok or type(data) ~= "table" then
         return "Некорректный JSON."
         return ""
     end
     end


     local selector = normalizeSelector(data)
     local selector = normalizeSelector(data)
     if not selector then
     if not selector then
         return "Не удалось определить тип селектора."
        local plainEntry = renderPlainEntry(data)
        if plainEntry ~= "" then
            return frame:preprocess(plainEntry)
        end
 
        local plainEntries = renderPlainEntries(data)
        if plainEntries ~= "" then
            return frame:preprocess(plainEntries)
        end
 
         return ""
     end
     end


     return renderSelector(selector, {}, false)
     return frame:preprocess(renderSelector(selector, {}, false, 0))
end
end


return p
return p