如何使用捕获和defs禁用mako模板中的所有过滤?

时间:2013-09-24 13:15:18

标签: python-2.7 pyramid mako pdflatex

我在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把它变成了\&amp;。斯堪的纳维亚字母äåö按原样显示,因此makos entity - 过滤器未使用。

唯一的解决方案是将| n添加到所有表达式吗?它是唯一一个因某种原因起作用的人。为什么我不能使用expression_filter?

编辑: 注意到行${beautifulsoup_to_latex(soup)}不需要禁用filterin。只有在html_tag_to_latexhtml_to_latex方法中,表达式才需要。

1 个答案:

答案 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搞砸了。