Module:T-Campaign: Difference between revisions

// via Wikitext Extension for VSCode
Tag: Reverted
// via Wikitext Extension for VSCode
 
(15 intermediate revisions by the same user not shown)
Line 1: Line 1:
-- T-Campaign.lua
-- Module:T-Campaign.lua
-- Generic campaign template that dynamically loads campaign data from JSON files
-- Generic campaign template that dynamically loads campaign data from JSON files
-- Usage: {{#invoke:T-Campaign|render|campaign_name=ASP2025}}
-- Usage: {{#invoke:T-Campaign|render|campaign_name=NAME}}


local p = {}
local p = {}
Line 172: Line 172:
         local banner = args._campaign_data.banner
         local banner = args._campaign_data.banner
         local bannerContent = banner.content or ""
         local bannerContent = banner.content or ""
        local titleText = template.config.constants.title or "Campaign"
       
         -- Combine generic notice-box class with specific campaign class
         -- Combine generic notice-box class with specific campaign class
         local cssClass = "notice-box"
         local cssClass = "notice-box"
Line 183: Line 185:
         end
         end
          
          
         -- INLINE PLACEHOLDER REPLACEMENT (copied from working T-Campaign-Git.lua)
         -- Use the centralized NoticeFactory to create the notice
        local placeholderValues = {
         local noticeOptions = {
            CAMPAIGN_NAME = args._campaign_data.defaults.title or "Campaign"
             type = "campaign-js",
        }
       
        -- Apply TemplateStarter's proven placeholder replacement strategy (exact copy from working version)
        local function replacePlaceholders(text, values)
            if not text or not values then
                return text
            end
           
            local result = text
            for key, value in pairs(values) do
                if value and value ~= "" then
                    result = result:gsub("%$" .. key .. "%$", value)
                end
            end
            return result
        end
       
        -- Apply placeholder replacement inline (no module boundary crossing)
        bannerContent = replacePlaceholders(bannerContent, placeholderValues)
       
        -- Clean up any remaining unfilled placeholders (TemplateStarter's removeEmptyPlaceholders logic)
        bannerContent = bannerContent:gsub("%$[A-Z_]+%$", "")
        bannerContent = bannerContent:gsub("%s+", " "):gsub("^%s+", ""):gsub("%s+$", "")
       
        -- Now only send to WikitextProcessor for wiki link processing (no placeholder data needed)
        bannerContent = WikitextProcessor.processWikiLinksToHTML(bannerContent, context)
       
         local noticeData = {
             type = "campaign",
             position = "top",
             position = "top",
             content = bannerContent,
             content = bannerContent,
            title = titleText,
             cssClass = cssClass
             cssClass = cssClass
         }
         }
          
          
         local success, result = pcall(function()
         return WikitextProcessor.createNoticeForJS(noticeOptions) .. ErrorHandling.formatCombinedOutput(context)
            return string.format(
                '<div style="display:none" class="notice-data" data-notice-type="%s" data-notice-position="%s" data-notice-content="%s" data-notice-css="%s"></div>',
                mw.text.encode(noticeData.type),
                mw.text.encode(noticeData.position),
                mw.text.encode(noticeData.content),
                mw.text.encode(noticeData.cssClass)
            )
        end)
       
        if success then
            return result .. ErrorHandling.formatCombinedOutput(context)
        else
            ErrorHandling.addError(context, 'campaignBanner', 'Data attribute creation failed', tostring(result), false)
            return ErrorHandling.formatCombinedOutput(context)
        end
     end
     end
}
}
Line 410: Line 369:
     -- Always show campaign content fields (they'll show placeholder text when empty)
     -- Always show campaign content fields (they'll show placeholder text when empty)
     for _, fieldDef in ipairs(campaignData.field_definitions) do
     for _, fieldDef in ipairs(campaignData.field_definitions) do
         table.insert(fields, {
         -- CRITICAL: Skip 'title' as it is not a content field
            key = fieldDef.key,
        if fieldDef.key ~= "title" then
            label = fieldDef.label,
            table.insert(fields, {
            type = fieldDef.type
                key = fieldDef.key,
        })
                label = fieldDef.label,
                type = fieldDef.type
            })
        end
     end
     end
      
      
Line 434: Line 396:
     end
     end
      
      
     -- Add campaign-specific category
     -- Add campaign-specific category, defaulting to template_id
     template.config.categories.base = {campaignName}
    local category_value = campaignData.category or campaignData.template_id
     template.config.categories.base = {category_value}
      
      
     return args
     return args