mirror of
https://github.com/zed-industries/zed.git
synced 2026-05-29 19:14:13 +00:00
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>
107 lines
3.8 KiB
TOML
107 lines
3.8 KiB
TOML
[files]
|
|
ignore-files = true
|
|
ignore-hidden = false
|
|
extend-exclude = [
|
|
".git/",
|
|
|
|
# Typewriter model names used for agent branch names aren't typos.
|
|
"crates/agent_ui/src/branch_names.rs",
|
|
|
|
# Contributor names aren't typos.
|
|
".mailmap",
|
|
|
|
# File suffixes aren't typos.
|
|
"crates/theme/src/icon_theme.rs",
|
|
"crates/extensions_ui/src/extension_suggest.rs",
|
|
|
|
# Some mock data is flagged as typos.
|
|
"crates/assistant_tools/src/web_search_tool.rs",
|
|
|
|
# Suppress false positives in database schema.
|
|
"crates/collab/migrations/20251208000000_test_schema.sql",
|
|
|
|
# Not our typos.
|
|
"crates/livekit_api/",
|
|
# Vim makes heavy use of partial typing tables.
|
|
"crates/vim/",
|
|
# Editor, file finder, and fuzzy matching rely on partial typing and custom in-string syntax.
|
|
"crates/file_finder/src/file_finder_tests.rs",
|
|
"crates/fuzzy_nucleo/src/strings.rs",
|
|
"crates/editor/src/editor_tests.rs",
|
|
"crates/editor/src/edit_prediction_tests.rs",
|
|
# There are some names in the test data that are incorrectly flagged as typos.
|
|
"crates/git/test_data/blame_incremental_complex",
|
|
"crates/git/test_data/golden/blame_incremental_complex.json",
|
|
# We have some base64-encoded data that is incorrectly being flagged.
|
|
"crates/rpc/src/auth.rs",
|
|
# glsl isn't recognized by this tool.
|
|
"extensions/glsl/languages/glsl/",
|
|
# Protols is the name of the language server.
|
|
"extensions/proto/extension.toml",
|
|
"extensions/proto/src/language_servers/protols.rs",
|
|
# Windows likes its abbreviations.
|
|
"crates/gpui_windows/src/directx_renderer.rs",
|
|
"crates/gpui_windows/src/events.rs",
|
|
"crates/gpui_windows/src/direct_write.rs",
|
|
"crates/gpui_windows/src/window.rs",
|
|
# Some typos in the base mdBook CSS.
|
|
"docs/theme/css/",
|
|
# Automatically generated JS.
|
|
"docs/theme/c15t@*.js",
|
|
# Spellcheck triggers on `|Fixe[sd]|` regex part.
|
|
"script/danger/dangerfile.ts",
|
|
# File type extensions are not typos
|
|
"crates/zed/resources/windows/zed.iss",
|
|
# typos-cli doesn't understand our `vˇariable` markup
|
|
"crates/editor/src/hover_links.rs",
|
|
# typos-cli doesn't understand `setis` is intentional test case
|
|
"crates/editor/src/code_completion_tests.rs",
|
|
# Linux repository structure is not a valid text, hence we should not check it for typos
|
|
"crates/project_panel/benches/linux_repo_snapshot.txt",
|
|
# Some multibuffer test cases have word fragments that register as typos
|
|
"crates/multi_buffer/src/multi_buffer_tests.rs",
|
|
# Macos apis
|
|
"crates/gpui_macos/src/dispatcher.rs",
|
|
# Tests contain partially incomplete words (by design)
|
|
"crates/edit_prediction_cli/src/split_commit.rs",
|
|
"crates/edit_prediction_metrics/src/kept_rate.rs",
|
|
# Eval examples contain intentionally partial words (e.g. "secur" for "secure")
|
|
"crates/edit_prediction_cli/evals/",
|
|
# Tests contain `baˇr` that cause `"ba" should be "by" or "be".`-like false-positives
|
|
"crates/editor/src/document_symbols.rs",
|
|
]
|
|
|
|
[default]
|
|
extend-ignore-re = [
|
|
# PNG is a file format, not a typo
|
|
"PNG",
|
|
'cl\[ist]',
|
|
'\[lan\]guage',
|
|
'"ba"',
|
|
"doas",
|
|
# ProtoLS crate with tree-sitter Protobuf grammar.
|
|
"protols",
|
|
# x11rb SelectionNotifyEvent struct field
|
|
"requestor",
|
|
# macOS version
|
|
"Big Sur",
|
|
# Not an actual typo but an intentionally invalid color, in `color_extractor`
|
|
"#fof",
|
|
# Stripped version of reserved keyword `type`
|
|
"typ",
|
|
# AMD GPU Services
|
|
"ags",
|
|
# AMD GPU Services
|
|
"AGS",
|
|
# "noet" is a vim variable (ideally to ignore locally)
|
|
"noet",
|
|
# Yarn Plug'n'Play
|
|
"PnP",
|
|
# `image` crate method: Delay::from_numer_denom_ms
|
|
"numer",
|
|
# Abbreviation for foreignObject in mermaid SVG processing
|
|
"fo",
|
|
# Mermaid CSS class name for state diagram composites
|
|
"composit"
|
|
]
|
|
check-filename = true
|