Mako + Pylonsを使用していますが、HTML出力に途方もない量の空白があることに気づきました。
どうすればそれを取り除くことができますか?Redditはなんとかそれを行うことができます。
バックスラッシュがあります。
例については、makohttp://makotemplates.orgのホームページをご覧ください。
<%def name="makerow(row)">
<tr>
% for name in row:
<td>${name}</td>\
% endfor
</tr>
</%def>
しかし、真剣に、私は出力を正しくフォーマットしようとすることに多くの時間を費やすことはありませんでした。重要なのは、読み取り可能なテンプレートコードを用意することです。私は「ソースの表示」よりもWebkit(または必要に応じてFireBug)のWebインスペクターを頻繁に使用します。
本当に適切なフォーマットのHTML出力が必要な場合は、それを実行するミドルウェアをいつでも作成できます。
後処理なしでこれを行う唯一の方法は、テンプレート内の空白を避けることです。ただし、それは開発者としてのあなたにとって非常に困難になります。
テンプレートがレンダリングされた後に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>'
Mako自体の中でそれを行う方法があるかどうかはわかりませんが、ページを提供する前に、いつでもレンダリング後の処理を行うことができます。たとえば、恐ろしい空白を生成する次のコードがあるとします。
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やスリムなどを介して渡すことができます)。これは最も効率的な方法ではありませんが、簡単な例になります:)
データがあまり動的でない場合は、テンプレート出力の最適化されたキャッシュを保存して、これをWebクライアントに提供できます。
ダンの答えと同様に、レンダリングされた出力を、「意図的な」空白のみを保持するこの関数に渡しました。私は、2つのcarrageが連続して戻る(つまり、空の行)と定義しました
それで
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)