在网站内容运营中,文章摘要如同文章的“名片”,它能在第一时间抓住读者的眼球,帮助他们快速了解文章主旨,从而决定是否深入阅读。一个精心设计的摘要不仅能提升用户体验,对搜索引擎优化(SEO)也大有裨益。然而,面对海量的文章,如何确保摘要既精准概括内容,又能灵活适应不同长度的文章,避免过长或过短,是许多运营者面临的挑战。

AnQiCMS,作为一个高效、灵活的内容管理系统,提供了强大的模板功能。借助其类Django的模板语法和丰富的内置过滤器,我们可以轻松实现根据文章的单词数量,动态调整摘要长度的需求,让摘要展现出前所未有的智能和适应性。

摘要的默认机制与动态调整的需求

在AnQiCMS的文档模型中,每篇文章通常都有一个“文档简介”(Description)字段。如果运营人员手动填写了摘要,系统会优先展示这个内容。但实际操作中,可能由于文章数量庞大、时间限制或内容更新,导致“文档简介”为空,或者长度不一。此时,AnQiCMS会默认从文章的“文档内容”(Content)中截取一部分作为摘要。

然而,这种默认截取往往是固定长度的,缺乏灵活性。一篇短小精悍的文章如果被截取得太短,可能信息不足;而一篇洋洋洒洒的长文,如果只截取固定长度,可能无法全面展现其核心要点。这时,我们便需要一种机制,能够根据文章内容的实际“分量”来动态调整摘要的长度。

核心思路:量化内容,弹性截取

实现动态摘要的核心在于:首先获取文章的完整内容,然后计算其字数或单词数,根据这些量化指标设定不同的摘要截取长度阈值。AnQiCMS强大的模板标签和过滤器为我们提供了实现这一思路的工具。

我们将主要利用以下几个关键元素:

  1. archiveDetail 标签:用于获取文章的详细信息,特别是完整的“文档内容”(Content)。
  2. wordcount 过滤器:用于计算文章内容的单词数量(主要适用于英文内容)。
  3. length 过滤器:用于计算文章内容的字符数量(适用于中文或其他非单词分隔的语言)。
  4. truncatewords_htmltruncatechars_html 过滤器:根据单词或字符数量,安全地截取包含HTML标签的内容,并自动添加省略号。
  5. {% if %}{% set %} 标签:用于在模板中进行逻辑判断和变量赋值。

实现步骤

下面,我们以一个具体的场景为例,演示如何在AnQiCMS模板中实现动态摘要:如果文章有预设的“文档简介”则优先显示;如果没有,则从“文档内容”中提取。如果文章内容单词数超过200,截取100个单词作为摘要;如果单词数在100到200之间,截取70个单词;如果少于100个单词,则截取全部内容。

步骤一:获取文章内容与预设摘要

在文章详情页(例如 archive/detail.html)或文章列表页的循环中,我们可以通过archive对象直接访问其字段。

{# 尝试获取预设的Description #}
{% set summary = archive.Description %}

如果是在文章列表页循环中,archive变量通常已包含文章的“文档简介”(Description)。但完整的“文档内容”(Content)通常不会在列表数据中预加载,因为它可能非常大。所以在需要时,我们需要使用archiveDetail标签来获取。

{# 如果要获取完整的文章内容,通常需要像这样通过archiveDetail标签获取 #}
{% archiveDetail fullContent with name="Content" id=archive.Id %}

步骤二:计算文章的单词/字符数量

假设我们已经通过archiveDetail标签将文章的完整HTML内容赋值给了fullContent变量。现在我们需要计算其单词数或字符数。

对于以空格分隔的英文内容,使用wordcount过滤器更直观:

{% set wordCount = fullContent|wordcount %}

对于中文等非空格分隔的语言,或者需要精确到字符数(包括标点符号、汉字等),使用length过滤器:

{% set charCount = fullContent|length %}

值得注意的是,wordcountlength过滤器计算的是纯文本的单词或字符数。如果fullContent中包含HTML标签,这些标签也会被计算在内。如果希望计算纯文本的单词/字符数,而不受HTML标签干扰,可以先使用striptags过滤器移除HTML标签:

{% set pureTextContent = fullContent|striptags %}
{% set pureWordCount = pureTextContent|wordcount %}
{% set pureCharCount = pureTextContent|length %}

步骤三:动态截取摘要并安全输出

在AnQiCMS中,截取字符串有truncatewords(按单词截取)和truncatechars(按字符截取)过滤器。当内容包含HTML标签时,为了避免截断后导致HTML结构损坏,我们应该使用truncatewords_htmltruncatechars_html。这些带_html后缀的过滤器会智能地处理HTML标签,确保截断后的代码仍然有效。

同时,由于截取后的内容可能仍然包含HTML,输出时需要使用safe过滤器,避免HTML被转义而无法正常显示。

{% set targetWords = 50 %} {# 默认截取单词数 #}
{% if pureWordCount > 200 %}
    {% set targetWords = 100 %}
{% elif pureWordCount > 100 %}
    {% set targetWords = 70 %}
{% endif %}

{# 动态截取摘要,保留HTML结构,并确保安全输出 #}
{% set dynamicSummary = fullContent|truncatewords_html:targetWords|safe %}

步骤四:整合所有逻辑到模板中

将上述步骤整合到模板中,我们可以构建一个既智能又灵活的摘要显示模块。以下是一个示例代码片段,可以放置在文章列表或详情页的相应位置:

”`twig {# 假设我们正在一个循环中,item代表当前文章对象 #} {# 或者在详情页中,直接使用archive对象 #} {% set article = item %} {# 在列表页可能叫item,详情页可能直接是archive #}

{% set displaySummary = article.Description %} {# 优先使用预设的文档简介 #}

{% if not displaySummary or displaySummary|length < 10 %} {# 如果预设摘要为空或太短 #}

{# 再次确认在循环中需要使用ID获取Content,在详情页可省略id参数 #}
{% archiveDetail fullContent with name="Content" id=article.Id %}

{% if fullContent %}
    {# 先移除HTML标签,获取纯文本进行字数/单词数判断 #}
    {% set pureTextContent = fullContent|striptags %}
    {% set wordCount = pureTextContent|wordcount %} {# 假设主要处理英文,用wordcount #}
    {# 如果是中文,更建议使用 charCount = pureTextContent|length #}

    {% set targetLength = 120 %} {# 默认截取字符数,适用于混合或中文内容 #}
    {% set truncationFilter = 'truncatechars_html' %} {# 默认使用字符截取,并保留HTML #}

    {# 根据单词数量或字符数量调整截取长度 #}
    {% if wordCount > 300 %}
        {% set targetLength = 2