【问题标题】:Define Freemarker EOL format (\n instead of \r\n)定义 Freemarker EOL 格式(\n 而不是 \r\n)
【发布时间】:2019-12-15 21:45:20
【问题描述】:

在我的 Spring 应用程序中,我使用 Freemarker 生成导出文件 - 带有标题的简单纯文本和循环 <#list></#list> 以呈现项目列表。

@Bean
public freemarker.template.Configuration freemarkerConfiguration() throws IOException, TemplateException {
    return new FreeMarkerConfigurationFactoryBean().createConfiguration();
}

// ...

Template template = getFreemarkerTemplate();
Writer fileWriter = getFileWriter(outputFile);

template.process(getExportData(), writer);

// flush and close writer, some additional business logic

我想将当前 Windows \r\n (CRLF) 的行尾格式设置为 Unix \n (LF)

我实际尝试过但不喜欢或不起作用的方法

  • 使用 Notepad++ 手动转换 .ftl 文件 EOL - 我不想用许多编辑器处理我的源文件,还有 IntelliJ Git 插件将 EOL 转换为 CRLF - 即使我会修改这个,也不能保证我的队友会这样做,也可能是其他地方的问题
  • 在每一行的末尾添加<#rt>${'\n'} - 它只是污染了我的代码,开发人员必须记得在模板更改时添加它
  • 添加<#assign str = str?replace(...) - 似乎不可能,因为此替换仅适用于变量,而不是当前整个文件,并且我没有找到将模板呈现为变量的方法(我可以创建然后包装更改 EOL,但老实说,这看起来也不是一个好的解决方案)

是否有任何全局方法来设置 EOL 格式,而无需手动和单独操作每个 .ftl?

【问题讨论】:

  • 为什么?您需要一个自定义编写器,它将任何变化的序列转换为 Unix 格式。
  • 仅为此目的编写自定义编写器听起来像是巨大的开销 - 在 ConfigurationTemplate 中有许多不同的设置,包括编码 - 老实说,我预计更改 EOL 格式将是单行的跨度>
  • 因为你已经提到了,你可以像这样捕获输出:<#assign output>...generate content here...</#assign>。但当然,这比在传递给 FreeMarker 的 Writer 中过滤要糟糕得多。

标签: java spring freemarker


【解决方案1】:

没有这样的配置选项(从 2.3.29 开始)。 FreeMarker 只是按原样输出模板的静态文本部分。尽管您不喜欢这种方法,但我相信最好的方法是在您传递给 FreeMarker 的 Writer 中执行此操作。在大多数应用程序中,其开销根本不重要。

另一个避免运行时开销的选项是在自定义TemplateLoader 中执行相同的操作,该TemplateLoader 包装了另一个TemplateLoader。但是,此类解决方案的问题在于,换行符有时来自模板外部(即来自数据模型),我认为用户也会期望这些换行符被规范化。

因此,即使它是 FreeMarker 的核心功能(我猜可能是),它也可能会即时执行此操作,就像您可以使用自定义 Writer 一样。

【讨论】:

  • 这很糟糕,但我能做些什么:) 现在我决定在每一行的末尾添加<#rt>${'\n'},因为对我来说,模板本身是对我的内容和方式的定义。想要生成数据。但是如果我的ftl 文件会变得更复杂,或者我会有更多的文件,我肯定会实现我自己的Writer。感谢您的帮助!
  • @ddekany,不,FreeMarker 有责任处理行尾。它是用户的。我会拒绝任何这样做的 PR。这样的作家最多可以登陆Commons IO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多