2010-11-29 3 views
2

Jinja2 AST의 일부를 컴파일하거나 되돌릴 수 있습니까?Jinja2 AST의 하위 섹션 컴파일

예를 들어 jinja2.environment 또는 jinja2.compiler.generate 등의 함수 또는 메소드를 호출하거나 템플릿에서 추출한 노드 목록에서 이와 동등한 함수를 호출 할 수 있습니까?

avant-tag 
{% xyz %} 
tag content {{ 3 + 5 }} 
{% endxyz %} 
apres-tag 

및 확장 y.py :

# -*- coding: utf-8 -*- 
from jinja2 import nodes, Environment, FileSystemLoader 
from jinja2.ext import Extension 

class YExtension(Extension): 
    tags = set(['y']) 

    def __init__(self, environment): 
     super(YExtension, self).__init__(environment) 

    def parse(self, parser): 
     tag = parser.stream.next() 
     body = parser.parse_statements(['name:endy'], drop_needle=True) 
     return nodes.Const("<!-- slurping: %s -->" % str(body)) 

env = Environment(
    loader  = FileSystemLoader('.'), 
    extensions = [YExtension], 
    ) 

print env.get_template('x.html').render() 

의 예상 출력 python y.py 결과 실행 다음 parse에서

avant-tag 
<!-- slurping: [Output(nodes=[TemplateData(data=u'\n tag-content '), 
    Add(left=Const(value=3), right=Const(value=5)), 
    TemplateData(data=u'\n ')])] --> 
sous-tag 

를 주형 y.html 주어진 예

, 방법, 다음 중 하나를 수행 할 수 있습니다.

  1. 유니 코드에 컴파일 bodytag-content 8); 또는 그 대신에
  2. body을 원래 소스 (즉, tag-content {{ 3 + 5 }})로 되 돌린다. 배경의 문제로

,이 문제는 이전의 두 질문에 관련 :

  1. Jinja2 compile extension after includes; 및
  2. Insert javascript at top of including file in Jinja 2

읽기 주셔서 감사합니다. 당신이 그 시점에서 사용할 수있는 컨텍스트를 가지고 있지 않기 때문에

브라이언

답변

1

는 유니 코드로 컴파일하면 parse() 방법은 아직 불가능하다. 당연히 해킹 할 수는 있지만 갈 수있는 최선의 방법은 아닐 것입니다.

단계는 일반적으로 html 파일에서 한 번만 실행되고 그 후에는 구문 분석 된 바이트 코드를 사용하여 템플릿을 렌더링합니다. 구문 분석 단계의 결과는 주어진 환경에서 렌더링 될 수 있습니다.

당신은 단순히 거기에 사용할 수있는 컨텍스트가, 그리고 ... 매우 어렵 거기 문맥을받지 않는

)

... 그러나 해킹이없는 것은 훨씬 더 쉽게 원본 소스를 얻을 수 있지만, 해킹하려면 당신이 {% raw %} 노드에서 value로 텍스트를 읽을 수 후

class YExtension(Extension): 
    tags = set(['y']) 

    def preprocess(self, source, name, filename=None): 
     # insert some code here that replaces '{% xyz %}foo bar{% endxyz %}' 
     # with something like: '{% xyz %}foo bar{% raw %}foo bar{% endraw %}{% endxyz %}' 
     return source 

)도 나쁘지 않다. 그 후에는 반드시 휴지통에 버리십시오. 그렇지 않으면 템플릿에 표시됩니다.

+0

감사 WoLpH. 나는 내 질문에 대답한다고 생각한다. 유일한 잔여 질문은 추출 된 결과를 환경으로 렌더링하는 방법이 있는지 여부입니다. –

+0

@Brian M. Hunt : 어떤 문자열을 렌더링 할 수 있으므로 문제가되지 않습니다. 'Environment.from_string()'또는'Template (nodes)'를 일반적으로 반환하는 것과 함께 사용할 수 있습니다. – Wolph

+0

아 맞다! 죄송합니다, 잘 모르겠습니다 ...유일하게 남아있는 질문은 추출 된 ** 노드 ** (텍스트가 아님)가 주어진 환경을 렌더링하는 방법이 있는지 여부입니다. –

관련 문제