如何使用 Apache Velocity 1.7 保留模板空白(制表符)格式?
How to keep template whitespace (tabs) formatting using Apache Velocity 1.7?
我正在使用 Velocity 在我的项目中生成不同的工件,包括 Java Hibernate 实体。
这是我的模板示例:
#foreach( $column in $columns )
#if ($column.columnID != "id")
#if ($column.isColumnAnIdentifier)
@Id
#end
#if ($column.isColumnValueGenerated)
@GeneratedValue
#end
#if ($column.isColumnValueNotNull)
@NotNull
#end
#if ($column.columnAllowedValues)
@Enumerated(EnumType.STRING)
#end
#if ($column.isColumnValueUnique)
@Column(unique=true)
#elseif ($column.isColumnJoinedManyToOne)
@ManyToOne
@JoinColumn(name = "$column.columnJoinByID")
#else
@Column
#end
private #if ($column.columnAllowedValues) $column.columnID.toUpperCase() #else $column.columnType #end $column.columnID;
#end
#end
问题是生成的代码如下所示:
@Column
private String vendor;
@NotNull
@Column(unique=true)
private String name;
@Column
private Integer min_quantity;
@Column
private String description;
@Column
private Boolean active;
我尝试了建议的解决方案,在每行之后添加 ##,但没有帮助。有没有办法强制 Velocity 保留模板中定义的空白?
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.setProperty(RESOURCE_LOADER_PROPERTY, RESOURCE_LOADER_VALUE);
velocityEngine.setProperty(CLASSPATH_RESOURCE_LOADER_PROPERTY, ClasspathResourceLoader.class.getName());
velocityEngine.init();
Template velocityTemplate = velocityEngine.getTemplate(TEMPLATE_RESOURCES_ROOT_FOLDER + "/" + templateFileName);;
StringWriter writer = new StringWriter();
velocityTemplate.merge(velocityContext, writer);
writeToFile(writer, destinationFilePath);
行尾的##
不够,还需要去掉Velocity缩进。
另一种保留缩进的方法是使用 Velocity 注释进行缩进:
#foreach( $column in $columns )##
#**##if ($column.columnID != "id")##
#* *##if ($column.isColumnAnIdentifier)##
@Id
#* *##end
#* *##if ($column.isColumnValueGenerated)##
...
但我承认它很丑。
即将发布的 Velocity 2.0 版本添加了 space gobbling option, active by default, with does exactly what you want. The latest release candidate is available here。
我存储我的文件时没有任何缩进,编辑时添加它,然后删除它。您需要 运行 在 Linux 或 Cygwin 上执行此操作:
安全识别领先的 Velocity 指令:
gawk '
function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s }
BEGIN {p=""}
/^ *#(end|else)\>/ {p = substr(p,5)}
/^ *#(if|end|set|foreach|else|#)\>/ {
printf "%s%s\n", p, ltrim([=10=]);
if([=10=] ~ /^ *#(if|foreach|else)\>/) p = p " "; next;}
1'
删除缩进:
sed 's/^ #/#/'
如果您将这些故事作为脚本(并使用 vi/vim),那么您可以使用:
:%!VelocityIndent
...否则只需通过脚本传输文件。
我正在使用 Velocity 在我的项目中生成不同的工件,包括 Java Hibernate 实体。
这是我的模板示例:
#foreach( $column in $columns )
#if ($column.columnID != "id")
#if ($column.isColumnAnIdentifier)
@Id
#end
#if ($column.isColumnValueGenerated)
@GeneratedValue
#end
#if ($column.isColumnValueNotNull)
@NotNull
#end
#if ($column.columnAllowedValues)
@Enumerated(EnumType.STRING)
#end
#if ($column.isColumnValueUnique)
@Column(unique=true)
#elseif ($column.isColumnJoinedManyToOne)
@ManyToOne
@JoinColumn(name = "$column.columnJoinByID")
#else
@Column
#end
private #if ($column.columnAllowedValues) $column.columnID.toUpperCase() #else $column.columnType #end $column.columnID;
#end
#end
问题是生成的代码如下所示:
@Column
private String vendor;
@NotNull
@Column(unique=true)
private String name;
@Column
private Integer min_quantity;
@Column
private String description;
@Column
private Boolean active;
我尝试了建议的解决方案,在每行之后添加 ##,但没有帮助。有没有办法强制 Velocity 保留模板中定义的空白?
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.setProperty(RESOURCE_LOADER_PROPERTY, RESOURCE_LOADER_VALUE);
velocityEngine.setProperty(CLASSPATH_RESOURCE_LOADER_PROPERTY, ClasspathResourceLoader.class.getName());
velocityEngine.init();
Template velocityTemplate = velocityEngine.getTemplate(TEMPLATE_RESOURCES_ROOT_FOLDER + "/" + templateFileName);;
StringWriter writer = new StringWriter();
velocityTemplate.merge(velocityContext, writer);
writeToFile(writer, destinationFilePath);
行尾的##
不够,还需要去掉Velocity缩进。
另一种保留缩进的方法是使用 Velocity 注释进行缩进:
#foreach( $column in $columns )##
#**##if ($column.columnID != "id")##
#* *##if ($column.isColumnAnIdentifier)##
@Id
#* *##end
#* *##if ($column.isColumnValueGenerated)##
...
但我承认它很丑。
即将发布的 Velocity 2.0 版本添加了 space gobbling option, active by default, with does exactly what you want. The latest release candidate is available here。
我存储我的文件时没有任何缩进,编辑时添加它,然后删除它。您需要 运行 在 Linux 或 Cygwin 上执行此操作:
安全识别领先的 Velocity 指令:
gawk '
function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s }
BEGIN {p=""}
/^ *#(end|else)\>/ {p = substr(p,5)}
/^ *#(if|end|set|foreach|else|#)\>/ {
printf "%s%s\n", p, ltrim([=10=]);
if([=10=] ~ /^ *#(if|foreach|else)\>/) p = p " "; next;}
1'
删除缩进:
sed 's/^ #/#/'
如果您将这些故事作为脚本(并使用 vi/vim),那么您可以使用:
:%!VelocityIndent
...否则只需通过脚本传输文件。