在安企CMS(AnQiCMS)的日常内容运营中,我们通常会希望系统能自动将Markdown格式的内容渲染成美观的HTML,以便直接在网站上展示。然而,在某些特定的场景下,比如您可能需要将Markdown原文导出给其他平台,或者在页面上直接展示Markdown代码块(例如在教程或技术文章中),亦或是为API接口提供纯粹的Markdown数据时,让AnQiCMS显示Markdown原文而不是渲染后的HTML就显得尤为重要。

AnQiCMS为此提供了灵活的控制选项,让您可以在内容输出层面实现这一需求。

理解AnQiCMS的默认渲染机制

首先,我们需要了解AnQiCMS处理Markdown内容的基本逻辑。当您在后台的“全局设置”中,进入“内容设置”并启用了Markdown编辑器后,系统在默认情况下会将通过该编辑器编辑的Markdown内容,在前端页面输出时自动解析并渲染成HTML。这对于大多数内容展示场景来说是方便且高效的。

但是,如果您希望在某个具体的展示位置或特定内容上覆盖这一默认行为,AnQiCMS允许您通过模板标签的参数进行精细化控制。

在模板中控制Markdown的渲染行为

要实现显示Markdown原文而不是渲染为HTML,核心在于修改您的网站模板文件。AnQiCMS在处理“文档详情”、“分类详情”和“单页详情”等核心内容类型的Content(内容)字段时,都提供了一个render参数来控制是否进行Markdown到HTML的转换。

具体来说,当您在模板中调用内容的Content字段时,可以通过将render参数设置为false来指示系统不执行Markdown渲染。

让我们以最常见的文档内容为例来详细说明:

  1. 定位到需要修改的模板文件: AnQiCMS的模板文件通常存放在您系统根目录下的/template文件夹中。例如,文档详情页可能位于{模型table}/detail.html,分类列表页可能位于{模型table}/list.html,而单页面详情页则可能在page/detail.html等。您可以通过AnQiCMS后台的“模板设计”功能,在线编辑或下载模板文件进行修改。

  2. 修改内容调用标签: 在模板中,您会找到类似{% archiveDetail archiveContent with name="Content" %}{{archiveContent|safe}}这样的内容调用标签。这里的archiveContent是您为内容字段指定的变量名,{{archiveContent|safe}}则负责将获取到的内容安全地输出到页面。

    要让系统显示Markdown原文,您只需要在archiveDetail(或categoryDetailpageDetail)标签中,为name="Content"的调用添加render=false这个参数。修改后的代码看起来会像这样:

    {# 显示Markdown原文,不进行渲染 #}
    {% archiveDetail archiveContent with name="Content" render=false %}{{archiveContent}}
    

    或者,如果您是直接通过archive.Content这样的变量来获取内容(在文档详情页中通常可以直接访问当前文档的属性),同样可以在Content字段后添加render=false参数:

    {# 同样显示Markdown原文,适用于直接访问文档对象的Content属性 #}
    {{archive.Content|render:false}}
    

    值得注意的是,当您设置render=false时,如果您的内容字段中包含了Markdown语法,系统将直接输出这些Markdown文本。此时,如果您的Markdown文本中本身夹杂了HTML标签(例如<div><p>等),而您希望这些HTML标签能够被浏览器正常解析而不是作为纯文本显示,那么仍然需要在输出变量后加上|safe过滤器,即{{archiveContent|safe}}。但对于纯粹的Markdown原文而言,|safe主要防止其中的<>等字符被转义。

应用场景示例

假设您正在构建一个技术博客,需要在文章中展示Markdown代码片段,而不是让它们被渲染成HTML。您可以在文档内容的文本框中直接粘贴Markdown代码(例如使用三个反引号包裹代码块)。然后在对应的文章详情模板article/detail.html中,将调用文章内容的标签修改为:

<div class="article-body">
    {% archiveDetail articleContent with name="Content" render=false %}{{articleContent|safe}}
</div>

这样,文章中的Markdown代码块就会以原始的Markdown语法显示在页面上,而不会被渲染成代码高亮或其他HTML结构。如果您希望在前端自行实现Markdown渲染(例如使用JavaScript库),那么获取到Markdown原文后,便可灵活处理。

通过这种模板层面的控制,您可以非常灵活地决定网站内容的展示方式,无论是自动渲染还是显示原文,都尽在掌握。

常见问题解答 (FAQ)

1. 如果我想让同一篇文档的一部分内容显示为渲染后的HTML,另一部分显示为Markdown原文,可以实现吗?

这需要更复杂的处理。render=false参数是作用于整个Content字段的。AnQiCMS本身没有内置功能可以将一个Content字段拆分成部分渲染、部分原文输出。如果您有这种需求,通常的解决方案是:

  • 拆分内容字段: 在内容模型中创建两个或更多内容字段,例如RenderedContentRawMarkdownContent。在后台发布内容时,将需要渲染的部分放入RenderedContent,需要原文的部分放入RawMarkdownContent。然后在模板中分别调用它们,RawMarkdownContent字段调用时使用render=false
  • 前端JS渲染: 始终获取Markdown原文(使用render=false),然后利用前端JavaScript库(如marked.jsshowdown.js)在浏览器端对需要渲染的部分进行处理。

2. 禁用后台“全局设置 -> 内容设置”中的Markdown编辑器与在模板中使用render=false有什么区别?

禁用后台Markdown编辑器是一个全局设置,它意味着在后台编辑内容时,Content字段将作为一个纯文本区域,不再提供Markdown编辑器的功能,并且系统在前端将不再尝试将Content字段的内容解析为HTML。这会影响所有使用该内容模型的页面。

render=false是一个模板层面的局部控制。即使后台的Markdown编辑器是启用的,并且内容是按照Markdown语法编写的,render=false也会强制在当前模板输出时显示Markdown原文。这种方式更加灵活,允许您在大多数页面保持Markdown渲染,但在特定场景(例如教程页面、API接口)获取原文。

3. 如果我的内容字段中存储的不是Markdown,而是纯HTML代码,使用render=false会有什么影响?

如果您的内容字段中存储的是纯HTML代码(而非Markdown),使用render=false参数不会有任何负面影响。因为它只会告诉AnQiCMS“不要尝试解析Markdown”,而HTML本身就不是Markdown。因此,系统会直接输出您存储的纯HTML代码。在这种情况下,确保使用{{yourVariable|safe}}