Просмотр исходного кода

Merge pull request #72 from novist/markdown

Markdown support
Peter Justin 10 лет назад
Родитель
Сommit
bb34fae941

+ 12 - 0
flaskbb/fixtures/settings.py

@@ -14,6 +14,11 @@ from flask.ext.themes2 import get_themes_list
 def available_themes():
     return [(theme.identifier, theme.name) for theme in get_themes_list()]
 
+
+def available_markups():
+    return [('bbcode', 'BBCode'), ('markdown', 'Markdown')]
+
+
 fixture = (
     # Settings Group
     ('general', {
@@ -79,6 +84,13 @@ fixture = (
                 'extra':        {'min': 0},
                 'name':         "Tracker length",
                 'description':  "The days for how long the forum should deal with unread topics. 0 to disable it."
+            }),
+            ('markup_type', {
+                'value':        "bbcode",
+                'value_type':   "select",
+                'extra':        {'choices': available_markups},
+                'name':         "Post markup",
+                'description':  "Select post markup type."
             })
         ),
     }),

+ 9 - 2
flaskbb/forum/views.py

@@ -17,7 +17,7 @@ from flask.ext.login import login_required, current_user
 
 from flaskbb.extensions import db
 from flaskbb.utils.settings import flaskbb_config
-from flaskbb.utils.helpers import get_online_users, time_diff, render_template
+from flaskbb.utils.helpers import get_online_users, time_diff, render_template, format_quote
 from flaskbb.utils.permissions import (can_post_reply, can_post_topic,
                                        can_delete_topic, can_delete_post,
                                        can_edit_post, can_moderate)
@@ -321,7 +321,7 @@ def reply_post(topic_id, post_id):
             form.save(current_user, topic)
             return redirect(post.topic.url)
     else:
-        form.content.data = '[quote]{}[/quote]'.format(post.content)
+        form.content.data = format_quote(post)
 
     return render_template("forum/new_post.html", topic=post.topic, form=form)
 
@@ -394,6 +394,13 @@ def report_post(post_id):
     return render_template("forum/report_post.html", form=form)
 
 
+@forum.route("/post/<int:post_id>/format_quote", methods=["POST", "GET"])
+@login_required
+def raw_post(post_id):
+    post = Post.query.filter_by(id=post_id).first_or_404()
+    return format_quote(post)
+
+
 @forum.route("/markread")
 @forum.route("/<int:forum_id>/markread")
 @forum.route("/<int:forum_id>-<slug>/markread")

+ 12 - 16
flaskbb/static/js/topic.js

@@ -1,22 +1,18 @@
 /**
- * Topic.js
+ * topic.js
  */
 $(document).ready(function () {
-        $(".quote_btn").click(function (event) {
-            event.preventDefault();
+    // Quote
+    $('.quote_btn').click(function (event) {
+        event.preventDefault();
+        var post_id = $(this).attr('data-post-id');
 
-            // QuickReply Textarea
-            var $contents = $(".reply-content textarea#content");
-            // Original Post
-            var $original = $(".post_body#" + $(this).attr('data-post-id'));
-            // Content of the Post, in plaintext (strips tags) and without the signature
-            var content = $original.clone().find('.signature').remove().end().text().trim();
-
-            // Add quote to the Quickreply Textarea
-            if ($contents.length > 0) {
-                $contents.val($contents.val() + "\n[quote]" + content + "[/quote]");
-            } else {
-        $contents.val("[quote]" + content + "[/quote]");
-        }
+        $.get('/post/' + post_id + '/format_quote', function(text) {
+            var $contents = $('.reply-content textarea#content');
+            $contents.val(($contents.val() + '\n' + text).trim() + '\n');
+            $contents.selectionStart = $contents.selectionEnd = $contents.val().length;
+            $contents[0].scrollTop = $contents[0].scrollHeight;
+            window.location.href = '#content';
+        });
     });
 });

+ 2 - 2
flaskbb/templates/forum/topic.html

@@ -173,7 +173,7 @@
                     {% endif %}
                     {% if current_user|post_reply(topic.forum) and not (topic.locked or topic.forum.locked) %}
                         <!-- Quick quote -->
-                        <a href="#" class="quote_btn" data-post-id="pid{{ post.id }}">Quote</a> |
+                        <a href="#" class="quote_btn" data-post-id="{{ post.id }}">Quote</a> |
                         <!-- Full quote/reply -->
                         <a href="{{ url_for('forum.reply_post', topic_id=topic.id, post_id=post.id) }}">Reply</a>
                     {% endif %}
@@ -198,5 +198,5 @@
 {% endblock %}
 
 {% block scripts %}
-<script type="text/javascript" src="{{ url_for('static', filename='js/topic.js') }}"></script>
+    <script type="text/javascript" src="{{ url_for('static', filename='js/topic.js') }}"></script>
 {% endblock %}

+ 18 - 2
flaskbb/utils/helpers.py

@@ -14,11 +14,12 @@ import itertools
 import operator
 from datetime import datetime, timedelta
 
-from flask import session
+from flask import session, url_for
 from flask.ext.themes2 import render_theme_template
 from flask.ext.login import current_user
 
 from postmarkup import render_bbcode
+from markdown2 import markdown as render_markdown
 import unidecode
 from flaskbb._compat import range_method, text_type
 
@@ -279,7 +280,11 @@ def render_markup(text):
 
     :param text: The text that should be rendered as bbcode
     """
-    return render_bbcode(text)
+    if flaskbb_config['MARKUP_TYPE'] == 'bbcode':
+        return render_bbcode(text)
+    elif flaskbb_config['MARKUP_TYPE'] == 'markdown':
+        return render_markdown(text, extras=['tables'])
+    return text
 
 
 def is_online(user):
@@ -349,3 +354,14 @@ def time_delta_format(dt, default=None):
             return u'%d %s ago' % (period, plural)
 
     return default
+
+
+def format_quote(post):
+    if flaskbb_config['MARKUP_TYPE'] == 'markdown':
+        profile_url = url_for('user.profile', username=post.username)
+        content = '\n> '.join(post.content.strip().split('\n'))
+        return 'Quote from [{post.username}]({profile_url}):\n> {content}\n'.format(**locals())
+    else:
+        profile_url = url_for('user.profile', username=post.username, _external=True)
+        return 'Quote from [url={profile_url}]{post.username}[/url]:\n[quote]{post.content}[/quote]\n'.\
+            format(**locals())

+ 2 - 1
requirements.txt

@@ -30,5 +30,6 @@ redis==2.10.3
 simplejson==3.6.4
 flask-redis==0.0.6
 unidecode==0.04.16
+markdown2==2.3.0
 https://github.com/frol/postmarkup/tarball/master#egg=postmarkup
-https://github.com/jshipley/Flask-WhooshAlchemy/archive/master.zip#egg=Flask-Whooshalchemy
+https://github.com/jshipley/Flask-WhooshAlchemy/archive/master.zip#egg=Flask-Whooshalchemy