Jinja: ワードラップフィルターは既存の改行を無視します

作成日 2013年02月05日  ·  9コメント  ·  ソース: pallets/jinja

やあ、

このフィルターを使用して(たとえば)電子メールメッセージが常に72文字に折り返されるようにすると(可能な場合)、可能な限り頻繁に表示されるようにすると、ワードラップは既存の改行を使用しないことに気付きました。メッセージを手がかりとして、代わりに厳密に72文字ごとに改行を挿入します。

これが回避策です

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

素晴らしく完全ではありませんが、私たちのために働きます。

これ(または同様のもの)をjinja2に含めて、wordrwapフィルターの方がはるかに便利になるようにしたいと思います。

どう思いますか?

全てのコメント9件

これはバグではないと思います。 Wordwrapは、テキストがまだ折り返されていないと想定しているようです。

これはバグではないと思います。 Wordwrapは、テキストがまだ折り返されていないと想定しているようです。

まあ、明らかに。 ただし、折り返しが必要な環境で使用するのは非常に困難ですが、折り返したいテキストには、何らかの形式の書式設定が既に含まれています(たとえば、段落を区切るため)。

これに関するニュースはありますか? 段落が最後に折り返されるようにする必要があるプレーンテキストの電子メールがありますが、段落内の行は自動的に折り返されます。 これは一般的な使用例のようです。 実際、私がこのメッセージを入力しているこのコメントボックスは同じことをします。 これらの行は自動的に折り返されますが、ダブルエンターを押すと

新しい段落が始まります。

これにstdlib電子メールモジュールを使用できませんでしたか?

どの時点でこれを挿入しますか?
Jinja2を使用してメールを生成およびローカライズし、テンプレートをコンパイルした後、結果の文字列をpyramid_mailer / repoze_sendmailに渡します。

プレーンテキストの電子メールテンプレートは次のようになります。

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

...

私もこの問題に遭遇し、グーグル検索が私をここに導きました。 @dwtのパッチを使用すると

ここでも同じですが、修正をマスターに組み込むのは素晴らしいことです!

wrapstringがパッチで消えたことに注意してください

複数の段落を処理するときのtextwrap.wrap()このやや予期しない動作を回避するプルリクエストを送信しました。

wrapstringと空の行は保持されます。

この機能を使用して、別のアプリケーションの一部としてメール本文を生成し、入力を80列でラップしたいと考えています。

nbconvertテンプレートでもこの問題が発生しています。 独自のフィルターを作成する必要がある場合は、nbconvertのカスタムエクスポーターを作成する必要があると考えているため、#766をマージすると非常に便利です。これは、使いやすさのために避けようとしています。

このページは役に立ちましたか?
0 / 5 - 0 評価