рдирдорд╕реНрддреЗ,
рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдХ рдИрдореЗрд▓ рд╕рдВрджреЗрд╢ рд╣рдореЗрд╢рд╛ 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 рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рддрд╛ рд╣реИред
рддреБрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ?
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИред Wordwrap рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдЯреЗрдХреНрд╕реНрдЯ рдЕрднреА рддрдХ рд▓рдкреЗрдЯрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИред
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИред Wordwrap рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдЯреЗрдХреНрд╕реНрдЯ рдЕрднреА рддрдХ рд▓рдкреЗрдЯрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИред
рдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗред рд▓реЗрдХрд┐рди рдпрд╣ рдРрд╕реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рд░реИрдкрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдЖрдк рд▓рдкреЗрдЯрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрд╡рд░реВрдкрдг рдХреЗ рдХреБрдЫ рд░реВрдк рд╣реЛрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред
рдЗрд╕ рдкрд░ рдХреЛрдИ рдЦрдмрд░? рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рджрд╛ рдкрд╛рда рдИрдореЗрд▓ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдЪреНрдЫреЗрдж рдЕрдВрдд рдореЗрдВ рд▓рдкреЗрдЯреЗ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдиреБрдЪреНрдЫреЗрдж рдХреЗ рднреАрддрд░ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рдкреЗрдЯрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬрд┐рд╕ рдХрдореЗрдВрдЯ рдмреЙрдХреНрд╕ рдореЗрдВ рдореИрдВ рдпрд╣ рд╕рдВрджреЗрд╢ рдЯрд╛рдЗрдк рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рд╡рд╣реА рдХрд░рддрд╛ рд╣реИред рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдбрдмрд▓ рдПрдВрдЯрд░ рджрдмрд╛рддрд╛ рд╣реВрдВ
рдПрдХ рдирдпрд╛ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП stdlib рдИрдореЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ?
рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВрдЧреЗ?
рд╣рдо рдореЗрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Jinja2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдгрд╛рдореА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд┐рд░рд╛рдорд┐рдб_рдореЗрд▓рд░/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 рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ #766 рдХрд╛ рд╡рд┐рд▓рдп рд╣реЛ рдЬрд╛рдП рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдореБрдЭреЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд┐рдЦрдирд╛ рд╣реИ, рддреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдореБрдЭреЗ nbconvert рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рдирд┐рд░реНрдпрд╛рддрдХ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдЯрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред