Zerowidth CleanerMeasured guides

CLAUDE WATERMARK REMOVER · MARKDOWN TEST

Why did a second paragraph fall outside a Markdown list item?

Check the leading spaces on the second paragraph. Removing a hidden character between two spaces restored the indentation needed to keep our paragraph in the list item.

Tested 11 November 2026 · Synthetic fixture · CommonMark.js 0.31.2

What changed in the preview

The fixture uses a dash and one space before the first paragraph, then a blank line. Before cleanup, only one uninterrupted space preceded the next paragraph; the parser closed the list before emitting it. After cleanup, two spaces preceded it and the parser placed both paragraphs inside a single `li` element.

What this test covers

Two spaces are sufficient for this exact bullet prefix. Other markers and indentation can require a different width. In a preview, inspect which list item contains the second paragraph, since the gap between paragraphs can look similar even when the document structure differs.

Measured source and preview

Original Markdown

- First paragraph.

 \u200B Second paragraph.

Cleaned Markdown

- First paragraph.

  Second paragraph.

The original source and its preview contain a literal U+200B, displayed below as \u200B. The HTML is shown as text.

Before cleanup

<ul>
<li>First paragraph.</li>
</ul>
<p>\u200B Second paragraph.</p>

After cleanup

<ul>
<li>
<p>First paragraph.</p>
<p>Second paragraph.</p>
</li>
</ul>

Reproduce locally

Save reproduce.cjs and tested-app.js together. Run npm install --no-save commonmark@0.31.2, then node reproduce.cjs. Compare with the recorded input, output and HTML. The test uses the homepage callback with a minimal DOM. It does not use Claude output or test statistical watermark detection.

See the CommonMark specification and another measured Markdown case.