2010-10-06 7 views

Respuesta

2

No estoy seguro de si hay una manera de hacerlo dentro de Mako, pero siempre puedes hacer algo de procesamiento posterior a la renderización antes de publicar la página. Por ejemplo, supongamos que tiene el siguiente código que genera el espacio en blanco horrendo:

from mako import TemplateLookup 

template_lookup = TemplateLookup(directories=['.']) 
template = template_lookup.get_template("index.mako") 
whitespace_mess = template.render(somevar="no whitespace here") 
return whitespace_mess # Why stop here? 

Se podría añadir un paso adicional en este modo:

from mako import TemplateLookup 

template_lookup = TemplateLookup(directories=['.']) 
template = template_lookup.get_template("index.mako") 
whitespace_mess = template.render(somevar="no whitespace here") 
cleaned_up_output = cleanup_whitespace(whitespace_mess) 
return cleaned_up_output 

... donde cleanup_whitespace() es una función que hace lo que quiere (podría pasarlo por HTML Tidy o slimmer o lo que sea). No es la forma más eficiente de hacerlo, pero lo convierte en un ejemplo rápido :)

2

Si sus datos no son demasiado dinámicos, podría almacenar un caché optimizado de la salida de la plantilla y publicarlo en los clientes web.

+0

No entiendo cómo se relaciona con mi problema de espacio en blanco. ¿Podrías elaborar? –

+0

Bueno, haz que Mako genere las plantillas como lo hace ahora. Y, en lugar de agregar la complejidad de postprocesar cada solicitud (muy probablemente a través de expresiones regulares), se sirve una versión en caché de la página una vez que se ha procesado. –

6

Hay una barra invertida.

Consulte la página de inicio de mako http://makotemplates.org para ver un ejemplo.

<%def name="makerow(row)"> 
    <tr> 
    % for name in row: 
     <td>${name}</td>\ 
    % endfor 
    </tr> 
</%def> 

Pero en serio, no me tomaría demasiado tiempo tratar de formatear correctamente la salida. Lo que es importante es tener un código de plantilla legible. Uso el inspector web de Webkit (o FireBug, si lo prefieres) con más frecuencia que "ver fuente".

Si realmente quieres un buen formato de salida html, siempre puedes escribir un middleware que lo haga.

+0

http://docs.makotemplates.org/en/latest/syntax.html?highlight=empty#newline-filters –

4

La única manera de hacer esto sin postprocesamiento sería evitar espacios en blanco en la plantilla. Sin embargo, eso hará las cosas muy difíciles para usted como desarrollador.

Debe decidir si la hora de limpiar la cadena HTML después de que se haya procesado la plantilla ahorrará suficiente ancho de banda para compensar este costo. Recomiendo usar una biblioteca de código C optimizada para hacer esto por usted, como lxml.html.

>>> from lxml import html 
>>> page = html.fromstring("""<html> 
... 
... <body>yuck, a newline! bandwidth wasted!</body> 
... </html>""") 
>>> html.tostring(page) 
'<html><body>yuck, a newline! bandwidth wasted!</body></html>' 
0

Al igual que la respuesta de Dan, pasé la salida renderizada a través de esta función que solo conserva espacios en blanco "deliberados". Definí que para ser dos retornos carrage en una fila (i.e una línea vacía)

Así

Hello 
There 

Se convierte en

Hello There 

Pero

Hello 

There 

convierte

Hello 
There 

Aquí está el código

def filter_newline(input): 
    rendered_output = [] 
    for line in input.split("\n"): 
     if line: 
      # Single new-lines are removed 
      rendered_output.append(line) 
     else: 
      # Subsequent newlines (so no body to the interveaning line) are retained 
      rendered_output.append("\n") 

    return "".join(rendered_output) 

Ejecutar como tal (me robaron parte del ejemplo de Dan)

whitespace_mess = template.render(somevar="Hello \nThere") 
cleaned_up_output = filter_newline(whitespace_mess) 
Cuestiones relacionadas