Pelican 模板开发中的一些记录

Page content

  Pelican 模板开发中,感觉文档有点稀疏,做了一些记录: Pelican文档地址:https://docs.getpelican.com/en/latest/themes.html

1、静态文件路径

文档中规定,主题的文件结构为:

├── 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.

  如果在pelicanconf.py中,通过:THEME ='a_themes'的方式制定主题,那么可以看到实际主题的static文件夹下的文件在content文件夹下的theme文件夹里面,所以如果模板中需要引入static->css->a.css文件,真实引入路径为:theme->css->a.css,这个其实是由pelicanconf.py中的THEME_STATIC_DIR = 'theme'决定的,theme是默认值。   可以在pelicanconf.py中设置CSS_FILE = 'main.css',这点在在pelican官方提供的notmyidea主题中可以看到,引入方式是这样的:<link rel="stylesheet" href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/css/{{ CSS_FILE }}" />,默认导入main.css,在main.css中再导入其他css:

/* Imports */
@import url("reset.css");
@import url("pygment.css");
@import url("typogrify.css");
@import url("fonts.css");

2、如何加入最近的文章列表功能

  上代码:

{% set recent_articles = articles if not all_articles else all_articles %}

{% for post in recent_articles %}
{% if loop.index <= 6 %} <article class="recent">
  <header class="post-header">
    <h5 class="post-title"><a class="post-title-link" target="_blank" href="{{ SITEURL }}/{{ post.url }}">{{ post.title }}</a></h5>
    <time class="post-date" datetime="{{ post.date }}">{{ post.date }}</time>
  </header>
  </article>

  {% endif %}
  {% endfor %}

3、循环文章列表

{% for article in articles_page.object_list %}
........
{% endfor %}

4、计算每个tag下的文章数量

<div class="tag-feed">
  {% for tag, articles in tags|sort %}
  <div class="tag">
    <a class="tag-link" href="{{ SITEURL }}/{{ tag.url }}">
      <span class="tag-name">{{ tag }}</span>
      <span class="tag-count">{{ articles|count }}</span>
    </a>
  </div>
  {% endfor %}
</div>

也可以使用插件pelican-tag-cloud实现,并且自定义功能更多:

pelican-tag-cloud地址:https://github.com/pelican-plugins/tag-cloud

pip install pelican-tag-cloud


接着输入命令pelican-plugins查看是否安装好插件:

[00:51:11] INFO Plugins found: _utils.py:38 pelican.plugins.tag_cloud

在`pelicanconf.py`中设置`tag_cloud`插件:

PLUGINS = [“pelican.plugins.tag_cloud”]

TAG_CLOUD_STEPS = 4 #标签云中不同字体大小的计数 TAG_CLOUD_MAX_ITEMS = 10 #标签显示的最大数量 TAG_CLOUD_SORTING = “size” #标签云排序方案。有效值:随机、按字母顺序、按字母顺序-rev、size和size-rev TAG_CLOUD_BADGE = True #可选设置:打开徽章,显示使用每个标签的文章数量


并修改模板:

5、访问统计功能

pelicanconf.py中设置ANALYTICS

ANALYTICS = """
    <script src="/theme/js/primary-analytics.js"></script>
    <script>
        [ … in-line Javascript code for secondary analytics … ]
    </script>
"""

6、分页功能

pelicanconf.py中设置DEFAULT_PAGINATIONPAGINATION_PATTERNS

# 设置默认每页显示的文章数量为15。
DEFAULT_PAGINATION = 15

PAGINATION_PATTERNS = (
    (1, '{url}', '{save_as}'),
    (2, '{base_name}/page/{number}/', '{base_name}/page/{number}/index.html'),
)

在需要分页的页面模板相应位置上添加:

{% if articles_page.has_other_pages() %}
{% include 'pagination.html' %}
{% endif %}

编写模板pagination.html:

{% if DEFAULT_PAGINATION %}
{% set first_page = articles_paginator.page(1) %}
{% set last_page = articles_paginator.page(articles_paginator.num_pages) %}
<p class="paginator">
    {% if articles_page.has_previous() %}
    <a href="{{ SITEURL }}/{{ first_page.url }}">&#8647;</a>
    <a href="{{ SITEURL }}/{{ articles_previous_page.url }}">&laquo;</a>
    {% endif %}
    Page {{ articles_page.number }} / {{ articles_paginator.num_pages }}
    {% if articles_page.has_next() %}
    <a href="{{ SITEURL }}/{{ articles_next_page.url }}">&raquo;</a>
    <a href="{{ SITEURL }}/{{ last_page.url }}">&#8649;</a>
    {% endif %}
</p>
{% endif %}

Pelican会自动添加分页。

7、一些pelicanconf.py中设置

# 站点地址,最后的"/"不能少。或留空。
SITEURL = ''
# SITEURL = 'http://www.aaa.com/'

# 日期格式参看:https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
DEFAULT_DATE_FORMAT = '%Y-%m-%d %a'

# 使用未install的主题
THEME = "./themes/notmyidea-ah21"
# Markdown扩展
MARKDOWN = {
    'extension_configs': {
        'markdown.extensions.codehilite': {'css_class': 'highlight'},
        'markdown.extensions.extra': {},
        'markdown.extensions.meta': {},
        'markdown.extensions.tables': {  # 表格
        },
        'markdown.extensions.toc': {     # 目录,设置看https://python-markdown.github.io/extensions/toc/
            'title': 'TOC:',      # 目录题头
            'toc_depth': 3,
        },
    },
    'output_format': 'html5',
}

# 插件路径
PLUGIN_PATHS = ['./pelican-plugins']
# 使用的插件(extract_toc要和Markdown的toc扩展插件配合使用)
PLUGINS = ['extract_toc']
# 静态文件夹、文件
STATIC_PATHS = ['images', 'extra/CNAME', 'extra/README.txt', 'extra/favicon.ico']
# 以下设置页无法避免.md文件的转换处理
#次级文件夹中的文章,如果没有分类,则使用文件夹名称代替,缺省为True
USE_FOLDER_AS_CATEGORY = True
# 默认归类(未归类的归入自动此类)
DEFAULT_CATEGORY = '杂项'

# 输出时保护(如版本数据)
OUTPUT_RETENTION = [".hg", ".git", ".bzr"]

# 忽略文件,不予处理
# IGNORE_FILES = ['README.MD']

8、Pelican 变量

Pelican 所有模板都将接收 settings (pelicanconf.py)文件中定义的全部大写的变量。

9、反转文章列表的顺序

在主题的 index.html 和 tag.html 模板中,将 object_list 循环更改为 object_list[::-1] 以反转文章列表的顺序:

{% for article in articles_page.object_list[::-1] %}
{% for article in articles_page.object_list[::-1] %}

10、可以在模板中使用任意元数据

要在 Markdown 文章中包含修改日期,可以在文章顶部包含以下内容:

Markdown :
Modified: 2012-08-08

reStructuredText:
:Modified: 2012-08-08

然后,可以通过以下方式在 article.html 等模板中访问此元数据:

{% if article.modified %}
Last modified: {{ article.modified }}
{% endif %}

如果想在文章上下文之外的模板中包含元数据(例如,base.html),if 语句应该是:

{% if article and article.modified %}

11、自定义Jinja2

pelicanconf.py中自定义 Jinja2 FILTERS : JINJA_FILTERS = {}

import sys
sys.path.append('to/your/path')

from custom_filter import urlencode_filter
JINJA_FILTERS = {'urlencode': urlencode_filter}

pelicanconf.py中自定义 映射到 Jinja2 全局 environment namespace Jinja 全局命名空间文档

使用 Pelican 插件添加 Jinja2 过滤器: 使用 Pelican 插件添加 Jinja2 过滤器

12、查看环境中的当前设置列表

要查看环境中的当前设置列表(包括默认值和任何自定义值): pelican --print-settings

13、URL自定义设置

可以使用其他的文件元数据的属性来自定义URL: slug date lang author category

ARTICLE_URL举例: ARTICLE_URLARTICLE_SAVE_AS必须一起使用,否则会出错。

ARTICLE_URL = "{category}/{slug}/"
ARTICLE_SAVE_AS = "{category}/{slug}.html"#
ARTICLE_SAVE_AS = "" #如果你不希望创建一个或多个默认页面(例如,你是网站上的唯一作者,因此不需要作者页面), 请相应地将 *_SAVE_AS 设置设置为 '' ,以防止生成相关页面。