避免在Groovy模板中使用新的折线

时间:2019-07-19 23:55:57

标签: templates groovy template-engine gstring

我有YAML file,其配置名称为 applications.yaml ,该数据将成为我的绑定:

applications:
- name: service1
  port: 8080
  path: /servier1
- name: service2
  port: 8081
  path: /service2

然后我有一个模板文件 applications.config

<% applications.each { application ->  %>
ApplicationName: <%= application.name %>
<% } $ %>

将所有内容放在一起:

@Grab('org.yaml:snakeyaml:1.17')
import org.yaml.snakeyaml.Yaml

Yaml parser = new Yaml()
Map data = parser.load(("applications.yaml" as File).text)

String template_content = new File('applications.config').text
def binding = [applications: data.applications]

def template = new groovy.text.GStringTemplateEngine().createTemplate(template_content).make(binding)
println template.toString()

现在的问题是:该过程的输出是:


ApplicationName: service1

ApplicationName: service2

但是我想要这个:

ApplicationName: service1
ApplicationName: service2

我不知道为什么那里有多余的空格。我想删除这些,但看不到如何,何时或以何种方式放置这些新行或破折行

谢谢。

3 个答案:

答案 0 :(得分:1)

例如从notepad ++(JSP语言)查看模板:

enter image description here

第一行<% applications.each { application -> %>的末尾有一个CRLF,它将在每个Application

之前打印出来

,然后在下一行中另外CRLFApplication之后打印。

因此,每两个应用之间都有两个CRLF

答案 1 :(得分:1)

我观察到的(通过回答,评论和实践)是:我们在文件new Lines中创建的所有applications.config被认为是new line输出。正如 daggett 所说,这是默认情况。

因此,在这里我只想显示可能的config文件格式,可以按照您的要求在其中应用conditional logic,对我来说还不错。例如:if()

application.config:

<% applications.each { application ->
 if (application.valid) {%>\
Type :<%=application.valid%>
ApplicationName:<%=application.name%>
Path:<%=application.path%>
Port:<%=application.port%>
<%} else{%>\
--------------------
Found invalid Application : <%= application.name %>
--------------------\
<%}}%>

application.yaml

applications:
- name: service1
  port: 8080
  path: /servier1
  valid: true
- name: service2
  port: 8081
  path: /service2
  valid: false

code.groovy

@Grab('org.yaml:snakeyaml:1.17')
import org.yaml.snakeyaml.Yaml

Yaml parser = new Yaml()
Map data = parser.load(("applications.yaml" as File).text)

String template_content = new File('applications.config').text

def binding = [applications: data.applications]
def template = new groovy.text.GStringTemplateEngine().createTemplate(template_content).make(binding)
println template.toString()

输出:

Type :true
ApplicationName:service1
Path:/servier1
Port:8080
--------------------
Found invalid Application : service2
--------------------

答案 2 :(得分:0)

避免换行的唯一方法是按如下所示修复模板

<% applications.each { application ->  %>ApplicationName: <%= application.name %>
<% } $ %>

结果

$ groovy test.groovy
ApplicationName: service1
ApplicationName: service2

或在下面的代码中处理换行符

@Grab('org.yaml:snakeyaml:1.17')
import org.yaml.snakeyaml.Yaml

Yaml parser = new Yaml()
Map data = parser.load(("applications.yaml" as File).text)

String template_content = new File('applications.config').text
def binding = [applications: data.applications]

def template = new groovy.text.GStringTemplateEngine().createTemplate(template_content).make(binding)
def output = template.toString().replaceAll(/^\n|\n$/, "").replaceAll(/\n{2,}/,"\n")
println output

结果

$ groovy test.groovy
ApplicationName: service1
ApplicationName: service2