Module:WikitextProcessor: Difference between revisions
// via Wikitext Extension for VSCode Tag: Reverted |
// via Wikitext Extension for VSCode |
||
| (11 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
-- | --[[ | ||
* Name: WikitextProcessor | |||
* Author: Mark W. Datysgeld | |||
* Description: Generalized content processor for wikitext formatting and frontend display, regardless of source (JSON, XML, database, user input, etc.) | |||
* Notes: Error handling; three wiki link patterns for page links, page links with custom text, and anchor links; placeholder replacement with $VARIABLE$ syntax; content normalization and whitespace cleanup; JavaScript escape hatch factory for NoticeHandler.js gadget integration to work around Scribunto/Lua environment-specific bugs | |||
]] | |||
local p = {} | local p = {} | ||
| Line 88: | Line 91: | ||
end | end | ||
local textStr = tostring(text) | local textStr = type(text) == "string" and text or tostring(text) | ||
success, textStr = pcall(mw.text.encode, textStr) | success, textStr = pcall(mw.text.encode, textStr) | ||
if not success then | if not success then | ||
| Line 178: | Line 181: | ||
return processedContent | return processedContent | ||
end | |||
--[[ | |||
The "JavaScript Escape Hatch" Factory | |||
This function creates a data-only div intended to be processed by the | |||
NoticeHandler.js gadget. It serves as a workaround for a complex, | |||
environment-specific bug in Scribunto/Lua where string values would | |||
mysteriously disappear when passed through certain table operations. | |||
How it works: | |||
1. Problem: Direct string processing and placeholder replacement in Lua | |||
was failing unpredictably. Byte-level analysis confirmed the string | |||
data was valid, but it would be lost during processing. | |||
2. Solution: Instead of processing the content in Lua, we "escape" from | |||
the Lua environment. This function packages the raw, unprocessed | |||
content and any necessary parameters (like a title) into data-* | |||
attributes on an HTML element. | |||
3. Handoff: This HTML element is then passed to the client-side, where | |||
the NoticeHandler.js gadget picks it up. | |||
4. Execution: The JavaScript, running in the user's browser, reads the | |||
data attributes, performs the string replacements and wikitext | |||
processing, and injects the final HTML into the page. | |||
Architectural Note: | |||
This function is deliberately self-contained and does NOT call any other | |||
functions within this module (like processContentForFrontend). This is | |||
critical to prevent circular dependencies, as this function may be called | |||
by modules that are themselves dependencies of this one. It is a pure | |||
utility for generating the required HTML structure. | |||
--]] | |||
function p.createNoticeForJS(options) | |||
options = options or {} | |||
local noticeData = { | |||
type = options.type or "notice", | |||
position = options.position or "top", | |||
content = options.content or "", | |||
title = options.title or "", | |||
cssClass = options.cssClass or "notice-box" | |||
} | |||
local success, result = pcall(function() | |||
return string.format( | |||
'<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.position), | |||
mw.text.encode(noticeData.content), | |||
mw.text.encode(noticeData.title), | |||
mw.text.encode(noticeData.cssClass) | |||
) | |||
end) | |||
if success then | |||
return result | |||
else | |||
-- In case of error, return a simple error message. | |||
return '<span class="error">Error creating notice.</span>' | |||
end | |||
end | end | ||
return p | return p | ||