Python 如何在Jinja2中对字符串执行多次替换?
我有一个主题网站。该主题使用字体Aweasome通过社交媒体帐户的链接放置图标。字体类名称是通过将链接文本设置为小写并用破折号替换所有空格来确定的 问题是,有时我的链接文本不会映射到字体类名称。例如,信封图标是由Python 如何在Jinja2中对字符串执行多次替换?,python,jinja2,pelican,Python,Jinja2,Pelican,我有一个主题网站。该主题使用字体Aweasome通过社交媒体帐户的链接放置图标。字体类名称是通过将链接文本设置为小写并用破折号替换所有空格来确定的 问题是,有时我的链接文本不会映射到字体类名称。例如,信封图标是由信封类提供的,但我确实希望电子邮件作为网站上的链接文本 我可以在Font Awesome样式表中更改类名,但之后我将无法使用引导CDN,每次将Font Awesome更新到新版本时,我都必须进行此类修改 我决定改为修改Pelican模板,并在编写类名之前进行必要的转换。到目前为止,我的代
信封
类提供的,但我确实希望电子邮件
作为网站上的链接文本
我可以在Font Awesome样式表中更改类名,但之后我将无法使用引导CDN,每次将Font Awesome更新到新版本时,我都必须进行此类修改
我决定改为修改Pelican模板,并在编写类名之前进行必要的转换。到目前为止,我的代码如下所示:
{% set name_sanitized = name|lower|replace('+','-plus')|replace(' ','-')|replace('stackexchange', 'stack-exchange')|replace('rss-feed', 'rss')|replace('email', 'envelope') %}
{% set replacements = dict('+' = '-plus', ' ' = '-',
'stackexchange' = 'stack-exchange', 'rss-feed' = 'rss',
'email' = 'envelope') %}
{% set name_sanitized = name|lower|??? %}
我是否可以使用dict
替换调用链?大概是这样的:
{% set name_sanitized = name|lower|replace('+','-plus')|replace(' ','-')|replace('stackexchange', 'stack-exchange')|replace('rss-feed', 'rss')|replace('email', 'envelope') %}
{% set replacements = dict('+' = '-plus', ' ' = '-',
'stackexchange' = 'stack-exchange', 'rss-feed' = 'rss',
'email' = 'envelope') %}
{% set name_sanitized = name|lower|??? %}
如果没有,是否有其他方法可以使此部分更具可读性和长期可维护性?这看起来像是一项长期的工作
将筛选器添加到您的:
然后在模板中使用过滤器:
{% set name_sanitized = name|lower|dict_replace(replacements) %}
或者,您可以直接在Jinja2中实现这一点,但这相当尴尬
{% set _name_sanitized = {'': name|lower} %}
{% for key, val in replacements.items() %}
{% if _name_sanitized.update('', _name_sanitized['']|replace(key, val) %}{% endif %}
{% endfor %}
{% set name_sanitized = _name_sanitized[''] %}
\u name\u sanitized
变量是必需的,因为循环在Jinja2中有自己的作用域,所以不能仅使用集更新变量
我应该将自定义筛选代码放在哪里?我将它粘贴到pelicanconf.py
中,它确实可以工作,但配置文件似乎不是函数的合适位置…@MirosławZalewski我想您可以在单独的模块中定义它,并将其导入设置文件中。