我无法从文章/页面的文件名自动生成正确的
title
。
例如,我无法从文章 title
自动生成元数据密钥
Kira Goddess
Kira-Goddess.md
干燥,自动化。如果可以自动完成的话,我不想每次都手动为每篇文章和页面编写标题。
一个例外——带有单词的文件,其中包含连字符——“众所周知的”、“讲英语的”。在这种情况下,我必须在我的文章的元数据中明确指定
title
。但我文章的文件名中很少有带连字符的单词。
KiraTitleFromFilename
分支 中看到它。
pelicanconf.py
:
"""MCVE."""
AUTHOR = 'Sasha Chernykh'
SITENAME = 'SashaPelicanDebugging'
SITEURL = '.'
PATH = 'content'
TIMEZONE = 'Europe/Moscow'
DEFAULT_LANG = 'en'
# [INFO] Use article name when preserve the slug:
# https://docs.getpelican.com/en/stable/settings.html#url-settings
SLUGIFY_SOURCE = 'basename'
# [INFO] Preserve case of article filename
SLUGIFY_PRESERVE_CASE = True
# [INFO] Get title from article filename:
# https://docs.getpelican.com/en/stable/settings.html#metadata
# https://github.com/getpelican/pelican/issues/2107
# https://github.com/getpelican/pelican/commit/2e82a53cdf3f1f9d66557850cc2811479d5bb645
FILENAME_METADATA = '(?P<title>.*)'
Kira-Goddess.md
:
Date: 2020-09-24 18:57:33
Kira Goddess!
由 pelican-quickstart生成的另一个 Pelican 文件。
base.html
的简化部分:
<title>{{ article.title }}</title>
.travis.yml
:
运行 Pelican 构建:
pelican content -s pelicanconf.py --fatal warnings --verbose
<title>
标签的内容:
grep -E "<title>.*</title>" output/Kira-Goddess.html
参见Travis构建:
<title>Kira-Goddess</title>
3.3.2.期望的
那就太好了,如果:
<title>{{ article.title }}</title>
将转变为:
<title>Kira Goddess</title>
在我读到的 EXTRA_PATH_METADATA
(?P<name>…)
。我找不到如何在 Python 中进行替换 <class 'str'>
(print(type(FILENAME_METADATA))
→ <class 'str'>
)。我尝试过以下变体:
import re
KIRA_DEFAULT_FILENAME_REGEX = '(?P<title>.*)'
FILENAME_METADATA = re.sub(KIRA_DEFAULT_FILENAME_REGEX, "-", " ")
或
KIRA_DEFAULT_FILENAME_REGEX = '(?P<title>.*)'
FILENAME_METADATA = KIRA_DEFAULT_FILENAME_REGEX.replace("-", "")
这不起作用。
replace()
过滤器,如下所示:
<title>{{ article.title|replace('-', " ") }}</title>
5.1.2.为什么不好
Pelican 插件(例如 Pelican Open Graph)仍将使用
article.title
。不需要的数据如 Kira-Goddess
,而不是 Kira Goddess
仍然会传递给插件。
例如,将文件命名为
Kira Goddess.md
,而不是 Kira-Goddess.md
。
5.2.2.为什么不好
似乎
pelican
没有提供实现你想要的方法。
FILENAME_METADATA
正则表达式只能从文件名中选择名称,但不能用空格替换 -
。
所以我认为当前最好的方法是在每个文件中手动指定
title
标签。
做到这一点的一种方法是为 Pelican 编写一个(小)插件。您可能想要连接到
article_generator_context
(和/或 page_generator_context
)信号。您的插件将传递文章的元数据表,您可以在那里进行替换。像这样的东西(未经测试):
"""
Pelican plugin to replace "-" with a space in an article's title.
"""
from pelican import signals
def title_replace(generator, metadata):
try:
metadata["title"] = metadata["title"].replace("-", " ")
except KeyError:
pass
# not sure if you have to return metadata, or if it is
# globally updated as it's a dictionary
return metadata
def register():
"""Register the plugin pieces with Pelican."""
signals.article_generator_context.connect(title_replace)
signals.article_generator_context.connect(title_replace)
不要忘记将其添加到您的
pelicanconf.py
中的插件列表中。
更多关于 Pelican 插件。