Module:T-Campaign: Difference between revisions
// via Wikitext Extension for VSCode |
// via Wikitext Extension for VSCode |
||
| Line 157: | Line 157: | ||
return tonumber(frameArgs._recursion_depth or parentArgs._recursion_depth) or 0 | return tonumber(frameArgs._recursion_depth or parentArgs._recursion_depth) or 0 | ||
end | |||
-- Base64 encoding function | |||
local b64 = {} | |||
local b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' | |||
function b64.encode(data) | |||
return ((data:gsub('.', function(x) | |||
local r,b='',x:byte() | |||
for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end | |||
return r; | |||
end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x) | |||
if (#x < 6) then return '' end | |||
local c=0 | |||
for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end | |||
return b:sub(c+1,c+1) | |||
end)..({ '', '==', '=' })[#data%3+1]) | |||
end | end | ||
| Line 172: | Line 189: | ||
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 202: | ||
end | end | ||
-- | -- The "JavaScript Escape Hatch" | ||
local | local encodedContent = b64.encode(bannerContent) | ||
local encodedTitle = b64.encode(titleText) | |||
local noticeData = { | local noticeData = { | ||
type = "campaign", | type = "campaign-js", -- New type for JS handling | ||
position = "top", | position = "top", | ||
content = | content = encodedContent, | ||
title = encodedTitle, | |||
cssClass = cssClass | cssClass = cssClass | ||
} | } | ||
| Line 198: | Line 216: | ||
local success, result = pcall(function() | local success, result = pcall(function() | ||
return string.format( | return string.format( | ||
'<div style="display:none" class="notice-data" data-notice-type="%s" data-notice-position="%s" data- | '<div style="display:none" class="notice-data" data-notice-type="%s" data-notice-position="%s" data-banner-template="%s" data-banner-title="%s" data-notice-css="%s"></div>', | ||
mw.text.encode(noticeData.type), | mw.text.encode(noticeData.type), | ||
mw.text.encode(noticeData.position), | mw.text.encode(noticeData.position), | ||
mw.text.encode(noticeData.content), | mw.text.encode(noticeData.content), | ||
mw.text.encode(noticeData.title), | |||
mw.text.encode(noticeData.cssClass) | mw.text.encode(noticeData.cssClass) | ||
) | ) | ||