Create a gerrit theme for CodeMirror
It highlights more. To name one it does extra with is propertyName.
It also tries to align with what we do for highlight.js.
Depends-On: Ibf3b98ff6a3f2edf093bf212b5f96bc4ef315547
Change-Id: Ie2873fece99f755805afa915fe1f052d531797ed
diff --git a/web/element/extensions.ts b/web/element/extensions.ts
index 5d0593a..64b998c 100644
--- a/web/element/extensions.ts
+++ b/web/element/extensions.ts
@@ -15,13 +15,13 @@
} from '@codemirror/view';
import {EditorState, Extension} from '@codemirror/state';
import {
- defaultHighlightStyle,
indentOnInput,
foldGutter,
foldKeymap,
bracketMatching,
syntaxHighlighting,
indentUnit,
+ HighlightStyle,
} from '@codemirror/language';
import {
defaultKeymap,
@@ -34,6 +34,7 @@
import {rulerPlugin} from './ruler';
import {language} from './language';
import {EditPreferencesInfo} from './codemirror-element';
+import {tags as t} from '@lezer/highlight';
const colorTheme = (dark: boolean) =>
EditorView.theme(
@@ -98,6 +99,43 @@
},
});
+export const gerritTheme = HighlightStyle.define([
+ {tag: [t.standard(t.tagName), t.tagName], color: 'var(--syntax-tag-color)'},
+ {tag: t.comment, color: 'var(--syntax-comment-color)'},
+ {tag: [t.className, t.propertyName], color: 'var(--syntax-attr-color)'},
+ {tag: t.variableName, color: 'var(--syntax-variable-color)'},
+ {tag: [t.attributeName, t.operator], color: 'var(--syntax-attr-color)'},
+ {tag: t.number, color: 'var(--syntax-number-color)'},
+ {tag: t.keyword, color: 'var(--syntax-keyword-color)'},
+ {tag: t.typeName, color: 'var(--syntax-type-color)'},
+ {tag: t.typeOperator, color: 'blue'},
+ {tag: t.string, color: 'var(--syntax-string-color)'},
+ {tag: t.regexp, color: 'var(--syntax-regexp-color)'},
+ {tag: t.meta, color: 'var(--syntax-meta-color)'},
+ {tag: [t.name, t.quote], color: 'var(--syntax-title-color)'},
+ {tag: t.definition(t.variableName), color: '#00f'},
+ {tag: t.local(t.variableName), color: '#30a'},
+ {tag: t.definition(t.propertyName), color: '#00c'},
+ {
+ tag: [t.heading, t.strong],
+ color: 'var(--syntax-strong-color)',
+ fontWeight: 'bold',
+ },
+ {tag: t.emphasis, fontStyle: 'italic'},
+ {tag: t.deleted, color: '#a11'},
+ {tag: t.inserted, color: '#164'},
+ {tag: t.literal, color: 'var(--syntax-literal-color)'},
+ {
+ tag: [t.atom, t.bool, t.special(t.variableName)],
+ color: 'var(--syntax-literal-color)',
+ },
+ {tag: [t.url, t.escape, t.link], color: 'var(--syntax-string-color)'},
+ {tag: t.special(t.string), color: '#e40'},
+ {tag: t.link, textDecoration: 'underline'},
+ {tag: t.strikethrough, textDecoration: 'line-through'},
+ {tag: t.invalid, color: '#f00'},
+]);
+
export const extensions = (
height: number,
prefs?: EditPreferencesInfo,
@@ -151,7 +189,7 @@
if (prefs.syntax_highlighting && language(fileType)) {
codeExtensions.push(
language(fileType) as Extension,
- syntaxHighlighting(defaultHighlightStyle, {fallback: true})
+ syntaxHighlighting(gerritTheme, {fallback: true})
);
}