mkdocs2confluence 0.20.0__tar.gz → 0.20.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. {mkdocs2confluence-0.20.0/src/mkdocs2confluence.egg-info → mkdocs2confluence-0.20.2}/PKG-INFO +2 -1
  2. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/pyproject.toml +2 -1
  3. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2/src/mkdocs2confluence.egg-info}/PKG-INFO +2 -1
  4. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/loader/config.py +1 -1
  5. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/parser/markdown.py +14 -2
  6. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_parser.py +49 -0
  7. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/LICENSE +0 -0
  8. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/README.md +0 -0
  9. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/setup.cfg +0 -0
  10. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs2confluence.egg-info/SOURCES.txt +0 -0
  11. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs2confluence.egg-info/dependency_links.txt +0 -0
  12. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs2confluence.egg-info/entry_points.txt +0 -0
  13. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs2confluence.egg-info/requires.txt +0 -0
  14. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs2confluence.egg-info/top_level.txt +0 -0
  15. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/__init__.py +0 -0
  16. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/cli.py +0 -0
  17. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/compiler/__init__.py +0 -0
  18. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/compiler/models.py +0 -0
  19. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/compiler/page.py +0 -0
  20. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/emitter/__init__.py +0 -0
  21. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/emitter/xhtml.py +0 -0
  22. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/ir/__init__.py +0 -0
  23. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/ir/nodes.py +0 -0
  24. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/ir/treeutil.py +0 -0
  25. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/loader/__init__.py +0 -0
  26. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/loader/extra_css.py +0 -0
  27. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/loader/nav.py +0 -0
  28. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/loader/page.py +0 -0
  29. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/parser/__init__.py +0 -0
  30. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/pdf/__init__.py +0 -0
  31. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/pdf/generator.py +0 -0
  32. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/pdf/render.py +0 -0
  33. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/preprocess/__init__.py +0 -0
  34. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/preprocess/abbrevs.py +0 -0
  35. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/preprocess/captions.py +0 -0
  36. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/preprocess/fence.py +0 -0
  37. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/preprocess/frontmatter.py +0 -0
  38. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/preprocess/icons.py +0 -0
  39. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/preprocess/includes.py +0 -0
  40. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/preprocess/linkdefs.py +0 -0
  41. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/preview/__init__.py +0 -0
  42. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/preview/render.py +0 -0
  43. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/preview/server.py +0 -0
  44. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/publisher/__init__.py +0 -0
  45. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/publisher/changelog.py +0 -0
  46. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/publisher/client.py +0 -0
  47. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/publisher/executor.py +0 -0
  48. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/publisher/http_retry.py +0 -0
  49. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/publisher/models.py +0 -0
  50. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/publisher/planner.py +0 -0
  51. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/skill_installer.py +0 -0
  52. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/skills/mkdocs-changelog/SKILL.md +0 -0
  53. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/skills/mkdocs-changelog/scripts/changelog_data.py +0 -0
  54. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/sync/__init__.py +0 -0
  55. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/sync/anchoring.py +0 -0
  56. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/sync/command.py +0 -0
  57. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/sync/comments.py +0 -0
  58. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/sync/github.py +0 -0
  59. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/sync/platform.py +0 -0
  60. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/sync/state.py +0 -0
  61. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/transforms/__init__.py +0 -0
  62. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/transforms/_kroki.py +0 -0
  63. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/transforms/abbrevs.py +0 -0
  64. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/transforms/admonition_titles.py +0 -0
  65. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/transforms/assets.py +0 -0
  66. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/transforms/attachment_previews.py +0 -0
  67. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/transforms/captions.py +0 -0
  68. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/transforms/editlink.py +0 -0
  69. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/transforms/footer.py +0 -0
  70. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/transforms/images.py +0 -0
  71. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/transforms/internallinks.py +0 -0
  72. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/transforms/mermaid.py +0 -0
  73. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/src/mkdocs_to_confluence/transforms/plantuml.py +0 -0
  74. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_abbrevs.py +0 -0
  75. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_admonition_titles.py +0 -0
  76. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_attachment_previews.py +0 -0
  77. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_captions.py +0 -0
  78. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_changelog_config.py +0 -0
  79. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_changelog_publish.py +0 -0
  80. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_children_macro.py +0 -0
  81. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_cli.py +0 -0
  82. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_editlink.py +0 -0
  83. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_emitter.py +0 -0
  84. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_exclude_properties_config.py +0 -0
  85. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_extra_css.py +0 -0
  86. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_footer.py +0 -0
  87. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_frontmatter.py +0 -0
  88. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_icons.py +0 -0
  89. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_images.py +0 -0
  90. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_internallinks.py +0 -0
  91. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_ir.py +0 -0
  92. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_linkdefs.py +0 -0
  93. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_loader.py +0 -0
  94. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_mermaid.py +0 -0
  95. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_page_loader.py +0 -0
  96. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_pdf.py +0 -0
  97. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_plantuml.py +0 -0
  98. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_preprocess.py +0 -0
  99. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_preview.py +0 -0
  100. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_publish_client.py +0 -0
  101. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_publish_config.py +0 -0
  102. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_publish_pipeline.py +0 -0
  103. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_server.py +0 -0
  104. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_skill_installer.py +0 -0
  105. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_sync_anchoring.py +0 -0
  106. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_sync_command.py +0 -0
  107. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_sync_comments.py +0 -0
  108. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_sync_github.py +0 -0
  109. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_sync_state.py +0 -0
  110. {mkdocs2confluence-0.20.0 → mkdocs2confluence-0.20.2}/tests/test_treeutil.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mkdocs2confluence
3
- Version: 0.20.0
3
+ Version: 0.20.2
4
4
  Summary: Publish MkDocs Material pages to Confluence Cloud — admonitions, Mermaid diagrams, tabs, page properties and more
5
5
  Author: Anders Hybertz
6
6
  License: GPL-3.0-or-later
@@ -16,6 +16,7 @@ Classifier: License :: OSI Approved :: GNU General Public License v3 or later (G
16
16
  Classifier: Programming Language :: Python :: 3
17
17
  Classifier: Programming Language :: Python :: 3.12
18
18
  Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
19
20
  Classifier: Topic :: Documentation
20
21
  Classifier: Topic :: Software Development :: Documentation
21
22
  Classifier: Topic :: Text Processing :: Markup
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mkdocs2confluence"
3
- version = "0.20.0"
3
+ version = "0.20.2"
4
4
  description = "Publish MkDocs Material pages to Confluence Cloud — admonitions, Mermaid diagrams, tabs, page properties and more"
5
5
  readme = "README.md"
6
6
  license = { text = "GPL-3.0-or-later" }
@@ -24,6 +24,7 @@ classifiers = [
24
24
  "Programming Language :: Python :: 3",
25
25
  "Programming Language :: Python :: 3.12",
26
26
  "Programming Language :: Python :: 3.13",
27
+ "Programming Language :: Python :: 3.14",
27
28
  "Topic :: Documentation",
28
29
  "Topic :: Software Development :: Documentation",
29
30
  "Topic :: Text Processing :: Markup",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mkdocs2confluence
3
- Version: 0.20.0
3
+ Version: 0.20.2
4
4
  Summary: Publish MkDocs Material pages to Confluence Cloud — admonitions, Mermaid diagrams, tabs, page properties and more
5
5
  Author: Anders Hybertz
6
6
  License: GPL-3.0-or-later
@@ -16,6 +16,7 @@ Classifier: License :: OSI Approved :: GNU General Public License v3 or later (G
16
16
  Classifier: Programming Language :: Python :: 3
17
17
  Classifier: Programming Language :: Python :: 3.12
18
18
  Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
19
20
  Classifier: Topic :: Documentation
20
21
  Classifier: Topic :: Software Development :: Documentation
21
22
  Classifier: Topic :: Text Processing :: Markup
@@ -123,7 +123,7 @@ def _make_env_loader() -> type[yaml.SafeLoader]:
123
123
  def _ignore(loader: yaml.SafeLoader, _tag_suffix: str, node: yaml.Node) -> None:
124
124
  return None
125
125
 
126
- _Loader.add_multi_constructor("", _ignore) # type: ignore[no-untyped-call]
126
+ _Loader.add_multi_constructor("", _ignore)
127
127
  return _Loader
128
128
 
129
129
 
@@ -51,6 +51,7 @@ from __future__ import annotations
51
51
  import contextlib
52
52
  import html
53
53
  import re
54
+ import textwrap
54
55
  from dataclasses import dataclass, field
55
56
  from typing import Union
56
57
 
@@ -329,6 +330,17 @@ def _grid_kind(line: str) -> str | None:
329
330
  _CARD_BULLET_RE = re.compile(r'^(?P<marker>[-*+]\s+)(?P<text>.*)$')
330
331
 
331
332
 
333
+ def _dedent_body(lines: list[str]) -> str:
334
+ """Join admonition/tab body *lines* and drop any indent they all share.
335
+
336
+ The collector strips the 4 columns that delimit the body, but authors often
337
+ indent the content further (8 spaces is a common habit). That residual indent
338
+ is invisible to the author and would stop a list, fence or heading from being
339
+ recognised, since those anchor at column 0.
340
+ """
341
+ return textwrap.dedent("\n".join(_expand_leading_tabs(ln) for ln in lines))
342
+
343
+
332
344
  def _expand_leading_tabs(line: str) -> str:
333
345
  """Expand tabs in *line*'s leading whitespace to 4-space tab stops.
334
346
 
@@ -536,7 +548,7 @@ def _tokenize(text: str) -> list[_Token]:
536
548
  # Drop trailing blank lines so the recursive tokenizer stays clean.
537
549
  while body_raw and not body_raw[-1].strip():
538
550
  body_raw.pop()
539
- body_tokens = _tokenize("\n".join(body_raw))
551
+ body_tokens = _tokenize(_dedent_body(body_raw))
540
552
  tokens.append(
541
553
  _AdmonitionToken(
542
554
  kind=kind,
@@ -571,7 +583,7 @@ def _tokenize(text: str) -> list[_Token]:
571
583
  break
572
584
  while body_raw_tab and not body_raw_tab[-1].strip():
573
585
  body_raw_tab.pop()
574
- tabs.append(_TabData(label=label, body_tokens=_tokenize("\n".join(body_raw_tab))))
586
+ tabs.append(_TabData(label=label, body_tokens=_tokenize(_dedent_body(body_raw_tab))))
575
587
  if tabs:
576
588
  tokens.append(_ContentTabsToken(tabs=tabs))
577
589
  continue
@@ -1668,3 +1668,52 @@ class TestGridCardIndentEdgeCases:
1668
1668
  src = '<div class="grid cards" markdown>\r\n\r\n- !!! tip "T"\r\n\r\n Body.\r\n\r\n</div>\r\n'
1669
1669
  from mkdocs_to_confluence.emitter.xhtml import emit
1670
1670
  assert "Body." in self._panel_body(emit(parse(src)))
1671
+
1672
+
1673
+ class TestAdmonitionBodyOverIndent:
1674
+ """Body content indented past the 4 that delimit it must still parse."""
1675
+
1676
+ def _emit(self, src: str) -> str:
1677
+ from mkdocs_to_confluence.emitter.xhtml import emit
1678
+ return emit(parse(src))
1679
+
1680
+ def test_list_indented_eight_spaces(self) -> None:
1681
+ """8 spaces (4 for the body + 4 more) is a common authoring habit."""
1682
+ xhtml = self._emit('!!! note "T"\n\n - one\n - two\n')
1683
+ assert "<li><p>one</p></li>" in xhtml
1684
+ assert "<p>- one" not in xhtml, "list flattened to a paragraph"
1685
+
1686
+ def test_list_indented_four_spaces_still_works(self) -> None:
1687
+ xhtml = self._emit('!!! note "T"\n\n - one\n - two\n')
1688
+ assert "<li><p>one</p></li>" in xhtml
1689
+
1690
+ def test_nested_list_relative_indent_is_preserved(self) -> None:
1691
+ """Dedenting must not flatten a sub-list into its parent."""
1692
+ for sub_indent in (" ", " "): # 2 and 4 spaces past the item
1693
+ xhtml = self._emit(f'!!! note "T"\n\n - one\n{sub_indent}- sub\n - two\n')
1694
+ assert xhtml.count("<ul>") == 2, f"sub-list lost at {len(sub_indent)} spaces"
1695
+
1696
+ def test_mixed_indent_body_is_left_alone(self) -> None:
1697
+ """A deeper line beside a column-0 line keeps its relative indent."""
1698
+ xhtml = self._emit('!!! note "T"\n\n Intro.\n\n - deeper\n')
1699
+ assert "<p>Intro.</p>" in xhtml
1700
+
1701
+ def test_over_indented_code_fence(self) -> None:
1702
+ xhtml = self._emit('!!! note "T"\n\n ```python\n x = 1\n ```\n')
1703
+ assert "<![CDATA[x = 1]]>" in xhtml
1704
+
1705
+ def test_content_tab_body_is_dedented_too(self) -> None:
1706
+ xhtml = self._emit('=== "A"\n\n - one\n - two\n')
1707
+ assert "<li><p>one</p></li>" in xhtml
1708
+
1709
+ def test_grid_card_admonition_with_over_indented_list(self) -> None:
1710
+ """The reported case: grid card, bulleted admonition, list at 8 spaces."""
1711
+ xhtml = self._emit(
1712
+ '<div class="grid cards">\n\n'
1713
+ '- !!! abstract "Documentation"\n\n'
1714
+ ' - **Scope:** test\n'
1715
+ ' - **Out:** test\n\n'
1716
+ '</div>\n'
1717
+ )
1718
+ assert "<li><p><strong>Scope:</strong> test</p></li>" in xhtml
1719
+ assert "<p>- " not in xhtml