diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index aa8c5926c..d1f70699f 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -1309,7 +1309,10 @@ "title": "Editor" }, "code_mime_types": { - "title": "Available MIME types in the dropdown" + "title": "Available MIME types in the dropdown", + "tooltip_syntax_highlighting": "Syntax highlighting", + "tooltip_code_block_syntax": "Code blocks in Text notes", + "tooltip_code_note_syntax": "Code notes" }, "vim_key_bindings": { "use_vim_keybindings_in_code_notes": "Vim keybindings", diff --git a/apps/client/src/widgets/type_widgets/options/code_notes.tsx b/apps/client/src/widgets/type_widgets/options/code_notes.tsx index e2a046cd7..7d69cc1cb 100644 --- a/apps/client/src/widgets/type_widgets/options/code_notes.tsx +++ b/apps/client/src/widgets/type_widgets/options/code_notes.tsx @@ -4,7 +4,7 @@ import Column from "../../react/Column"; import FormCheckbox from "../../react/FormCheckbox"; import FormGroup from "../../react/FormGroup"; import FormSelect from "../../react/FormSelect"; -import { useTriliumOption, useTriliumOptionBool, useTriliumOptionJson } from "../../react/hooks"; +import { useStaticTooltip, useTriliumOption, useTriliumOptionBool, useTriliumOptionJson } from "../../react/hooks"; import OptionsSection from "./components/OptionsSection"; import { useEffect, useMemo, useRef } from "preact/hooks"; import codeNoteSample from "./samples/code_note.txt?raw"; @@ -14,6 +14,8 @@ import mime_types from "../../../services/mime_types"; import CheckboxList from "./components/CheckboxList"; import AutoReadOnlySize from "./components/AutoReadOnlySize"; import "./code_notes.css"; +import { byMimeType as codeBlockMimeTypes } from "@triliumnext/highlightjs/src/syntax_highlighting"; +import { default as codeNoteMimeTypes } from "@triliumnext/codemirror/src/syntax_highlighting"; const SAMPLE_MIME = "application/typescript"; @@ -134,6 +136,26 @@ function CodeMimeTypes() { type MimeTypeWithDisabled = MimeType & { disabled?: boolean }; export function CodeMimeTypesList() { + const containerRef = useRef(null); + useStaticTooltip(containerRef, { + title() { + const mime = this.querySelector("input")?.value; + if (!mime) return ""; + + const hasCodeBlockSyntax = !!codeBlockMimeTypes[mime]; + const hasCodeNoteSyntax = !!codeNoteMimeTypes[mime]; + + return ` + ${t("code_mime_types.tooltip_syntax_highlighting")}
+ ${hasCodeBlockSyntax ? "✅" : "❌"} ${t("code_mime_types.tooltip_code_block_syntax")}
+ ${hasCodeNoteSyntax ? "✅" : "❌"} ${t("code_mime_types.tooltip_code_note_syntax")} + `; + }, + selector: "label", + placement: "right", + fallbackPlacements: [ "left", "right" ], + html: true + }); const [ codeNotesMimeTypes, setCodeNotesMimeTypes ] = useTriliumOptionJson("codeNotesMimeTypes"); const groupedMimeTypes: Record = useMemo(() => { mime_types.loadMimeTypes(); @@ -160,7 +182,7 @@ export function CodeMimeTypesList() { }, [ codeNotesMimeTypes ]); return ( -
    +
      {Object.entries(groupedMimeTypes).map(([ initial, mimeTypes ]) => (
      { initial &&
      {initial}
      } diff --git a/packages/highlightjs/src/syntax_highlighting.ts b/packages/highlightjs/src/syntax_highlighting.ts index dc94d6303..1970e1b40 100644 --- a/packages/highlightjs/src/syntax_highlighting.ts +++ b/packages/highlightjs/src/syntax_highlighting.ts @@ -3,7 +3,7 @@ import type { LanguageFn } from "highlight.js"; type MimeRecord = Record Promise<{ default: LanguageFn}>) | null>; -const byMimeType: MimeRecord = { +export const byMimeType: MimeRecord = { "text/plain": () => import("highlight.js/lib/languages/plaintext"), "application/dart": () => import("highlight.js/lib/languages/dart"), "application/edn": () => import("highlight.js/lib/languages/clojure"),