Freemarker模板的双重继承(子扩展父扩展父)



在Freemarker中,如何创建一个从自身继承的模板继承的模板?

单一继承适用于<#nested>标记:

文件base.ftl:

<#macro layout>
<html lang="en">
<head>...</head>
<body>
<div>... (navigation bar)</div>
<div class="container">
<#nested>
</div>
</body>
</html>
</#macro>

文件normalBase.ftl:

<#import "base.ftl" as base>
<@base.layout>
<div class="row">
<div class="col-md-9">
${content.body}
</div>
<div class="col-md-3">
<p>Latest releases</p>
<ul>....</ul>
</div>
</div>
</@base.layout>

如何将其转换为双重继承,其中useCaseBase.ftl扩展了normalBase.ftl,而base.ftl又扩展了?

这就像一个魅力:

文件base.ftl:

<#macro layout>
<html lang="en">
<head>...</head>
<body>
... // Shared navigation bar
<div class="container">
<#nested>
</div>
... // Shared footer
</body>
</html>
</#macro>
<@layout>
${content.body}
</@layout>

文件normalBase.ftl:

<#import "base.ftl" as parent>
<#macro layout>
<@parent.layout>
<div class="row">
<div class="col-md-9">
<#nested>
</div>
<div class="col-md-3">
... // Shared sidebar
</div>
</div>
</@parent.layout>
</#macro>
<@layout>
${content.body}
</@layout>

文件useCaseBase.ftl:

<#import "normalBase.ftl" as parent>
<@parent.layout>
${content.body}
... // Shared content between all use case pages
</@parent.layout>

现在我可以创建*.adoc页面,其中jbake-type设置为basenormalBaseuseCaseBase,并且它可以工作。

我尝试像Jinja2那样实现extendsblock

用于定义宏的CCD_ 17。

<#if !blocks??>
<#assign blocks = {} />
</#if>
<#macro extends ftl>
<#nested />
<#include ftl />
</#macro>
<#macro replace name>
<#local value>
<#nested />
</#local>
<#assign blocks += {name: value} />
</#macro>
<#macro block name>
<#if blocks[name]??>
<!-- replaced ${name} -->
${blocks[name]}
<#else>
<!-- default ${name} -->
<#nested />
</#if>
</#macro>

布局的base.ftl

<#import "extends.ftl" as layout />
<!DOCTYPE html>
<html>
<head>
<title>A demo of FreeMarker extends directive</title>
</head>
<body>
<@layout.block "message">
This is default message in base.ftl
</@layout.block>
</body>
</html>

最后,index.ftl是这样的:

<#import "extends.ftl" as layout />
<@layout.extends "base.ftl">
<@layout.replace "message">
This is the message from index.ftl
</@layout.replace>
</@layout.extends>

看看https://github.com/emesday/freemarker-extends。

最新更新