Подтвердить что ты не робот

{% spaceless%} тег для шаблонов Jinja?

Django имеет полезный тег {% spaceless %}, который удаляет лишние пробелы из HTML.

Мои шаблоны производят много пробелов, и это слишком больно, чтобы добавить {%- и -%} всюду, чтобы сделать управление пробелами. Кто-нибудь видел такой фильтр, как {% spaceless %} для Jinja, или, может быть, {% htmltidy %}, чтобы я мог просматривать чистый HTML при разработке?

4b9b3361

Ответ 2

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

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 %}

Результат с пробелом

with

Результат без пробела (обратите внимание, что невидимые пробелы переместили четвертый блок на следующую строку)

without

Ответ 3

{% filter trim %} эквивалентен {% spaceless %}.

Ответ 4

{% filter replace("\t", " ")|replace("    ", " ")|replace("   ", " ")|replace("  ", " ")|replace("\n ", "\n")|replace("\n\n", "\n") %}

Я использую это, чтобы заменить несколько пробелов только одним разделителем. Не красиво, но эффективно без расширения.