parsing - 从 jinja2 ast 生成代码
问题描述
假设我有一个 jinja 模板
<style>
p{
font-family : 'Times New Roman',Times,serif;
font-size:15px;
}
</style>
<p>------- Information -------- </p>
{% set p1 = getP1('dataset') %}
<table style='width:100%'>
<tr>
<th>Information</th>
</tr>
<tr>
<td>A</td>
<td>{{p1.a}}</td>
</tr>
<tr>
<td>B</td>
<td>{{p1.b}}</td>
</tr>
<tr>
<td>C</td>
<td>{{p1.c}}</td>
</tr>
</table>
我可以将带有 jinja2 的代码解析为 jinja2 模板,其中代码是我在上面粘贴的字符串。
In [58]: from jinja2 import Environment
In [59]: env = Environment()
In [60]: m = env.parse(code)
In [61]: m
Out[61]: Template(body=[Output(nodes=[TemplateData(data=u"\n<style>\np{\n\tfont-family : 'Times New Roman',Times,serif;\n\tfont-size:15px;\n}\n</style>\n\n<p>------- Information -------- </p>\n\n")]), Assign(target=Name(name='p1', ctx='store'), node=Call(node=Name(name='getP1', ctx='load'), args=[Const(value=u'dataset')], kwargs=[], dyn_args=None, dyn_kwargs=None)), Output(nodes=[TemplateData(data=u"\n\n<table style='width:100%'>\n\t<tr>\n\t\t<th>Information</th>\n\t</tr>\n\t<tr>\n\t\t<td>A</td>\n\t\t<td>"), Getattr(node=Name(name='p1', ctx='load'), attr='a', ctx='load'), TemplateData(data=u'</td>\n\t</tr>\n\t<tr>\n\t\t<td>B</td>\n\t\t<td>'), Getattr(node=Name(name='p1', ctx='load'), attr='b', ctx='load'), TemplateData(data=u'</td>\n\t</tr>\n\t<tr>\n\t\t<td>C</td>\n\t\t<td>'), Getattr(node=Name(name='p1', ctx='load'), attr='c', ctx='load'), TemplateData(data=u'</td>\n\t</tr>\n</table>')])])
如何将模板转换回代码?
对于 python 代码,我们有像astor这样的包。根据这个问题,jinja2 不支持该功能!那么我该如何编写代码来做到这一点?
解决方案
推荐阅读
- python - 如何获取在 InMemoryUploadedFile django 中上传的文件
- terraform - 您如何访问地图列表中的值?
- parsing - ReadP 在返回空结果之间
- javascript - Joi,根据数组长度验证不同的数组模式
- javascript - puppeteer 中的页面选择器奇怪行为
- html - 使用 CSS 将动画文本放在背景中?
- function - 如何从单个操作中获得多个输出?
- angular - 如何在下载前预览服务器上的文件?出现错误:不允许加载本地资源:blob
- c++ - C++编译时检查模板类型中是否存在方法
- string - 如何替换批处理文件中字符串中每次出现的=