You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在文本属性中存储并正确渲染Wiki标记及TemplateStyles标签?

解决SMW文本属性中TemplateStyles标签渲染异常问题

问题背景

我们的Wiki设有「Has text」文本属性,用于存储包含Wiki标记的字符串,示例配置如下:

| mytext = This [[contains]] {{some template|text}}

原本通过{{#show:My Page|?Has mytext}}可正常渲染格式化内容,但为模板添加<templatestyles>标签后出现两类问题:

  1. 标签被替换为UNIQ--templatestyles-00000007-QINU这类剥离标记;
  2. 开启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 00:44:53