首页 > 解决方案 > 使用 FreeMarker 包含模板时保持缩进

问题描述

当我包含一个带有<#include ...>指令的模板时,该模板的内容从第 0 列开始插入,而不是include标签所在的位置。是否可以告诉 FreeMarker 尊重缩进?

标签: freemarker

解决方案


您可以使用宏并将缩进作为参数传递给它们。例如,考虑构建一个 YAML 格式的课程列表,其中每个课程都有一个学生列表。

报告.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>

课程.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>

教师.ftl:

<#macro newFaculty code name indent>
    <#local padding = ""?left_pad(4*indent)/>
${padding}faculty:
${padding}    code: ${code}
${padding}    name: ${name}
</#macro>

学生.ftl:

<#macro newStudent code name indent>
    <#local padding = ""?left_pad(4*indent)/>
${padding}- student:
${padding}    code: ${code}
${padding}    name: ${name}
</#macro>

宝约:

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;  
}

推荐阅读