如何在 Jinja2 中对字符串执行多次替换?

Mir*_*osz 5 python jinja2 pelican

我有带有bootstrap3主题的Pelican网站。该主题使用 Font Awesome 通过社交媒体帐户的链接来放置图标。Font Awesome 类名称是通过将链接文本小写并用破折号替换所有空格来确定的。

问题是,有时我的链接文本不映射到 Font Awesome 类名称。例如,信封图标是由envelope班级提供的,但我真的想要Email作为网站上的链接文本。

我可以更改 Font Awesome 样式表中的类名称,但是这样我将无法使用 Bootstrap CDN,并且每次将 Font Awesome 更新到新版本时都必须进行此类修改。

我决定修改 Pelican 模板,并在编写类名之前进行必要的转换。到目前为止,我的代码如下所示:

{% set name_sanitized = name|lower|replace('+','-plus')|replace(' ','-')|replace('stackexchange', 'stack-exchange')|replace('rss-feed', 'rss')|replace('email', 'envelope') %}
Run Code Online (Sandbox Code Playgroud)

replace我可以使用 来替换这个调用链吗dict?像这样的东西:

{% set replacements = dict('+' = '-plus', ' ' = '-', 
                          'stackexchange' = 'stack-exchange', 'rss-feed' = 'rss',
                          'email' = 'envelope') %}
{% set name_sanitized = name|lower|??? %}
Run Code Online (Sandbox Code Playgroud)

如果没有,是否有其他方法可以使这部分从长远来看更具可读性和可维护性?

aug*_*rar 4

这看起来像是自定义 Jinja2 过滤器的工作。

def dict_replace(text, replacements):
    for key, val in replacements.iteritems():
        text = text.replace(key, val)
    return text
Run Code Online (Sandbox Code Playgroud)

将过滤器添加到您的Pelican 配置文件中:

JINJA_FILTERS = {'dict_replace': dict_replace}
Run Code Online (Sandbox Code Playgroud)

然后在模板中使用过滤器:

{% set name_sanitized = name|lower|dict_replace(replacements) %}
Run Code Online (Sandbox Code Playgroud)

或者,您可以直接在 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[''] %}
Run Code Online (Sandbox Code Playgroud)

_name_sanitized变量是必要的,因为循环在 Jinja2 中有自己的作用域,因此您不能只使用 更新变量set