Rafał Pitoń 10 лет назад
Родитель
Сommit
5d285ef1a4

+ 6 - 6
misago/markup/flavours.py

@@ -1,7 +1,7 @@
 from misago.markup.parser import parse
 from misago.markup.parser import parse
 
 
 
 
-def common(text, author=None, allow_mentions=True):
+def common(request, poster, text, allow_mentions=True):
     """
     """
     Common flavour
     Common flavour
 
 
@@ -12,10 +12,10 @@ def common(text, author=None, allow_mentions=True):
 
 
     Returns dict object
     Returns dict object
     """
     """
-    return parse(text, author=author, allow_mentions=allow_mentions)
+    return parse(text, request, poster, allow_mentions=allow_mentions)
 
 
 
 
-def limited(text):
+def limited(request, text):
     """
     """
     Limited flavour
     Limited flavour
 
 
@@ -24,14 +24,14 @@ def limited(text):
 
 
     Returns parsed text
     Returns parsed text
     """
     """
-    result = parse(text, allow_mentions=False, allow_links=True,
+    result = parse(text, request, allow_mentions=False, allow_links=True,
                    allow_images=False, allow_blocks=False)
                    allow_images=False, allow_blocks=False)
 
 
     return result['parsed_text']
     return result['parsed_text']
 
 
 
 
-def signature(text, owner=None):
-    result = parse(text, allow_mentions=False,
+def signature(request, owner, text):
+    result = parse(text, request, allow_mentions=False,
                    allow_blocks=owner.acl['allow_signature_blocks'],
                    allow_blocks=owner.acl['allow_signature_blocks'],
                    allow_links=owner.acl['allow_signature_links'],
                    allow_links=owner.acl['allow_signature_links'],
                    allow_images=owner.acl['allow_signature_images'])
                    allow_images=owner.acl['allow_signature_images'])

+ 32 - 10
misago/markup/parser.py

@@ -1,4 +1,8 @@
+import bleach
+from bs4 import BeautifulSoup
+from htmlmin.minify import html_minify
 import markdown
 import markdown
+
 from misago.markup.bbcode import inline, blocks
 from misago.markup.bbcode import inline, blocks
 from misago.markup.pipeline import pipeline
 from misago.markup.pipeline import pipeline
 
 
@@ -6,8 +10,8 @@ from misago.markup.pipeline import pipeline
 __all__ = ['parse']
 __all__ = ['parse']
 
 
 
 
-def parse(text, author=None, allow_mentions=True, allow_links=True,
-               allow_images=True, allow_blocks=True):
+def parse(text, request, poster, allow_mentions=True, allow_links=True,
+               allow_images=True, allow_blocks=True, minify=True):
     """
     """
     Message parser
     Message parser
 
 
@@ -18,8 +22,7 @@ def parse(text, author=None, allow_mentions=True, allow_links=True,
 
 
     Returns dict object
     Returns dict object
     """
     """
-    md = md_factory(author=author, allow_mentions=allow_mentions,
-                    allow_links=allow_links, allow_images=allow_images,
+    md = md_factory(allow_links=allow_links, allow_images=allow_images,
                     allow_blocks=allow_blocks)
                     allow_blocks=allow_blocks)
 
 
     parsing_result = {
     parsing_result = {
@@ -37,12 +40,35 @@ def parse(text, author=None, allow_mentions=True, allow_links=True,
 
 
     # Clean and store parsed text
     # Clean and store parsed text
     parsing_result['parsed_text'] = parsed_text.strip()
     parsing_result['parsed_text'] = parsed_text.strip()
+
+    if allow_links:
+        linkify_paragraphs(parsing_result)
+
+    if allow_links or allow_images:
+        make_absolute_links_relative(parsing_result, request)
+
     parsing_result = pipeline.process_result(parsing_result)
     parsing_result = pipeline.process_result(parsing_result)
+
+    if minify:
+        minify_result(parsing_result)
     return parsing_result
     return parsing_result
 
 
 
 
-def md_factory(author=None, allow_mentions=True, allow_links=True,
-               allow_images=True, allow_blocks=True):
+def linkify_paragraphs(result):
+    result['parsed_text'] = bleach.linkify(
+        result['parsed_text'], skip_pre=True, parse_email=True)
+
+
+def make_absolute_links_relative(result, request):
+    pass
+
+
+def minify_result(result):
+    # [25:-14] trims <html><head></head><body> and </body></html>
+    result['parsed_text'] = html_minify(result['parsed_text'])[25:-14]
+
+
+def md_factory(allow_links=True, allow_images=True, allow_blocks=True):
     """
     """
     Create and configure markdown object
     Create and configure markdown object
     """
     """
@@ -60,10 +86,6 @@ def md_factory(author=None, allow_mentions=True, allow_links=True,
     md.inlinePatterns.add('bb_i', inline.italics, '<emphasis')
     md.inlinePatterns.add('bb_i', inline.italics, '<emphasis')
     md.inlinePatterns.add('bb_u', inline.underline, '<emphasis2')
     md.inlinePatterns.add('bb_u', inline.underline, '<emphasis2')
 
 
-    if allow_mentions:
-        # Register mentions
-        pass
-
     if allow_links:
     if allow_links:
         # Add [url]
         # Add [url]
         pass
         pass

+ 0 - 0
misago/markup/tests/__init__.py


+ 16 - 0
misago/markup/tests/test_checksums.py

@@ -0,0 +1,16 @@
+from django.test import TestCase
+
+from misago.markup import checksums
+
+
+class ChecksumsTests(TestCase):
+    def test_checksums(self):
+        fake_message = "<p>Woow, thats awesome!</p>"
+        post_pk = 231
+
+        checksum = checksums.make_checksum(fake_message, [post_pk])
+
+        self.assertTrue(
+            checksums.is_checksum_valid(fake_message, checksum, [post_pk]))
+        self.assertFalse(
+            checksums.is_checksum_valid(fake_message, checksum, [3]))

+ 10 - 16
misago/markup/tests.py → misago/markup/tests/test_parser.py

@@ -1,7 +1,14 @@
 from django.test import TestCase
 from django.test import TestCase
 
 
 from misago.markup.parser import parse
 from misago.markup.parser import parse
-from misago.markup import checksums
+
+
+class MockRequest(object):
+    pass
+
+
+class MockPoster(object):
+    pass
 
 
 
 
 class ParserTests(TestCase):
 class ParserTests(TestCase):
@@ -36,7 +43,7 @@ Lorem [b]ipsum[/B].
 <p>Lorem <b>ipsum</b>.</p>
 <p>Lorem <b>ipsum</b>.</p>
 """.strip()
 """.strip()
 
 
-        result = parse(test_text)
+        result = parse(test_text, MockRequest(), MockPoster(), minify=False)
         self.assertEqual(expected_result, result['parsed_text'])
         self.assertEqual(expected_result, result['parsed_text'])
 
 
     def test_blocks(self):
     def test_blocks(self):
@@ -53,18 +60,5 @@ Dolor met.
 <p>Dolor met.</p>
 <p>Dolor met.</p>
 """.strip()
 """.strip()
 
 
-        result = parse(test_text)
+        result = parse(test_text, MockRequest(), MockPoster(), minify=False)
         self.assertEqual(expected_result, result['parsed_text'])
         self.assertEqual(expected_result, result['parsed_text'])
-
-
-class ChecksupTests(TestCase):
-    def test_checksums(self):
-        fake_message = "<p>Woow, thats awesome!</p>"
-        post_pk = 231
-
-        checksum = checksums.make_checksum(fake_message, [post_pk])
-
-        self.assertTrue(
-            checksums.is_checksum_valid(fake_message, checksum, [post_pk]))
-        self.assertFalse(
-            checksums.is_checksum_valid(fake_message, checksum, [3]))

+ 1 - 0
misago/project_template/requirements.txt

@@ -3,6 +3,7 @@ beautifulsoup4==4.3.2
 bleach==1.4
 bleach==1.4
 django-debug-toolbar==1.2.1
 django-debug-toolbar==1.2.1
 django-crispy-forms==1.4.0
 django-crispy-forms==1.4.0
+django-htmlmin==0.7
 django-mptt==0.6.1
 django-mptt==0.6.1
 django-pipeline==1.3.25
 django-pipeline==1.3.25
 fake-factory==0.4.2
 fake-factory==0.4.2

+ 4 - 2
misago/threads/forms/posting.py

@@ -15,7 +15,8 @@ class ReplyForm(forms.Form):
 
 
     post = forms.CharField(label=_("Message body"), required=False)
     post = forms.CharField(label=_("Message body"), required=False)
 
 
-    def __init__(self, post=None, *args, **kwargs):
+    def __init__(self, post=None, request=None, *args, **kwargs):
+        self.request = request
         self.post_instance = post
         self.post_instance = post
         self.parsing_result = {}
         self.parsing_result = {}
 
 
@@ -48,7 +49,8 @@ class ReplyForm(forms.Form):
             raise forms.ValidationError(message)
             raise forms.ValidationError(message)
 
 
     def parse_post(self, post):
     def parse_post(self, post):
-        self.parsing_result = common_flavour(post, self.post_instance.poster)
+        self.parsing_result = common_flavour(
+            self.request, self.post_instance.poster, post)
 
 
         self.post_instance.original = self.parsing_result['original_text']
         self.post_instance.original = self.parsing_result['original_text']
         self.post_instance.parsed = self.parsing_result['parsed_text']
         self.post_instance.parsed = self.parsing_result['parsed_text']

+ 8 - 4
misago/threads/posting/reply.py

@@ -23,14 +23,18 @@ class ReplyFormMiddleware(PostingMiddleware):
 
 
         if FormType == ThreadForm:
         if FormType == ThreadForm:
             if self.request.method == 'POST':
             if self.request.method == 'POST':
-                form = FormType(self.thread, self.post, self.request.POST)
+                form = FormType(
+                    self.thread, self.post, self.request, self.request.POST)
             else:
             else:
-                form = FormType(self.thread, self.post, initial=initial_data)
+                form = FormType(
+                    self.thread, self.post, self.request, initial=initial_data)
         else:
         else:
             if self.request.method == 'POST':
             if self.request.method == 'POST':
-                form = FormType(self.post, self.request.POST)
+                form = FormType(
+                    self.post, self.request, self.request.POST)
             else:
             else:
-                form = FormType(self.post, initial=initial_data)
+                form = FormType(
+                    self.post, self.request, initial=initial_data)
 
 
         form.post_editor = Editor(form['post'], has_preview=True)
         form.post_editor = Editor(form['post'], has_preview=True)
         return form
         return form

+ 2 - 2
misago/users/signatures.py

@@ -1,11 +1,11 @@
 from misago.markup import checksums, signature_flavour
 from misago.markup import checksums, signature_flavour
 
 
 
 
-def set_user_signature(user, signature):
+def set_user_signature(request, user, signature):
     user.signature = signature
     user.signature = signature
 
 
     if signature:
     if signature:
-        user.signature_parsed = signature_flavour(signature, user)
+        user.signature_parsed = signature_flavour(request, user, signature)
         user.signature_checksum = make_signature_checksum(
         user.signature_checksum = make_signature_checksum(
             user.signature_parsed, user)
             user.signature_parsed, user)
     else:
     else:

+ 1 - 1
misago/users/views/admin/users.py

@@ -236,7 +236,7 @@ class EditUser(UserAdmin, generic.ModelFormView):
         if form.cleaned_data.get('roles'):
         if form.cleaned_data.get('roles'):
             target.roles.add(*form.cleaned_data['roles'])
             target.roles.add(*form.cleaned_data['roles'])
 
 
-        set_user_signature(target, form.cleaned_data.get('signature'))
+        set_user_signature(request, target, form.cleaned_data.get('signature'))
 
 
         target.update_acl_key()
         target.update_acl_key()
         target.save()
         target.save()

+ 1 - 1
misago/users/views/moderation.py

@@ -259,7 +259,7 @@ def moderate_signature(request, user):
     if request.method == 'POST':
     if request.method == 'POST':
         form = ModerateSignatureForm(request.POST, instance=user)
         form = ModerateSignatureForm(request.POST, instance=user)
         if form.is_valid():
         if form.is_valid():
-            set_user_signature(user, form.cleaned_data['signature'])
+            set_user_signature(request, user, form.cleaned_data['signature'])
             user.save(update_fields=(
             user.save(update_fields=(
                 'signature',
                 'signature',
                 'signature_parsed',
                 'signature_parsed',

+ 5 - 3
misago/users/views/usercp.py

@@ -230,9 +230,11 @@ def edit_signature(request):
     if not request.user.is_signature_locked and request.method == 'POST':
     if not request.user.is_signature_locked and request.method == 'POST':
         form = EditSignatureForm(request.POST, instance=request.user)
         form = EditSignatureForm(request.POST, instance=request.user)
         if form.is_valid():
         if form.is_valid():
-            set_user_signature(request.user, form.cleaned_data['signature'])
-            request.user.save(update_fields=['signature', 'signature_parsed',
-                                             'signature_checksum'])
+            set_user_signature(
+                request, request.user, form.cleaned_data['signature'])
+            request.user.save(update_fields=[
+                'signature', 'signature_parsed', 'signature_checksum'
+            ])
 
 
             if form.cleaned_data['signature']:
             if form.cleaned_data['signature']:
                 messages.success(request, _("Your signature has been edited."))
                 messages.success(request, _("Your signature has been edited."))