From 69dffd72deeb28c8f113b7f37281b87f194cd494 Mon Sep 17 00:00:00 2001 From: seaHi Date: Wed, 5 Aug 2026 15:42:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=BC=BA=20Markdown=20?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=9D=97=E7=9A=84=E9=AB=98=E4=BA=AE=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=95=88=E6=9E=9C=EF=BC=8C=E6=94=AF=E6=8C=81=E6=9B=B4?= =?UTF-8?q?=E5=A4=9A=20Bash=20=E5=91=BD=E4=BB=A4=E4=B8=8E=E5=88=AB?= =?UTF-8?q?=E5=90=8D=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/components/MarkdownRenderer.svelte | 56 +++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/src/lib/components/MarkdownRenderer.svelte b/src/lib/components/MarkdownRenderer.svelte index b225417..35472e1 100644 --- a/src/lib/components/MarkdownRenderer.svelte +++ b/src/lib/components/MarkdownRenderer.svelte @@ -5,6 +5,43 @@ import { Fancybox } from '@fancyapps/ui/dist/index.js'; import '@fancyapps/ui/dist/fancybox/fancybox.css'; + // 增强 highlight.js 的 bash 语法定义:补足常用运维及工程工具的主命令、子命令以及参数开关 + const bashLang = hljs.getLanguage('bash'); + if (bashLang && bashLang.keywords && typeof bashLang.keywords === 'object') { + const kw = bashLang.keywords as Record; + // 1. 添加主命令(显示为内建或核心命令样式) + if (Array.isArray(kw.built_in)) { + kw.built_in.push( + 'docker', 'podman', 'openstack', 'kubectl', 'kubeadm', 'helm', + 'systemctl', 'journalctl', 'firewalld', 'iptables', 'crictl', 'nerdctl', + 'ansible', 'terraform', 'vagrant', 'wrangler', 'pnpm', 'npm', 'gitea', + 'curl', 'wget', 'git', 'cargo', 'bun' + ); + } + // 2. 添加操作动作与资源类子命令(显示为字面或特色参数样式) + const customSubcommands = [ + 'run', 'exec', 'ps', 'build', 'image', 'images', 'container', 'pull', 'push', + 'apply', 'get', 'describe', 'delete', 'logs', 'create', 'edit', 'rollout', + 'scale', 'port-forward', 'cluster-info', 'server', 'flavor', 'volume', + 'network', 'subnet', 'router', 'keypair', 'floating', 'list', 'show', + 'start', 'stop', 'restart', 'status', 'enable', 'disable', 'daemon-reload', + 'clone', 'commit', 'checkout', 'branch', 'merge', 'rebase', 'fetch', + 'install', 'add', 'remove', 'dev', 'deploy', 'attach', 'rmi', 'rm' + ]; + if (Array.isArray(kw.literal)) { + kw.literal.push(...customSubcommands); + } else { + kw.literal = customSubcommands; + } + // 3. 匹配 -d, --name, -p 等选项开关(限定必须位于空格或行首后面,避免误伤中间带破折号的普通名称) + if (Array.isArray(bashLang.contains)) { + bashLang.contains.unshift({ + className: 'attr', + begin: /(?<=\s|^)-+[a-zA-Z0-9_-]+/ + }); + } + } + let { content = '' } = $props<{ content: string }>(); let container: HTMLElement; @@ -15,7 +52,24 @@ renderer: { code(token) { const code = token.text; - const rawLang = (token.lang || '').trim().toLowerCase().split(' ')[0]; + let rawLang = (token.lang || '').trim().toLowerCase().split(' ')[0]; + // 对常见的习惯表达法强制收向 bash 处理 + const bashAliases: Record = { + k8s: 'bash', + kubectl: 'bash', + openstack: 'bash', + podman: 'bash', + systemd: 'bash', + systemctl: 'bash', + console: 'bash', + terminal: 'bash', + zsh: 'bash', + sh: 'bash' + }; + if (bashAliases[rawLang]) { + rawLang = bashAliases[rawLang]; + } + let highlighted: string; let language = 'plaintext';