2009-10-22 5 views
1

내 개인적인 장고 기반 블로그 (모두와 마찬가지로)가 내 파이썬을 향상시키기 위해 노력해 왔으며 일부 구문 강조를 추가하는 것이 좋습니다. 거기서 일부 스 니펫을보고 몇 가지를 결합하여 Beautiful Soup and Pygments를 사용하여 고유 한 구문 강조 템플릿 필터를 작성하기로 결정했습니다. 그것은 다음과 같습니다Django 구문 강조로 인해 문자 이스케이프 문제가 발생했습니다

그것은이와 하이라이트 및 광고와 같은 코드 블록 관련 스타일을 찾습니다
from django import template 
from BeautifulSoup import BeautifulSoup 
import pygments 
import pygments.lexers as lexers 
import pygments.formatters as formatters 

register = template.Library() 

@register.filter(name='pygmentize') 
def pygmentize(value): 
    try: 
     formatter = formatters.HtmlFormatter(style='trac') 
     tree = BeautifulSoup(value) 
     for code in tree.findAll('code'): 
      if not code['class']: code['class'] = 'text' 
      lexer = lexers.get_lexer_by_name(code['class']) 
      new_content = pygments.highlight(code.contents[0], lexer, formatter) 
      new_content += u"<style>%s</style>" % formatter.get_style_defs('.highlight') 
      code.replaceWith ("%s\n" % new_content) 
     content = str(tree) 
     return content 
    except KeyError: 
     return value 

:

<code class="python"> 
    print "Hello World" 
</code> 

이 있었다 모든 내가 포함 된 코드 블록이 때까지 잘 작동 일부 그것의 html. 지금, 나는 내가 필요한 모든 HTML을 알고, 그래서 그것을 직접 내 블로그 게시물을 작성하고 템플릿에 렌더링 할 때, 단지 안전한 게시물 본문 표시 : 코드에서 모든 HTML에서

{{ post.body|pygmentize|safe }} 

이 접근 방식의 결과를 그냥 HTML로 렌더링을 차단합니다 (즉, 표시되지 않음). 내 필터에 의해 본문에서 추출 된 코드 장고 탈출 함수를 사용하여 놀았어요,하지만 나는 그것을 올바르게 얻을 것 결코 꽤 수 있습니다. 콘텐츠 이탈에 대한 이해가 충분하지 않다고 생각합니다. 나는 또한 게시 본문 (예 : <)에 이스케이프 된 버전을 쓰려고했지만 텍스트로 나옵니다.

표시 할 html로 표시하는 가장 좋은 방법은 무엇입니까? 나는이 모든 잘못을 저지르고 있는가?

감사합니다.

답변

1

마침내 알아낼 시간을 찾았습니다. 아름다운 수프가 내용물을 잡아 당길 때 태그가 포함되면 태그는 목록의 하위 노드로 나열됩니다. 이 행은 범인입니다 :

new_content = pygments.highlight(code.contents[0], lexer, formatter) 

[0]은 코드의 다른 부분을 잘라내어 잘못 디코딩되지 않습니다. 내 부분에 불쌍한 버그가 나타납니다.

new_content = pygments.highlight(code.decodeContents(), lexer, formatter) 

여기서 교훈은 문제가 무엇인지, 그리고 라이브러리가 작동하는 방법을 알고 있어야 있습니다 : 그 라인으로 교체해야합니다.

관련 문제