Commit graph

10 commits

Author SHA1 Message Date
Cameron Mcloughlin
c305d68c01
markdown: Bump merman version (#62236)
bump merman to 0.7 (with patch for multibyte chars)

---

Release Notes:

- N/A or Added/Fixed/Improved ...
2026-08-05 20:11:33 +00:00
Cameron Mcloughlin
00cba838ad
markdown: Mermaid zoom (#62115)
Enables zooming of mermaid diagrams by supporting horizontal scroll

---

Release Notes:

- improved: Mermaid diagrams can now be zoomed and horizontally
scrolled, in both the markdown preview and the agent panel
2026-08-05 16:54:27 +00:00
Cameron Mcloughlin
f791aa57d7
gpui: Bump resvg/usvg and regression test for panic (#59704)
Bumps resvg and usvg to fix a panic when rendering some complex mermaid
diagrams.

Closes FR-90

---

Release Notes:

- N/A or Added/Fixed/Improved ...
2026-06-22 15:42:12 +00:00
Neel
c88c83d619
Update merman tag SHA (#59360)
Closes FR-77.

See
9acc3960f0.

Release Notes:

- N/A
2026-06-16 12:11:02 +00:00
Eric Holk
49eb6b2de7
mermaid_render: Fix overlapping text in diagrams with long labels (#59140)
Mermaid diagrams with long node labels rendered as an unreadable jumble:
each label was painted as one long line over a box sized for wrapped
text, overflowing into neighboring nodes. With this change, labels wrap
to the box width the layout computed.

**Root cause:** mermaid's default `htmlLabels: true` makes merman emit
labels as HTML inside `<foreignObject>`, which resvg cannot rasterize.
merman's resvg-safe pipeline replaces each one with a single-line
`<text>` fallback that only honors explicit `<br>` breaks, so
soft-wrapped labels collapse onto one long line — while the node boxes
were laid out for the wrapped text.

**Fix:** disable HTML labels in the site config (both the top-level key,
which merman reads for node labels, and `flowchart.htmlLabels`, which it
reads for edge labels). merman then emits native SVG `<text>`/`<tspan>`
labels wrapped to the same measured width the layout used, and the
foreignObject fallback never runs for these diagrams.

One behavior preserved deliberately: a literal `\n` in label text used
to become a line break as a side effect of the foreignObject fallback
(`fallback.rs` converts `\n` when flattening HTML labels).
`render_mermaid` now normalizes `\n` to `<br/>` before rendering so the
native path keeps that behavior; the existing
`backslash_n_converted_to_line_break` test covers it.

Side effect: class diagram member text also switches from the lossy
fallback to native SVG text; the accent-class test was updated
accordingly (accent classes now land directly on `text`/`tspan`
elements).

Verified with `cargo nextest run -p mermaid_render`, `-p markdown`,
`script/clippy -p mermaid_render`, and `cargo fmt --check`.

Release Notes:

- Fixed mermaid diagram labels overflowing and overlapping nodes when
long labels wrap

---------

Co-authored-by: cameron <cameron.studdstreet@gmail.com>
2026-06-11 23:49:58 +00:00
Cameron Mcloughlin
a5f0dc322d
mermaid: The other half of #57967 (#58419)
I was a silly goose didn't notice my `git push` failed, so merged #57967
without a critical commit, and some follow-ups.

This PR just cherry-picks those commits.

Release Notes:

- N/A or Added/Fixed/Improved ...
2026-06-03 14:10:43 +00:00
Latias94
6d72acdb99
markdown: Update merman renderer to 0.6 (#57967)
Following up on #57644 by @cameron1024, this PR updates `merman` to
v0.6.

With merman 0.6's new raster-safe SVG pipeline, Zed can move generic
`usvg`/`resvg` cleanup passes out of this crate and rely on merman for
them instead.

**What's moved to merman:**
- `foreignObject` fallback text generation
- Unsupported CSS cleanup
- Invalid SVG attribute cleanup

**What's kept in Zed:**
- Theme CSS injection and accent color assignment
- Zed-specific fallback overlay handling

**Integration note:**
In merman v0.6, fallback overlay groups are marked with
`data-merman-foreignobject="fallback"` and preserve source classes like
`node` or `section-*`, so host CSS can still style fallback text. This
PR updates Zed's accent tracker to check for this marker, ensuring
fallback overlays are not treated as real layout nodes.

I also added a render-stage test for the new contract: the SVG output
from `render_mermaid` is already raster-safe before Zed-specific
post-processing runs.

---

### Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

### Release Notes:
- Improved rendering of Mermaid diagrams in Markdown previews.

### Tests:
- `cargo +1.95 fmt --check -p mermaid_render`
- `cargo +1.95 test -p mermaid_render`
- `cargo +1.95 clippy -p mermaid_render --all-targets -- -D warnings`
- `git diff --check HEAD~1..HEAD`

---------

Co-authored-by: cameron <cameron.studdstreet@gmail.com>
2026-06-03 13:10:54 +00:00
Cameron Mcloughlin
4eab06968b
mermaid_render: Remove spurious debug assert (#58341)
This debug assert was actually invalid, and panicked in debug builds on
valid diagrams. We start building a node only when we find a
`translate()` that we need to fix up, but unconditionally call
`finish_node`. But since `finish_node` does `if let Some(...) =
self.building.take()`, it's a no-op if there is no node being built, so
it's safe to call.

Renamed to `maybe_finish_node` to communicate this fact

Release Notes:

- N/A or Added/Fixed/Improved ...
2026-06-02 14:57:44 +00:00
Smit Barmase
4e949a1cc3
mermaid: Fix stack overflow when laying out deeply nested subgraphs (#58325)
Closes FR-49

This PR fixes stack overflow in flowcharts with deeply nested subgraphs.
Rewrote recursive call to iterate with an explicit stack on heap. Added
test which reproduces the overflow.

We use our fork now, with patch on existing v0.4.0:
1c765dcca2

Release Notes:

- Fixed a crash in when rendering Mermaid diagram flowcharts with deeply
nested subgraphs.
2026-06-02 13:21:32 +00:00
Cameron Mcloughlin
63f725e8d6
markdown: Merman (#57644)
Big PR that replaces `mermaid-rs` with `merman`.

Adds a new crate `mermaid_render` that exposes a simple API for
rendering a mermaid diagram to an SVG string.

## Why is it so big?

Some of this is explained in the crate-level docs for `mermaid_render`,
but the short version is:
- `mermaid-rs` emits "good enough" SVGs for most use cases. It also
ships with a reasonable default theme
- `merman` emits *very accurate* SVGs, but with borderline unusable CSS
- Most of the new code in this PR are a series of passes to clean up the
output SVG by:
  - Injecting good CSS
  - Fixing issues in the `merman`-generated SVGs
- Tweaking the final result to avoid issues with `usvg` and `resvg`,
which are what will eventually be used to rasterize the SVG
- This code *could* be much smaller, but the following design decisions
made it take a lot more code:
  - Using a real XML parser instead of basic string manipulation
  - Avoiding allocating strings in as many places as possible

Because of this, the design is as follows:
- First, construct a `merman` theme from the user's theme, and render
the mermaid to an SVG string
- Post-process - each step is roughly a `fn(Iterator<Item =
Event<'short>>) -> Iterator<Item = Event<'short>>`, where `Event` is the
type for events produced by `quick-xml` (a pull-based XML parser)
 

## Note for reviewers

It's a big diff, sorry 😅 happy to pair review. 

The new crate is essentially a leaf crate - it does technically depend
on `gpui`, but only for the `Hsla` and `Rgba` types. Extracting a new
`gpui_color` crate felt like overkill for this already-very-big PR.

Each post-process pass is in its own submodule, and has a doc comment
explaining the before/after. Note that bugs in this code are perhaps
less serious than bugs in other parts of the code:
- The code has been thoroughly audited for potentially-panicking code
paths - as far as I know, there are none (excluding some `.expect()`s on
calls to `write!` with `String`, which is [cannot return `Err`][string
write])
- A bug in this code (given that it will not cause a panic) will, at
worst, result in an invalid diagram being rendered, or simply falling
back to showing the code.
- The current `mermaid-rs` renderer *already* does this in quite a lot
of cases, sometimes showing outright misleading information.
---

Some eye candy:
| Before (`mermaid-rs`) | After (`merman`) |
| - | - |
| <img width="1227" height="340" alt="image"
src="https://github.com/user-attachments/assets/58d6904e-64bc-478a-8d67-f75ad4ccbc9e"
/> | <img width="1169" height="482" alt="image"
src="https://github.com/user-attachments/assets/d4bb9cd5-240f-4bf6-ba7f-4862049ed8b0"
/> |
| <img width="842" height="564" alt="image"
src="https://github.com/user-attachments/assets/1668a50d-68f6-4145-8cef-359e4c6a4589"
/> | <img width="869" height="543" alt="image"
src="https://github.com/user-attachments/assets/2ec1a7eb-fc3c-4392-b577-1ad52396b87c"
/> |
| Failed to render | <img width="822" height="1123" alt="image"
src="https://github.com/user-attachments/assets/a97308a1-6b3a-48b6-9778-abf3507c6ad3"
/> |
| <img width="252" height="517" alt="image"
src="https://github.com/user-attachments/assets/dbf86274-004a-4ee4-be89-cc6ff4f6cf35"
/> | <img width="361" height="680" alt="image"
src="https://github.com/user-attachments/assets/8457b6ed-3ca9-4bed-9496-60388ba08206"
/> |
| <img width="550" height="1050" alt="image"
src="https://github.com/user-attachments/assets/c21b8513-fb86-422e-870a-015e0add783a"
/> | <img width="819" height="1148" alt="image"
src="https://github.com/user-attachments/assets/ca646165-302d-41aa-8da5-39e89c96ebb7"
/> |
| <img width="1218" height="225" alt="image"
src="https://github.com/user-attachments/assets/3006a1bf-efe6-46f5-9f9d-289a3fdf9adc"
/> | <img width="1118" height="965" alt="image"
src="https://github.com/user-attachments/assets/90d76098-bf3d-4c69-bc9b-00dd9cbf6990"
/> |
| <img width="800" height="584" alt="image"
src="https://github.com/user-attachments/assets/f688693b-df3d-4514-b105-ccaa3874e40c"
/> | <img width="1153" height="417" alt="image"
src="https://github.com/user-attachments/assets/eeb05f58-7184-4321-a47b-ea3cc53f0d02"
/> |
| <img width="539" height="464" alt="image"
src="https://github.com/user-attachments/assets/0076105d-eef9-4011-9b9a-581918575e49"
/> | <img width="638" height="556" alt="image"
src="https://github.com/user-attachments/assets/72a51966-c296-48d0-b1e2-66835b1a0d5b"
/> |
| <img width="607" height="430" alt="image"
src="https://github.com/user-attachments/assets/d3530814-532b-41ed-a2b6-fd5740d8db58"
/> | <img width="725" height="489" alt="image"
src="https://github.com/user-attachments/assets/c43687d9-f426-4cb8-8a45-23a3c0070c8f"
/> |
| <img width="869" height="577" alt="image"
src="https://github.com/user-attachments/assets/b607f3fd-136c-4f41-a88e-596520e276b9"
/> | <img width="784" height="586" alt="image"
src="https://github.com/user-attachments/assets/22305a64-b4d0-474a-b6f6-8973f2bca933"
/> |
| <img width="1214" height="263" alt="image"
src="https://github.com/user-attachments/assets/183ff0df-a6f3-470c-b271-8099c3e33044"
/> | <img width="1195" height="632" alt="image"
src="https://github.com/user-attachments/assets/868bcb7f-62c6-4d20-ba1e-3f25f8165fff"
/> |
| <img width="573" height="597" alt="image"
src="https://github.com/user-attachments/assets/6414e409-b879-4892-8ef6-89489219b56f"
/> | <img width="578" height="608" alt="image"
src="https://github.com/user-attachments/assets/8ac71b03-f603-4e32-87aa-b993317d4e29"
/> |
| <img width="543" height="472" alt="image"
src="https://github.com/user-attachments/assets/1f19929c-cf07-4287-b9cf-b976eea9faaa"
/> | <img width="760" height="599" alt="image"
src="https://github.com/user-attachments/assets/73926075-db47-4eb1-854e-7aee30522684"
/> |
| <img width="1205" height="219" alt="image"
src="https://github.com/user-attachments/assets/5f3dc936-4b89-44f4-a00a-4dbc47e06504"
/> | <img width="1133" height="349" alt="image"
src="https://github.com/user-attachments/assets/e62901ff-9d75-4fde-a30e-974ff2e783b1"
/> |


Release Notes:

- Improved: Mermaid diagrams now render faster and more accurately

[string write]:
https://doc.rust-lang.org/src/alloc/string.rs.html#3342-3354

---------

Co-authored-by: Danilo Leal <daniloleal09@gmail.com>
Co-authored-by: zed-zippy[bot] <234243425+zed-zippy[bot]@users.noreply.github.com>
2026-05-27 16:27:18 +00:00