From 8320768f1d865e9d2eff5fccf4c7ee3ffa1c41e2 Mon Sep 17 00:00:00 2001 From: npmrun <1549469775@qq.com> Date: Wed, 22 Apr 2026 11:21:45 +0800 Subject: [PATCH] style(markdown): add commented styles for code blocks and update markdown configuration - Added commented-out styles for code blocks to enhance presentation and usability. - Updated markdown configuration to disable HTML rendering for improved security. - Introduced a function to handle path not found errors in the error logger for better error management. These changes prepare the codebase for future enhancements in markdown rendering and error handling. --- app/assets/scss/common.scss | 45 +++++++++++++++++++++++++++++- app/components/PostBodyMarkdownEditor.vue | 3 ++ app/utils/render-markdown.ts | 42 ++++++++++++++++++++++++++++ packages/drizzle-pkg/db.sqlite | Bin 147456 -> 147456 bytes server/plugins/03.error-logger.ts | 32 ++++++++++++++++++--- 5 files changed, 117 insertions(+), 5 deletions(-) diff --git a/app/assets/scss/common.scss b/app/assets/scss/common.scss index d5e9838..e4c9473 100644 --- a/app/assets/scss/common.scss +++ b/app/assets/scss/common.scss @@ -1,2 +1,45 @@ @use "./markdown/reset.scss"; -@use "./markdown/green.scss"; \ No newline at end of file +@use "./markdown/green.scss"; + +// .code-block-wrapper { +// position: relative; +// margin: 16px 0; +// border-radius: 8px; +// background: #1e1e1e; +// overflow: hidden; +// } +// .code-header { +// display: flex; +// justify-content: space-between; +// align-items: center; +// padding: 8px 12px; +// background: #2d2d2d; +// color: #ccc; +// font-size: 14px; +// } +// .code-lang { +// font-weight: 600; +// text-transform: uppercase; +// } +// .copy-btn { +// padding: 4px 8px; +// border: none; +// border-radius: 4px; +// background: #444; +// color: #fff; +// cursor: pointer; +// font-size: 12px; +// transition: all 0.2s; +// } +// .copy-btn:hover { +// background: #555; +// } +// pre { +// margin: 0; +// padding: 12px; +// overflow-x: auto; +// } +// code { +// color: #d4d4d4; +// font-family: 'Consolas', 'Monaco', monospace; +// } \ No newline at end of file diff --git a/app/components/PostBodyMarkdownEditor.vue b/app/components/PostBodyMarkdownEditor.vue index e99df00..683a0a0 100644 --- a/app/components/PostBodyMarkdownEditor.vue +++ b/app/components/PostBodyMarkdownEditor.vue @@ -28,6 +28,9 @@ function ensureMdEditorStripFrontMatter() { mdEditorGlobalConfig({ markdownItConfig(md) { attachMarkdownItStripFrontMatter(md, 'person_panel_strip_fm') + md.set({ + html: false + }) }, }) } diff --git a/app/utils/render-markdown.ts b/app/utils/render-markdown.ts index 52399c9..cab9db2 100644 --- a/app/utils/render-markdown.ts +++ b/app/utils/render-markdown.ts @@ -7,8 +7,50 @@ const md = new MarkdownIt({ linkify: true, typographer: false, breaks: true, + // // 开启代码块语言识别 + // highlight: function (str: string, lang: string) { + // // 处理语言标签(如果没有指定语言,默认 text) + // const language = lang || 'text' + // // 生成带语言标识 + 复制按钮的代码块外壳 + // return ` + //
+ //
+ // ${language} + // + //
+ //
${md.utils.escapeHtml(str)}
+ //
+ // ` + // }, }) +// /** 全局复制代码函数(挂载到 window,确保页面可调用) */ +// declare global { +// interface Window { +// copyCode: (btn: HTMLButtonElement) => void +// } +// } + +// // 只在客户端环境注册复制函数 +// if (typeof window !== 'undefined') { +// window.copyCode = function (btn: HTMLButtonElement) { +// const codeBlock = btn.closest('.code-block-wrapper')!.querySelector('code')! +// const text = codeBlock.textContent || '' + +// navigator.clipboard.writeText(text).then(() => { +// const originalText = btn.textContent +// btn.textContent = '已复制' +// btn.style.backgroundColor = '#10b981' + +// // 2秒后恢复按钮文字 +// setTimeout(() => { +// btn.textContent = originalText +// btn.style.backgroundColor = '' +// }, 2000) +// }) +// } +// } + /** 将 Markdown 转为可安全用于 `v-html` 的 HTML(禁用源码中的原始 HTML)。 */ export function renderSafeMarkdown(src: string): string { if (!src.trim()) { diff --git a/packages/drizzle-pkg/db.sqlite b/packages/drizzle-pkg/db.sqlite index d3823f1fdcc03c5080c2fa58ee1e9c9af229bbc5..84ff945a65e52be8f8926eb3e3769e1eebe69a8b 100644 GIT binary patch delta 924 zcmZo@;B08%oFL8EFj2;tv0-Dv5`AVCewEGa1}gjp21$nIX{i=zy2gpgM!F`ZNfx@6 z28jl`7M7-_DM=}Y7N#cVjB~GTuZUrsyJ^*z*vZlME4f(sV;T5k`ET&IZRT?b=2s!c zkjbt7^+0RiZe|Yz9ET^EYi^RM2K%U|?pDV_rFl7-#U-gJ&ISc3B~{7pDaBFo5f*tS<=IZ922qxg zIR+&~nOSbSo@oKuUfJ;(COMIebJyK#<^p=?W69pl#TV8vZ+5$~d$vCJR0a{QyG-2S z{FnJ>@CWhp@tx-D;q&I>)a7CeJLM2p&o9%UpLiD+;XTvb7cgx`=^6 zSWujmla*DUBQ2%4I3>L_wYUUm{-<~M8RxEk>8A@}C#K|P<~gKRB<2?6r0V4trB9ct zW~^ob`q6Is%xXp}0~cY4VUl3OEICrril6rPK3%^PZs6x|pn=a9Hh>KL96tR)4WpR0 ztq@q3AjAo#9EruniEs_Clzly=O75yASw*D#+0KtF(na*;d);9 z0`)vSlnc`H!WXP3+g1SCpT>EOQ!(sB17hILlF zV9n4V(dTehz delta 943 zcmZo@;B08%oFL6uI8nx#v2bI;5`AW7{^-r@1}gjprm2PoiRQ+Zx<*DR7P=;8CMLRx zW~N5E7N!PCiADw~CMJnyjB_u2KH$VScinRv_sP-rE4i5Y+Zgz7@VD`=-^}L_%&$U> zA(LDE>w(sO+RPpx7SFQo(#6-471tYr7&Vi_)-MAwc5K?fs9?w<&%n%}!ocFjP|Tph zSIIBKx0=tC0U7xDvhXo*%F1d>G6=FtGECOFpf6NVnv|2740PkYW-cIk|B=GxSr^tY zs{{3^GYSfd3xbuhvN9C|K_VCyN5?YGUA1u?@TXEEiM7t^n76hgv`!1G&Qj_F|#x`H+4wQP0Y;E zOU}jDL@~l zz%)NSlnc}hB(Z5W7XWJ(hS+Khv^51`?NiO?Af1}eQFIm-f^FqT)@TXTn3!0cURn?F z>yu7kdRYx5QFOxnYRZSKSs&bNGkE?1Q%61b_HJvYUyO{;rnlKLJ?0l>6lD { nitroApp.hooks.hook("error", (error, context) => { const event = context.event; const tags = Array.isArray(context.tags) ? (context.tags as string[]).join(",") : ""; - logger.error( + const prefix = [ event?.method ?? "", event?.path ?? "(no request)", tags ? `[${tags}]` : "", - "\n", - error - ); + ] + .filter(Boolean) + .join(" "); + + if (isPathNotFoundLikeError(error)) { + console.error(prefix || "(error)", "\n", error); + return; + } + + logger.error(prefix, "\n", error); }); });