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
주어진 예
, 방법, 다음 중 하나를 수행 할 수 있습니다.
- 유니 코드에 컴파일
body
tag-content 8
); 또는 그 대신에 body
을 원래 소스 (즉,tag-content {{ 3 + 5 }}
)로 되 돌린다. 배경의 문제로
,이 문제는 이전의 두 질문에 관련 :
읽기 주셔서 감사합니다. 당신이 그 시점에서 사용할 수있는 컨텍스트를 가지고 있지 않기 때문에
브라이언
감사 WoLpH. 나는 내 질문에 대답한다고 생각한다. 유일한 잔여 질문은 추출 된 결과를 환경으로 렌더링하는 방법이 있는지 여부입니다. –
@Brian M. Hunt : 어떤 문자열을 렌더링 할 수 있으므로 문제가되지 않습니다. 'Environment.from_string()'또는'Template (nodes)'를 일반적으로 반환하는 것과 함께 사용할 수 있습니다. – Wolph
아 맞다! 죄송합니다, 잘 모르겠습니다 ...유일하게 남아있는 질문은 추출 된 ** 노드 ** (텍스트가 아님)가 주어진 환경을 렌더링하는 방법이 있는지 여부입니다. –