Jinja: Zeilenumbruchfilter ignoriert vorhandene Zeilenumbrüche

Erstellt am 5. Feb. 2013  ·  9Kommentare  ·  Quelle: pallets/jinja

Hi,

Mir ist aufgefallen, dass bei der Verwendung dieses Filters (zum Beispiel), um sicherzustellen, dass eine E-Mail-Nachricht immer in 72 Zeichen umbrochen wird (wo möglich), um eine schöne Anzeige so oft wie möglich zu gewährleisten, wir festgestellt haben, dass der Zeilenumbruch keine vorhandenen Zeilenumbrüche verwendet die Nachricht als Hinweis, sondern fügt stattdessen streng alle 72 Zeichen Zeilenumbrüche ein.

Das ist unser Workaround

## Workaround bug in do_wordwrap where it disregards existing linebreaks 
## when wrapping text

from jinja2.filters import environmentfilter
import re
<strong i="8">@environmentfilter</strong>
def do_wordwrap(environment, s, width=79, break_long_words=True):
    """
    Return a copy of the string passed to the filter wrapped after
    ``79`` characters.  You can override this default using the first
    parameter.  If you set the second parameter to `false` Jinja will not
    split words apart if they are longer than `width`.
    """
    import textwrap
    accumulator = []
    # Workaround: pre-split the string
    for component in re.split(r"\r?\n", s):
        # textwrap will eat empty strings for breakfirst. Therefore we route them around it.
        if len(component) is 0:
            accumulator.append(component)
            continue
        accumulator.extend(
            textwrap.wrap(component, width=width, expand_tabs=False,
                replace_whitespace=False,
                break_long_words=break_long_words)
        )
    return environment.newline_sequence.join(accumulator)

Nicht schön und vollständig, aber funktioniert für uns.

Ich möchte, dass dies (oder etwas Ähnliches) in jinja2 enthalten ist, da es den Wordrwap-Filter viel nützlicher macht.

Was denken Sie?

Alle 9 Kommentare

Ich denke nicht, dass dies ein Bug ist. Wortumbruch scheint nur anzunehmen, dass Ihr Text noch nicht umgebrochen ist.

Ich denke nicht, dass dies ein Bug ist. Wortumbruch scheint nur anzunehmen, dass Ihr Text noch nicht umgebrochen ist.

Gut Offensichtlich. Aber es macht es wirklich schwierig, es in einer Umgebung zu verwenden, in der Sie den Zeilenumbruch benötigen, der Text, den Sie umbrechen möchten, jedoch bereits eine Form der Formatierung enthält (zum Beispiel zum Trennen von Absätzen).

Gibt es Neuigkeiten zu diesem? Wir haben Klartext-E-Mails, bei denen wir sicherstellen müssen, dass Absätze am Ende umgebrochen werden, aber Zeilen innerhalb des Absatzes automatisch umbrochen werden sollen. Dies scheint ein häufiger Anwendungsfall zu sein. Tatsächlich macht dieses Kommentarfeld, in das ich diese Nachricht eintippe, dasselbe. Diese Zeilen werden automatisch umbrochen, aber wenn ich die Doppeleingabe drücke

ein neuer Absatz beginnt.

Könnten Sie dafür nicht das stdlib-E-Mail-Modul verwenden?

An welcher Stelle würdest du das einfügen?
Wir verwenden Jinja2 zum Generieren und Lokalisieren von E-Mails und übergeben den resultierenden String nach dem Kompilieren des Templates an pyramid_mailer/repoze_sendmail.

Eine E-Mail-Vorlage im Klartext sieht in etwa so aus:

{%- filter wordwrap(width=72, break_long_words=False) -%}
{% block greeting -%}
{% trans full_name = _(user.full_name) %}Hello {{ full_name }},{% endtrans %}
{% endblock -%}

{% block message_intro %}
{% endblock -%}

{% trans -%}
This may be a very long text in another language, depending on what a translator put into the gettext localization. It may even have its own paragraphs.
{%- endtrans %}

...

Ich bin auch auf dieses Problem gestoßen und eine Google-Suche hat mich hierher geführt. Die Verwendung des Patches von @dwt funktioniert bei mir. Ich stimme auch dafür, dass diese Änderung in die Codebasis aufgenommen wird.

Gleiches hier, wäre toll, den Fix in den Master zu integrieren!

Beachte, dass wrapstring im Patch verschwunden ist

Ich habe Pull-Requests eingereicht, die dieses etwas unerwartete Verhalten von textwrap.wrap() umgehen, wenn es um mehrere Absätze geht.

wrapstring und Leerzeilen bleiben erhalten.

Wir verwenden diese Funktionalität zum Generieren von E-Mail-Texten als Teil einer anderen Anwendung und möchten die Eingabe in 80 Spalten umbrechen.

Dieses Problem tritt auch in meiner nbconvert-Vorlage auf. Es wäre super schön, #766 zusammengeführt zu haben, denn wenn ich meinen eigenen Filter schreiben muss, glaube ich, dass ich einen benutzerdefinierten Exporter für nbconvert schreiben muss, was ich aus Gründen der Benutzerfreundlichkeit versuche zu vermeiden.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen