markdown: Organize preprocessor priorities in one place.

All of our custom Markdown extensions have priorities that govern
the order in which the preprocessors will be run. It is more
convenient to have these all in one file so that you can easily
discern the order at first glance.

Thanks to Alya Abbott for reporting the bug that led to this
refactoring!
This commit is contained in:
Eeshan Garg
2021-09-17 13:01:36 -04:00
committed by Tim Abbott
parent 6367384510
commit bfbd77ca5c
11 changed files with 66 additions and 14 deletions

View File

@@ -8,6 +8,7 @@ from django.utils.html import escape as escape_html
from markdown.extensions import Extension
from markdown.preprocessors import Preprocessor
from zerver.lib.markdown.preprocessor_priorities import PREPROCESSOR_PRIORITES
from zerver.openapi.openapi import (
check_deprecated_consistency,
get_openapi_parameters,
@@ -30,7 +31,9 @@ class MarkdownArgumentsTableGenerator(Extension):
def extendMarkdown(self, md: markdown.Markdown) -> None:
md.preprocessors.register(
APIArgumentsTablePreprocessor(md, self.getConfigs()), "generate_api_arguments", 505
APIArgumentsTablePreprocessor(md, self.getConfigs()),
"generate_api_arguments",
PREPROCESSOR_PRIORITES["generate_api_arguments"],
)

View File

@@ -7,6 +7,7 @@ import markdown
from markdown.extensions import Extension
from markdown.preprocessors import Preprocessor
from zerver.lib.markdown.preprocessor_priorities import PREPROCESSOR_PRIORITES
from zerver.openapi.openapi import check_deprecated_consistency, get_openapi_return_values
from .api_arguments_table_generator import generate_data_type
@@ -20,7 +21,9 @@ class MarkdownReturnValuesTableGenerator(Extension):
def extendMarkdown(self, md: markdown.Markdown) -> None:
md.preprocessors.register(
APIReturnValuesTablePreprocessor(md, self.getConfigs()), "generate_return_values", 510
APIReturnValuesTablePreprocessor(md, self.getConfigs()),
"generate_return_values",
PREPROCESSOR_PRIORITES["generate_return_values"],
)

View File

@@ -88,6 +88,7 @@ from pygments.lexers import find_lexer_class_by_name
from pygments.util import ClassNotFound
from zerver.lib.exceptions import MarkdownRenderingException
from zerver.lib.markdown.preprocessor_priorities import PREPROCESSOR_PRIORITES
from zerver.lib.tex import render_tex
# Global vars
@@ -162,7 +163,9 @@ class FencedCodeExtension(Extension):
processor = FencedBlockPreprocessor(
md, run_content_validators=self.config["run_content_validators"][0]
)
md.preprocessors.register(processor, "fenced_code_block", 25)
md.preprocessors.register(
processor, "fenced_code_block", PREPROCESSOR_PRIORITES["fenced_code_block"]
)
class ZulipBaseHandler:

View File

@@ -6,6 +6,7 @@ from markdown.extensions import Extension
from markdown.preprocessors import Preprocessor
from zerver.lib.emoji import EMOTICON_CONVERSIONS, name_to_codepoint
from zerver.lib.markdown.preprocessor_priorities import PREPROCESSOR_PRIORITES
REGEXP = re.compile(r"\{emoticon_translations\}")
@@ -40,7 +41,11 @@ class EmoticonTranslationsHelpExtension(Extension):
def extendMarkdown(self, md: Markdown) -> None:
"""Add SettingHelpExtension to the Markdown instance."""
md.registerExtension(self)
md.preprocessors.register(EmoticonTranslation(), "emoticon_translations", -505)
md.preprocessors.register(
EmoticonTranslation(),
"emoticon_translations",
PREPROCESSOR_PRIORITES["emoticon_translations"],
)
class EmoticonTranslation(Preprocessor):

View File

@@ -5,6 +5,8 @@ from markdown import Markdown
from markdown.extensions import Extension
from markdown.preprocessors import Preprocessor
from zerver.lib.markdown.preprocessor_priorities import PREPROCESSOR_PRIORITES
# There is a lot of duplicated code between this file and
# help_settings_links.py. So if you're making a change here consider making
# it there as well.
@@ -73,7 +75,9 @@ class RelativeLinksHelpExtension(Extension):
def extendMarkdown(self, md: Markdown) -> None:
"""Add RelativeLinksHelpExtension to the Markdown instance."""
md.registerExtension(self)
md.preprocessors.register(RelativeLinks(), "help_relative_links", 520)
md.preprocessors.register(
RelativeLinks(), "help_relative_links", PREPROCESSOR_PRIORITES["help_relative_links"]
)
relative_help_links: Optional[bool] = None

View File

@@ -5,6 +5,8 @@ from markdown import Markdown
from markdown.extensions import Extension
from markdown.preprocessors import Preprocessor
from zerver.lib.markdown.preprocessor_priorities import PREPROCESSOR_PRIORITES
# There is a lot of duplicated code between this file and
# help_relative_links.py. So if you're making a change here consider making
# it there as well.
@@ -104,7 +106,7 @@ class SettingHelpExtension(Extension):
def extendMarkdown(self, md: Markdown) -> None:
"""Add SettingHelpExtension to the Markdown instance."""
md.registerExtension(self)
md.preprocessors.register(Setting(), "setting", 515)
md.preprocessors.register(Setting(), "setting", PREPROCESSOR_PRIORITES["setting"])
relative_settings_links: Optional[bool] = None

View File

@@ -6,6 +6,7 @@ import markdown
from markdown_include.include import IncludePreprocessor, MarkdownInclude
from zerver.lib.exceptions import InvalidMarkdownIncludeStatement
from zerver.lib.markdown.preprocessor_priorities import PREPROCESSOR_PRIORITES
INC_SYNTAX = re.compile(r"\{!\s*(.+?)\s*!\}")
@@ -15,7 +16,7 @@ class MarkdownIncludeCustom(MarkdownInclude):
md.preprocessors.register(
IncludeCustomPreprocessor(md, self.getConfigs()),
"include_wrapper",
500,
PREPROCESSOR_PRIORITES["include"],
)

View File

@@ -5,6 +5,7 @@ import markdown
from markdown.extensions import Extension
from zerver.lib.markdown import ResultWithFamily, walk_tree_with_family
from zerver.lib.markdown.preprocessor_priorities import PREPROCESSOR_PRIORITES
class NestedCodeBlocksRenderer(Extension):
@@ -12,7 +13,7 @@ class NestedCodeBlocksRenderer(Extension):
md.treeprocessors.register(
NestedCodeBlocksRendererTreeProcessor(md, self.getConfigs()),
"nested_code_blocks",
-500,
PREPROCESSOR_PRIORITES["nested_code_blocks"],
)

View File

@@ -0,0 +1,19 @@
# Note that in the Markdown preprocessor registry, the highest
# numeric value is considered the highest priority, so the dict
# below is ordered from highest-to-lowest priority.
PREPROCESSOR_PRIORITES = {
"generate_parameter_description": 535,
"generate_response_description": 531,
"generate_api_title": 531,
"generate_api_description": 530,
"generate_code_example": 525,
"help_relative_links": 520,
"setting": 515,
"generate_return_values": 510,
"generate_api_arguments": 505,
"include": 500,
"fenced_code_block": 25,
"tabbed_sections": -500,
"nested_code_blocks": -500,
"emoticon_translations": -505,
}

View File

@@ -5,6 +5,8 @@ import markdown
from markdown.extensions import Extension
from markdown.preprocessors import Preprocessor
from zerver.lib.markdown.preprocessor_priorities import PREPROCESSOR_PRIORITES
START_TABBED_SECTION_REGEX = re.compile(r"^\{start_tabs\}$")
END_TABBED_SECTION_REGEX = re.compile(r"^\{end_tabs\}$")
TAB_CONTENT_REGEX = re.compile(r"^\{tab\|\s*(.+?)\s*\}$")
@@ -76,7 +78,9 @@ TAB_DISPLAY_NAMES = {
class TabbedSectionsGenerator(Extension):
def extendMarkdown(self, md: markdown.Markdown) -> None:
md.preprocessors.register(
TabbedSectionsPreprocessor(md, self.getConfigs()), "tabbed_sections", -500
TabbedSectionsPreprocessor(md, self.getConfigs()),
"tabbed_sections",
PREPROCESSOR_PRIORITES["tabbed_sections"],
)

View File

@@ -18,6 +18,7 @@ from markdown.extensions import Extension
from markdown.preprocessors import Preprocessor
import zerver.openapi.python_examples
from zerver.lib.markdown.preprocessor_priorities import PREPROCESSOR_PRIORITES
from zerver.openapi.openapi import (
check_additional_imports,
check_requires_administrator,
@@ -415,23 +416,29 @@ class APIMarkdownExtension(Extension):
def extendMarkdown(self, md: markdown.Markdown) -> None:
md.preprocessors.register(
APICodeExamplesPreprocessor(md, self.getConfigs()), "generate_code_example", 525
APICodeExamplesPreprocessor(md, self.getConfigs()),
"generate_code_example",
PREPROCESSOR_PRIORITES["generate_code_example"],
)
md.preprocessors.register(
APIDescriptionPreprocessor(md, self.getConfigs()), "generate_api_description", 530
APIDescriptionPreprocessor(md, self.getConfigs()),
"generate_api_description",
PREPROCESSOR_PRIORITES["generate_api_description"],
)
md.preprocessors.register(
APITitlePreprocessor(md, self.getConfigs()), "generate_api_title", 531
APITitlePreprocessor(md, self.getConfigs()),
"generate_api_title",
PREPROCESSOR_PRIORITES["generate_api_title"],
)
md.preprocessors.register(
ResponseDescriptionPreprocessor(md, self.getConfigs()),
"generate_response_description",
531,
PREPROCESSOR_PRIORITES["generate_response_description"],
)
md.preprocessors.register(
ParameterDescriptionPreprocessor(md, self.getConfigs()),
"generate_parameter_description",
535,
PREPROCESSOR_PRIORITES["generate_parameter_description"],
)