Selaa lähdekoodia

feat: 使用editor.md代替PageDown

SongZihuan 3 vuotta sitten
vanhempi
sitoutus
6e21c356a5
10 muutettua tiedostoa jossa 60 lisäystä ja 26 poistoa
  1. 3 0
      .gitmodules
  2. 0 3
      app/app.py
  3. 7 12
      app/docx.py
  4. 0 4
      init.sql
  5. 2 2
      object/blog.py
  6. BIN
      requirements.txt
  7. 2 2
      sql/blog.py
  8. 1 0
      static/editor.md
  9. 25 1
      templates/docx/article.html
  10. 20 2
      templates/docx/docx.html

+ 3 - 0
.gitmodules

@@ -0,0 +1,3 @@
+[submodule "static/editor.md"]
+	path = static/editor.md
+	url = git@github.com:pandao/editor.md.git

+ 0 - 3
app/app.py

@@ -5,7 +5,6 @@ from flask import Flask, url_for, request, current_app, g, render_template
 from flask_mail import Mail
 from flask_login import LoginManager, current_user
 from flask.logging import default_handler
-from flask_pagedown import PageDown
 from typing import Optional, Union
 
 import logging.handlers
@@ -44,8 +43,6 @@ class HBlogFlask(Flask):
         self.login_manager.login_view = "auth.login_page"
 
         self.mail = Mail(self)
-        self.pagedown = PageDown()
-        self.pagedown.init_app(self)
 
         self.logger.removeHandler(default_handler)
         self.logger.setLevel(conf["LOG_LEVEL"])

+ 7 - 12
app/docx.py

@@ -1,11 +1,8 @@
 from flask import Blueprint, render_template, abort, redirect, url_for, flash, make_response
 from flask_wtf import FlaskForm
-from flask_pagedown.fields import PageDownField
 from flask_login import login_required, current_user
 from wtforms import TextAreaField, StringField, SubmitField
 from wtforms.validators import DataRequired
-import bleach
-from markdown import markdown
 
 import app
 from sql.base import DBBit
@@ -14,17 +11,19 @@ from object.comment import Comment
 from object.archive import load_archive_by_name
 
 docx = Blueprint("docx", __name__)
-allow_tag = ['a', 'abbr', 'acronym', 'b', 'br', 'blockquote', 'code', 'em', 'i', 'li', 'ol', 'pre', 'strong', 'small',
-             'ul', 'h1', 'h2', 'h3', 'h4', 'h5' 'h6', 'p']
 
 
 class WriteBlogForm(FlaskForm):
     title = StringField("标题", validators=[DataRequired()])
     subtitle = StringField("副标题", validators=[DataRequired()])
     archive = StringField("归档")
-    context = PageDownField("博客内容", validators=[DataRequired()])
+    context = TextAreaField("博客内容", validators=[DataRequired()])
     submit = SubmitField("提交博客")
 
+    def __init__(self, **kwargs):
+        super().__init__(**kwargs)
+        self.context.data = "# Blog Title\n## Blog subtitle\nHello, World"
+
 
 class WriteCommentForm(FlaskForm):
     context = TextAreaField(validators=[DataRequired()])
@@ -93,7 +92,7 @@ def article_down_page(blog_id: int):
         return
 
     response = make_response(article.context)
-    response.headers["Content-Disposition"] = f"attachment;filename={article.title.encode().decode('latin-1')}.html"
+    response.headers["Content-Disposition"] = f"attachment;filename={article.title.encode().decode('latin-1')}.md"
     app.HBlogFlask.print_load_page_log(f"download article (id: {blog_id})")
     return response
 
@@ -135,11 +134,7 @@ def create_docx_page(form: WriteBlogForm):
         if f_ is not None:
             archive_list.append(f_)
 
-    context = bleach.linkify(
-        bleach.clean(
-            markdown(form.context.data, output_format='html'), tags=allow_tag, strip=True))
-
-    if BlogArticle(None, current_user, title, subtitle, context, archive=archive_list).create():
+    if BlogArticle(None, current_user, title, subtitle, form.context.data, archive=archive_list).create():
         app.HBlogFlask.print_sys_opt_success_log("write blog")
         flash(f"博客 {title} 发表成功")
     else:

+ 0 - 4
init.sql

@@ -68,8 +68,6 @@ CREATE TABLE IF NOT EXISTS blog -- 创建博客表
     Title      char(20) NOT NULL,                           -- 标题
     SubTitle   char(20) NOT NULL,                           -- 副标题
     Context    TEXT     NOT NULL,                           -- 内容
-    Quote      char(100),                                   -- 引用网站
-    Spider     char(10),                                    -- 爬虫类型
     CreateTime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 创建的时间
     UpdateTime DATETIME NOT NULL DEFAULT (CreateTime),      -- 创建的时间
     Top        BIT      NOT NULL DEFAULT 0,                 -- 置顶
@@ -112,8 +110,6 @@ SELECT blog.ID          AS BlogID,
        Title,
        SubTitle,
        Context,
-       Quote,
-       Spider,
        CreateTime,
        UpdateTime,
        Top

+ 2 - 2
object/blog.py

@@ -31,8 +31,8 @@ def load_blog_by_id(blog_id) -> "Optional[BlogArticle]":
     title = blog[1]
     subtitle = blog[2]
     context = blog[3]
-    update_time = blog[6]
-    top = blog[7]
+    update_time = blog[4]
+    top = blog[5]
     comment = object.comment.load_comment_list(blog_id)
     archive = object.archive.Archive.get_blog_archive(blog_id)
     return BlogArticle(blog_id, auth, title, subtitle, context, update_time, top, comment, archive)

BIN
requirements.txt


+ 2 - 2
sql/blog.py

@@ -3,7 +3,7 @@ from typing import Optional, List
 import object.archive
 
 
-def create_blog(auth_id: int, title: str, subtitle:str, context: str, archive_list: List[object.archive.Archive]) -> bool:
+def create_blog(auth_id: int, title: str, subtitle: str, context: str, archive_list: List[object.archive.Archive]) -> bool:
     """写入新的blog"""
     cur = db.insert(table="blog", columns=["Auth", "Title", "SubTitle", "Context"],
                     values=f"{auth_id}, '{title}', '{subtitle}', '{context}'")
@@ -20,7 +20,7 @@ def create_blog(auth_id: int, title: str, subtitle:str, context: str, archive_li
 
 def read_blog(blog_id: int) -> list:
     """读取blog内容"""
-    cur = db.search(columns=["Auth", "Title", "SubTitle", "Context", "Quote", "Spider", "UpdateTime", "Top"],
+    cur = db.search(columns=["Auth", "Title", "SubTitle", "Context", "UpdateTime", "Top"],
                     table="blog",
                     where=f"ID={blog_id}")
     if cur is None or cur.rowcount == 0:

+ 1 - 0
static/editor.md

@@ -0,0 +1 @@
+Subproject commit 63786e671e2c1a1fd2be25b54a8910cd3bbc7c0a

+ 25 - 1
templates/docx/article.html

@@ -6,6 +6,7 @@
 {% block style %}
     {{ super() }}
     <link href="{{ url_for('static', filename='styles/docx/article.css') }}" rel="stylesheet">
+    <link rel="stylesheet" href="{{ url_for('static', filename='editor.md/css/editormd.min.css') }}" />
 {% endblock %}
 
 {% block context %}
@@ -21,7 +22,10 @@
                     <a href="{{ url_for('docx.article_down_page', blog_id=article.blog_id) }}"> 下载 </a>
                     <hr>
 
-                    {{ article.context | safe }}
+                    <div id="markdown-view">
+                        {# 不要插入label #}
+                        <textarea style="display:none;"> {{ article.context }} </textarea>
+                    </div>
                 </article>
             </div>
         {% endif %}
@@ -106,4 +110,24 @@
             </div>
         {% endif %}
     </section>
+{% endblock %}
+
+{% block javascript %}
+    {{ super() }}
+    <script src="{{ url_for('static', filename='editor.md/editormd.min.js') }}"></script>
+    <script src="{{ url_for('static', filename='editor.md/lib/marked.min.js') }}"></script>
+    <script src="{{ url_for('static', filename='editor.md/lib/prettify.min.js') }}"></script>
+    <script type="text/javascript">
+        $(function() {
+            let editor = editormd.markdownToHTML("markdown-view", {
+                path: "{{ url_for('static',filename='editor.md/lib/') }}",
+                saveHTMLToTextarea: true,
+                emoji: true,
+                taskList: true,
+                tex: true,
+                flowChart: true,
+                sequenceDiagram: true,
+            });
+        });
+    </script>
 {% endblock %}

+ 20 - 2
templates/docx/docx.html

@@ -6,6 +6,7 @@
 {% block style %}
     {{ super() }}
     <link href="{{ url_for('static', filename='styles/docx/docx.css') }}" rel="stylesheet">
+    <link rel="stylesheet" href="{{ url_for('static', filename='editor.md/css/editormd.min.css') }}" />
 {% endblock %}
 
 {% block context %}
@@ -32,7 +33,9 @@
                                 {{ form.archive(class="form-control") }}
                             </div>
 
-                            {{ form.context(class="form-control mb-2", rows="15") }}
+                            <div id="editor">
+                                {{ form.context(class="form-control mb-2", style="display:none;") }}
+                            </div>
 
                             <div id="CreateModal" class="modal fade" role="dialog" aria-hidden="true">
                                 <div class="modal-dialog">
@@ -122,5 +125,20 @@
 
 {% block javascript %}
     {{ super() }}
-    {{ pagedown.include_pagedown() }}
+    <script src="{{ url_for('static', filename='editor.md/editormd.min.js') }}"></script>
+    <script type="text/javascript">
+        $(function() {
+            let editor = editormd("editor", {
+                height: 400,
+                path: "{{ url_for('static',filename='editor.md/lib/') }}",
+                placeholder: "请写下你的日志...",
+                saveHTMLToTextarea: true,
+                emoji: true,
+                taskList: true,
+                tex: true,
+                flowChart: true,
+                sequenceDiagram: true,
+            });
+        });
+    </script>
 {% endblock %}