我有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|??? %}
如果没有,是否还有其他方法可以使这部分在长期内更具可读性和可维护性?
答案 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
更新变量。