mkdocs2confluence 0.7.7__tar.gz → 0.7.8__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 (72) hide show
  1. {mkdocs2confluence-0.7.7/src/mkdocs2confluence.egg-info → mkdocs2confluence-0.7.8}/PKG-INFO +1 -1
  2. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/pyproject.toml +1 -1
  3. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8/src/mkdocs2confluence.egg-info}/PKG-INFO +1 -1
  4. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/emitter/xhtml.py +5 -1
  5. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/ir/nodes.py +2 -0
  6. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/parser/markdown.py +4 -0
  7. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_emitter.py +12 -0
  8. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_parser.py +15 -0
  9. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/LICENSE +0 -0
  10. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/README.md +0 -0
  11. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/setup.cfg +0 -0
  12. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs2confluence.egg-info/SOURCES.txt +0 -0
  13. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs2confluence.egg-info/dependency_links.txt +0 -0
  14. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs2confluence.egg-info/entry_points.txt +0 -0
  15. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs2confluence.egg-info/requires.txt +0 -0
  16. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs2confluence.egg-info/top_level.txt +0 -0
  17. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/__init__.py +0 -0
  18. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/cli.py +0 -0
  19. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/emitter/__init__.py +0 -0
  20. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/ir/__init__.py +0 -0
  21. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/ir/document.py +0 -0
  22. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/ir/treeutil.py +0 -0
  23. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/loader/__init__.py +0 -0
  24. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/loader/config.py +0 -0
  25. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/loader/extra_css.py +0 -0
  26. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/loader/nav.py +0 -0
  27. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/loader/page.py +0 -0
  28. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/parser/__init__.py +0 -0
  29. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/pdf/__init__.py +0 -0
  30. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/pdf/generator.py +0 -0
  31. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/pdf/render.py +0 -0
  32. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/preprocess/__init__.py +0 -0
  33. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/preprocess/abbrevs.py +0 -0
  34. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/preprocess/fence.py +0 -0
  35. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/preprocess/frontmatter.py +0 -0
  36. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/preprocess/icons.py +0 -0
  37. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/preprocess/includes.py +0 -0
  38. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/preprocess/linkdefs.py +0 -0
  39. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/preview/__init__.py +0 -0
  40. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/preview/render.py +0 -0
  41. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/preview/server.py +0 -0
  42. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/publisher/__init__.py +0 -0
  43. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/publisher/client.py +0 -0
  44. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/publisher/pipeline.py +0 -0
  45. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/transforms/__init__.py +0 -0
  46. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/transforms/abbrevs.py +0 -0
  47. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/transforms/assets.py +0 -0
  48. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/transforms/editlink.py +0 -0
  49. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/transforms/images.py +0 -0
  50. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/transforms/internallinks.py +0 -0
  51. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/src/mkdocs_to_confluence/transforms/mermaid.py +0 -0
  52. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_abbrevs.py +0 -0
  53. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_cli.py +0 -0
  54. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_editlink.py +0 -0
  55. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_extra_css.py +0 -0
  56. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_frontmatter.py +0 -0
  57. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_icons.py +0 -0
  58. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_images.py +0 -0
  59. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_internallinks.py +0 -0
  60. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_ir.py +0 -0
  61. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_linkdefs.py +0 -0
  62. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_loader.py +0 -0
  63. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_mermaid.py +0 -0
  64. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_page_loader.py +0 -0
  65. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_pdf.py +0 -0
  66. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_preprocess.py +0 -0
  67. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_preview.py +0 -0
  68. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_publish_client.py +0 -0
  69. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_publish_config.py +0 -0
  70. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_publish_pipeline.py +0 -0
  71. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_server.py +0 -0
  72. {mkdocs2confluence-0.7.7 → mkdocs2confluence-0.7.8}/tests/test_treeutil.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mkdocs2confluence
3
- Version: 0.7.7
3
+ Version: 0.7.8
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mkdocs2confluence"
3
- version = "0.7.7"
3
+ version = "0.7.8"
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" }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mkdocs2confluence
3
- Version: 0.7.7
3
+ Version: 0.7.8
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
@@ -307,7 +307,9 @@ def _emit_admonition(node: Admonition) -> str:
307
307
  body = emit(node.children)
308
308
 
309
309
  # ??? and ???+ → Confluence expand macro (collapsible)
310
- if node.collapsible:
310
+ # ???+ means "expanded by default" — Confluence expand has no such option,
311
+ # so degrade to a regular admonition macro (always visible).
312
+ if node.collapsible and not node.expanded:
311
313
  return (
312
314
  '<ac:structured-macro ac:name="expand">\n'
313
315
  f' <ac:parameter ac:name="title">{html.escape(title)}</ac:parameter>\n'
@@ -315,6 +317,8 @@ def _emit_admonition(node: Admonition) -> str:
315
317
  "</ac:structured-macro>\n"
316
318
  )
317
319
 
320
+ # Fall through for ???+ (expanded=True) — render as a regular admonition below.
321
+
318
322
  if node.kind in _ADMONITION_DANGER_KINDS:
319
323
  colours = "".join(
320
324
  f' <ac:parameter ac:name="{k}">{v}</ac:parameter>\n'
@@ -338,12 +338,14 @@ class Admonition(IRNode):
338
338
  children: Block nodes that form the admonition body.
339
339
  collapsible: ``True`` when opened with ``???`` (collapsed by default)
340
340
  or ``???+`` (expanded by default).
341
+ expanded: ``True`` only for ``???+`` — expanded by default.
341
342
  """
342
343
 
343
344
  kind: str
344
345
  title: str | None
345
346
  children: tuple[IRNode, ...]
346
347
  collapsible: bool = False
348
+ expanded: bool = False
347
349
 
348
350
 
349
351
  @dataclass(frozen=True)
@@ -139,6 +139,7 @@ class _AdmonitionToken:
139
139
  kind: str
140
140
  title: str | None # None → use the kind's default Confluence title
141
141
  collapsible: bool # True for ??? and ???+
142
+ expanded: bool # True for ???+ (expanded by default)
142
143
  body_tokens: list[_Token]
143
144
 
144
145
 
@@ -386,6 +387,7 @@ def _tokenize(text: str) -> list[_Token]:
386
387
  kind = adm_m.group("kind")
387
388
  title = adm_m.group("title") # None if no quoted title given
388
389
  collapsible = marker.startswith("?")
390
+ expanded = marker == "???+"
389
391
  i += 1
390
392
  # Collect body: blank lines or lines indented by ≥4 spaces / 1 tab.
391
393
  body_raw: list[str] = []
@@ -408,6 +410,7 @@ def _tokenize(text: str) -> list[_Token]:
408
410
  kind=kind,
409
411
  title=title,
410
412
  collapsible=collapsible,
413
+ expanded=expanded,
411
414
  body_tokens=body_tokens,
412
415
  )
413
416
  )
@@ -1055,6 +1058,7 @@ def _build_tree(
1055
1058
  kind=token.kind,
1056
1059
  title=token.title,
1057
1060
  collapsible=token.collapsible,
1061
+ expanded=token.expanded,
1058
1062
  children=body_nodes,
1059
1063
  ),
1060
1064
  stack,
@@ -136,6 +136,18 @@ class TestAdmonitionEmitter:
136
136
  assert 'ac:name="expand"' in out
137
137
  assert 'ac:name="panel"' not in out
138
138
 
139
+ def test_expanded_admonition_renders_as_regular_macro(self) -> None:
140
+ # ???+ (collapsible=True, expanded=True) has no Confluence equivalent for
141
+ # "expanded by default", so we degrade to a regular admonition macro.
142
+ out = emit((
143
+ Admonition(kind="note", title="Visible", children=(Paragraph((TextNode("body"),)),),
144
+ collapsible=True, expanded=True),
145
+ ))
146
+ assert 'ac:name="expand"' not in out
147
+ assert 'ac:name="info"' in out
148
+ assert "Visible" in out
149
+ assert "body" in out
150
+
139
151
 
140
152
  class TestContentTabsEmitter:
141
153
  def test_tabs_render_as_expand_macros(self) -> None:
@@ -515,6 +515,21 @@ class TestAdmonitions:
515
515
  assert isinstance(adm, Admonition)
516
516
  assert adm.collapsible is True
517
517
 
518
+ def test_question_mark_plus_is_expanded(self) -> None:
519
+ adm = first(parse("???+ note\n Body.\n"), Admonition)
520
+ assert isinstance(adm, Admonition)
521
+ assert adm.expanded is True
522
+
523
+ def test_question_mark_no_plus_is_not_expanded(self) -> None:
524
+ adm = first(parse("??? note\n Body.\n"), Admonition)
525
+ assert isinstance(adm, Admonition)
526
+ assert adm.expanded is False
527
+
528
+ def test_bang_is_not_expanded(self) -> None:
529
+ adm = first(parse("!!! note\n Body.\n"), Admonition)
530
+ assert isinstance(adm, Admonition)
531
+ assert adm.expanded is False
532
+
518
533
  def test_body_paragraph_parsed(self) -> None:
519
534
  adm = first(parse("!!! note\n Body text here.\n"), Admonition)
520
535
  assert isinstance(adm, Admonition)