2011-12-13 7 views
7

Acabo de enterarme de que con la velocidad de apache las directivas también se suman a los espacios en blanco.directivas de velocidad agregan espacios en blanco también?

Así, por ejemplo:

#foreach ($record in $rows) 
#foreach($value in $record) 
$value 
#end 

#end 

Con algo como esto me acaban de conseguir líneas adicionales para los #foreach declaraciones, las declaraciones #end, etc.

Esto no es lo que quiero, así que descubrí que podía bloque de comentarios al final de las líneas, así:

#foreach ($record in $rows)#* 
*##foreach($value in $record)#* 
*#$value #* 
*##end 

#end 

Pero esto es bastante feo para leer. ¿Hay alguna forma de decirle al motor de velocidad que no formatee mis directivas?

¿Tal vez estoy haciendo algo más mal?

Gracias.

+0

Eso es algo que siempre me molesta con Velocity: lo uso para generar Java, así que puedo formatearlo en mi IDE después de la generación. JET (plantillas de emisor de Java) no parece sufrir este problema. –

+0

Parece ser algo que las personas aguantan y arreglan más tarde, p. esta [ASUNTA pregunta] (http://stackoverflow.com/questions/2277494/need-a-java-based-html-prettifier-to-clean-up-velocity-generated-html) con respecto a la preparación de HTML después de la generación. –

+0

Hmm, eso apesta. Supongo que mi "trabajo alrededor" tendrá que hacer entonces. – javamonkey79

Respuesta

4

creo que le pegan con él (ver Velocity Whitespace Gobbling artículo) a pesar de los comentarios de la línea sería un poco más ordenado:

#foreach ($record in $rows)## 
#foreach($value in $record)## 
$value ## 
#end 

#end 

O simplemente puede exprimir todo en una sola línea:

#foreach($record in $rows)#foreach($value in $record)${value}#{end}#{end} 
+0

El ## no funciona para mí. Solo poner mis macros en una sola línea funciona. ¿Alguna idea de por qué esto sería? –

1

Esto es realmente común para casi todos los lenguajes de plantillas y el razonamiento proviene directamente del procesamiento simplificado. Consideremos el siguiente ejemplo (esto es en realidad SGP utilizado por Grails pero la idea es la misma):

<g:each var="x" in="exes"> 
    ${x.y} 
</g:each> 

La forma en que se procesa es que por primera vez una etiqueta (o en el caso de la velocidad, la Directiva) es identificado. Debido a que la etiqueta/directiva en sí contiene instrucciones para procesar el cuerpo de la etiqueta, las marcas de etiqueta/directiva se eliminan y todo el contenido inmediatamente después de la marca de inicio e inmediatamente antes de que se use la marca de finalización como objetivo para el procesamiento. Esto incluye todos los espacios en blanco, porque limpiar la salida de antemano sería mucho más difícil.

Esto, por supuesto, no significa que no se puede hacer, como señala Edd o que esta sería la elección de diseño más sensata desde el principio, pero a veces hacer las cosas más simplemente es más importante que generar belleza marcado: después de todo, la mayoría, si no todos, los procesadores de marcado realmente no se preocupan si tiene <p>some\ncontent</p> o <p>some\n\n\n\t\tcontent</p>.

Cuestiones relacionadas