我在mako模板中有很多defs和捕获。模板的渲染传递给pdflatex,因此mako的输出必须恰到好处。印刷文本可能包含撇号或&符号等。并禁止他们转向'
等。我必须在模板内的所有表达式中使用过滤器'n':${text | n}
我试图添加<%page expression_filter="n" />
,但它对此事没有影响。其他过滤器(例如trim
)可与page-tag
配合使用,但禁用所有过滤功能无效。
这就是我所拥有的
<%! from bs4 import BeautifulSoup %>
<%def name='html_tag_to_latex(tag, content)' filter="trim">
% if tag == "p":
${content | n}\par{}
% elif tag == "h1":
\clearpage\section{${content | n}}
% elif tag == "h2":
\subsection{${content | n}}
% else:
${content | n}
</%def>
<%def name='html_to_latex(html_string)' filter="n,trim">
<%def name='beautifulsoup_to_latex(item)' filter="n,trim">
<% text = u'' %>
% for child in item.contents:
% try:
<% child.contents %>
<% subtext = capture(beautifulsoup_to_latex, item=child) %>
% if subtext.strip():
<%
text += capture(
html_tag_to_latex,
tag=child.name,
content=subtext.strip()
)
%>
% endif
% except AttributeError:
<% text += unicode_to_latex(child.string) %>
% endtry
% endfor
## Capture all the kids and then print out
${text | n}
</%def>
<% soup = BeautifulSoup(html_string) %>
${beautifulsoup_to_latex(soup)}
</%def>
出于某种原因,所有n个过滤器都需要明确放在侧面表达式中。在defs中添加过滤器n没有任何效果; filter="n,trim"
或filter="n"
无效。无论出于何种原因,这只会影响撇号。
unicode_to_latex
- 方法执行字典检查以将unicode转换为LaTeX-markup,例如。 &
- &gt; \&
。它工作正常,但mako把它变成了\&
。斯堪的纳维亚字母äåö
按原样显示,因此makos entity
- 过滤器未使用。
唯一的解决方案是将| n
添加到所有表达式吗?它是唯一一个因某种原因起作用的人。为什么我不能使用expression_filter?
编辑:
注意到行${beautifulsoup_to_latex(soup)}
不需要禁用filterin。只有在html_tag_to_latex
和html_to_latex
方法中,表达式才需要。
答案 0 :(得分:1)
解决!我想。
我使用带有mako模板的Pyramid-framework 1.4版,看起来mako_templating.py
内部深处有一条线:
default_filters = sget('default_filters', 'h')
这解释了为什么html过滤始终用作默认值。没有真正解释为什么它会覆盖页面expression_filters,但似乎足以回答我自己的问题。
从1.5.something Pyramid将mako渲染器移动到名为pyramid_mako
的不同包中,似乎也有相同的默认设置。
要覆盖此项,必须在Pyramids mako.default_filters
- 文件中设置.ini
设置。这会搞砸我现有的所有模板,所以我想我必须坚持使用| n
标志和模板中的表达式。
这需要一些时间来弄明白。希望这会对其他人有所帮助。
编辑:设置mako.default_filters = unicode
无需使用n-flag。只使用mako.default_filters = n
搞砸了。