У меня много дефов и захватов в шаблоне мако. Рендеринг шаблона передается в 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 превращает его в \&
. Скандинавские буквы äåö
отображаются как есть, поэтому makos entity
-фильтр не используется.
Действительно ли единственным решением является добавление | n
ко всем выражениям? Только он почему-то работает. Почему я не могу использовать выражение_фильтр?
Изменить: отмечено, что в строке ${beautifulsoup_to_latex(soup)}
не нужно отключать фильтрацию. это нужно только внутри выражений методов html_tag_to_latex
и html_to_latex
.