2010-01-24 4 views
3

En dépit d'offrir un moyen agréable d'échapper à la sortie à l'aide de filtres, aucun d'entre eux ne fait le bon choix. Prendre la chaîne:Comment faire pour échapper correctement la sortie (pour XHTML) dans mako?

x=u"&\u0092" 

Les filtres procédez comme suit:

x    Turns the & into an entity but not the \u0092 (valid XML but not XHTML) 
h    Exactly the same 
u    Escapes both, but obviously uses url escaping 
entities  Only converts named entities, so again only the & is escaped 
decode.latin1 The same 

HTML utilise le répertoire de caractères standard UNICODE Consortium, et il laisse indéfini (entre autres) 65 codes de caractères (0 à 31 inclus et 127 à 159 inclusivement)

Ces caractères semblent être les caractères manquants. Des idées?

EDIT

Il semble valider si j'utilise le fichier hors connexion. Cela pourrait-il être un problème de type de contenu?

Répondre

2

Il n'est pas nécessaire de convertir les caractères Unicode au format &#xxxx; pour qu'ils fonctionnent en HTML sauf si vous utilisez délibérément le jeu de caractères ASCII. Il est plus simple et plus efficace d'échapper aux entités nommées, puis d'encoder toute la chaîne en UTF-8 et de l'écrire comme ça. Vous devriez probablement déclarer l'encodage utilisé dans les en-têtes HTTP ou dans une balise <meta>.

EDIT:

Il semble valider si j'utilise le fichier hors connexion. Cela pourrait-il être un problème de type de contenu?

Oui. Vous pouvez utiliser les en-têtes HTTP pour appliquer un charset UTF-8 ou spécifier dans le code HTML directement via une balise meta:

<meta http-equiv="Content-Type" content="application/xhtml+xml;charset=utf-8" /> 
+0

J'aimerais que ce soit si simple, mais ce n'est pas le cas. Je * suis * en utilisant UTF-8 et il ne validera pas. – Draemon

+0

Valide bien comme XHTML Strict. HTML 4 a cependant des problèmes avec ça. Avez-vous besoin d'être non-X HTML? –

+0

C'est XHTML Strict, UTF-8 et est détecté comme tel par les validateurs w3c en ligne et hors ligne. Mais le validateur en ligne me dit "Vous avez utilisé un caractère illégal dans votre texte.HTML utilise le répertoire de caractères standard du Consortium UNICODE" – Draemon

1

problèmes de validation mis à part, il est utile de pouvoir supprimer ces caractères (qui ne afficher de manière fiable de toute façon) sans échapper nécessairement toute autre chose. A cette fin, j'ai ajouté la fonction suivante à `lib/helpers.py ':

__sgml_invalid = re.compile(r'[\x82-\x8c\x91-\x9c\x9f]', re.UNICODE) 

def sgmlsafe(text): 
    lookup = { 
     130:"&#8218;", #Single Low-9 Quotation Mark 
     131: "&#402;", #Latin Small Letter F With Hook 
     132:"&#8222;", #Double Low-9 Quotation Mark 
     133:"&#8230;", #Horizontal Ellipsis 
     134:"&#8224;", #Dagger 
     135:"&#8225;", #Double Dagger 
     136: "&#710;", #Modifier Letter Circumflex Accent 
     137:"&#8240;", #Per Mille Sign 
     138: "&#352;", #Latin Capital Letter S With Caron 
     139:"&#8249;", #Single Left-Pointing Angle Quotation Mark 
     140: "&#338;", #Latin Capital Ligature OE 
     145:"&#8216;", #Left Single Quotation Mark 
     146:"&#8217;", #Right Single Quotation Mark 
     147:"&#8220;", #Left Double Quotation Mark 
     148:"&#8221;", #Right Double Quotation Mark 
     149:"&#8226;", #Bullet 
     150:"&#8211;", #En Dash 
     151:"&#8212;", #Em Dash 
     152: "&#732;", #Small Tilde 
     153:"&#8482;", #Trade Mark Sign 
     154: "&#353;", #Latin Small Letter S With Caron 
     155:"&#8250;", #Single Right-Pointing Angle Quotation Mark 
     156: "&#339;", #Latin Small Ligature OE 
     159: "&#376;"  #Latin Capital Letter Y With Diaeresis 
     } 

    return __sgml_invalid.sub(lambda x: lookup[ord(x.group())], text) 

Et vous pouvez mettre à la disposition comme un filtre en éditant environment.py:

config['pylons.app_globals'].mako_lookup = TemplateLookup(
    ... 
    imports=[....,'from appname.lib.helpers import sgmlsafe',...] 

Il devrait alors être disponible pour vos modèles:

${c.content|n,sgmlsafe} 
Questions connexes