def default_parser(config: MdParserConfig) -> MarkdownIt: """Return the default parser configuration for MyST""" if config.renderer == "sphinx": from myst_parser.sphinx_renderer import SphinxRenderer renderer_cls = SphinxRenderer elif config.renderer == "html": renderer_cls = RendererHTML elif config.renderer == "docutils": from myst_parser.docutils_renderer import DocutilsRenderer renderer_cls = DocutilsRenderer else: raise ValueError("unknown renderer type: {0}".format(config.renderer)) if config.commonmark_only: md = MarkdownIt("commonmark", renderer_cls=renderer_cls) md.options.update({"commonmark_only": True}) return md md = ( MarkdownIt("commonmark", renderer_cls=renderer_cls).enable("table"). use(front_matter_plugin).use(myst_block_plugin).use( myst_role_plugin).use(footnote_plugin).disable("footnote_inline") # disable this for now, because it need a new implementation in the renderer .disable("footnote_tail")) if config.dmath_enable: md.use( dollarmath_plugin, allow_labels=config.dmath_allow_labels, allow_space=config.dmath_allow_space, allow_digits=config.dmath_allow_digits, ) if config.admonition_enable: # we don't want to yet remove un-referenced, because they may be referenced # in admonition type directives # so we do our own post processing md.use(container_plugin, "admonition", validate=validate_admonition) if config.amsmath_enable: md.use(amsmath_plugin) for name in config.disable_syntax: md.disable(name, True) md.options.update({ "commonmark_only": False, "enable_html_img": config.html_img_enable, "myst_url_schemes": config.url_schemes, }) return md
def test_disable(): md = MarkdownIt("zero").disable("inline") assert md.get_active_rules() == { "block": ["paragraph"], "core": ["normalize", "block"], "inline": ["text"], "inline2": ["balance_pairs", "text_collapse"], } md.disable(["text"]) assert md.get_active_rules() == { "block": ["paragraph"], "core": ["normalize", "block"], "inline": [], "inline2": ["balance_pairs", "text_collapse"], }
def default_parser(config: MdParserConfig) -> MarkdownIt: """Return the default parser configuration for MyST""" if config.renderer == "sphinx": from myst_parser.sphinx_renderer import SphinxRenderer renderer_cls = SphinxRenderer elif config.renderer == "html": renderer_cls = RendererHTML elif config.renderer == "docutils": from myst_parser.docutils_renderer import DocutilsRenderer renderer_cls = DocutilsRenderer else: raise ValueError("unknown renderer type: {0}".format(config.renderer)) if config.commonmark_only: md = MarkdownIt("commonmark", renderer_cls=renderer_cls) md.options.update({"commonmark_only": True}) return md md = ( MarkdownIt("commonmark", renderer_cls=renderer_cls).enable("table"). use(front_matter_plugin).use(myst_block_plugin).use( myst_role_plugin).use(footnote_plugin).disable("footnote_inline") # disable this for now, because it need a new implementation in the renderer .disable("footnote_tail")) typographer = False if "smartquotes" in config.enable_extensions: md.enable("smartquotes") typographer = True if "replacements" in config.enable_extensions: md.enable("replacements") typographer = True if "linkify" in config.enable_extensions: # TODO warn, don't enable, if linkify-it-py not installed md.enable("linkify") if "dollarmath" in config.enable_extensions: md.use( dollarmath_plugin, allow_labels=config.dmath_allow_labels, allow_space=config.dmath_allow_space, allow_digits=config.dmath_allow_digits, ) if "colon_fence" in config.enable_extensions: md.use(colon_fence_plugin) if "amsmath" in config.enable_extensions: md.use(amsmath_plugin) if "deflist" in config.enable_extensions: md.use(deflist_plugin) if "substitution" in config.enable_extensions: md.use(substitution_plugin, *config.sub_delimiters) if config.heading_anchors is not None: md.use(anchors_plugin, max_level=config.heading_anchors) for name in config.disable_syntax: md.disable(name, True) md.options.update({ "commonmark_only": False, "typographer": typographer, "linkify": "linkify" in config.enable_extensions, "enable_html_img": "html_image" in config.enable_extensions, "myst_url_schemes": config.url_schemes, "enable_anchors": config.heading_anchors is not None, "substitutions": config.substitutions, }) return md
def update_mdit(mdit: MarkdownIt) -> None: """Update the parser, adding the footnote plugin.""" mdit.use(footnote_plugin) # Disable inline footnotes for now, since we don't have rendering # support for them yet. mdit.disable("footnote_inline")
def create_md_parser( config: MdParserConfig, renderer: Callable[[MarkdownIt], RendererProtocol] ) -> MarkdownIt: """Return a Markdown parser with the required MyST configuration.""" # TODO warn if linkify required and linkify-it-py not installed # (currently the parse will unceremoniously except) if config.commonmark_only: # see https://spec.commonmark.org/ md = MarkdownIt("commonmark", renderer_cls=renderer).use( wordcount_plugin, per_minute=config.words_per_minute ) md.options.update({"myst_config": config}) return md if config.gfm_only: # see https://github.github.com/gfm/ md = ( MarkdownIt("commonmark", renderer_cls=renderer) # note, strikethrough currently only supported tentatively for HTML .enable("strikethrough") .enable("table") .use(tasklists_plugin) .enable("linkify") .use(wordcount_plugin, per_minute=config.words_per_minute) ) md.options.update({"linkify": True, "myst_config": config}) return md md = ( MarkdownIt("commonmark", renderer_cls=renderer) .enable("table") .use(front_matter_plugin) .use(myst_block_plugin) .use(myst_role_plugin) .use(footnote_plugin) .use(wordcount_plugin, per_minute=config.words_per_minute) .disable("footnote_inline") # disable this for now, because it need a new implementation in the renderer .disable("footnote_tail") ) typographer = False if "smartquotes" in config.enable_extensions: md.enable("smartquotes") typographer = True if "replacements" in config.enable_extensions: md.enable("replacements") typographer = True if "linkify" in config.enable_extensions: md.enable("linkify") if md.linkify is not None: md.linkify.set({"fuzzy_link": config.linkify_fuzzy_links}) if "strikethrough" in config.enable_extensions: md.enable("strikethrough") if "dollarmath" in config.enable_extensions: md.use( dollarmath_plugin, allow_labels=config.dmath_allow_labels, allow_space=config.dmath_allow_space, allow_digits=config.dmath_allow_digits, double_inline=config.dmath_double_inline, ) if "colon_fence" in config.enable_extensions: md.use(colon_fence_plugin) if "amsmath" in config.enable_extensions: md.use(amsmath_plugin) if "deflist" in config.enable_extensions: md.use(deflist_plugin) if "fieldlist" in config.enable_extensions: md.use(fieldlist_plugin) if "tasklist" in config.enable_extensions: md.use(tasklists_plugin) if "substitution" in config.enable_extensions: md.use(substitution_plugin, *config.sub_delimiters) if config.heading_anchors is not None: md.use( anchors_plugin, max_level=config.heading_anchors, slug_func=config.heading_slug_func, ) for name in config.disable_syntax: md.disable(name, True) md.options.update( { "typographer": typographer, "linkify": "linkify" in config.enable_extensions, "myst_config": config, } ) return md