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)
如果没有,是否有其他方法可以使这部分从长远来看更具可读性和可维护性?
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。