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

Merge remote-tracking branch 'upstream/master' into permissions-improvements

novist 10 лет назад
Родитель
Сommit
28261b0ff0

+ 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)
@@ -293,7 +293,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)
 
@@ -356,6 +356,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")

+ 113 - 115
flaskbb/plugins/portal/templates/index.html

@@ -76,132 +76,130 @@
 {% endblock %}
 
 {% block content %}
-  <div class="container main-content">
-    <div class="row">
-
-      <!-- Left -->
-      <div class="col-md-8">
-        <div class="panel panel-default">
-          <div class="panel-heading">
-            <h3 class="panel-title">News</h3>
-          </div>
-          <div class="panel-body" style="padding-top: 0px">
-
-          {% for topic in news.items %}
-            <h1><a href="{{ topic.url }}">{{ topic.title }}</a></h1>
-            <ul class="portal-info">
-                <li><i class="fa fa-calendar"></i> {{ topic.date_created|format_date('%b %d %Y') }}</li>
-                <li><i class="fa fa-user"></i> <a href="{{ url_for('user.profile', username=topic.user.username) }}">{{ topic.user.username }}</a></li>
-                <li><i class="fa fa-comment"></i> <a href="{{ topic.url }}">Comments ({{ topic.post_count }})</a></li>
-            </ul>
-            <div class="portal-content">
-                {{ topic.first_post.content | markup | safe }}<br />
-            </div>
-            {% if not loop.last %}<hr>{% endif %}
-          {% endfor %}
+<div class="row">
 
-          </div> <!-- /.panel-body -->
+  <!-- Left -->
+  <div class="col-md-8">
+    <div class="panel panel-default">
+      <div class="panel-heading">
+        <h3 class="panel-title">News</h3>
+      </div>
+      <div class="panel-body" style="padding-top: 0px">
+
+      {% for topic in news.items %}
+        <h1><a href="{{ topic.url }}">{{ topic.title }}</a></h1>
+        <ul class="portal-info">
+            <li><i class="fa fa-calendar"></i> {{ topic.date_created|format_date('%b %d %Y') }}</li>
+            <li><i class="fa fa-user"></i> <a href="{{ url_for('user.profile', username=topic.user.username) }}">{{ topic.user.username }}</a></li>
+            <li><i class="fa fa-comment"></i> <a href="{{ topic.url }}">Comments ({{ topic.post_count }})</a></li>
+        </ul>
+        <div class="portal-content">
+            {{ topic.first_post.content | markup | safe }}<br />
         </div>
+        {% if not loop.last %}<hr>{% endif %}
+      {% endfor %}
+
+      </div> <!-- /.panel-body -->
+    </div>
 
+  </div>
+
+  <!-- Right -->
+  <div class="col-md-4">
+    <div class="panel panel-default">
+      <div class="panel-heading">
+        <h3 class="panel-title">Recent Topics</h3>
       </div>
+      <div class="panel-body">
+      {% for topic in recent_topics %}
 
-      <!-- Right -->
-      <div class="col-md-4">
-        <div class="panel panel-default">
-          <div class="panel-heading">
-            <h3 class="panel-title">Recent Topics</h3>
-          </div>
-          <div class="panel-body">
-          {% for topic in recent_topics %}
-
-              <div class="portal-topic">
-                <div class="portal-topic-name">
-                  <a href="{{ topic.url }}">{{ topic.title }}</a>
-                </div>
-                <div class="portal-topic-updated-by">
-                  <a href="{{ url_for('user.profile', username=topic.user.username) }}">{{ topic.user.username }}</a>
-                </div>
-                <div class="portal-topic-updated">
-                  {{ topic.date_created | time_since }}
-                </div>
-              </div> <!-- /.topic -->
-
-          {% endfor %}
-          </div>
-        </div>
+          <div class="portal-topic">
+            <div class="portal-topic-name">
+              <a href="{{ topic.url }}">{{ topic.title }}</a>
+            </div>
+            <div class="portal-topic-updated-by">
+              <a href="{{ url_for('user.profile', username=topic.user.username) }}">{{ topic.user.username }}</a>
+            </div>
+            <div class="portal-topic-updated">
+              {{ topic.date_created | time_since }}
+            </div>
+          </div> <!-- /.topic -->
 
-        <div class="panel panel-default">
-          <div class="panel-heading">
-            <h3 class="panel-title">Statistics</h3>
-          </div>
-          <div class="panel-body">
-
-                <div class="portal-stats">
-                  <div class="portal-stats-left">
-                    Topics
-                  </div>
-                  <div class="portal-stats-right">
-                    {{ topic_count }}
-                  </div>
-                </div>
-
-                <div class="portal-stats">
-                  <div class="portal-stats-left">
-                    Posts
-                  </div>
-                  <div class="portal-stats-right">
-                    {{ post_count }}
-                  </div>
-                </div>
-
-                <div class="portal-stats">
-                  <div class="portal-stats-left">
-                    Registered Users
-                  </div>
-                  <div class="portal-stats-right">
-                    {{ user_count }}
-                  </div>
-                </div>
-
-                {% if newest_user %}
-                <div class="portal-stats">
-                  <div class="portal-stats-left">
-                    Newest User
-                  </div>
-                  <div class="portal-stats-right">
-                    <a href="{{ newest_user.url }}">{{ newest_user.username }}</a>
-                  </div>
-                </div>
-                {% endif %}
-
-                <div class="portal-stats">
-                  <div class="portal-stats-left">
-                    Online Users
-                  </div>
-
-                  <div class="portal-stats-right">
-                    {{ online_users }}
-                  </div>
-                </div>
-
-                {% if config["REDIS_ENABLED"] %}
-                <div class="portal-stats">
-                  <div class="portal-stats-left">
-                    Guests online
-                  </div>
-
-                  <div class="portal-stats-right">
-                    {{ online_guests }}
-                  </div>
-                </div>
-                {% endif %}
-          </div>
-        </div>
+      {% endfor %}
+      </div>
+    </div>
+
+    <div class="panel panel-default">
+      <div class="panel-heading">
+        <h3 class="panel-title">Statistics</h3>
       </div>
+      <div class="panel-body">
+
+            <div class="portal-stats">
+              <div class="portal-stats-left">
+                Topics
+              </div>
+              <div class="portal-stats-right">
+                {{ topic_count }}
+              </div>
+            </div>
+
+            <div class="portal-stats">
+              <div class="portal-stats-left">
+                Posts
+              </div>
+              <div class="portal-stats-right">
+                {{ post_count }}
+              </div>
+            </div>
+
+            <div class="portal-stats">
+              <div class="portal-stats-left">
+                Registered Users
+              </div>
+              <div class="portal-stats-right">
+                {{ user_count }}
+              </div>
+            </div>
+
+            {% if newest_user %}
+            <div class="portal-stats">
+              <div class="portal-stats-left">
+                Newest User
+              </div>
+              <div class="portal-stats-right">
+                <a href="{{ newest_user.url }}">{{ newest_user.username }}</a>
+              </div>
+            </div>
+            {% endif %}
 
+            <div class="portal-stats">
+              <div class="portal-stats-left">
+                Online Users
+              </div>
+
+              <div class="portal-stats-right">
+                {{ online_users }}
+              </div>
+            </div>
+
+            {% if config["REDIS_ENABLED"] %}
+            <div class="portal-stats">
+              <div class="portal-stats-left">
+                Guests online
+              </div>
+
+              <div class="portal-stats-right">
+                {{ online_guests }}
+              </div>
+            </div>
+            {% endif %}
+      </div>
     </div>
   </div>
 
+</div>
+
 
 
 {% endblock %}

+ 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

@@ -130,7 +130,7 @@
                     {% endif %}
                     {% if current_user|post_reply(topic) %}
                         <!-- 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 %}
@@ -157,5 +157,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