Jay V 9 месяцев назад
Родитель
Сommit
4df40e0d9b

+ 5 - 0
bun.lock

@@ -71,6 +71,7 @@
         "astro": "5.7.13",
         "diff": "8.0.2",
         "js-base64": "3.7.7",
+        "lang-map": "0.4.0",
         "luxon": "3.6.1",
         "marked": "15.0.12",
         "rehype-autolink-headings": "7.1.0",
@@ -1011,6 +1012,10 @@
 
     "klona": ["[email protected]", "", {}, "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="],
 
+    "lang-map": ["[email protected]", "", { "dependencies": { "language-map": "^1.1.0" } }, "sha512-oiSqZIEUnWdFeDNsp4HId4tAxdFbx5iMBOwA3666Fn2L8Khj8NiD9xRvMsGmKXopPVkaDFtSv3CJOmXFUB0Hcg=="],
+
+    "language-map": ["[email protected]", "", {}, "sha512-n7gFZpe+DwEAX9cXVTw43i3wiudWDDtSn28RmdnS/HCPr284dQI/SztsamWanRr75oSlKSaGbV2nmWCTzGCoVg=="],
+
     "leven": ["[email protected]", "", {}, "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA=="],
 
     "longest-streak": ["[email protected]", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],

+ 1 - 0
packages/web/package.json

@@ -21,6 +21,7 @@
     "astro": "5.7.13",
     "diff": "8.0.2",
     "js-base64": "3.7.7",
+    "lang-map": "0.4.0",
     "luxon": "3.6.1",
     "marked": "15.0.12",
     "rehype-autolink-headings": "7.1.0",

+ 24 - 7
packages/web/src/components/Share.tsx

@@ -11,6 +11,7 @@ import {
   createEffect,
   createSignal,
 } from "solid-js"
+import map from "lang-map"
 import { DateTime } from "luxon"
 import { createStore, reconcile } from "solid-js/store"
 import type { Diagnostic } from "vscode-languageserver-types"
@@ -100,8 +101,24 @@ function stripWorkingDirectory(filePath: string, workingDir?: string) {
   return filePath
 }
 
-function getFileType(path: string) {
-  return path.split(".").pop()
+function getShikiLang(filename: string) {
+  const ext = filename
+    .split('.')
+    .pop()
+    ?.toLowerCase() ?? ''
+
+  // map.languages(ext) returns an array of matching Linguist language names (e.g. ['TypeScript'])
+  const langs = map.languages(ext)
+  const type = langs?.[0]?.toLowerCase()
+
+  // Overrride any specific language mappings
+  const overrides: Record<string, string> = {
+    "conf": "shellscript"
+  }
+
+  return type
+    ? overrides[type] ?? type
+    : 'plaintext'
 }
 
 function formatDuration(ms: number): string {
@@ -980,7 +997,7 @@ export default function Share(props: {
                               const prompts = assistant().system || []
                               return prompts.filter(
                                 (p: string) =>
-                                  !p.startsWith("You are Claude Code"),
+                                  !p.startsWith("You are Claude"),
                               )
                             })
                             return (
@@ -1379,7 +1396,7 @@ export default function Share(props: {
                                           <Show when={showResults()}>
                                             <div data-part-tool-code>
                                               <CodeBlock
-                                                lang={getFileType(filePath())}
+                                                lang={getShikiLang(filePath())}
                                                 code={preview()}
                                               />
                                             </div>
@@ -1483,8 +1500,8 @@ export default function Share(props: {
                                           <Show when={showResults()}>
                                             <div data-part-tool-code>
                                               <CodeBlock
-                                                lang={getFileType(filePath())}
-                                                code={content()}
+                                                lang={getShikiLang(filePath())}
+                                                code={args.content}
                                               />
                                             </div>
                                           </Show>
@@ -1557,7 +1574,7 @@ export default function Share(props: {
                                           <DiffView
                                             class={styles["diff-code-block"]}
                                             diff={diff()}
-                                            lang={getFileType(filePath())}
+                                            lang={getShikiLang(filePath())}
                                           />
                                         </div>
                                       </Match>

+ 2 - 2
packages/web/src/components/share.module.css

@@ -63,7 +63,7 @@
     h1 {
       font-size: 2.75rem;
       font-weight: 500;
-      line-height: 1.15;
+      line-height: 1.2;
       letter-spacing: -0.05em;
       display: -webkit-box;
       -webkit-box-orient: vertical;
@@ -360,7 +360,7 @@
   [data-part-type="tool-fetch"] {
     [data-part-tool-result] {
       [data-part-tool-code] {
-        width: var(--md-tool-width);
+        max-width: var(--md-tool-width);
         border: 1px solid var(--sl-color-divider);
         background-color: var(--sl-color-bg-surface);
         border-radius: 0.25rem;

+ 7 - 0
packages/web/src/pages/s/[id].astro

@@ -11,6 +11,13 @@ const { id } = Astro.params;
 const res = await fetch(`${apiUrl}/share_data?id=${id}`);
 const data = await res.json();
 
+if (!data.info) {
+  return new Response(null, {
+    status: 404,
+    statusText: 'Not found'
+  });
+}
+
 const models: Set<string> = new Set();
 const version = data.info.version ? `v${data.info.version}` : "v0.0.1";
 

+ 0 - 0
packages/web/src/types/lang-map.d.ts