常见问题解答

以下是一些Pelican的常见问题解答。

交流问题、疑问或提建议的最佳方式是什么?

请参阅文档 项目贡献与意见反馈

我可以帮上什么忙?

有好多种方法可以提供帮助。首先,可以在 Pelican讨论板块 中提出任何关于Pelican的建议或是问题。在提问或建议之前,请先查看已关闭或开放的issues中是否已有相关内容,以避免内容上的重复。

如果你想要对项目进行贡献,请fork Git仓库 ,创建一个新的功能分支,并在其中进行修改,在修改完成后提出一个PR。项目组会尽快审核你的PR。关于此的更多内容,请参见 项目贡献与意见反馈 一节。

你可以发起的贡献当然也包括创建主题和改进文档。

Pelican配置文件是必要的吗?

配置文件是可选的,其本质是使您可以更方便地配置Pelican。对于一些基本的配置操作,完全可以在命令行中指定,调用 pelican --help 可以查看pelican命令的更多信息。

修改后的配置文件没有生效

在尝试不同的配置时(尤其是尝试不同元数据时),缓存很可能会产生干扰,使得修改不可见。此时,确保配置了 LOAD_CONTENT_CACHE = False 或在命令行中加上 --ignore-cache 以禁用缓存。

在自己创建主题时,如何使用Pygments来调整语法高亮?

Pygments会为生成的内容添加一些CSS类。这些类会为主题所用,主题会通过CSS来为代码添加语法高亮。具体来说,你可以通过主题CSS文件中的 .highlight pre 类来自定义语法高亮的外观。在 Pygments 项目的demo网站 上可以预览能够渲染的代码类型。

你可以使用下面的命令来让Pygments使用内置风格(此处为“monokai”)生成一个初始CSS文件,然后将此文件拷贝到新主题中:

pygmentize -S monokai -f html -a .highlight > pygment.css
cp pygment.css path/to/theme/static/css/

不要忘了在你的CSS主文件中引入 pygment.css 文件。

如何创建我自己的主题?

请参阅 主题

我只需要覆盖主题中单独的几个模板文件,可不可以不fork整个主题?

当然可以,覆盖部分模板文件或是添加一些模板文件都是可以的,使用 THEME_TEMPLATES_OVERRIDES 变量即可。例如,若需要覆盖page的模板,可以向这样定义你自己的模板文件位置:

THEME_TEMPLATES_OVERRIDES = ["templates"]

自定义的模板可以为 templates/page.html 。详情请参看 主题

我想要使用Markdown,但是出错了。

如果没有事先安装Markdown库,在生成Markdown内容时会看到一条提示 No valid files found in content 。虽然Markdown并不是必需依赖,但如果你写的内容中含有Markdown格式,就需要安装Markdown库了。输入下面的命令以安装Markdown库,如果需要权限,请在前面添加 sudo

python -m pip install 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 %}

备注

因为冒号 (:) 已经用作分隔符,字段名称包含冒号的元数据可能不会起作用。

如何使得输出目录的结构和content目录的结构保持一致?

可以尝试如下配置:

USE_FOLDER_AS_CATEGORY = False
PATH_METADATA = r"(?P<path_no_ext>.*)\..*"
ARTICLE_URL = ARTICLE_SAVE_AS = PAGE_URL = PAGE_SAVE_AS = "{path_no_ext}.html"

如何为某个页面指定某个模板?

这非常简单,在任何页面或者文章中,都可以通过多添加一行元数据来指定特定模板。例如,在reST中,使用:

:template: template_name

对于Markdown,则使用:

Template: template_name

接着只要确保主题中有相对应的模板文件 (e.g. template_name.html)。如果只是需要把一个自定义模板加到已有主题中,可以将其放在 THEME_TEMPLATES_OVERRIDES 指定的目录中 (详见 主题)。

如何重写某一个页面或文章生成的URL?

在任意页面或文章中都可以添加 urlsave_as 元数据,这样就可以重写URL了。下面以reST格式为例:

Override url/save_as page
#########################

:url: override/url/
:save_as: override/url/index.html

有了这样的元数据,此页面会保存为 override/url/index.html ,Pelican会将 override/url/ 作为链接到此页面的URL。

如何使用一个静态页面作为主页?

上一个问题中提到的特性可以用于实现此需求。下面例子中的Markdown文件保存为 content/pages/home.md

Title: Welcome to My Site
URL:
save_as: index.html

Thank you for visiting. Welcome!

如果仍需要原来的博客主页(即 'index' 直接模板),可以通过设置 INDEX_SAVE_AS = 'blog_index.html' 将其存储在其他位置。

可以禁用订阅源生成吗?

要禁用订阅源,所有订阅源相关的配置都应被设为 None 。其中有三项设置默认为 None ,因此如果要彻底不生成订阅源,你只需要指定下面这些设置:

FEED_ALL_ATOM = None
CATEGORY_FEED_ATOM = None
TRANSLATION_FEED_ATOM = None
AUTHOR_FEED_ATOM = None
AUTHOR_FEED_RSS = None

None 两侧不需要加引号。请注意 None'' 不是同一个东西。

Pelican警告说由于SITEURL设置不正确,无法正常生成订阅源

RSS和Atom订阅源要求所有URL都要链接到绝对地址 。为了使得Pelican能正确生成链接,你需要将站点的 SITEURL 设置为完整路径。

虽然Pelican提出了警告,但是仍会生成订阅源,但其中的链接可能是无效的,这会导致订阅源不可用。

可以让Atom订阅源只显示摘要,不显示文章内容吗?

绝大多数使用订阅源阅读器的人都更喜欢直接在阅读器中阅读文章内容,而不是另外再打开窗口来阅读。因此,Pelican不支持使Atom只包含摘要。但是由于RSS不包含单独的 content 字段,因此Pelican在发布RSS时默认只包含摘要(当然也可以设置为包含文章内容)。Pelican在订阅源生成上的如此行为就可以让用户自行选择订阅类型:包含了完整内容的Atom或是只包含摘要的RSS。

Pelican只适合用于博客吗?

不是的。Pelican可以方便地用于创建维护任何静态站点,为此你需要对主题和配置做一些定制。例如,如果要为你的产品构建一个宣传网站,即不需要使用标签特性,从主题中移除与标签相关的HTML代码即可。另外,还可以通过下面的设置来禁用标签相关页面的生成:

TAGS_SAVE_AS = ''
TAG_SAVE_AS = ''

启用内容缓存后,为什么Pelican仍会每次都写入所有HTML文件?

为了确定HTML输出确实和之前的不同,模板上下文、插件等很多生成环境都需要保存并比较某种哈希值(对于不可哈希的内容类型还需要进行一些额外处理)。另外,由于插件、分页等内容的存在,输出的HTML很可能会与之前不同。因此,考虑到处理时间和存储空间,每次都重新写入全部HTML会更快更可靠。

然而,这样的机制会使得在每次生成站点后,文件的修改时间都会变化,因此基于 rsync 上传时会把没有变化的内容也进行上传。一个简便的解决方法就是给 rsync 加上 --checksum 选项,这会比Pelican在生成时进行校验更快。

如何只处理一部分文章?

简便起见,在调试时可能只需要处理几篇文章。可以直接在配置项 ARTICLE_PATHS 中添加需要处理文章的文件名。可以通过像 cd content; find -name '*.md' | head -n 10 这样的命令获取文章文件名的列表。

在升级Pelican后,标签云消失或不可用了

我们一直致力于精简Pelican,标签云生成的功能已经从Pelican核心中移除,转而放到了一个单独的 tag-cloud插件 中。查看 插件 文档获取更多关于Pelican插件系统的信息。

升级Pelican后,一些页面没有被渲染

在以前的版本中,主题通过小写的 pages 和大写的 PAGES 都能获取到页面。为了使之与 模板和变量 一节中的内容保持一致,大写的 PAGES 被删除了。只要将主题中的 PAGES 替换为 pages ,问题即可解决。例如将原先的:

{% for pg in PAGES %}

替换为:

{% for pg in pages %}

如何避免让Pelican将我的静态文件解析为内容文件?(译者注:例如要将一个HTML文件作为静态文件)

Pelican的文章与页面生成器会先于静态文件生成器运行。这意味着若使用默认配置,即静态资源文件夹定义在某个 *_PATHS 配置项中,所有以有效内容文件后缀结尾的文件( .html.rst.md 等)都会被视为文章或者页面,而不是静态文件。

为了避免这个问题,使用合适的 *_EXCLUDES 配置,在必要时还可以通过 READERS 配置项来直接禁用产生问题的reader。

为什么不是所有的Markdown语法都支持?

Pelican并不直接对Markdown进行处理,而是将此任务交给 Python-Markdown 项目,此项目的核心有意只遵循原始的Markdown语法规则,而不服从之后传播开的大量Markdown风格。另外, Python-Markdown 是相当模块化的,你想要使用的语法可能已经有现成的 Markdown扩展 进行了实现。或者,也有人创建了支持Markdown变体的Pelican插件,如果你想要用某种Markdown变体,可以在这些地方寻找支持。