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

Нет описания правки
Нет описания правки
 
(не показано 9 промежуточных версий этого же участника)
Строка 138: Строка 138:


local function getSelectorValue(selector)
local function getSelectorValue(selector)
    if type(selector) == "number" or type(selector) == "string" then
        return selector
    end
     selector = normalizeSelector(selector) or selector
     selector = normalizeSelector(selector) or selector
     if type(selector) ~= "table" then
     if type(selector) ~= "table" then
Строка 200: Строка 196:
local renderTableById
local renderTableById


local function hasNestedCollapsible(content)
local function wrapCollapsible(title, 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
     if trim(title) == "" then
         return content or ""
         return content or ""
     end
     end


     local prefix = "{{LinkCard/Сollapsible|"
     return '{{LinkCard/Сollapsible|развернуть=1|название=' .. title .. '|содержание=<span class="grid-item-adaptive grid-adaptive" style="gap:6px; align-items:start;">' .. (content or "") .. '}}'
    if (depth or 0) > 0 and not hasNestedCollapsible(content) then
        prefix = prefix .. "развернуть=1|"
    end
 
    return prefix .. "название=" .. title .. "|содержание=" .. (content or "") .. "}}"
end
end


Строка 236: Строка 219:
end
end


local function renderChildren(children, visited, depth)
local function renderPlainEntry(entry)
    if type(entry) ~= "table" or trim(entry.id) == "" then
        return ""
    end
 
    return formatContent(entry)
end
 
local function renderChildren(children, visited)
     if type(children) ~= "table" then
     if type(children) ~= "table" then
         return ""
         return ""
Строка 245: Строка 236:
         local selector = normalizeSelector(child)
         local selector = normalizeSelector(child)
         if selector then
         if selector then
             local rendered = renderSelector(selector, visited, true, depth)
             local rendered = renderSelector(selector, visited, true)
            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
Строка 255: Строка 251:
end
end


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


local function renderNestedSelector(selector, visited, wrapped, depth)
local function renderNestedSelector(selector, visited, wrapped)
     if trim(selector.tableId) == "" then
     if trim(selector.tableId) == "" then
         return ""
         return ""
Строка 283: Строка 279:
     end
     end


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


Строка 291: Строка 287:
end
end


local function renderGroupSelector(selector, visited, depth)
local function renderGroupSelector(selector, visited)
     if type(selector.children) ~= "table" then
     if type(selector.children) ~= "table" then
         return ""
         return ""
Строка 297: Строка 293:


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


     if selector.weight ~= nil and selector.weight ~= "default" then
     if hasWeight and selector.weight ~= "default" then
         title = "Группа предметов " .. normalizePercent(selector.weight, false)
         title = "Группа предметов " .. normalizePercent(selector.weight, false)
     elseif selector.weight == nil then
     elseif not hasWeight then
         title = "Может выпасть лишь один из:"
         title = "Может выпасть лишь один из:"
     end
     end
Строка 309: Строка 306:
         if childSelector then
         if childSelector then
             if childSelector["!type"] == "AllSelector" then
             if childSelector["!type"] == "AllSelector" then
                 local rendered = renderAllSelector(childSelector, visited, (depth or 0) + 1)
                 local rendered = renderAllSelector(childSelector, visited)
                 if rendered ~= "" then
                 if rendered ~= "" then
                     result[#result + 1] = wrapCollapsible("Выпадают только вместе:", rendered, (depth or 0) + 1)
                     result[#result + 1] = wrapCollapsible("Выпадают только вместе:", rendered)
                 end
                 end
             elseif childSelector["!type"] == "GroupSelector" then
             elseif childSelector["!type"] == "GroupSelector" then
                 result[#result + 1] = renderGroupSelector(childSelector, visited, (depth or 0) + 1)
                 result[#result + 1] = renderGroupSelector(childSelector, visited)
             elseif childSelector["!type"] == "NestedSelector" then
             elseif childSelector["!type"] == "NestedSelector" then
                 result[#result + 1] = renderNestedSelector(childSelector, visited, true, (depth or 0) + 1)
                 result[#result + 1] = renderNestedSelector(childSelector, visited, true)
             elseif childSelector["!type"] == "EntSelector" then
             elseif childSelector["!type"] == "EntSelector" then
                 result[#result + 1] = formatContent(childSelector)
                 result[#result + 1] = formatContent(childSelector)
Строка 323: Строка 320:
     end
     end


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


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


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


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


Строка 387: Строка 384:
     local selector = normalizeSelector(data)
     local selector = normalizeSelector(data)
     if not selector then
     if not selector then
        local plainEntry = renderPlainEntry(data)
        if plainEntry ~= "" then
            return frame:preprocess(plainEntry)
        end
         local plainEntries = renderPlainEntries(data)
         local plainEntries = renderPlainEntries(data)
         if plainEntries ~= "" then
         if plainEntries ~= "" then
Строка 395: Строка 397:
     end
     end


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


return p
return p