2012-01-18 21 views
5

He estado trabajando en la creación de una extensión de marcación python que insertará una galería de imágenes dentro de mi proyecto django cuando se usa una etiqueta personalizada. La extensión real está funcionando, pero el código HTML que devuelve la extensión está codificado. Aquí es la extensión que estoy usando:Deshabilitar la codificación HTML dentro de la salida de reducción de Python personalizada

#!/usr/bin/env python 
from django.template.loader import render_to_string 
from main.models import * 

import markdown 

version = "0.1.0" 

class GalleriaExtension(markdown.Extension): 
    def __init__(self, configs): 
     self.config = { 
     } 

     # Override defaults with user settings 
     for key, value in configs: 
      self.setConfig(key, value) 

    def add_inline(self, md, name, klass, re): 
     pattern = klass(re) 
     pattern.md = md 
     pattern.ext = self 
     md.inlinePatterns.add(name, pattern, "<reference") 

    def extendMarkdown(self, md, md_globals): 
     self.add_inline(md, 'galleria', Galleria, 
      r'\[\[(G|g)allery (?P<superpage_id>\w+)\]\]') 

class Galleria(markdown.inlinepatterns.Pattern): 
    def handleMatch(self, m): 
     try: 
      images = SuperPage.objects.get(id=m.group('superpage_id')).superpageimage_set.all() 
     except: 
      images = None 
     if images: 
      rendered = render_to_string('galleria.html', { 'images': images }) 
     else: 
      rendered = '<b>There are no images for the given ID</b>' 
     return rendered 

def makeExtension(configs=None) : 
    return GalleriaExtension(configs=configs) 

me aseguré de que el render_to_string era en realidad regresando HTML que no haya sido codificado. Desde el shell de aquí es un ejemplo de la salida:

salida de render_to_string:

>>> from django.template.loader import render_to_string 
>>> images = SuperPage.objects.get(id=8).superpageimage_set.all() 
>>> render_to_string('galleria.html', { 'images': images }) 
u'<div class=\'galleria_std\'>\n <div class=\'gallery\' >\n  <div id=\'stage_gallery\' >\n' 

Aquí se emite desde markdown extensión que está codificado:

>>>markdown.markdown('test [[gallery 8]] test', ['galleria']) 
u'<p>test &lt;div class=\'galleria_std\'&gt;\n &lt;div class=\'gallery\' &gt;\n' 

¿Cómo puedo hacer rendered retorno HTML marcar en lugar de marcado codificado cuando se utiliza la extensión de rebaja? Además, agradecería cualquier sugerencia sobre la codificación de esta manera diferente (sintaxis, diseño, etc.). Lo aprecio.

+0

¿Encontró una solución? –

Respuesta

3

Si lo que está buscando es una forma de evitar que el contenido prestado por su etiqueta personalizada se autoescuela, puede marcar la cadena como segura con django.utils.safestring.mark_safe.

Puede ver algunos ejemplos en el código django. Por ejemplo, en defaulttags.py.

+0

Hola, jcollado, gracias por tu respuesta. Este resultado escapado se devuelve fuera de django, y de hecho cuando uso render_to_string en mi plantilla con mis datos en el shell, funciona muy bien. Avísame si me falta algo. – ajt

1

He resuelto el problema así:

import markdown 
from markdown import Extension 
from markdown.inlinepatterns import Pattern 
from django.template.loader import render_to_string 
from gallery.models import Gallery 

class InlineGalleryExtension(Extension): 
    def extendMarkdown(self, markdownInstance, md_globals): 
     GALLERY_RE = r'\[\[gallery (?P<id>[0-9]+)\]\]' 
     inlineGalleryPattern = InlineGallery(GALLERY_RE, markdownInstance) 

     markdownInstance.inlinePatterns.add('gallery', inlineGalleryPattern, "<not_strong") 

class InlineGallery(Pattern): 
    def handleMatch(self, m): 
     try: 
      gallery = Gallery.objects.get(id=m.group('id').strip()) 
     except Gallery.DoesNotExist: 
      gallery = None 

     if gallery: 
      element = render_to_string('gallery/inline_gallery.html', { 
       'gallery': gallery 
      }) 
     else: 
      element = '' 

     return self.markdown.htmlStash.store(self.unescape(element)) 

La solución llave está en la última línea.

Cuestiones relacionadas