如何在文本属性中存储并正确渲染Wiki标记及TemplateStyles标签?
解决SMW文本属性中TemplateStyles标签渲染异常问题
问题背景
我们的Wiki设有「Has text」文本属性,用于存储包含Wiki标记的字符串,示例配置如下:
| mytext = This [[contains]] {{some template|text}}
原本通过{{#show:My Page|?Has mytext}}可正常渲染格式化内容,但为模板添加<templatestyles>标签后出现两类问题:
- 标签被替换为
UNIQ--templatestyles-00000007-QINU这类剥离标记; - 开启
SMW_PARSER_UNSTRIP配置后,剥离标记消失,但含<templatestyles>的模板内容会以纯文本形式显示(如<nowiki>This contains <style data-mw-deduplicate="TemplateStyles...</nowiki>)。
可行解决方案
1. 替换属性类型为页面属性
将「Has text」从文本属性改为页面属性,指向存储目标内容的子页面:
- 新建子页面(如
My Page/My Text),直接写入带<templatestyles>的Wiki内容; - 调用时用格式模板渲染:
{{#show:My Page|?Has text|format=template|template=RenderContent}},自定义模板RenderContent仅需写入{{{1}}},让SMW完整解析页面内容。
2. 嵌套解析器函数强制二次解析
借助ParserFunctions扩展的{{#parse:}}函数,对#show的输出做二次解析:
{{#parse: {{#show:My Page|?Has mytext}} }}
⚠️ 注意:若属性内容由普通用户编辑,需严格管控权限,避免恶意代码执行风险。
3. 调整钩子优先级确保TemplateStyles先处理
在LocalSettings.php中修改钩子优先级,让TemplateStyles标签先完成解析:
$wgHooks['ParserFirstCallInit'][] = function( $parser ) { $parser->setHook( 'templatestyles', 'TemplateStylesHooks::renderTag', 10 ); return true; };
此方法需熟悉MediaWiki钩子机制,测试确认与SMW解析流程兼容后再部署。
4. 自定义SMW格式器处理解析
创建自定义SMW结果格式器,直接调用MediaWiki解析器处理属性值:
$wgSMWResultFormats['rendered_text'] = [ 'class' => 'SMW\ResultFormat\RenderedTextFormat', 'label' => 'Rendered Text' ];
对应创建RenderedTextFormat类,在getResultText方法中调用$parser->parse()处理属性内容,确保TemplateStyles标签被完整解析。
内容的提问来源于stack exchange,提问作者MothOnMars
相关产品推荐
相关产品推荐

