yggdrasil/Cargo.toml
xfy bcd13958ac
Some checks failed
CI / check (push) Has been cancelled
CI / build (push) Has been cancelled
feat(katex): 移植 mhchem 化学公式转译器(\ce/\pu → LaTeX)
katex-rs 默认无 mhchem 解析器,\ce/\pu 化学公式渲染为红字(实测正确页面 648
的 137 个公式中 32 处化学公式坏掉,含 \ce×24 + \pu×8)。

从 mhchemParser 4.2.2(Apache-2.0)机械移植状态机转译器为纯 Rust:
- src/api/mhchem.rs:数据模型 + 模式匹配 + go() 主循环 + texify 输出 + 公开 API
- src/api/mhchem_tables.rs:14 个状态机转移表 + 机器局部动作(ce/pu/...)
- 模式含 lookahead (?=)/(?!),Rust regex crate 不支持,故用 fancy-regex
  (已被 syntect 间接引入,此处显式声明为直接 server 依赖)
- ce/pu 包裹 catch_unwind,任何内部异常回退原样输出,绝不 panic
- katex.rs 新增 expand_chem:渲染前嵌套花括号配对扫描 \ce/\pu 预转译
- 行尾 ^ 气体符号转译为 \uparrow,消解原 mhchem 解析错误
- 8 个 mhchem 单测 + 5 个 katex 集成测试(水/反应箭头/气体箭头/单位/络离子)
2026-07-23 12:23:53 +08:00

134 lines
5.9 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[package]
name = "yggdrasil"
version = "0.5.0"
edition = "2021"
# 构建时工具二进制:用 syntectserver-only 依赖)生成 highlight.css。
# 仅在启用 server feature 时编译——WASM 前端构建(--no-default-features --features web
# 不会拉入 syntect此二进制若也参与编译会因找不到 syntect 报错。
[[bin]]
name = "generate_highlight_css"
required-features = ["server"]
[dependencies]
dioxus = { version = "0.7.9", features = ["fullstack", "router"] }
serde = { version = "1.0", features = ["derive"] }
tokio = { version = "1.52", features = ["rt-multi-thread", "macros", "fs", "time", "sync"], optional = true }
tokio-postgres = { version = "0.7", features = ["with-chrono-0_4"], optional = true }
deadpool-postgres = { version = "0.14", optional = true }
argon2 = { version = "0.5", optional = true }
uuid = { version = "1", features = ["v4"], optional = true }
chrono = { version = "0.4", features = ["serde"] }
regex = { version = "1.12", optional = true }
# mhchem 化学公式转译器src/api/mhchem.rs需要 lookahead 正则,
# Rust `regex` crate 不支持 `(?=...)`/`(?!...)`,故用 `fancy-regex`。
# 该 crate 已被 syntect 间接引入0.16.2,见 Cargo.lock此处显式声明为直接依赖。
fancy-regex = { version = "0.16", optional = true }
pulldown-cmark = { version = "0.13", optional = true }
dotenvy = { version = "0.15", optional = true }
tracing = { version = "0.1", optional = true, features = ["release_max_level_info"] }
tracing-subscriber = { version = "0.3", optional = true }
rand = { version = "0.8", features = ["getrandom"], optional = true }
http = { version = "1", optional = true }
axum = { version = "0.8", optional = true, features = ["multipart"] }
tower-http = { version = "0.7", optional = true, features = ["compression-full", "timeout", "trace"] }
serde_json = "1.0"
sha2 = { version = "0.10", optional = true }
hex = { version = "0.4", optional = true }
lol_html = { version = "3", optional = true }
syntect = { version = "5", default-features = false, features = ["default-syntaxes", "default-themes", "default-fancy", "html", "parsing", "dump-load", "yaml-load"], optional = true }
# NOTE: WebP decoder is intentionally excluded from the image crate.
# We use zenwebp for both encoding and decoding to ensure consistency.
# Do NOT add "webp" to the features list without updating src/webp.rs.
image = { version = "0.25", optional = true, default-features = false, features = ["jpeg", "png", "gif"] }
zenwebp = { version = "0.4", optional = true }
moka = { version = "0.12", features = ["future", "sync"], optional = true }
governor = { version = "0.10", optional = true }
sysinfo = { version = "0.39", optional = true }
sqlparser = { version = "0.62", optional = true }
dashmap = { version = "6.2", optional = true }
# 中文标题 → 拼音 slug纯 Rust、零依赖安全交叉编译到 musl/FreeBSD
pinyin = { version = "0.11", optional = true }
md-5 = { version = "0.10", optional = true }
futures = { version = "0.3", optional = true }
bytes = { version = "1", optional = true }
bollard = { version = "0.21", optional = true }
# 把 mpsc::Receiver 包成 Stream,供 axum SSE handler 使用。
# axum::response::sse::{Sse,KeepAlive,Event} 随 axum 0.8 自带,无需额外 dep。
tokio-stream = { version = "0.1", features = ["sync"], optional = true }
# 全局分配器:用 mimalloc 替换系统 malloc。多线程高频小对象分配吞吐显著提升
# 且对全静态 musl 链接友好(生产 Docker 镜像即 musl 目标)。
# server-only经 server feature 启用WASM 前端构建不编译(见 main.rs cfg 门控)。
mimalloc = { version = "0.1", optional = true }
# KaTeX 服务端数学公式渲染:纯 Rust 重实现(无 JS 运行时),渲染 $...$ / $$...$$
# 为 HTML span。库名是 katexcrate 名 katex-rs代码用 `use katex::...`。
# 默认 features 为空即原生服务端编译wasm feature 仅前端构建才需,这里不开。
# 配套前端需引入 katex.min.css + 字体(见 public/katex/、Makefile katex-css
katex-rs = { version = "0.2", optional = true }
[target.'cfg(target_arch = "wasm32")'.dependencies]
web-sys = { version = "0.3", features = ["Document", "Window", "Storage", "Element", "HtmlElement", "DomTokenList", "MediaQueryList", "HtmlImageElement", "MouseEvent", "KeyboardEvent", "Node", "EventTarget", "Navigator", "File", "FileList", "FormData", "Request", "RequestInit", "Response", "Headers", "ClipboardEvent", "DataTransfer", "HtmlInputElement", "EventSource", "MessageEvent"] }
wasm-bindgen = "0.2"
wasm-bindgen-futures = "0.4"
js-sys = "0.3"
# 把 serde 类型(如 SqlSchema序列化为 JsValue供 wasm-bindgen extern 传递。
serde-wasm-bindgen = "0.6"
[dev-dependencies]
tokio = { version = "1.52", features = ["rt-multi-thread", "macros", "fs", "time", "sync"] }
serial_test = "3"
[profile.release]
debug = false
opt-level = 3
lto = "thin"
codegen-units = 1
strip = "symbols"
# panic 直接终止WASM 去掉 unwind 元数据以减小体积server 端错误处理走
# Result + ?(见 src/api/error.rs不依赖 panic unwind进程级崩溃由
# systemd/k8s 拉起。这是 Dioxus 官方 optimizing 指南推荐的 WASM 瘦身项。
panic = "abort"
[features]
default = ["web", "server"]
web = ["dioxus/web"]
server = [
"dioxus/server",
"dep:tokio",
"dep:tokio-postgres",
"dep:deadpool-postgres",
"dep:argon2",
"dep:uuid",
"dep:regex",
"dep:fancy-regex",
"dep:pulldown-cmark",
"dep:rand",
"dep:http",
"dep:sha2",
"dep:hex",
"dep:dotenvy",
"dep:tracing",
"dep:tracing-subscriber",
"dep:lol_html",
"dep:syntect",
"dep:axum",
"dep:tower-http",
"dep:image",
"dep:zenwebp",
"dep:moka",
"dep:governor",
"dep:sysinfo",
"dep:sqlparser",
"dep:dashmap",
"dep:pinyin",
"dep:md-5",
"dep:futures",
"dep:bytes",
"dep:bollard",
"dep:tokio-stream",
"dep:mimalloc",
"dep:katex-rs",
]