2010-10-06 2 views

ответ

2

Я не уверен, есть ли способ сделать это в самой Мако, но вы всегда можете просто выполнить обработку после рендеринга, прежде чем подавать страницу. Например, у вас есть следующий код, который генерирует свои ужасающие пропуска:

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? 

Вы можете добавить дополнительный шаг, как так:

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 

... где cleanup_whitespace() есть некоторая функция, делает то, что вы хотите (он может пройти через HTML Tidy или slimmer или что-то еще). Это не самый эффективный способ сделать это, но это делает быстрый пример :)

2

Если ваши данные не слишком динамичны, вы можете сохранить оптимизированный кэш вывода шаблона и обслуживать его для веб-клиентов.

+0

Я не понимаю, как это относится к моей проблеме пробелов. Не могли бы вы уточнить? –

+0

Ну, пусть Mako сгенерирует шаблоны, как сейчас. И вместо того, чтобы добавлять сложность последующей обработки каждого запроса (скорее всего, с помощью регулярных выражений), обслуживать кешированную версию страницы после ее обработки. –

6

Есть обратная косая черта.

Посмотрите на домашнюю страницу mako http://makotemplates.org для примера.

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

Но если серьезно, я бы не потратил много времени на правильное форматирование вывода. Важно иметь читаемый код шаблона. Я использую веб-инспектора Webkit (или FireBug, если вы предпочитаете) чаще, чем «просмотр источника».

Если вам действительно нужен хороший форматированный вывод html, вы всегда можете написать промежуточное программное обеспечение, которое это делает.

+0

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

4

Единственный способ сделать это без постобработки - избежать пробелов в шаблоне. Однако это будет очень сложно для вас как разработчика.

Вам необходимо принять решение о том, будет ли время для очистки строки HTML после визуализации шаблона сэкономить достаточную полосу пропускания для компенсации этой стоимости. Я рекомендую использовать оптимизированную библиотеку кода C для этого, например 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

Подобный ответ Дэна, я прошел обработанную выход через эту функцию, которая только сохраняет «преднамеренный» пробелы. Я определил, что это две результирующие нагрузки в строке (т.е.е пустая строка)

Так

Hello 
There 

Становится

Hello There 

Но

Hello 

There 

Становится

Hello 
There 

Вот код

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) 

Execute как так (я украл часть примера Дэна)

whitespace_mess = template.render(somevar="Hello \nThere") 
cleaned_up_output = filter_newline(whitespace_mess) 
Смежные вопросы