{% spaceless%} тег для шаблонов Jinja? - PullRequest
28 голосов
/ 04 марта 2011

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

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

Ответы [ 5 ]

20 голосов
/ 01 марта 2012

Существует расширение jinja2, которое достигает этого эффекта, созданное разработчиком jinja2

https://github.com/mitsuhiko/jinja2-htmlcompress

8 голосов
/ 19 мая 2014

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

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

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

without

7 голосов
/ 09 января 2015

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

3 голосов
/ 08 декабря 2015
{% filter replace("\t", " ")|replace("    ", " ")|replace("   ", " ")|replace("  ", " ")|replace("\n ", "\n")|replace("\n\n", "\n") %}

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

1 голос
/ 06 августа 2018

Я делаю:

{% filter trim %}
... code ...
{% endfilter %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...