Saltar al contenido

FreeMarker: mantenga la identificación al usar macros

Solución:

Parece que docAsComment siempre se invoca en el mismo nivel de sangría en el código generado. Podría hornear esa sangría en la macro.

Si la sangría del comentario es variable, tendrá que pasar el nivel de sangría. No entiendo su comentario acerca de que hace que la plantilla sea más difícil de leer. Eso lo hace hacer que la macro sea un poco más complicada.

La invocación se vería así:

<@docAsComment class.doc 1/>

Macro cambiaría a algo como esto:

<#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>

No está tan mal, de verdad. Puede hacer que la macro sea un poco más fácil de leer al sangrarla:

<#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>

Hoy, es posible utilizar <#nt>. La documentación de espacios en blanco dice lo siguiente al respecto:

La eliminación de espacios en blanco se puede desactivar para una sola línea con la directiva nt (para No Trim).

Según el registro de cambios V2.3, en versiones anteriores, las líneas que contienen solo etiquetas FTL se recortan, con la excepción de <#include> y directivas personalizadas (como <@macroname>). Pero en V2.3 cambiaron este comportamiento para SIEMPRE recortar tales líneas. Entonces, cuando use su macro, puede poner <#nt> en la línea para evitar recortes y, por lo tanto, mantener la muesca.

<#macro test>
...<#t>
</#macro>

Example:
   - <@test /><#nt>

da el resultado:

Example:
   - ...

Puedes ver, en la macro, definí <#t>, esto se debe a que la nueva línea desde el interior de la macro no se recortará y siempre daría una nueva línea donde <@macro> , así que en una parte, recortamos el espacio en blanco, y en la otra parte, ¡lo mantenemos!

Editar:

Vale la pena mencionar que, por alguna razón, este solo funciona para una línea. Si tiene varias líneas en su macro, solo mantiene la sangría para la primera línea. Hasta ahora no he encontrado una solución para esto, pero creé un problema en Freemarker JIRA para esto.

Ejemplo:

<#macro test>
...
wow
</#macro>

Example:
   - <@test><#nt>

resultará en:

Example:
   - ...
wow
¡Haz clic para puntuar esta entrada!
(Votos: 1 Promedio: 5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *