Module:LuaTemplateBlueprint: Difference between revisions

// via Wikitext Extension for VSCode
Tag: Reverted
// via Wikitext Extension for VSCode
 
(19 intermediate revisions by the same user not shown)
Line 65: Line 65:
-- Wiki link pattern for regex matching
-- Wiki link pattern for regex matching
local WIKI_LINK_PATTERN = '%[%[.-%]%]'
local WIKI_LINK_PATTERN = '%[%[.-%]%]'
-- Semantic property HTML templates
local PROPERTY_DIV_PREFIX = '<div style="display:none;">\n  {{#set: '
local PROPERTY_DIV_SUFFIX = ' }}\n</div>'
-- Empty table for returning when needed
-- Empty table for returning when needed
local EMPTY_OBJECT = {}
local EMPTY_OBJECT = {}
Line 75: Line 72:
local ErrorHandling = require('Module:ErrorHandling')
local ErrorHandling = require('Module:ErrorHandling')
local ConfigRepository = require('Module:ConfigRepository')
local ConfigRepository = require('Module:ConfigRepository')
local ConfigHelpers = require('Module:ConfigHelpers')
local TemplateHelpers = require('Module:TemplateHelpers')
local TemplateHelpers = require('Module:TemplateHelpers')
local TemplateStructure = require('Module:TemplateStructure')
local TemplateStructure = require('Module:TemplateStructure')
Line 343: Line 341:


-- ========== Configuration Integration ==========
-- ========== Configuration Integration ==========
-- Standard configuration sections used by templates
p.configSections = {
    'meta',
    'categories',
    'patterns',
    'fields',
    'mappings',
    'constants',
    'semantics'
}
-- Initialize the standard configuration for a template
-- Initialize the standard configuration for a template
-- Combines base config from ConfigRepository with template overrides
-- Combines base config from ConfigRepository with template overrides
Line 361: Line 348:
     local templateType = template.type
     local templateType = template.type
     local configOverrides = template.config or {}
     local configOverrides = template.config or {}
   
 
     -- Get base configuration from repository
     -- Get base configuration from repository
     local baseConfig = ConfigRepository.getStandardConfig(templateType)
     local baseConfig = ConfigRepository.getStandardConfig(templateType)
   
 
     -- Apply overrides to each section
     -- Use ConfigHelpers to deep merge configurations
     local config = {}
     local config = ConfigHelpers.deepMerge(baseConfig, configOverrides)
    for _, section in ipairs(p.configSections) do
 
        config[section] = config[section] or {}
       
        -- Copy base config for this section if available
        if baseConfig[section] then
            for k, v in pairs(baseConfig[section]) do
                config[section][k] = v
            end
        end
       
        -- Apply overrides for this section if available
        if configOverrides[section] then
            for k, v in pairs(configOverrides[section]) do
                config[section][k] = v
            end
        end
    end
   
     -- Store complete config in template
     -- Store complete config in template
     template.config = config
     template.config = config
Line 398: Line 368:
         end)
         end)
     end
     end
   
 
     return config
     return config
end
end
Line 439: Line 409:
                     args,
                     args,
                     TEMPLATE_TITLE_CLASS_PREFIX .. string.lower(templateId),
                     TEMPLATE_TITLE_CLASS_PREFIX .. string.lower(templateId),
                     titleText
                     titleText,
                    template.titleId
                 )
                 )
                 end,
                 end,
Line 703: Line 674:
     template._processors = TemplateFieldProcessor.initializeProcessors(template)
     template._processors = TemplateFieldProcessor.initializeProcessors(template)
     return template._processors
     return template._processors
end
-- Get field value from args (delegated to TemplateHelpers)
-- @param field table The field definition
-- @param args table The template arguments
-- @return string|nil The field value or nil if not found
function p.getFieldValue(field, args, template)
    local _, value = TemplateHelpers.getFieldValue(args, field)
    return value
end
end


Line 1,036: Line 998:
     -- Override raw country/region with normalized names if country field exists
     -- Override raw country/region with normalized names if country field exists
     if args.country and args.country ~= '' then
     if args.country and args.country ~= '' then
        -- Debug: Check if we reach the country processing code
        if template._errorContext then
            local ErrorHandling = require('Module:ErrorHandling')
            ErrorHandling.addError(template._errorContext, "BlueprintDebug",
                string.format("About to process country='%s'", args.country),
                "", false)
        end
       
         local cr = require('Module:ConfigRepository')
         local cr = require('Module:ConfigRepository')
       
        -- Debug: Check if CountryData module loads
        if template._errorContext then
            local ErrorHandling = require('Module:ErrorHandling')
            ErrorHandling.addError(template._errorContext, "ModuleLoadDebug",
                "Attempting to load CountryData module",
                "", false)
        end
       
         local cd = require('Module:CountryData')
         local cd = require('Module:CountryData')
       
        -- Debug: Check if module loaded successfully
        if template._errorContext then
            local ErrorHandling = require('Module:ErrorHandling')
            ErrorHandling.addError(template._errorContext, "ModuleLoadedDebug",
                string.format("CountryData loaded: %s", cd and "success" or "failed"),
                "", false)
        end
       
        -- Debug: Show what we're about to call
        if template._errorContext then
            local ErrorHandling = require('Module:ErrorHandling')
            ErrorHandling.addError(template._errorContext, "BeforeCallDebug",
                string.format("About to call cd.getSemanticCountryRegionProperties('%s', errorContext)", args.country),
                "", false)
        end
       
         local norm = p.protectedExecute(
         local norm = p.protectedExecute(
             template,
             template,
             'CountryData_Override',
             'CountryData_Override',
             function()  
             function() return cd.getSemanticCountryRegionProperties(args.country) end,
                -- Debug: Inside the protected function
                if template._errorContext then
                    local ErrorHandling = require('Module:ErrorHandling')
                    ErrorHandling.addError(template._errorContext, "InsideProtectedDebug",
                        "Inside protectedExecute function, about to call CountryData",
                        "", false)
                end
               
                local result = cd.getSemanticCountryRegionProperties(args.country, template._errorContext)
               
                -- Debug: Show what CountryData returned
                if template._errorContext then
                    local ErrorHandling = require('Module:ErrorHandling')
                    local resultType = type(result)
                    local resultDesc = "nil"
                    if result then
                        if resultType == "table" then
                            local count = 0
                            for _ in pairs(result) do count = count + 1 end
                            resultDesc = string.format("table with %d keys", count)
                        else
                            resultDesc = tostring(result)
                        end
                    end
                    ErrorHandling.addError(template._errorContext, "CountryDataResultDebug",
                        string.format("CountryData returned: %s (%s)", resultDesc, resultType),
                        "", false)
                end
               
                return result
            end,
             {},
             {},
             args.country
             args.country
         )
         )
       
        -- Debug: Check what protectedExecute returned
        if template._errorContext then
            local ErrorHandling = require('Module:ErrorHandling')
            ErrorHandling.addError(template._errorContext, "ProtectedExecuteDebug",
                string.format("protectedExecute returned: %s", norm and "data" or "nil"),
                "", false)
        end
       
        -- Debug: Show what data CountryData actually returned
        if template._errorContext and norm then
            local ErrorHandling = require('Module:ErrorHandling')
            local dataDetails = {}
            for key, value in pairs(norm) do
                if type(value) == "table" then
                    table.insert(dataDetails, string.format("%s=[%s]", key, table.concat(value, ",")))
                else
                    table.insert(dataDetails, string.format("%s=%s", key, tostring(value)))
                end
            end
            ErrorHandling.addError(template._errorContext, "CountryDataReturnDebug",
                string.format("CountryData returned: %s", table.concat(dataDetails, " ")),
                "", false)
        end
       
         if norm then
         if norm then
             local countryKey = cr.semanticProperties.country
             local countryKey = cr.semanticProperties.country
             local regionKey = cr.semanticProperties.region
             local regionKey = cr.semanticProperties.region
           
            -- Debug: Show the property keys we're looking for
            if template._errorContext then
                local ErrorHandling = require('Module:ErrorHandling')
                ErrorHandling.addError(template._errorContext, "PropertyKeyDebug",
                    string.format("Looking for keys: country='%s' region='%s'", countryKey or "nil", regionKey or "nil"),
                    "", false)
            end
           
             if norm[countryKey] then
             if norm[countryKey] then
                 collector.properties[countryKey] = norm[countryKey]
                 collector.properties[countryKey] = norm[countryKey]
                -- Debug: Show successful assignment
                if template._errorContext then
                    local ErrorHandling = require('Module:ErrorHandling')
                    local valueStr = type(norm[countryKey]) == "table" and table.concat(norm[countryKey], ",") or tostring(norm[countryKey])
                    ErrorHandling.addError(template._errorContext, "CountryAssignDebug",
                        string.format("Assigned country: %s=%s", countryKey, valueStr),
                        "", false)
                end
             end
             end
             if norm[regionKey] then
             if norm[regionKey] then
                 collector.properties[regionKey] = norm[regionKey]
                 collector.properties[regionKey] = norm[regionKey]
                -- Debug: Show successful assignment
                if template._errorContext then
                    local ErrorHandling = require('Module:ErrorHandling')
                    local valueStr = type(norm[regionKey]) == "table" and table.concat(norm[regionKey], ",") or tostring(norm[regionKey])
                    ErrorHandling.addError(template._errorContext, "RegionAssignDebug",
                        string.format("Assigned region: %s=%s", regionKey, valueStr),
                        "", false)
                end
             end
             end
         end
         end
Line 1,321: Line 1,168:
function p.renderTemplate(template, frame)
function p.renderTemplate(template, frame)
     template.current_frame = frame -- Store frame on template instance
     template.current_frame = frame -- Store frame on template instance
   
    -- Generate a unique ID for the title element for ARIA
    local pageId = TemplateHelpers.getCurrentPageId() or '0'
    template.titleId = 'template-title-' .. template.type .. '-' .. pageId


     -- Check recursion depth to prevent infinite loops
     -- Check recursion depth to prevent infinite loops
Line 1,337: Line 1,188:
         template._errorContext = p.createErrorContext(template)
         template._errorContext = p.createErrorContext(template)
     end
     end
   
    ErrorHandling.addStatus(template._errorContext, "LuaTemplateBlueprint", "Now rendering " .. template.type)
      
      
     if not template.config.meta then
     if not template.config.meta then
Line 1,358: Line 1,211:
         tableClass = tableClass,
         tableClass = tableClass,
         blocks = {},
         blocks = {},
         containerTag = template.features.fullPage and "div" or "table"
         containerTag = template.features.fullPage and "div" or "table",
        ariaLabelledBy = template.titleId
     }
     }
      
      
Line 1,374: Line 1,228:
      
      
     local result = TemplateStructure.render(args, structureConfig, template._errorContext)
     local result = TemplateStructure.render(args, structureConfig, template._errorContext)
   
    -- Append status and error divs to the final output
    result = result .. ErrorHandling.formatCombinedOutput(template._errorContext)
      
      
     template.current_frame = nil -- Clear frame from template instance
     template.current_frame = nil -- Clear frame from template instance