Как отключить всю фильтрацию в шаблоне мако с захватами и дефами?

У меня много дефов и захватов в шаблоне мако. Рендеринг шаблона передается в 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-фильтры по какой-то причине нужно явно размещать в побочных выражениях. Добавление фильтра n в defs не дает никакого эффекта; filter="n,trim" или filter="n" ничего не делает. И это по какой-то причине влияет только на апострофы.

Метод unicode_to_latex выполняет проверку словаря для преобразования юникода в разметку LaTeX, например. & -> \&. Он отлично работает, но mako превращает его в \&amp;. Скандинавские буквы äåö отображаются как есть, поэтому makos entity-фильтр не используется.

Действительно ли единственным решением является добавление | n ко всем выражениям? Только он почему-то работает. Почему я не могу использовать выражение_фильтр?

Изменить: отмечено, что в строке ${beautifulsoup_to_latex(soup)} не нужно отключать фильтрацию. это нужно только внутри выражений методов html_tag_to_latex и html_to_latex.


person Gemmu    schedule 24.09.2013    source источник


Ответы (1)


Решено! Я думаю.

Я использую Pyramid-framework версии 1.4 с шаблонами mako и кажется, что глубоко внутри mako_templating.py находится строка:

default_filters = sget('default_filters', 'h')

Это объясняет, почему фильтрация html всегда используется по умолчанию. На самом деле не объясняет, почему он переопределяет страницу expression_filters, но кажется достаточно близким, чтобы ответить на мой собственный вопрос.

Начиная с версии 1.5.something Pyramid переместила рендереры mako в другой пакет под названием pyramid_mako, и кажется, что там тоже есть те же настройки по умолчанию.

Чтобы переопределить это, необходимо установить параметр mako.default_filters в файле .ini Pyramids. Однако это испортило все мои существующие шаблоны, поэтому я думаю, что мне придется придерживаться использования флага | n с выражениями в шаблонах.

Это заняло некоторое время, чтобы понять. Надеюсь, это поможет кому-то еще.

EDIT: Set mako.default_filters = unicode устраняет необходимость использования n-флага. Только использование mako.default_filters = n все испортило.

person Gemmu    schedule 25.09.2013