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

add pluggy hook to customize mistune plugins

Sam Heybey 3 лет назад
Родитель
Сommit
a0aa008671
3 измененных файлов с 77 добавлено и 1 удалено
  1. 2 0
      docs/development/hooks/startup.rst
  2. 10 1
      flaskbb/markup.py
  3. 65 0
      flaskbb/plugins/spec.py

+ 2 - 0
docs/development/hooks/startup.rst

@@ -24,5 +24,7 @@ The hooks below are listed in the order they are called.
 .. autofunction:: flaskbb_load_translations
 .. autofunction:: flaskbb_load_post_markdown_class
 .. autofunction:: flaskbb_load_nonpost_markdown_class
+.. autofunction:: flaskbb_load_post_markdown_plugins
+.. autofunction:: flaskbb_load_nonpost_markdown_plugins
 .. autofunction:: flaskbb_additional_setup
 

+ 10 - 1
flaskbb/markup.py

@@ -75,12 +75,21 @@ def flaskbb_load_nonpost_markdown_class():
 @impl
 def flaskbb_jinja_directives(app):
     render_classes = app.pluggy.hook.flaskbb_load_post_markdown_class(app=app)
-    plugins = DEFAULT_PLUGINS
+    plugins = DEFAULT_PLUGINS[:]
+    app.pluggy.hook.flaskbb_load_post_markdown_plugins(
+        plugins=plugins,
+        app=app
+    )
     app.jinja_env.filters['markup'] = make_renderer(render_classes, plugins)
 
     render_classes = app.pluggy.hook.flaskbb_load_nonpost_markdown_class(
         app=app
     )
+    plugins = DEFAULT_PLUGINS[:]
+    plugins = app.pluggy.hook.flaskbb_load_nonpost_markdown_plugins(
+        plugins=plugins,
+        app=app
+    )
     app.jinja_env.filters['nonpost_markup'] = make_renderer(
         render_classes,
         plugins

+ 65 - 0
flaskbb/plugins/spec.py

@@ -134,6 +134,71 @@ def flaskbb_load_nonpost_markdown_class(app):
 
 
 @spec
+def flaskbb_load_post_markdown_plugins(plugins, app):
+    """
+    Hook for loading mistune renderer plugins used when rendering markdown on
+    posts and user signatures. Implementations should modify the `plugins`
+    list directly.
+
+    Example of adding plugins::
+
+        from mistune.plugins import plugin_abbr, plugin_table
+
+        @impl
+        def flaskbb_load_post_markdown_plugins(plugins):
+            # add the built-in mistune table and abbr plugins
+            plugins.extend([plugin_abbr, plugin_table])
+
+    Example of removing plugins::
+
+        from flaskbb.markup import plugin_userify
+
+        @impl
+        def flaskbb_load_post_markdown_plugins(plugins):
+            try:
+                # remove the FlaskBB user mention link plugin
+                plugins.remove(plugin_userify)
+            except ValueError:
+                # other FlaskBB plugins might beat you to removing a plugin,
+                # which is not an error. You should not raise an exception in
+                # this case.
+                pass
+
+    :param plugins: List of mistune plugins to load.
+    :type plugins: list
+    :param app: The application object.
+    :type app: Flask
+
+    .. seealso::
+        https://mistune.readthedocs.io/en/v2.0.2/advanced.html#create-plugins
+            Mistune plugin documentation.
+        :data:`~flaskbb.markup.plugin_userify`
+            FlaskBB-provided plugin that links user mentions to their profiles.
+        :data:`~flaskbb.markup.DEFAULT_PLUGINS`
+            List of plugins loaded by default.
+        :func:`flaskbb_load_nonpost_markdown_plugins`
+            Hook to modify the list of plugins for markdown rendering in
+            non-post areas.
+    """
+
+
+@spec
+def flaskbb_load_nonpost_markdown_plugins(plugins, app):
+    """
+    Hook for loading mistune renderer plugins used when rendering markdown in
+    locations other than posts, for example in category or forum
+    descriptions. Implementations should modify the `plugins` list directly.
+
+    See :func:`flaskbb_load_post_markdown_plugins` for more details.
+
+    :param plugins: List of mistune plugins to load.
+    :type plugins: list
+    :param app: The application object.
+    :type app: Flask
+    """
+
+
+@spec
 def flaskbb_cli(cli, app):
     """Hook for registering CLI commands.