Add support for strikethrough in markdown

Fixes #304
This commit is contained in:
rubenwardy 2021-08-21 05:40:20 +01:00
parent c1edea4dc3
commit 32372e8e86
5 changed files with 35 additions and 17 deletions

View File

@ -25,18 +25,14 @@ from flask_flatpages import FlatPages
from flask_babel import Babel from flask_babel import Babel
from flask_login import logout_user, current_user, LoginManager from flask_login import logout_user, current_user, LoginManager
import os, redis import os, redis
from app.markdown import init_markdown, MARKDOWN_EXTENSIONS, MARKDOWN_EXTENSION_CONFIG
app = Flask(__name__, static_folder="public/static") app = Flask(__name__, static_folder="public/static")
app.config["FLATPAGES_ROOT"] = "flatpages" app.config["FLATPAGES_ROOT"] = "flatpages"
app.config["FLATPAGES_EXTENSION"] = ".md" app.config["FLATPAGES_EXTENSION"] = ".md"
app.config["FLATPAGES_MARKDOWN_EXTENSIONS"] = ["fenced_code", "tables", "codehilite", 'toc'] app.config["FLATPAGES_MARKDOWN_EXTENSIONS"] = MARKDOWN_EXTENSIONS
app.config["FLATPAGES_EXTENSION_CONFIG"] = { app.config["FLATPAGES_EXTENSION_CONFIG"] = MARKDOWN_EXTENSION_CONFIG
"fenced_code": {},
"tables": {},
"codehilite": {
"guess_lang": False,
}
}
app.config.from_pyfile(os.environ["FLASK_CONFIG"]) app.config.from_pyfile(os.environ["FLASK_CONFIG"])
r = redis.Redis.from_url(app.config["REDIS_URL"]) r = redis.Redis.from_url(app.config["REDIS_URL"])
@ -55,6 +51,7 @@ gravatar = Gravatar(app,
force_lower=False, force_lower=False,
use_ssl=True, use_ssl=True,
base_url=None) base_url=None)
init_markdown(app)
login_manager = LoginManager() login_manager = LoginManager()
login_manager.init_app(app) login_manager.init_app(app)
@ -69,8 +66,7 @@ if not app.debug and app.config["MAIL_UTILS_ERROR_SEND_TO"]:
app.logger.addHandler(build_handler(app)) app.logger.addHandler(build_handler(app))
from app.utils.markdown import init_app
init_app(app)
# @babel.localeselector # @babel.localeselector
# def get_locale(): # def get_locale():

View File

@ -21,7 +21,7 @@ from flask_wtf import FlaskForm
from wtforms import * from wtforms import *
from wtforms.validators import * from wtforms.validators import *
from app.utils.markdown import render_markdown from app.markdown import render_markdown
from app.models import * from app.models import *
from app.tasks.emails import send_user_email from app.tasks.emails import send_user_email
from app.utils import rank_required, addAuditLog from app.utils import rank_required, addAuditLog

View File

@ -19,7 +19,7 @@ from flask_login import current_user, login_required
from sqlalchemy.sql.expression import func from sqlalchemy.sql.expression import func
from app import csrf from app import csrf
from app.utils.markdown import render_markdown from app.markdown import render_markdown
from app.models import Tag, PackageState, PackageType, Package, db, PackageRelease, Permission, ForumTopic, MinetestRelease, APIToken, PackageScreenshot, License, ContentWarning, User from app.models import Tag, PackageState, PackageType, Package, db, PackageRelease, Permission, ForumTopic, MinetestRelease, APIToken, PackageScreenshot, License, ContentWarning, User
from app.querybuilder import QueryBuilder from app.querybuilder import QueryBuilder
from app.utils import is_package_page, get_int_or_abort from app.utils import is_package_page, get_int_or_abort

View File

@ -6,6 +6,9 @@ from bleach.linkifier import LinkifyFilter
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from markdown import Markdown from markdown import Markdown
from flask import Markup from flask import Markup
from markdown.extensions import Extension
from markdown.inlinepatterns import SimpleTagInlineProcessor
# Based on # Based on
# https://github.com/Wenzil/mdx_bleach/blob/master/mdx_bleach/whitelist.py # https://github.com/Wenzil/mdx_bleach/blob/master/mdx_bleach/whitelist.py
@ -25,7 +28,7 @@ ALLOWED_TAGS = [
"a", "a",
"img", "img",
"table", "thead", "tbody", "tr", "th", "td", "table", "thead", "tbody", "tr", "th", "td",
"div", "span", "div", "span", "del", "s",
] ]
ALLOWED_CSS = [ ALLOWED_CSS = [
@ -68,11 +71,30 @@ def render_markdown(source):
return cleaner.clean(html) return cleaner.clean(html)
def init_app(app): class DelInsExtension(Extension):
def extendMarkdown(self, md):
del_proc = SimpleTagInlineProcessor(r'(\~\~)(.+?)(\~\~)', 'del')
md.inlinePatterns.register(del_proc, 'del', 200)
ins_proc = SimpleTagInlineProcessor(r'(\+\+)(.+?)(\+\+)', 'ins')
md.inlinePatterns.register(ins_proc, 'ins', 200)
MARKDOWN_EXTENSIONS = ["fenced_code", "tables", "codehilite", "toc", DelInsExtension()]
MARKDOWN_EXTENSION_CONFIG = {
"fenced_code": {},
"tables": {},
"codehilite": {
"guess_lang": False,
}
}
def init_markdown(app):
global md global md
md = Markdown(extensions=app.config["FLATPAGES_MARKDOWN_EXTENSIONS"], md = Markdown(extensions=MARKDOWN_EXTENSIONS,
extension_configs=app.config["FLATPAGES_EXTENSION_CONFIG"], extension_configs=MARKDOWN_EXTENSION_CONFIG,
output_format="html5") output_format="html5")
@app.template_filter() @app.template_filter()

View File

@ -6,7 +6,7 @@ from flask_babel import format_timedelta, gettext
from urllib.parse import urlparse from urllib.parse import urlparse
from datetime import datetime as dt from datetime import datetime as dt
from .utils.markdown import get_headings from app.markdown import get_headings
@app.context_processor @app.context_processor