From db74a96de1cee3f541521298e1a609150d1da2e3 Mon Sep 17 00:00:00 2001 From: xfy Date: Thu, 23 Jul 2026 13:34:27 +0800 Subject: [PATCH] =?UTF-8?q?style:=20=E6=A0=BC=E5=BC=8F=E5=8C=96=20Rust=20?= =?UTF-8?q?=E4=B8=8E=20TS=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.rs | 21 +++- .../src/__tests__/footnote.test.ts | 5 +- libs/tiptap-editor/src/index.ts | 4 +- src/api/code_runner/execute.rs | 8 +- src/api/database/export.rs | 12 +- src/api/database/sql_console.rs | 7 +- src/api/katex.rs | 11 +- src/api/markdown.rs | 55 +++++++--- src/api/mhchem.rs | 103 ++++++++++++++---- src/api/mod.rs | 4 +- src/api/sanitizer.rs | 61 +++++++++-- src/components/header.rs | 4 +- src/components/post/post_content.rs | 6 +- src/highlight.rs | 5 +- src/infra/docker.rs | 15 ++- src/pages/admin/posts.rs | 4 +- 16 files changed, 249 insertions(+), 76 deletions(-) diff --git a/build.rs b/build.rs index e630076..cc64575 100644 --- a/build.rs +++ b/build.rs @@ -19,9 +19,24 @@ fn main() { // 工作区脏状态变化时 describe 的 --dirty 后缀也会变,重跑一次。 println!("cargo:rerun-if-changed=.git/index"); - set_env("YGG_BUILD_GIT_DESCRIBE", env_or_git("YGG_BUILD_GIT_DESCRIBE", &["describe", "--tags", "--always", "--dirty"])); - set_env("YGG_BUILD_GIT_HASH", env_or_git("YGG_BUILD_GIT_HASH", &["rev-parse", "HEAD"])); - set_env("YGG_BUILD_GIT_COMMIT_DATE", env_or_git("YGG_BUILD_GIT_COMMIT_DATE", &["log", "-1", "--format=%cd", "--date=iso-strict"])); + set_env( + "YGG_BUILD_GIT_DESCRIBE", + env_or_git( + "YGG_BUILD_GIT_DESCRIBE", + &["describe", "--tags", "--always", "--dirty"], + ), + ); + set_env( + "YGG_BUILD_GIT_HASH", + env_or_git("YGG_BUILD_GIT_HASH", &["rev-parse", "HEAD"]), + ); + set_env( + "YGG_BUILD_GIT_COMMIT_DATE", + env_or_git( + "YGG_BUILD_GIT_COMMIT_DATE", + &["log", "-1", "--format=%cd", "--date=iso-strict"], + ), + ); set_env("YGG_BUILD_RUSTC_VERSION", rustc_version()); // 编译时刻(Unix 秒)。std 无 ISO 8601 格式化,存秒数由运行时 chrono 解析。 set_env("YGG_BUILD_TIME", build_time_unix()); diff --git a/libs/tiptap-editor/src/__tests__/footnote.test.ts b/libs/tiptap-editor/src/__tests__/footnote.test.ts index 07b3e1c..3504907 100644 --- a/libs/tiptap-editor/src/__tests__/footnote.test.ts +++ b/libs/tiptap-editor/src/__tests__/footnote.test.ts @@ -21,10 +21,7 @@ const unescape = (md: string) => md.replace(UNESCAPE_RE, '[^$1]'); function makeEditor() { return new Editor({ element: document.body, - extensions: [ - StarterKit.configure({ heading: { levels: [1, 2, 3] } }), - Markdown, - ], + extensions: [StarterKit.configure({ heading: { levels: [1, 2, 3] } }), Markdown], content: '', }); } diff --git a/libs/tiptap-editor/src/index.ts b/libs/tiptap-editor/src/index.ts index 1c5092d..5717fbd 100644 --- a/libs/tiptap-editor/src/index.ts +++ b/libs/tiptap-editor/src/index.ts @@ -234,7 +234,9 @@ class TiptapEditorInstance { const proseMirrorDom = this.editor.view.dom; if (!this.isSourceMode) { // 富文本 → 源码:导出当前 Markdown 到 textarea - this.sourceTextarea.value = TiptapEditorInstance.unescapeFootnoteSyntax(this.editor.getMarkdown()); + this.sourceTextarea.value = TiptapEditorInstance.unescapeFootnoteSyntax( + this.editor.getMarkdown(), + ); // 必须在 display:'none' 之前读取滚动比例——隐藏后 scrollTop 会被浏览器归零 const pmRatio = this.getScrollRatio(proseMirrorDom); proseMirrorDom.style.display = 'none'; diff --git a/src/api/code_runner/execute.rs b/src/api/code_runner/execute.rs index 909072d..1ef7e6d 100644 --- a/src/api/code_runner/execute.rs +++ b/src/api/code_runner/execute.rs @@ -430,9 +430,11 @@ mod tests { "源码恰好等于上限应放行" ); let over = "a".repeat(max + 1); - let err = - validate_exec_request(&req("python", &over)).expect_err("超出上限应拒绝"); - assert!(err.to_string().contains("过大"), "错误信息应提及大小: {err}"); + let err = validate_exec_request(&req("python", &over)).expect_err("超出上限应拒绝"); + assert!( + err.to_string().contains("过大"), + "错误信息应提及大小: {err}" + ); } #[test] diff --git a/src/api/database/export.rs b/src/api/database/export.rs index aaa27e8..8106a9a 100644 --- a/src/api/database/export.rs +++ b/src/api/database/export.rs @@ -350,11 +350,13 @@ mod tests { #[test] fn parse_query_source_rejects_unparseable_sql() { - for bad in ["query:这不是SQL", "query:SELECT FROM", "query:@#$%", "query:1+1"] { - assert!( - parse_source(bad).is_err(), - "{bad} 应解析失败或被拒" - ); + for bad in [ + "query:这不是SQL", + "query:SELECT FROM", + "query:@#$%", + "query:1+1", + ] { + assert!(parse_source(bad).is_err(), "{bad} 应解析失败或被拒"); } } diff --git a/src/api/database/sql_console.rs b/src/api/database/sql_console.rs index 2d60297..7f04df6 100644 --- a/src/api/database/sql_console.rs +++ b/src/api/database/sql_console.rs @@ -733,8 +733,11 @@ mod tests { #[test] fn writes_affect_cache_false_for_read_only_statements() { - for sql in ["SELECT 1", "EXPLAIN SELECT * FROM posts", "SELECT id FROM posts WHERE id = 1"] - { + for sql in [ + "SELECT 1", + "EXPLAIN SELECT * FROM posts", + "SELECT id FROM posts WHERE id = 1", + ] { assert!( !writes_affect_cache(&parse(sql)), "只读语句不应触发兜底失效:{sql:?}" diff --git a/src/api/katex.rs b/src/api/katex.rs index 0cd44f5..2d0ee17 100644 --- a/src/api/katex.rs +++ b/src/api/katex.rs @@ -63,7 +63,10 @@ fn physics_macros() -> &'static [(&'static str, MacroDefinition)] { r"\braket", MacroDefinition::StaticStr(r"\langle #1 | #2 \rangle"), ), - (r"\expval", MacroDefinition::StaticStr(r"\langle #1 \rangle")), + ( + r"\expval", + MacroDefinition::StaticStr(r"\langle #1 \rangle"), + ), // 向量 / 范数 / 绝对值(自动缩放定界符) (r"\abs", MacroDefinition::StaticStr(r"\left| #1 \right|")), (r"\norm", MacroDefinition::StaticStr(r"\left\| #1 \right\|")), @@ -104,7 +107,6 @@ fn display_settings() -> Settings { }; inject_physics_macros(&mut s); s - } thread_local! { @@ -136,7 +138,10 @@ fn expand_chem(tex: &str) -> String { while i < bytes.len() { // 匹配 `\ce{` 或 `\pu{` if bytes[i] == b'\\' && i + 3 < bytes.len() { - let (is_ce, is_pu) = (bytes[i + 1] == b'c' && bytes[i + 2] == b'e', bytes[i + 1] == b'p' && bytes[i + 2] == b'u'); + let (is_ce, is_pu) = ( + bytes[i + 1] == b'c' && bytes[i + 2] == b'e', + bytes[i + 1] == b'p' && bytes[i + 2] == b'u', + ); let brace_at = if is_ce { Some(i + 3) } else if is_pu { diff --git a/src/api/markdown.rs b/src/api/markdown.rs index 91b0989..e6f9531 100644 --- a/src/api/markdown.rs +++ b/src/api/markdown.rs @@ -988,7 +988,11 @@ console.log(1) fn render_markdown_runnable_block_bun_canonical() { // bun 自身是 canonical(不是别名),runnable 块以 bun 执行。 let result = render_markdown_enhanced("```bun runnable\nconsole.log('hi')\n```"); - assert!(result.html.contains(r#"data-lang="bun""#), "got: {}", result.html); + assert!( + result.html.contains(r#"data-lang="bun""#), + "got: {}", + result.html + ); } #[test] @@ -1065,18 +1069,23 @@ console.log(1) let result = render_markdown_enhanced("正文[^a]\n\n[^a]: 脚注内容\n"); // 脚注引用:上标 + 锚点跳转 + role 语义 assert!( - result.html.contains(r#""#), + result + .html + .contains(r#""#), "脚注引用上标应含正确 id, got: {}", result.html ); assert!( - result.html.contains(r##"href="#fn:a""##) && result.html.contains(r#"role="doc-noteref""#), + result.html.contains(r##"href="#fn:a""##) + && result.html.contains(r#"role="doc-noteref""#), "引用链接应指向定义并带 noteref 角色, got: {}", result.html ); // 脚注定义: