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

时间:2015-05-05 23:15:32

标签: template-engine rythm

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

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

namespace @classSpec.getNamespace()

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

如果@ classSpec.getComment()返回有意义的注释文本,结果看起来像

namespace com.example

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

但如果没有评论,那将是

namespace com.example


class MyClass {
  ...
}

注意额外的空行?我不想要这个。目前解决方案是将模板编写为

namespace @classSpec.getNamespace()

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

并确保getComment()会在返回值后附加“\ n”。这使得模板的可读性更低。另外,想象一下我需要在for循环中生成一个带有多个参数的函数。如果每个参数都需要复杂的模板代码逻辑,我需要将它们全部写成如上所述的一行。否则,结果文件将具有类似

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

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

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

一样
namespace @classSpec.getNamespace()

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

请参阅下面的示例,您可以在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)

更好,但增加了一个空格

所以

是同一行的另一个错误

答案 1 :(得分:0)

我遇到了同样的问题。我在自己的Rythm中找不到解决方案。

为了在模板中处理多行而获得单行,我必须以后处理的形式实现我自己的机制。在模板中,在我想要加入下一行的每一行的末尾,我使用自定义符号/标记作为标记。然后,一旦处理完模板,我就用一个空字符串替换那个符号/标记以及紧跟在它之后的换行符。

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

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

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