Estoy buscando un motor de plantilla simple que no emita errores de sintaxis. Lo que quiero decir con eso es que cada plantilla, por definición, debe tener una sintaxis válida. Si una variable o construcción de código no se puede resolver, simplemente debe imprimir el código roto en lugar de cancelar la representación.
La razón por la que quiero hacer eso es porque quiero usarlos en un contexto donde los usuarios avanzados pueden ajustar sus propias plantillas, pero es muy difícil para mí comunicarles los errores.
En este momento estoy usando un poco de búsqueda avanzada y reemplazo de tokens que funciona muy bien pero no admite bucles ni declaraciones if. Me gustaría tener un lenguaje de plantilla simple que permita declaraciones if y loop muy simples.
¿Conoces algún motor de plantillas que pueda hacer eso en Java?
Ejemplo A
Modelo:
My template <h1>{title}</h1> <p>{message}</p> <ul> {foreach items as item} <li>{item.value}</li> {/foreach} </ul>Datos:
{ "title": "Hello World", "items": [ { "value": "foo" }, { "value": "bar" } ] }Resultado:
My template <h1>Hello World</h1> <p>{message}</p> <ul> <li>foo</li> <li>bar</li> </ul>Ejemplo B
Modelo:
My template <h1>{title}</h1> <p>{message}</p> <ul> {foreach items <li>{item.value</li> {/foreach} </ul>Datos:
{ "title": "Hello World", "message": "Test", "items": [ { "value": "foo" }, { "value": "bar" } ] }Resultado:
My template <h1>Hello World</h1> <p>Test</p> <ul> {foreach items <li>{item.value</li> {/foreach} </ul>Editar:
De hecho, escribí mi propio motor de plantilla simple y funcionó. Elijo una sintaxis similar a xml donde si las declaraciones y los bucles siempre se nombran. Por ejemplo {for_cars} & {/for_cars} y {if_loggedIn} & {/if_loggedIn} , lo que facilitó la reparación de errores. Pero al final opté por un diseño más simple en el que simplemente dividí la plantilla en varias plantillas más pequeñas e implementé los bucles y las declaraciones if alrededor de las plantillas en el código. Las plantillas ahora solo admiten variables pero no lógica. De esa manera, los usuarios tienen menos opciones para equivocarse, lo que creo que lo convierte en un diseño de usuario mucho más sólido.
El motor Apache Velocity Template puede manejar el Ejemplo A: uno o más parámetros no especificados cuando la plantilla es sintácticamente correcta. La plantilla se verá como a continuación en la velocidad:
My template <h1>${title}</h1> <p>${message}</p> <ul> #foreach( $item in $items ) <li>${item.value}</li> #end </ul>Y la salida será como a continuación:
My template <h1>Hello World</h1> <p>${message}</p> <ul> <li>foo</li> <li>bar</li> </ul> Pero no pudo analizar la plantilla cuando eliminé el paréntesis de cierre de la línea foreach . Y estoy de acuerdo con Konrad en que, si bien se puede usar un marco de plantillas para manejar plantillas avanzadas, es posible que no haya ningún marco que pueda evaluar selectivamente solo las partes válidas de una plantilla e incluso si las hay, comunicar los errores a los usuarios. podría ser lo correcto