"""This module holds the ``create_md_parser`` function,which creates a parser from the config."""from__future__importannotationsfromcollections.abcimportCallablefrommarkdown_itimportMarkdownItfrommarkdown_it.rendererimportRendererProtocolfrommdit_py_plugins.amsmathimportamsmath_pluginfrommdit_py_plugins.attrsimportattrs_block_plugin,attrs_pluginfrommdit_py_plugins.colon_fenceimportcolon_fence_pluginfrommdit_py_plugins.deflistimportdeflist_pluginfrommdit_py_plugins.dollarmathimportdollarmath_pluginfrommdit_py_plugins.field_listimportfieldlist_pluginfrommdit_py_plugins.footnoteimportfootnote_pluginfrommdit_py_plugins.front_matterimportfront_matter_pluginfrommdit_py_plugins.myst_blocksimportmyst_block_pluginfrommdit_py_plugins.myst_roleimportmyst_role_pluginfrommdit_py_plugins.substitutionimportsubstitution_pluginfrommdit_py_plugins.tasklistsimporttasklists_pluginfrommdit_py_plugins.wordcountimportwordcount_pluginfrommyst_parser.config.mainimportMdParserConfig
[文档]defcreate_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)ifconfig.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})returnmdifconfig.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,enabled=config.enable_checkboxes).enable("linkify").use(wordcount_plugin,per_minute=config.words_per_minute))md.options.update({"linkify":True,"myst_config":config})returnmdmd=(MarkdownIt("commonmark",renderer_cls=renderer).enable("table").use(front_matter_plugin).use(myst_block_plugin).use(myst_role_plugin).use(footnote_plugin,inline=False,move_to_end=False,always_match_refs=True).use(wordcount_plugin,per_minute=config.words_per_minute))typographer=Falseif"smartquotes"inconfig.enable_extensions:md.enable("smartquotes")typographer=Trueif"replacements"inconfig.enable_extensions:md.enable("replacements")typographer=Trueif"linkify"inconfig.enable_extensions:md.enable("linkify")ifmd.linkifyisnotNone:md.linkify.set({"fuzzy_link":config.linkify_fuzzy_links})if"strikethrough"inconfig.enable_extensions:md.enable("strikethrough")if"dollarmath"inconfig.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"inconfig.enable_extensions:md.use(colon_fence_plugin)if"amsmath"inconfig.enable_extensions:md.use(amsmath_plugin)if"deflist"inconfig.enable_extensions:md.use(deflist_plugin)if"fieldlist"inconfig.enable_extensions:md.use(fieldlist_plugin)if"tasklist"inconfig.enable_extensions:md.use(tasklists_plugin,enabled=config.enable_checkboxes)if"substitution"inconfig.enable_extensions:md.use(substitution_plugin,*config.sub_delimiters)if"attrs_inline"inconfig.enable_extensions:md.use(attrs_plugin,after=("image","code_inline","link_close","span_close"),spans=True,span_after="footnote_ref",)elif"attrs_image"inconfig.enable_extensions:# TODO deprecatemd.use(attrs_plugin,after=("image",))if"attrs_block"inconfig.enable_extensions:md.use(attrs_block_plugin)fornameinconfig.disable_syntax:md.disable(name,True)md.options.update({"typographer":typographer,"linkify":"linkify"inconfig.enable_extensions,"myst_config":config,})returnmd