python - 在 Pelican 中从文件名自动生成标题

标签 python jinja2 regex-group python-re pelican

1。总结

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

比如我不能自动生成metadata key title Kira Goddess来自文章Kira-Goddess.md

2。争论

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

一个异常(exception)——带有单词的文件,其中包含连字符——“众所周知”、“说英语”。在这种情况下,我必须明确指定 title在我文章的元数据中。但是在我的文章的文件名中很少有带连字符的词。

3。 MCVE

3.1。数据

你可以在我的 KiraTitleFromFilename branch中看到我用于 Pelican 调试的存储库。

  • 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. Finding content of <title> tag :

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

3.3。行为

3.3.1.当前的

参见 Travis build :

<title>Kira-Goddess</title>
3.3.2.想要的

如果:

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

将转换为:

<title>Kira Goddess</title>

4。没有帮助

description of EXTRA_PATH_METADATA 我读到的变量,Pelican 使用了 Python group name notation语法 (?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.建议

Use replace() filter在你的模板文件中是这样的:

<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.为什么不好

文件名中的空格是一种不好的做法 — 1 , 2 , 3 , 4 , 5 .

最佳答案

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

所以我认为目前最好的方法是在每个文件中手动指定 title 标签。

关于python - 在 Pelican 中从文件名自动生成标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64058029/

相关文章:

Python正则表达式立即替换组

Python cvxopt 忽略约束

jinja2 - 如何按元组中的第一个元素对元组列表进行排序?

python - 如何从 __subclasses__ 中删除类?

Flask 基于两个或多个路由渲染相同的模板?

python - Bottle:使用jinja2_view装饰器

html - kate - 正则表达式 - 查找并将 URL 部分从 href 替换为 ">

python - 在 Python 中使用正则表达式获得和平的数字

python - 如何在 Python 中使用 Google HttpMock?

python - anaconda 环境无法识别包的问题