2012-01-18 64 views
5

我一直在創建一個python markdown擴展,當使用自定義標記時,它將在我的django項目中插入一個圖像庫。實際的擴展正在工作,但擴展返回的HTML全部編碼。下面是我使用的擴展:在自定義Python Markdown擴展輸出中禁用HTML編碼

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

我保證了render_to_string實際上返回,這不是編碼的HTML。從這裏,外殼是輸出的一個例子:

輸出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' 

下面是markdown擴展輸出編碼:

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

我怎樣才能讓rendered返回HTML在使用降價擴展時標記而不是編碼標記?此外,我會很感激任何關於編碼的指針(語法,佈局等)。我很感激。

+0

您是否找到解決方案? – 2014-11-19 22:40:16

回答

3

如果您正在尋找的是一種避免自定義標記呈現的內容自動轉義的方法,那麼您可以使用django.utils.safestring.mark_safe將該字符串標記爲安全。

你可以在django代碼中看到一些例子。例如在defaulttags.py

+0

嗨,jcollado,謝謝你的回覆。這個轉義的輸出是在django之外返回的,事實上,當我在我的模板上使用render_to_string時,我的數據在shell中效果很好。讓我知道如果我失去了一些東西。 – ajt 2012-01-18 18:19:17

1

我解決這樣的問題:

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)) 

解決問題的關鍵是在最後一行。