Уберите пробелы из шаблона Мако (пилоны) - PullRequest
6 голосов
/ 06 октября 2010

Я использую Mako + Pylons, и я заметил ужасное количество пробелов в своем выводе HTML.

Как мне избавиться от этого?Reddit удается это сделать.

Ответы [ 5 ]

8 голосов
/ 06 октября 2010

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

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

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

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

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

4 голосов
/ 06 октября 2010

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

Вам необходимо принять решение о том, сэкономит ли время очистки строки 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>'
2 голосов
/ 06 октября 2010

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

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 или что-то еще).Это не самый эффективный способ сделать это, но для быстрого примера:)

1 голос
/ 06 октября 2010

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

0 голосов
/ 20 мая 2016

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

Так

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 )

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

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