From 7e64e31dfe7d4d30b68991ace7fae258000f27e7 Mon Sep 17 00:00:00 2001 From: SiriusXT <1160925501@qq.com> Date: Sat, 17 May 2025 23:51:37 +0800 Subject: [PATCH 01/66] Fix: The button for toggling the left pane visibility in the launcher was initially not visible on startup --- apps/client/src/widgets/buttons/left_pane_toggle.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/client/src/widgets/buttons/left_pane_toggle.ts b/apps/client/src/widgets/buttons/left_pane_toggle.ts index 88528add5..80725a3e8 100644 --- a/apps/client/src/widgets/buttons/left_pane_toggle.ts +++ b/apps/client/src/widgets/buttons/left_pane_toggle.ts @@ -32,10 +32,8 @@ export default class LeftPaneToggleWidget extends CommandButtonWidget { } refreshIcon() { - if (document.hasFocus() || this.currentLeftPaneVisible === true) { - super.refreshIcon(); - splitService.setupLeftPaneResizer(this.currentLeftPaneVisible); - } + super.refreshIcon(); + splitService.setupLeftPaneResizer(this.currentLeftPaneVisible); } entitiesReloadedEvent({ loadResults }: EventData<"entitiesReloaded">) { From d4fab87ed98cd4526ca20aa1e3ca5f31292b8b8d Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 May 2025 00:16:09 +0300 Subject: [PATCH 02/66] refactor(highlightjs): create separate project --- packages/highlightjs/README.md | 7 ++++ packages/highlightjs/eslint.config.mjs | 24 +++++++++++++ packages/highlightjs/package.json | 22 ++++++++++++ packages/highlightjs/src/index.ts | 1 + packages/highlightjs/src/lib/highlightjs.ts | 3 ++ packages/highlightjs/tsconfig.json | 10 ++++++ packages/highlightjs/tsconfig.lib.json | 21 ++++++++++++ packages/highlightjs/vite.config.ts | 37 +++++++++++++++++++++ pnpm-lock.yaml | 2 ++ tsconfig.json | 3 ++ 10 files changed, 130 insertions(+) create mode 100644 packages/highlightjs/README.md create mode 100644 packages/highlightjs/eslint.config.mjs create mode 100644 packages/highlightjs/package.json create mode 100644 packages/highlightjs/src/index.ts create mode 100644 packages/highlightjs/src/lib/highlightjs.ts create mode 100644 packages/highlightjs/tsconfig.json create mode 100644 packages/highlightjs/tsconfig.lib.json create mode 100644 packages/highlightjs/vite.config.ts diff --git a/packages/highlightjs/README.md b/packages/highlightjs/README.md new file mode 100644 index 000000000..706753a31 --- /dev/null +++ b/packages/highlightjs/README.md @@ -0,0 +1,7 @@ +# highlightjs + +This library was generated with [Nx](https://nx.dev). + +## Building + +Run `nx build highlightjs` to build the library. diff --git a/packages/highlightjs/eslint.config.mjs b/packages/highlightjs/eslint.config.mjs new file mode 100644 index 000000000..9ee1191ff --- /dev/null +++ b/packages/highlightjs/eslint.config.mjs @@ -0,0 +1,24 @@ +import baseConfig from "../../eslint.config.mjs"; + +export default [ + ...baseConfig, + { + "files": [ + "**/*.json" + ], + "rules": { + "@nx/dependency-checks": [ + "error", + { + "ignoredFiles": [ + "{projectRoot}/eslint.config.{js,cjs,mjs}", + "{projectRoot}/vite.config.{js,ts,mjs,mts}" + ] + } + ] + }, + "languageOptions": { + "parser": (await import('jsonc-eslint-parser')) + } + } +]; diff --git a/packages/highlightjs/package.json b/packages/highlightjs/package.json new file mode 100644 index 000000000..f474df945 --- /dev/null +++ b/packages/highlightjs/package.json @@ -0,0 +1,22 @@ +{ + "name": "@triliumnext/highlightjs", + "version": "0.0.1", + "private": true, + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "development": "./src/index.ts", + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + } + }, + "nx": { + "name": "highlightjs" + }, + "dependencies": {} +} diff --git a/packages/highlightjs/src/index.ts b/packages/highlightjs/src/index.ts new file mode 100644 index 000000000..b6cb49673 --- /dev/null +++ b/packages/highlightjs/src/index.ts @@ -0,0 +1 @@ +export * from './lib/highlightjs.js'; diff --git a/packages/highlightjs/src/lib/highlightjs.ts b/packages/highlightjs/src/lib/highlightjs.ts new file mode 100644 index 000000000..3a05e1c98 --- /dev/null +++ b/packages/highlightjs/src/lib/highlightjs.ts @@ -0,0 +1,3 @@ +export function highlightjs(): string { + return 'highlightjs'; +} diff --git a/packages/highlightjs/tsconfig.json b/packages/highlightjs/tsconfig.json new file mode 100644 index 000000000..c23e61c80 --- /dev/null +++ b/packages/highlightjs/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.base.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/packages/highlightjs/tsconfig.lib.json b/packages/highlightjs/tsconfig.lib.json new file mode 100644 index 000000000..89ba670c3 --- /dev/null +++ b/packages/highlightjs/tsconfig.lib.json @@ -0,0 +1,21 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "baseUrl": ".", + "rootDir": "src", + "outDir": "dist", + "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo", + "emitDeclarationOnly": true, + "forceConsistentCasingInFileNames": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "types": [ + "node", + "vite/client" + ] + }, + "include": [ + "src/**/*.ts" + ], + "references": [] +} diff --git a/packages/highlightjs/vite.config.ts b/packages/highlightjs/vite.config.ts new file mode 100644 index 000000000..4ca8b8341 --- /dev/null +++ b/packages/highlightjs/vite.config.ts @@ -0,0 +1,37 @@ +/// +import { defineConfig } from 'vite'; +import dts from 'vite-plugin-dts'; +import * as path from 'path'; + +export default defineConfig(() => ({ + root: __dirname, + cacheDir: '../../node_modules/.vite/packages/highlightjs', + plugins: [dts({ entryRoot: 'src', tsconfigPath: path.join(__dirname, 'tsconfig.lib.json') })], + // Uncomment this if you are using workers. + // worker: { + // plugins: [ nxViteTsPaths() ], + // }, + // Configuration for building your library. + // See: https://vitejs.dev/guide/build.html#library-mode + build: { + outDir: './dist', + emptyOutDir: true, + reportCompressedSize: true, + commonjsOptions: { + transformMixedEsModules: true, + }, + lib: { + // Could also be a dictionary or array of multiple entry points. + entry: 'src/index.ts', + name: 'highlightjs', + fileName: 'index', + // Change this to the formats you want to support. + // Don't forget to update your package.json as well. + formats: ['es' as const] + }, + rollupOptions: { + // External packages that should not be bundled into your library. + external: [] + }, + }, +})); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee31587ec..eb47a0782 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1287,6 +1287,8 @@ importers: specifier: ^2.3.0 version: 2.8.1 + packages/highlightjs: {} + packages/turndown-plugin-gfm: dependencies: '@swc/helpers': diff --git a/tsconfig.json b/tsconfig.json index 60831037b..487e76f3e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -53,6 +53,9 @@ }, { "path": "./packages/codemirror" + }, + { + "path": "./packages/highlightjs" } ] } From 7bfe261ac63876eb9c6b200ff18c24861ecb6879 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 May 2025 00:20:43 +0300 Subject: [PATCH 03/66] refactor(highlightjs): move dependency --- apps/desktop/package.json | 3 +-- apps/server/package.json | 3 +-- apps/server/src/routes/assets.ts | 2 -- apps/server/webpack.config.cjs | 1 - packages/highlightjs/package.json | 4 +++- pnpm-lock.yaml | 24 +++++++++++------------- 6 files changed, 16 insertions(+), 21 deletions(-) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index d0ff256c3..71b61fcce 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -11,8 +11,7 @@ "electron-dl": "4.0.0", "electron-squirrel-startup": "1.0.1", "jquery.fancytree": "2.38.5", - "jquery-hotkeys": "0.2.2", - "@highlightjs/cdn-assets": "11.11.1" + "jquery-hotkeys": "0.2.2" }, "devDependencies": { "@types/electron-squirrel-startup": "1.0.2", diff --git a/apps/server/package.json b/apps/server/package.json index 62c7a9c30..4f09cccb3 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -6,8 +6,7 @@ "dependencies": { "better-sqlite3": "11.10.0", "jquery.fancytree": "2.38.5", - "jquery-hotkeys": "0.2.2", - "@highlightjs/cdn-assets": "11.11.1" + "jquery-hotkeys": "0.2.2" }, "devDependencies": { "@electron/remote": "2.1.2", diff --git a/apps/server/src/routes/assets.ts b/apps/server/src/routes/assets.ts index d41b4a4a9..8b8c85f3b 100644 --- a/apps/server/src/routes/assets.ts +++ b/apps/server/src/routes/assets.ts @@ -90,8 +90,6 @@ async function register(app: express.Application) { app.use(`/${assetPath}/node_modules/normalize.css/`, persistentCacheStatic(path.join(nodeModulesDir, "normalize.css/"))); app.use(`/${assetPath}/node_modules/jquery.fancytree/dist/`, persistentCacheStatic(path.join(nodeModulesDir, "jquery.fancytree/dist/"))); - - app.use(`/${assetPath}/node_modules/@highlightjs/cdn-assets/`, persistentCacheStatic(path.join(nodeModulesDir, "@highlightjs/cdn-assets/"))); } export default { diff --git a/apps/server/webpack.config.cjs b/apps/server/webpack.config.cjs index cd5b54994..d93354438 100644 --- a/apps/server/webpack.config.cjs +++ b/apps/server/webpack.config.cjs @@ -22,7 +22,6 @@ function buildFilesToCopy() { "autocomplete.js/dist", "normalize.css/normalize.css", "jquery.fancytree/dist", - "@highlightjs/cdn-assets", // Required as they are native dependencies and cannot be well bundled. "better-sqlite3", diff --git a/packages/highlightjs/package.json b/packages/highlightjs/package.json index f474df945..ec07642fa 100644 --- a/packages/highlightjs/package.json +++ b/packages/highlightjs/package.json @@ -18,5 +18,7 @@ "nx": { "name": "highlightjs" }, - "dependencies": {} + "dependencies": { + "highlight.js": "11.11.1" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb47a0782..6b857fe13 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -340,9 +340,6 @@ importers: '@electron/remote': specifier: 2.1.2 version: 2.1.2(electron@36.2.1) - '@highlightjs/cdn-assets': - specifier: 11.11.1 - version: 11.11.1 better-sqlite3: specifier: ^11.9.1 version: 11.10.0 @@ -457,9 +454,6 @@ importers: apps/server: dependencies: - '@highlightjs/cdn-assets': - specifier: 11.11.1 - version: 11.11.1 better-sqlite3: specifier: 11.10.0 version: 11.10.0 @@ -1287,7 +1281,11 @@ importers: specifier: ^2.3.0 version: 2.8.1 - packages/highlightjs: {} + packages/highlightjs: + dependencies: + highlight.js: + specifier: 11.11.1 + version: 11.11.1 packages/turndown-plugin-gfm: dependencies: @@ -3371,10 +3369,6 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - '@highlightjs/cdn-assets@11.11.1': - resolution: {integrity: sha512-VEPdHzwelZ12hEX18BHduqxMZGolcUsrbeokHYxOUIm8X2+M7nx5QPtPeQgRxR9XjhdLv4/7DD5BWOlSrJ3k7Q==} - engines: {node: '>=12.0.0'} - '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -8748,6 +8742,10 @@ packages: resolution: {integrity: sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==} engines: {node: '>=18.0.0'} + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + history@4.10.1: resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} @@ -17076,8 +17074,6 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 - '@highlightjs/cdn-assets@11.11.1': {} - '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -23998,6 +23994,8 @@ snapshots: helmet@8.1.0: {} + highlight.js@11.11.1: {} + history@4.10.1: dependencies: '@babel/runtime': 7.27.0 From e4f633d827d570ab7f5c3fc1c1bf4343406bcc25 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 May 2025 00:31:20 +0300 Subject: [PATCH 04/66] refactor(highlightjs): export necessary methods --- packages/highlightjs/src/index.ts | 4 +++- packages/highlightjs/src/lib/highlightjs.ts | 3 --- 2 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 packages/highlightjs/src/lib/highlightjs.ts diff --git a/packages/highlightjs/src/index.ts b/packages/highlightjs/src/index.ts index b6cb49673..cd59367e1 100644 --- a/packages/highlightjs/src/index.ts +++ b/packages/highlightjs/src/index.ts @@ -1 +1,3 @@ -export * from './lib/highlightjs.js'; +import hljs from "../node_modules/highlight.js/es/core.js"; + +export const { highlight, highlightAuto } = hljs; diff --git a/packages/highlightjs/src/lib/highlightjs.ts b/packages/highlightjs/src/lib/highlightjs.ts deleted file mode 100644 index 3a05e1c98..000000000 --- a/packages/highlightjs/src/lib/highlightjs.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function highlightjs(): string { - return 'highlightjs'; -} From c65f0d4249bee56b7913a808445eb99294ffb77e Mon Sep 17 00:00:00 2001 From: SiriusXT <1160925501@qq.com> Date: Sun, 18 May 2025 10:22:49 +0800 Subject: [PATCH 05/66] Fix (left pane toggle logic): properly handle both synced and current window visibility states --- apps/client/src/widgets/buttons/left_pane_toggle.ts | 8 +++++--- apps/client/src/widgets/containers/left_pane_container.ts | 8 +++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/apps/client/src/widgets/buttons/left_pane_toggle.ts b/apps/client/src/widgets/buttons/left_pane_toggle.ts index 80725a3e8..99fa0530b 100644 --- a/apps/client/src/widgets/buttons/left_pane_toggle.ts +++ b/apps/client/src/widgets/buttons/left_pane_toggle.ts @@ -19,10 +19,10 @@ export default class LeftPaneToggleWidget extends CommandButtonWidget { return "bx-sidebar"; } - return options.is("leftPaneVisible") ? "bx-chevrons-left" : "bx-chevrons-right"; + return this.currentLeftPaneVisible ? "bx-chevrons-left" : "bx-chevrons-right"; }; - this.settings.title = () => (options.is("leftPaneVisible") ? t("left_pane_toggle.hide_panel") : t("left_pane_toggle.show_panel")); + this.settings.title = () => (this.currentLeftPaneVisible ? t("left_pane_toggle.hide_panel") : t("left_pane_toggle.show_panel")); this.settings.command = () => (this.currentLeftPaneVisible ? "hideLeftPane" : "showLeftPane"); @@ -38,7 +38,9 @@ export default class LeftPaneToggleWidget extends CommandButtonWidget { entitiesReloadedEvent({ loadResults }: EventData<"entitiesReloaded">) { if (loadResults.isOptionReloaded("leftPaneVisible") && document.hasFocus()) { - this.currentLeftPaneVisible = options.is("leftPaneVisible"); + // options.is("leftPaneVisible") changed — it may or may not be the same as currentLeftPaneVisible, but as long as the window is focused, the left pane visibility should be toggled. + // See PR description for detailed explanation of multi-window edge cases: https://github.com/TriliumNext/Notes/pull/1962 + this.currentLeftPaneVisible = !this.currentLeftPaneVisible; this.refreshIcon(); } } diff --git a/apps/client/src/widgets/containers/left_pane_container.ts b/apps/client/src/widgets/containers/left_pane_container.ts index 2b8221553..c9016b8ae 100644 --- a/apps/client/src/widgets/containers/left_pane_container.ts +++ b/apps/client/src/widgets/containers/left_pane_container.ts @@ -4,20 +4,26 @@ import appContext, { type EventData } from "../../components/app_context.js"; import type Component from "../../components/component.js"; export default class LeftPaneContainer extends FlexContainer { + private currentLeftPaneVisible: boolean; + constructor() { super("column"); + this.currentLeftPaneVisible = options.is("leftPaneVisible"); + this.id("left-pane"); this.css("height", "100%"); this.collapsible(); } isEnabled() { - return super.isEnabled() && options.is("leftPaneVisible"); + return super.isEnabled() && this.currentLeftPaneVisible; } entitiesReloadedEvent({ loadResults }: EventData<"entitiesReloaded">) { if (loadResults.isOptionReloaded("leftPaneVisible") && document.hasFocus()) { + // options.is("leftPaneVisible") changed — it may or may not be the same as currentLeftPaneVisible, but as long as the window is focused, the left pane visibility should be toggled. + this.currentLeftPaneVisible = !this.currentLeftPaneVisible; const visible = this.isEnabled(); this.toggleInt(visible); From d650532e104e3892fd7b4bc3fe9d75f68974f47e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 18 May 2025 06:29:49 +0000 Subject: [PATCH 06/66] chore(deps): update dependency @types/diff to v8 --- apps/db-compare/package.json | 2 +- pnpm-lock.yaml | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/apps/db-compare/package.json b/apps/db-compare/package.json index c31b7562d..356798569 100644 --- a/apps/db-compare/package.json +++ b/apps/db-compare/package.json @@ -69,6 +69,6 @@ } }, "devDependencies": { - "@types/diff": "^7.0.2" + "@types/diff": "^8.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee31587ec..2ef2a75bd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -332,8 +332,8 @@ importers: version: 5.1.7 devDependencies: '@types/diff': - specifier: ^7.0.2 - version: 7.0.2 + specifier: ^8.0.0 + version: 8.0.0 apps/desktop: dependencies: @@ -5171,8 +5171,9 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/diff@7.0.2': - resolution: {integrity: sha512-JSWRMozjFKsGlEjiiKajUjIJVKuKdE3oVy2DNtK+fUo8q82nhFZ2CPQwicAIkXrofahDXrWJ7mjelvZphMS98Q==} + '@types/diff@8.0.0': + resolution: {integrity: sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw==} + deprecated: This is a stub types definition. diff provides its own type definitions, so you do not need this installed. '@types/ejs@3.1.5': resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} @@ -19549,7 +19550,9 @@ snapshots: dependencies: '@types/ms': 2.1.0 - '@types/diff@7.0.2': {} + '@types/diff@8.0.0': + dependencies: + diff: 8.0.1 '@types/ejs@3.1.5': {} From 5205320d442d9d514d35d53f62cdb9756b2d5734 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 May 2025 10:01:35 +0300 Subject: [PATCH 07/66] fix(highlightjs): integration with editable text --- apps/client/src/widgets/type_widgets/ckeditor/config.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/ckeditor/config.ts b/apps/client/src/widgets/type_widgets/ckeditor/config.ts index b4ba9633a..ddc027f71 100644 --- a/apps/client/src/widgets/type_widgets/ckeditor/config.ts +++ b/apps/client/src/widgets/type_widgets/ckeditor/config.ts @@ -104,10 +104,7 @@ export function buildConfig() { definitionsUrl: emojiDefinitionsUrl }, syntaxHighlighting: { - async loadHighlightJs() { - await library_loader.requireLibrary(library_loader.HIGHLIGHT_JS); - return hljs; - }, + loadHighlightJs: async () => await import("@triliumnext/highlightjs"), mapLanguageName: getHighlightJsNameForMime, defaultMimeType: MIME_TYPE_AUTO, enabled: isSyntaxHighlightEnabled From 51f2b9fc81372bac771dd6cf234a66d3a8dcbb69 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 May 2025 10:05:02 +0300 Subject: [PATCH 08/66] fix(highlightjs): integrate with the rest of the application --- apps/client/src/services/library_loader.ts | 3 +-- apps/client/src/services/syntax_highlight.ts | 10 +++------- apps/client/src/types.d.ts | 7 ------- .../type_widgets/options/text_notes/code_block.ts | 2 +- 4 files changed, 5 insertions(+), 17 deletions(-) diff --git a/apps/client/src/services/library_loader.ts b/apps/client/src/services/library_loader.ts index a5ad0e3fc..fc1b53f10 100644 --- a/apps/client/src/services/library_loader.ts +++ b/apps/client/src/services/library_loader.ts @@ -121,6 +121,5 @@ export default { requireCss, requireLibrary, loadHighlightingTheme, - KATEX, - HIGHLIGHT_JS + KATEX }; diff --git a/apps/client/src/services/syntax_highlight.ts b/apps/client/src/services/syntax_highlight.ts index ae2fbde72..213518d58 100644 --- a/apps/client/src/services/syntax_highlight.ts +++ b/apps/client/src/services/syntax_highlight.ts @@ -1,4 +1,4 @@ -import library_loader from "./library_loader.js"; +import { highlight, highlightAuto } from "@triliumnext/highlightjs"; import mime_types from "./mime_types.js"; import options from "./options.js"; @@ -43,17 +43,13 @@ export async function applySingleBlockSyntaxHighlight($codeBlock: JQuery void; diff --git a/apps/client/src/widgets/type_widgets/options/text_notes/code_block.ts b/apps/client/src/widgets/type_widgets/options/text_notes/code_block.ts index 162499274..361a06cd1 100644 --- a/apps/client/src/widgets/type_widgets/options/text_notes/code_block.ts +++ b/apps/client/src/widgets/type_widgets/options/text_notes/code_block.ts @@ -91,7 +91,7 @@ export default class CodeBlockOptions extends OptionsWidget { #setupPreview(shouldEnableSyntaxHighlight: boolean) { const text = SAMPLE_CODE; if (shouldEnableSyntaxHighlight) { - library_loader.requireLibrary(library_loader.HIGHLIGHT_JS).then(() => { + import("@triliumnext/highlightjs").then((hljs) => { const highlightedText = hljs.highlight(text, { language: SAMPLE_LANGUAGE }); From e0aa6f9200c940047da3265797dd7bff51d85a75 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 May 2025 10:13:38 +0300 Subject: [PATCH 09/66] chore(highlightjs): create empty mapping file --- .../highlightjs/src/syntax_highlighting.ts | 170 ++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 packages/highlightjs/src/syntax_highlighting.ts diff --git a/packages/highlightjs/src/syntax_highlighting.ts b/packages/highlightjs/src/syntax_highlighting.ts new file mode 100644 index 000000000..0934086c3 --- /dev/null +++ b/packages/highlightjs/src/syntax_highlighting.ts @@ -0,0 +1,170 @@ +import type { LanguageFn } from "highlight.js"; + +const byMimeType: Record Promise) | null> = { + "text/plain": null, + + "application/dart": null, + "application/edn": null, + "application/javascript;env=backend": null, + "application/javascript;env=frontend": null, + "application/json": null, + "application/ld+json": null, + "application/mbox": null, + "application/n-triples": null, + "application/pgp": null, + "application/sieve": null, + "application/sparql-query": null, + "application/typescript": null, + "application/x-aspx": null, + "application/x-bat": null, + "application/x-cypher-query": null, + "application/x-ejs": null, + "application/x-erb": null, + "application/x-jsp": null, + "application/x-powershell": null, + "application/xml-dtd": null, + "application/xquery": null, + "message/http": null, + "text/apl": null, + "text/coffeescript": null, + "text/css": null, + "text/html": null, + "text/jinja2": null, + "text/jsx": null, + "text/mirc": null, + "text/tiki": null, + "text/troff": null, + "text/turtle": null, + "text/typescript-jsx": null, + "text/vbscript": null, + "text/velocity": null, + "text/vnd.mermaid": null, + "text/mermaid": null, + "text/x-asm-mips": null, + "text/x-asterisk": null, + "text/x-brainfuck": null, + "text/x-c++src": null, + "text/x-cassandra": null, + "text/x-clojure": null, + "text/x-clojurescript": null, + "text/x-cmake": null, + "text/x-cobol": null, + "text/x-common-lisp": null, + "text/x-crystal": null, + "text/x-csharp": null, + "text/x-csrc": null, + "text/x-cython": null, + "text/x-d": null, + "text/x-diff": null, + "text/x-django": null, + "text/x-dockerfile": null, + "text/x-dylan": null, + "text/x-ebnf": null, + "text/x-ecl": null, + "text/x-eiffel": null, + "text/x-elm": null, + "text/x-erlang": null, + "text/x-esper": null, + "text/x-factor": null, + "text/x-fcl": null, + "text/x-feature": null, + "text/x-forth": null, + "text/x-fortran": null, + "text/x-fsharp": null, + "text/x-gas": null, + "text/x-gdscript": null, + "text/x-gfm": null, + "text/x-go": null, + "text/x-groovy": null, + "text/x-gss": null, + "text/x-haml": null, + "text/x-haskell": null, + "text/x-haxe": null, + "text/x-hcl": null, + "text/x-hxml": null, + "text/x-idl": null, + "text/x-java": null, + "text/x-julia": null, + "text/x-kotlin": null, + "text/x-latex": null, + "text/x-less": null, + "text/x-literate-haskell": null, + "text/x-livescript": null, + "text/x-lua": null, + "text/x-mariadb": null, + "text/x-markdown": null, + "text/x-mathematica": null, + "text/x-modelica": null, + "text/x-mscgen": null, + "text/x-msgenny": null, + "text/x-mssql": null, + "text/x-mumps": null, + "text/x-mysql": null, + "text/x-nix": null, + "text/x-nginx-conf": null, + "text/x-nsis": null, + "text/x-objectivec": null, + "text/x-ocaml": null, + "text/x-octave": null, + "text/x-oz": null, + "text/x-pascal": null, + "text/x-perl": null, + "text/x-pgsql": null, + "text/x-php": null, + "text/x-pig": null, + "text/x-plsql": null, + "text/x-properties": null, + "text/x-protobuf": null, + "text/x-pug": null, + "text/x-puppet": null, + "text/x-python": null, + "text/x-q": null, + "text/x-rpm-changes": null, + "text/x-rpm-spec": null, + "text/x-rsrc": null, + "text/x-rst": null, + "text/x-ruby": null, + "text/x-rustsrc": null, + "text/x-sas": null, + "text/x-sass": null, + "text/x-scala": null, + "text/x-scheme": null, + "text/x-scss": null, + "text/x-sh": null, + "text/x-slim": null, + "text/x-smarty": null, + "text/x-sml": null, + "text/x-solr": null, + "text/x-soy": null, + "text/x-spreadsheet": null, + "text/x-sql": null, + "text/x-sqlite;schema=trilium": null, + "text/x-sqlite": null, + "text/x-squirrel": null, + "text/x-stex": null, + "text/x-stsrc": null, + "text/x-styl": null, + "text/x-swift": null, + "text/x-systemverilog": null, + "text/x-tcl": null, + "text/x-textile": null, + "text/x-tiddlywiki": null, + "text/x-toml": null, + "text/x-tornado": null, + "text/x-ttcn-asn": null, + "text/x-ttcn-cfg": null, + "text/x-ttcn": null, + "text/x-twig": null, + "text/x-vb": null, + "text/x-verilog": null, + "text/x-vhdl": null, + "text/x-vue": null, + "text/x-webidl": null, + "text/x-xu": null, + "text/x-yacas": null, + "text/x-yaml": null, + "text/x-z80": null, + "text/xml": null, +} + +export default byMimeType; From 662599755429f3f5106df69d9196cfd7cd169ec9 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 May 2025 11:12:40 +0300 Subject: [PATCH 10/66] chore(highlightjs): map definitions --- .../src/services/mime_type_definitions.ts | 184 ++++++++--------- .../highlightjs/src/syntax_highlighting.ts | 190 +++++++++--------- 2 files changed, 189 insertions(+), 185 deletions(-) diff --git a/apps/client/src/services/mime_type_definitions.ts b/apps/client/src/services/mime_type_definitions.ts index 10c73e113..a9b30fb97 100644 --- a/apps/client/src/services/mime_type_definitions.ts +++ b/apps/client/src/services/mime_type_definitions.ts @@ -22,169 +22,169 @@ export interface MimeTypeDefinition { */ export const MIME_TYPES_DICT: readonly MimeTypeDefinition[] = Object.freeze([ - { title: "Plain text", mime: "text/plain", highlightJs: "plaintext", default: true }, + { title: "Plain text", mime: "text/plain", default: true }, // Keep sorted alphabetically. { title: "APL", mime: "text/apl" }, { title: "ASN.1", mime: "text/x-ttcn-asn" }, { title: "ASP.NET", mime: "application/x-aspx" }, { title: "Asterisk", mime: "text/x-asterisk" }, - { title: "Batch file (DOS)", mime: "application/x-bat", highlightJs: "dos", codeMirrorSource: "libraries/codemirror/batch.js" }, - { title: "Brainfuck", mime: "text/x-brainfuck", highlightJs: "brainfuck" }, - { title: "C", mime: "text/x-csrc", highlightJs: "c", default: true }, - { title: "C#", mime: "text/x-csharp", highlightJs: "csharp", default: true }, - { title: "C++", mime: "text/x-c++src", highlightJs: "cpp", default: true }, - { title: "Clojure", mime: "text/x-clojure", highlightJs: "clojure" }, + { title: "Batch file (DOS)", mime: "application/x-bat", codeMirrorSource: "libraries/codemirror/batch.js" }, + { title: "Brainfuck", mime: "text/x-brainfuck" }, + { title: "C", mime: "text/x-csrc", default: true }, + { title: "C#", mime: "text/x-csharp", default: true }, + { title: "C++", mime: "text/x-c++src", default: true }, + { title: "Clojure", mime: "text/x-clojure" }, { title: "ClojureScript", mime: "text/x-clojurescript" }, { title: "Closure Stylesheets (GSS)", mime: "text/x-gss" }, - { title: "CMake", mime: "text/x-cmake", highlightJs: "cmake" }, + { title: "CMake", mime: "text/x-cmake" }, { title: "Cobol", mime: "text/x-cobol" }, - { title: "CoffeeScript", mime: "text/coffeescript", highlightJs: "coffeescript" }, - { title: "Common Lisp", mime: "text/x-common-lisp", highlightJs: "lisp" }, + { title: "CoffeeScript", mime: "text/coffeescript" }, + { title: "Common Lisp", mime: "text/x-common-lisp" }, { title: "CQL", mime: "text/x-cassandra" }, - { title: "Crystal", mime: "text/x-crystal", highlightJs: "crystal" }, - { title: "CSS", mime: "text/css", highlightJs: "css", default: true }, + { title: "Crystal", mime: "text/x-crystal" }, + { title: "CSS", mime: "text/css", default: true }, { title: "Cypher", mime: "application/x-cypher-query" }, { title: "Cython", mime: "text/x-cython" }, - { title: "D", mime: "text/x-d", highlightJs: "d" }, - { title: "Dart", mime: "application/dart", highlightJs: "dart" }, - { title: "diff", mime: "text/x-diff", highlightJs: "diff" }, - { title: "Django", mime: "text/x-django", highlightJs: "django" }, - { title: "Dockerfile", mime: "text/x-dockerfile", highlightJs: "dockerfile" }, + { title: "D", mime: "text/x-d" }, + { title: "Dart", mime: "application/dart" }, + { title: "diff", mime: "text/x-diff" }, + { title: "Django", mime: "text/x-django" }, + { title: "Dockerfile", mime: "text/x-dockerfile" }, { title: "DTD", mime: "application/xml-dtd" }, { title: "Dylan", mime: "text/x-dylan" }, - { title: "EBNF", mime: "text/x-ebnf", highlightJs: "ebnf" }, + { title: "EBNF", mime: "text/x-ebnf" }, { title: "ECL", mime: "text/x-ecl" }, { title: "edn", mime: "application/edn" }, { title: "Eiffel", mime: "text/x-eiffel" }, - { title: "Elm", mime: "text/x-elm", highlightJs: "elm" }, + { title: "Elm", mime: "text/x-elm" }, { title: "Embedded Javascript", mime: "application/x-ejs" }, - { title: "Embedded Ruby", mime: "application/x-erb", highlightJs: "erb" }, - { title: "Erlang", mime: "text/x-erlang", highlightJs: "erlang" }, + { title: "Embedded Ruby", mime: "application/x-erb" }, + { title: "Erlang", mime: "text/x-erlang" }, { title: "Esper", mime: "text/x-esper" }, - { title: "F#", mime: "text/x-fsharp", highlightJs: "fsharp" }, + { title: "F#", mime: "text/x-fsharp" }, { title: "Factor", mime: "text/x-factor" }, { title: "FCL", mime: "text/x-fcl" }, { title: "Forth", mime: "text/x-forth" }, - { title: "Fortran", mime: "text/x-fortran", highlightJs: "fortran" }, + { title: "Fortran", mime: "text/x-fortran" }, { title: "Gas", mime: "text/x-gas" }, { title: "GDScript (Godot)", mime: "text/x-gdscript" }, - { title: "Gherkin", mime: "text/x-feature", highlightJs: "gherkin" }, - { title: "GitHub Flavored Markdown", mime: "text/x-gfm", highlightJs: "markdown" }, - { title: "Go", mime: "text/x-go", highlightJs: "go", default: true }, - { title: "Groovy", mime: "text/x-groovy", highlightJs: "groovy", default: true }, - { title: "HAML", mime: "text/x-haml", highlightJs: "haml" }, + { title: "Gherkin", mime: "text/x-feature" }, + { title: "GitHub Flavored Markdown", mime: "text/x-gfm" }, + { title: "Go", mime: "text/x-go", default: true }, + { title: "Groovy", mime: "text/x-groovy", default: true }, + { title: "HAML", mime: "text/x-haml" }, { title: "Haskell (Literate)", mime: "text/x-literate-haskell" }, - { title: "Haskell", mime: "text/x-haskell", highlightJs: "haskell", default: true }, - { title: "Haxe", mime: "text/x-haxe", highlightJs: "haxe" }, - { title: "HTML", mime: "text/html", highlightJs: "xml", default: true }, - { title: "HTTP", mime: "message/http", highlightJs: "http", default: true }, + { title: "Haskell", mime: "text/x-haskell", default: true }, + { title: "Haxe", mime: "text/x-haxe" }, + { title: "HTML", mime: "text/html", default: true }, + { title: "HTTP", mime: "message/http", default: true }, { title: "HXML", mime: "text/x-hxml" }, { title: "IDL", mime: "text/x-idl" }, - { title: "Java Server Pages", mime: "application/x-jsp", highlightJs: "java" }, - { title: "Java", mime: "text/x-java", highlightJs: "java", default: true }, + { title: "Java Server Pages", mime: "application/x-jsp" }, + { title: "Java", mime: "text/x-java", default: true }, { title: "Jinja2", mime: "text/jinja2" }, - { title: "JS backend", mime: "application/javascript;env=backend", highlightJs: "javascript", default: true }, - { title: "JS frontend", mime: "application/javascript;env=frontend", highlightJs: "javascript", default: true }, - { title: "JSON-LD", mime: "application/ld+json", highlightJs: "json" }, - { title: "JSON", mime: "application/json", highlightJs: "json", default: true }, - { title: "JSX", mime: "text/jsx", highlightJs: "javascript" }, - { title: "Julia", mime: "text/x-julia", highlightJs: "julia" }, - { title: "Kotlin", mime: "text/x-kotlin", highlightJs: "kotlin", default: true }, - { title: "LaTeX", mime: "text/x-latex", highlightJs: "latex" }, - { title: "LESS", mime: "text/x-less", highlightJs: "less" }, - { title: "LiveScript", mime: "text/x-livescript", highlightJs: "livescript" }, - { title: "Lua", mime: "text/x-lua", highlightJs: "lua" }, - { title: "MariaDB SQL", mime: "text/x-mariadb", highlightJs: "sql" }, - { title: "Markdown", mime: "text/x-markdown", highlightJs: "markdown", default: true }, - { title: "Mathematica", mime: "text/x-mathematica", highlightJs: "mathematica" }, + { title: "JS backend", mime: "application/javascript;env=backend", default: true }, + { title: "JS frontend", mime: "application/javascript;env=frontend", default: true }, + { title: "JSON-LD", mime: "application/ld+json"}, + { title: "JSON", mime: "application/json" }, + { title: "JSX", mime: "text/jsx" }, + { title: "Julia", mime: "text/x-julia" }, + { title: "Kotlin", mime: "text/x-kotlin", default: true }, + { title: "LaTeX", mime: "text/x-latex" }, + { title: "LESS", mime: "text/x-less" }, + { title: "LiveScript", mime: "text/x-livescript" }, + { title: "Lua", mime: "text/x-lua" }, + { title: "MariaDB SQL", mime: "text/x-mariadb" }, + { title: "Markdown", mime: "text/x-markdown", default: true }, + { title: "Mathematica", mime: "text/x-mathematica" }, { title: "mbox", mime: "application/mbox" }, - { title: "MIPS Assembler", mime: "text/x-asm-mips", highlightJs: "mipsasm" }, + { title: "MIPS Assembler", mime: "text/x-asm-mips" }, { title: "mIRC", mime: "text/mirc" }, { title: "Modelica", mime: "text/x-modelica" }, - { title: "MS SQL", mime: "text/x-mssql", highlightJs: "sql" }, + { title: "MS SQL", mime: "text/x-mssql" }, { title: "mscgen", mime: "text/x-mscgen" }, { title: "msgenny", mime: "text/x-msgenny" }, { title: "MUMPS", mime: "text/x-mumps" }, - { title: "MySQL", mime: "text/x-mysql", highlightJs: "sql" }, - { title: "Nix", mime: "text/x-nix", highlightJs: "nix" }, - { title: "Nginx", mime: "text/x-nginx-conf", highlightJs: "nginx" }, - { title: "NSIS", mime: "text/x-nsis", highlightJs: "nsis" }, + { title: "MySQL", mime: "text/x-mysql" }, + { title: "Nix", mime: "text/x-nix" }, + { title: "Nginx", mime: "text/x-nginx-conf" }, + { title: "NSIS", mime: "text/x-nsis" }, { title: "NTriples", mime: "application/n-triples" }, - { title: "Objective-C", mime: "text/x-objectivec", highlightJs: "objectivec" }, - { title: "OCaml", mime: "text/x-ocaml", highlightJs: "ocaml" }, + { title: "Objective-C", mime: "text/x-objectivec" }, + { title: "OCaml", mime: "text/x-ocaml" }, { title: "Octave", mime: "text/x-octave" }, { title: "Oz", mime: "text/x-oz" }, - { title: "Pascal", mime: "text/x-pascal", highlightJs: "delphi" }, + { title: "Pascal", mime: "text/x-pascal" }, { title: "PEG.js", mime: "null" }, { title: "Perl", mime: "text/x-perl", default: true }, { title: "PGP", mime: "application/pgp" }, - { title: "PHP", mime: "text/x-php", default: true, highlightJs: "php" }, + { title: "PHP", mime: "text/x-php", default: true }, { title: "Pig", mime: "text/x-pig" }, - { title: "PLSQL", mime: "text/x-plsql", highlightJs: "sql" }, - { title: "PostgreSQL", mime: "text/x-pgsql", highlightJs: "pgsql" }, - { title: "PowerShell", mime: "application/x-powershell", highlightJs: "powershell" }, - { title: "Properties files", mime: "text/x-properties", highlightJs: "properties" }, - { title: "ProtoBuf", mime: "text/x-protobuf", highlightJs: "protobuf" }, + { title: "PLSQL", mime: "text/x-plsql" }, + { title: "PostgreSQL", mime: "text/x-pgsql" }, + { title: "PowerShell", mime: "application/x-powershell" }, + { title: "Properties files", mime: "text/x-properties" }, + { title: "ProtoBuf", mime: "text/x-protobuf" }, { title: "Pug", mime: "text/x-pug" }, - { title: "Puppet", mime: "text/x-puppet", highlightJs: "puppet" }, - { title: "Python", mime: "text/x-python", highlightJs: "python", default: true }, - { title: "Q", mime: "text/x-q", highlightJs: "q" }, - { title: "R", mime: "text/x-rsrc", highlightJs: "r" }, + { title: "Puppet", mime: "text/x-puppet" }, + { title: "Python", mime: "text/x-python", default: true }, + { title: "Q", mime: "text/x-q" }, + { title: "R", mime: "text/x-rsrc" }, { title: "reStructuredText", mime: "text/x-rst" }, { title: "RPM Changes", mime: "text/x-rpm-changes" }, { title: "RPM Spec", mime: "text/x-rpm-spec" }, - { title: "Ruby", mime: "text/x-ruby", highlightJs: "ruby", default: true }, - { title: "Rust", mime: "text/x-rustsrc", highlightJs: "rust" }, - { title: "SAS", mime: "text/x-sas", highlightJs: "sas" }, - { title: "Sass", mime: "text/x-sass", highlightJs: "scss" }, + { title: "Ruby", mime: "text/x-ruby", default: true }, + { title: "Rust", mime: "text/x-rustsrc" }, + { title: "SAS", mime: "text/x-sas" }, + { title: "Sass", mime: "text/x-sass" }, { title: "Scala", mime: "text/x-scala" }, { title: "Scheme", mime: "text/x-scheme" }, - { title: "SCSS", mime: "text/x-scss", highlightJs: "scss" }, - { title: "Shell (bash)", mime: "text/x-sh", highlightJs: "bash", default: true }, + { title: "SCSS", mime: "text/x-scss" }, + { title: "Shell (bash)", mime: "text/x-sh", default: true }, { title: "Sieve", mime: "application/sieve" }, { title: "Slim", mime: "text/x-slim" }, - { title: "Smalltalk", mime: "text/x-stsrc", highlightJs: "smalltalk" }, + { title: "Smalltalk", mime: "text/x-stsrc" }, { title: "Smarty", mime: "text/x-smarty" }, - { title: "SML", mime: "text/x-sml", highlightJs: "sml" }, + { title: "SML", mime: "text/x-sml" }, { title: "Solr", mime: "text/x-solr" }, { title: "Soy", mime: "text/x-soy" }, { title: "SPARQL", mime: "application/sparql-query" }, { title: "Spreadsheet", mime: "text/x-spreadsheet" }, - { title: "SQL", mime: "text/x-sql", highlightJs: "sql", default: true }, - { title: "SQLite (Trilium)", mime: "text/x-sqlite;schema=trilium", highlightJs: "sql", default: true }, - { title: "SQLite", mime: "text/x-sqlite", highlightJs: "sql" }, + { title: "SQL", mime: "text/x-sql", default: true }, + { title: "SQLite (Trilium)", mime: "text/x-sqlite;schema=trilium", default: true }, + { title: "SQLite", mime: "text/x-sqlite" }, { title: "Squirrel", mime: "text/x-squirrel" }, { title: "sTeX", mime: "text/x-stex" }, - { title: "Stylus", mime: "text/x-styl", highlightJs: "stylus" }, + { title: "Stylus", mime: "text/x-styl" }, { title: "Swift", mime: "text/x-swift", default: true }, { title: "SystemVerilog", mime: "text/x-systemverilog" }, - { title: "Tcl", mime: "text/x-tcl", highlightJs: "tcl" }, - { title: "Terraform (HCL)", mime: "text/x-hcl", highlightJs: "terraform", highlightJsSource: "libraries", codeMirrorSource: "libraries/codemirror/hcl.js" }, + { title: "Tcl", mime: "text/x-tcl" }, + { title: "Terraform (HCL)", mime: "text/x-hcl", codeMirrorSource: "libraries/codemirror/hcl.js" }, { title: "Textile", mime: "text/x-textile" }, { title: "TiddlyWiki ", mime: "text/x-tiddlywiki" }, { title: "Tiki wiki", mime: "text/tiki" }, - { title: "TOML", mime: "text/x-toml", highlightJs: "ini" }, + { title: "TOML", mime: "text/x-toml" }, { title: "Tornado", mime: "text/x-tornado" }, { title: "troff", mime: "text/troff" }, { title: "TTCN_CFG", mime: "text/x-ttcn-cfg" }, { title: "TTCN", mime: "text/x-ttcn" }, { title: "Turtle", mime: "text/turtle" }, - { title: "Twig", mime: "text/x-twig", highlightJs: "twig" }, - { title: "TypeScript-JSX", mime: "text/typescript-jsx", highlightJs: "typescript" }, - { title: "TypeScript", mime: "application/typescript", highlightJs: "typescript" }, - { title: "VB.NET", mime: "text/x-vb", highlightJs: "vbnet" }, - { title: "VBScript", mime: "text/vbscript", highlightJs: "vbscript" }, + { title: "Twig", mime: "text/x-twig" }, + { title: "TypeScript-JSX", mime: "text/typescript-jsx" }, + { title: "TypeScript", mime: "application/typescript" }, + { title: "VB.NET", mime: "text/x-vb" }, + { title: "VBScript", mime: "text/vbscript" }, { title: "Velocity", mime: "text/velocity" }, - { title: "Verilog", mime: "text/x-verilog", highlightJs: "verilog" }, - { title: "VHDL", mime: "text/x-vhdl", highlightJs: "vhdl" }, + { title: "Verilog", mime: "text/x-verilog" }, + { title: "VHDL", mime: "text/x-vhdl" }, { title: "Vue.js Component", mime: "text/x-vue" }, { title: "Web IDL", mime: "text/x-webidl" }, - { title: "XML", mime: "text/xml", highlightJs: "xml", default: true }, - { title: "XQuery", mime: "application/xquery", highlightJs: "xquery" }, + { title: "XML", mime: "text/xml", default: true }, + { title: "XQuery", mime: "application/xquery" }, { title: "xu", mime: "text/x-xu" }, { title: "Yacas", mime: "text/x-yacas" }, - { title: "YAML", mime: "text/x-yaml", highlightJs: "yaml", default: true }, + { title: "YAML", mime: "text/x-yaml", default: true }, { title: "Z80", mime: "text/x-z80" } ]); diff --git a/packages/highlightjs/src/syntax_highlighting.ts b/packages/highlightjs/src/syntax_highlighting.ts index 0934086c3..20f542535 100644 --- a/packages/highlightjs/src/syntax_highlighting.ts +++ b/packages/highlightjs/src/syntax_highlighting.ts @@ -1,170 +1,174 @@ import type { LanguageFn } from "highlight.js"; -const byMimeType: Record Promise) | null> = { - "text/plain": null, +interface Mapping { + loader: Promise<{ default: LanguageFn}>; + alias: string; +} - "application/dart": null, +const byMimeType: Record = { + "text/plain": { loader: import("highlight.js/lib/languages/plaintext.js"), alias: "plaintext" }, + "application/dart": { loader: import("highlight.js/lib/languages/dart.js"), alias: "dart" }, "application/edn": null, - "application/javascript;env=backend": null, - "application/javascript;env=frontend": null, - "application/json": null, - "application/ld+json": null, + "application/javascript;env=backend": { loader: import("highlight.js/lib/languages/javascript.js"), alias: "javascript" }, + "application/javascript;env=frontend": { loader: import("highlight.js/lib/languages/javascript.js"), alias: "javascript" }, + "application/json": { loader: import("highlight.js/lib/languages/json.js"), alias: "json" }, + "application/ld+json": { loader: import("highlight.js/lib/languages/json.js"), alias: "json" }, "application/mbox": null, "application/n-triples": null, "application/pgp": null, "application/sieve": null, "application/sparql-query": null, - "application/typescript": null, + "application/typescript": { loader: import("highlight.js/lib/languages/typescript.js"), alias: "typescript" }, "application/x-aspx": null, - "application/x-bat": null, + "application/x-bat": { loader: import("highlight.js/lib/languages/bat.js"), alias: "bat" }, "application/x-cypher-query": null, "application/x-ejs": null, - "application/x-erb": null, - "application/x-jsp": null, - "application/x-powershell": null, + "application/x-erb": { loader: import("highlight.js/lib/languages/erb.js"), alias: "erb" }, + "application/x-jsp": { loader: import("highlight.js/lib/languages/java.js"), alias: "java" }, + "application/x-powershell": { loader: import("highlight.js/lib/languages/powershell.js"), alias: "powershell" }, "application/xml-dtd": null, - "application/xquery": null, - "message/http": null, + "application/xquery": { loader: import("highlight.js/lib/languages/xquery.js"), alias: "xquery" }, + "message/http": { loader: import("highlight.js/lib/languages/http.js"), alias: "http" }, "text/apl": null, - "text/coffeescript": null, - "text/css": null, - "text/html": null, + "text/coffeescript": { loader: import("highlight.js/lib/languages/coffeescript.js"), alias: "coffeescript" }, + "text/css": { loader: import("highlight.js/lib/languages/css.js"), alias: "css" }, + "text/html": { loader: import("highlight.js/lib/languages/html.js"), alias: "html" }, "text/jinja2": null, - "text/jsx": null, + "text/jsx": { loader: import("highlight.js/lib/languages/javascript.js"), alias: "javascript" }, "text/mirc": null, "text/tiki": null, "text/troff": null, "text/turtle": null, - "text/typescript-jsx": null, - "text/vbscript": null, + "text/typescript-jsx": { loader: import("highlight.js/lib/languages/typescript.js"), alias: "typescript" }, + "text/vbscript": { loader: import("highlight.js/lib/languages/vbscript.js"), alias: "vbscript" }, "text/velocity": null, "text/vnd.mermaid": null, "text/mermaid": null, - "text/x-asm-mips": null, + "text/x-asm-mips": { loader: import("highlight.js/lib/languages/mipsasm.js"), alias: "mipsasm" }, "text/x-asterisk": null, - "text/x-brainfuck": null, - "text/x-c++src": null, + "text/x-brainfuck": { loader: import("highlight.js/lib/languages/brainfuck.js"), alias: "brainfuck" }, + "text/x-c++src": { loader: import("highlight.js/lib/languages/cpp.js"), alias: "cpp" }, "text/x-cassandra": null, - "text/x-clojure": null, + "text/x-clojure": { loader: import("highlight.js/lib/languages/clojure.js"), alias: "clojure" }, "text/x-clojurescript": null, - "text/x-cmake": null, + "text/x-cmake": { loader: import("highlight.js/lib/languages/cmake.js"), alias: "cmake" }, "text/x-cobol": null, - "text/x-common-lisp": null, - "text/x-crystal": null, - "text/x-csharp": null, - "text/x-csrc": null, + "text/x-common-lisp": { loader: import("highlight.js/lib/languages/lisp.js"), alias: "lisp" }, + "text/x-crystal": { loader: import("highlight.js/lib/languages/crystal.js"), alias: "crystal" }, + "text/x-csharp": { loader: import("highlight.js/lib/languages/csharp.js"), alias: "csharp" }, + "text/x-csrc": { loader: import("highlight.js/lib/languages/c.js"), alias: "c" }, "text/x-cython": null, - "text/x-d": null, - "text/x-diff": null, - "text/x-django": null, - "text/x-dockerfile": null, + "text/x-d": { loader: import("highlight.js/lib/languages/d.js"), alias: "d" }, + "text/x-diff": { loader: import("highlight.js/lib/languages/diff.js"), alias: "diff" }, + "text/x-django": { loader: import("highlight.js/lib/languages/django.js"), alias: "django" }, + "text/x-dockerfile": { loader: import("highlight.js/lib/languages/dockerfile.js"), alias: "dockerfile" }, "text/x-dylan": null, - "text/x-ebnf": null, + "text/x-ebnf": { loader: import("highlight.js/lib/languages/ebnf.js"), alias: "ebnf" }, "text/x-ecl": null, "text/x-eiffel": null, - "text/x-elm": null, - "text/x-erlang": null, + "text/x-elm": { loader: import("highlight.js/lib/languages/elm.js"), alias: "elm" }, + "text/x-erlang": { loader: import("highlight.js/lib/languages/erlang.js"), alias: "erlang" }, "text/x-esper": null, "text/x-factor": null, "text/x-fcl": null, - "text/x-feature": null, + "text/x-feature": { loader: import("highlight.js/lib/languages/gherkin.js"), alias: "gherkin" }, "text/x-forth": null, - "text/x-fortran": null, - "text/x-fsharp": null, + "text/x-fortran": { loader: import("highlight.js/lib/languages/fortran.js"), alias: "fortran" }, + "text/x-fsharp": { loader: import("highlight.js/lib/languages/fsharp.js"), alias: "fsharp" }, "text/x-gas": null, "text/x-gdscript": null, - "text/x-gfm": null, - "text/x-go": null, - "text/x-groovy": null, + "text/x-gfm": { loader: import("highlight.js/lib/languages/markdown.js"), alias: "markdown" }, + "text/x-go": { loader: import("highlight.js/lib/languages/go.js"), alias: "go" }, + "text/x-groovy": { loader: import("highlight.js/lib/languages/groovy.js"), alias: "groovy" }, "text/x-gss": null, - "text/x-haml": null, - "text/x-haskell": null, - "text/x-haxe": null, - "text/x-hcl": null, + "text/x-haml": { loader: import("highlight.js/lib/languages/haml.js"), alias: "haml" }, + "text/x-haskell": { loader: import("highlight.js/lib/languages/haskell.js"), alias: "haskell" }, + "text/x-haxe": { loader: import("highlight.js/lib/languages/haxe.js"), alias: "haxe" }, + "text/x-hcl": { loader: import("highlight.js/lib/languages/terraform.js"), alias: "terraform" }, "text/x-hxml": null, "text/x-idl": null, - "text/x-java": null, - "text/x-julia": null, - "text/x-kotlin": null, - "text/x-latex": null, - "text/x-less": null, + "text/x-java": { loader: import("highlight.js/lib/languages/java.js"), alias: "java" }, + "text/x-julia": { loader: import("highlight.js/lib/languages/julia.js"), alias: "julia" }, + "text/x-kotlin": { loader: import("highlight.js/lib/languages/kotlin.js"), alias: "kotlin" }, + "text/x-latex": { loader: import("highlight.js/lib/languages/latex.js"), alias: "latex" }, + "text/x-less": { loader: import("highlight.js/lib/languages/less.js"), alias: "less" }, "text/x-literate-haskell": null, - "text/x-livescript": null, - "text/x-lua": null, - "text/x-mariadb": null, - "text/x-markdown": null, - "text/x-mathematica": null, + "text/x-livescript": { loader: import("highlight.js/lib/languages/livescript.js"), alias: "livescript" }, + "text/x-lua": { loader: import("highlight.js/lib/languages/lua.js"), alias: "lua" }, + "text/x-mariadb": { loader: import("highlight.js/lib/languages/sql.js"), alias: "sql" }, + "text/x-markdown": { loader: import("highlight.js/lib/languages/markdown.js"), alias: "markdown" }, + "text/x-mathematica": { loader: import("highlight.js/lib/languages/mathematica.js"), alias: "mathematica" }, "text/x-modelica": null, "text/x-mscgen": null, "text/x-msgenny": null, - "text/x-mssql": null, + "text/x-mssql": { loader: import("highlight.js/lib/languages/sql.js"), alias: "sql" }, "text/x-mumps": null, - "text/x-mysql": null, - "text/x-nix": null, - "text/x-nginx-conf": null, - "text/x-nsis": null, - "text/x-objectivec": null, - "text/x-ocaml": null, + "text/x-mysql": { loader: import("highlight.js/lib/languages/sql.js"), alias: "sql" }, + "text/x-nix": { loader: import("highlight.js/lib/languages/nix.js"), alias: "nix" }, + "text/x-nginx-conf": { loader: import("highlight.js/lib/languages/nginx.js"), alias: "nginx" }, + "text/x-nsis": { loader: import("highlight.js/lib/languages/nsis.js"), alias: "nsis" }, + "text/x-objectivec": { loader: import("highlight.js/lib/languages/objectivec.js"), alias: "objectivec" }, + "text/x-ocaml": { loader: import("highlight.js/lib/languages/ocaml.js"), alias: "ocaml" }, "text/x-octave": null, "text/x-oz": null, - "text/x-pascal": null, + "text/x-pascal": { loader: import("highlight.js/lib/languages/delphi.js"), alias: "delphi" }, "text/x-perl": null, - "text/x-pgsql": null, - "text/x-php": null, + "text/x-pgsql": { loader: import("highlight.js/lib/languages/sql.js"), alias: "sql" }, + "text/x-php": { loader: import("highlight.js/lib/languages/php.js"), alias: "php" }, "text/x-pig": null, - "text/x-plsql": null, - "text/x-properties": null, - "text/x-protobuf": null, + "text/x-plsql": { loader: import("highlight.js/lib/languages/sql.js"), alias: "sql" }, + "text/x-properties": { loader: import("highlight.js/lib/languages/properties.js"), alias: "properties" }, + "text/x-protobuf": { loader: import("highlight.js/lib/languages/protobuf.js"), alias: "protobuf" }, "text/x-pug": null, - "text/x-puppet": null, - "text/x-python": null, - "text/x-q": null, + "text/x-puppet": { loader: import("highlight.js/lib/languages/puppet.js"), alias: "puppet" }, + "text/x-python": { loader: import("highlight.js/lib/languages/python.js"), alias: "python" }, + "text/x-q": { loader: import("highlight.js/lib/languages/q.js"), alias: "q" }, "text/x-rpm-changes": null, "text/x-rpm-spec": null, - "text/x-rsrc": null, + "text/x-rsrc": { loader: import("highlight.js/lib/languages/r.js"), alias: "r" }, "text/x-rst": null, - "text/x-ruby": null, - "text/x-rustsrc": null, - "text/x-sas": null, - "text/x-sass": null, + "text/x-ruby": { loader: import("highlight.js/lib/languages/ruby.js"), alias: "ruby" }, + "text/x-rustsrc": { loader: import("highlight.js/lib/languages/rust.js"), alias: "rust" }, + "text/x-sas": { loader: import("highlight.js/lib/languages/sas.js"), alias: "sas" }, + "text/x-sass": { loader: import("highlight.js/lib/languages/scss.js"), alias: "scss" }, "text/x-scala": null, "text/x-scheme": null, - "text/x-scss": null, - "text/x-sh": null, + "text/x-scss": { loader: import("highlight.js/lib/languages/scss.js"), alias: "scss" }, + "text/x-sh": { loader: import("highlight.js/lib/languages/bash.js"), alias: "bash" }, "text/x-slim": null, "text/x-smarty": null, - "text/x-sml": null, + "text/x-sml": { loader: import("highlight.js/lib/languages/sml.js"), alias: "sml" }, "text/x-solr": null, "text/x-soy": null, "text/x-spreadsheet": null, - "text/x-sql": null, - "text/x-sqlite;schema=trilium": null, - "text/x-sqlite": null, + "text/x-sql": { loader: import("highlight.js/lib/languages/sql.js"), alias: "sql" }, + "text/x-sqlite;schema=trilium": { loader: import("highlight.js/lib/languages/sql.js"), alias: "sql" }, + "text/x-sqlite": { loader: import("highlight.js/lib/languages/sql.js"), alias: "sql" }, "text/x-squirrel": null, "text/x-stex": null, - "text/x-stsrc": null, - "text/x-styl": null, + "text/x-stsrc": { loader: import("highlight.js/lib/languages/smalltalk.js"), alias: "smalltalk" }, + "text/x-styl": { loader: import("highlight.js/lib/languages/stylus.js"), alias: "stylus" }, "text/x-swift": null, "text/x-systemverilog": null, - "text/x-tcl": null, + "text/x-tcl": { loader: import("highlight.js/lib/languages/tcl.js"), alias: "tcl" }, "text/x-textile": null, "text/x-tiddlywiki": null, - "text/x-toml": null, + "text/x-toml": { loader: import("highlight.js/lib/languages/ini.js"), alias: "ini" }, "text/x-tornado": null, "text/x-ttcn-asn": null, "text/x-ttcn-cfg": null, "text/x-ttcn": null, - "text/x-twig": null, - "text/x-vb": null, - "text/x-verilog": null, - "text/x-vhdl": null, + "text/x-twig": { loader: import("highlight.js/lib/languages/twig.js"), alias: "twig" }, + "text/x-vb": { loader: import("highlight.js/lib/languages/vbnet.js"), alias: "vbnet" }, + "text/x-verilog": { loader: import("highlight.js/lib/languages/verilog.js"), alias: "verilog" }, + "text/x-vhdl": { loader: import("highlight.js/lib/languages/vhdl.js"), alias: "vhdl" }, "text/x-vue": null, "text/x-webidl": null, "text/x-xu": null, "text/x-yacas": null, - "text/x-yaml": null, + "text/x-yaml": { loader: import("highlight.js/lib/languages/yaml.js"), alias: "yaml" }, "text/x-z80": null, - "text/xml": null, + "text/xml": { loader: import("highlight.js/lib/languages/xml.js"), alias: "xml" }, } export default byMimeType; From 22b64a0dc4110b8061b851eb90686b25f6d83994 Mon Sep 17 00:00:00 2001 From: SiriusXT <1160925501@qq.com> Date: Sun, 18 May 2025 16:24:13 +0800 Subject: [PATCH 11/66] fix(ui): Exclude launcher pane width from Split calculation; Record Split state for multiple windows --- apps/client/src/services/resizer.ts | 30 +++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/apps/client/src/services/resizer.ts b/apps/client/src/services/resizer.ts index 1cce0f993..4b80db7ba 100644 --- a/apps/client/src/services/resizer.ts +++ b/apps/client/src/services/resizer.ts @@ -3,7 +3,11 @@ import Split from "split.js" export const DEFAULT_GUTTER_SIZE = 5; +let leftPaneWidth: number; +let reservedPx: number; +let layoutOrientation: string; let leftInstance: ReturnType | null; +let rightPaneWidth: number; let rightInstance: ReturnType | null; function setupLeftPaneResizer(leftPaneVisible: boolean) { @@ -14,27 +18,34 @@ function setupLeftPaneResizer(leftPaneVisible: boolean) { $("#left-pane").toggle(leftPaneVisible); + layoutOrientation = layoutOrientation ?? options.get("layoutOrientation"); + reservedPx = reservedPx ?? (layoutOrientation === "vertical" ? ($("#launcher-pane").outerWidth() || 0) : 0); + // Window resizing causes `window.innerWidth` to change, so `reservedWidth` needs to be recalculated each time. + const reservedWidth = reservedPx / window.innerWidth * 100; if (!leftPaneVisible) { - $("#rest-pane").css("width", "100%"); - + $("#rest-pane").css("width", layoutOrientation === "vertical" ? `calc(100% - ${reservedWidth})` : "100%"); return; } - let leftPaneWidth = options.getInt("leftPaneWidth"); + leftPaneWidth = leftPaneWidth ?? (options.getInt("leftPaneWidth") ?? 0); if (!leftPaneWidth || leftPaneWidth < 5) { leftPaneWidth = 5; } + const restPaneWidth = 100 - leftPaneWidth - reservedWidth; if (leftPaneVisible) { // Delayed initialization ensures that all DOM elements are fully rendered and part of the layout, // preventing Split.js from retrieving incorrect dimensions due to #left-pane not being rendered yet, // which would cause the minSize setting to have no effect. requestAnimationFrame(() => { leftInstance = Split(["#left-pane", "#rest-pane"], { - sizes: [leftPaneWidth, 100 - leftPaneWidth], + sizes: [leftPaneWidth, restPaneWidth], gutterSize: DEFAULT_GUTTER_SIZE, minSize: [150, 300], - onDragEnd: (sizes) => options.save("leftPaneWidth", Math.round(sizes[0])) + onDragEnd: (sizes) => { + leftPaneWidth = Math.round(sizes[0]); + options.save("leftPaneWidth", Math.round(sizes[0])); + } }); }); } @@ -54,7 +65,7 @@ function setupRightPaneResizer() { return; } - let rightPaneWidth = options.getInt("rightPaneWidth"); + rightPaneWidth = rightPaneWidth ?? (options.getInt("rightPaneWidth") ?? 0); if (!rightPaneWidth || rightPaneWidth < 5) { rightPaneWidth = 5; } @@ -63,8 +74,11 @@ function setupRightPaneResizer() { rightInstance = Split(["#center-pane", "#right-pane"], { sizes: [100 - rightPaneWidth, rightPaneWidth], gutterSize: DEFAULT_GUTTER_SIZE, - minSize: [ 300, 180 ], - onDragEnd: (sizes) => options.save("rightPaneWidth", Math.round(sizes[1])) + minSize: [300, 180], + onDragEnd: (sizes) => { + rightPaneWidth = Math.round(sizes[1]); + options.save("rightPaneWidth", Math.round(sizes[1])); + } }); } } From 294727600b97f44fc39a7f88e9f7224dfabd1aef Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 May 2025 11:26:59 +0300 Subject: [PATCH 12/66] feat(highlightjs): add test --- packages/highlightjs/README.md | 4 +++ .../src/syntax_highlighting.spec.ts | 14 ++++++++ packages/highlightjs/tsconfig.json | 3 ++ packages/highlightjs/tsconfig.lib.json | 16 ++++++++- packages/highlightjs/tsconfig.spec.json | 36 +++++++++++++++++++ packages/highlightjs/vite.config.ts | 4 +-- 6 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 packages/highlightjs/src/syntax_highlighting.spec.ts create mode 100644 packages/highlightjs/tsconfig.spec.json diff --git a/packages/highlightjs/README.md b/packages/highlightjs/README.md index 706753a31..d3897f3f7 100644 --- a/packages/highlightjs/README.md +++ b/packages/highlightjs/README.md @@ -5,3 +5,7 @@ This library was generated with [Nx](https://nx.dev). ## Building Run `nx build highlightjs` to build the library. + +## Running unit tests + +Run `nx test highlightjs` to execute the unit tests via [Vitest](https://vitest.dev/). diff --git a/packages/highlightjs/src/syntax_highlighting.spec.ts b/packages/highlightjs/src/syntax_highlighting.spec.ts new file mode 100644 index 000000000..668bb796e --- /dev/null +++ b/packages/highlightjs/src/syntax_highlighting.spec.ts @@ -0,0 +1,14 @@ +import { describe, it } from "vitest"; +import definitions from "./syntax_highlighting.js"; + +describe("Syntax highlighting definitions", () => { + it("every entry is readable", async () => { + for (const [ mime, mapping ] of Object.entries(definitions)) { + if (mapping === null) { + continue; + } + + await mapping.loader; + } + }); +}); diff --git a/packages/highlightjs/tsconfig.json b/packages/highlightjs/tsconfig.json index c23e61c80..62ebbd946 100644 --- a/packages/highlightjs/tsconfig.json +++ b/packages/highlightjs/tsconfig.json @@ -5,6 +5,9 @@ "references": [ { "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" } ] } diff --git a/packages/highlightjs/tsconfig.lib.json b/packages/highlightjs/tsconfig.lib.json index 89ba670c3..f0a69a32c 100644 --- a/packages/highlightjs/tsconfig.lib.json +++ b/packages/highlightjs/tsconfig.lib.json @@ -17,5 +17,19 @@ "include": [ "src/**/*.ts" ], - "references": [] + "references": [], + "exclude": [ + "vite.config.ts", + "vite.config.mts", + "vitest.config.ts", + "vitest.config.mts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx" + ] } diff --git a/packages/highlightjs/tsconfig.spec.json b/packages/highlightjs/tsconfig.spec.json new file mode 100644 index 000000000..d5788402a --- /dev/null +++ b/packages/highlightjs/tsconfig.spec.json @@ -0,0 +1,36 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./out-tsc/vitest", + "types": [ + "vitest/globals", + "vitest/importMeta", + "vite/client", + "node", + "vitest" + ], + "forceConsistentCasingInFileNames": true, + "noImplicitOverride": true, + "noImplicitReturns": true + }, + "include": [ + "vite.config.ts", + "vite.config.mts", + "vitest.config.ts", + "vitest.config.mts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx", + "src/**/*.d.ts" + ], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/packages/highlightjs/vite.config.ts b/packages/highlightjs/vite.config.ts index 4ca8b8341..4bb602837 100644 --- a/packages/highlightjs/vite.config.ts +++ b/packages/highlightjs/vite.config.ts @@ -1,4 +1,4 @@ -/// + import { defineConfig } from 'vite'; import dts from 'vite-plugin-dts'; import * as path from 'path'; @@ -6,7 +6,7 @@ import * as path from 'path'; export default defineConfig(() => ({ root: __dirname, cacheDir: '../../node_modules/.vite/packages/highlightjs', - plugins: [dts({ entryRoot: 'src', tsconfigPath: path.join(__dirname, 'tsconfig.lib.json') })], + plugins: [dts({ entryRoot: 'src', tsconfigPath: path.join(__dirname, 'tsconfig.lib.json') }), ], // Uncomment this if you are using workers. // worker: { // plugins: [ nxViteTsPaths() ], From 6f96a0ef4c91f6be00ed139e4206e273cd05694b Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 May 2025 11:33:02 +0300 Subject: [PATCH 13/66] chore(highlightjs): integrate terraform --- .../src/libraries/highlightjs/terraform.js | 83 ------------------- .../highlightjs/src/languages/terraform.ts | 81 ++++++++++++++++++ .../highlightjs/src/syntax_highlighting.ts | 6 +- 3 files changed, 84 insertions(+), 86 deletions(-) delete mode 100644 apps/client/src/libraries/highlightjs/terraform.js create mode 100644 packages/highlightjs/src/languages/terraform.ts diff --git a/apps/client/src/libraries/highlightjs/terraform.js b/apps/client/src/libraries/highlightjs/terraform.js deleted file mode 100644 index 514e727cf..000000000 --- a/apps/client/src/libraries/highlightjs/terraform.js +++ /dev/null @@ -1,83 +0,0 @@ -/* - * highlight.js terraform syntax highlighting definition - * - * @see https://github.com/highlightjs/highlight.js - * - * :TODO: - * - * @package: highlightjs-terraform - * @author: Nikos Tsirmirakis - * @since: 2019-03-20 - * - * Description: Terraform (HCL) language definition - * Category: scripting - */ - -var module = module ? module : {}; // shim for browser use - -function hljsDefineTerraform(hljs) { - var NUMBERS = { - className: 'number', - begin: '\\b\\d+(\\.\\d+)?', - relevance: 0 - }; - var STRINGS = { - className: 'string', - begin: '"', - end: '"', - contains: [{ - className: 'variable', - begin: '\\${', - end: '\\}', - relevance: 9, - contains: [{ - className: 'string', - begin: '"', - end: '"' - }, { - className: 'meta', - begin: '[A-Za-z_0-9]*' + '\\(', - end: '\\)', - contains: [ - NUMBERS, { - className: 'string', - begin: '"', - end: '"', - contains: [{ - className: 'variable', - begin: '\\${', - end: '\\}', - contains: [{ - className: 'string', - begin: '"', - end: '"', - contains: [{ - className: 'variable', - begin: '\\${', - end: '\\}' - }] - }, { - className: 'meta', - begin: '[A-Za-z_0-9]*' + '\\(', - end: '\\)' - }] - }] - }, - 'self'] - }] - }] - }; - -return { - aliases: ['tf', 'hcl'], - keywords: 'resource variable provider output locals module data terraform|10', - literal: 'false true null', - contains: [ - hljs.COMMENT('\\#', '$'), - NUMBERS, - STRINGS - ] -} -} - -hljs.registerLanguage('terraform', hljsDefineTerraform); \ No newline at end of file diff --git a/packages/highlightjs/src/languages/terraform.ts b/packages/highlightjs/src/languages/terraform.ts new file mode 100644 index 000000000..d9f8d6840 --- /dev/null +++ b/packages/highlightjs/src/languages/terraform.ts @@ -0,0 +1,81 @@ +/* + * highlight.js terraform syntax highlighting definition + * + * @see https://github.com/highlightjs/highlight.js + * + * :TODO: + * + * @package: highlightjs-terraform + * @author: Nikos Tsirmirakis + * @since: 2019-03-20 + * + * Description: Terraform (HCL) language definition + * Category: scripting + */ + +import type { HLJSApi } from "highlight.js"; + +export default function hljsDefineTerraform(hljs: HLJSApi) { + var NUMBERS = { + className: 'number', + begin: '\\b\\d+(\\.\\d+)?', + relevance: 0 + }; + var STRINGS = { + className: 'string', + begin: '"', + end: '"', + contains: [{ + className: 'variable', + begin: '\\${', + end: '\\}', + relevance: 9, + contains: [{ + className: 'string', + begin: '"', + end: '"' + }, { + className: 'meta', + begin: '[A-Za-z_0-9]*' + '\\(', + end: '\\)', + contains: [ + NUMBERS, { + className: 'string', + begin: '"', + end: '"', + contains: [{ + className: 'variable', + begin: '\\${', + end: '\\}', + contains: [{ + className: 'string', + begin: '"', + end: '"', + contains: [{ + className: 'variable', + begin: '\\${', + end: '\\}' + }] + }, { + className: 'meta', + begin: '[A-Za-z_0-9]*' + '\\(', + end: '\\)' + }] + }] + }, + 'self'] + }] + }] + }; + + return { + aliases: ['tf', 'hcl'], + keywords: 'resource variable provider output locals module data terraform|10', + literal: 'false true null', + contains: [ + hljs.COMMENT('\\#', '$'), + NUMBERS, + STRINGS + ] + } +} diff --git a/packages/highlightjs/src/syntax_highlighting.ts b/packages/highlightjs/src/syntax_highlighting.ts index 20f542535..99e1866fb 100644 --- a/packages/highlightjs/src/syntax_highlighting.ts +++ b/packages/highlightjs/src/syntax_highlighting.ts @@ -20,7 +20,7 @@ const byMimeType: Record = { "application/sparql-query": null, "application/typescript": { loader: import("highlight.js/lib/languages/typescript.js"), alias: "typescript" }, "application/x-aspx": null, - "application/x-bat": { loader: import("highlight.js/lib/languages/bat.js"), alias: "bat" }, + "application/x-bat": { loader: import("highlight.js/lib/languages/dos.js"), alias: "bat" }, "application/x-cypher-query": null, "application/x-ejs": null, "application/x-erb": { loader: import("highlight.js/lib/languages/erb.js"), alias: "erb" }, @@ -32,7 +32,7 @@ const byMimeType: Record = { "text/apl": null, "text/coffeescript": { loader: import("highlight.js/lib/languages/coffeescript.js"), alias: "coffeescript" }, "text/css": { loader: import("highlight.js/lib/languages/css.js"), alias: "css" }, - "text/html": { loader: import("highlight.js/lib/languages/html.js"), alias: "html" }, + "text/html": { loader: import("highlight.js/lib/languages/xml.js"), alias: "html" }, "text/jinja2": null, "text/jsx": { loader: import("highlight.js/lib/languages/javascript.js"), alias: "javascript" }, "text/mirc": null, @@ -84,7 +84,7 @@ const byMimeType: Record = { "text/x-haml": { loader: import("highlight.js/lib/languages/haml.js"), alias: "haml" }, "text/x-haskell": { loader: import("highlight.js/lib/languages/haskell.js"), alias: "haskell" }, "text/x-haxe": { loader: import("highlight.js/lib/languages/haxe.js"), alias: "haxe" }, - "text/x-hcl": { loader: import("highlight.js/lib/languages/terraform.js"), alias: "terraform" }, + "text/x-hcl": { loader: import("./languages/terraform.js"), alias: "terraform" }, "text/x-hxml": null, "text/x-idl": null, "text/x-java": { loader: import("highlight.js/lib/languages/java.js"), alias: "java" }, From b6557d2a42b33ac5bde3176de48cbef483277dfd Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 May 2025 11:33:53 +0300 Subject: [PATCH 14/66] chore(highlightjs): fix deprecation warning --- .../highlightjs/src/syntax_highlighting.ts | 182 +++++++++--------- 1 file changed, 91 insertions(+), 91 deletions(-) diff --git a/packages/highlightjs/src/syntax_highlighting.ts b/packages/highlightjs/src/syntax_highlighting.ts index 99e1866fb..5a41e8484 100644 --- a/packages/highlightjs/src/syntax_highlighting.ts +++ b/packages/highlightjs/src/syntax_highlighting.ts @@ -6,169 +6,169 @@ interface Mapping { } const byMimeType: Record = { - "text/plain": { loader: import("highlight.js/lib/languages/plaintext.js"), alias: "plaintext" }, - "application/dart": { loader: import("highlight.js/lib/languages/dart.js"), alias: "dart" }, + "text/plain": { loader: import("highlight.js/lib/languages/plaintext"), alias: "plaintext" }, + "application/dart": { loader: import("highlight.js/lib/languages/dart"), alias: "dart" }, "application/edn": null, - "application/javascript;env=backend": { loader: import("highlight.js/lib/languages/javascript.js"), alias: "javascript" }, - "application/javascript;env=frontend": { loader: import("highlight.js/lib/languages/javascript.js"), alias: "javascript" }, - "application/json": { loader: import("highlight.js/lib/languages/json.js"), alias: "json" }, - "application/ld+json": { loader: import("highlight.js/lib/languages/json.js"), alias: "json" }, + "application/javascript;env=backend": { loader: import("highlight.js/lib/languages/javascript"), alias: "javascript" }, + "application/javascript;env=frontend": { loader: import("highlight.js/lib/languages/javascript"), alias: "javascript" }, + "application/json": { loader: import("highlight.js/lib/languages/json"), alias: "json" }, + "application/ld+json": { loader: import("highlight.js/lib/languages/json"), alias: "json" }, "application/mbox": null, "application/n-triples": null, "application/pgp": null, "application/sieve": null, "application/sparql-query": null, - "application/typescript": { loader: import("highlight.js/lib/languages/typescript.js"), alias: "typescript" }, + "application/typescript": { loader: import("highlight.js/lib/languages/typescript"), alias: "typescript" }, "application/x-aspx": null, - "application/x-bat": { loader: import("highlight.js/lib/languages/dos.js"), alias: "bat" }, + "application/x-bat": { loader: import("highlight.js/lib/languages/dos"), alias: "bat" }, "application/x-cypher-query": null, "application/x-ejs": null, - "application/x-erb": { loader: import("highlight.js/lib/languages/erb.js"), alias: "erb" }, - "application/x-jsp": { loader: import("highlight.js/lib/languages/java.js"), alias: "java" }, - "application/x-powershell": { loader: import("highlight.js/lib/languages/powershell.js"), alias: "powershell" }, + "application/x-erb": { loader: import("highlight.js/lib/languages/erb"), alias: "erb" }, + "application/x-jsp": { loader: import("highlight.js/lib/languages/java"), alias: "java" }, + "application/x-powershell": { loader: import("highlight.js/lib/languages/powershell"), alias: "powershell" }, "application/xml-dtd": null, - "application/xquery": { loader: import("highlight.js/lib/languages/xquery.js"), alias: "xquery" }, - "message/http": { loader: import("highlight.js/lib/languages/http.js"), alias: "http" }, + "application/xquery": { loader: import("highlight.js/lib/languages/xquery"), alias: "xquery" }, + "message/http": { loader: import("highlight.js/lib/languages/http"), alias: "http" }, "text/apl": null, - "text/coffeescript": { loader: import("highlight.js/lib/languages/coffeescript.js"), alias: "coffeescript" }, - "text/css": { loader: import("highlight.js/lib/languages/css.js"), alias: "css" }, - "text/html": { loader: import("highlight.js/lib/languages/xml.js"), alias: "html" }, + "text/coffeescript": { loader: import("highlight.js/lib/languages/coffeescript"), alias: "coffeescript" }, + "text/css": { loader: import("highlight.js/lib/languages/css"), alias: "css" }, + "text/html": { loader: import("highlight.js/lib/languages/xml"), alias: "html" }, "text/jinja2": null, - "text/jsx": { loader: import("highlight.js/lib/languages/javascript.js"), alias: "javascript" }, + "text/jsx": { loader: import("highlight.js/lib/languages/javascript"), alias: "javascript" }, "text/mirc": null, "text/tiki": null, "text/troff": null, "text/turtle": null, - "text/typescript-jsx": { loader: import("highlight.js/lib/languages/typescript.js"), alias: "typescript" }, - "text/vbscript": { loader: import("highlight.js/lib/languages/vbscript.js"), alias: "vbscript" }, + "text/typescript-jsx": { loader: import("highlight.js/lib/languages/typescript"), alias: "typescript" }, + "text/vbscript": { loader: import("highlight.js/lib/languages/vbscript"), alias: "vbscript" }, "text/velocity": null, "text/vnd.mermaid": null, "text/mermaid": null, - "text/x-asm-mips": { loader: import("highlight.js/lib/languages/mipsasm.js"), alias: "mipsasm" }, + "text/x-asm-mips": { loader: import("highlight.js/lib/languages/mipsasm"), alias: "mipsasm" }, "text/x-asterisk": null, - "text/x-brainfuck": { loader: import("highlight.js/lib/languages/brainfuck.js"), alias: "brainfuck" }, - "text/x-c++src": { loader: import("highlight.js/lib/languages/cpp.js"), alias: "cpp" }, + "text/x-brainfuck": { loader: import("highlight.js/lib/languages/brainfuck"), alias: "brainfuck" }, + "text/x-c++src": { loader: import("highlight.js/lib/languages/cpp"), alias: "cpp" }, "text/x-cassandra": null, - "text/x-clojure": { loader: import("highlight.js/lib/languages/clojure.js"), alias: "clojure" }, + "text/x-clojure": { loader: import("highlight.js/lib/languages/clojure"), alias: "clojure" }, "text/x-clojurescript": null, - "text/x-cmake": { loader: import("highlight.js/lib/languages/cmake.js"), alias: "cmake" }, + "text/x-cmake": { loader: import("highlight.js/lib/languages/cmake"), alias: "cmake" }, "text/x-cobol": null, - "text/x-common-lisp": { loader: import("highlight.js/lib/languages/lisp.js"), alias: "lisp" }, - "text/x-crystal": { loader: import("highlight.js/lib/languages/crystal.js"), alias: "crystal" }, - "text/x-csharp": { loader: import("highlight.js/lib/languages/csharp.js"), alias: "csharp" }, - "text/x-csrc": { loader: import("highlight.js/lib/languages/c.js"), alias: "c" }, + "text/x-common-lisp": { loader: import("highlight.js/lib/languages/lisp"), alias: "lisp" }, + "text/x-crystal": { loader: import("highlight.js/lib/languages/crystal"), alias: "crystal" }, + "text/x-csharp": { loader: import("highlight.js/lib/languages/csharp"), alias: "csharp" }, + "text/x-csrc": { loader: import("highlight.js/lib/languages/c"), alias: "c" }, "text/x-cython": null, - "text/x-d": { loader: import("highlight.js/lib/languages/d.js"), alias: "d" }, - "text/x-diff": { loader: import("highlight.js/lib/languages/diff.js"), alias: "diff" }, - "text/x-django": { loader: import("highlight.js/lib/languages/django.js"), alias: "django" }, - "text/x-dockerfile": { loader: import("highlight.js/lib/languages/dockerfile.js"), alias: "dockerfile" }, + "text/x-d": { loader: import("highlight.js/lib/languages/d"), alias: "d" }, + "text/x-diff": { loader: import("highlight.js/lib/languages/diff"), alias: "diff" }, + "text/x-django": { loader: import("highlight.js/lib/languages/django"), alias: "django" }, + "text/x-dockerfile": { loader: import("highlight.js/lib/languages/dockerfile"), alias: "dockerfile" }, "text/x-dylan": null, - "text/x-ebnf": { loader: import("highlight.js/lib/languages/ebnf.js"), alias: "ebnf" }, + "text/x-ebnf": { loader: import("highlight.js/lib/languages/ebnf"), alias: "ebnf" }, "text/x-ecl": null, "text/x-eiffel": null, - "text/x-elm": { loader: import("highlight.js/lib/languages/elm.js"), alias: "elm" }, - "text/x-erlang": { loader: import("highlight.js/lib/languages/erlang.js"), alias: "erlang" }, + "text/x-elm": { loader: import("highlight.js/lib/languages/elm"), alias: "elm" }, + "text/x-erlang": { loader: import("highlight.js/lib/languages/erlang"), alias: "erlang" }, "text/x-esper": null, "text/x-factor": null, "text/x-fcl": null, - "text/x-feature": { loader: import("highlight.js/lib/languages/gherkin.js"), alias: "gherkin" }, + "text/x-feature": { loader: import("highlight.js/lib/languages/gherkin"), alias: "gherkin" }, "text/x-forth": null, - "text/x-fortran": { loader: import("highlight.js/lib/languages/fortran.js"), alias: "fortran" }, - "text/x-fsharp": { loader: import("highlight.js/lib/languages/fsharp.js"), alias: "fsharp" }, + "text/x-fortran": { loader: import("highlight.js/lib/languages/fortran"), alias: "fortran" }, + "text/x-fsharp": { loader: import("highlight.js/lib/languages/fsharp"), alias: "fsharp" }, "text/x-gas": null, "text/x-gdscript": null, - "text/x-gfm": { loader: import("highlight.js/lib/languages/markdown.js"), alias: "markdown" }, - "text/x-go": { loader: import("highlight.js/lib/languages/go.js"), alias: "go" }, - "text/x-groovy": { loader: import("highlight.js/lib/languages/groovy.js"), alias: "groovy" }, + "text/x-gfm": { loader: import("highlight.js/lib/languages/markdown"), alias: "markdown" }, + "text/x-go": { loader: import("highlight.js/lib/languages/go"), alias: "go" }, + "text/x-groovy": { loader: import("highlight.js/lib/languages/groovy"), alias: "groovy" }, "text/x-gss": null, - "text/x-haml": { loader: import("highlight.js/lib/languages/haml.js"), alias: "haml" }, - "text/x-haskell": { loader: import("highlight.js/lib/languages/haskell.js"), alias: "haskell" }, - "text/x-haxe": { loader: import("highlight.js/lib/languages/haxe.js"), alias: "haxe" }, + "text/x-haml": { loader: import("highlight.js/lib/languages/haml"), alias: "haml" }, + "text/x-haskell": { loader: import("highlight.js/lib/languages/haskell"), alias: "haskell" }, + "text/x-haxe": { loader: import("highlight.js/lib/languages/haxe"), alias: "haxe" }, "text/x-hcl": { loader: import("./languages/terraform.js"), alias: "terraform" }, "text/x-hxml": null, "text/x-idl": null, - "text/x-java": { loader: import("highlight.js/lib/languages/java.js"), alias: "java" }, - "text/x-julia": { loader: import("highlight.js/lib/languages/julia.js"), alias: "julia" }, - "text/x-kotlin": { loader: import("highlight.js/lib/languages/kotlin.js"), alias: "kotlin" }, - "text/x-latex": { loader: import("highlight.js/lib/languages/latex.js"), alias: "latex" }, - "text/x-less": { loader: import("highlight.js/lib/languages/less.js"), alias: "less" }, + "text/x-java": { loader: import("highlight.js/lib/languages/java"), alias: "java" }, + "text/x-julia": { loader: import("highlight.js/lib/languages/julia"), alias: "julia" }, + "text/x-kotlin": { loader: import("highlight.js/lib/languages/kotlin"), alias: "kotlin" }, + "text/x-latex": { loader: import("highlight.js/lib/languages/latex"), alias: "latex" }, + "text/x-less": { loader: import("highlight.js/lib/languages/less"), alias: "less" }, "text/x-literate-haskell": null, - "text/x-livescript": { loader: import("highlight.js/lib/languages/livescript.js"), alias: "livescript" }, - "text/x-lua": { loader: import("highlight.js/lib/languages/lua.js"), alias: "lua" }, - "text/x-mariadb": { loader: import("highlight.js/lib/languages/sql.js"), alias: "sql" }, - "text/x-markdown": { loader: import("highlight.js/lib/languages/markdown.js"), alias: "markdown" }, - "text/x-mathematica": { loader: import("highlight.js/lib/languages/mathematica.js"), alias: "mathematica" }, + "text/x-livescript": { loader: import("highlight.js/lib/languages/livescript"), alias: "livescript" }, + "text/x-lua": { loader: import("highlight.js/lib/languages/lua"), alias: "lua" }, + "text/x-mariadb": { loader: import("highlight.js/lib/languages/sql"), alias: "sql" }, + "text/x-markdown": { loader: import("highlight.js/lib/languages/markdown"), alias: "markdown" }, + "text/x-mathematica": { loader: import("highlight.js/lib/languages/mathematica"), alias: "mathematica" }, "text/x-modelica": null, "text/x-mscgen": null, "text/x-msgenny": null, - "text/x-mssql": { loader: import("highlight.js/lib/languages/sql.js"), alias: "sql" }, + "text/x-mssql": { loader: import("highlight.js/lib/languages/sql"), alias: "sql" }, "text/x-mumps": null, - "text/x-mysql": { loader: import("highlight.js/lib/languages/sql.js"), alias: "sql" }, - "text/x-nix": { loader: import("highlight.js/lib/languages/nix.js"), alias: "nix" }, - "text/x-nginx-conf": { loader: import("highlight.js/lib/languages/nginx.js"), alias: "nginx" }, - "text/x-nsis": { loader: import("highlight.js/lib/languages/nsis.js"), alias: "nsis" }, - "text/x-objectivec": { loader: import("highlight.js/lib/languages/objectivec.js"), alias: "objectivec" }, - "text/x-ocaml": { loader: import("highlight.js/lib/languages/ocaml.js"), alias: "ocaml" }, + "text/x-mysql": { loader: import("highlight.js/lib/languages/sql"), alias: "sql" }, + "text/x-nix": { loader: import("highlight.js/lib/languages/nix"), alias: "nix" }, + "text/x-nginx-conf": { loader: import("highlight.js/lib/languages/nginx"), alias: "nginx" }, + "text/x-nsis": { loader: import("highlight.js/lib/languages/nsis"), alias: "nsis" }, + "text/x-objectivec": { loader: import("highlight.js/lib/languages/objectivec"), alias: "objectivec" }, + "text/x-ocaml": { loader: import("highlight.js/lib/languages/ocaml"), alias: "ocaml" }, "text/x-octave": null, "text/x-oz": null, - "text/x-pascal": { loader: import("highlight.js/lib/languages/delphi.js"), alias: "delphi" }, + "text/x-pascal": { loader: import("highlight.js/lib/languages/delphi"), alias: "delphi" }, "text/x-perl": null, - "text/x-pgsql": { loader: import("highlight.js/lib/languages/sql.js"), alias: "sql" }, - "text/x-php": { loader: import("highlight.js/lib/languages/php.js"), alias: "php" }, + "text/x-pgsql": { loader: import("highlight.js/lib/languages/sql"), alias: "sql" }, + "text/x-php": { loader: import("highlight.js/lib/languages/php"), alias: "php" }, "text/x-pig": null, - "text/x-plsql": { loader: import("highlight.js/lib/languages/sql.js"), alias: "sql" }, - "text/x-properties": { loader: import("highlight.js/lib/languages/properties.js"), alias: "properties" }, - "text/x-protobuf": { loader: import("highlight.js/lib/languages/protobuf.js"), alias: "protobuf" }, + "text/x-plsql": { loader: import("highlight.js/lib/languages/sql"), alias: "sql" }, + "text/x-properties": { loader: import("highlight.js/lib/languages/properties"), alias: "properties" }, + "text/x-protobuf": { loader: import("highlight.js/lib/languages/protobuf"), alias: "protobuf" }, "text/x-pug": null, - "text/x-puppet": { loader: import("highlight.js/lib/languages/puppet.js"), alias: "puppet" }, - "text/x-python": { loader: import("highlight.js/lib/languages/python.js"), alias: "python" }, - "text/x-q": { loader: import("highlight.js/lib/languages/q.js"), alias: "q" }, + "text/x-puppet": { loader: import("highlight.js/lib/languages/puppet"), alias: "puppet" }, + "text/x-python": { loader: import("highlight.js/lib/languages/python"), alias: "python" }, + "text/x-q": { loader: import("highlight.js/lib/languages/q"), alias: "q" }, "text/x-rpm-changes": null, "text/x-rpm-spec": null, - "text/x-rsrc": { loader: import("highlight.js/lib/languages/r.js"), alias: "r" }, + "text/x-rsrc": { loader: import("highlight.js/lib/languages/r"), alias: "r" }, "text/x-rst": null, - "text/x-ruby": { loader: import("highlight.js/lib/languages/ruby.js"), alias: "ruby" }, - "text/x-rustsrc": { loader: import("highlight.js/lib/languages/rust.js"), alias: "rust" }, - "text/x-sas": { loader: import("highlight.js/lib/languages/sas.js"), alias: "sas" }, - "text/x-sass": { loader: import("highlight.js/lib/languages/scss.js"), alias: "scss" }, + "text/x-ruby": { loader: import("highlight.js/lib/languages/ruby"), alias: "ruby" }, + "text/x-rustsrc": { loader: import("highlight.js/lib/languages/rust"), alias: "rust" }, + "text/x-sas": { loader: import("highlight.js/lib/languages/sas"), alias: "sas" }, + "text/x-sass": { loader: import("highlight.js/lib/languages/scss"), alias: "scss" }, "text/x-scala": null, "text/x-scheme": null, - "text/x-scss": { loader: import("highlight.js/lib/languages/scss.js"), alias: "scss" }, - "text/x-sh": { loader: import("highlight.js/lib/languages/bash.js"), alias: "bash" }, + "text/x-scss": { loader: import("highlight.js/lib/languages/scss"), alias: "scss" }, + "text/x-sh": { loader: import("highlight.js/lib/languages/bash"), alias: "bash" }, "text/x-slim": null, "text/x-smarty": null, - "text/x-sml": { loader: import("highlight.js/lib/languages/sml.js"), alias: "sml" }, + "text/x-sml": { loader: import("highlight.js/lib/languages/sml"), alias: "sml" }, "text/x-solr": null, "text/x-soy": null, "text/x-spreadsheet": null, - "text/x-sql": { loader: import("highlight.js/lib/languages/sql.js"), alias: "sql" }, - "text/x-sqlite;schema=trilium": { loader: import("highlight.js/lib/languages/sql.js"), alias: "sql" }, - "text/x-sqlite": { loader: import("highlight.js/lib/languages/sql.js"), alias: "sql" }, + "text/x-sql": { loader: import("highlight.js/lib/languages/sql"), alias: "sql" }, + "text/x-sqlite;schema=trilium": { loader: import("highlight.js/lib/languages/sql"), alias: "sql" }, + "text/x-sqlite": { loader: import("highlight.js/lib/languages/sql"), alias: "sql" }, "text/x-squirrel": null, "text/x-stex": null, - "text/x-stsrc": { loader: import("highlight.js/lib/languages/smalltalk.js"), alias: "smalltalk" }, - "text/x-styl": { loader: import("highlight.js/lib/languages/stylus.js"), alias: "stylus" }, + "text/x-stsrc": { loader: import("highlight.js/lib/languages/smalltalk"), alias: "smalltalk" }, + "text/x-styl": { loader: import("highlight.js/lib/languages/stylus"), alias: "stylus" }, "text/x-swift": null, "text/x-systemverilog": null, - "text/x-tcl": { loader: import("highlight.js/lib/languages/tcl.js"), alias: "tcl" }, + "text/x-tcl": { loader: import("highlight.js/lib/languages/tcl"), alias: "tcl" }, "text/x-textile": null, "text/x-tiddlywiki": null, - "text/x-toml": { loader: import("highlight.js/lib/languages/ini.js"), alias: "ini" }, + "text/x-toml": { loader: import("highlight.js/lib/languages/ini"), alias: "ini" }, "text/x-tornado": null, "text/x-ttcn-asn": null, "text/x-ttcn-cfg": null, "text/x-ttcn": null, - "text/x-twig": { loader: import("highlight.js/lib/languages/twig.js"), alias: "twig" }, - "text/x-vb": { loader: import("highlight.js/lib/languages/vbnet.js"), alias: "vbnet" }, - "text/x-verilog": { loader: import("highlight.js/lib/languages/verilog.js"), alias: "verilog" }, - "text/x-vhdl": { loader: import("highlight.js/lib/languages/vhdl.js"), alias: "vhdl" }, + "text/x-twig": { loader: import("highlight.js/lib/languages/twig"), alias: "twig" }, + "text/x-vb": { loader: import("highlight.js/lib/languages/vbnet"), alias: "vbnet" }, + "text/x-verilog": { loader: import("highlight.js/lib/languages/verilog"), alias: "verilog" }, + "text/x-vhdl": { loader: import("highlight.js/lib/languages/vhdl"), alias: "vhdl" }, "text/x-vue": null, "text/x-webidl": null, "text/x-xu": null, "text/x-yacas": null, - "text/x-yaml": { loader: import("highlight.js/lib/languages/yaml.js"), alias: "yaml" }, + "text/x-yaml": { loader: import("highlight.js/lib/languages/yaml"), alias: "yaml" }, "text/x-z80": null, - "text/xml": { loader: import("highlight.js/lib/languages/xml.js"), alias: "xml" }, + "text/xml": { loader: import("highlight.js/lib/languages/xml"), alias: "xml" }, } export default byMimeType; From 0e9c381df4f2e446a791b7312a6756eb785547f5 Mon Sep 17 00:00:00 2001 From: SiriusXT <1160925501@qq.com> Date: Sun, 18 May 2025 18:19:54 +0800 Subject: [PATCH 15/66] fix(launcher-pane): Prevent the launcher pane from being compressed --- apps/client/src/stylesheets/theme-next/shell.css | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index 2bcdf942f..a77715136 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -127,6 +127,7 @@ body.layout-horizontal > .horizontal { --launcher-pane-button-gap: var(--launcher-pane-vert-button-gap); width: var(--launcher-pane-size) !important; + min-width: var(--launcher-pane-size) !important; padding-bottom: var(--launcher-pane-button-gap); } From 9682253ceda280bc9cd00f4314443ffcaf2141f9 Mon Sep 17 00:00:00 2001 From: SiriusXT <1160925501@qq.com> Date: Sun, 18 May 2025 18:38:52 +0800 Subject: [PATCH 16/66] fix: Incorrectly calculating rest-pane width in https://github.com/TriliumNext/Notes/pull/1962 --- apps/client/src/services/resizer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/services/resizer.ts b/apps/client/src/services/resizer.ts index 4b80db7ba..be148f3ec 100644 --- a/apps/client/src/services/resizer.ts +++ b/apps/client/src/services/resizer.ts @@ -23,7 +23,7 @@ function setupLeftPaneResizer(leftPaneVisible: boolean) { // Window resizing causes `window.innerWidth` to change, so `reservedWidth` needs to be recalculated each time. const reservedWidth = reservedPx / window.innerWidth * 100; if (!leftPaneVisible) { - $("#rest-pane").css("width", layoutOrientation === "vertical" ? `calc(100% - ${reservedWidth})` : "100%"); + $("#rest-pane").css("width", layoutOrientation === "vertical" ? `${(100 - reservedWidth) * 100}%` : "100%"); return; } From fd52b9ec4be426b195b1165ab2cebc4464222c46 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 May 2025 14:23:10 +0300 Subject: [PATCH 17/66] test(highlightjs): ensure language registration works --- packages/highlightjs/src/syntax_highlighting.spec.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/highlightjs/src/syntax_highlighting.spec.ts b/packages/highlightjs/src/syntax_highlighting.spec.ts index 668bb796e..6bffe079c 100644 --- a/packages/highlightjs/src/syntax_highlighting.spec.ts +++ b/packages/highlightjs/src/syntax_highlighting.spec.ts @@ -1,5 +1,6 @@ import { describe, it } from "vitest"; import definitions from "./syntax_highlighting.js"; +import hljs from "highlight.js"; describe("Syntax highlighting definitions", () => { it("every entry is readable", async () => { @@ -8,7 +9,12 @@ describe("Syntax highlighting definitions", () => { continue; } - await mapping.loader; + const language = (await mapping.loader).default; + + hljs.registerLanguage(mime, language); + hljs.highlight("Hello world", { + language: mime + }); } }); }); From 2c4b28c6cbed1a290a4ab1a44ab4fe825e8a6e0c Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 May 2025 14:24:54 +0300 Subject: [PATCH 18/66] refactor(highlightjs): remove alias --- .../src/syntax_highlighting.spec.ts | 6 +- .../highlightjs/src/syntax_highlighting.ts | 191 +++++++++--------- 2 files changed, 96 insertions(+), 101 deletions(-) diff --git a/packages/highlightjs/src/syntax_highlighting.spec.ts b/packages/highlightjs/src/syntax_highlighting.spec.ts index 6bffe079c..7c4acedac 100644 --- a/packages/highlightjs/src/syntax_highlighting.spec.ts +++ b/packages/highlightjs/src/syntax_highlighting.spec.ts @@ -4,12 +4,12 @@ import hljs from "highlight.js"; describe("Syntax highlighting definitions", () => { it("every entry is readable", async () => { - for (const [ mime, mapping ] of Object.entries(definitions)) { - if (mapping === null) { + for (const [ mime, loader ] of Object.entries(definitions)) { + if (loader === null) { continue; } - const language = (await mapping.loader).default; + const language = (await loader).default; hljs.registerLanguage(mime, language); hljs.highlight("Hello world", { diff --git a/packages/highlightjs/src/syntax_highlighting.ts b/packages/highlightjs/src/syntax_highlighting.ts index 5a41e8484..0ccc543ff 100644 --- a/packages/highlightjs/src/syntax_highlighting.ts +++ b/packages/highlightjs/src/syntax_highlighting.ts @@ -1,174 +1,169 @@ import type { LanguageFn } from "highlight.js"; -interface Mapping { - loader: Promise<{ default: LanguageFn}>; - alias: string; -} - -const byMimeType: Record = { - "text/plain": { loader: import("highlight.js/lib/languages/plaintext"), alias: "plaintext" }, - "application/dart": { loader: import("highlight.js/lib/languages/dart"), alias: "dart" }, +const byMimeType: Record | null)> = { + "text/plain": import("highlight.js/lib/languages/plaintext"), + "application/dart": import("highlight.js/lib/languages/dart"), "application/edn": null, - "application/javascript;env=backend": { loader: import("highlight.js/lib/languages/javascript"), alias: "javascript" }, - "application/javascript;env=frontend": { loader: import("highlight.js/lib/languages/javascript"), alias: "javascript" }, - "application/json": { loader: import("highlight.js/lib/languages/json"), alias: "json" }, - "application/ld+json": { loader: import("highlight.js/lib/languages/json"), alias: "json" }, + "application/javascript;env=backend": import("highlight.js/lib/languages/javascript"), + "application/javascript;env=frontend": import("highlight.js/lib/languages/javascript"), + "application/json": import("highlight.js/lib/languages/json"), + "application/ld+json": import("highlight.js/lib/languages/json"), "application/mbox": null, "application/n-triples": null, "application/pgp": null, "application/sieve": null, "application/sparql-query": null, - "application/typescript": { loader: import("highlight.js/lib/languages/typescript"), alias: "typescript" }, + "application/typescript": import("highlight.js/lib/languages/typescript"), "application/x-aspx": null, - "application/x-bat": { loader: import("highlight.js/lib/languages/dos"), alias: "bat" }, + "application/x-bat": import("highlight.js/lib/languages/dos"), "application/x-cypher-query": null, "application/x-ejs": null, - "application/x-erb": { loader: import("highlight.js/lib/languages/erb"), alias: "erb" }, - "application/x-jsp": { loader: import("highlight.js/lib/languages/java"), alias: "java" }, - "application/x-powershell": { loader: import("highlight.js/lib/languages/powershell"), alias: "powershell" }, + "application/x-erb": import("highlight.js/lib/languages/erb"), + "application/x-jsp": import("highlight.js/lib/languages/java"), + "application/x-powershell": import("highlight.js/lib/languages/powershell"), "application/xml-dtd": null, - "application/xquery": { loader: import("highlight.js/lib/languages/xquery"), alias: "xquery" }, - "message/http": { loader: import("highlight.js/lib/languages/http"), alias: "http" }, + "application/xquery": import("highlight.js/lib/languages/xquery"), + "message/http": import("highlight.js/lib/languages/http"), "text/apl": null, - "text/coffeescript": { loader: import("highlight.js/lib/languages/coffeescript"), alias: "coffeescript" }, - "text/css": { loader: import("highlight.js/lib/languages/css"), alias: "css" }, - "text/html": { loader: import("highlight.js/lib/languages/xml"), alias: "html" }, + "text/coffeescript": import("highlight.js/lib/languages/coffeescript"), + "text/css": import("highlight.js/lib/languages/css"), + "text/html": import("highlight.js/lib/languages/xml"), "text/jinja2": null, - "text/jsx": { loader: import("highlight.js/lib/languages/javascript"), alias: "javascript" }, + "text/jsx": import("highlight.js/lib/languages/javascript"), "text/mirc": null, "text/tiki": null, "text/troff": null, "text/turtle": null, - "text/typescript-jsx": { loader: import("highlight.js/lib/languages/typescript"), alias: "typescript" }, - "text/vbscript": { loader: import("highlight.js/lib/languages/vbscript"), alias: "vbscript" }, + "text/typescript-jsx": import("highlight.js/lib/languages/typescript"), + "text/vbscript": import("highlight.js/lib/languages/vbscript"), "text/velocity": null, "text/vnd.mermaid": null, "text/mermaid": null, - "text/x-asm-mips": { loader: import("highlight.js/lib/languages/mipsasm"), alias: "mipsasm" }, + "text/x-asm-mips": import("highlight.js/lib/languages/mipsasm"), "text/x-asterisk": null, - "text/x-brainfuck": { loader: import("highlight.js/lib/languages/brainfuck"), alias: "brainfuck" }, - "text/x-c++src": { loader: import("highlight.js/lib/languages/cpp"), alias: "cpp" }, + "text/x-brainfuck": import("highlight.js/lib/languages/brainfuck"), + "text/x-c++src": import("highlight.js/lib/languages/cpp"), "text/x-cassandra": null, - "text/x-clojure": { loader: import("highlight.js/lib/languages/clojure"), alias: "clojure" }, + "text/x-clojure": import("highlight.js/lib/languages/clojure"), "text/x-clojurescript": null, - "text/x-cmake": { loader: import("highlight.js/lib/languages/cmake"), alias: "cmake" }, + "text/x-cmake": import("highlight.js/lib/languages/cmake"), "text/x-cobol": null, - "text/x-common-lisp": { loader: import("highlight.js/lib/languages/lisp"), alias: "lisp" }, - "text/x-crystal": { loader: import("highlight.js/lib/languages/crystal"), alias: "crystal" }, - "text/x-csharp": { loader: import("highlight.js/lib/languages/csharp"), alias: "csharp" }, - "text/x-csrc": { loader: import("highlight.js/lib/languages/c"), alias: "c" }, + "text/x-common-lisp": import("highlight.js/lib/languages/lisp"), + "text/x-crystal": import("highlight.js/lib/languages/crystal"), + "text/x-csharp": import("highlight.js/lib/languages/csharp"), + "text/x-csrc": import("highlight.js/lib/languages/c"), "text/x-cython": null, - "text/x-d": { loader: import("highlight.js/lib/languages/d"), alias: "d" }, - "text/x-diff": { loader: import("highlight.js/lib/languages/diff"), alias: "diff" }, - "text/x-django": { loader: import("highlight.js/lib/languages/django"), alias: "django" }, - "text/x-dockerfile": { loader: import("highlight.js/lib/languages/dockerfile"), alias: "dockerfile" }, + "text/x-d": import("highlight.js/lib/languages/d"), + "text/x-diff": import("highlight.js/lib/languages/diff"), + "text/x-django": import("highlight.js/lib/languages/django"), + "text/x-dockerfile": import("highlight.js/lib/languages/dockerfile"), "text/x-dylan": null, - "text/x-ebnf": { loader: import("highlight.js/lib/languages/ebnf"), alias: "ebnf" }, + "text/x-ebnf": import("highlight.js/lib/languages/ebnf"), "text/x-ecl": null, "text/x-eiffel": null, - "text/x-elm": { loader: import("highlight.js/lib/languages/elm"), alias: "elm" }, - "text/x-erlang": { loader: import("highlight.js/lib/languages/erlang"), alias: "erlang" }, + "text/x-elm": import("highlight.js/lib/languages/elm"), + "text/x-erlang": import("highlight.js/lib/languages/erlang"), "text/x-esper": null, "text/x-factor": null, "text/x-fcl": null, - "text/x-feature": { loader: import("highlight.js/lib/languages/gherkin"), alias: "gherkin" }, + "text/x-feature": import("highlight.js/lib/languages/gherkin"), "text/x-forth": null, - "text/x-fortran": { loader: import("highlight.js/lib/languages/fortran"), alias: "fortran" }, - "text/x-fsharp": { loader: import("highlight.js/lib/languages/fsharp"), alias: "fsharp" }, + "text/x-fortran": import("highlight.js/lib/languages/fortran"), + "text/x-fsharp": import("highlight.js/lib/languages/fsharp"), "text/x-gas": null, "text/x-gdscript": null, - "text/x-gfm": { loader: import("highlight.js/lib/languages/markdown"), alias: "markdown" }, - "text/x-go": { loader: import("highlight.js/lib/languages/go"), alias: "go" }, - "text/x-groovy": { loader: import("highlight.js/lib/languages/groovy"), alias: "groovy" }, + "text/x-gfm": import("highlight.js/lib/languages/markdown"), + "text/x-go": import("highlight.js/lib/languages/go"), + "text/x-groovy": import("highlight.js/lib/languages/groovy"), "text/x-gss": null, - "text/x-haml": { loader: import("highlight.js/lib/languages/haml"), alias: "haml" }, - "text/x-haskell": { loader: import("highlight.js/lib/languages/haskell"), alias: "haskell" }, - "text/x-haxe": { loader: import("highlight.js/lib/languages/haxe"), alias: "haxe" }, - "text/x-hcl": { loader: import("./languages/terraform.js"), alias: "terraform" }, + "text/x-haml": import("highlight.js/lib/languages/haml"), + "text/x-haskell": import("highlight.js/lib/languages/haskell"), + "text/x-haxe": import("highlight.js/lib/languages/haxe"), + "text/x-hcl": import("./languages/terraform.js"), "text/x-hxml": null, "text/x-idl": null, - "text/x-java": { loader: import("highlight.js/lib/languages/java"), alias: "java" }, - "text/x-julia": { loader: import("highlight.js/lib/languages/julia"), alias: "julia" }, - "text/x-kotlin": { loader: import("highlight.js/lib/languages/kotlin"), alias: "kotlin" }, - "text/x-latex": { loader: import("highlight.js/lib/languages/latex"), alias: "latex" }, - "text/x-less": { loader: import("highlight.js/lib/languages/less"), alias: "less" }, + "text/x-java": import("highlight.js/lib/languages/java"), + "text/x-julia": import("highlight.js/lib/languages/julia"), + "text/x-kotlin": import("highlight.js/lib/languages/kotlin"), + "text/x-latex": import("highlight.js/lib/languages/latex"), + "text/x-less": import("highlight.js/lib/languages/less"), "text/x-literate-haskell": null, - "text/x-livescript": { loader: import("highlight.js/lib/languages/livescript"), alias: "livescript" }, - "text/x-lua": { loader: import("highlight.js/lib/languages/lua"), alias: "lua" }, - "text/x-mariadb": { loader: import("highlight.js/lib/languages/sql"), alias: "sql" }, - "text/x-markdown": { loader: import("highlight.js/lib/languages/markdown"), alias: "markdown" }, - "text/x-mathematica": { loader: import("highlight.js/lib/languages/mathematica"), alias: "mathematica" }, + "text/x-livescript": import("highlight.js/lib/languages/livescript"), + "text/x-lua": import("highlight.js/lib/languages/lua"), + "text/x-mariadb": import("highlight.js/lib/languages/sql"), + "text/x-markdown": import("highlight.js/lib/languages/markdown"), + "text/x-mathematica": import("highlight.js/lib/languages/mathematica"), "text/x-modelica": null, "text/x-mscgen": null, "text/x-msgenny": null, - "text/x-mssql": { loader: import("highlight.js/lib/languages/sql"), alias: "sql" }, + "text/x-mssql": import("highlight.js/lib/languages/sql"), "text/x-mumps": null, - "text/x-mysql": { loader: import("highlight.js/lib/languages/sql"), alias: "sql" }, - "text/x-nix": { loader: import("highlight.js/lib/languages/nix"), alias: "nix" }, - "text/x-nginx-conf": { loader: import("highlight.js/lib/languages/nginx"), alias: "nginx" }, - "text/x-nsis": { loader: import("highlight.js/lib/languages/nsis"), alias: "nsis" }, - "text/x-objectivec": { loader: import("highlight.js/lib/languages/objectivec"), alias: "objectivec" }, - "text/x-ocaml": { loader: import("highlight.js/lib/languages/ocaml"), alias: "ocaml" }, + "text/x-mysql": import("highlight.js/lib/languages/sql"), + "text/x-nix": import("highlight.js/lib/languages/nix"), + "text/x-nginx-conf": import("highlight.js/lib/languages/nginx"), + "text/x-nsis": import("highlight.js/lib/languages/nsis"), + "text/x-objectivec": import("highlight.js/lib/languages/objectivec"), + "text/x-ocaml": import("highlight.js/lib/languages/ocaml"), "text/x-octave": null, "text/x-oz": null, - "text/x-pascal": { loader: import("highlight.js/lib/languages/delphi"), alias: "delphi" }, + "text/x-pascal": import("highlight.js/lib/languages/delphi"), "text/x-perl": null, - "text/x-pgsql": { loader: import("highlight.js/lib/languages/sql"), alias: "sql" }, - "text/x-php": { loader: import("highlight.js/lib/languages/php"), alias: "php" }, + "text/x-pgsql": import("highlight.js/lib/languages/sql"), + "text/x-php": import("highlight.js/lib/languages/php"), "text/x-pig": null, - "text/x-plsql": { loader: import("highlight.js/lib/languages/sql"), alias: "sql" }, - "text/x-properties": { loader: import("highlight.js/lib/languages/properties"), alias: "properties" }, - "text/x-protobuf": { loader: import("highlight.js/lib/languages/protobuf"), alias: "protobuf" }, + "text/x-plsql": import("highlight.js/lib/languages/sql"), + "text/x-properties": import("highlight.js/lib/languages/properties"), + "text/x-protobuf": import("highlight.js/lib/languages/protobuf"), "text/x-pug": null, - "text/x-puppet": { loader: import("highlight.js/lib/languages/puppet"), alias: "puppet" }, - "text/x-python": { loader: import("highlight.js/lib/languages/python"), alias: "python" }, - "text/x-q": { loader: import("highlight.js/lib/languages/q"), alias: "q" }, + "text/x-puppet": import("highlight.js/lib/languages/puppet"), + "text/x-python": import("highlight.js/lib/languages/python"), + "text/x-q": import("highlight.js/lib/languages/q"), "text/x-rpm-changes": null, "text/x-rpm-spec": null, - "text/x-rsrc": { loader: import("highlight.js/lib/languages/r"), alias: "r" }, + "text/x-rsrc": import("highlight.js/lib/languages/r"), "text/x-rst": null, - "text/x-ruby": { loader: import("highlight.js/lib/languages/ruby"), alias: "ruby" }, - "text/x-rustsrc": { loader: import("highlight.js/lib/languages/rust"), alias: "rust" }, - "text/x-sas": { loader: import("highlight.js/lib/languages/sas"), alias: "sas" }, - "text/x-sass": { loader: import("highlight.js/lib/languages/scss"), alias: "scss" }, + "text/x-ruby": import("highlight.js/lib/languages/ruby"), + "text/x-rustsrc": import("highlight.js/lib/languages/rust"), + "text/x-sas": import("highlight.js/lib/languages/sas"), + "text/x-sass": import("highlight.js/lib/languages/scss"), "text/x-scala": null, "text/x-scheme": null, - "text/x-scss": { loader: import("highlight.js/lib/languages/scss"), alias: "scss" }, - "text/x-sh": { loader: import("highlight.js/lib/languages/bash"), alias: "bash" }, + "text/x-scss": import("highlight.js/lib/languages/scss"), + "text/x-sh": import("highlight.js/lib/languages/bash"), "text/x-slim": null, "text/x-smarty": null, - "text/x-sml": { loader: import("highlight.js/lib/languages/sml"), alias: "sml" }, + "text/x-sml": import("highlight.js/lib/languages/sml"), "text/x-solr": null, "text/x-soy": null, "text/x-spreadsheet": null, - "text/x-sql": { loader: import("highlight.js/lib/languages/sql"), alias: "sql" }, - "text/x-sqlite;schema=trilium": { loader: import("highlight.js/lib/languages/sql"), alias: "sql" }, - "text/x-sqlite": { loader: import("highlight.js/lib/languages/sql"), alias: "sql" }, + "text/x-sql": import("highlight.js/lib/languages/sql"), + "text/x-sqlite;schema=trilium": import("highlight.js/lib/languages/sql"), + "text/x-sqlite": import("highlight.js/lib/languages/sql"), "text/x-squirrel": null, "text/x-stex": null, - "text/x-stsrc": { loader: import("highlight.js/lib/languages/smalltalk"), alias: "smalltalk" }, - "text/x-styl": { loader: import("highlight.js/lib/languages/stylus"), alias: "stylus" }, + "text/x-stsrc": import("highlight.js/lib/languages/smalltalk"), + "text/x-styl": import("highlight.js/lib/languages/stylus"), "text/x-swift": null, "text/x-systemverilog": null, - "text/x-tcl": { loader: import("highlight.js/lib/languages/tcl"), alias: "tcl" }, + "text/x-tcl": import("highlight.js/lib/languages/tcl"), "text/x-textile": null, "text/x-tiddlywiki": null, - "text/x-toml": { loader: import("highlight.js/lib/languages/ini"), alias: "ini" }, + "text/x-toml": import("highlight.js/lib/languages/ini"), "text/x-tornado": null, "text/x-ttcn-asn": null, "text/x-ttcn-cfg": null, "text/x-ttcn": null, - "text/x-twig": { loader: import("highlight.js/lib/languages/twig"), alias: "twig" }, - "text/x-vb": { loader: import("highlight.js/lib/languages/vbnet"), alias: "vbnet" }, - "text/x-verilog": { loader: import("highlight.js/lib/languages/verilog"), alias: "verilog" }, - "text/x-vhdl": { loader: import("highlight.js/lib/languages/vhdl"), alias: "vhdl" }, + "text/x-twig": import("highlight.js/lib/languages/twig"), + "text/x-vb": import("highlight.js/lib/languages/vbnet"), + "text/x-verilog": import("highlight.js/lib/languages/verilog"), + "text/x-vhdl": import("highlight.js/lib/languages/vhdl"), "text/x-vue": null, "text/x-webidl": null, "text/x-xu": null, "text/x-yacas": null, - "text/x-yaml": { loader: import("highlight.js/lib/languages/yaml"), alias: "yaml" }, + "text/x-yaml": import("highlight.js/lib/languages/yaml"), "text/x-z80": null, - "text/xml": { loader: import("highlight.js/lib/languages/xml"), alias: "xml" }, + "text/xml": import("highlight.js/lib/languages/xml"), } export default byMimeType; From 4fad4de319a4c14bee43364e35bd7ef695a09825 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 May 2025 15:16:53 +0300 Subject: [PATCH 19/66] chore(highlightjs): basic integration --- .../src/services/mime_type_definitions.ts | 13 +----- apps/client/src/services/mime_types.ts | 10 +---- apps/client/src/services/syntax_highlight.ts | 15 ++++--- .../widgets/type_widgets/ckeditor/config.ts | 8 ++-- .../options/text_notes/code_block.ts | 8 +++- apps/client/tsconfig.app.json | 3 ++ apps/client/tsconfig.json | 3 ++ packages/commons/src/index.ts | 3 +- packages/commons/src/lib/mime_type.ts | 18 ++++++++ packages/highlightjs/package.json | 1 + packages/highlightjs/src/index.ts | 45 ++++++++++++++++++- packages/highlightjs/tsconfig.json | 3 ++ packages/highlightjs/tsconfig.lib.json | 6 ++- pnpm-lock.yaml | 3 ++ 14 files changed, 105 insertions(+), 34 deletions(-) create mode 100644 packages/commons/src/lib/mime_type.ts diff --git a/apps/client/src/services/mime_type_definitions.ts b/apps/client/src/services/mime_type_definitions.ts index a9b30fb97..04b55b456 100644 --- a/apps/client/src/services/mime_type_definitions.ts +++ b/apps/client/src/services/mime_type_definitions.ts @@ -1,21 +1,12 @@ // TODO: deduplicate with /src/services/import/mime_type_definitions.ts +import type { MimeTypeDefinition } from "@triliumnext/commons"; + /** * A pseudo-MIME type which is used in the editor to automatically determine the language used in code blocks via heuristics. */ export const MIME_TYPE_AUTO = "text-x-trilium-auto"; -export interface MimeTypeDefinition { - default?: boolean; - title: string; - mime: string; - /** The name of the language/mime type as defined by highlight.js (or one of the aliases), in order to be used for syntax highlighting such as inside code blocks. */ - highlightJs?: string; - /** If specified, will load the corresponding highlight.js file from the `libraries/highlightjs/${id}.js` instead of `node_modules/@highlightjs/cdn-assets/languages/${id}.min.js`. */ - highlightJsSource?: "libraries"; - /** If specified, will load the corresponding highlight file from the given path instead of `node_modules`. */ - codeMirrorSource?: string; -} /** * For highlight.js-supported languages, see https://github.com/highlightjs/highlight.js/blob/main/SUPPORTED_LANGUAGES.md. diff --git a/apps/client/src/services/mime_types.ts b/apps/client/src/services/mime_types.ts index f0f318141..367d5e5ec 100644 --- a/apps/client/src/services/mime_types.ts +++ b/apps/client/src/services/mime_types.ts @@ -1,13 +1,7 @@ -import { MIME_TYPE_AUTO, MIME_TYPES_DICT, normalizeMimeTypeForCKEditor, type MimeTypeDefinition } from "./mime_type_definitions.js"; +import type { MimeType } from "@triliumnext/commons"; +import { MIME_TYPE_AUTO, MIME_TYPES_DICT, normalizeMimeTypeForCKEditor } from "./mime_type_definitions.js"; import options from "./options.js"; -interface MimeType extends MimeTypeDefinition { - /** - * True if this mime type was enabled by the user in the "Available MIME types in the dropdown" option in the Code Notes settings. - */ - enabled: boolean; -} - let mimeTypes: MimeType[] | null = null; function loadMimeTypes() { diff --git a/apps/client/src/services/syntax_highlight.ts b/apps/client/src/services/syntax_highlight.ts index 213518d58..866344a72 100644 --- a/apps/client/src/services/syntax_highlight.ts +++ b/apps/client/src/services/syntax_highlight.ts @@ -1,4 +1,4 @@ -import { highlight, highlightAuto } from "@triliumnext/highlightjs"; +import { ensureMimeTypes, highlight, highlightAuto } from "@triliumnext/highlightjs"; import mime_types from "./mime_types.js"; import options from "./options.js"; @@ -47,12 +47,8 @@ export async function applySingleBlockSyntaxHighlight($codeBlock: JQuery await import("@triliumnext/highlightjs"), + loadHighlightJs: async () => { + ensureMimeTypesForHighlighting(); + return await import("@triliumnext/highlightjs"); + }, mapLanguageName: getHighlightJsNameForMime, defaultMimeType: MIME_TYPE_AUTO, enabled: isSyntaxHighlightEnabled diff --git a/apps/client/src/widgets/type_widgets/options/text_notes/code_block.ts b/apps/client/src/widgets/type_widgets/options/text_notes/code_block.ts index 361a06cd1..d96f9285c 100644 --- a/apps/client/src/widgets/type_widgets/options/text_notes/code_block.ts +++ b/apps/client/src/widgets/type_widgets/options/text_notes/code_block.ts @@ -3,6 +3,7 @@ import { t } from "../../../../services/i18n.js"; import library_loader from "../../../../services/library_loader.js"; import server from "../../../../services/server.js"; import OptionsWidget from "../options_widget.js"; +import { ensureMimeTypesForHighlighting } from "../../../../services/syntax_highlight.js"; const SAMPLE_LANGUAGE = "javascript"; const SAMPLE_CODE = `\ @@ -91,11 +92,14 @@ export default class CodeBlockOptions extends OptionsWidget { #setupPreview(shouldEnableSyntaxHighlight: boolean) { const text = SAMPLE_CODE; if (shouldEnableSyntaxHighlight) { - import("@triliumnext/highlightjs").then((hljs) => { + import("@triliumnext/highlightjs").then(async (hljs) => { + await ensureMimeTypesForHighlighting(); const highlightedText = hljs.highlight(text, { language: SAMPLE_LANGUAGE }); - this.$sampleEl.html(highlightedText.value); + if (highlightedText) { + this.$sampleEl.html(highlightedText.value); + } }); } else { this.$sampleEl.text(text); diff --git a/apps/client/tsconfig.app.json b/apps/client/tsconfig.app.json index 11ed3a1b4..e51437ed1 100644 --- a/apps/client/tsconfig.app.json +++ b/apps/client/tsconfig.app.json @@ -34,6 +34,9 @@ "src/**/*.ts" ], "references": [ + { + "path": "../../packages/highlightjs/tsconfig.lib.json" + }, { "path": "../../packages/codemirror/tsconfig.lib.json" }, diff --git a/apps/client/tsconfig.json b/apps/client/tsconfig.json index 05472be69..c51d8fdcd 100644 --- a/apps/client/tsconfig.json +++ b/apps/client/tsconfig.json @@ -3,6 +3,9 @@ "files": [], "include": [], "references": [ + { + "path": "../../packages/highlightjs" + }, { "path": "../../packages/codemirror" }, diff --git a/packages/commons/src/index.ts b/packages/commons/src/index.ts index 325a06740..96ba3325f 100644 --- a/packages/commons/src/index.ts +++ b/packages/commons/src/index.ts @@ -3,4 +3,5 @@ export * from "./lib/options_interface.js"; export * from "./lib/keyboard_actions_interface.js"; export * from "./lib/hidden_subtree.js"; export * from "./lib/rows.js"; -export * from "./lib/test-utils.js" +export * from "./lib/test-utils.js"; +export * from "./lib/mime_type.js"; diff --git a/packages/commons/src/lib/mime_type.ts b/packages/commons/src/lib/mime_type.ts new file mode 100644 index 000000000..588affc83 --- /dev/null +++ b/packages/commons/src/lib/mime_type.ts @@ -0,0 +1,18 @@ +export interface MimeTypeDefinition { + default?: boolean; + title: string; + mime: string; + /** The name of the language/mime type as defined by highlight.js (or one of the aliases), in order to be used for syntax highlighting such as inside code blocks. */ + highlightJs?: string; + /** If specified, will load the corresponding highlight.js file from the `libraries/highlightjs/${id}.js` instead of `node_modules/@highlightjs/cdn-assets/languages/${id}.min.js`. */ + highlightJsSource?: "libraries"; + /** If specified, will load the corresponding highlight file from the given path instead of `node_modules`. */ + codeMirrorSource?: string; +} + +export interface MimeType extends MimeTypeDefinition { + /** + * True if this mime type was enabled by the user in the "Available MIME types in the dropdown" option in the Code Notes settings. + */ + enabled: boolean; +} diff --git a/packages/highlightjs/package.json b/packages/highlightjs/package.json index ec07642fa..cc52b96a3 100644 --- a/packages/highlightjs/package.json +++ b/packages/highlightjs/package.json @@ -19,6 +19,7 @@ "name": "highlightjs" }, "dependencies": { + "@triliumnext/commons": "workspace:*", "highlight.js": "11.11.1" } } diff --git a/packages/highlightjs/src/index.ts b/packages/highlightjs/src/index.ts index cd59367e1..2bf98c154 100644 --- a/packages/highlightjs/src/index.ts +++ b/packages/highlightjs/src/index.ts @@ -1,3 +1,46 @@ import hljs from "../node_modules/highlight.js/es/core.js"; +import type { MimeType } from "@triliumnext/commons"; +import definitions from "./syntax_highlighting.js"; +import { type HighlightOptions } from "highlight.js"; -export const { highlight, highlightAuto } = hljs; +const registeredMimeTypes = new Set(); +const unsupportedMimeTypes = new Set(); + +export async function ensureMimeTypes(mimeTypes: MimeType[]) { + for (const mimeType of mimeTypes) { + if (!mimeType.enabled) { + continue; + } + + const mime = mimeType.mime; + if (registeredMimeTypes.has(mime)) { + continue; + } + + registeredMimeTypes.add(mime); + const loader = definitions[mime]; + if (!loader) { + unsupportedMimeTypes.add(mime); + continue; + } + + const language = (await loader).default; + console.info(`Registered highlighting for ${mime}.`); + hljs.registerLanguage(mime, language); + } +} + +export function highlight(code: string, options: HighlightOptions) { + if (unsupportedMimeTypes.has(options.language)) { + return null; + } + + if (!registeredMimeTypes.has(options.language)) { + console.warn(`Unable to find highlighting for ${code}.`); + return null; + } + + return hljs.highlight(code, options); +} + +export const { highlightAuto } = hljs; diff --git a/packages/highlightjs/tsconfig.json b/packages/highlightjs/tsconfig.json index 62ebbd946..fe54eef82 100644 --- a/packages/highlightjs/tsconfig.json +++ b/packages/highlightjs/tsconfig.json @@ -3,6 +3,9 @@ "files": [], "include": [], "references": [ + { + "path": "../commons" + }, { "path": "./tsconfig.lib.json" }, diff --git a/packages/highlightjs/tsconfig.lib.json b/packages/highlightjs/tsconfig.lib.json index f0a69a32c..f46b85d22 100644 --- a/packages/highlightjs/tsconfig.lib.json +++ b/packages/highlightjs/tsconfig.lib.json @@ -17,7 +17,11 @@ "include": [ "src/**/*.ts" ], - "references": [], + "references": [ + { + "path": "../commons/tsconfig.lib.json" + } + ], "exclude": [ "vite.config.ts", "vite.config.mts", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6b857fe13..b9251fd8f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1283,6 +1283,9 @@ importers: packages/highlightjs: dependencies: + '@triliumnext/commons': + specifier: workspace:* + version: link:../commons highlight.js: specifier: 11.11.1 version: 11.11.1 From 0d09a7558fba4a44c7bcbfe10f302a5212537528 Mon Sep 17 00:00:00 2001 From: SiriusXT <1160925501@qq.com> Date: Sun, 18 May 2025 20:19:30 +0800 Subject: [PATCH 20/66] fix: Incorrectly calculating rest-pane width --- apps/client/src/services/resizer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/services/resizer.ts b/apps/client/src/services/resizer.ts index be148f3ec..e0dc40995 100644 --- a/apps/client/src/services/resizer.ts +++ b/apps/client/src/services/resizer.ts @@ -23,7 +23,7 @@ function setupLeftPaneResizer(leftPaneVisible: boolean) { // Window resizing causes `window.innerWidth` to change, so `reservedWidth` needs to be recalculated each time. const reservedWidth = reservedPx / window.innerWidth * 100; if (!leftPaneVisible) { - $("#rest-pane").css("width", layoutOrientation === "vertical" ? `${(100 - reservedWidth) * 100}%` : "100%"); + $("#rest-pane").css("width", layoutOrientation === "vertical" ? `${100 - reservedWidth}%` : "100%"); return; } From b0ebeb22d5ba07958514db3c012804efbb532057 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 May 2025 16:05:50 +0300 Subject: [PATCH 21/66] fix(highlightjs): unable to match due to init normalization --- apps/client/src/services/content_renderer.ts | 2 +- apps/client/src/services/mime_type_definitions.ts | 11 ----------- apps/client/src/services/mime_types.ts | 4 ++-- .../src/widgets/type_widgets/editable_text.ts | 2 +- apps/server/src/services/import/markdown.ts | 3 ++- .../src/services/import/mime_type_definitions.ts | 11 ----------- .../src/plugins/syntax_highlighting/index.ts | 15 ++++++--------- packages/commons/src/lib/mime_type.ts | 11 +++++++++++ packages/highlightjs/src/index.ts | 7 +++---- packages/highlightjs/src/syntax_highlighting.ts | 13 +++++++++++-- 10 files changed, 37 insertions(+), 42 deletions(-) diff --git a/apps/client/src/services/content_renderer.ts b/apps/client/src/services/content_renderer.ts index 619d2d7a6..6366e147d 100644 --- a/apps/client/src/services/content_renderer.ts +++ b/apps/client/src/services/content_renderer.ts @@ -12,10 +12,10 @@ import FAttachment from "../entities/fattachment.js"; import imageContextMenuService from "../menus/image_context_menu.js"; import { applySingleBlockSyntaxHighlight, applySyntaxHighlight } from "./syntax_highlight.js"; import { loadElkIfNeeded, postprocessMermaidSvg } from "./mermaid.js"; -import { normalizeMimeTypeForCKEditor } from "./mime_type_definitions.js"; import renderDoc from "./doc_renderer.js"; import { t } from "../services/i18n.js"; import WheelZoom from 'vanilla-js-wheel-zoom'; +import { normalizeMimeTypeForCKEditor } from "@triliumnext/commons"; let idCounter = 1; diff --git a/apps/client/src/services/mime_type_definitions.ts b/apps/client/src/services/mime_type_definitions.ts index 04b55b456..5ea70d6b8 100644 --- a/apps/client/src/services/mime_type_definitions.ts +++ b/apps/client/src/services/mime_type_definitions.ts @@ -179,17 +179,6 @@ export const MIME_TYPES_DICT: readonly MimeTypeDefinition[] = Object.freeze([ { title: "Z80", mime: "text/x-z80" } ]); -/** - * Given a MIME type in the usual format (e.g. `text/csrc`), it returns a MIME type that can be passed down to the CKEditor - * code plugin. - * - * @param mimeType The MIME type to normalize, in the usual format (e.g. `text/c-src`). - * @returns the normalized MIME type (e.g. `text-c-src`). - */ -export function normalizeMimeTypeForCKEditor(mimeType: string) { - return mimeType.toLowerCase().replace(/[\W_]+/g, "-"); -} - let byHighlightJsNameMappings: Record | null = null; /** diff --git a/apps/client/src/services/mime_types.ts b/apps/client/src/services/mime_types.ts index 367d5e5ec..e009cb50f 100644 --- a/apps/client/src/services/mime_types.ts +++ b/apps/client/src/services/mime_types.ts @@ -1,5 +1,5 @@ -import type { MimeType } from "@triliumnext/commons"; -import { MIME_TYPE_AUTO, MIME_TYPES_DICT, normalizeMimeTypeForCKEditor } from "./mime_type_definitions.js"; +import { normalizeMimeTypeForCKEditor, type MimeType } from "@triliumnext/commons"; +import { MIME_TYPE_AUTO, MIME_TYPES_DICT } from "./mime_type_definitions.js"; import options from "./options.js"; let mimeTypes: MimeType[] | null = null; diff --git a/apps/client/src/widgets/type_widgets/editable_text.ts b/apps/client/src/widgets/type_widgets/editable_text.ts index e1faac24f..605a0b898 100644 --- a/apps/client/src/widgets/type_widgets/editable_text.ts +++ b/apps/client/src/widgets/type_widgets/editable_text.ts @@ -12,13 +12,13 @@ import appContext, { type CommandListenerData, type EventData } from "../../comp import dialogService from "../../services/dialog.js"; import options from "../../services/options.js"; import toast from "../../services/toast.js"; -import { normalizeMimeTypeForCKEditor } from "../../services/mime_type_definitions.js"; import { buildSelectedBackgroundColor } from "../../components/touch_bar.js"; import { buildConfig, buildToolbarConfig } from "./ckeditor/config.js"; import type FNote from "../../entities/fnote.js"; import { getMermaidConfig } from "../../services/mermaid.js"; import { PopupEditor, ClassicEditor, EditorWatchdog, type CKTextEditor, type MentionFeed, type WatchdogConfig } from "@triliumnext/ckeditor5"; import "@triliumnext/ckeditor5/index.css"; +import { normalizeMimeTypeForCKEditor } from "@triliumnext/commons"; const ENABLE_INSPECTOR = false; diff --git a/apps/server/src/services/import/markdown.ts b/apps/server/src/services/import/markdown.ts index a49a46897..3df4249a1 100644 --- a/apps/server/src/services/import/markdown.ts +++ b/apps/server/src/services/import/markdown.ts @@ -127,9 +127,10 @@ const renderer = new CustomMarkdownRenderer({ async: false }); import htmlSanitizer from "../html_sanitizer.js"; import importUtils from "./utils.js"; -import { getMimeTypeFromHighlightJs, MIME_TYPE_AUTO, normalizeMimeTypeForCKEditor } from "./mime_type_definitions.js"; +import { getMimeTypeFromHighlightJs, MIME_TYPE_AUTO } from "./mime_type_definitions.js"; import { ADMONITION_TYPE_MAPPINGS } from "../export/markdown.js"; import utils from "../utils.js"; +import { normalizeMimeTypeForCKEditor } from "@triliumnext/commons"; function renderToHtml(content: string, title: string) { // Double-escape slashes in math expression because they are otherwise consumed by the parser somewhere. diff --git a/apps/server/src/services/import/mime_type_definitions.ts b/apps/server/src/services/import/mime_type_definitions.ts index 3e7458116..7d5b5df49 100644 --- a/apps/server/src/services/import/mime_type_definitions.ts +++ b/apps/server/src/services/import/mime_type_definitions.ts @@ -188,17 +188,6 @@ export const MIME_TYPES_DICT: readonly MimeTypeDefinition[] = Object.freeze([ { title: "Z80", mime: "text/x-z80" } ]); -/** - * Given a MIME type in the usual format (e.g. `text/csrc`), it returns a MIME type that can be passed down to the CKEditor - * code plugin. - * - * @param mimeType The MIME type to normalize, in the usual format (e.g. `text/c-src`). - * @returns the normalized MIME type (e.g. `text-c-src`). - */ -export function normalizeMimeTypeForCKEditor(mimeType: string) { - return mimeType.toLowerCase().replace(/[\W_]+/g, "-"); -} - let byHighlightJsNameMappings: Record | null = null; /** diff --git a/packages/ckeditor5/src/plugins/syntax_highlighting/index.ts b/packages/ckeditor5/src/plugins/syntax_highlighting/index.ts index 5b1111be0..894939374 100644 --- a/packages/ckeditor5/src/plugins/syntax_highlighting/index.ts +++ b/packages/ckeditor5/src/plugins/syntax_highlighting/index.ts @@ -173,14 +173,6 @@ export default class SyntaxHighlighting extends Plugin { return; } - // Find the corresponding language for the given mimetype. - const highlightJsLanguage = this.config.mapLanguageName(mimeType); - - if (mimeType !== this.config.defaultMimeType && !highlightJsLanguage) { - console.warn(`Unsupported highlight.js for mime type ${mimeType}.`); - return; - } - // Don't highlight if the code is too big, as the typing performance will be highly degraded. if (codeBlock.childCount >= HIGHLIGHT_MAX_BLOCK_COUNT) { return; @@ -230,8 +222,13 @@ export default class SyntaxHighlighting extends Plugin { if (mimeType === this.config.defaultMimeType) { highlightRes = this.hljs.highlightAuto(text); } else { - highlightRes = this.hljs.highlight(text, { language: highlightJsLanguage }); + highlightRes = this.hljs.highlight(text, { language: mimeType }); } + + if (!highlightRes) { + return; + } + dbg("text\n" + text); dbg("html\n" + highlightRes.value); diff --git a/packages/commons/src/lib/mime_type.ts b/packages/commons/src/lib/mime_type.ts index 588affc83..a53a1f7ac 100644 --- a/packages/commons/src/lib/mime_type.ts +++ b/packages/commons/src/lib/mime_type.ts @@ -16,3 +16,14 @@ export interface MimeType extends MimeTypeDefinition { */ enabled: boolean; } + +/** + * Given a MIME type in the usual format (e.g. `text/csrc`), it returns a MIME type that can be passed down to the CKEditor + * code plugin. + * + * @param mimeType The MIME type to normalize, in the usual format (e.g. `text/c-src`). + * @returns the normalized MIME type (e.g. `text-c-src`). + */ +export function normalizeMimeTypeForCKEditor(mimeType: string) { + return mimeType.toLowerCase().replace(/[\W_]+/g, "-"); +} diff --git a/packages/highlightjs/src/index.ts b/packages/highlightjs/src/index.ts index 2bf98c154..c93ac6cf6 100644 --- a/packages/highlightjs/src/index.ts +++ b/packages/highlightjs/src/index.ts @@ -1,5 +1,5 @@ import hljs from "../node_modules/highlight.js/es/core.js"; -import type { MimeType } from "@triliumnext/commons"; +import { normalizeMimeTypeForCKEditor, type MimeType } from "@triliumnext/commons"; import definitions from "./syntax_highlighting.js"; import { type HighlightOptions } from "highlight.js"; @@ -12,7 +12,7 @@ export async function ensureMimeTypes(mimeTypes: MimeType[]) { continue; } - const mime = mimeType.mime; + const mime = normalizeMimeTypeForCKEditor(mimeType.mime); if (registeredMimeTypes.has(mime)) { continue; } @@ -25,7 +25,6 @@ export async function ensureMimeTypes(mimeTypes: MimeType[]) { } const language = (await loader).default; - console.info(`Registered highlighting for ${mime}.`); hljs.registerLanguage(mime, language); } } @@ -36,7 +35,7 @@ export function highlight(code: string, options: HighlightOptions) { } if (!registeredMimeTypes.has(options.language)) { - console.warn(`Unable to find highlighting for ${code}.`); + console.warn(`Unable to find highlighting for ${options.language}.`); return null; } diff --git a/packages/highlightjs/src/syntax_highlighting.ts b/packages/highlightjs/src/syntax_highlighting.ts index 0ccc543ff..6056b3ac1 100644 --- a/packages/highlightjs/src/syntax_highlighting.ts +++ b/packages/highlightjs/src/syntax_highlighting.ts @@ -1,6 +1,9 @@ +import { normalizeMimeTypeForCKEditor } from "@triliumnext/commons"; import type { LanguageFn } from "highlight.js"; -const byMimeType: Record | null)> = { +type MimeRecord = Record | null)>; + +const byMimeType: MimeRecord = { "text/plain": import("highlight.js/lib/languages/plaintext"), "application/dart": import("highlight.js/lib/languages/dart"), "application/edn": null, @@ -166,4 +169,10 @@ const byMimeType: Record | null)> = { "text/xml": import("highlight.js/lib/languages/xml"), } -export default byMimeType; +const normalizedByMimeType: MimeRecord = {}; +for (const [mimeType, loader] of Object.entries(byMimeType)) { + const normalizedMimeType = normalizeMimeTypeForCKEditor(mimeType); + normalizedByMimeType[normalizedMimeType] = loader; +} + +export default normalizedByMimeType; From 488761d4b9b2eb92f57eac316a375748c6ed1bed Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 May 2025 16:11:40 +0300 Subject: [PATCH 22/66] fix(highlightjs): loading all supported languages at once --- packages/highlightjs/src/index.ts | 2 +- .../highlightjs/src/syntax_highlighting.ts | 186 +++++++++--------- 2 files changed, 94 insertions(+), 94 deletions(-) diff --git a/packages/highlightjs/src/index.ts b/packages/highlightjs/src/index.ts index c93ac6cf6..065ba33cd 100644 --- a/packages/highlightjs/src/index.ts +++ b/packages/highlightjs/src/index.ts @@ -24,7 +24,7 @@ export async function ensureMimeTypes(mimeTypes: MimeType[]) { continue; } - const language = (await loader).default; + const language = (await loader()).default; hljs.registerLanguage(mime, language); } } diff --git a/packages/highlightjs/src/syntax_highlighting.ts b/packages/highlightjs/src/syntax_highlighting.ts index 6056b3ac1..62b14ea42 100644 --- a/packages/highlightjs/src/syntax_highlighting.ts +++ b/packages/highlightjs/src/syntax_highlighting.ts @@ -1,172 +1,172 @@ import { normalizeMimeTypeForCKEditor } from "@triliumnext/commons"; import type { LanguageFn } from "highlight.js"; -type MimeRecord = Record | null)>; +type MimeRecord = Record Promise<{ default: LanguageFn}>) | null>; const byMimeType: MimeRecord = { - "text/plain": import("highlight.js/lib/languages/plaintext"), - "application/dart": import("highlight.js/lib/languages/dart"), + "text/plain": () => import("highlight.js/lib/languages/plaintext"), + "application/dart": () => import("highlight.js/lib/languages/dart"), "application/edn": null, - "application/javascript;env=backend": import("highlight.js/lib/languages/javascript"), - "application/javascript;env=frontend": import("highlight.js/lib/languages/javascript"), - "application/json": import("highlight.js/lib/languages/json"), - "application/ld+json": import("highlight.js/lib/languages/json"), + "application/javascript;env=backend": () => import("highlight.js/lib/languages/javascript"), + "application/javascript;env=frontend": () => import("highlight.js/lib/languages/javascript"), + "application/json": () => import("highlight.js/lib/languages/json"), + "application/ld+json": () => import("highlight.js/lib/languages/json"), "application/mbox": null, "application/n-triples": null, "application/pgp": null, "application/sieve": null, "application/sparql-query": null, - "application/typescript": import("highlight.js/lib/languages/typescript"), + "application/typescript": () => import("highlight.js/lib/languages/typescript"), "application/x-aspx": null, - "application/x-bat": import("highlight.js/lib/languages/dos"), + "application/x-bat": () => import("highlight.js/lib/languages/dos"), "application/x-cypher-query": null, "application/x-ejs": null, - "application/x-erb": import("highlight.js/lib/languages/erb"), - "application/x-jsp": import("highlight.js/lib/languages/java"), - "application/x-powershell": import("highlight.js/lib/languages/powershell"), + "application/x-erb": () => import("highlight.js/lib/languages/erb"), + "application/x-jsp": () => import("highlight.js/lib/languages/java"), + "application/x-powershell": () => import("highlight.js/lib/languages/powershell"), "application/xml-dtd": null, - "application/xquery": import("highlight.js/lib/languages/xquery"), - "message/http": import("highlight.js/lib/languages/http"), + "application/xquery": () => import("highlight.js/lib/languages/xquery"), + "message/http": () => import("highlight.js/lib/languages/http"), "text/apl": null, - "text/coffeescript": import("highlight.js/lib/languages/coffeescript"), - "text/css": import("highlight.js/lib/languages/css"), - "text/html": import("highlight.js/lib/languages/xml"), + "text/coffeescript": () => import("highlight.js/lib/languages/coffeescript"), + "text/css": () => import("highlight.js/lib/languages/css"), + "text/html": () => import("highlight.js/lib/languages/xml"), "text/jinja2": null, - "text/jsx": import("highlight.js/lib/languages/javascript"), + "text/jsx": () => import("highlight.js/lib/languages/javascript"), "text/mirc": null, "text/tiki": null, "text/troff": null, "text/turtle": null, - "text/typescript-jsx": import("highlight.js/lib/languages/typescript"), - "text/vbscript": import("highlight.js/lib/languages/vbscript"), + "text/typescript-jsx": () => import("highlight.js/lib/languages/typescript"), + "text/vbscript": () => import("highlight.js/lib/languages/vbscript"), "text/velocity": null, "text/vnd.mermaid": null, "text/mermaid": null, - "text/x-asm-mips": import("highlight.js/lib/languages/mipsasm"), + "text/x-asm-mips": () => import("highlight.js/lib/languages/mipsasm"), "text/x-asterisk": null, - "text/x-brainfuck": import("highlight.js/lib/languages/brainfuck"), - "text/x-c++src": import("highlight.js/lib/languages/cpp"), + "text/x-brainfuck": () => import("highlight.js/lib/languages/brainfuck"), + "text/x-c++src": () => import("highlight.js/lib/languages/cpp"), "text/x-cassandra": null, - "text/x-clojure": import("highlight.js/lib/languages/clojure"), + "text/x-clojure": () => import("highlight.js/lib/languages/clojure"), "text/x-clojurescript": null, - "text/x-cmake": import("highlight.js/lib/languages/cmake"), + "text/x-cmake": () => import("highlight.js/lib/languages/cmake"), "text/x-cobol": null, - "text/x-common-lisp": import("highlight.js/lib/languages/lisp"), - "text/x-crystal": import("highlight.js/lib/languages/crystal"), - "text/x-csharp": import("highlight.js/lib/languages/csharp"), - "text/x-csrc": import("highlight.js/lib/languages/c"), + "text/x-common-lisp": () => import("highlight.js/lib/languages/lisp"), + "text/x-crystal": () => import("highlight.js/lib/languages/crystal"), + "text/x-csharp": () => import("highlight.js/lib/languages/csharp"), + "text/x-csrc": () => import("highlight.js/lib/languages/c"), "text/x-cython": null, - "text/x-d": import("highlight.js/lib/languages/d"), - "text/x-diff": import("highlight.js/lib/languages/diff"), - "text/x-django": import("highlight.js/lib/languages/django"), - "text/x-dockerfile": import("highlight.js/lib/languages/dockerfile"), + "text/x-d": () => import("highlight.js/lib/languages/d"), + "text/x-diff": () => import("highlight.js/lib/languages/diff"), + "text/x-django": () => import("highlight.js/lib/languages/django"), + "text/x-dockerfile": () => import("highlight.js/lib/languages/dockerfile"), "text/x-dylan": null, - "text/x-ebnf": import("highlight.js/lib/languages/ebnf"), + "text/x-ebnf": () => import("highlight.js/lib/languages/ebnf"), "text/x-ecl": null, "text/x-eiffel": null, - "text/x-elm": import("highlight.js/lib/languages/elm"), - "text/x-erlang": import("highlight.js/lib/languages/erlang"), + "text/x-elm": () => import("highlight.js/lib/languages/elm"), + "text/x-erlang": () => import("highlight.js/lib/languages/erlang"), "text/x-esper": null, "text/x-factor": null, "text/x-fcl": null, - "text/x-feature": import("highlight.js/lib/languages/gherkin"), + "text/x-feature": () => import("highlight.js/lib/languages/gherkin"), "text/x-forth": null, - "text/x-fortran": import("highlight.js/lib/languages/fortran"), - "text/x-fsharp": import("highlight.js/lib/languages/fsharp"), + "text/x-fortran": () => import("highlight.js/lib/languages/fortran"), + "text/x-fsharp": () => import("highlight.js/lib/languages/fsharp"), "text/x-gas": null, "text/x-gdscript": null, - "text/x-gfm": import("highlight.js/lib/languages/markdown"), - "text/x-go": import("highlight.js/lib/languages/go"), - "text/x-groovy": import("highlight.js/lib/languages/groovy"), + "text/x-gfm": () => import("highlight.js/lib/languages/markdown"), + "text/x-go": () => import("highlight.js/lib/languages/go"), + "text/x-groovy": () => import("highlight.js/lib/languages/groovy"), "text/x-gss": null, - "text/x-haml": import("highlight.js/lib/languages/haml"), - "text/x-haskell": import("highlight.js/lib/languages/haskell"), - "text/x-haxe": import("highlight.js/lib/languages/haxe"), - "text/x-hcl": import("./languages/terraform.js"), + "text/x-haml": () => import("highlight.js/lib/languages/haml"), + "text/x-haskell": () => import("highlight.js/lib/languages/haskell"), + "text/x-haxe": () => import("highlight.js/lib/languages/haxe"), + "text/x-hcl": () => import("./languages/terraform.js"), "text/x-hxml": null, "text/x-idl": null, - "text/x-java": import("highlight.js/lib/languages/java"), - "text/x-julia": import("highlight.js/lib/languages/julia"), - "text/x-kotlin": import("highlight.js/lib/languages/kotlin"), - "text/x-latex": import("highlight.js/lib/languages/latex"), - "text/x-less": import("highlight.js/lib/languages/less"), + "text/x-java": () => import("highlight.js/lib/languages/java"), + "text/x-julia": () => import("highlight.js/lib/languages/julia"), + "text/x-kotlin": () => import("highlight.js/lib/languages/kotlin"), + "text/x-latex": () => import("highlight.js/lib/languages/latex"), + "text/x-less": () => import("highlight.js/lib/languages/less"), "text/x-literate-haskell": null, - "text/x-livescript": import("highlight.js/lib/languages/livescript"), - "text/x-lua": import("highlight.js/lib/languages/lua"), - "text/x-mariadb": import("highlight.js/lib/languages/sql"), - "text/x-markdown": import("highlight.js/lib/languages/markdown"), - "text/x-mathematica": import("highlight.js/lib/languages/mathematica"), + "text/x-livescript": () => import("highlight.js/lib/languages/livescript"), + "text/x-lua": () => import("highlight.js/lib/languages/lua"), + "text/x-mariadb": () => import("highlight.js/lib/languages/sql"), + "text/x-markdown": () => import("highlight.js/lib/languages/markdown"), + "text/x-mathematica": () => import("highlight.js/lib/languages/mathematica"), "text/x-modelica": null, "text/x-mscgen": null, "text/x-msgenny": null, - "text/x-mssql": import("highlight.js/lib/languages/sql"), + "text/x-mssql": () => import("highlight.js/lib/languages/sql"), "text/x-mumps": null, - "text/x-mysql": import("highlight.js/lib/languages/sql"), - "text/x-nix": import("highlight.js/lib/languages/nix"), - "text/x-nginx-conf": import("highlight.js/lib/languages/nginx"), - "text/x-nsis": import("highlight.js/lib/languages/nsis"), - "text/x-objectivec": import("highlight.js/lib/languages/objectivec"), - "text/x-ocaml": import("highlight.js/lib/languages/ocaml"), + "text/x-mysql": () => import("highlight.js/lib/languages/sql"), + "text/x-nix": () => import("highlight.js/lib/languages/nix"), + "text/x-nginx-conf": () => import("highlight.js/lib/languages/nginx"), + "text/x-nsis": () => import("highlight.js/lib/languages/nsis"), + "text/x-objectivec": () => import("highlight.js/lib/languages/objectivec"), + "text/x-ocaml": () => import("highlight.js/lib/languages/ocaml"), "text/x-octave": null, "text/x-oz": null, - "text/x-pascal": import("highlight.js/lib/languages/delphi"), + "text/x-pascal": () => import("highlight.js/lib/languages/delphi"), "text/x-perl": null, - "text/x-pgsql": import("highlight.js/lib/languages/sql"), - "text/x-php": import("highlight.js/lib/languages/php"), + "text/x-pgsql": () => import("highlight.js/lib/languages/sql"), + "text/x-php": () => import("highlight.js/lib/languages/php"), "text/x-pig": null, - "text/x-plsql": import("highlight.js/lib/languages/sql"), - "text/x-properties": import("highlight.js/lib/languages/properties"), - "text/x-protobuf": import("highlight.js/lib/languages/protobuf"), + "text/x-plsql": () => import("highlight.js/lib/languages/sql"), + "text/x-properties": () => import("highlight.js/lib/languages/properties"), + "text/x-protobuf": () => import("highlight.js/lib/languages/protobuf"), "text/x-pug": null, - "text/x-puppet": import("highlight.js/lib/languages/puppet"), - "text/x-python": import("highlight.js/lib/languages/python"), - "text/x-q": import("highlight.js/lib/languages/q"), + "text/x-puppet": () => import("highlight.js/lib/languages/puppet"), + "text/x-python": () => import("highlight.js/lib/languages/python"), + "text/x-q": () => import("highlight.js/lib/languages/q"), "text/x-rpm-changes": null, "text/x-rpm-spec": null, - "text/x-rsrc": import("highlight.js/lib/languages/r"), + "text/x-rsrc": () => import("highlight.js/lib/languages/r"), "text/x-rst": null, - "text/x-ruby": import("highlight.js/lib/languages/ruby"), - "text/x-rustsrc": import("highlight.js/lib/languages/rust"), - "text/x-sas": import("highlight.js/lib/languages/sas"), - "text/x-sass": import("highlight.js/lib/languages/scss"), + "text/x-ruby": () => import("highlight.js/lib/languages/ruby"), + "text/x-rustsrc": () => import("highlight.js/lib/languages/rust"), + "text/x-sas": () => import("highlight.js/lib/languages/sas"), + "text/x-sass": () => import("highlight.js/lib/languages/scss"), "text/x-scala": null, "text/x-scheme": null, - "text/x-scss": import("highlight.js/lib/languages/scss"), - "text/x-sh": import("highlight.js/lib/languages/bash"), + "text/x-scss": () => import("highlight.js/lib/languages/scss"), + "text/x-sh": () => import("highlight.js/lib/languages/bash"), "text/x-slim": null, "text/x-smarty": null, - "text/x-sml": import("highlight.js/lib/languages/sml"), + "text/x-sml": () => import("highlight.js/lib/languages/sml"), "text/x-solr": null, "text/x-soy": null, "text/x-spreadsheet": null, - "text/x-sql": import("highlight.js/lib/languages/sql"), - "text/x-sqlite;schema=trilium": import("highlight.js/lib/languages/sql"), - "text/x-sqlite": import("highlight.js/lib/languages/sql"), + "text/x-sql": () => import("highlight.js/lib/languages/sql"), + "text/x-sqlite;schema=trilium": () => import("highlight.js/lib/languages/sql"), + "text/x-sqlite": () => import("highlight.js/lib/languages/sql"), "text/x-squirrel": null, "text/x-stex": null, - "text/x-stsrc": import("highlight.js/lib/languages/smalltalk"), - "text/x-styl": import("highlight.js/lib/languages/stylus"), + "text/x-stsrc": () => import("highlight.js/lib/languages/smalltalk"), + "text/x-styl": () => import("highlight.js/lib/languages/stylus"), "text/x-swift": null, "text/x-systemverilog": null, - "text/x-tcl": import("highlight.js/lib/languages/tcl"), + "text/x-tcl": () => import("highlight.js/lib/languages/tcl"), "text/x-textile": null, "text/x-tiddlywiki": null, - "text/x-toml": import("highlight.js/lib/languages/ini"), + "text/x-toml": () => import("highlight.js/lib/languages/ini"), "text/x-tornado": null, "text/x-ttcn-asn": null, "text/x-ttcn-cfg": null, "text/x-ttcn": null, - "text/x-twig": import("highlight.js/lib/languages/twig"), - "text/x-vb": import("highlight.js/lib/languages/vbnet"), - "text/x-verilog": import("highlight.js/lib/languages/verilog"), - "text/x-vhdl": import("highlight.js/lib/languages/vhdl"), + "text/x-twig": () => import("highlight.js/lib/languages/twig"), + "text/x-vb": () => import("highlight.js/lib/languages/vbnet"), + "text/x-verilog": () => import("highlight.js/lib/languages/verilog"), + "text/x-vhdl": () => import("highlight.js/lib/languages/vhdl"), "text/x-vue": null, "text/x-webidl": null, "text/x-xu": null, "text/x-yacas": null, - "text/x-yaml": import("highlight.js/lib/languages/yaml"), + "text/x-yaml": () => import("highlight.js/lib/languages/yaml"), "text/x-z80": null, - "text/xml": import("highlight.js/lib/languages/xml"), + "text/xml": () => import("highlight.js/lib/languages/xml"), } const normalizedByMimeType: MimeRecord = {}; From 8b11f25f0ced51a4698dd476b39c739e746b6f95 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 18 May 2025 17:12:45 +0300 Subject: [PATCH 23/66] chore(highlightjs): introduce client-level list of themes --- apps/client/src/services/library_loader.ts | 1 - apps/client/src/services/syntax_highlight.ts | 7 +- .../options/text_notes/code_block.ts | 27 ++---- apps/server/src/routes/api/options.ts | 6 -- apps/server/src/routes/routes.ts | 1 - apps/server/src/services/code_block_theme.ts | 5 -- .../src/services/code_block_theme_names.json | 82 ------------------ packages/highlightjs/src/index.ts | 11 ++- packages/highlightjs/src/themes.ts | 85 +++++++++++++++++++ 9 files changed, 108 insertions(+), 117 deletions(-) delete mode 100644 apps/server/src/services/code_block_theme_names.json create mode 100644 packages/highlightjs/src/themes.ts diff --git a/apps/client/src/services/library_loader.ts b/apps/client/src/services/library_loader.ts index fc1b53f10..7197d6732 100644 --- a/apps/client/src/services/library_loader.ts +++ b/apps/client/src/services/library_loader.ts @@ -31,7 +31,6 @@ const HIGHLIGHT_JS: Library = { } } - const currentTheme = String(optionsService.get("codeBlockTheme")); loadHighlightingTheme(currentTheme); return Array.from(scriptsToLoad); diff --git a/apps/client/src/services/syntax_highlight.ts b/apps/client/src/services/syntax_highlight.ts index 866344a72..39eb3e71f 100644 --- a/apps/client/src/services/syntax_highlight.ts +++ b/apps/client/src/services/syntax_highlight.ts @@ -1,4 +1,4 @@ -import { ensureMimeTypes, highlight, highlightAuto } from "@triliumnext/highlightjs"; +import { ensureMimeTypes, highlight, highlightAuto, loadTheme } from "@triliumnext/highlightjs"; import mime_types from "./mime_types.js"; import options from "./options.js"; @@ -57,6 +57,11 @@ export async function applySingleBlockSyntaxHighlight($codeBlock: JQuery") + .attr("value", `default:${name}`) + .text(name); + this.$themeSelect.append(option); + } this.$themeSelect.on("change", async () => { const newTheme = String(this.$themeSelect.val()); library_loader.loadHighlightingTheme(newTheme); @@ -107,25 +115,6 @@ export default class CodeBlockOptions extends OptionsWidget { } async optionsLoaded(options: OptionMap) { - const themeGroups = await server.get("options/codeblock-themes"); - this.$themeSelect.empty(); - - for (const [key, themes] of Object.entries(themeGroups)) { - const $group = key ? $("").attr("label", key) : null; - - for (const theme of themes) { - const option = $("