1+1=10

记记笔记,放松一下...

Pelican的theme小记

接前面 Hello Pelican AgainPelican继续了解,当前blog系统已经改的有点面目全非。再简单了解一下 Pelican 的 theme,Pelican模板使用的Jinja2。

模板结构

  • static 部分用于存放主题的静态资源文件,包括 CSS、图片、JavaScript 等。Pelican 会将此目录中的文件复制到输出目录中,与生成的 HTML 文件一起发布。
  • templates 目录下的Jinja2模板文件用于定义每个页面的布局和内容显示方式。Pelican 会根据内容类型(文章、标签、分类等)选择相应的模板文件来生成 HTML 页面。下面列出的这些模板必须都存在。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
├── static
│   ├── css
│   └── images
└── templates
    ├── archives.html         // to display archives
    ├── article.html          // processed for each article
    ├── author.html  // processed for each author
    ├── authors.html          // must list all the authors
    ├── categories.html       // must list all the categories
    ├── category.html         // processed for each category
    ├── index.html // the index (list all the articles)
    ├── page.html  // processed for each page
    ├── period_archives.html  // to display time-period archives
    ├── tag.html// processed for each tag
    └── tags.html  // must list all the tags. Can be a tag cloud.

变量

Pelican为模板提供的一些常规变量

通用变量

变量 描述
output_file 当前正在生成的文件名。例如,当 Pelican 正在渲染首页时,output_file 的值为 "index.html"
articles 文章列表,按日期降序排列。所有元素都是 Article 对象,可访问其属性(如标题、摘要、作者等)。有时会被覆盖(例如在标签页面中)。在这种情况下,可以在 all_articles 变量中找到信息。
dates 相同的文章列表,但按日期升序排列。
hidden_articles 隐藏的文章列表。
drafts 草稿文章列表。
period_archives 一个字典,包含与时间段归档相关的元素(如果启用)。详见“Listing and Linking to Period Archives”部分的细节。
authors (作者, 文章) 元组的列表,包含所有作者及其对应的文章。
categories (分类, 文章) 元组的列表,包含所有分类及其对应的文章。
tags (标签, 文章) 元组的列表,包含所有标签及其对应的文章。
pages 页面列表。
hidden_pages 隐藏的页面列表。
draft_pages 草稿页面列表。

另外,在配置文件 pelicanconf.py 中,可以自由定义变量(注意不要和pelian内置变量冲突),这些自定义变量,在jinja2模板中也可以直接用。

每个页面有自己额外支持的变量

index.html

主页,也支持分页(pagination),主要的变量:

变量 描述
articles_paginator 文章列表的分页器对象
articles_page 当前页的文章
articles_previous_page 文章的上一页(如果页面不存在则为 None
articles_next_page 文章的下一页(如果页面不存在则为 None

分页机制:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<div class="pagination">
  {% if articles_page.has_next() %}
    <a class="prev" href="{{ SITEURL }}/{{ articles_next_page.url }}">&larr; Older</a>
  {% endif %}

  {% if articles_page.has_previous() %}
    <a class="next" href="{{ SITEURL }}/{{ articles_previous_page.url }}">Newer &rarr;</a>
  {% endif %}
  <br />
</div>

文章列表

1
2
3
4
5
    {% for article in articles_page.object_list %}
        <article>
            {% include '_includes/article.html' %}
        </article>
    {% endfor %}

article.html

单篇文章页面

变量 描述
article 当前显示的文章对应的article对象
category 当前文章所属类别 名称

变量 article 的成员主要来自头部的meta data:

1
2
3
4
5
6
7
8
---
title: Pelican的theme小记
date: 2024-12-28 22:45
slug: notes-on-pelican-s-theme
category: Tools
tags: [pelican]
status: published
---

可以自行定义新的字段,只要不和pelican预留字段冲突即可:

预留字段 描述
title 标题(Article 或 Page)
date 发布日期, (YYYY-MM-DD HH:SS)
modified 修改日期 (YYYY-MM-DD HH:SS)
tags 逗号分隔
keywords 逗号分隔 (HTML content only)
category 每个article只能指定一个类别
slug ID,当title有中文时,最好指定它(不然url中会用拼音)。
author 作者
authors 作者们
summary Brief description of content for index pages
lang 语言 (en, fr, etc.)
translation 当前article是否是另一个的翻译 (true or false)
status 状态:draft, hidden, or published
template Name of template to use to generate content (without extension)
save_as Save content to this relative file path
url URL to use for this article/page

模板中使用:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{% if index %}
  <div class="entry-content">{{ article.summary }}</div>
  {% if article.summary != article.content %}
  <footer>
    <a rel="full-article" href="{{ SITEURL }}/{{ article.url }}">Read On &crarr;</a>
  </footer>
  {% endif %}
{% else %}
  <div class="entry-content">{{ article.content }}</div>
{% endif %}

参考

  • https://docs.getpelican.com/en/4.10.2/themes.html
  • https://github.com/getpelican/pelican/tree/main/pelican/themes/simple/templates