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

时间:2015-11-01 18:18:30

标签: python jinja2 pelican

我有Pelican主题为bootstrap3的网站。该主题使用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') %}

我可以使用replace替换此dict次来电吗?像这样:

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

如果没有,是否还有其他方法可以使这部分在长期内更具可读性和可维护性?

1 个答案:

答案 0 :(得分:3)

这看起来像是custom Jinja2 filter的作业。

def dict_replace(text, replacements):
    for key, val in replacements.iteritems():
        text = text.replace(key, val)
    return text

将过滤器添加到Pelican config file

JINJA_FILTERS = {'dict_replace': dict_replace}

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

{% 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[''] %}

_name_sanitized变量是必要的,因为循环在Jinja2中有自己的范围,所以你不能只用set更新变量。