1 import {tags} from "@lezer/highlight";
2 import {HighlightStyle, syntaxHighlighting} from "@codemirror/language";
3 import {EditorView} from "@codemirror/view";
4 import {oneDarkHighlightStyle, oneDarkTheme} from "@codemirror/theme-one-dark";
6 const defaultLightHighlightStyle = HighlightStyle.define([
10 textDecoration: "underline" },
12 textDecoration: "underline",
15 fontStyle: "italic" },
18 { tag: tags.strikethrough,
19 textDecoration: "line-through" },
22 { tag: [tags.atom, tags.bool, tags.url, tags.contentSeparator, tags.labelName],
24 { tag: [tags.literal, tags.inserted],
26 { tag: [tags.string, tags.deleted],
28 { tag: [tags.regexp, tags.escape, tags.special(tags.string)],
30 { tag: tags.definition(tags.variableName),
32 { tag: tags.local(tags.variableName),
34 { tag: [tags.typeName, tags.namespace],
36 { tag: tags.className,
38 { tag: [tags.special(tags.variableName), tags.macroName],
40 { tag: tags.definition(tags.propertyName),
42 { tag: tags.compareOperator,
50 const defaultThemeSpec = {
63 * Get the theme extension to use for editor view instance.
64 * @returns {Extension[]}
66 export function getTheme(viewParentEl) {
67 const darkMode = document.documentElement.classList.contains('dark-mode');
68 let viewTheme = darkMode ? oneDarkTheme : EditorView.theme(defaultThemeSpec);
69 let highlightStyle = darkMode ? oneDarkHighlightStyle : defaultLightHighlightStyle;
72 darkModeActive: darkMode,
73 registerViewTheme(builder) {
74 const spec = builder();
76 viewTheme = EditorView.theme(spec);
79 registerHighlightStyle(builder) {
80 const tagStyles = builder(tags) || [];
81 if (tagStyles.length) {
82 highlightStyle = HighlightStyle.define(tagStyles);
87 window.$events.emitPublic(viewParentEl, 'library-cm6::configure-theme', eventData);
89 return [viewTheme, syntaxHighlighting(highlightStyle)];