zed/typos.toml
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

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