在FreeMarker中包含模板时保留缩进

问题描述 投票:0回答:1

[当我包含带有<#include ...>指令的模板时,该模板的内容将从第0列开始插入,而不是从include标记所在的位置插入。可以告诉FreeMarker遵守缩进吗?

freemarker
1个回答
0
投票

您可以使用宏并将缩进作为参数传递给它们。例如,考虑以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;  
}
© www.soinside.com 2019 - 2024. All rights reserved.