跳转到主要内容

Lektor插件,用于添加标签。

项目描述

Lektor标签插件

PyPI version Code style: black

介绍

此插件实现了对您站点的标签功能。对于您的每个标签,它都会构建一个显示带有该标签的条目列表的页面。这可以用于基于标签的标准博客导航。使用此插件,您可以给任何博客文章分配任意数量的标签,并为每个标签创建一个页面。

例如,如果您的网站在content/blog目录中有标记为coffeetea的博客文章

name: First Post
---
tags:

coffee
tea

lektor-tags插件会构建以下URL的页面

  • /blog/tag/coffee/
  • /blog/tag/tea/

每个页面可以列出带有该标签的所有帖子。

安装

从命令行将lektor-tags添加到您的项目

lektor plugins add lektor-tags

有关安装插件的更多说明,请参阅Lektor文档

概述

假设您有一个“博客文章”模型如下

[model]
name = Blog Post

[fields.tags]
type = strings

创建一个blog-post.html模板,其中包含

{% if this.tags %}
  <ul>
    {% for t in this.tags -%}
      <li>
        <a href="{{ ('/blog@tag/' ~ t)|url }}">
          All posts tagged {{ t }}
        </a>
      </li>
    {% endfor %}
  </ul>
{% endif %}

此表达式在模板中为每个博客文章的标签生成一个源路径

'/blog@tag/' ~ t

然后如果标签是“my-tag”,表达式将渲染一个源路径,如下所示

/blog/tag/my-tag

Lektor源路径通过url过滤器变成实际的URL。因此,模板为标签页面生成URL,如下所示

<a href="{{ ('/blog@tag/' ~ t)|url }}"></a>

这使用了之前的使用表达式,但通过url过滤以生成从博客文章到标签页的实际链接。

配置

configs/tags.ini中设置以下选项

父级

必需。标签页面父页面的源路径。例如

parent = /blog

然后标签页面的源路径如下

/blog/tag/my-tag

您可以指定根作为父级

parent = /

条目

一个查询,用于页面上一个标签的所有条目。您可以使用sitetag变量。模板的this变量有一个parent属性。默认查询是

items = this.parent.children.filter(F.tags.contains(tag))

您可以使用任何表达式进行排序和筛选

items = this.parent.children.filter(F.tags.contains(tag) and F.status == 'published').order_by('-pub_date')

如果父页面有一个分页查询,您可能希望将其用于标签页面

items = this.parent.pagination.items.filter(F.tags.contains(tag))

有关查询的更多信息,请参阅Lektor文档

tags_field

包含标签的字段的名称。默认为tags。该字段应为strings类型。有关strings类型的更多信息,请参阅Lektor文档

例如,如果您的模型如下

[fields.labels]
type = strings

然后将其添加到tags.ini

tags_field = labels

模板

列出具有特定标签的所有帖子的页面的模板。模板的this变量具有tagitems属性。一个示例模板

<h1>Tag: {{ this.tag }}</h1>
<h1>Items:</h1>
<ul>
  {% for i in this.items %}
    <li><a href="{{ i|url }}">{{ i._id }}</a></li>
  {% else %}
    <li><em>No items.</em></li>
  {% endfor %}
</ul>

将此文件保存到项目的templates/tags.html中。如果您将文件命名为其他名称,如label.html,请将此行添加到tags.ini

template = label.html

如果您没有指定模板,插件会提供一个默认模板。

url_path

每个标签页位置的表达式。您可以使用sitetag变量。this变量是一个具有parentitems属性的分页页面。默认表达式是

url_path = {{ this.parent.url_path }}tag/{{ tag }}

此表达式生成如/blog/tag/coffee之类的URL。

ignore_missing

默认为false。要设置为true,请将此行添加到tags.ini

ignore_missing = true

这允许将缺失的标签页面的URL静默替换为""。示例用例是,如果您的blog-post.html模板包含如下语句

{% for t in this.tags -%}
  <a href="{{ ('/blog@tag/' ~ t)|url }}">{{ t }}</a>
{% endfor %}

如果博客文章草稿不可发现,并且它使用了任何未发布的博客文章中未使用的标签,那么这些标签页面尚不存在。开启ignore_missing以允许构建此类草稿。标签页面URL路径将是空字符串"",直到草稿发布并创建标签页面。

tags

高级配置。一组标签的表达式。请注意,此表达式在模板中也很有用,可以获取所有标签的列表。默认表达式为:

tags = parent.children.distinct("tags")

如果您将 tags_field 设置为与 "tags" 不同的字段名,则默认表达式使用您的自定义字段名。例如,如果您在 tags.ini 中有此行

tags_field = labels

tags 的默认值是:

tags = parent.children.distinct("labels")

您可以使用任何模板表达式。例如,如果您的条目有一个 "已发布" 的布尔字段,您可以选择已发布条目的标签

tags = parent.children.filter(F.published).distinct("tags")

甚至可以手动列出您的标签

tags = ["tag1", "tag2"]

有关查询的更多信息,请参阅Lektor文档

标签始终去重。标签按 contents.lr / admin 中列出的顺序排序,允许您手动控制它们的顺序。由于 {{ tags }} 简单地返回一个列表,因此您始终可以对列表应用任何 Jinja2 过滤器,例如排序、切片或 rejectattr。

标签云 & 标签权重

此插件不会自动构建标签云,但它提供了构建它的工具。

Jinja2 上下文有一个 tagweights() 函数,该函数返回一个字典,将标签映射到它们的权重,使用多个属性或函数。以下是这些属性和函数,以及如何在模板中使用它们的示例。

未使用的标签将被忽略。

TL;DR 我应该使用哪个权重函数?

  • 要获取每个标签标记的页数,请使用 count
  • 要将标签映射到数字,请使用 log(lower, upper)
  • 要将标签映射到其他所有内容,请使用 loggroup(list)

count — 带有此标签的页数

这是基本权重,用作以下标签的基础。

示例:按标签计数排序标签(最常用先)

<ul>
{% for tag, weight in (tagweights() | dictsort(by='value', reverse=true)) %}
    <li>{{ tag }} ({{ weight.count }} articles).</li>
{% endfor %}
</ul>

linear — 标签映射到 lowerupper 之间的数字。

使用率最低的标签映射到 lower,使用率最高的标签映射到 upperlowerupper 可以相等,upper 可以小于 lower)。

映射使用线性函数完成。

结果是浮点数:您可能首先将它们转换为整数(请参阅 log 的示例)。

除非您知道自己在做什么,否则应使用 log

log — 标签计数的对数映射到 lowerupper 之间的数字。

使用率最低的标签映射到 lower,使用率最高的标签映射到 upperlowerupper 可以相等,upper 可以小于 lower)。

映射使用对数计数的线性函数完成。

结果是浮点数:您可能首先将它们转换为整数(请参阅示例)。

示例:最常用的标签是最不常用标签的两倍大小

{% for tag, weight in tagweights()|dictsort %}
<a
    href="{{ ('/blog@tag/' ~ tag)|url }}"
    style="font-size: {{ weight.log(100, 200)|round|int }}%;"
    >
        {{ tag }}
    </a>
{% endfor %}

lineargroup — 将每个标签映射到在参数中给出的列表中的项目。

使用率最低的标签映射到第一个项目,使用率最高的标签映射到最后一个项目。

映射使用线性函数完成。

除非您知道自己在做什么,否则应使用 loggroup

loggroup — 标签计数的对数映射到在参数中给出的列表中的项目。

使用率最低的标签映射到第一个项目,使用率最高的标签映射到最后一个项目。

映射使用对数计数的线性函数完成。

示例:标签被赋予 CSS 类 tagcloud-tinytagcloud-small 等。

{% for tag, weight in tagweights()|dictsort %}
<a
    href="{{ ('/blog@tag/' ~ tag)|url }}"
    class="tagcloud-{{ weight.loggroup(["tiny", "small", "normal", "big", "large"]) }}"
    >
        {{ tag }}
    </a>
{% endfor %}

项目详情


下载文件

下载适合您平台文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

lektor-tags-0.5.2.tar.gz (13.0 kB 查看哈希)

上传于 源代码

构建分发

lektor_tags-0.5.2-py3-none-any.whl (9.3 kB 查看哈希值)

上传于 Python 3