如何从模板中删除换行符?

How to remove a newline from template?

这是我在 Google Group 中的问题的转贴。希望我能在这里得到一些回应。

我经常 运行 遇到这个问题。如果文本不为空,我想生成一行文本。如果为空,则不生成该行。插图模板:

namespace @classSpec.getNamespace()

@classSpec.getComment()
class @classSpec.getName() {
  ...
}

如果@classSpec.getComment() returns有意义的评论文字,结果看起来像

namespace com.example

// this is comment
class MyClass {
  ...
}

但是如果没有评论,就会

namespace com.example


class MyClass {
  ...
}

注意到多余的空行了吗?我不想要这个。目前的解决方案是将模板编写为

namespace @classSpec.getNamespace()

@classSpec.getComment()class @classSpec.getName() {
  ...
}

并确保 getComment() 会将“\n”附加到 return 值。这使得模板的可读性大大降低。另外,假设我需要在 for 循环中生成一个具有多个参数的函数。如果每个参数都需要复杂的模板代码逻辑,我需要像上面那样把它们都写在一行中。否则,结果文件将具有类似

的功能
function myFunction(
  String stringParam,
  Integer intParam,
  Long longParam
)

核心问题是,模板文件不仅包含脚本,还包含输出中要写入的原始文本。对于脚本部分,我们需要换行符和缩进。我们希望 space 像编译器通常所做的那样被修剪。但是对于原始文本,我们希望 spaces 与文件中指定的完全一样。我觉得我们需要更多的原始文本控制机制来协调这两个部分。

具体到这种情况,是否有一些特殊符号将输出中的多行视为单行?例如,如果我们可以写

namespace @classSpec.getNamespace()

@classSpec.getComment()\
class @classSpec.getName() {
  ...
}

谢谢!

这只是一个已知错误,请参阅

不幸的是,目前还没有合适的解决方法。您可能希望将您的评论添加到上面的错误并引用您的问题。

以下面的示例为例,您可以在 http://fiddle.rythmengine.org/#/editor

上试用
@def setXTimesY(int x,int y) { @{ int result=x*y;} @(result)}
1
2 a=@setXTimesY(2,3)
3 b=@setXTimesY(3,5)
4 c=@setXTimesY(4,7)
5

这将正确创建输出:

1
2 a= 6
3 b= 15
4 c= 28
5

现在尝试美化@def setXTimesY ...

@def setXTimesY(int x,int y) { 
@{ 
  int result=x*y;
}@(result)}
1
2 a=@setXTimesY(2,3)
3 b=@setXTimesY(3,5)
4 c=@setXTimesY(4,7)

会给出错误的结果

1 2 a=(结果) 3 b=(结果) 4 c=(结果)

@def setXTimesY(int x,int y) { 
@{ 
  int result=x*y;
} @(result)}
1
2 a=@setXTimesY(2,3)
3 b=@setXTimesY(3,5)
4 c=@setXTimesY(4,7)

更好,但增加了 space

所以

是另一个类似的错误

我遇到了同样的问题。我一直无法在自己的节奏中找到解决方案。

为了在处理模板中的多行后获得一行,我必须以 post 处理的形式实现我自己的机制。在模板中,在我想加入下一行的每一行的末尾,我使用自定义 symbol/tag 作为标记。然后,一旦处理完模板,我就将 symbol/tag 连同紧随其后的换行符替换为空字符串。

例如,如果您使用名为“#join-next-line#”的标签,模板将如下所示:

@for (Bar bar : foo.getBars()).join (", ") {
@bar.name#join-next-line#
}

这不是完美的解决方案,但对我有用。