refactor: init environment highlighter

This commit is contained in:
liyasthomas
2021-12-11 07:26:18 +05:30
parent 50a57433d0
commit 8a7f3927b1
2 changed files with 55 additions and 4 deletions

View File

@@ -33,7 +33,10 @@ import { isJSONContentType } from "../utils/contenttypes"
import { Completer } from "./completion"
import { LinterDefinition } from "./linting/linter"
import { basicSetup, baseTheme, baseHighlightStyle } from "./themes/baseTheme"
import { environmentTooltip } from "./extensions/environmentTooltip"
import {
environmentHighlightStyle,
environmentTooltip,
} from "./extensions/environmentTooltip"
type ExtendedEditorConfig = {
mode: string
@@ -176,6 +179,7 @@ export function useCodemirror(
baseTheme,
baseHighlightStyle,
environmentTooltip,
environmentHighlightStyle,
ViewPlugin.fromClass(
class {
update(update: ViewUpdate) {

View File

@@ -1,5 +1,14 @@
import { Extension } from "@codemirror/state"
import { hoverTooltip } from "@codemirror/tooltip"
import {
Decoration,
EditorView,
MatchDecorator,
PluginField,
ViewPlugin,
ViewUpdate,
WidgetType,
} from "@codemirror/view"
import { useReadonlyStream } from "~/helpers/utils/composables"
import { aggregateEnvs$ } from "~/newstore/environments"
@@ -11,8 +20,11 @@ const cursorTooltipField = hoverTooltip((view, pos, side) => {
while (start > from && /\w/.test(text[start - from - 1])) start--
while (end < to && /\w/.test(text[end - from])) end++
if ((start === pos && side < 0) || (end === pos && side > 0)) return null
if (!/(<<\w+>>)/g.test(text.slice(start - from - 2, end - from + 2)))
if (
(start === pos && side < 0) ||
(end === pos && side > 0) ||
!/(<<\w+>>)/g.test(text.slice(start - from - 2, end - from + 2))
)
return null
const aggregateEnvs = useReadonlyStream(aggregateEnvs$, null)
@@ -52,4 +64,39 @@ function getEnvValue(value: string) {
return "not found"
}
export const environmentTooltip: Extension = cursorTooltipField
const environmentDecorator = new MatchDecorator({
// eslint-disable-next-line prefer-regex-literals
regexp: new RegExp(/(<<\w+>>)/g),
decoration: () =>
Decoration.replace({
widget: new (class extends WidgetType {
toDOM(_view: EditorView) {
const element = document.createElement("span")
element.textContent = "view"
return element
}
})(),
inclusive: false,
}),
})
export const environmentHighlightStyle = ViewPlugin.define(
(view: EditorView) => ({
decorations: environmentDecorator.createDeco(view),
update(_update: ViewUpdate) {
this.decorations = environmentDecorator.updateDeco(
_update,
this.decorations
)
},
}),
{
decorations: (v) => v.decorations,
provide: PluginField.atomicRanges.from((v) => v.decorations),
}
)
export const environmentTooltip: Extension = [
cursorTooltipField,
environmentHighlightStyle,
]