μλ νμΈμ,
μ΄ νν°λ₯Ό μ¬μ©νμ¬ (μλ₯Ό λ€μ΄) μ΄λ©μΌ λ©μμ§λ₯Ό κ°λ₯ν ν μμ£Ό λ©μ§κ² νμνκΈ° μν΄ νμ 72μλ‘ μ€λ°κΏνλλ‘ ν λ wordwrapμ΄ κΈ°μ‘΄ μ€ λ°κΏμ μ¬μ©νμ§ μλλ€λ κ²μ μμμ΅λλ€. λ©μμ§λ₯Ό λ¨μλ‘ μ¬μ©νμ§λ§ λμ μ격νκ² 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)
λ©μ§κ³ μλ²½νμ§λ μμ§λ§ μ°λ¦¬λ₯Ό μν΄ μλν©λλ€.
wordrwap νν°λ₯Ό ν¨μ¬ λ μ μ©νκ² λ§λ€κΈ° λλ¬Έμ μ΄(λλ μ μ¬ν κ²)κ° jinja2μ μ μ νκ² ν¬ν¨λκΈ°λ₯Ό λ°λλλ€.
μ΄λ»κ² μκ°νλμ?
λλ μ΄κ²μ΄ λ²κ·ΈλΌκ³ μκ°νμ§ μλλ€. Wordwrapμ ν μ€νΈκ° μμ§ μ€ λ°κΏλμ§ μμλ€κ³ κ°μ νλ κ² κ°μ΅λλ€.
λλ μ΄κ²μ΄ λ²κ·ΈλΌκ³ μκ°νμ§ μλλ€. Wordwrapμ ν μ€νΈκ° μμ§ μ€ λ°κΏλμ§ μμλ€κ³ κ°μ νλ κ² κ°μ΅λλ€.
κΈμ, λΆλͺ ν. κ·Έλ¬λ μ€ λ°κΏμ΄ νμνμ§λ§ μ€ λ°κΏνλ €λ ν μ€νΈμ μ΄λ―Έ μΌλΆ νμμ μμμ΄ ν¬ν¨λμ΄ μλ νκ²½μμλ μ¬μ©νκΈ°κ° μ λ§ μ΄λ ΅μ΅λλ€(μ: λ¨λ½ λΆλ¦¬).
μ΄κ²μ λν μμμ΄ μμ΅λκΉ? λ¨λ½μ΄ λμ μ€ λ°κΏλλλ‘ ν΄μΌ νμ§λ§ λ¨λ½ λ΄μ μ€μ΄ μλμΌλ‘ μ€ λ°κΏλκΈ°λ₯Ό μνλ μΌλ° ν μ€νΈ μ΄λ©μΌμ΄ μμ΅λλ€. μ΄κ²μ μΌλ°μ μΈ μ¬μ© μ¬λ‘μΈ κ² κ°μ΅λλ€. μ¬μ€, λ΄κ° μ΄ λ©μμ§λ₯Ό μ λ ₯νλ μ΄ λκΈ μμλ κ°μ μν μ ν©λλ€. μ΄ μ€μ μλμΌλ‘ μ€ λ°κΏλμ§λ§ λ λ² μ λ ₯νλ©΄
μλ‘μ΄ λ¨λ½μ΄ μμλ©λλ€.
μ΄κ²μ μν΄ stdlib μ΄λ©μΌ λͺ¨λμ μ¬μ©ν μ μμ΅λκΉ?
μ΄λ μμ μ μ΄κ²μ μ½μ
νμκ² μ΅λκΉ?
μ°λ¦¬λ Jinja2λ₯Ό μ¬μ©νμ¬ λ©μΌμ μμ±νκ³ νμ§ννκ³ ν
νλ¦Ώμ μ»΄νμΌν ν κ²°κ³Ό λ¬Έμμ΄μ νΌλΌλ―Έλ_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 %}
...
λλ λνμ΄ λ¬Έμ κ° λ°μνκ³ Google κ²μμ΄ λλ₯Ό μ¬κΈ°λ‘ μ΄λμμ΅λλ€. @dwt μ ν¨μΉλ₯Ό μ¬μ©νλ©΄ ν¨κ³Όμ μ λλ€. λλ λν μ΄ λ³κ²½ μ¬νμ΄ μ½λ κΈ°λ°μ ν΅ν©λλ κ²μ ν¬νν©λλ€.
μ¬κΈ°μμλ λ§μ°¬κ°μ§λ‘ μμ μ¬νμ λ§μ€ν°μ ν΅ν©νλ κ²μ΄ μ’μ΅λλ€!
wrapstring
λ ν¨μΉμμ μ¬λΌμ‘μ΅λλ€.
μ¬λ¬ λ¨λ½μ μ²λ¦¬ν λ textwrap.wrap()
μ λ€μ μμμΉ λͺ»ν λμμ ν΄κ²°νλ ν 리νμ€νΈλ₯Ό μ μΆνμ΅λλ€.
wrapstring
λ° λΉ μ€μ΄ μ μ§λ©λλ€.
λ€λ₯Έ μ ν리μΌμ΄μ μ μΌλΆλ‘ μ΄λ©μΌ λ³Έλ¬Έμ μμ±νκΈ° μν΄ μ΄ κΈ°λ₯μ μ¬μ©νκ³ μμΌλ©° 80μ΄μμ μ λ ₯μ λννλ €κ³ ν©λλ€.
λ΄ nbconvert ν νλ¦Ώμμλ μ΄ λ¬Έμ κ° λ°μνκ³ μμ΅λλ€. λ΄ μμ μ νν°λ₯Ό μμ±ν΄μΌ νλ κ²½μ° nbconvertμ© μ¬μ©μ μ§μ λ΄λ³΄λ΄κΈ°λ₯Ό μμ±ν΄μΌ νλ€κ³ μκ°νκΈ° λλ¬Έμ #766μ λ³ν©νλ κ²μ΄ λ§€μ° μ’μ κ²μ λλ€. μ¬μ© νΈμμ±μ μν΄ νΌνλ €κ³ ν©λλ€.