У меня была эта проблема, когда я хотел напечатать элементы уровня встроенных блоков без разделения между ними (например, для рендеринга плавной сетки блоков), но я хотел получить чистую на вид разметку.
jinja2-htmlcompress убирает пробелы между тегами HTML, а также между тегами jinja и переменными.Это не идеально, потому что это заставляет вас использовать обходные пути, такие как {{ ' ' }}
или жестко закодированные html-объекты, такие как
.
без пробелов тега coffin выглядит как идеальное решение, ноон добавляет зависимость (django) и множество ненужных функций.
Если вы хотите использовать только без пробелы теги Django, вы можете использовать следующий код, который я адаптировал из coffin:
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 %}
Результат с пробелами
![with](https://i.imgur.com/iS8MiXo.png)
Результат без пробелов (обратите внимание, что невидимые пробелы сместились на четвертый блокна следующую строку)
![without](https://i.imgur.com/CjNws95.png)