diff --git a/flask_website/templates/mailinglist/show_thread.html b/flask_website/templates/mailinglist/show_thread.html index f9e1d4bf..8e4b3117 100644 --- a/flask_website/templates/mailinglist/show_thread.html +++ b/flask_website/templates/mailinglist/show_thread.html @@ -27,7 +27,7 @@
Date:
{{ mail.date.strftime('%Y-%m-%d @ %H:%M') }} -
{{ mail.rendered_text }}
+
{{ mail.rendered_text() }}
{% if mail.children %}
{{ loop(mail.children) }}
{% endif %} diff --git a/flask_website/utils.py b/flask_website/utils.py index 1a63b661..b5bfecdd 100644 --- a/flask_website/utils.py +++ b/flask_website/utils.py @@ -1,3 +1,4 @@ +import re import creoleparser from genshi import builder from functools import wraps @@ -13,6 +14,8 @@ from flask_website.database import User pygments_formatter = HtmlFormatter(style=FlaskyStyle) +_ws_split_re = re.compile(r'(\s+)') + class CodeBlock(PreBlock): @@ -46,6 +49,34 @@ def format_creole(text): return Markup(_parser.render(text, encoding=None)) +def split_lines_wrapping(text, width=74, threshold=82): + lines = text.splitlines() + if all(len(line) <= threshold for line in lines): + return lines + result = [] + for line in lines: + if len(line) <= threshold: + result.append(line) + continue + line_width = 0 + line_buffer = [] + for piece in _ws_split_re.split(line): + line_width += len(piece) + if line_width > width: + result.append(u''.join(line_buffer)) + line_buffer = [] + if not piece.isspace(): + line_buffer.append(piece) + line_width = len(piece) + else: + line_width = 0 + else: + line_buffer.append(piece) + if line_buffer: + result.append(u''.join(line_buffer)) + return result + + def requires_login(f): @wraps(f) def decorated_function(*args, **kwargs): diff --git a/flask_website/views/mailinglist.py b/flask_website/views/mailinglist.py index 5f714ddc..4f61a5e9 100644 --- a/flask_website/views/mailinglist.py +++ b/flask_website/views/mailinglist.py @@ -4,6 +4,7 @@ from hashlib import md5 from werkzeug import parse_date from jinja2.utils import urlize from flask import Module, render_template, json, url_for, abort, Markup +from flask_website.utils import split_lines_wrapping from flask_website import config mailinglist = Module(__name__, url_prefix='/mailinglist') @@ -19,11 +20,10 @@ class Mail(object): self.children = [Mail(x) for x in d['children']] self.text = d['text'] - @property def rendered_text(self): result = [] in_sig = False - for line in self.text.splitlines(): + for line in split_lines_wrapping(self.text): if line == u'-- ': in_sig = True if in_sig: