Модуль:Сущность: различия между версиями

мНет описания правки
Нет описания правки
Строка 275: Строка 275:
     local componentDefs = load_module_data("component.json")
     local componentDefs = load_module_data("component.json")
     local prototypeStoreDefs = load_module_data("prototype_store.json")
     local prototypeStoreDefs = load_module_data("prototype_store.json")
     local componentStoreDefs = load_module_data("component_store.json") or {}
     local componentStoreDefs = load_module_data("component_store.json")
     if not componentDefs then return "" end
     if not componentDefs or not prototypeStoreDefs or not componentStoreDefs then return "" end
 
    local foundComponents = {}
    local foundComponentStores = {}
    local foundPrototypeStores = {}


    local foundComponents, foundPrototypes = {}, {}
     local compList = componentDefs[id]
     local compList = componentDefs[id]
     if type(compList) == "table" then
     if type(compList) == "table" then
Строка 291: Строка 288:
     end
     end


     local compStoreEntry = componentStoreDefs[id]
     local protoEntry = prototypeStoreDefs[id]
     if type(compStoreEntry) == "table" then
     if type(protoEntry) == "table" then
         for compName, entityList in pairs(compStoreEntry) do
         for protoName, _ in pairs(protoEntry) do
             if type(compName) == "string" and type(entityList) == "table" and #entityList > 0 then
             if type(protoName) == "string" then
                 foundComponentStores[compName] = entityList
                 foundPrototypes[protoName] = true
             end
             end
         end
         end
     end
     end


     if type(prototypeStoreDefs) == "table" then
     -- support component_store.json: when the searched id is present as a key there,
        local protoEntry = prototypeStoreDefs[id]
    -- create component/*/store templates (and prototype/*/store for prototype_store.json)
        if type(protoEntry) == "table" then
    local compStoreEntry = componentStoreDefs[id]
            for protoName, entityList in pairs(protoEntry) do
    if type(compStoreEntry) == "table" then
                if type(protoName) == "string" and type(entityList) == "table" and #entityList > 0 then
        for compName, members in pairs(compStoreEntry) do
                    foundPrototypeStores[protoName] = entityList
            -- mark the component as found so we also process its regular template if exists
                end
            foundComponents[compName] = true
            end
         end
         end
     end
     end


    -- if the id references other names (comma separated), include their defs too
     for name in string.gmatch(id, "[^,]+") do
     for name in string.gmatch(id, "[^,]+") do
         local n = trim(name)
         local n = trim(name)
Строка 316: Строка 313:
             if componentDefs[n] ~= nil then
             if componentDefs[n] ~= nil then
                 foundComponents[n] = true
                 foundComponents[n] = true
             end
             elseif prototypeStoreDefs[n] ~= nil then
            if componentStoreDefs[n] and type(componentStoreDefs[n]) == "table" then
                 foundPrototypes[n] = true
                for compName, entityList in pairs(componentStoreDefs[n]) do
                    if type(compName) == "string" and type(entityList) == "table" and #entityList > 0 then
                        foundComponentStores[compName] = entityList
                    end
                end
            end
            if prototypeStoreDefs and prototypeStoreDefs[n] and type(prototypeStoreDefs[n]) == "table" then
                 for protoName, entityList in pairs(prototypeStoreDefs[n]) do
                    if type(protoName) == "string" and type(entityList) == "table" and #entityList > 0 then
                        foundPrototypeStores[protoName] = entityList
                    end
                end
             end
             end
         end
         end
Строка 337: Строка 322:
         for item in string.gmatch(ignoreComponents, "[^,]+") do
         for item in string.gmatch(ignoreComponents, "[^,]+") do
             local name = trim(item)
             local name = trim(item)
             if name ~= "" then
             if name ~= "" then foundComponents[name] = nil end
                foundComponents[name] = nil
                foundComponentStores[name] = nil
            end
         end
         end
     end
     end
Строка 346: Строка 328:
         for item in string.gmatch(ignorePrototypes, "[^,]+") do
         for item in string.gmatch(ignorePrototypes, "[^,]+") do
             local name = trim(item)
             local name = trim(item)
             if name ~= "" then foundPrototypeStores[name] = nil end
             if name ~= "" then foundPrototypes[name] = nil end
         end
         end
     end
     end
Строка 357: Строка 339:
     local ok, dp = pcall(require, "Module:GetField")
     local ok, dp = pcall(require, "Module:GetField")
     local errors = {}
     local errors = {}
    local function processEntity(kind, name, isStore)
        local pathName = lcfirst(name)
        local tplPath = kind .. "/" .. pathName
        if isStore then
            tplPath = tplPath .. "/store"
        end


    local function processEntity(kind, name, isStore, storeEntities)
        local pathName = lcfirst(name)
        local tplPath = kind .. "/" .. pathName .. (isStore and "/store" or "")
         local content = load_template_content(tplPath)
         local content = load_template_content(tplPath)
         if not content then
         if not content then
             if hasWhitelist then return end
             if hasWhitelist then
             local typeStr = (kind and (kind:sub(1, 1):upper() .. kind:sub(2)) or "") .. (isStore and "Store" or "")
                return
             table.insert(errors, "{{сущность/infobox|тип=" .. typeStr .. "|название=" .. name .. "|ссылка=Template:" .. tplPath .. "}}")
            end
             local classType = (kind and (kind:sub(1, 1):upper() .. kind:sub(2)) or "")
            if isStore then classType = classType .. "Store" end
            local className = name .. classType
            local tplLabel = "Template:" .. tplPath
             table.insert(errors,
                "{{сущность/infobox|тип=" .. classType .. "|название=" .. className .. "|ссылка=" .. tplLabel .. "}}")
             return
             return
         end
         end
         local parsed = getTemplateMeta(frame, tplPath)
         local parsed = getTemplateMeta(frame, tplPath)
        local dataPage = (kind .. "/" .. pathName) .. ".json"
        local entityIds = isStore and storeEntities or { id }
         for _, sw in ipairs(switches) do
         for _, sw in ipairs(switches) do
            if isStore and sw ~= "card" then break end
             local keys = parsed[sw] or {}
             local keys = parsed[sw] or {}
             for _, key in ipairs(keys) do
             for _, key in ipairs(keys) do
Строка 387: Строка 375:
                         table.insert(switchKeyOrder[sw], key)
                         table.insert(switchKeyOrder[sw], key)
                     end
                     end
                     for _, entityId in ipairs(entityIds) do
                     local extra = ""
                        local extra = ""
                    if ok and dp and dp.flattenField then
                        if ok and dp and dp.flattenField then
                        local dataPage = tplPath .. ".json"
                            extra = dp.flattenField({ args = { entityId, dataPage } }) or ""
                        extra = dp.flattenField({ args = { id, dataPage } })
                        end
                    end
                        local tplStr
                    local tplStr
                        local tplLabelStr, tplContentStr
                    local tplLabelStr, tplContentStr
                        if sw == "card" then
                    if sw == "card" then
                            tplLabelStr = makeTplCall(tplPath, "cardLabel", key, entityId, extra)
                        tplLabelStr = makeTplCall(tplPath, "cardLabel", key, id, extra)
                            tplContentStr = makeTplCall(tplPath, "cardContent", key, entityId, extra)
                        tplContentStr = makeTplCall(tplPath, "cardContent", key, id, extra)
                    else
                        tplStr = makeTplCall(tplPath, sw, key, id, extra)
                    end
                    local priority = 1
                    if parsed and parsed.priority ~= nil then
                        if type(parsed.priority) == "number" then
                            priority = parsed.priority
                         else
                         else
                             tplStr = makeTplCall(tplPath, sw, key, entityId, extra)
                             local pnum = tonumber(parsed.priority)
                            if pnum then priority = pnum end
                         end
                         end
                        local priority = 1
                        if parsed and parsed.priority ~= nil then
                            if type(parsed.priority) == "number" then
                                priority = parsed.priority
                            else
                                local pnum = tonumber(parsed.priority)
                                if pnum then priority = pnum end
                            end
                        end
                        local entry
                        if sw == "card" then
                            entry = {
                                tplLabel = tplLabelStr,
                                tplContent = tplContentStr,
                                cardTag = parsed.cardTag,
                                source = { kind = kind, name = name, pathName = pathName, tplPath = tplPath },
                                priority = priority,
                                idx = #switchKeyToTemplates[sw][key] + 1
                            }
                        else
                            entry = {
                                tpl = tplStr,
                                source = { kind = kind, name = name, pathName = pathName, tplPath = tplPath },
                                priority = priority,
                                idx = #switchKeyToTemplates[sw][key] + 1
                            }
                        end
                        table.insert(switchKeyToTemplates[sw][key], entry)
                     end
                     end
                    local entry
                    if sw == "card" then
                        entry = {
                            tplLabel = tplLabelStr,
                            tplContent = tplContentStr,
                            cardTag = parsed.cardTag,
                            source = { kind = kind, name = name, pathName = pathName, tplPath = tplPath },
                            priority = priority,
                            idx = #switchKeyToTemplates[sw][key] + 1
                        }
                    else
                        entry = {
                            tpl = tplStr,
                            source = { kind = kind, name = name, pathName = pathName, tplPath = tplPath },
                            priority = priority,
                            idx = #switchKeyToTemplates[sw][key] + 1
                        }
                    end
                    table.insert(switchKeyToTemplates[sw][key], entry)
                 end
                 end
             end
             end
         end
         end
     end
     end
    for compName, _ in pairs(foundComponents) do processEntity("component", compName, false) end
    for protoName, _ in pairs(foundPrototypes) do processEntity("prototype", protoName, false) end


     for compName, _ in pairs(foundComponents) do
     if type(componentStoreDefs) == "table" then
        processEntity("component", compName, false)
        local compStore = componentStoreDefs[id]
        if type(compStore) == "table" then
            for compName in pairs(compStore) do
                processEntity("component", compName, true)
            end
        end
     end
     end
     for compName, entityList in pairs(foundComponentStores) do
 
         processEntity("component", compName, true, entityList)
     if type(prototypeStoreDefs) == "table" then
    end
        local protoStore = prototypeStoreDefs[id]
    for protoName, entityList in pairs(foundPrototypeStores) do
         if type(protoStore) == "table" then
        processEntity("prototype", protoName, true, entityList)
            for protoName in pairs(protoStore) do
                processEntity("prototype", protoName, true)
            end
        end
     end
     end


     local out = {}
     local out = {}
     for _, e in ipairs(errors) do table.insert(out, e) end
     for _, e in ipairs(errors) do table.insert(out, e) end
    for _, s in ipairs(storeCalls) do table.insert(out, s) end
     local blocks = renderBlocks(frame, switches, switchConfigs, switchKeyOrder, switchKeyToTemplates, switchKeySources,
     local blocks = renderBlocks(frame, switches, switchConfigs, switchKeyOrder, switchKeyToTemplates, switchKeySources,
         hasWhitelist, id)
         hasWhitelist, id)