[当我包含带有<#include ...>
指令的模板时,该模板的内容将从第0列开始插入,而不是从include
标记所在的位置插入。可以告诉FreeMarker遵守缩进吗?
您可以使用宏并将缩进作为参数传递给它们。例如,考虑以YAML格式构建课程列表,每个课程都有一个学生列表。
report.ftl:
<#include "course.ftl" parse=true>
<#include "faculty.ftl" parse=true>
<#include "student.ftl" parse=true>
<#list report as course>
<@newCourse course = course indent = 0/>
</#list>
course.ftl:
<#include "faculty.ftl" parse=true>
<#include "student.ftl" parse=true>
<#macro newCourse course indent>
<#local padding = ""?left_pad(4*indent)/>
${padding}course:
${padding} code: ${course.code}
${padding} name: ${course.name}
<@newFaculty code = "${course.faculty.code}" name = "${course.faculty.name}" indent = indent + 1/>
${padding} students:
<#list course.students as student>
<@newStudent code = "${student.code}" name = "${student.name}" indent = indent + 2/>
</#list>
</#macro>
faculty.ftl:
<#macro newFaculty code name indent>
<#local padding = ""?left_pad(4*indent)/>
${padding}faculty:
${padding} code: ${code}
${padding} name: ${name}
</#macro>
student.ftl:
<#macro newStudent code name indent>
<#local padding = ""?left_pad(4*indent)/>
${padding}- student:
${padding} code: ${code}
${padding} name: ${name}
</#macro>
pojos:
class Course {
private String code;
private String name;
private Faculty faculty;
private List<Student> students = new ArrayList<>();
}
class Faculty {
private String code;
private String name;
}
class Student {
private String code;
private String name;
}