首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Jinja2中对字符串执行多个替换?

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

Stack Overflow用户
提问于 2015-11-01 18:18:30
回答 1查看 3.5K关注 0票数 2

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

的问题是,有时我的链接文本不能映射到字库--一个很棒的类名。例如,信封图标是由envelope类提供的,但我真的希望Email作为链接文本在网站上。

我可以在Font样式表中更改类名,但是这样我就不能使用Bootstrap了,每次我将Font更新到新版本时,我都要做这样的修改。

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

代码语言:javascript
复制
{% set name_sanitized = name|lower|replace('+','-plus')|replace(' ','-')|replace('stackexchange', 'stack-exchange')|replace('rss-feed', 'rss')|replace('email', 'envelope') %}

我可以用replace替换这条dict调用链吗?就像这样:

代码语言:javascript
复制
{% set replacements = dict('+' = '-plus', ' ' = '-', 
                          'stackexchange' = 'stack-exchange', 'rss-feed' = 'rss',
                          'email' = 'envelope') %}
{% set name_sanitized = name|lower|??? %}

如果没有,是否有其他方法使这个部分更易读和更易于长期维护?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-01 18:53:11

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

代码语言:javascript
复制
def dict_replace(text, replacements):
    for key, val in replacements.iteritems():
        text = text.replace(key, val)
    return text

将筛选器添加到鹈鹕配置文件

代码语言:javascript
复制
JINJA_FILTERS = {'dict_replace': dict_replace}

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

代码语言:javascript
复制
{% set name_sanitized = name|lower|dict_replace(replacements) %}

或者,您可以直接在Jinja2中实现这一点,但这是相当尴尬的。

代码语言:javascript
复制
{% 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更新变量。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33465542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档