【发布时间】:2021-12-16 02:09:36
【问题描述】:
我正在寻找一个不会发出语法错误的简单模板引擎。我的意思是,根据定义,每个模板都应该有一个有效的语法。如果无法解析变量或代码构造,则应简单地打印出损坏的代码,而不是中止渲染。
我想这样做的原因是因为我想在高级用户可以调整自己的模板但我很难将错误传达给他们的环境中使用它们。
现在我正在使用一些高级搜索和替换标记,效果很好,但不支持循环和 if 语句。我想要一种简单的模板语言,允许非常简单的 if 和循环语句。
您知道任何可以在 Java 中执行此操作的模板引擎吗?
示例 A
模板:
My template <h1>{title}</h1>
<p>{message}</p>
<ul>
{foreach items as item}
<li>{item.value}</li>
{/foreach}
</ul>
数据:
{
"title": "Hello World",
"items": [
{
"value": "foo"
},
{
"value": "bar"
}
]
}
结果:
My template <h1>Hello World</h1>
<p>{message}</p>
<ul>
<li>foo</li>
<li>bar</li>
</ul>
示例 B
模板:
My template <h1>{title}</h1>
<p>{message}</p>
<ul>
{foreach items
<li>{item.value</li>
{/foreach}
</ul>
数据:
{
"title": "Hello World",
"message": "Test",
"items": [
{
"value": "foo"
},
{
"value": "bar"
}
]
}
结果:
My template <h1>Hello World</h1>
<p>Test</p>
<ul>
{foreach items
<li>{item.value</li>
{/foreach}
</ul>
编辑:
实际上,我编写了自己的简单模板引擎,并且成功了。我选择了一个类似于 xml 的语法,其中 if 语句和循环总是被命名。例如 {for_cars} & {/for_cars} 和 {if_loggedIn} & {/if_loggedIn} 这使得修复错误更容易。但最后我选择了一个更简单的设计,我简单地将模板拆分为多个较小的模板,并在代码中围绕模板实现循环和 if 语句。模板现在只支持变量但不支持逻辑。这样一来,用户出错的选择就更少了,我认为这使它成为一种更强大的用户设计。
【问题讨论】:
-
我强烈建议您重新考虑您的方法:容错 API 是 very bad idea。在最坏的情况下,它使安全漏洞的可能性更大;但即使在最好的情况下,它也会使开发变得令人沮丧和脆弱。尝试找到一个侧通道来将错误传达给用户,或者创建一个用户可以依赖的单独的语法检查器。