Jinja: filter wordwrap mengabaikan baris baru yang ada

Dibuat pada 5 Feb 2013  ·  9Komentar  ·  Sumber: pallets/jinja

Hai, yang di sana,

Saya perhatikan bahwa ketika menggunakan filter ini untuk (misalnya) memastikan pesan email selalu dibungkus menjadi 72 karakter (jika memungkinkan) untuk memastikan tampilan yang bagus sesering mungkin, kami perhatikan bahwa wordwrap tidak akan menggunakan baris baru yang ada di pesan sebagai petunjuk tetapi sebaliknya akan menyisipkan baris baru secara ketat setiap 72 karakter.

Ini adalah solusi kami

## 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)

Tidak bagus dan lengkap tetapi bekerja untuk kami.

Saya ingin ini (atau yang serupa) dimasukkan dalam jinja2 dengan benar, karena membuat filter wordrwap jauh lebih berguna.

Bagaimana menurutmu?

Semua 9 komentar

Saya tidak berpikir ini adalah bug. Wordwrap sepertinya berasumsi bahwa teks Anda belum dibungkus.

Saya tidak berpikir ini adalah bug. Wordwrap sepertinya berasumsi bahwa teks Anda belum dibungkus.

Yah, jelas. Tapi itu membuatnya sangat sulit untuk digunakan di lingkungan di mana Anda membutuhkan pembungkus tetapi teks yang ingin Anda bungkus sudah berisi Beberapa bentuk pemformatan (untuk memisahkan Paragraf misalnya).

Ada berita tentang ini? Kami memiliki email teks biasa di mana kami perlu memastikan paragraf dibungkus di bagian akhir, tetapi ingin baris di dalam paragraf dibungkus secara otomatis. Ini tampaknya menjadi kasus penggunaan yang umum. Faktanya, kotak komentar tempat saya mengetik pesan ini melakukan hal yang sama. Garis-garis ini dibungkus secara otomatis, tetapi ketika saya menekan enter ganda

paragraf baru dimulai.

Tidak bisakah Anda menggunakan modul email stdlib untuk ini?

Pada titik mana Anda akan memasukkan ini?
Kami menggunakan Jinja2 untuk menghasilkan dan melokalkan email dan setelah mengkompilasi template, serahkan string yang dihasilkan ke pyramid_mailer/repoze_sendmail.

Template email teks biasa terlihat seperti ini:

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

...

Saya juga mengalami masalah ini dan pencarian Google membawa saya ke sini. Menggunakan tambalan dari @dwt berfungsi untuk saya. Saya juga memilih perubahan ini untuk dimasukkan ke dalam basis kode.

Sama di sini, akan sangat bagus untuk memasukkan perbaikan ke master!

Perhatikan bahwa wrapstring menghilang di patch

Saya mengirimkan permintaan tarik yang mengatasi perilaku textwrap.wrap() agak tidak terduga ini ketika berhadapan dengan banyak paragraf.

wrapstring dan baris kosong dipertahankan.

Kami menggunakan fungsi ini untuk menghasilkan badan email sebagai bagian dari aplikasi lain dan ingin membungkus input pada 80 kolom.

Saya mengalami masalah ini juga di template nbconvert saya. Akan sangat menyenangkan jika #766 digabungkan karena jika saya harus menulis filter saya sendiri, saya percaya bahwa saya harus menulis eksportir khusus untuk nbconvert, yang untuk kemudahan penggunaan saya coba hindari.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat