Ответ 1
Существует расширение jinja2, которое достигает этого эффекта, созданного разработчиком jinja2
Django имеет полезный тег {% spaceless %}
, который удаляет лишние пробелы из HTML.
Мои шаблоны производят много пробелов, и это слишком больно, чтобы добавить {%-
и -%}
всюду, чтобы сделать управление пробелами. Кто-нибудь видел такой фильтр, как {% spaceless %}
для Jinja, или, может быть, {% htmltidy %}
, чтобы я мог просматривать чистый HTML при разработке?
Существует расширение jinja2, которое достигает этого эффекта, созданного разработчиком jinja2
У меня возникла эта проблема, когда я хотел напечатать элементы уровня встроенного блока без разделения между ними (например, для рендеринга жидкой сетки блоков), но мне нужна чистая поисковая разметка.
jinja2-htmlcompress разделяет пробелы между тегами HTML, а также между тэгами jinja и переменными. Это не идеально, потому что это заставляет вас использовать обходные пути, такие как {{ ' ' }}
или жестко закодированные html-объекты, такие как
.
coffin spaceless tag выглядит как идеальное решение, но он добавляет зависимость (django) и множество ненужных функций.
Если вы хотите использовать пробелы Django без пробелов, вы можете использовать следующий код, который я адаптировал из гроба:
jinja_extensions.py
# -*- coding: utf-8 -*-
from jinja2 import nodes
from jinja2.ext import Extension
import re
class SpacelessExtension(Extension):
"""
Removes whitespace between HTML tags at compile time, including tab and newline characters.
It does not remove whitespace between jinja2 tags or variables. Neither does it remove whitespace between tags
and their text content.
Adapted from coffin:
https://github.com/coffin/coffin/blob/master/coffin/template/defaulttags.py
"""
tags = set(['spaceless'])
def parse(self, parser):
lineno = parser.stream.next().lineno
body = parser.parse_statements(['name:endspaceless'], drop_needle=True)
return nodes.CallBlock(
self.call_method('_strip_spaces', [], [], None, None),
[], [], body,
).set_lineno(lineno)
def _strip_spaces(self, caller=None):
return re.sub(r'>\s+<', '><', caller().strip())
Где бы вы не определили среду jinja2
extensions=['path.to.jinja_extensions.SpacelessExtension']
Пример использования
<style>
*, *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
.features {
text-align: center;
}
.features div {
display: inline-block;
text-align: left;
width: 25%;
padding: 20px;
}
/* A style to help us identify the blocks */
.features div:nth-child(odd) {
background: #f5f5f5;
}
@media only screen and (max-width: 319px) {
/* For small screens, display a single feature per line */
.features div {
width: 100%;
}
}
</style>
{% spaceless %} {# We remove whitespace between these inline-block tags without affecting the markup #}
<div class="features">
<div>
<h2>Feature 1</h2>
<p>Content</p>
</div>
<div>
<h2>Feature 2</h2>
<p>Content</p>
</div>
<div>
<h2>Feature 3</h2>
<p>Content</p>
</div>
<div>
<h2>Feature 4</h2>
<p>Content</p>
</div>
<div>
<h2>Feature 5</h2>
<p>Content, second line on desktop</p>
</div>
</div>
{% endspaceless %}
Результат с пробелом
Результат без пробела (обратите внимание, что невидимые пробелы переместили четвертый блок на следующую строку)
{% filter trim %}
эквивалентен {% spaceless %}
.
{% filter replace("\t", " ")|replace(" ", " ")|replace(" ", " ")|replace(" ", " ")|replace("\n ", "\n")|replace("\n\n", "\n") %}
Я использую это, чтобы заменить несколько пробелов только одним разделителем. Не красиво, но эффективно без расширения.