Skip to content

fix(id): normalize unmarked text-run edge whitespace at save (#1420) - #1525

Merged
dezren39 merged 2 commits into
mainfrom
queue/1487-1420-edge-whitespace-normalize
Oct 28, 2026
Merged

dezren39 merged 2 commits into
mainfrom
queue/1487-1420-edge-whitespace-normalize

Conversation

@dezren39

@dezren39 dezren39 commented Oct 27, 2026 •

Copy link
Copy Markdown
Member

Fixes #1420. Queue task 1487 (triage: task 1421, policy pinned there).

What

In pkgs/id/src/web/markdown.rs, unmarked text runs were written verbatim on save, but CommonMark reparse strips edge whitespace (leading spaces per line, trailing spaces) and deletes a whitespace-only paragraph outright — the saved file and the reopened doc disagreed (non-fixpoint).

Normalize at save (the triage-pinned policy), position-aware:

  • An unmarked run's leading spaces/tabs are trimmed when it sits at a line start (block start, or just after a hard_break), scanning past whitespace-only siblings.
  • Its trailing spaces/tabs are trimmed when it sits at a line end (block end, or just before a hard_break).
  • A whitespace-only run at a line edge becomes an empty text node, so a whitespace-only paragraph saves as an empty paragraph (alone, it reopens as exactly one empty paragraph; the saved file is a fixpoint from the first save).
  • Applied in all inline-child conversion paths: the generic children loop (paragraphs, headings, …), the table-cell unwrap loop (cell padding case), and the footnote-definition loop.

Deliberately untouched:

Tests

cargo test --offline --lib --features web web::markdown (laptop): 91 passed, 0 failed, including 6 new regression tests for the five triage probe cases (leading spaces, trailing spaces, hard_break edges, table-cell padding, whitespace-only paragraph) plus the interior-preservation guard.

Note: a fresh worktree lacks the gitignored pkgs/id/web/dist/ frontend build output, which the web feature's RustEmbed requires; a local stub was used for the laptop test run only (not committed). CI builds the real assets.


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

Unmarked text runs were written verbatim on save but stripped on reopen by CommonMark reparse, and a whitespace-only paragraph was deleted outright. Save now trims an unmarked run's leading spaces at a line start (block start or after a hard_break) and its trailing spaces at a line end, so the first saved file is the fixpoint; a whitespace-only paragraph saves as an empty paragraph. Interior runs (word separators next to marks) and marked runs (#1418 mechanism) are untouched. Regression tests cover the five triage probe cases plus an interior-preservation guard.
@dezren39
dezren39 requested a review from a team as a code owner October 27, 2026 20:22
@coderabbitai

coderabbitai Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 20 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 9fbed55a-aabd-426b-9dbc-1b462db1957a
Commits

Reviewing files that changed from the base of the PR and between 6a89629 and fe6c29e.

Files selected for processing: 1
  • pkgs/id/src/web/markdown.rs
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-27T20:25:11.650932Z efd1d64 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: efd1d6410d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

for inline_json in para_content {
let inline_node = json_to_ast(arena, inline_json)?;
for (inline_idx, _inline_json) in para_content.iter().enumerate() {
let normalized = normalize_inline_child_json(para_content, inline_idx);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve separators between flattened table-cell paragraphs

When a table cell contains multiple paragraphs (supported by content: "paragraph+" in pkgs/id/web/src/editor.ts), this path unwraps them into a single inline stream without adding separators. Normalizing each paragraph independently now removes whitespace that previously separated their words: paragraphs containing "one " and "two" previously saved as one two, but now save as onetwo, corrupting the cell's text. Normalize against the flattened cell boundaries, or preserve a separator between paragraphs.

Useful? React with 👍 / 👎.

@dezren39
dezren39 merged commit 7b09ac0 into main Oct 28, 2026
58 of 60 checks passed
@dezren39
dezren39 deleted the queue/1487-1420-edge-whitespace-normalize branch October 28, 2026 03:00
@dezren39
dezren39 restored the queue/1487-1420-edge-whitespace-normalize branch November 1, 2026 07:49
@dezren39
dezren39 deleted the queue/1487-1420-edge-whitespace-normalize branch November 1, 2026 16:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

id(web): edge whitespace in text runs is written on save but stripped on reopen — a whitespace-only paragraph is deleted outright

1 participant