在 Pelican 中根据文件名自动生成标题

问题描述 投票:0回答:2

1.总结

我无法从文章/页面的文件名自动生成正确的

title

例如,我无法从文章 title

 自动生成 
元数据密钥 Kira Goddess
 
Kira-Goddess.md

2.论证

干燥,自动化。如果可以自动完成的话,我不想每次都手动为每篇文章和页面编写标题。

一个例外——带有单词的文件,其中包含连字符——“众所周知的”、“讲英语的”。在这种情况下,我必须在我的文章的元数据中明确指定

title
。但我文章的文件名中很少有带连字符的单词。

3. MCVE

3.1。数据

您可以在我用于 Pelican 调试的存储库的

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>

3.2。重现步骤

参见

.travis.yml

  1. 运行 Pelican 构建:

    pelican content -s pelicanconf.py --fatal warnings --verbose
    
  2. 查找

    <title>
    标签的内容:

    grep -E "<title>.*</title>" output/Kira-Goddess.html
    

3.3。行为

3.3.1.当前的

参见Travis构建

<title>Kira-Goddess</title>
3.3.2.期望的

那就太好了,如果:

<title>{{ article.title }}</title>

将转变为:

<title>Kira Goddess</title>

4.没有帮助

在我读到的 EXTRA_PATH_METADATA

 变量的 描述中,Pelican 使用了 Python 组名表示法语法 
(?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("-", "")

这不起作用。

5.不提供

5.1。在模板中使用 Jinja2 过滤器

5.1.1.建议

在模板文件中使用

replace()
过滤器,如下所示:

<title>{{ article.title|replace('-', " ") }}</title>
5.1.2.为什么不好

Pelican 插件(例如 Pelican Open Graph)仍将使用

article.title
。不需要的数据如
Kira-Goddess
,而不是
Kira Goddess
仍然会传递给插件。

5.2。在 Markdown 中使用空格

5.2.1.建议

例如,将文件命名为

Kira Goddess.md
,而不是
Kira-Goddess.md

5.2.2.为什么不好

文件名中的空格是一种不好的做法 - 12345

python jinja2 regex-group python-re pelican
2个回答
0
投票

似乎

pelican
没有提供实现你想要的方法。
FILENAME_METADATA
正则表达式只能从文件名中选择名称,但不能用空格替换
-

所以我认为当前最好的方法是在每个文件中手动指定

title
标签。


0
投票

做到这一点的一种方法是为 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 插件

© www.soinside.com 2019 - 2024. All rights reserved.