Browse Source

parser's link cleaner tweaked

Rafał Pitoń 8 years ago
parent
commit
5649c32ce1

+ 1 - 1
frontend/src/components/editor/actions/link.js

@@ -34,7 +34,7 @@ export function insertLink(selection, replace) {
     if (label.length > 0) {
       replace('[' + label + '](' + url + ')');
     } else {
-      replace('<' + url + '>');
+      replace(url);
     }
   }
 }

+ 1 - 1
misago/markup/api.py

@@ -23,5 +23,5 @@ def parse_markup(request):
         }, status=status.HTTP_400_BAD_REQUEST)
 
     return Response({
-        'parsed': common_flavour(request, request.user, post)['parsed_text']
+        'parsed': common_flavour(request, request.user, post, force_shva=True)['parsed_text']
     })

+ 2 - 2
misago/markup/flavours.py

@@ -1,7 +1,7 @@
 from .parser import parse
 
 
-def common(request, poster, text, allow_mentions=True):
+def common(request, poster, text, allow_mentions=True, force_shva=False):
     """
     Common flavour
 
@@ -12,7 +12,7 @@ def common(request, poster, text, allow_mentions=True):
 
     Returns dict object
     """
-    return parse(text, request, poster, allow_mentions=allow_mentions)
+    return parse(text, request, poster, allow_mentions=allow_mentions, force_shva=force_shva)
 
 
 def limited(request, text):

+ 14 - 8
misago/markup/parser.py

@@ -4,6 +4,8 @@ import markdown
 
 import bleach
 from bs4 import BeautifulSoup
+from django.core.urlresolvers import resolve
+from django.http import Http404
 from django.utils import six
 from htmlmin.minify import html_minify
 
@@ -17,7 +19,7 @@ __all__ = ['parse']
 
 
 def parse(text, request, poster, allow_mentions=True, allow_links=True,
-          allow_images=True, allow_blocks=True, minify=True):
+          allow_images=True, allow_blocks=True, force_shva=False, minify=True):
     """
     Message parser
 
@@ -59,7 +61,7 @@ def parse(text, request, poster, allow_mentions=True, allow_links=True,
         add_mentions(request, parsing_result)
 
     if allow_links or allow_images:
-        clean_links(request, parsing_result)
+        clean_links(request, parsing_result, force_shva)
 
     if minify:
         minify_result(parsing_result)
@@ -83,10 +85,7 @@ def md_factory(allow_links=True, allow_images=True, allow_blocks=True):
     md.inlinePatterns.add('bb_i', inline.italics, '<emphasis')
     md.inlinePatterns.add('bb_u', inline.underline, '<emphasis2')
 
-    if allow_links:
-        # Add [url]
-        pass
-    else:
+    if not allow_links:
         # Remove links
         del md.inlinePatterns['link']
         del md.inlinePatterns['autolink']
@@ -101,7 +100,7 @@ def md_factory(allow_links=True, allow_images=True, allow_blocks=True):
         del md.inlinePatterns['image_link']
 
     if allow_blocks:
-        # Add [hr] [quote], [spoiler], [list] and [code] blocks
+        # Add [hr], [quote] and [code] blocks
         md.parser.blockprocessors.add('bb_hr', blocks.BBCodeHRProcessor(md.parser), '>hr')
     else:
         # Remove blocks
@@ -120,7 +119,7 @@ def linkify_paragraphs(result):
     result['parsed_text'] = bleach.linkify(result['parsed_text'], skip_pre=True, parse_email=True)
 
 
-def clean_links(request, result):
+def clean_links(request, result, force_shva=False):
     host = request.get_host()
     site_address = '%s://%s' % (request.scheme, request.get_host())
 
@@ -128,6 +127,13 @@ def clean_links(request, result):
     for link in soup.find_all('a'):
         if is_internal_link(link['href'], host):
             link['href'] = clean_internal_link(link['href'], host)
+            if force_shva:
+                try:
+                    resolution = resolve(link['href'])
+                    print resolution
+                except (Http404, ValueError):
+                    pass
+            result['inside_links'].append(link['href'])
         else:
             result['outgoing_links'].append(link['href'])
 

+ 13 - 0
misago/markup/tests/test_parser.py

@@ -226,3 +226,16 @@ Lorem ipsum: http://somewhere.com/somewhere-something/
 
         result = parse(test_text, MockRequest(), MockPoster(), minify=True)
         self.assertEqual(expected_result, result['parsed_text'])
+
+    def test_force_shva(self):
+        """parser appends ?shva=1 bit to attachment links"""
+        test_text = """
+            ![3.png](http://test.com/attachment/thumb/test-43/)
+        """
+
+        expected_result = """
+<p><img alt="3.png" src="/attachment/thumb/test-43/?shva=1"/></p>
+""".strip()
+
+        result = parse(test_text, MockRequest(), MockPoster(), minify=True)
+        self.assertEqual(expected_result, result['parsed_text'])