2013-09-24 1 views
1

J'ai beaucoup de defs et de captures dans un template mako. Le rendu du template est passé à pdflatex donc la sortie de mako doit être juste. Le texte imprimé peut contenir des apostrophes ou des esperluettes et ainsi de suite. Et pour les désactiver de se tourner vers ' etc. Je dois utiliser le filtre « n » dans toutes les expressions à l'intérieur du modèle: ${text | n}Comment désactiver tout le filtrage dans un template mako avec des captures et des defs?

J'ai essayé d'ajouter le <%page expression_filter="n" /> mais il n'a pas d'effet sur la question. D'autres filtres comme trim fonctionnent bien avec page-tag, mais la désactivation de tous les filtres ne fonctionne pas.

Voici ce que j'ai

<%! 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> 

Tous les filtres de n-pour une raison quelconque doivent être explicitement placé dans les expressions secondaires. L'ajout du filtre n dans defs n'a aucun effet; filter="n,trim" ou filter="n" ne fait rien. Et ceci, pour une raison quelconque, n'affecte que les apostrophes.

La méthode unicode_to_latex effectue une vérification de dictionnaire pour transformer les codes Unicode en balisage LaTeX, par exemple. & ->\&. Cela fonctionne bien, mais mako le transforme en \&amp;. Les lettres scandinaves äåö sont affichées telles quelles, de sorte que le filtre entity n'est pas utilisé.

La seule solution est-elle vraiment d'ajouter le | n à toutes les expressions? C'est le seul qui fonctionne pour une raison quelconque. Pourquoi ne puis-je pas utiliser le filtre expression_filter?

Édition: A noté que la ligne ${beautifulsoup_to_latex(soup)} n'a pas besoin de désactiver filterin. seulement à l'intérieur des expressions de méthodes html_tag_to_latex et html_to_latex ont besoin de cela.

Répondre

1

Résolu! Je pense.

J'utilise la version 1.4 Pyramide-cadre avec templating mako et il semble que profondément à l'intérieur mako_templating.py réside une ligne:

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

Ce qui explique pourquoi le filtrage html est toujours utilisé comme défaut. N'explique pas vraiment pourquoi il remplace la page expression_filtres, mais semble assez proche pour répondre à ma propre question. À partir de 1.5.quelque chose de Pyramid a déplacé les moteurs de rendu mako vers un package différent appelé pyramid_mako et il semble que les mêmes paramètres par défaut existent également.

Pour remplacer ce paramètre, vous devez définir le paramètre mako.default_filters dans le fichier-pyramide .ini. Cela cependant foiré tous mes modèles existants, donc je pense que je vais devoir rester avec l'utilisation du drapeau | n avec des expressions dans les modèles.

Cela a pris du temps à comprendre. J'espère que cela aidera quelqu'un d'autre.

EDIT: L'ensemble mako.default_filters = unicode supprime le besoin d'utiliser n-flag. Seulement en utilisant mako.default_filters = n gâché les choses.

Questions connexes