Как сохранить форматирование пробелов (вкладок) с помощью Apache Velocity 1.7?
Я использую Velocity для создания различных артефактов в моем проекте, в том числе Java Hibernate Entities.
Вот пример моего шаблона:
#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);
2 ответа
##
в конце строки не достаточно, вам также нужно удалить отступ Velocity.
Альтернатива для сохранения отступа заключается в добавлении отступа к комментариям Velocity:
#foreach( $column in $columns )##
#**##if ($column.columnID != "id")##
#* *##if ($column.isColumnAnIdentifier)##
@Id
#* *##end
#* *##if ($column.isColumnValueGenerated)##
...
но я признаю, что это довольно некрасиво.
В готовящемся выпуске Velocity 2.0 добавлена опция "Космическое поглощение", активная по умолчанию, которая делает именно то, что вы хотите. Последний релиз кандидата доступен здесь.
Я храню свои файлы без каких-либо отступов, добавляя их при редактировании и удаляя их впоследствии. Вам нужно будет запустить это на Linux или Cygwin:
Безопасно идентифицируйте ведущие инструкции скорости:
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($0);
if($0 ~ /^ *#(if|foreach|else)\>/) p = p " "; next;}
1'
Удалить отступы:
sed 's/^ #/#/'
Если вы рассказываете их как сценарии (и используете vi/vim), вы можете использовать:
:%!VelocityIndent
... в противном случае просто передайте файл через скрипт.