在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
发布于 2021-05-19 00:12:44
这就像一种魅力:
文件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
设置为base
、normalBase
或useCaseBase
,并且它可以工作。
发布于 2022-11-22 22:05:00
我试图实现extends
和block
,比如Jinja2。
用于定义宏的extends.ftl
。
<#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://stackoverflow.com/questions/67598981
复制相似问题