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)
一种解决方案是,将前导空格作为参数提交给宏,但这使得模板更难以理解.有更好的解决方案吗?
似乎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)