editor/index.js

177 lines
4.4 KiB
JavaScript
Raw Permalink Normal View History

2023-04-13 16:08:17 +08:00
import {
EditorView,
lineNumbers,
drawSelection,
keymap
} from '@codemirror/view'
import {
history,
defaultKeymap,
standardKeymap,
historyKeymap,
indentWithTab
} from '@codemirror/commands'
import {
foldGutter,
indentOnInput,
syntaxHighlighting,
HighlightStyle
} from '@codemirror/language'
import { tags as t } from '@lezer/highlight'
import { css } from '@codemirror/lang-css'
import { javascript } from '@codemirror/lang-javascript'
import { vue } from '@codemirror/lang-vue'
import { html } from '@codemirror/lang-html'
const chalky = '#e5c07b',
blue = '#0096ff',
strings = '#53c659',
whiskey = '#d19a66',
darkBackground = '#f2f5fc',
highlightBackground = '#80CBC440',
foreground = '#546e7a', //
background = '#fff',
tooltipBackground = '#353a42',
selection = '#80CBC440',
cursor = '#35373b',
keyword = '#ff5370',
property = '#8796B0'
const onePlain = EditorView.theme({
'&': {
color: foreground,
backgroundColor: background
},
'.cm-content': {
caretColor: cursor
},
'.cm-cursor, .cm-dropCursor': { borderLeftColor: cursor },
'&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection':
{ backgroundColor: selection },
'.cm-panels': { backgroundColor: darkBackground, color: foreground },
'.cm-panels.cm-panels-top': { borderBottom: '2px solid black' },
'.cm-panels.cm-panels-bottom': { borderTop: '2px solid black' },
'.cm-searchMatch': {
backgroundColor: '#72a1ff59',
outline: '1px solid #457dff'
},
'.cm-searchMatch.cm-searchMatch-selected': {
backgroundColor: '#6199ff2f'
},
'.cm-activeLine': { backgroundColor: '#6699ff0b' },
'.cm-selectionMatch': { backgroundColor: '#aafe661a' },
'&.cm-focused .cm-matchingBracket, &.cm-focused .cm-nonmatchingBracket': {
backgroundColor: '#bad0f847'
},
'.cm-gutters': {
backgroundColor: darkBackground,
color: foreground,
border: 'none'
},
'.cm-activeLineGutter': {
backgroundColor: highlightBackground
},
'.cm-foldPlaceholder': {
backgroundColor: 'transparent',
border: 'none',
color: '#ddd'
},
'.cm-tooltip': {
border: 'none',
backgroundColor: tooltipBackground
},
'.cm-tooltip .cm-tooltip-arrow:before': {
borderTopColor: 'transparent',
borderBottomColor: 'transparent'
},
'.cm-tooltip .cm-tooltip-arrow:after': {
borderTopColor: tooltipBackground,
borderBottomColor: tooltipBackground
},
'.cm-tooltip-autocomplete': {
'& > ul > li[aria-selected]': {
backgroundColor: highlightBackground,
color: foreground
}
}
})
const onePlainHighlight = HighlightStyle.define([
{ tag: t.keyword, color: keyword },
{
tag: [t.name, t.deleted, t.character, t.propertyName, t.macroName],
color: property,
fontWeight: 'bold'
},
{
tag: [t.attributeName],
color: '#ffb62c'
},
{ tag: [t.function(t.variableName), t.labelName], color: blue },
{ tag: [t.color, t.constant(t.name), t.standard(t.name)], color: whiskey },
{ tag: [t.definition(t.name), t.separator], color: foreground },
{ tag: [t.typeName], color: keyword },
{ tag: [t.number, t.atom, t.bool], fontStyle: 'italic', color: '#7c4dff' },
{
tag: [t.className, t.namespace, t.self],
fontStyle: 'italic',
fontWeight: 'bold',
color: '#ffb62c'
},
{
tag: [t.changed, t.annotation, t.modifier],
color: chalky
},
{
tag: [
t.operator,
t.operatorKeyword,
t.url,
t.escape,
t.regexp,
t.link,
t.special(t.string)
],
color: keyword
},
{ tag: [t.meta, t.comment], fontStyle: 'italic', color: '#b6d5e0' },
{ tag: t.strong, fontWeight: 'bold' },
{ tag: t.emphasis, fontStyle: 'italic' },
{ tag: t.strikethrough, textDecoration: 'line-through' },
{ tag: t.link, color: foreground, textDecoration: 'underline' },
{ tag: t.heading, fontWeight: 'bold', color: property },
{ tag: [t.special(t.variableName)], color: whiskey },
{ tag: [t.processingInstruction, t.string, t.inserted], color: strings },
{ tag: t.invalid, color: foreground }
])
export function minimalSetup(...args) {
return [
lineNumbers(),
foldGutter(),
indentOnInput(),
history(),
drawSelection(),
...args,
[onePlain, syntaxHighlighting(onePlainHighlight)],
keymap.of([
...standardKeymap,
...defaultKeymap,
indentWithTab,
...historyKeymap
])
]
}
export { EditorView, css, html, javascript, vue }