2012-01-18 22 views
5

Ho lavorato alla creazione di un'estensione markdown python che inserirà una galleria di immagini all'interno del mio progetto django quando viene utilizzato un tag personalizzato. L'estensione attuale funziona, ma l'HTML restituito dall'estensione è tutto codificato. Qui è l'estensione che sto usando:Disabilitare la codifica HTML all'interno dell'output dell'estensione personalizzata Markdown Markdown

#!/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) 

ho assicurato che la render_to_string è stato effettivamente tornando html che non è stato codificato. Dalla shell qui è un esempio di output:

uscita da 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' 

Qui viene emesso dal markdown estensione che è codificato:

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

Come posso fare rendered ritorno HTML mark up invece di markup codificato quando si utilizza l'estensione markdown? Inoltre, apprezzerei qualsiasi suggerimento su come codificarlo in modo diverso (sintassi, layout, ecc.). Lo apprezzo.

+0

Hai trovato una soluzione? –

risposta

3

Se quello che stai cercando è un modo per evitare che il contenuto reso dal tuo tag personalizzato sia autoescapito, allora puoi contrassegnare la stringa come sicura con django.utils.safestring.mark_safe.

Puoi vedere alcuni esempi nel codice django stesso. Ad esempio in defaulttags.py.

+0

Hey there jcollado, grazie per la tua risposta. Questo output sfuggito viene restituito al di fuori di django, e infatti quando uso rendering_to_string sul mio modello con i miei dati nella shell funziona perfettamente. Fammi sapere se mi manca qualcosa. – ajt

1

ho risolto il problema così:

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 soluzione chiave è nell'ultima riga.