核心问题:在模板中包含页面渲染输出
用户最初询问如何在 DokuWiki 模板代码中引用包含一个页面的渲染输出 HTML。答案是使用 tpl_include_page()
函数 ,该函数内部调用 p_wiki_xhtml()
来获取页面的 HTML 渲染输出。
页面隐藏机制
用户希望被包含的页面对用户隐藏但仍可被包含。DokuWiki 通过 isHiddenPage()
函数实现页面隐藏 。隐藏页面在搜索、页面列表、命名空间浏览等地方会被过滤掉,但 tpl_include_page()
函数不检查隐藏状态,只检查 ACL 权限。
设置页面隐藏的方法
页面隐藏通过配置文件中的 $conf['hidepages']
设置实现 。这是一个正则表达式,用于匹配需要隐藏的页面 ID。例如:
$conf['hidepages'] = '(hidden|private|template):.*';
p_wiki_xhtml 函数的使用场景
p_wiki_xhtml
是 DokuWiki 将 wiki 语法转换为 XHTML 的核心函数 parserutils.php:79-112 ,主要使用场景包括:
- 模板系统:在
tpl_include_page()
中使用 - 远程 API:在
getPageHTML()
方法中使用 ApiCore.php:435 - 页面导出:在导出功能中使用 Export.php:79
- RSS/Atom 订阅源:在 Feed 系统中使用 FeedPageProcessor.php:67-69
在语法插件中的使用
p_wiki_xhtml
可以在语法插件中使用。插件还可以使用 render_text()
方法 来渲染文本片段。
文本渲染 vs cdata 方式的区别
渲染文本片段
使用 p_render()
+ p_get_instructions()
会完整解析 wiki 语法并转换为 HTML。
cdata 方式
cdata()
方法只是简单地转义 HTML 实体 xhtml.php:293-296 ,不进行任何 wiki 语法解析。
解析和渲染的工作机制
加粗语法的处理发生在解析阶段,而不是在 cdata()
调用时。当解析器遇到 **粗体**
语法时,会生成指令序列:strong_open
→ cdata
(文本内容)→ strong_close
。
nestingTag 的使用
nestingTag
是处理嵌套格式化标签的辅助方法 handler.php:251-264 ,用于处理所有支持嵌套的文本格式化语法,包括:
- 粗体(strong) handler.php:411-415
- 斜体(emphasis) handler.php:423-427
- 下划线(underline) handler.php:435-439
- 等宽字体(monospace) handler.php:447-451
- 上标(superscript) handler.php:471-475
- 下标(subscript) handler.php:459-463
- 删除线(deleted) handler.php:483-487
这个方法统一了嵌套格式化标签的处理模式,避免了重复代码,确保渲染器能够正确处理嵌套的格式化效果。