fix(code_highlight): make Prisma language working properly
+ 101
- 7
@@ -1,10 +1,10 @@
 {
-  "_generatedAtUnix": 1665173644819,
+  "_generatedAtUnix": 1665177333861,
   "_hashAlgorithm": "sha1",
   "_version": 2,
   "islands": {
     "Code": {
-      "hash": "33a6daff70fa161a3031d82e22db9206e08006bf",
+      "hash": "e5b854e7eae3fdc06195e320f09da33a5ff7a42b",
       "pathSource": "./app/islands/Code.tsx",
       "pathBundle": "./public/.islands/Code.bundle.js",
       "pathSourceMap": "./public/.islands/Code.bundle.js.map"

app/controllers/syntaxHighlight/highlightCodeAction.ts
@@ -8,6 +8,22 @@ import type { AppThemeScheme } from "../../types";
 import { AppRoute, AppRoutesParams } from "../../routes";
 import { escapeHtmlCode } from "../../utils/shared/escapeHtmlCode";
 
+Prism.languages.prisma = Prism.languages.extend("javascript", {
+  keyword: /\b(?:datasource|enum|generator|model|type)\b/,
+});
+
+Prism.languages.insertBefore("prisma", "function", {
+  annotation: {
+    pattern: /(^|[^.])@+\w+/,
+    lookbehind: true,
+    alias: "punctuation",
+  },
+});
+
+Prism.languages.insertBefore("prisma", "punctuation", {
+  "type-args": /\b(?:references|fields):/,
+});
+
 const syntaxHighlightThemes: Record<AppThemeScheme, string> = {
   light: `code[class*="language-"],pre[class*="language-"]{color:#000;background:0 0;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;padding-left:3.5em;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*="language-"]::-moz-selection,code[class*="language-"]::-moz-selection,pre[class*="language-"] ::-moz-selection,pre[class*="language-"]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*="language-"]::selection,code[class*="language-"]::selection,pre[class*="language-"] ::selection,pre[class*="language-"]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*="language-"],pre[class*="language-"]{text-shadow:none}}pre[class*="language-"]{padding:1em;margin:0.5em 0;overflow-y:hidden;overflow-x:auto}:not(pre) > code[class*="language-"],pre[class*="language-"]{background:#f5f2f0}:not(pre) > code[class*="language-"]{padding:0.1em;border-radius:0.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:0.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0, 0%, 100%, 0.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}`,
   dark: `code[class*="language-"],pre[class*="language-"]{color:#fff;background:0 0;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;padding-left:3.5em;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}@media print{code[class*="language-"],pre[class*="language-"]{text-shadow:none}}:not(pre) > code[class*="language-"],pre[class*="language-"]{background:#4c3f33}pre[class*="language-"]{padding:1em;margin:0.5em 0;overflow-y:hidden;overflow-x:auto;border:0.3em solid #7a6651;border-radius:0.5em;box-shadow:1px 1px 0.5em #000 inset}:not(pre) > code[class*="language-"]{padding:0.15em 0.2em 0.05em;border-radius:0.3em;border:0.13em solid #7a6651;box-shadow:1px 1px 0.3em -0.1em #000 inset;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#997f66}.token.punctuation{opacity:0.7}.token.namespace{opacity:0.7}.token.boolean,.token.constant,.token.number,.token.property,.token.symbol,.token.tag{color:#d1939e}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#bce051}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f4b73d}.token.atrule,.token.attr-value,.token.keyword{color:#d1939e}.token.important,.token.regex{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.deleted{color:red}`,

@@ -18,6 +18,24 @@ interface CodeProps {
   [x: string]: unknown;
 }
 
+if (typeof window === "undefined") {
+  Prism.languages.prisma = Prism.languages.extend("javascript", {
+    keyword: /\b(?:datasource|enum|generator|model|type)\b/,
+  });
+
+  Prism.languages.insertBefore("prisma", "function", {
+    annotation: {
+      pattern: /(^|[^.])@+\w+/,
+      lookbehind: true,
+      alias: "punctuation",
+    },
+  });
+
+  Prism.languages.insertBefore("prisma", "punctuation", {
+    "type-args": /\b(?:references|fields):/,
+  });
+}
+
 const Code: ReactIsland<CodeProps & WithThemeSchemeProp> = ({
   code,
   language,

app/services/codeAnalysis/getLinguistFileInfos.ts
@@ -39,17 +39,22 @@ const makeGetLinguistFileInfos: ServiceMethodFactory<
       throw new Error(`Invalid language: not in languages map.`);
     }
 
+    const langFromTmScope = languageInfos.tmScope.replace(/^source./i, "");
     const languageResults: LinguistFileInfos = {
       color: languageInfos.color || "gray",
       extensions: languageInfos.extensions || [],
       languageDisplayName: language,
-      language: languageInfos.aceMode,
+      language: langFromTmScope || languageInfos.aceMode,
       languageId: languageInfos.languageId,
       mimeType:
-        languageInfos.codemirrorMimeType || `text/${languageInfos.aceMode}`,
+        languageInfos.codemirrorMimeType ||
+        `text/${langFromTmScope || languageInfos.aceMode}`,
       type: languageInfos.type,
     };
 
+    console.log("path:", path);
+    console.log("languageResults:", languageResults);
+
     return Promise.resolve(languageResults);
   };
 };

patches/language-detect+1.1.0.patch
@@ -1,8 +1,16 @@
 diff --git a/node_modules/language-detect/vendor/extensions.json b/node_modules/language-detect/vendor/extensions.json
-index 903ba4e..ac2dd82 100644
+index 903ba4e..d70f21b 100644
 --- a/node_modules/language-detect/vendor/extensions.json
 +++ b/node_modules/language-detect/vendor/extensions.json
-@@ -696,7 +696,8 @@
+@@ -555,6 +555,7 @@
+   ".qml": "QML",
+   ".qbs": "QML",
+   ".pri": "QMake",
++  ".prisma": "Prisma",
+   ".r": "Rebol",
+   ".rd": "R",
+   ".rsx": "R",
+@@ -696,7 +697,8 @@
    ".tu": "Turing",
    ".ttl": "Turtle",
    ".twig": "Twig",

...
@@ -13,7 +21,7 @@ index 903ba4e..ac2dd82 100644
    ".anim": "Unity3D Asset",
    ".asset": "Unity3D Asset",
 diff --git a/node_modules/language-detect/vendor/filenames.json b/node_modules/language-detect/vendor/filenames.json
-index 18b7307..8000059 100644
+index 18b7307..eec6f90 100644
 --- a/node_modules/language-detect/vendor/filenames.json
 +++ b/node_modules/language-detect/vendor/filenames.json
 @@ -1,4 +1,5 @@

new file
patches/language-map+1.5.0.patch
@@ -0,0 +1,13 @@
+diff --git a/node_modules/language-map/languages.json b/node_modules/language-map/languages.json
+index ee70d36..94457d8 100644
+--- a/node_modules/language-map/languages.json
++++ b/node_modules/language-map/languages.json
+@@ -5565,7 +5565,7 @@
+       ".prisma"
+     ],
+     "tmScope": "source.prisma",
+-    "aceMode": "text",
++    "aceMode": "prisma",
+     "languageId": 499933428
+   },
+   "Processing": {

new file
public/assets/prism/components/prism-prisma.js
@@ -0,0 +1,17 @@
+(function (Prism) {
+  Prism.languages.prisma = Prism.languages.extend("javascript", {
+    keyword: /\b(?:datasource|enum|generator|model|type)\b/,
+  });
+
+  Prism.languages.insertBefore("prisma", "function", {
+    annotation: {
+      pattern: /(^|[^.])@+\w+/,
+      lookbehind: true,
+      alias: "punctuation",
+    },
+  });
+
+  Prism.languages.insertBefore("prisma", "punctuation", {
+    "type-args": /\b(?:references|fields):/,
+  });
+});

new file
public/assets/prism/components/prism-prisma.min.js
@@ -0,0 +1,17 @@
+(function (Prism) {
+  Prism.languages.prisma = Prism.languages.extend("javascript", {
+    keyword: /\b(?:datasource|enum|generator|model|type)\b/,
+  });
+
+  Prism.languages.insertBefore("prisma", "function", {
+    annotation: {
+      pattern: /(^|[^.])@+\w+/,
+      lookbehind: true,
+      alias: "punctuation",
+    },
+  });
+
+  Prism.languages.insertBefore("prisma", "punctuation", {
+    "type-args": /\b(?:references|fields):/,
+  });
+});

GitFOSS - v0.2.0 (#48b426e) - MIT License