diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..06e4886 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,4 @@ +[report] +exclude_lines = + pragma: no cover + if TYPE_CHECKING: diff --git a/mdit_py_plugins/admon/index.py b/mdit_py_plugins/admon/index.py index a46e8cf..c39a4f7 100644 --- a/mdit_py_plugins/admon/index.py +++ b/mdit_py_plugins/admon/index.py @@ -1,7 +1,10 @@ # Process admonitions and pass to cb. + from __future__ import annotations -from typing import TYPE_CHECKING, Callable, Sequence +from contextlib import suppress +import re +from typing import TYPE_CHECKING, Callable, List, Sequence, Tuple from markdown_it import MarkdownIt from markdown_it.rules_block import StateBlock @@ -14,20 +17,34 @@ from markdown_it.utils import EnvType, OptionsDict -def _get_tag(params: str) -> tuple[str, str]: +def _get_multiple_tags(params: str) -> Tuple[List[str], str]: + """Check for multiple tags when the title is double quoted.""" + re_tags = re.compile(r'^\s*(?P[^"]+)\s+"(?P.*)"\S*$') + match = re_tags.match(params) + if match: + tags = match["tokens"].strip().split(" ") + return [tag.lower() for tag in tags], match["title"] + raise ValueError("No match found for parameters") + + +def _get_tag(_params: str) -> Tuple[List[str], str]: """Separate the tag name from the admonition title.""" - if not params.strip(): - return "", "" + params = _params.strip() + if not params: + return [""], "" + + with suppress(ValueError): + return _get_multiple_tags(params) - tag, *_title = params.strip().split(" ") + tag, *_title = params.split(" ") joined = " ".join(_title) title = "" if not joined: title = tag.title() - elif joined != '""': + elif joined != '""': # Specifically check for no title title = joined - return tag.lower(), title + return [tag.lower()], title def _validate(params: str) -> bool: @@ -125,12 +142,13 @@ def admonition(state: StateBlock, startLine: int, endLine: int, silent: bool) -> # this will prevent lazy continuations from ever going past our end marker state.lineMax = next_line - tag, title = _get_tag(params) + tags, title = _get_tag(params) + tag = tags[0] token = state.push("admonition_open", "div", 1) token.markup = markup token.block = True - token.attrs = {"class": " ".join(["admonition", tag, *_extra_classes(markup)])} + token.attrs = {"class": " ".join(["admonition", *tags, *_extra_classes(markup)])} token.meta = {"tag": tag} token.content = title token.info = params diff --git a/tests/fixtures/admon.md b/tests/fixtures/admon.md index 083d0b9..ffd7d2f 100644 --- a/tests/fixtures/admon.md +++ b/tests/fixtures/admon.md @@ -53,6 +53,32 @@ Shows no title . +Removes extra quotes from the title +. +!!! danger "Don't try this at home" + ... + +. +<div class="admonition danger"> +<p class="admonition-title">Don't try this at home</p> +<p>...</p> +</div> +. + + +Parse additional classes to support Python markdown (https://github.com/executablebooks/mdit-py-plugins/issues/93#issuecomment-1601822723) +. +!!! a b c d inline-classes "Note: note about "foo"" + ... + +. +<div class="admonition a b c d inline-classes"> +<p class="admonition-title">Note: note about "foo"</p> +<p>...</p> +</div> +. + + Closes block after 2 empty lines . !!! note