2012-01-18 35 views
5

Tôi đã làm việc để tạo một tiện ích mở rộng đánh dấu python sẽ chèn một thư viện hình ảnh trong dự án django của tôi khi sử dụng thẻ tùy chỉnh. Phần mở rộng thực tế đang hoạt động, nhưng HTML mà phần mở rộng trả về đều được mã hóa. Đây là tiện ích mở rộng mà tôi đang sử dụng:Tắt mã hóa HTML trong đầu ra của phần mở rộng Markdown tùy chỉnh của Python

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

Tôi đảm bảo rằng render_to_string thực sự trả lại html không được mã hóa. Từ vỏ đây là một ví dụ về kết quả:

Output từ 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' 

Đây là sản lượng từ markdown phần mở rộng được mã hóa:

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

Làm thế nào tôi có thể làm cho rendered trở HTML đánh dấu thay vì đánh dấu mã hóa khi sử dụng phần mở rộng markdown? Ngoài ra, tôi sẽ đánh giá cao bất kỳ con trỏ trên mã hóa này khác nhau (cú pháp, bố trí, vv). Tôi đánh giá cao nó.

+0

Bạn đã tìm thấy giải pháp chưa? –

Trả lời

3

Nếu những gì bạn đang tìm kiếm là cách tránh nội dung được hiển thị bởi thẻ tùy chỉnh của bạn được tự động cắt, thì bạn có thể đánh dấu chuỗi là an toàn với django.utils.safestring.mark_safe.

Bạn có thể xem một số ví dụ trong chính mã django. Ví dụ: defaulttags.py.

+0

Xin chào jcollado, cảm ơn bạn đã trả lời. Đầu ra thoát này đang được trả về bên ngoài django, và trên thực tế khi tôi sử dụng render_to_string trên mẫu của tôi với dữ liệu của tôi trong trình bao nó hoạt động rất tốt. Hãy cho tôi biết nếu tôi thiếu cái gì đó. – ajt

1

tôi giải quyết vấn đề như thế:

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

Giải pháp then chốt là ở dòng cuối cùng.

Các vấn đề liên quan