Pelican 模板开发中的一些记录
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_PAGINATION
和PAGINATION_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 }}">⇇</a>
<a href="{{ SITEURL }}/{{ articles_previous_page.url }}">«</a>
{% endif %}
Page {{ articles_page.number }} / {{ articles_paginator.num_pages }}
{% if articles_page.has_next() %}
<a href="{{ SITEURL }}/{{ articles_next_page.url }}">»</a>
<a href="{{ SITEURL }}/{{ last_page.url }}">⇉</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_URL
和ARTICLE_SAVE_AS
必须一起使用,否则会出错。
ARTICLE_URL = "{category}/{slug}/"
ARTICLE_SAVE_AS = "{category}/{slug}.html"#
ARTICLE_SAVE_AS = "" #如果你不希望创建一个或多个默认页面(例如,你是网站上的唯一作者,因此不需要作者页面), 请相应地将 *_SAVE_AS 设置设置为 '' ,以防止生成相关页面。