From ae897ee21f116bd21d33d5a92d81c198a13fea17 Mon Sep 17 00:00:00 2001 From: Oleh Prypin Date: Fri, 23 Feb 2024 22:44:06 +0100 Subject: [PATCH] fixup! feat: Preserve HTML data attributes (from spans to anchors) --- src/mkdocs_autorefs/references.py | 10 ++++++---- tests/test_references.py | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/mkdocs_autorefs/references.py b/src/mkdocs_autorefs/references.py index 0efbf1c..da1c863 100644 --- a/src/mkdocs_autorefs/references.py +++ b/src/mkdocs_autorefs/references.py @@ -15,9 +15,10 @@ if TYPE_CHECKING: from markdown import Markdown +_ATTR_VALUE = r'"[^"<>]+"|[^"<> ]+' # Possibly with double quotes around AUTO_REF_RE = re.compile( - r"autorefs-(?:identifier|optional|optional-hover))=" - r'("?)(?P[^"<>]+)\2(?P [^<>]+)?>(?P.*?)</span>', + rf"<span data-(?P<kind>autorefs-(?:identifier|optional|optional-hover))=(?P<identifier>{_ATTR_VALUE})" + rf"(?: class=(?P<class>{_ATTR_VALUE}))?(?P<attrs> [^<>]+)?>(?P<title>.*?)</span>", flags=re.DOTALL, ) """A regular expression to match mkdocs-autorefs' special reference markers @@ -154,10 +155,11 @@ def fix_ref(url_mapper: Callable[[str], str], unmapped: list[str]) -> Callable: """ def inner(match: Match) -> str: - identifier = match["identifier"] + identifier = match["identifier"].strip('"') title = match["title"] kind = match["kind"] attrs = match["attrs"] or "" + classes = (match["class"] or "").strip('"').split() try: url = url_mapper(unescape(identifier)) @@ -173,7 +175,7 @@ def inner(match: Match) -> str: parsed = urlsplit(url) external = parsed.scheme or parsed.netloc - classes = ["autorefs", "autorefs-external" if external else "autorefs-internal"] + classes = ["autorefs", "autorefs-external" if external else "autorefs-internal", *classes] class_attr = " ".join(classes) if kind == "autorefs-optional-hover": return f'<a class="{class_attr}" title="{identifier}" href="{escape(url)}"{attrs}>{title}</a>' diff --git a/tests/test_references.py b/tests/test_references.py index f7522b0..49cdc83 100644 --- a/tests/test_references.py +++ b/tests/test_references.py @@ -229,6 +229,6 @@ def test_external_references() -> None: def test_keep_data_attributes() -> None: """Keep HTML data attributes from autorefs spans.""" url_map = {"example": "https://e.com"} - source = '<span data-autorefs-optional="example" data-foo data-bar="0">e</span>' + source = '<span data-autorefs-optional="example" class="hi ho" data-foo data-bar="0">e</span>' output, _ = fix_refs(source, url_map.__getitem__) - assert output == '<a class="autorefs autorefs-external" href="https://e.com" data-foo data-bar="0">e</a>' + assert output == '<a class="autorefs autorefs-external hi ho" href="https://e.com" data-foo data-bar="0">e</a>'