45ee00467237ecdc28d02ab9e632a954082f97d5
Round 3 fixed a phantom-space idempotency bug by dropping any boundary whitespace containing a newline, but that also stripped ordinary hand-wrapped text like "hello\n<strong>", merging words on a single pass -- directly contradicting this formatter's own "does not reflow text" contract. The correct discriminator is what the whitespace borders, not whether it contains a newline: a run between two inline-level things (text, <strong>, <a>, ...) is always significant and must survive regardless of newlines, while a run touching a block-tag boundary carries no rendered meaning and is always dropped. Since this formatter's own emitted indentation is only ever inserted next to a block tag, that rule also resolves the original phantom-space bug without any newline special-casing. tokenize() now peeks each upcoming tag's name once (reused for both the preceding text run's decision and the tag's own processing) so pushTextToken can see what's on both sides of a whitespace run. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Description
Visual drag-and-drop website builder using GrapesJS
3.5 MiB
Languages
TypeScript
64.8%
HTML
16.1%
JavaScript
14.9%
CSS
3.2%
PHP
0.7%
Other
0.3%