문제

나는 내 자신의 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을 알고 있으므로 블로그 게시물을 직접 작성하고 템플릿으로 렌더링 할 때 게시물 본문을 안전하게 표시합니다.

{{ post.body|pygmentize|safe }}

이 접근법은 코드 블록의 HTML을 HTML로 렌더링합니다 (즉, 표시되지 않음). 필터가 본문에서 추출한 코드에서 Django Escape 기능을 사용하여 놀았지만 결코 올바르게 얻을 수는 없습니다. 컨텐츠 탈출에 대한 나의 이해는 충분히 완전하지 않다고 생각합니다. 나는 또한 포스트 본문 (예 : <)에 탈출 된 버전을 작성하려고 시도했지만 텍스트로 나옵니다.

디스플레이를 위해 HTML을 표시하는 가장 좋은 방법은 무엇입니까? 내가이 모든 것을 잘못하고 있습니까?

감사.

도움이 되었습니까?

해결책

나는 마침내 그것을 알아낼 시간을 찾았다. 아름다운 수프가 내용을 끌어 당기고 태그가 포함되어 있으면 태그는 목록의 하위 노드로 나열됩니다. 이 라인은 범인입니다.

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

0]은 코드의 다른 부분을 차단하고 잘못 설명되지 않습니다. 내 부분에서 벌레가 불량합니다. 해당 라인은 다음과 같이 대체해야합니다.

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

여기의 교훈은 문제가 무엇인지 알고 라이브러리의 작동 방식을 아는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top