首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >共济会模板双重继承(子扩展父母扩展祖父母)

共济会模板双重继承(子扩展父母扩展祖父母)
EN

Stack Overflow用户
提问于 2021-05-19 07:46:57
回答 2查看 92关注 0票数 0

在Freemarker中,如何创建从其本身继承的模板继承的模板?

单继承可以很好地处理<#nested>标记:

文件base.ftl

代码语言:javascript
运行
复制
<#macro layout>
<html lang="en">
  <head>...</head>
  <body>
    <div>... (navigation bar)</div>
    <div class="container">
      <#nested>
    </div>
  </body>
</html>
</#macro>

文件normalBase.ftl

代码语言:javascript
运行
复制
<#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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-19 08:12:44

这就像一种魅力:

文件base.ftl

代码语言:javascript
运行
复制
<#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

代码语言:javascript
运行
复制
<#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

代码语言:javascript
运行
复制
<#import "normalBase.ftl" as parent>

<@parent.layout>
    ${content.body}
    ... // Shared content between all use case pages
</@parent.layout>

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

票数 0
EN

Stack Overflow用户

发布于 2022-11-23 06:05:00

我试图实现extendsblock,比如Jinja2。

用于定义宏的extends.ftl

代码语言:javascript
运行
复制
<#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

代码语言:javascript
运行
复制
<#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

代码语言:javascript
运行
复制
<#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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67598981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档