1

我在 mako 模板中有很多定义和捕获。模板的渲染传递给 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_latexunicodes 转换为 LaTeX 标记,例如。&-> \&。它工作正常,但 mako 把它变成了\&amp;. 斯堪的纳维亚字母äåö按原样显示,因此entity未使用 makos -filter。

唯一的解决方案真的是添加| n到所有表达式吗?由于某种原因,它是唯一有效的。为什么我不能使用 expression_filter?

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

4

1 回答 1

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,并且似乎也存在相同的默认设置。

要覆盖这一点,必须mako.default_filters在 Pyramids .ini-file 中设置设置。然而,这搞砸了我所有现有的模板,所以我认为我必须坚持| n在模板中使用带有表达式的标志。

这需要一些时间才能弄清楚。希望这对其他人有帮助。

编辑:设置mako.default_filters = unicode消除了使用 n 标志的需要。只用mako.default_filters = n乱七八糟的东西。

于 2013-09-25T08:28:29.647 回答