Rafał Pitoń 8 лет назад
Родитель
Сommit
2cbe176f15

+ 6 - 1
misago/datamover/management/commands/movethreads.py

@@ -1,4 +1,4 @@
-from ... import attachments, polls, threads
+from ... import attachments, markup, polls, threads
 from ..base import BaseCommand
 
 
@@ -52,3 +52,8 @@ class Command(BaseCommand):
         threads.clean_private_threads(self.stdout, self.style)
         self.stdout.write(
             self.style.SUCCESS("Cleaned private threads in %s" % self.stop_timer()))
+
+        self.start_timer()
+        markup.clean_posts()
+        self.stdout.write(
+            self.style.SUCCESS("Cleaned markup in %s" % self.stop_timer()))

+ 109 - 4
misago/datamover/markup.py

@@ -1,6 +1,111 @@
-def convert_original(content):
-    return content
+from __future__ import unicode_literals
 
+import re
 
-def convert_parsed(content):
-    return content
+from misago.core.pgutils import batch_update
+from misago.threads.checksums import update_post_checksum
+from misago.threads.models import Post
+
+from . import fetch_assoc, movedids
+
+
+def clean_posts():
+    for post in batch_update(Post.objects):
+        print '----' * 8
+        post.original = clean_original(post.original)
+        post.parsed = clean_parsed(post.parsed)
+
+        # update_post_checksum(post)
+        # post.save()
+
+
+def clean_original(post):
+    post = convert_quotes_to_bbcode(post)
+
+    return post
+
+
+def clean_parsed(post):
+    post = update_quotes_markup(post)
+
+    return post
+
+
+def convert_quotes_to_bbcode(post):
+    if not (post[0] == '>' or '\n>' in post):
+        return post
+
+    clean_lines = []
+
+    in_quote = False
+    quote_author = None
+    quote = []
+
+    for i, line in enumerate(post.splitlines() + ['']):
+        if in_quote:
+            if line.startswith('>'):
+                quote.append(line[1:].lstrip())
+            else:
+                clean_lines.append('')
+                if quote_author:
+                    clean_lines.append('[quote="%s"]' % quote_author)
+                clean_lines += quote
+                clean_lines.append('[/quote]')
+                clean_lines.append('')
+
+                in_quote = False
+                quote_author = None
+                quote = []
+
+                clean_lines.append(line)
+        elif line.startswith('>'):
+            in_quote = True
+
+            if clean_lines and clean_lines[-1].startswith('@'):
+                quote_author = clean_lines.pop(-1)
+
+            quote.append(line[1:].lstrip())
+        else:
+            clean_lines.append(line)
+
+    return convert_quotes_to_bbcode('\n'.join(clean_lines))
+
+
+MD_QUOTE_RE = re.compile(r'''
+<blockquote>(?P<content>.*?)</blockquote>
+'''.strip(), re.IGNORECASE | re.MULTILINE | re.DOTALL);
+MD_QUOTE_TITLE_RE = re.compile(r'''
+<quotetitle>(?P<content>.*?)</quotetitle>
+'''.strip(), re.IGNORECASE | re.MULTILINE | re.DOTALL);
+MD_QUOTE_CONTENT_RE = re.compile(r'''
+<article>(?P<content>.*?)</article>
+'''.strip(), re.IGNORECASE | re.MULTILINE | re.DOTALL);
+
+
+def update_quotes_markup(post):
+    if not ('<blockquote>' in post and '<article>' in post):
+        return post
+
+    post = MD_QUOTE_RE.sub(replace_quote, post)
+
+    return update_quotes_markup(post)
+
+
+def replace_quote(matchobj):
+    title_match = MD_QUOTE_TITLE_RE.search(matchobj.group('content'))
+    content_match = MD_QUOTE_CONTENT_RE.search(matchobj.group('content'))
+
+    if not (title_match and content_match):
+        return matchobj.group('content')
+
+    title = title_match.group('content')
+    content = content_match.group('content')
+
+    return '\n'.join([
+        '<aside class="quote-block">',
+        '<div class="quote-heading">%s</div>' % title,
+        '<blockquote class="quote-body">',
+        content.strip(),
+        '</blockquote>',
+        '</aside>',
+    ])

+ 5 - 8
misago/datamover/threads.py

@@ -97,8 +97,8 @@ def move_posts():
             poster=poster,
             poster_name=post['user_name'],
             poster_ip=post['ip'],
-            original=markup.convert_original(post['post']),
-            parsed=markup.convert_parsed(post['post_preparsed']),
+            original=post['post'],
+            parsed=post['post_preparsed'],
             posted_on=localise_datetime(post['date']),
             updated_on=localise_datetime(post['current_date'] or post['date']),
             hidden_on=localise_datetime(post['delete_date'] or post['date']),
@@ -114,9 +114,6 @@ def move_posts():
             likes=post['upvotes']
         )
 
-        update_post_checksum(new_post)
-        new_post.save()
-
         movedids.set('post', post['id'], new_post.pk)
 
 
@@ -163,7 +160,7 @@ def move_post_edits(post, old_id):
             editor = None
 
         if changelog:
-            changelog[-1].edited_to = edit['post_content']
+            changelog[-1].edited_to = markup.clean_original(edit['post_content'])
 
         changelog.append(PostEdit(
             category=post.category,
@@ -174,8 +171,8 @@ def move_post_edits(post, old_id):
             editor_name=edit['user_name'],
             editor_slug=edit['user_slug'],
             editor_ip=edit['ip'],
-            edited_from=edit['post_content'],
-            edited_to=post.original,
+            edited_from=markup.clean_original(edit['post_content']),
+            edited_to=markup.clean_original(post.original),
         ))
 
     if changelog: