~bigbes/confluence-md-utilities

ref: 3e8e97f02c9e39714adc195299d8499a5b5f5169 confluence-md-utilities/cmd/mdcx d---------
3e8e97f0 — Eugene Blikh a month ago master
fix: round-trip fidelity for inline TOC macros, nbsp emphasis, and strikethrough

Surfaced by `verify` on outside-doc-core-v2.xml (real Confluence XML).

- A TOC macro inside a heading round-trips as `# <!-- ac:toc ... -->`, where
  goldmark parses the comment as inline RawHTML. renderRawHTML now calls
  convertComment (like the block path) so the macro is reconstructed instead of
  leaking back out as a literal comment.
- Confluence stores structured-macro attributes in no fixed order (TOC is
  macro-id,name,schema-version on one page, name,schema-version,macro-id on
  another) and the verify formatter preserves order, so no reconstruction order
  matches everything; sortMacroAttrs canonicalizes them on both sides.
- Bold applied to a lone nbsp (`<strong> </strong>`) emitted `** **`: the
  writeEmphasis trim cutset now includes U+00A0, and normalizeForVerify drops
  whitespace-only emphasis.
- `<s>` and `<del>` (both strikethrough) are canonicalized to `<del>`.

Adds regression tests for each and documents the gotchas in CLAUDE.md.
3c0272ac — Eugene Blikh a month ago
fix: round-trip fidelity for heading comments, literal tags, and emphasis

Surfaced by `verify` on two real documents that aren't in the justfile set.

- Heading-only HTML comment (a TOC macro marker, `<h1><!-- ac:toc ... --></h1>`)
  was dropped by xml2md — a CommentNode is neither text nor element, so it fell
  through walkChildren and vanished, collapsing `# <!-- ... -->` to `#`.
- Literal angle-bracket text stored as `&lt;table&gt;` (e.g. `box.backup.start(<table>)`)
  round-tripped into a phantom `<table>` element that swallowed the rest of the
  document: xml2md now backslash-escapes a tag-like `<` in both the TextNode and
  walkChildrenInline paths, and renderText unescapes only `\<` (never a blanket
  UnescapePunctuations, which would eat the deliberate `\|` table-pipe escaping).
- `<strong> x </strong>` (whitespace inside the markers) rendered as literal
  `** x **`; writeEmphasis now moves the whitespace outside the markers.
- normalizeForVerify canonicalizes values Markdown can't carry — task ids,
  <ul>/<ol> bullet styling, and a trailing nbsp before </ac:task-body>.

Adds regression tests for each and documents the new gotchas in CLAUDE.md.
f6c846a1 — Eugene Blikh a month ago
fix: preserve inline spacing in fmt and code-block round-trip

Three related round-trip/formatting bugs, each pinned by a regression test
that fails on the prior code:

- fmt dropped the significant space between two inline elements
  (</strong> <code>): a lone-space text node was always treated as
  indentation. Keep it mid-line; drop it only at a block boundary.
- fmt's line-wrapper dropped a word's trailing space before a tag
  (strings.Fields discards it) and broke inside <code>...</code>,
  injecting indent that xml2md collapses into a spurious in-span space.
  Rewrote wrapLine around an atom model with a per-atom spaceBefore flag
  and keeps an inline code span whole.
- verify.normalizeForVerify's reBareTextAfterHeading used \S for its
  "visible char" token; \S matches '<', so the capture swallowed a
  following <ac:structured-macro> and wrapped it in <p>...</p>, splitting
  a code macro from its body and breaking round-trip for a no-language
  fenced code block after a heading. Use [^\s<] instead.

Full RFC-0010 document now verifies as lossless.
701c5ef2 — Eugene Blikh 2 months ago
feat: improve round-trip fidelity for panels, tables, and verify

- Preserve panel name (info/note/warning), macro-id, parameters, and
  body-bare layout via HTML comment markers so blockquotes round-trip
  back to the original ac:structured-macro form.
- Serialize tables with complex cell content (nested lists, structured
  macros, row-header th, page links) as raw XML inside the markdown so
  GFM table limits don't lossily flatten them.
- Distinguish ac:toc inside <p> from bare ac:toc, restoring the wrapper.
- Strip inline-comment-marker wrappers and decorative <span>s inside
  code spans where markdown can't represent them.
- Normalize self-closing tags to "<tag />" and unify &#34;/&#39; with
  &quot;/' so the pretty printer doesn't introduce cosmetic diffs.
- Apply verify normalization to both input and round-trip output, and
  add rules for trailing whitespace, <br/> before </li>, <p>-wrapped
  image runs, and bare text after headings.
66a3cf57 — Eugene Blikh 2 months ago
feat: split convert into md2xml and xml2md commands

Replace the single convert command with two directional commands:
md2xml for Markdown→Confluence XML and xml2md for the reverse.
Update completions and README accordingly.
b3d83904 — Eugene Blikh 2 months ago
feat: add pull --with-comments sidecar

`mdcx pull --with-comments` fetches inline + page comments via
`/rest/api/content/{id}/child/comment` (paginated, two-level reply
expansion) and writes them to `<output>.comments.json` alongside the
Markdown file. Inline comments correlate to the markdown's
`data-inline-comment="UUID"` spans through their `marker_ref` field.

Comment bodies are stored as raw Confluence storage XML; pushing
comments back is not implemented. Requires `--output`.
798bc95f — Eugene Blikh 2 months ago
feat: preview and confirm before push

`mdcx push` now prints the exact PUT request (URL, masked auth header,
title, version bump, body size delta, and a 20-line body excerpt) and
prompts for confirmation before sending. Add `--yes`/`-y` to skip the
prompt and `--dry-run` to preview only. Non-interactive stdin without
`--yes` errors out instead of hanging.

Splits `Client.UpdateContent` into `BuildUpdate` + send so the CLI can
render the same payload that will be transmitted.
e0e81bc6 — Eugene Blikh 3 months ago v0.1.0
chore: rename module to go.bigb.es/confluence-md-utilities
5fabfe01 — Eugene Blikh 4 months ago
feat: add verify command, improve round-trip fidelity

Add verify command for XML validation. Merge adjacent <code> elements
during XML→MD conversion. Preserve macro attribute order for round-trip
fidelity. Fix list item trailing whitespace and normalize <hr /> format.

false
46926399 — Eugene Blikh 4 months ago
Move CLI to cmd/mdcx/, add justfile and CLAUDE.md

Restructure to standard Go project layout: merge package cmd
into package main under cmd/mdcx/. Fix .gitignore to use /mdcx
so it only ignores the binary at repo root. Update install path
in README.md.

false