Giter8: 具有包含内插字符串的模板文件时的解析问题

创建于 2013-03-15  ·  23评论  ·  资料来源: foundweekends/giter8

请尝试g8 etorreborre/etorreborre/specs2-scala-2.10.g8

你应该有这样的错误:

action parse error; template context is [anonymous]
line 1:1: unexpected token: e1
    at org.antlr.stringtemplate.language.ActionParser.primaryExpr(ActionParser.java:813)
    at org.antlr.stringtemplate.language.ActionParser.expr(ActionParser.java:539)
    at org.antlr.stringtemplate.language.ActionParser.templatesExpr(ActionParser.java:222)
    at org.antlr.stringtemplate.language.ActionParser.action(ActionParser.java:126)
    at org.antlr.stringtemplate.StringTemplate.parseAction(StringTemplate.java:876)
    at org.antlr.stringtemplate.language.TemplateParser.action(TemplateParser.java:162)
    at org.antlr.stringtemplate.language.TemplateParser.template(TemplateParser.java:127)
    at org.antlr.stringtemplate.StringTemplate.breakTemplateIntoChunks(StringTemplate.java:850)
    at org.antlr.stringtemplate.StringTemplate.setTemplate(StringTemplate.java:441)
    at org.antlr.stringtemplate.StringTemplate.<init>(StringTemplate.java:308)
    at org.antlr.stringtemplate.StringTemplate.<init>(StringTemplate.java:293)
    at org.clapper.scalasti.adapter.ScalastiStringTemplate.<init>(ScalastiStringTemplate.java:57)
    at org.clapper.scalasti.StringTemplate.<init>(StringTemplate.scala:101)
...
Documentation

最有用的评论

您可以使用$"$"$组合来解决此问题。

例如在 Scala 中:
s"$var" -> s"$"$"$var"

所有23条评论

我对包含涉及“$”的正则表达式的文件有同样的问题。

我认为 $ 可以逃脱。 尝试了 \$ 和 $$ 没有成功。

在修复此问题之前,我糟糕的解决方法是将其包含在代码中:

  // This is to work around a parsing issue in giter8 - replace inlined dollar signs
  val DOLLAR = (0x24).toChar

接着:

  When("""^I retrieve the result""" + DOLLAR) { () =>

对于包含...的 HTML 文件,它也会失败。

$(function() {

即使写成:

\$(function() {

幸运的是,这次也可以找到解决方法:

jQuery(function() {

虽然我更喜欢“$”形式。

我有另一种解决方法。 在default.properties文件中定义dollar=$ 。 然后在您的模板中使用When("""^I retrieve the result""" + $dollar$)

你测试了吗? 我只是在解析default.properties文件并提出问题时收到unexpected char: '$'错误。

这绝对对我有用,但我最近没有尝试过。

您可以使用$"$"$组合来解决此问题。

例如在 Scala 中:
s"$var" -> s"$"$"$var"

使用 AngularJs 的 javascript 模板会变得非常难看。 以及 Maven 属性、checkstyle 和 scalastyle xmls。

解析器应该向前寻找一个完整的 $var$ 模式,其中 var 不能有空格、换行符和任何在 var 名称中没有意义的字符。

如果没有修复,看起来美元是一个不幸的转义选择,而不是 {{ }}, <% %>, ?> 什么的。 占位符的位置很少,但在不同的上下文中可能有很多用于美元的位置。

我也会更改标题,因为它比插入字符串更普遍。

我可以改变模板引擎的行为来解决这个问题,但是有
有几种可能的解决方案:

  • 转义$\$$$ 。 但这不允许独立开发模板,这是我想实现的。
  • 将变量名称限制为[a-zA-Z_-] ,这可能会破坏一些现有模板,并且在某些情况下不起作用(例如,如果模板包含println(s"$name_$foo") )。
  • 查找现有属性并忽略未知变量。 但我们至少应该通知用户。

我个人更喜欢带有可选转义的第二种解决方案。

对于 Pamflet,我一直使用\$来逃避。 我想知道这是否是 Pamflet 特有的,或者是否对 StringTemplate 进行了一些更改。

\$对我有用。
也许这就是我用文档标记这个问题的原因。

转义的问题是,比如我想单独开发模板。

我创建了my-template.g8/src/main/g8/src/main/$package$/Main.scala并且我想要
my-template.g8/src/main/g8创建 IDEA 项目,以便能够对其进行编辑和编译。

但如果我想写:

package $package$

object Main extends App {
  val foo = "foo"
  val bar = "bar"
  println(s"\$foo\$bar") // I need to escape this
}

内部项目将无法正常工作。 与.gitignore.idea文件夹相同。

@foxmk我认为这是一个与这里报道的完全不同的问题。 Eric 报告了“动作解析错误;模板上下文是 [匿名]”。

嗨,我最近也在尝试使用 giter8 创建一个模板,其中包含 sh 文件,这些文件将提供示例命令以使用正确的参数启动 docker 容器,因此有很多用$VAR定义的环境变量

$"$"$不再起作用,上面的其他解决方案也不起作用。 很可惜在这样的项目中看到这样一个孩子的问题。

我认为 #3 是正确的解决方案:

查找现有属性并忽略未知变量。 但我们至少应该通知用户。

用各种转义来污染整个源代码是没有意义的,而唯一的替换仅限于一个非常小的集合......

这假设文件default.properties是强制性的,并且它包含所有可替换的名称及其默认值。

使用\$转义对我来说使用 sbt 0.13.15 应该使用 Giter8 0.7.2

FWIW:我在 sbt 0.13.16 sbt-giter8 0.9.0 上遇到了这个问题; 不知道如何转义“$”

似乎有一个确定的正确解决方案(例如,如果在 build.properties 中没有指定令牌,那么不要试图找到收盘价)这是一个困难的改变吗? 如果是这样,人们会在哪里寻找呢?

FWIW,我相信我看到\$$"$"$在使用 atm、SBT 1.1.0 和 Giter8 0.11.0-M2

拥有更智能的行为会很棒,例如自动转义未定义的变量或缺少结束 $ 符号时。

嗨,我最近也在尝试使用 giter8 创建一个模板,其中包含 sh 文件,这些文件将提供示例命令以使用正确的参数启动 docker 容器,因此有很多用$VAR定义的环境变量

我认为逐字逐句可以解决这里。

由于问题标题是Parsing issue when having template files including interpolated strings并且,就像在上面的例子中一样,像\$这样的转义美元与当前版本0.13.1完美配合(见截图),我认为唯一剩下的就是正在将此详细信息添加到文档中。 我会尽快写PR。

image
image

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

taylorleese picture taylorleese  ·  20评论

sebastianvoss picture sebastianvoss  ·  3评论

laur89 picture laur89  ·  9评论

tarruda picture tarruda  ·  4评论

timnovis picture timnovis  ·  7评论