FreeMarker:使用宏时保持标识

kli*_*net 8 java code-generation freemarker

我正在使用FreeMarker模板引擎从Web服务的抽象描述中生成一些php类.我的问题是,当我在FreeMarker模板中调用一个宏时,宏在宏调用之前插入没有左手空格的文本.

exampleTemplate.ftl:

<?php
    class ${class.name} {
        <@docAsComment class.doc/>

        <#list class.fields as field>
        $${field.name};
        </#list>
        <#-- ... -->
    }
?>

<#macro docAsComment doc>
/*
<#if doc.title != "">
* ${doc.title}
</#if>
<#list doc.content as content>
<#if content != ""> * ${content}</#if>
</#list>
*/
</#macro>
Run Code Online (Sandbox Code Playgroud)

这将生成如下内容:

<?php
    class foo {
/*
 * foo
 * bar foo, bla
 */          

    $a;
    $b;
    }
?>
Run Code Online (Sandbox Code Playgroud)

一种解决方案是,将前导空格作为参数提交给宏,但这使得模板更难以理解.有更好的解决方案吗?

Cha*_*the 5

似乎docAsComment总是在代码生成中以相同的缩进级别调用.你可以将缩进法加入宏中.

如果注释的缩进是可变的,则必须传入缩进级别.我不明白你的评论使模板难以阅读.它确实使宏更复杂一些.

调用看起来像这样:

<@docAsComment class.doc 1/>
Run Code Online (Sandbox Code Playgroud)

宏将改为这样的事情:

<#macro docAsComment doc indent=1>
   <#local spc>${""?left_pad(indent * 4)}</#local>
${spc}/*
<#if doc.title != "">
${spc}* ${doc.title}
</#if>
<#list doc.content as content>
<#if content != "">${spc} * ${content}</#if>
</#list>
${spc}*/
</#macro>
Run Code Online (Sandbox Code Playgroud)

真是太糟糕了.您可以通过缩进来使宏更容易阅读:

<#macro docAsComment doc indent=1>
    <#local spc>${""?left_pad(indent * 4)}</#local>
    ${spc}/*<#lt>
    <#if doc.title != "">
        ${spc}* ${doc.title}<#lt>
    </#if>
    <#list doc.content as content>
        <#if content != "">${spc} * ${content}</#if><#lt>
    </#list>
    ${spc}*/<#lt>
</#macro>
Run Code Online (Sandbox Code Playgroud)