@prosemark/core 0.0.0 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.d.ts +94 -8
- package/dist/main.js +3933 -0
- package/package.json +25 -28
- package/dist/basicSetup.d.ts +0 -9
- package/dist/classBasedEventHandler.d.ts +0 -1
- package/dist/clickLink.d.ts +0 -1
- package/dist/codeFenceExtension.d.ts +0 -3
- package/dist/fold/blockQuote.d.ts +0 -1
- package/dist/fold/bulletList.d.ts +0 -1
- package/dist/fold/core.d.ts +0 -14
- package/dist/fold/emoji.d.ts +0 -3
- package/dist/fold/horizontalRule.d.ts +0 -1
- package/dist/fold/image.d.ts +0 -1
- package/dist/fold/index.d.ts +0 -7
- package/dist/fold/task.d.ts +0 -1
- package/dist/hide/core.d.ts +0 -14
- package/dist/hide/index.d.ts +0 -3
- package/dist/main.mjs +0 -4209
- package/dist/main.mjs.map +0 -1
- package/dist/markdownTags.d.ts +0 -11
- package/dist/syntaxHighlighting.d.ts +0 -8
- package/dist/utils.d.ts +0 -15
package/dist/main.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"main.mjs","sources":["../../../node_modules/crelt/index.js","../../../node_modules/@codemirror/search/dist/index.js","../../../node_modules/@codemirror/autocomplete/dist/index.js","../../../node_modules/@codemirror/lint/dist/index.js","../lib/utils.ts","../lib/hide/core.ts","../lib/markdownTags.ts","../lib/hide/index.ts","../lib/fold/core.ts","../lib/fold/bulletList.ts","../lib/fold/emoji.ts","../lib/fold/horizontalRule.ts","../lib/fold/image.ts","../lib/fold/task.ts","../lib/fold/blockQuote.ts","../lib/syntaxHighlighting.ts","../lib/clickLink.ts","../lib/codeFenceExtension.ts","../lib/basicSetup.ts"],"sourcesContent":["export default function crelt() {\n var elt = arguments[0]\n if (typeof elt == \"string\") elt = document.createElement(elt)\n var i = 1, next = arguments[1]\n if (next && typeof next == \"object\" && next.nodeType == null && !Array.isArray(next)) {\n for (var name in next) if (Object.prototype.hasOwnProperty.call(next, name)) {\n var value = next[name]\n if (typeof value == \"string\") elt.setAttribute(name, value)\n else if (value != null) elt[name] = value\n }\n i++\n }\n for (; i < arguments.length; i++) add(elt, arguments[i])\n return elt\n}\n\nfunction add(elt, child) {\n if (typeof child == \"string\") {\n elt.appendChild(document.createTextNode(child))\n } else if (child == null) {\n } else if (child.nodeType != null) {\n elt.appendChild(child)\n } else if (Array.isArray(child)) {\n for (var i = 0; i < child.length; i++) add(elt, child[i])\n } else {\n throw new RangeError(\"Unsupported child node: \" + child)\n }\n}\n","import { showPanel, EditorView, getPanel, Decoration, ViewPlugin, runScopeHandlers } from '@codemirror/view';\nimport { codePointAt, fromCodePoint, codePointSize, StateEffect, StateField, EditorSelection, Facet, combineConfig, CharCategory, RangeSetBuilder, Prec, EditorState, findClusterBreak } from '@codemirror/state';\nimport elt from 'crelt';\n\nconst basicNormalize = typeof String.prototype.normalize == \"function\"\n ? x => x.normalize(\"NFKD\") : x => x;\n/**\nA search cursor provides an iterator over text matches in a\ndocument.\n*/\nclass SearchCursor {\n /**\n Create a text cursor. The query is the search string, `from` to\n `to` provides the region to search.\n \n When `normalize` is given, it will be called, on both the query\n string and the content it is matched against, before comparing.\n You can, for example, create a case-insensitive search by\n passing `s => s.toLowerCase()`.\n \n Text is always normalized with\n [`.normalize(\"NFKD\")`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize)\n (when supported).\n */\n constructor(text, query, from = 0, to = text.length, normalize, test) {\n this.test = test;\n /**\n The current match (only holds a meaningful value after\n [`next`](https://codemirror.net/6/docs/ref/#search.SearchCursor.next) has been called and when\n `done` is false).\n */\n this.value = { from: 0, to: 0 };\n /**\n Whether the end of the iterated region has been reached.\n */\n this.done = false;\n this.matches = [];\n this.buffer = \"\";\n this.bufferPos = 0;\n this.iter = text.iterRange(from, to);\n this.bufferStart = from;\n this.normalize = normalize ? x => normalize(basicNormalize(x)) : basicNormalize;\n this.query = this.normalize(query);\n }\n peek() {\n if (this.bufferPos == this.buffer.length) {\n this.bufferStart += this.buffer.length;\n this.iter.next();\n if (this.iter.done)\n return -1;\n this.bufferPos = 0;\n this.buffer = this.iter.value;\n }\n return codePointAt(this.buffer, this.bufferPos);\n }\n /**\n Look for the next match. Updates the iterator's\n [`value`](https://codemirror.net/6/docs/ref/#search.SearchCursor.value) and\n [`done`](https://codemirror.net/6/docs/ref/#search.SearchCursor.done) properties. Should be called\n at least once before using the cursor.\n */\n next() {\n while (this.matches.length)\n this.matches.pop();\n return this.nextOverlapping();\n }\n /**\n The `next` method will ignore matches that partially overlap a\n previous match. This method behaves like `next`, but includes\n such matches.\n */\n nextOverlapping() {\n for (;;) {\n let next = this.peek();\n if (next < 0) {\n this.done = true;\n return this;\n }\n let str = fromCodePoint(next), start = this.bufferStart + this.bufferPos;\n this.bufferPos += codePointSize(next);\n let norm = this.normalize(str);\n if (norm.length)\n for (let i = 0, pos = start;; i++) {\n let code = norm.charCodeAt(i);\n let match = this.match(code, pos, this.bufferPos + this.bufferStart);\n if (i == norm.length - 1) {\n if (match) {\n this.value = match;\n return this;\n }\n break;\n }\n if (pos == start && i < str.length && str.charCodeAt(i) == code)\n pos++;\n }\n }\n }\n match(code, pos, end) {\n let match = null;\n for (let i = 0; i < this.matches.length; i += 2) {\n let index = this.matches[i], keep = false;\n if (this.query.charCodeAt(index) == code) {\n if (index == this.query.length - 1) {\n match = { from: this.matches[i + 1], to: end };\n }\n else {\n this.matches[i]++;\n keep = true;\n }\n }\n if (!keep) {\n this.matches.splice(i, 2);\n i -= 2;\n }\n }\n if (this.query.charCodeAt(0) == code) {\n if (this.query.length == 1)\n match = { from: pos, to: end };\n else\n this.matches.push(1, pos);\n }\n if (match && this.test && !this.test(match.from, match.to, this.buffer, this.bufferStart))\n match = null;\n return match;\n }\n}\nif (typeof Symbol != \"undefined\")\n SearchCursor.prototype[Symbol.iterator] = function () { return this; };\n\nconst empty = { from: -1, to: -1, match: /*@__PURE__*//.*/.exec(\"\") };\nconst baseFlags = \"gm\" + (/x/.unicode == null ? \"\" : \"u\");\n/**\nThis class is similar to [`SearchCursor`](https://codemirror.net/6/docs/ref/#search.SearchCursor)\nbut searches for a regular expression pattern instead of a plain\nstring.\n*/\nclass RegExpCursor {\n /**\n Create a cursor that will search the given range in the given\n document. `query` should be the raw pattern (as you'd pass it to\n `new RegExp`).\n */\n constructor(text, query, options, from = 0, to = text.length) {\n this.text = text;\n this.to = to;\n this.curLine = \"\";\n /**\n Set to `true` when the cursor has reached the end of the search\n range.\n */\n this.done = false;\n /**\n Will contain an object with the extent of the match and the\n match object when [`next`](https://codemirror.net/6/docs/ref/#search.RegExpCursor.next)\n sucessfully finds a match.\n */\n this.value = empty;\n if (/\\\\[sWDnr]|\\n|\\r|\\[\\^/.test(query))\n return new MultilineRegExpCursor(text, query, options, from, to);\n this.re = new RegExp(query, baseFlags + ((options === null || options === void 0 ? void 0 : options.ignoreCase) ? \"i\" : \"\"));\n this.test = options === null || options === void 0 ? void 0 : options.test;\n this.iter = text.iter();\n let startLine = text.lineAt(from);\n this.curLineStart = startLine.from;\n this.matchPos = toCharEnd(text, from);\n this.getLine(this.curLineStart);\n }\n getLine(skip) {\n this.iter.next(skip);\n if (this.iter.lineBreak) {\n this.curLine = \"\";\n }\n else {\n this.curLine = this.iter.value;\n if (this.curLineStart + this.curLine.length > this.to)\n this.curLine = this.curLine.slice(0, this.to - this.curLineStart);\n this.iter.next();\n }\n }\n nextLine() {\n this.curLineStart = this.curLineStart + this.curLine.length + 1;\n if (this.curLineStart > this.to)\n this.curLine = \"\";\n else\n this.getLine(0);\n }\n /**\n Move to the next match, if there is one.\n */\n next() {\n for (let off = this.matchPos - this.curLineStart;;) {\n this.re.lastIndex = off;\n let match = this.matchPos <= this.to && this.re.exec(this.curLine);\n if (match) {\n let from = this.curLineStart + match.index, to = from + match[0].length;\n this.matchPos = toCharEnd(this.text, to + (from == to ? 1 : 0));\n if (from == this.curLineStart + this.curLine.length)\n this.nextLine();\n if ((from < to || from > this.value.to) && (!this.test || this.test(from, to, match))) {\n this.value = { from, to, match };\n return this;\n }\n off = this.matchPos - this.curLineStart;\n }\n else if (this.curLineStart + this.curLine.length < this.to) {\n this.nextLine();\n off = 0;\n }\n else {\n this.done = true;\n return this;\n }\n }\n }\n}\nconst flattened = /*@__PURE__*/new WeakMap();\n// Reusable (partially) flattened document strings\nclass FlattenedDoc {\n constructor(from, text) {\n this.from = from;\n this.text = text;\n }\n get to() { return this.from + this.text.length; }\n static get(doc, from, to) {\n let cached = flattened.get(doc);\n if (!cached || cached.from >= to || cached.to <= from) {\n let flat = new FlattenedDoc(from, doc.sliceString(from, to));\n flattened.set(doc, flat);\n return flat;\n }\n if (cached.from == from && cached.to == to)\n return cached;\n let { text, from: cachedFrom } = cached;\n if (cachedFrom > from) {\n text = doc.sliceString(from, cachedFrom) + text;\n cachedFrom = from;\n }\n if (cached.to < to)\n text += doc.sliceString(cached.to, to);\n flattened.set(doc, new FlattenedDoc(cachedFrom, text));\n return new FlattenedDoc(from, text.slice(from - cachedFrom, to - cachedFrom));\n }\n}\nclass MultilineRegExpCursor {\n constructor(text, query, options, from, to) {\n this.text = text;\n this.to = to;\n this.done = false;\n this.value = empty;\n this.matchPos = toCharEnd(text, from);\n this.re = new RegExp(query, baseFlags + ((options === null || options === void 0 ? void 0 : options.ignoreCase) ? \"i\" : \"\"));\n this.test = options === null || options === void 0 ? void 0 : options.test;\n this.flat = FlattenedDoc.get(text, from, this.chunkEnd(from + 5000 /* Chunk.Base */));\n }\n chunkEnd(pos) {\n return pos >= this.to ? this.to : this.text.lineAt(pos).to;\n }\n next() {\n for (;;) {\n let off = this.re.lastIndex = this.matchPos - this.flat.from;\n let match = this.re.exec(this.flat.text);\n // Skip empty matches directly after the last match\n if (match && !match[0] && match.index == off) {\n this.re.lastIndex = off + 1;\n match = this.re.exec(this.flat.text);\n }\n if (match) {\n let from = this.flat.from + match.index, to = from + match[0].length;\n // If a match goes almost to the end of a noncomplete chunk, try\n // again, since it'll likely be able to match more\n if ((this.flat.to >= this.to || match.index + match[0].length <= this.flat.text.length - 10) &&\n (!this.test || this.test(from, to, match))) {\n this.value = { from, to, match };\n this.matchPos = toCharEnd(this.text, to + (from == to ? 1 : 0));\n return this;\n }\n }\n if (this.flat.to == this.to) {\n this.done = true;\n return this;\n }\n // Grow the flattened doc\n this.flat = FlattenedDoc.get(this.text, this.flat.from, this.chunkEnd(this.flat.from + this.flat.text.length * 2));\n }\n }\n}\nif (typeof Symbol != \"undefined\") {\n RegExpCursor.prototype[Symbol.iterator] = MultilineRegExpCursor.prototype[Symbol.iterator] =\n function () { return this; };\n}\nfunction validRegExp(source) {\n try {\n new RegExp(source, baseFlags);\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nfunction toCharEnd(text, pos) {\n if (pos >= text.length)\n return pos;\n let line = text.lineAt(pos), next;\n while (pos < line.to && (next = line.text.charCodeAt(pos - line.from)) >= 0xDC00 && next < 0xE000)\n pos++;\n return pos;\n}\n\nfunction createLineDialog(view) {\n let line = String(view.state.doc.lineAt(view.state.selection.main.head).number);\n let input = elt(\"input\", { class: \"cm-textfield\", name: \"line\", value: line });\n let dom = elt(\"form\", {\n class: \"cm-gotoLine\",\n onkeydown: (event) => {\n if (event.keyCode == 27) { // Escape\n event.preventDefault();\n view.dispatch({ effects: dialogEffect.of(false) });\n view.focus();\n }\n else if (event.keyCode == 13) { // Enter\n event.preventDefault();\n go();\n }\n },\n onsubmit: (event) => {\n event.preventDefault();\n go();\n }\n }, elt(\"label\", view.state.phrase(\"Go to line\"), \": \", input), \" \", elt(\"button\", { class: \"cm-button\", type: \"submit\" }, view.state.phrase(\"go\")), elt(\"button\", {\n name: \"close\",\n onclick: () => {\n view.dispatch({ effects: dialogEffect.of(false) });\n view.focus();\n },\n \"aria-label\": view.state.phrase(\"close\"),\n type: \"button\"\n }, [\"×\"]));\n function go() {\n let match = /^([+-])?(\\d+)?(:\\d+)?(%)?$/.exec(input.value);\n if (!match)\n return;\n let { state } = view, startLine = state.doc.lineAt(state.selection.main.head);\n let [, sign, ln, cl, percent] = match;\n let col = cl ? +cl.slice(1) : 0;\n let line = ln ? +ln : startLine.number;\n if (ln && percent) {\n let pc = line / 100;\n if (sign)\n pc = pc * (sign == \"-\" ? -1 : 1) + (startLine.number / state.doc.lines);\n line = Math.round(state.doc.lines * pc);\n }\n else if (ln && sign) {\n line = line * (sign == \"-\" ? -1 : 1) + startLine.number;\n }\n let docLine = state.doc.line(Math.max(1, Math.min(state.doc.lines, line)));\n let selection = EditorSelection.cursor(docLine.from + Math.max(0, Math.min(col, docLine.length)));\n view.dispatch({\n effects: [dialogEffect.of(false), EditorView.scrollIntoView(selection.from, { y: 'center' })],\n selection,\n });\n view.focus();\n }\n return { dom };\n}\nconst dialogEffect = /*@__PURE__*/StateEffect.define();\nconst dialogField = /*@__PURE__*/StateField.define({\n create() { return true; },\n update(value, tr) {\n for (let e of tr.effects)\n if (e.is(dialogEffect))\n value = e.value;\n return value;\n },\n provide: f => showPanel.from(f, val => val ? createLineDialog : null)\n});\n/**\nCommand that shows a dialog asking the user for a line number, and\nwhen a valid position is provided, moves the cursor to that line.\n\nSupports line numbers, relative line offsets prefixed with `+` or\n`-`, document percentages suffixed with `%`, and an optional\ncolumn position by adding `:` and a second number after the line\nnumber.\n*/\nconst gotoLine = view => {\n let panel = getPanel(view, createLineDialog);\n if (!panel) {\n let effects = [dialogEffect.of(true)];\n if (view.state.field(dialogField, false) == null)\n effects.push(StateEffect.appendConfig.of([dialogField, baseTheme$1]));\n view.dispatch({ effects });\n panel = getPanel(view, createLineDialog);\n }\n if (panel)\n panel.dom.querySelector(\"input\").select();\n return true;\n};\nconst baseTheme$1 = /*@__PURE__*/EditorView.baseTheme({\n \".cm-panel.cm-gotoLine\": {\n padding: \"2px 6px 4px\",\n position: \"relative\",\n \"& label\": { fontSize: \"80%\" },\n \"& [name=close]\": {\n position: \"absolute\",\n top: \"0\", bottom: \"0\",\n right: \"4px\",\n backgroundColor: \"inherit\",\n border: \"none\",\n font: \"inherit\",\n padding: \"0\"\n }\n }\n});\n\nconst defaultHighlightOptions = {\n highlightWordAroundCursor: false,\n minSelectionLength: 1,\n maxMatches: 100,\n wholeWords: false\n};\nconst highlightConfig = /*@__PURE__*/Facet.define({\n combine(options) {\n return combineConfig(options, defaultHighlightOptions, {\n highlightWordAroundCursor: (a, b) => a || b,\n minSelectionLength: Math.min,\n maxMatches: Math.min\n });\n }\n});\n/**\nThis extension highlights text that matches the selection. It uses\nthe `\"cm-selectionMatch\"` class for the highlighting. When\n`highlightWordAroundCursor` is enabled, the word at the cursor\nitself will be highlighted with `\"cm-selectionMatch-main\"`.\n*/\nfunction highlightSelectionMatches(options) {\n let ext = [defaultTheme, matchHighlighter];\n if (options)\n ext.push(highlightConfig.of(options));\n return ext;\n}\nconst matchDeco = /*@__PURE__*/Decoration.mark({ class: \"cm-selectionMatch\" });\nconst mainMatchDeco = /*@__PURE__*/Decoration.mark({ class: \"cm-selectionMatch cm-selectionMatch-main\" });\n// Whether the characters directly outside the given positions are non-word characters\nfunction insideWordBoundaries(check, state, from, to) {\n return (from == 0 || check(state.sliceDoc(from - 1, from)) != CharCategory.Word) &&\n (to == state.doc.length || check(state.sliceDoc(to, to + 1)) != CharCategory.Word);\n}\n// Whether the characters directly at the given positions are word characters\nfunction insideWord(check, state, from, to) {\n return check(state.sliceDoc(from, from + 1)) == CharCategory.Word\n && check(state.sliceDoc(to - 1, to)) == CharCategory.Word;\n}\nconst matchHighlighter = /*@__PURE__*/ViewPlugin.fromClass(class {\n constructor(view) {\n this.decorations = this.getDeco(view);\n }\n update(update) {\n if (update.selectionSet || update.docChanged || update.viewportChanged)\n this.decorations = this.getDeco(update.view);\n }\n getDeco(view) {\n let conf = view.state.facet(highlightConfig);\n let { state } = view, sel = state.selection;\n if (sel.ranges.length > 1)\n return Decoration.none;\n let range = sel.main, query, check = null;\n if (range.empty) {\n if (!conf.highlightWordAroundCursor)\n return Decoration.none;\n let word = state.wordAt(range.head);\n if (!word)\n return Decoration.none;\n check = state.charCategorizer(range.head);\n query = state.sliceDoc(word.from, word.to);\n }\n else {\n let len = range.to - range.from;\n if (len < conf.minSelectionLength || len > 200)\n return Decoration.none;\n if (conf.wholeWords) {\n query = state.sliceDoc(range.from, range.to); // TODO: allow and include leading/trailing space?\n check = state.charCategorizer(range.head);\n if (!(insideWordBoundaries(check, state, range.from, range.to) &&\n insideWord(check, state, range.from, range.to)))\n return Decoration.none;\n }\n else {\n query = state.sliceDoc(range.from, range.to);\n if (!query)\n return Decoration.none;\n }\n }\n let deco = [];\n for (let part of view.visibleRanges) {\n let cursor = new SearchCursor(state.doc, query, part.from, part.to);\n while (!cursor.next().done) {\n let { from, to } = cursor.value;\n if (!check || insideWordBoundaries(check, state, from, to)) {\n if (range.empty && from <= range.from && to >= range.to)\n deco.push(mainMatchDeco.range(from, to));\n else if (from >= range.to || to <= range.from)\n deco.push(matchDeco.range(from, to));\n if (deco.length > conf.maxMatches)\n return Decoration.none;\n }\n }\n }\n return Decoration.set(deco);\n }\n}, {\n decorations: v => v.decorations\n});\nconst defaultTheme = /*@__PURE__*/EditorView.baseTheme({\n \".cm-selectionMatch\": { backgroundColor: \"#99ff7780\" },\n \".cm-searchMatch .cm-selectionMatch\": { backgroundColor: \"transparent\" }\n});\n// Select the words around the cursors.\nconst selectWord = ({ state, dispatch }) => {\n let { selection } = state;\n let newSel = EditorSelection.create(selection.ranges.map(range => state.wordAt(range.head) || EditorSelection.cursor(range.head)), selection.mainIndex);\n if (newSel.eq(selection))\n return false;\n dispatch(state.update({ selection: newSel }));\n return true;\n};\n// Find next occurrence of query relative to last cursor. Wrap around\n// the document if there are no more matches.\nfunction findNextOccurrence(state, query) {\n let { main, ranges } = state.selection;\n let word = state.wordAt(main.head), fullWord = word && word.from == main.from && word.to == main.to;\n for (let cycled = false, cursor = new SearchCursor(state.doc, query, ranges[ranges.length - 1].to);;) {\n cursor.next();\n if (cursor.done) {\n if (cycled)\n return null;\n cursor = new SearchCursor(state.doc, query, 0, Math.max(0, ranges[ranges.length - 1].from - 1));\n cycled = true;\n }\n else {\n if (cycled && ranges.some(r => r.from == cursor.value.from))\n continue;\n if (fullWord) {\n let word = state.wordAt(cursor.value.from);\n if (!word || word.from != cursor.value.from || word.to != cursor.value.to)\n continue;\n }\n return cursor.value;\n }\n }\n}\n/**\nSelect next occurrence of the current selection. Expand selection\nto the surrounding word when the selection is empty.\n*/\nconst selectNextOccurrence = ({ state, dispatch }) => {\n let { ranges } = state.selection;\n if (ranges.some(sel => sel.from === sel.to))\n return selectWord({ state, dispatch });\n let searchedText = state.sliceDoc(ranges[0].from, ranges[0].to);\n if (state.selection.ranges.some(r => state.sliceDoc(r.from, r.to) != searchedText))\n return false;\n let range = findNextOccurrence(state, searchedText);\n if (!range)\n return false;\n dispatch(state.update({\n selection: state.selection.addRange(EditorSelection.range(range.from, range.to), false),\n effects: EditorView.scrollIntoView(range.to)\n }));\n return true;\n};\n\nconst searchConfigFacet = /*@__PURE__*/Facet.define({\n combine(configs) {\n return combineConfig(configs, {\n top: false,\n caseSensitive: false,\n literal: false,\n regexp: false,\n wholeWord: false,\n createPanel: view => new SearchPanel(view),\n scrollToMatch: range => EditorView.scrollIntoView(range)\n });\n }\n});\n/**\nAdd search state to the editor configuration, and optionally\nconfigure the search extension.\n([`openSearchPanel`](https://codemirror.net/6/docs/ref/#search.openSearchPanel) will automatically\nenable this if it isn't already on).\n*/\nfunction search(config) {\n return config ? [searchConfigFacet.of(config), searchExtensions] : searchExtensions;\n}\n/**\nA search query. Part of the editor's search state.\n*/\nclass SearchQuery {\n /**\n Create a query object.\n */\n constructor(config) {\n this.search = config.search;\n this.caseSensitive = !!config.caseSensitive;\n this.literal = !!config.literal;\n this.regexp = !!config.regexp;\n this.replace = config.replace || \"\";\n this.valid = !!this.search && (!this.regexp || validRegExp(this.search));\n this.unquoted = this.unquote(this.search);\n this.wholeWord = !!config.wholeWord;\n }\n /**\n @internal\n */\n unquote(text) {\n return this.literal ? text :\n text.replace(/\\\\([nrt\\\\])/g, (_, ch) => ch == \"n\" ? \"\\n\" : ch == \"r\" ? \"\\r\" : ch == \"t\" ? \"\\t\" : \"\\\\\");\n }\n /**\n Compare this query to another query.\n */\n eq(other) {\n return this.search == other.search && this.replace == other.replace &&\n this.caseSensitive == other.caseSensitive && this.regexp == other.regexp &&\n this.wholeWord == other.wholeWord;\n }\n /**\n @internal\n */\n create() {\n return this.regexp ? new RegExpQuery(this) : new StringQuery(this);\n }\n /**\n Get a search cursor for this query, searching through the given\n range in the given state.\n */\n getCursor(state, from = 0, to) {\n let st = state.doc ? state : EditorState.create({ doc: state });\n if (to == null)\n to = st.doc.length;\n return this.regexp ? regexpCursor(this, st, from, to) : stringCursor(this, st, from, to);\n }\n}\nclass QueryType {\n constructor(spec) {\n this.spec = spec;\n }\n}\nfunction stringCursor(spec, state, from, to) {\n return new SearchCursor(state.doc, spec.unquoted, from, to, spec.caseSensitive ? undefined : x => x.toLowerCase(), spec.wholeWord ? stringWordTest(state.doc, state.charCategorizer(state.selection.main.head)) : undefined);\n}\nfunction stringWordTest(doc, categorizer) {\n return (from, to, buf, bufPos) => {\n if (bufPos > from || bufPos + buf.length < to) {\n bufPos = Math.max(0, from - 2);\n buf = doc.sliceString(bufPos, Math.min(doc.length, to + 2));\n }\n return (categorizer(charBefore(buf, from - bufPos)) != CharCategory.Word ||\n categorizer(charAfter(buf, from - bufPos)) != CharCategory.Word) &&\n (categorizer(charAfter(buf, to - bufPos)) != CharCategory.Word ||\n categorizer(charBefore(buf, to - bufPos)) != CharCategory.Word);\n };\n}\nclass StringQuery extends QueryType {\n constructor(spec) {\n super(spec);\n }\n nextMatch(state, curFrom, curTo) {\n let cursor = stringCursor(this.spec, state, curTo, state.doc.length).nextOverlapping();\n if (cursor.done) {\n let end = Math.min(state.doc.length, curFrom + this.spec.unquoted.length);\n cursor = stringCursor(this.spec, state, 0, end).nextOverlapping();\n }\n return cursor.done || cursor.value.from == curFrom && cursor.value.to == curTo ? null : cursor.value;\n }\n // Searching in reverse is, rather than implementing an inverted search\n // cursor, done by scanning chunk after chunk forward.\n prevMatchInRange(state, from, to) {\n for (let pos = to;;) {\n let start = Math.max(from, pos - 10000 /* FindPrev.ChunkSize */ - this.spec.unquoted.length);\n let cursor = stringCursor(this.spec, state, start, pos), range = null;\n while (!cursor.nextOverlapping().done)\n range = cursor.value;\n if (range)\n return range;\n if (start == from)\n return null;\n pos -= 10000 /* FindPrev.ChunkSize */;\n }\n }\n prevMatch(state, curFrom, curTo) {\n let found = this.prevMatchInRange(state, 0, curFrom);\n if (!found)\n found = this.prevMatchInRange(state, Math.max(0, curTo - this.spec.unquoted.length), state.doc.length);\n return found && (found.from != curFrom || found.to != curTo) ? found : null;\n }\n getReplacement(_result) { return this.spec.unquote(this.spec.replace); }\n matchAll(state, limit) {\n let cursor = stringCursor(this.spec, state, 0, state.doc.length), ranges = [];\n while (!cursor.next().done) {\n if (ranges.length >= limit)\n return null;\n ranges.push(cursor.value);\n }\n return ranges;\n }\n highlight(state, from, to, add) {\n let cursor = stringCursor(this.spec, state, Math.max(0, from - this.spec.unquoted.length), Math.min(to + this.spec.unquoted.length, state.doc.length));\n while (!cursor.next().done)\n add(cursor.value.from, cursor.value.to);\n }\n}\nfunction regexpCursor(spec, state, from, to) {\n return new RegExpCursor(state.doc, spec.search, {\n ignoreCase: !spec.caseSensitive,\n test: spec.wholeWord ? regexpWordTest(state.charCategorizer(state.selection.main.head)) : undefined\n }, from, to);\n}\nfunction charBefore(str, index) {\n return str.slice(findClusterBreak(str, index, false), index);\n}\nfunction charAfter(str, index) {\n return str.slice(index, findClusterBreak(str, index));\n}\nfunction regexpWordTest(categorizer) {\n return (_from, _to, match) => !match[0].length ||\n (categorizer(charBefore(match.input, match.index)) != CharCategory.Word ||\n categorizer(charAfter(match.input, match.index)) != CharCategory.Word) &&\n (categorizer(charAfter(match.input, match.index + match[0].length)) != CharCategory.Word ||\n categorizer(charBefore(match.input, match.index + match[0].length)) != CharCategory.Word);\n}\nclass RegExpQuery extends QueryType {\n nextMatch(state, curFrom, curTo) {\n let cursor = regexpCursor(this.spec, state, curTo, state.doc.length).next();\n if (cursor.done)\n cursor = regexpCursor(this.spec, state, 0, curFrom).next();\n return cursor.done ? null : cursor.value;\n }\n prevMatchInRange(state, from, to) {\n for (let size = 1;; size++) {\n let start = Math.max(from, to - size * 10000 /* FindPrev.ChunkSize */);\n let cursor = regexpCursor(this.spec, state, start, to), range = null;\n while (!cursor.next().done)\n range = cursor.value;\n if (range && (start == from || range.from > start + 10))\n return range;\n if (start == from)\n return null;\n }\n }\n prevMatch(state, curFrom, curTo) {\n return this.prevMatchInRange(state, 0, curFrom) ||\n this.prevMatchInRange(state, curTo, state.doc.length);\n }\n getReplacement(result) {\n return this.spec.unquote(this.spec.replace).replace(/\\$([$&]|\\d+)/g, (m, i) => {\n if (i == \"&\")\n return result.match[0];\n if (i == \"$\")\n return \"$\";\n for (let l = i.length; l > 0; l--) {\n let n = +i.slice(0, l);\n if (n > 0 && n < result.match.length)\n return result.match[n] + i.slice(l);\n }\n return m;\n });\n }\n matchAll(state, limit) {\n let cursor = regexpCursor(this.spec, state, 0, state.doc.length), ranges = [];\n while (!cursor.next().done) {\n if (ranges.length >= limit)\n return null;\n ranges.push(cursor.value);\n }\n return ranges;\n }\n highlight(state, from, to, add) {\n let cursor = regexpCursor(this.spec, state, Math.max(0, from - 250 /* RegExp.HighlightMargin */), Math.min(to + 250 /* RegExp.HighlightMargin */, state.doc.length));\n while (!cursor.next().done)\n add(cursor.value.from, cursor.value.to);\n }\n}\n/**\nA state effect that updates the current search query. Note that\nthis only has an effect if the search state has been initialized\n(by including [`search`](https://codemirror.net/6/docs/ref/#search.search) in your configuration or\nby running [`openSearchPanel`](https://codemirror.net/6/docs/ref/#search.openSearchPanel) at least\nonce).\n*/\nconst setSearchQuery = /*@__PURE__*/StateEffect.define();\nconst togglePanel = /*@__PURE__*/StateEffect.define();\nconst searchState = /*@__PURE__*/StateField.define({\n create(state) {\n return new SearchState(defaultQuery(state).create(), null);\n },\n update(value, tr) {\n for (let effect of tr.effects) {\n if (effect.is(setSearchQuery))\n value = new SearchState(effect.value.create(), value.panel);\n else if (effect.is(togglePanel))\n value = new SearchState(value.query, effect.value ? createSearchPanel : null);\n }\n return value;\n },\n provide: f => showPanel.from(f, val => val.panel)\n});\n/**\nGet the current search query from an editor state.\n*/\nfunction getSearchQuery(state) {\n let curState = state.field(searchState, false);\n return curState ? curState.query.spec : defaultQuery(state);\n}\n/**\nQuery whether the search panel is open in the given editor state.\n*/\nfunction searchPanelOpen(state) {\n var _a;\n return ((_a = state.field(searchState, false)) === null || _a === void 0 ? void 0 : _a.panel) != null;\n}\nclass SearchState {\n constructor(query, panel) {\n this.query = query;\n this.panel = panel;\n }\n}\nconst matchMark = /*@__PURE__*/Decoration.mark({ class: \"cm-searchMatch\" }), selectedMatchMark = /*@__PURE__*/Decoration.mark({ class: \"cm-searchMatch cm-searchMatch-selected\" });\nconst searchHighlighter = /*@__PURE__*/ViewPlugin.fromClass(class {\n constructor(view) {\n this.view = view;\n this.decorations = this.highlight(view.state.field(searchState));\n }\n update(update) {\n let state = update.state.field(searchState);\n if (state != update.startState.field(searchState) || update.docChanged || update.selectionSet || update.viewportChanged)\n this.decorations = this.highlight(state);\n }\n highlight({ query, panel }) {\n if (!panel || !query.spec.valid)\n return Decoration.none;\n let { view } = this;\n let builder = new RangeSetBuilder();\n for (let i = 0, ranges = view.visibleRanges, l = ranges.length; i < l; i++) {\n let { from, to } = ranges[i];\n while (i < l - 1 && to > ranges[i + 1].from - 2 * 250 /* RegExp.HighlightMargin */)\n to = ranges[++i].to;\n query.highlight(view.state, from, to, (from, to) => {\n let selected = view.state.selection.ranges.some(r => r.from == from && r.to == to);\n builder.add(from, to, selected ? selectedMatchMark : matchMark);\n });\n }\n return builder.finish();\n }\n}, {\n decorations: v => v.decorations\n});\nfunction searchCommand(f) {\n return view => {\n let state = view.state.field(searchState, false);\n return state && state.query.spec.valid ? f(view, state) : openSearchPanel(view);\n };\n}\n/**\nOpen the search panel if it isn't already open, and move the\nselection to the first match after the current main selection.\nWill wrap around to the start of the document when it reaches the\nend.\n*/\nconst findNext = /*@__PURE__*/searchCommand((view, { query }) => {\n let { to } = view.state.selection.main;\n let next = query.nextMatch(view.state, to, to);\n if (!next)\n return false;\n let selection = EditorSelection.single(next.from, next.to);\n let config = view.state.facet(searchConfigFacet);\n view.dispatch({\n selection,\n effects: [announceMatch(view, next), config.scrollToMatch(selection.main, view)],\n userEvent: \"select.search\"\n });\n selectSearchInput(view);\n return true;\n});\n/**\nMove the selection to the previous instance of the search query,\nbefore the current main selection. Will wrap past the start\nof the document to start searching at the end again.\n*/\nconst findPrevious = /*@__PURE__*/searchCommand((view, { query }) => {\n let { state } = view, { from } = state.selection.main;\n let prev = query.prevMatch(state, from, from);\n if (!prev)\n return false;\n let selection = EditorSelection.single(prev.from, prev.to);\n let config = view.state.facet(searchConfigFacet);\n view.dispatch({\n selection,\n effects: [announceMatch(view, prev), config.scrollToMatch(selection.main, view)],\n userEvent: \"select.search\"\n });\n selectSearchInput(view);\n return true;\n});\n/**\nSelect all instances of the search query.\n*/\nconst selectMatches = /*@__PURE__*/searchCommand((view, { query }) => {\n let ranges = query.matchAll(view.state, 1000);\n if (!ranges || !ranges.length)\n return false;\n view.dispatch({\n selection: EditorSelection.create(ranges.map(r => EditorSelection.range(r.from, r.to))),\n userEvent: \"select.search.matches\"\n });\n return true;\n});\n/**\nSelect all instances of the currently selected text.\n*/\nconst selectSelectionMatches = ({ state, dispatch }) => {\n let sel = state.selection;\n if (sel.ranges.length > 1 || sel.main.empty)\n return false;\n let { from, to } = sel.main;\n let ranges = [], main = 0;\n for (let cur = new SearchCursor(state.doc, state.sliceDoc(from, to)); !cur.next().done;) {\n if (ranges.length > 1000)\n return false;\n if (cur.value.from == from)\n main = ranges.length;\n ranges.push(EditorSelection.range(cur.value.from, cur.value.to));\n }\n dispatch(state.update({\n selection: EditorSelection.create(ranges, main),\n userEvent: \"select.search.matches\"\n }));\n return true;\n};\n/**\nReplace the current match of the search query.\n*/\nconst replaceNext = /*@__PURE__*/searchCommand((view, { query }) => {\n let { state } = view, { from, to } = state.selection.main;\n if (state.readOnly)\n return false;\n let match = query.nextMatch(state, from, from);\n if (!match)\n return false;\n let next = match;\n let changes = [], selection, replacement;\n let effects = [];\n if (next.from == from && next.to == to) {\n replacement = state.toText(query.getReplacement(next));\n changes.push({ from: next.from, to: next.to, insert: replacement });\n next = query.nextMatch(state, next.from, next.to);\n effects.push(EditorView.announce.of(state.phrase(\"replaced match on line $\", state.doc.lineAt(from).number) + \".\"));\n }\n let changeSet = view.state.changes(changes);\n if (next) {\n selection = EditorSelection.single(next.from, next.to).map(changeSet);\n effects.push(announceMatch(view, next));\n effects.push(state.facet(searchConfigFacet).scrollToMatch(selection.main, view));\n }\n view.dispatch({\n changes: changeSet,\n selection,\n effects,\n userEvent: \"input.replace\"\n });\n return true;\n});\n/**\nReplace all instances of the search query with the given\nreplacement.\n*/\nconst replaceAll = /*@__PURE__*/searchCommand((view, { query }) => {\n if (view.state.readOnly)\n return false;\n let changes = query.matchAll(view.state, 1e9).map(match => {\n let { from, to } = match;\n return { from, to, insert: query.getReplacement(match) };\n });\n if (!changes.length)\n return false;\n let announceText = view.state.phrase(\"replaced $ matches\", changes.length) + \".\";\n view.dispatch({\n changes,\n effects: EditorView.announce.of(announceText),\n userEvent: \"input.replace.all\"\n });\n return true;\n});\nfunction createSearchPanel(view) {\n return view.state.facet(searchConfigFacet).createPanel(view);\n}\nfunction defaultQuery(state, fallback) {\n var _a, _b, _c, _d, _e;\n let sel = state.selection.main;\n let selText = sel.empty || sel.to > sel.from + 100 ? \"\" : state.sliceDoc(sel.from, sel.to);\n if (fallback && !selText)\n return fallback;\n let config = state.facet(searchConfigFacet);\n return new SearchQuery({\n search: ((_a = fallback === null || fallback === void 0 ? void 0 : fallback.literal) !== null && _a !== void 0 ? _a : config.literal) ? selText : selText.replace(/\\n/g, \"\\\\n\"),\n caseSensitive: (_b = fallback === null || fallback === void 0 ? void 0 : fallback.caseSensitive) !== null && _b !== void 0 ? _b : config.caseSensitive,\n literal: (_c = fallback === null || fallback === void 0 ? void 0 : fallback.literal) !== null && _c !== void 0 ? _c : config.literal,\n regexp: (_d = fallback === null || fallback === void 0 ? void 0 : fallback.regexp) !== null && _d !== void 0 ? _d : config.regexp,\n wholeWord: (_e = fallback === null || fallback === void 0 ? void 0 : fallback.wholeWord) !== null && _e !== void 0 ? _e : config.wholeWord\n });\n}\nfunction getSearchInput(view) {\n let panel = getPanel(view, createSearchPanel);\n return panel && panel.dom.querySelector(\"[main-field]\");\n}\nfunction selectSearchInput(view) {\n let input = getSearchInput(view);\n if (input && input == view.root.activeElement)\n input.select();\n}\n/**\nMake sure the search panel is open and focused.\n*/\nconst openSearchPanel = view => {\n let state = view.state.field(searchState, false);\n if (state && state.panel) {\n let searchInput = getSearchInput(view);\n if (searchInput && searchInput != view.root.activeElement) {\n let query = defaultQuery(view.state, state.query.spec);\n if (query.valid)\n view.dispatch({ effects: setSearchQuery.of(query) });\n searchInput.focus();\n searchInput.select();\n }\n }\n else {\n view.dispatch({ effects: [\n togglePanel.of(true),\n state ? setSearchQuery.of(defaultQuery(view.state, state.query.spec)) : StateEffect.appendConfig.of(searchExtensions)\n ] });\n }\n return true;\n};\n/**\nClose the search panel.\n*/\nconst closeSearchPanel = view => {\n let state = view.state.field(searchState, false);\n if (!state || !state.panel)\n return false;\n let panel = getPanel(view, createSearchPanel);\n if (panel && panel.dom.contains(view.root.activeElement))\n view.focus();\n view.dispatch({ effects: togglePanel.of(false) });\n return true;\n};\n/**\nDefault search-related key bindings.\n\n - Mod-f: [`openSearchPanel`](https://codemirror.net/6/docs/ref/#search.openSearchPanel)\n - F3, Mod-g: [`findNext`](https://codemirror.net/6/docs/ref/#search.findNext)\n - Shift-F3, Shift-Mod-g: [`findPrevious`](https://codemirror.net/6/docs/ref/#search.findPrevious)\n - Mod-Alt-g: [`gotoLine`](https://codemirror.net/6/docs/ref/#search.gotoLine)\n - Mod-d: [`selectNextOccurrence`](https://codemirror.net/6/docs/ref/#search.selectNextOccurrence)\n*/\nconst searchKeymap = [\n { key: \"Mod-f\", run: openSearchPanel, scope: \"editor search-panel\" },\n { key: \"F3\", run: findNext, shift: findPrevious, scope: \"editor search-panel\", preventDefault: true },\n { key: \"Mod-g\", run: findNext, shift: findPrevious, scope: \"editor search-panel\", preventDefault: true },\n { key: \"Escape\", run: closeSearchPanel, scope: \"editor search-panel\" },\n { key: \"Mod-Shift-l\", run: selectSelectionMatches },\n { key: \"Mod-Alt-g\", run: gotoLine },\n { key: \"Mod-d\", run: selectNextOccurrence, preventDefault: true },\n];\nclass SearchPanel {\n constructor(view) {\n this.view = view;\n let query = this.query = view.state.field(searchState).query.spec;\n this.commit = this.commit.bind(this);\n this.searchField = elt(\"input\", {\n value: query.search,\n placeholder: phrase(view, \"Find\"),\n \"aria-label\": phrase(view, \"Find\"),\n class: \"cm-textfield\",\n name: \"search\",\n form: \"\",\n \"main-field\": \"true\",\n onchange: this.commit,\n onkeyup: this.commit\n });\n this.replaceField = elt(\"input\", {\n value: query.replace,\n placeholder: phrase(view, \"Replace\"),\n \"aria-label\": phrase(view, \"Replace\"),\n class: \"cm-textfield\",\n name: \"replace\",\n form: \"\",\n onchange: this.commit,\n onkeyup: this.commit\n });\n this.caseField = elt(\"input\", {\n type: \"checkbox\",\n name: \"case\",\n form: \"\",\n checked: query.caseSensitive,\n onchange: this.commit\n });\n this.reField = elt(\"input\", {\n type: \"checkbox\",\n name: \"re\",\n form: \"\",\n checked: query.regexp,\n onchange: this.commit\n });\n this.wordField = elt(\"input\", {\n type: \"checkbox\",\n name: \"word\",\n form: \"\",\n checked: query.wholeWord,\n onchange: this.commit\n });\n function button(name, onclick, content) {\n return elt(\"button\", { class: \"cm-button\", name, onclick, type: \"button\" }, content);\n }\n this.dom = elt(\"div\", { onkeydown: (e) => this.keydown(e), class: \"cm-search\" }, [\n this.searchField,\n button(\"next\", () => findNext(view), [phrase(view, \"next\")]),\n button(\"prev\", () => findPrevious(view), [phrase(view, \"previous\")]),\n button(\"select\", () => selectMatches(view), [phrase(view, \"all\")]),\n elt(\"label\", null, [this.caseField, phrase(view, \"match case\")]),\n elt(\"label\", null, [this.reField, phrase(view, \"regexp\")]),\n elt(\"label\", null, [this.wordField, phrase(view, \"by word\")]),\n ...view.state.readOnly ? [] : [\n elt(\"br\"),\n this.replaceField,\n button(\"replace\", () => replaceNext(view), [phrase(view, \"replace\")]),\n button(\"replaceAll\", () => replaceAll(view), [phrase(view, \"replace all\")])\n ],\n elt(\"button\", {\n name: \"close\",\n onclick: () => closeSearchPanel(view),\n \"aria-label\": phrase(view, \"close\"),\n type: \"button\"\n }, [\"×\"])\n ]);\n }\n commit() {\n let query = new SearchQuery({\n search: this.searchField.value,\n caseSensitive: this.caseField.checked,\n regexp: this.reField.checked,\n wholeWord: this.wordField.checked,\n replace: this.replaceField.value,\n });\n if (!query.eq(this.query)) {\n this.query = query;\n this.view.dispatch({ effects: setSearchQuery.of(query) });\n }\n }\n keydown(e) {\n if (runScopeHandlers(this.view, e, \"search-panel\")) {\n e.preventDefault();\n }\n else if (e.keyCode == 13 && e.target == this.searchField) {\n e.preventDefault();\n (e.shiftKey ? findPrevious : findNext)(this.view);\n }\n else if (e.keyCode == 13 && e.target == this.replaceField) {\n e.preventDefault();\n replaceNext(this.view);\n }\n }\n update(update) {\n for (let tr of update.transactions)\n for (let effect of tr.effects) {\n if (effect.is(setSearchQuery) && !effect.value.eq(this.query))\n this.setQuery(effect.value);\n }\n }\n setQuery(query) {\n this.query = query;\n this.searchField.value = query.search;\n this.replaceField.value = query.replace;\n this.caseField.checked = query.caseSensitive;\n this.reField.checked = query.regexp;\n this.wordField.checked = query.wholeWord;\n }\n mount() {\n this.searchField.select();\n }\n get pos() { return 80; }\n get top() { return this.view.state.facet(searchConfigFacet).top; }\n}\nfunction phrase(view, phrase) { return view.state.phrase(phrase); }\nconst AnnounceMargin = 30;\nconst Break = /[\\s\\.,:;?!]/;\nfunction announceMatch(view, { from, to }) {\n let line = view.state.doc.lineAt(from), lineEnd = view.state.doc.lineAt(to).to;\n let start = Math.max(line.from, from - AnnounceMargin), end = Math.min(lineEnd, to + AnnounceMargin);\n let text = view.state.sliceDoc(start, end);\n if (start != line.from) {\n for (let i = 0; i < AnnounceMargin; i++)\n if (!Break.test(text[i + 1]) && Break.test(text[i])) {\n text = text.slice(i);\n break;\n }\n }\n if (end != lineEnd) {\n for (let i = text.length - 1; i > text.length - AnnounceMargin; i--)\n if (!Break.test(text[i - 1]) && Break.test(text[i])) {\n text = text.slice(0, i);\n break;\n }\n }\n return EditorView.announce.of(`${view.state.phrase(\"current match\")}. ${text} ${view.state.phrase(\"on line\")} ${line.number}.`);\n}\nconst baseTheme = /*@__PURE__*/EditorView.baseTheme({\n \".cm-panel.cm-search\": {\n padding: \"2px 6px 4px\",\n position: \"relative\",\n \"& [name=close]\": {\n position: \"absolute\",\n top: \"0\",\n right: \"4px\",\n backgroundColor: \"inherit\",\n border: \"none\",\n font: \"inherit\",\n padding: 0,\n margin: 0\n },\n \"& input, & button, & label\": {\n margin: \".2em .6em .2em 0\"\n },\n \"& input[type=checkbox]\": {\n marginRight: \".2em\"\n },\n \"& label\": {\n fontSize: \"80%\",\n whiteSpace: \"pre\"\n }\n },\n \"&light .cm-searchMatch\": { backgroundColor: \"#ffff0054\" },\n \"&dark .cm-searchMatch\": { backgroundColor: \"#00ffff8a\" },\n \"&light .cm-searchMatch-selected\": { backgroundColor: \"#ff6a0054\" },\n \"&dark .cm-searchMatch-selected\": { backgroundColor: \"#ff00ff8a\" }\n});\nconst searchExtensions = [\n searchState,\n /*@__PURE__*/Prec.low(searchHighlighter),\n baseTheme\n];\n\nexport { RegExpCursor, SearchCursor, SearchQuery, closeSearchPanel, findNext, findPrevious, getSearchQuery, gotoLine, highlightSelectionMatches, openSearchPanel, replaceAll, replaceNext, search, searchKeymap, searchPanelOpen, selectMatches, selectNextOccurrence, selectSelectionMatches, setSearchQuery };\n","import { Annotation, StateEffect, EditorSelection, codePointAt, codePointSize, fromCodePoint, Facet, combineConfig, StateField, Prec, Text, Transaction, MapMode, RangeValue, RangeSet, CharCategory } from '@codemirror/state';\nimport { Direction, logException, showTooltip, EditorView, ViewPlugin, getTooltip, Decoration, WidgetType, keymap } from '@codemirror/view';\nimport { syntaxTree, indentUnit } from '@codemirror/language';\n\n/**\nAn instance of this is passed to completion source functions.\n*/\nclass CompletionContext {\n /**\n Create a new completion context. (Mostly useful for testing\n completion sources—in the editor, the extension will create\n these for you.)\n */\n constructor(\n /**\n The editor state that the completion happens in.\n */\n state, \n /**\n The position at which the completion is happening.\n */\n pos, \n /**\n Indicates whether completion was activated explicitly, or\n implicitly by typing. The usual way to respond to this is to\n only return completions when either there is part of a\n completable entity before the cursor, or `explicit` is true.\n */\n explicit, \n /**\n The editor view. May be undefined if the context was created\n in a situation where there is no such view available, such as\n in synchronous updates via\n [`CompletionResult.update`](https://codemirror.net/6/docs/ref/#autocomplete.CompletionResult.update)\n or when called by test code.\n */\n view) {\n this.state = state;\n this.pos = pos;\n this.explicit = explicit;\n this.view = view;\n /**\n @internal\n */\n this.abortListeners = [];\n /**\n @internal\n */\n this.abortOnDocChange = false;\n }\n /**\n Get the extent, content, and (if there is a token) type of the\n token before `this.pos`.\n */\n tokenBefore(types) {\n let token = syntaxTree(this.state).resolveInner(this.pos, -1);\n while (token && types.indexOf(token.name) < 0)\n token = token.parent;\n return token ? { from: token.from, to: this.pos,\n text: this.state.sliceDoc(token.from, this.pos),\n type: token.type } : null;\n }\n /**\n Get the match of the given expression directly before the\n cursor.\n */\n matchBefore(expr) {\n let line = this.state.doc.lineAt(this.pos);\n let start = Math.max(line.from, this.pos - 250);\n let str = line.text.slice(start - line.from, this.pos - line.from);\n let found = str.search(ensureAnchor(expr, false));\n return found < 0 ? null : { from: start + found, to: this.pos, text: str.slice(found) };\n }\n /**\n Yields true when the query has been aborted. Can be useful in\n asynchronous queries to avoid doing work that will be ignored.\n */\n get aborted() { return this.abortListeners == null; }\n /**\n Allows you to register abort handlers, which will be called when\n the query is\n [aborted](https://codemirror.net/6/docs/ref/#autocomplete.CompletionContext.aborted).\n \n By default, running queries will not be aborted for regular\n typing or backspacing, on the assumption that they are likely to\n return a result with a\n [`validFor`](https://codemirror.net/6/docs/ref/#autocomplete.CompletionResult.validFor) field that\n allows the result to be used after all. Passing `onDocChange:\n true` will cause this query to be aborted for any document\n change.\n */\n addEventListener(type, listener, options) {\n if (type == \"abort\" && this.abortListeners) {\n this.abortListeners.push(listener);\n if (options && options.onDocChange)\n this.abortOnDocChange = true;\n }\n }\n}\nfunction toSet(chars) {\n let flat = Object.keys(chars).join(\"\");\n let words = /\\w/.test(flat);\n if (words)\n flat = flat.replace(/\\w/g, \"\");\n return `[${words ? \"\\\\w\" : \"\"}${flat.replace(/[^\\w\\s]/g, \"\\\\$&\")}]`;\n}\nfunction prefixMatch(options) {\n let first = Object.create(null), rest = Object.create(null);\n for (let { label } of options) {\n first[label[0]] = true;\n for (let i = 1; i < label.length; i++)\n rest[label[i]] = true;\n }\n let source = toSet(first) + toSet(rest) + \"*$\";\n return [new RegExp(\"^\" + source), new RegExp(source)];\n}\n/**\nGiven a a fixed array of options, return an autocompleter that\ncompletes them.\n*/\nfunction completeFromList(list) {\n let options = list.map(o => typeof o == \"string\" ? { label: o } : o);\n let [validFor, match] = options.every(o => /^\\w+$/.test(o.label)) ? [/\\w*$/, /\\w+$/] : prefixMatch(options);\n return (context) => {\n let token = context.matchBefore(match);\n return token || context.explicit ? { from: token ? token.from : context.pos, options, validFor } : null;\n };\n}\n/**\nWrap the given completion source so that it will only fire when the\ncursor is in a syntax node with one of the given names.\n*/\nfunction ifIn(nodes, source) {\n return (context) => {\n for (let pos = syntaxTree(context.state).resolveInner(context.pos, -1); pos; pos = pos.parent) {\n if (nodes.indexOf(pos.name) > -1)\n return source(context);\n if (pos.type.isTop)\n break;\n }\n return null;\n };\n}\n/**\nWrap the given completion source so that it will not fire when the\ncursor is in a syntax node with one of the given names.\n*/\nfunction ifNotIn(nodes, source) {\n return (context) => {\n for (let pos = syntaxTree(context.state).resolveInner(context.pos, -1); pos; pos = pos.parent) {\n if (nodes.indexOf(pos.name) > -1)\n return null;\n if (pos.type.isTop)\n break;\n }\n return source(context);\n };\n}\nclass Option {\n constructor(completion, source, match, score) {\n this.completion = completion;\n this.source = source;\n this.match = match;\n this.score = score;\n }\n}\nfunction cur(state) { return state.selection.main.from; }\n// Make sure the given regexp has a $ at its end and, if `start` is\n// true, a ^ at its start.\nfunction ensureAnchor(expr, start) {\n var _a;\n let { source } = expr;\n let addStart = start && source[0] != \"^\", addEnd = source[source.length - 1] != \"$\";\n if (!addStart && !addEnd)\n return expr;\n return new RegExp(`${addStart ? \"^\" : \"\"}(?:${source})${addEnd ? \"$\" : \"\"}`, (_a = expr.flags) !== null && _a !== void 0 ? _a : (expr.ignoreCase ? \"i\" : \"\"));\n}\n/**\nThis annotation is added to transactions that are produced by\npicking a completion.\n*/\nconst pickedCompletion = /*@__PURE__*/Annotation.define();\n/**\nHelper function that returns a transaction spec which inserts a\ncompletion's text in the main selection range, and any other\nselection range that has the same text in front of it.\n*/\nfunction insertCompletionText(state, text, from, to) {\n let { main } = state.selection, fromOff = from - main.from, toOff = to - main.from;\n return Object.assign(Object.assign({}, state.changeByRange(range => {\n if (range != main && from != to &&\n state.sliceDoc(range.from + fromOff, range.from + toOff) != state.sliceDoc(from, to))\n return { range };\n let lines = state.toText(text);\n return {\n changes: { from: range.from + fromOff, to: to == main.from ? range.to : range.from + toOff, insert: lines },\n range: EditorSelection.cursor(range.from + fromOff + lines.length)\n };\n })), { scrollIntoView: true, userEvent: \"input.complete\" });\n}\nconst SourceCache = /*@__PURE__*/new WeakMap();\nfunction asSource(source) {\n if (!Array.isArray(source))\n return source;\n let known = SourceCache.get(source);\n if (!known)\n SourceCache.set(source, known = completeFromList(source));\n return known;\n}\nconst startCompletionEffect = /*@__PURE__*/StateEffect.define();\nconst closeCompletionEffect = /*@__PURE__*/StateEffect.define();\n\n// A pattern matcher for fuzzy completion matching. Create an instance\n// once for a pattern, and then use that to match any number of\n// completions.\nclass FuzzyMatcher {\n constructor(pattern) {\n this.pattern = pattern;\n this.chars = [];\n this.folded = [];\n // Buffers reused by calls to `match` to track matched character\n // positions.\n this.any = [];\n this.precise = [];\n this.byWord = [];\n this.score = 0;\n this.matched = [];\n for (let p = 0; p < pattern.length;) {\n let char = codePointAt(pattern, p), size = codePointSize(char);\n this.chars.push(char);\n let part = pattern.slice(p, p + size), upper = part.toUpperCase();\n this.folded.push(codePointAt(upper == part ? part.toLowerCase() : upper, 0));\n p += size;\n }\n this.astral = pattern.length != this.chars.length;\n }\n ret(score, matched) {\n this.score = score;\n this.matched = matched;\n return this;\n }\n // Matches a given word (completion) against the pattern (input).\n // Will return a boolean indicating whether there was a match and,\n // on success, set `this.score` to the score, `this.matched` to an\n // array of `from, to` pairs indicating the matched parts of `word`.\n //\n // The score is a number that is more negative the worse the match\n // is. See `Penalty` above.\n match(word) {\n if (this.pattern.length == 0)\n return this.ret(-100 /* Penalty.NotFull */, []);\n if (word.length < this.pattern.length)\n return null;\n let { chars, folded, any, precise, byWord } = this;\n // For single-character queries, only match when they occur right\n // at the start\n if (chars.length == 1) {\n let first = codePointAt(word, 0), firstSize = codePointSize(first);\n let score = firstSize == word.length ? 0 : -100 /* Penalty.NotFull */;\n if (first == chars[0]) ;\n else if (first == folded[0])\n score += -200 /* Penalty.CaseFold */;\n else\n return null;\n return this.ret(score, [0, firstSize]);\n }\n let direct = word.indexOf(this.pattern);\n if (direct == 0)\n return this.ret(word.length == this.pattern.length ? 0 : -100 /* Penalty.NotFull */, [0, this.pattern.length]);\n let len = chars.length, anyTo = 0;\n if (direct < 0) {\n for (let i = 0, e = Math.min(word.length, 200); i < e && anyTo < len;) {\n let next = codePointAt(word, i);\n if (next == chars[anyTo] || next == folded[anyTo])\n any[anyTo++] = i;\n i += codePointSize(next);\n }\n // No match, exit immediately\n if (anyTo < len)\n return null;\n }\n // This tracks the extent of the precise (non-folded, not\n // necessarily adjacent) match\n let preciseTo = 0;\n // Tracks whether there is a match that hits only characters that\n // appear to be starting words. `byWordFolded` is set to true when\n // a case folded character is encountered in such a match\n let byWordTo = 0, byWordFolded = false;\n // If we've found a partial adjacent match, these track its state\n let adjacentTo = 0, adjacentStart = -1, adjacentEnd = -1;\n let hasLower = /[a-z]/.test(word), wordAdjacent = true;\n // Go over the option's text, scanning for the various kinds of matches\n for (let i = 0, e = Math.min(word.length, 200), prevType = 0 /* Tp.NonWord */; i < e && byWordTo < len;) {\n let next = codePointAt(word, i);\n if (direct < 0) {\n if (preciseTo < len && next == chars[preciseTo])\n precise[preciseTo++] = i;\n if (adjacentTo < len) {\n if (next == chars[adjacentTo] || next == folded[adjacentTo]) {\n if (adjacentTo == 0)\n adjacentStart = i;\n adjacentEnd = i + 1;\n adjacentTo++;\n }\n else {\n adjacentTo = 0;\n }\n }\n }\n let ch, type = next < 0xff\n ? (next >= 48 && next <= 57 || next >= 97 && next <= 122 ? 2 /* Tp.Lower */ : next >= 65 && next <= 90 ? 1 /* Tp.Upper */ : 0 /* Tp.NonWord */)\n : ((ch = fromCodePoint(next)) != ch.toLowerCase() ? 1 /* Tp.Upper */ : ch != ch.toUpperCase() ? 2 /* Tp.Lower */ : 0 /* Tp.NonWord */);\n if (!i || type == 1 /* Tp.Upper */ && hasLower || prevType == 0 /* Tp.NonWord */ && type != 0 /* Tp.NonWord */) {\n if (chars[byWordTo] == next || (folded[byWordTo] == next && (byWordFolded = true)))\n byWord[byWordTo++] = i;\n else if (byWord.length)\n wordAdjacent = false;\n }\n prevType = type;\n i += codePointSize(next);\n }\n if (byWordTo == len && byWord[0] == 0 && wordAdjacent)\n return this.result(-100 /* Penalty.ByWord */ + (byWordFolded ? -200 /* Penalty.CaseFold */ : 0), byWord, word);\n if (adjacentTo == len && adjacentStart == 0)\n return this.ret(-200 /* Penalty.CaseFold */ - word.length + (adjacentEnd == word.length ? 0 : -100 /* Penalty.NotFull */), [0, adjacentEnd]);\n if (direct > -1)\n return this.ret(-700 /* Penalty.NotStart */ - word.length, [direct, direct + this.pattern.length]);\n if (adjacentTo == len)\n return this.ret(-200 /* Penalty.CaseFold */ + -700 /* Penalty.NotStart */ - word.length, [adjacentStart, adjacentEnd]);\n if (byWordTo == len)\n return this.result(-100 /* Penalty.ByWord */ + (byWordFolded ? -200 /* Penalty.CaseFold */ : 0) + -700 /* Penalty.NotStart */ +\n (wordAdjacent ? 0 : -1100 /* Penalty.Gap */), byWord, word);\n return chars.length == 2 ? null\n : this.result((any[0] ? -700 /* Penalty.NotStart */ : 0) + -200 /* Penalty.CaseFold */ + -1100 /* Penalty.Gap */, any, word);\n }\n result(score, positions, word) {\n let result = [], i = 0;\n for (let pos of positions) {\n let to = pos + (this.astral ? codePointSize(codePointAt(word, pos)) : 1);\n if (i && result[i - 1] == pos)\n result[i - 1] = to;\n else {\n result[i++] = pos;\n result[i++] = to;\n }\n }\n return this.ret(score - word.length, result);\n }\n}\nclass StrictMatcher {\n constructor(pattern) {\n this.pattern = pattern;\n this.matched = [];\n this.score = 0;\n this.folded = pattern.toLowerCase();\n }\n match(word) {\n if (word.length < this.pattern.length)\n return null;\n let start = word.slice(0, this.pattern.length);\n let match = start == this.pattern ? 0 : start.toLowerCase() == this.folded ? -200 /* Penalty.CaseFold */ : null;\n if (match == null)\n return null;\n this.matched = [0, start.length];\n this.score = match + (word.length == this.pattern.length ? 0 : -100 /* Penalty.NotFull */);\n return this;\n }\n}\n\nconst completionConfig = /*@__PURE__*/Facet.define({\n combine(configs) {\n return combineConfig(configs, {\n activateOnTyping: true,\n activateOnCompletion: () => false,\n activateOnTypingDelay: 100,\n selectOnOpen: true,\n override: null,\n closeOnBlur: true,\n maxRenderedOptions: 100,\n defaultKeymap: true,\n tooltipClass: () => \"\",\n optionClass: () => \"\",\n aboveCursor: false,\n icons: true,\n addToOptions: [],\n positionInfo: defaultPositionInfo,\n filterStrict: false,\n compareCompletions: (a, b) => a.label.localeCompare(b.label),\n interactionDelay: 75,\n updateSyncTime: 100\n }, {\n defaultKeymap: (a, b) => a && b,\n closeOnBlur: (a, b) => a && b,\n icons: (a, b) => a && b,\n tooltipClass: (a, b) => c => joinClass(a(c), b(c)),\n optionClass: (a, b) => c => joinClass(a(c), b(c)),\n addToOptions: (a, b) => a.concat(b),\n filterStrict: (a, b) => a || b,\n });\n }\n});\nfunction joinClass(a, b) {\n return a ? b ? a + \" \" + b : a : b;\n}\nfunction defaultPositionInfo(view, list, option, info, space, tooltip) {\n let rtl = view.textDirection == Direction.RTL, left = rtl, narrow = false;\n let side = \"top\", offset, maxWidth;\n let spaceLeft = list.left - space.left, spaceRight = space.right - list.right;\n let infoWidth = info.right - info.left, infoHeight = info.bottom - info.top;\n if (left && spaceLeft < Math.min(infoWidth, spaceRight))\n left = false;\n else if (!left && spaceRight < Math.min(infoWidth, spaceLeft))\n left = true;\n if (infoWidth <= (left ? spaceLeft : spaceRight)) {\n offset = Math.max(space.top, Math.min(option.top, space.bottom - infoHeight)) - list.top;\n maxWidth = Math.min(400 /* Info.Width */, left ? spaceLeft : spaceRight);\n }\n else {\n narrow = true;\n maxWidth = Math.min(400 /* Info.Width */, (rtl ? list.right : space.right - list.left) - 30 /* Info.Margin */);\n let spaceBelow = space.bottom - list.bottom;\n if (spaceBelow >= infoHeight || spaceBelow > list.top) { // Below the completion\n offset = option.bottom - list.top;\n }\n else { // Above it\n side = \"bottom\";\n offset = list.bottom - option.top;\n }\n }\n let scaleY = (list.bottom - list.top) / tooltip.offsetHeight;\n let scaleX = (list.right - list.left) / tooltip.offsetWidth;\n return {\n style: `${side}: ${offset / scaleY}px; max-width: ${maxWidth / scaleX}px`,\n class: \"cm-completionInfo-\" + (narrow ? (rtl ? \"left-narrow\" : \"right-narrow\") : left ? \"left\" : \"right\")\n };\n}\n\nfunction optionContent(config) {\n let content = config.addToOptions.slice();\n if (config.icons)\n content.push({\n render(completion) {\n let icon = document.createElement(\"div\");\n icon.classList.add(\"cm-completionIcon\");\n if (completion.type)\n icon.classList.add(...completion.type.split(/\\s+/g).map(cls => \"cm-completionIcon-\" + cls));\n icon.setAttribute(\"aria-hidden\", \"true\");\n return icon;\n },\n position: 20\n });\n content.push({\n render(completion, _s, _v, match) {\n let labelElt = document.createElement(\"span\");\n labelElt.className = \"cm-completionLabel\";\n let label = completion.displayLabel || completion.label, off = 0;\n for (let j = 0; j < match.length;) {\n let from = match[j++], to = match[j++];\n if (from > off)\n labelElt.appendChild(document.createTextNode(label.slice(off, from)));\n let span = labelElt.appendChild(document.createElement(\"span\"));\n span.appendChild(document.createTextNode(label.slice(from, to)));\n span.className = \"cm-completionMatchedText\";\n off = to;\n }\n if (off < label.length)\n labelElt.appendChild(document.createTextNode(label.slice(off)));\n return labelElt;\n },\n position: 50\n }, {\n render(completion) {\n if (!completion.detail)\n return null;\n let detailElt = document.createElement(\"span\");\n detailElt.className = \"cm-completionDetail\";\n detailElt.textContent = completion.detail;\n return detailElt;\n },\n position: 80\n });\n return content.sort((a, b) => a.position - b.position).map(a => a.render);\n}\nfunction rangeAroundSelected(total, selected, max) {\n if (total <= max)\n return { from: 0, to: total };\n if (selected < 0)\n selected = 0;\n if (selected <= (total >> 1)) {\n let off = Math.floor(selected / max);\n return { from: off * max, to: (off + 1) * max };\n }\n let off = Math.floor((total - selected) / max);\n return { from: total - (off + 1) * max, to: total - off * max };\n}\nclass CompletionTooltip {\n constructor(view, stateField, applyCompletion) {\n this.view = view;\n this.stateField = stateField;\n this.applyCompletion = applyCompletion;\n this.info = null;\n this.infoDestroy = null;\n this.placeInfoReq = {\n read: () => this.measureInfo(),\n write: (pos) => this.placeInfo(pos),\n key: this\n };\n this.space = null;\n this.currentClass = \"\";\n let cState = view.state.field(stateField);\n let { options, selected } = cState.open;\n let config = view.state.facet(completionConfig);\n this.optionContent = optionContent(config);\n this.optionClass = config.optionClass;\n this.tooltipClass = config.tooltipClass;\n this.range = rangeAroundSelected(options.length, selected, config.maxRenderedOptions);\n this.dom = document.createElement(\"div\");\n this.dom.className = \"cm-tooltip-autocomplete\";\n this.updateTooltipClass(view.state);\n this.dom.addEventListener(\"mousedown\", (e) => {\n let { options } = view.state.field(stateField).open;\n for (let dom = e.target, match; dom && dom != this.dom; dom = dom.parentNode) {\n if (dom.nodeName == \"LI\" && (match = /-(\\d+)$/.exec(dom.id)) && +match[1] < options.length) {\n this.applyCompletion(view, options[+match[1]]);\n e.preventDefault();\n return;\n }\n }\n });\n this.dom.addEventListener(\"focusout\", (e) => {\n let state = view.state.field(this.stateField, false);\n if (state && state.tooltip && view.state.facet(completionConfig).closeOnBlur &&\n e.relatedTarget != view.contentDOM)\n view.dispatch({ effects: closeCompletionEffect.of(null) });\n });\n this.showOptions(options, cState.id);\n }\n mount() { this.updateSel(); }\n showOptions(options, id) {\n if (this.list)\n this.list.remove();\n this.list = this.dom.appendChild(this.createListBox(options, id, this.range));\n this.list.addEventListener(\"scroll\", () => {\n if (this.info)\n this.view.requestMeasure(this.placeInfoReq);\n });\n }\n update(update) {\n var _a;\n let cState = update.state.field(this.stateField);\n let prevState = update.startState.field(this.stateField);\n this.updateTooltipClass(update.state);\n if (cState != prevState) {\n let { options, selected, disabled } = cState.open;\n if (!prevState.open || prevState.open.options != options) {\n this.range = rangeAroundSelected(options.length, selected, update.state.facet(completionConfig).maxRenderedOptions);\n this.showOptions(options, cState.id);\n }\n this.updateSel();\n if (disabled != ((_a = prevState.open) === null || _a === void 0 ? void 0 : _a.disabled))\n this.dom.classList.toggle(\"cm-tooltip-autocomplete-disabled\", !!disabled);\n }\n }\n updateTooltipClass(state) {\n let cls = this.tooltipClass(state);\n if (cls != this.currentClass) {\n for (let c of this.currentClass.split(\" \"))\n if (c)\n this.dom.classList.remove(c);\n for (let c of cls.split(\" \"))\n if (c)\n this.dom.classList.add(c);\n this.currentClass = cls;\n }\n }\n positioned(space) {\n this.space = space;\n if (this.info)\n this.view.requestMeasure(this.placeInfoReq);\n }\n updateSel() {\n let cState = this.view.state.field(this.stateField), open = cState.open;\n if (open.selected > -1 && open.selected < this.range.from || open.selected >= this.range.to) {\n this.range = rangeAroundSelected(open.options.length, open.selected, this.view.state.facet(completionConfig).maxRenderedOptions);\n this.showOptions(open.options, cState.id);\n }\n if (this.updateSelectedOption(open.selected)) {\n this.destroyInfo();\n let { completion } = open.options[open.selected];\n let { info } = completion;\n if (!info)\n return;\n let infoResult = typeof info === \"string\" ? document.createTextNode(info) : info(completion);\n if (!infoResult)\n return;\n if (\"then\" in infoResult) {\n infoResult.then(obj => {\n if (obj && this.view.state.field(this.stateField, false) == cState)\n this.addInfoPane(obj, completion);\n }).catch(e => logException(this.view.state, e, \"completion info\"));\n }\n else {\n this.addInfoPane(infoResult, completion);\n }\n }\n }\n addInfoPane(content, completion) {\n this.destroyInfo();\n let wrap = this.info = document.createElement(\"div\");\n wrap.className = \"cm-tooltip cm-completionInfo\";\n if (content.nodeType != null) {\n wrap.appendChild(content);\n this.infoDestroy = null;\n }\n else {\n let { dom, destroy } = content;\n wrap.appendChild(dom);\n this.infoDestroy = destroy || null;\n }\n this.dom.appendChild(wrap);\n this.view.requestMeasure(this.placeInfoReq);\n }\n updateSelectedOption(selected) {\n let set = null;\n for (let opt = this.list.firstChild, i = this.range.from; opt; opt = opt.nextSibling, i++) {\n if (opt.nodeName != \"LI\" || !opt.id) {\n i--; // A section header\n }\n else if (i == selected) {\n if (!opt.hasAttribute(\"aria-selected\")) {\n opt.setAttribute(\"aria-selected\", \"true\");\n set = opt;\n }\n }\n else {\n if (opt.hasAttribute(\"aria-selected\"))\n opt.removeAttribute(\"aria-selected\");\n }\n }\n if (set)\n scrollIntoView(this.list, set);\n return set;\n }\n measureInfo() {\n let sel = this.dom.querySelector(\"[aria-selected]\");\n if (!sel || !this.info)\n return null;\n let listRect = this.dom.getBoundingClientRect();\n let infoRect = this.info.getBoundingClientRect();\n let selRect = sel.getBoundingClientRect();\n let space = this.space;\n if (!space) {\n let docElt = this.dom.ownerDocument.documentElement;\n space = { left: 0, top: 0, right: docElt.clientWidth, bottom: docElt.clientHeight };\n }\n if (selRect.top > Math.min(space.bottom, listRect.bottom) - 10 ||\n selRect.bottom < Math.max(space.top, listRect.top) + 10)\n return null;\n return this.view.state.facet(completionConfig).positionInfo(this.view, listRect, selRect, infoRect, space, this.dom);\n }\n placeInfo(pos) {\n if (this.info) {\n if (pos) {\n if (pos.style)\n this.info.style.cssText = pos.style;\n this.info.className = \"cm-tooltip cm-completionInfo \" + (pos.class || \"\");\n }\n else {\n this.info.style.cssText = \"top: -1e6px\";\n }\n }\n }\n createListBox(options, id, range) {\n const ul = document.createElement(\"ul\");\n ul.id = id;\n ul.setAttribute(\"role\", \"listbox\");\n ul.setAttribute(\"aria-expanded\", \"true\");\n ul.setAttribute(\"aria-label\", this.view.state.phrase(\"Completions\"));\n ul.addEventListener(\"mousedown\", e => {\n // Prevent focus change when clicking the scrollbar\n if (e.target == ul)\n e.preventDefault();\n });\n let curSection = null;\n for (let i = range.from; i < range.to; i++) {\n let { completion, match } = options[i], { section } = completion;\n if (section) {\n let name = typeof section == \"string\" ? section : section.name;\n if (name != curSection && (i > range.from || range.from == 0)) {\n curSection = name;\n if (typeof section != \"string\" && section.header) {\n ul.appendChild(section.header(section));\n }\n else {\n let header = ul.appendChild(document.createElement(\"completion-section\"));\n header.textContent = name;\n }\n }\n }\n const li = ul.appendChild(document.createElement(\"li\"));\n li.id = id + \"-\" + i;\n li.setAttribute(\"role\", \"option\");\n let cls = this.optionClass(completion);\n if (cls)\n li.className = cls;\n for (let source of this.optionContent) {\n let node = source(completion, this.view.state, this.view, match);\n if (node)\n li.appendChild(node);\n }\n }\n if (range.from)\n ul.classList.add(\"cm-completionListIncompleteTop\");\n if (range.to < options.length)\n ul.classList.add(\"cm-completionListIncompleteBottom\");\n return ul;\n }\n destroyInfo() {\n if (this.info) {\n if (this.infoDestroy)\n this.infoDestroy();\n this.info.remove();\n this.info = null;\n }\n }\n destroy() {\n this.destroyInfo();\n }\n}\nfunction completionTooltip(stateField, applyCompletion) {\n return (view) => new CompletionTooltip(view, stateField, applyCompletion);\n}\nfunction scrollIntoView(container, element) {\n let parent = container.getBoundingClientRect();\n let self = element.getBoundingClientRect();\n let scaleY = parent.height / container.offsetHeight;\n if (self.top < parent.top)\n container.scrollTop -= (parent.top - self.top) / scaleY;\n else if (self.bottom > parent.bottom)\n container.scrollTop += (self.bottom - parent.bottom) / scaleY;\n}\n\n// Used to pick a preferred option when two options with the same\n// label occur in the result.\nfunction score(option) {\n return (option.boost || 0) * 100 + (option.apply ? 10 : 0) + (option.info ? 5 : 0) +\n (option.type ? 1 : 0);\n}\nfunction sortOptions(active, state) {\n let options = [];\n let sections = null;\n let addOption = (option) => {\n options.push(option);\n let { section } = option.completion;\n if (section) {\n if (!sections)\n sections = [];\n let name = typeof section == \"string\" ? section : section.name;\n if (!sections.some(s => s.name == name))\n sections.push(typeof section == \"string\" ? { name } : section);\n }\n };\n let conf = state.facet(completionConfig);\n for (let a of active)\n if (a.hasResult()) {\n let getMatch = a.result.getMatch;\n if (a.result.filter === false) {\n for (let option of a.result.options) {\n addOption(new Option(option, a.source, getMatch ? getMatch(option) : [], 1e9 - options.length));\n }\n }\n else {\n let pattern = state.sliceDoc(a.from, a.to), match;\n let matcher = conf.filterStrict ? new StrictMatcher(pattern) : new FuzzyMatcher(pattern);\n for (let option of a.result.options)\n if (match = matcher.match(option.label)) {\n let matched = !option.displayLabel ? match.matched : getMatch ? getMatch(option, match.matched) : [];\n addOption(new Option(option, a.source, matched, match.score + (option.boost || 0)));\n }\n }\n }\n if (sections) {\n let sectionOrder = Object.create(null), pos = 0;\n let cmp = (a, b) => { var _a, _b; return ((_a = a.rank) !== null && _a !== void 0 ? _a : 1e9) - ((_b = b.rank) !== null && _b !== void 0 ? _b : 1e9) || (a.name < b.name ? -1 : 1); };\n for (let s of sections.sort(cmp)) {\n pos -= 1e5;\n sectionOrder[s.name] = pos;\n }\n for (let option of options) {\n let { section } = option.completion;\n if (section)\n option.score += sectionOrder[typeof section == \"string\" ? section : section.name];\n }\n }\n let result = [], prev = null;\n let compare = conf.compareCompletions;\n for (let opt of options.sort((a, b) => (b.score - a.score) || compare(a.completion, b.completion))) {\n let cur = opt.completion;\n if (!prev || prev.label != cur.label || prev.detail != cur.detail ||\n (prev.type != null && cur.type != null && prev.type != cur.type) ||\n prev.apply != cur.apply || prev.boost != cur.boost)\n result.push(opt);\n else if (score(opt.completion) > score(prev))\n result[result.length - 1] = opt;\n prev = opt.completion;\n }\n return result;\n}\nclass CompletionDialog {\n constructor(options, attrs, tooltip, timestamp, selected, disabled) {\n this.options = options;\n this.attrs = attrs;\n this.tooltip = tooltip;\n this.timestamp = timestamp;\n this.selected = selected;\n this.disabled = disabled;\n }\n setSelected(selected, id) {\n return selected == this.selected || selected >= this.options.length ? this\n : new CompletionDialog(this.options, makeAttrs(id, selected), this.tooltip, this.timestamp, selected, this.disabled);\n }\n static build(active, state, id, prev, conf, didSetActive) {\n if (prev && !didSetActive && active.some(s => s.isPending))\n return prev.setDisabled();\n let options = sortOptions(active, state);\n if (!options.length)\n return prev && active.some(a => a.isPending) ? prev.setDisabled() : null;\n let selected = state.facet(completionConfig).selectOnOpen ? 0 : -1;\n if (prev && prev.selected != selected && prev.selected != -1) {\n let selectedValue = prev.options[prev.selected].completion;\n for (let i = 0; i < options.length; i++)\n if (options[i].completion == selectedValue) {\n selected = i;\n break;\n }\n }\n return new CompletionDialog(options, makeAttrs(id, selected), {\n pos: active.reduce((a, b) => b.hasResult() ? Math.min(a, b.from) : a, 1e8),\n create: createTooltip,\n above: conf.aboveCursor,\n }, prev ? prev.timestamp : Date.now(), selected, false);\n }\n map(changes) {\n return new CompletionDialog(this.options, this.attrs, Object.assign(Object.assign({}, this.tooltip), { pos: changes.mapPos(this.tooltip.pos) }), this.timestamp, this.selected, this.disabled);\n }\n setDisabled() {\n return new CompletionDialog(this.options, this.attrs, this.tooltip, this.timestamp, this.selected, true);\n }\n}\nclass CompletionState {\n constructor(active, id, open) {\n this.active = active;\n this.id = id;\n this.open = open;\n }\n static start() {\n return new CompletionState(none, \"cm-ac-\" + Math.floor(Math.random() * 2e6).toString(36), null);\n }\n update(tr) {\n let { state } = tr, conf = state.facet(completionConfig);\n let sources = conf.override ||\n state.languageDataAt(\"autocomplete\", cur(state)).map(asSource);\n let active = sources.map(source => {\n let value = this.active.find(s => s.source == source) ||\n new ActiveSource(source, this.active.some(a => a.state != 0 /* State.Inactive */) ? 1 /* State.Pending */ : 0 /* State.Inactive */);\n return value.update(tr, conf);\n });\n if (active.length == this.active.length && active.every((a, i) => a == this.active[i]))\n active = this.active;\n let open = this.open, didSet = tr.effects.some(e => e.is(setActiveEffect));\n if (open && tr.docChanged)\n open = open.map(tr.changes);\n if (tr.selection || active.some(a => a.hasResult() && tr.changes.touchesRange(a.from, a.to)) ||\n !sameResults(active, this.active) || didSet)\n open = CompletionDialog.build(active, state, this.id, open, conf, didSet);\n else if (open && open.disabled && !active.some(a => a.isPending))\n open = null;\n if (!open && active.every(a => !a.isPending) && active.some(a => a.hasResult()))\n active = active.map(a => a.hasResult() ? new ActiveSource(a.source, 0 /* State.Inactive */) : a);\n for (let effect of tr.effects)\n if (effect.is(setSelectedEffect))\n open = open && open.setSelected(effect.value, this.id);\n return active == this.active && open == this.open ? this : new CompletionState(active, this.id, open);\n }\n get tooltip() { return this.open ? this.open.tooltip : null; }\n get attrs() { return this.open ? this.open.attrs : this.active.length ? baseAttrs : noAttrs; }\n}\nfunction sameResults(a, b) {\n if (a == b)\n return true;\n for (let iA = 0, iB = 0;;) {\n while (iA < a.length && !a[iA].hasResult())\n iA++;\n while (iB < b.length && !b[iB].hasResult())\n iB++;\n let endA = iA == a.length, endB = iB == b.length;\n if (endA || endB)\n return endA == endB;\n if (a[iA++].result != b[iB++].result)\n return false;\n }\n}\nconst baseAttrs = {\n \"aria-autocomplete\": \"list\"\n};\nconst noAttrs = {};\nfunction makeAttrs(id, selected) {\n let result = {\n \"aria-autocomplete\": \"list\",\n \"aria-haspopup\": \"listbox\",\n \"aria-controls\": id\n };\n if (selected > -1)\n result[\"aria-activedescendant\"] = id + \"-\" + selected;\n return result;\n}\nconst none = [];\nfunction getUpdateType(tr, conf) {\n if (tr.isUserEvent(\"input.complete\")) {\n let completion = tr.annotation(pickedCompletion);\n if (completion && conf.activateOnCompletion(completion))\n return 4 /* UpdateType.Activate */ | 8 /* UpdateType.Reset */;\n }\n let typing = tr.isUserEvent(\"input.type\");\n return typing && conf.activateOnTyping ? 4 /* UpdateType.Activate */ | 1 /* UpdateType.Typing */\n : typing ? 1 /* UpdateType.Typing */\n : tr.isUserEvent(\"delete.backward\") ? 2 /* UpdateType.Backspacing */\n : tr.selection ? 8 /* UpdateType.Reset */\n : tr.docChanged ? 16 /* UpdateType.ResetIfTouching */ : 0 /* UpdateType.None */;\n}\nclass ActiveSource {\n constructor(source, state, explicit = false) {\n this.source = source;\n this.state = state;\n this.explicit = explicit;\n }\n hasResult() { return false; }\n get isPending() { return this.state == 1 /* State.Pending */; }\n update(tr, conf) {\n let type = getUpdateType(tr, conf), value = this;\n if ((type & 8 /* UpdateType.Reset */) || (type & 16 /* UpdateType.ResetIfTouching */) && this.touches(tr))\n value = new ActiveSource(value.source, 0 /* State.Inactive */);\n if ((type & 4 /* UpdateType.Activate */) && value.state == 0 /* State.Inactive */)\n value = new ActiveSource(this.source, 1 /* State.Pending */);\n value = value.updateFor(tr, type);\n for (let effect of tr.effects) {\n if (effect.is(startCompletionEffect))\n value = new ActiveSource(value.source, 1 /* State.Pending */, effect.value);\n else if (effect.is(closeCompletionEffect))\n value = new ActiveSource(value.source, 0 /* State.Inactive */);\n else if (effect.is(setActiveEffect))\n for (let active of effect.value)\n if (active.source == value.source)\n value = active;\n }\n return value;\n }\n updateFor(tr, type) { return this.map(tr.changes); }\n map(changes) { return this; }\n touches(tr) {\n return tr.changes.touchesRange(cur(tr.state));\n }\n}\nclass ActiveResult extends ActiveSource {\n constructor(source, explicit, limit, result, from, to) {\n super(source, 3 /* State.Result */, explicit);\n this.limit = limit;\n this.result = result;\n this.from = from;\n this.to = to;\n }\n hasResult() { return true; }\n updateFor(tr, type) {\n var _a;\n if (!(type & 3 /* UpdateType.SimpleInteraction */))\n return this.map(tr.changes);\n let result = this.result;\n if (result.map && !tr.changes.empty)\n result = result.map(result, tr.changes);\n let from = tr.changes.mapPos(this.from), to = tr.changes.mapPos(this.to, 1);\n let pos = cur(tr.state);\n if (pos > to || !result ||\n (type & 2 /* UpdateType.Backspacing */) && (cur(tr.startState) == this.from || pos < this.limit))\n return new ActiveSource(this.source, type & 4 /* UpdateType.Activate */ ? 1 /* State.Pending */ : 0 /* State.Inactive */);\n let limit = tr.changes.mapPos(this.limit);\n if (checkValid(result.validFor, tr.state, from, to))\n return new ActiveResult(this.source, this.explicit, limit, result, from, to);\n if (result.update &&\n (result = result.update(result, from, to, new CompletionContext(tr.state, pos, false))))\n return new ActiveResult(this.source, this.explicit, limit, result, result.from, (_a = result.to) !== null && _a !== void 0 ? _a : cur(tr.state));\n return new ActiveSource(this.source, 1 /* State.Pending */, this.explicit);\n }\n map(mapping) {\n if (mapping.empty)\n return this;\n let result = this.result.map ? this.result.map(this.result, mapping) : this.result;\n if (!result)\n return new ActiveSource(this.source, 0 /* State.Inactive */);\n return new ActiveResult(this.source, this.explicit, mapping.mapPos(this.limit), this.result, mapping.mapPos(this.from), mapping.mapPos(this.to, 1));\n }\n touches(tr) {\n return tr.changes.touchesRange(this.from, this.to);\n }\n}\nfunction checkValid(validFor, state, from, to) {\n if (!validFor)\n return false;\n let text = state.sliceDoc(from, to);\n return typeof validFor == \"function\" ? validFor(text, from, to, state) : ensureAnchor(validFor, true).test(text);\n}\nconst setActiveEffect = /*@__PURE__*/StateEffect.define({\n map(sources, mapping) { return sources.map(s => s.map(mapping)); }\n});\nconst setSelectedEffect = /*@__PURE__*/StateEffect.define();\nconst completionState = /*@__PURE__*/StateField.define({\n create() { return CompletionState.start(); },\n update(value, tr) { return value.update(tr); },\n provide: f => [\n showTooltip.from(f, val => val.tooltip),\n EditorView.contentAttributes.from(f, state => state.attrs)\n ]\n});\nfunction applyCompletion(view, option) {\n const apply = option.completion.apply || option.completion.label;\n let result = view.state.field(completionState).active.find(a => a.source == option.source);\n if (!(result instanceof ActiveResult))\n return false;\n if (typeof apply == \"string\")\n view.dispatch(Object.assign(Object.assign({}, insertCompletionText(view.state, apply, result.from, result.to)), { annotations: pickedCompletion.of(option.completion) }));\n else\n apply(view, option.completion, result.from, result.to);\n return true;\n}\nconst createTooltip = /*@__PURE__*/completionTooltip(completionState, applyCompletion);\n\n/**\nReturns a command that moves the completion selection forward or\nbackward by the given amount.\n*/\nfunction moveCompletionSelection(forward, by = \"option\") {\n return (view) => {\n let cState = view.state.field(completionState, false);\n if (!cState || !cState.open || cState.open.disabled ||\n Date.now() - cState.open.timestamp < view.state.facet(completionConfig).interactionDelay)\n return false;\n let step = 1, tooltip;\n if (by == \"page\" && (tooltip = getTooltip(view, cState.open.tooltip)))\n step = Math.max(2, Math.floor(tooltip.dom.offsetHeight /\n tooltip.dom.querySelector(\"li\").offsetHeight) - 1);\n let { length } = cState.open.options;\n let selected = cState.open.selected > -1 ? cState.open.selected + step * (forward ? 1 : -1) : forward ? 0 : length - 1;\n if (selected < 0)\n selected = by == \"page\" ? 0 : length - 1;\n else if (selected >= length)\n selected = by == \"page\" ? length - 1 : 0;\n view.dispatch({ effects: setSelectedEffect.of(selected) });\n return true;\n };\n}\n/**\nAccept the current completion.\n*/\nconst acceptCompletion = (view) => {\n let cState = view.state.field(completionState, false);\n if (view.state.readOnly || !cState || !cState.open || cState.open.selected < 0 || cState.open.disabled ||\n Date.now() - cState.open.timestamp < view.state.facet(completionConfig).interactionDelay)\n return false;\n return applyCompletion(view, cState.open.options[cState.open.selected]);\n};\n/**\nExplicitly start autocompletion.\n*/\nconst startCompletion = (view) => {\n let cState = view.state.field(completionState, false);\n if (!cState)\n return false;\n view.dispatch({ effects: startCompletionEffect.of(true) });\n return true;\n};\n/**\nClose the currently active completion.\n*/\nconst closeCompletion = (view) => {\n let cState = view.state.field(completionState, false);\n if (!cState || !cState.active.some(a => a.state != 0 /* State.Inactive */))\n return false;\n view.dispatch({ effects: closeCompletionEffect.of(null) });\n return true;\n};\nclass RunningQuery {\n constructor(active, context) {\n this.active = active;\n this.context = context;\n this.time = Date.now();\n this.updates = [];\n // Note that 'undefined' means 'not done yet', whereas 'null' means\n // 'query returned null'.\n this.done = undefined;\n }\n}\nconst MaxUpdateCount = 50, MinAbortTime = 1000;\nconst completionPlugin = /*@__PURE__*/ViewPlugin.fromClass(class {\n constructor(view) {\n this.view = view;\n this.debounceUpdate = -1;\n this.running = [];\n this.debounceAccept = -1;\n this.pendingStart = false;\n this.composing = 0 /* CompositionState.None */;\n for (let active of view.state.field(completionState).active)\n if (active.isPending)\n this.startQuery(active);\n }\n update(update) {\n let cState = update.state.field(completionState);\n let conf = update.state.facet(completionConfig);\n if (!update.selectionSet && !update.docChanged && update.startState.field(completionState) == cState)\n return;\n let doesReset = update.transactions.some(tr => {\n let type = getUpdateType(tr, conf);\n return (type & 8 /* UpdateType.Reset */) || (tr.selection || tr.docChanged) && !(type & 3 /* UpdateType.SimpleInteraction */);\n });\n for (let i = 0; i < this.running.length; i++) {\n let query = this.running[i];\n if (doesReset ||\n query.context.abortOnDocChange && update.docChanged ||\n query.updates.length + update.transactions.length > MaxUpdateCount && Date.now() - query.time > MinAbortTime) {\n for (let handler of query.context.abortListeners) {\n try {\n handler();\n }\n catch (e) {\n logException(this.view.state, e);\n }\n }\n query.context.abortListeners = null;\n this.running.splice(i--, 1);\n }\n else {\n query.updates.push(...update.transactions);\n }\n }\n if (this.debounceUpdate > -1)\n clearTimeout(this.debounceUpdate);\n if (update.transactions.some(tr => tr.effects.some(e => e.is(startCompletionEffect))))\n this.pendingStart = true;\n let delay = this.pendingStart ? 50 : conf.activateOnTypingDelay;\n this.debounceUpdate = cState.active.some(a => a.isPending && !this.running.some(q => q.active.source == a.source))\n ? setTimeout(() => this.startUpdate(), delay) : -1;\n if (this.composing != 0 /* CompositionState.None */)\n for (let tr of update.transactions) {\n if (tr.isUserEvent(\"input.type\"))\n this.composing = 2 /* CompositionState.Changed */;\n else if (this.composing == 2 /* CompositionState.Changed */ && tr.selection)\n this.composing = 3 /* CompositionState.ChangedAndMoved */;\n }\n }\n startUpdate() {\n this.debounceUpdate = -1;\n this.pendingStart = false;\n let { state } = this.view, cState = state.field(completionState);\n for (let active of cState.active) {\n if (active.isPending && !this.running.some(r => r.active.source == active.source))\n this.startQuery(active);\n }\n if (this.running.length && cState.open && cState.open.disabled)\n this.debounceAccept = setTimeout(() => this.accept(), this.view.state.facet(completionConfig).updateSyncTime);\n }\n startQuery(active) {\n let { state } = this.view, pos = cur(state);\n let context = new CompletionContext(state, pos, active.explicit, this.view);\n let pending = new RunningQuery(active, context);\n this.running.push(pending);\n Promise.resolve(active.source(context)).then(result => {\n if (!pending.context.aborted) {\n pending.done = result || null;\n this.scheduleAccept();\n }\n }, err => {\n this.view.dispatch({ effects: closeCompletionEffect.of(null) });\n logException(this.view.state, err);\n });\n }\n scheduleAccept() {\n if (this.running.every(q => q.done !== undefined))\n this.accept();\n else if (this.debounceAccept < 0)\n this.debounceAccept = setTimeout(() => this.accept(), this.view.state.facet(completionConfig).updateSyncTime);\n }\n // For each finished query in this.running, try to create a result\n // or, if appropriate, restart the query.\n accept() {\n var _a;\n if (this.debounceAccept > -1)\n clearTimeout(this.debounceAccept);\n this.debounceAccept = -1;\n let updated = [];\n let conf = this.view.state.facet(completionConfig), cState = this.view.state.field(completionState);\n for (let i = 0; i < this.running.length; i++) {\n let query = this.running[i];\n if (query.done === undefined)\n continue;\n this.running.splice(i--, 1);\n if (query.done) {\n let pos = cur(query.updates.length ? query.updates[0].startState : this.view.state);\n let limit = Math.min(pos, query.done.from + (query.active.explicit ? 0 : 1));\n let active = new ActiveResult(query.active.source, query.active.explicit, limit, query.done, query.done.from, (_a = query.done.to) !== null && _a !== void 0 ? _a : pos);\n // Replay the transactions that happened since the start of\n // the request and see if that preserves the result\n for (let tr of query.updates)\n active = active.update(tr, conf);\n if (active.hasResult()) {\n updated.push(active);\n continue;\n }\n }\n let current = cState.active.find(a => a.source == query.active.source);\n if (current && current.isPending) {\n if (query.done == null) {\n // Explicitly failed. Should clear the pending status if it\n // hasn't been re-set in the meantime.\n let active = new ActiveSource(query.active.source, 0 /* State.Inactive */);\n for (let tr of query.updates)\n active = active.update(tr, conf);\n if (!active.isPending)\n updated.push(active);\n }\n else {\n // Cleared by subsequent transactions. Restart.\n this.startQuery(current);\n }\n }\n }\n if (updated.length || cState.open && cState.open.disabled)\n this.view.dispatch({ effects: setActiveEffect.of(updated) });\n }\n}, {\n eventHandlers: {\n blur(event) {\n let state = this.view.state.field(completionState, false);\n if (state && state.tooltip && this.view.state.facet(completionConfig).closeOnBlur) {\n let dialog = state.open && getTooltip(this.view, state.open.tooltip);\n if (!dialog || !dialog.dom.contains(event.relatedTarget))\n setTimeout(() => this.view.dispatch({ effects: closeCompletionEffect.of(null) }), 10);\n }\n },\n compositionstart() {\n this.composing = 1 /* CompositionState.Started */;\n },\n compositionend() {\n if (this.composing == 3 /* CompositionState.ChangedAndMoved */) {\n // Safari fires compositionend events synchronously, possibly\n // from inside an update, so dispatch asynchronously to avoid reentrancy\n setTimeout(() => this.view.dispatch({ effects: startCompletionEffect.of(false) }), 20);\n }\n this.composing = 0 /* CompositionState.None */;\n }\n }\n});\nconst windows = typeof navigator == \"object\" && /*@__PURE__*//Win/.test(navigator.platform);\nconst commitCharacters = /*@__PURE__*/Prec.highest(/*@__PURE__*/EditorView.domEventHandlers({\n keydown(event, view) {\n let field = view.state.field(completionState, false);\n if (!field || !field.open || field.open.disabled || field.open.selected < 0 ||\n event.key.length > 1 || event.ctrlKey && !(windows && event.altKey) || event.metaKey)\n return false;\n let option = field.open.options[field.open.selected];\n let result = field.active.find(a => a.source == option.source);\n let commitChars = option.completion.commitCharacters || result.result.commitCharacters;\n if (commitChars && commitChars.indexOf(event.key) > -1)\n applyCompletion(view, option);\n return false;\n }\n}));\n\nconst baseTheme = /*@__PURE__*/EditorView.baseTheme({\n \".cm-tooltip.cm-tooltip-autocomplete\": {\n \"& > ul\": {\n fontFamily: \"monospace\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden auto\",\n maxWidth_fallback: \"700px\",\n maxWidth: \"min(700px, 95vw)\",\n minWidth: \"250px\",\n maxHeight: \"10em\",\n height: \"100%\",\n listStyle: \"none\",\n margin: 0,\n padding: 0,\n \"& > li, & > completion-section\": {\n padding: \"1px 3px\",\n lineHeight: 1.2\n },\n \"& > li\": {\n overflowX: \"hidden\",\n textOverflow: \"ellipsis\",\n cursor: \"pointer\"\n },\n \"& > completion-section\": {\n display: \"list-item\",\n borderBottom: \"1px solid silver\",\n paddingLeft: \"0.5em\",\n opacity: 0.7\n }\n }\n },\n \"&light .cm-tooltip-autocomplete ul li[aria-selected]\": {\n background: \"#17c\",\n color: \"white\",\n },\n \"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]\": {\n background: \"#777\",\n },\n \"&dark .cm-tooltip-autocomplete ul li[aria-selected]\": {\n background: \"#347\",\n color: \"white\",\n },\n \"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]\": {\n background: \"#444\",\n },\n \".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after\": {\n content: '\"···\"',\n opacity: 0.5,\n display: \"block\",\n textAlign: \"center\"\n },\n \".cm-tooltip.cm-completionInfo\": {\n position: \"absolute\",\n padding: \"3px 9px\",\n width: \"max-content\",\n maxWidth: `${400 /* Info.Width */}px`,\n boxSizing: \"border-box\",\n whiteSpace: \"pre-line\"\n },\n \".cm-completionInfo.cm-completionInfo-left\": { right: \"100%\" },\n \".cm-completionInfo.cm-completionInfo-right\": { left: \"100%\" },\n \".cm-completionInfo.cm-completionInfo-left-narrow\": { right: `${30 /* Info.Margin */}px` },\n \".cm-completionInfo.cm-completionInfo-right-narrow\": { left: `${30 /* Info.Margin */}px` },\n \"&light .cm-snippetField\": { backgroundColor: \"#00000022\" },\n \"&dark .cm-snippetField\": { backgroundColor: \"#ffffff22\" },\n \".cm-snippetFieldPosition\": {\n verticalAlign: \"text-top\",\n width: 0,\n height: \"1.15em\",\n display: \"inline-block\",\n margin: \"0 -0.7px -.7em\",\n borderLeft: \"1.4px dotted #888\"\n },\n \".cm-completionMatchedText\": {\n textDecoration: \"underline\"\n },\n \".cm-completionDetail\": {\n marginLeft: \"0.5em\",\n fontStyle: \"italic\"\n },\n \".cm-completionIcon\": {\n fontSize: \"90%\",\n width: \".8em\",\n display: \"inline-block\",\n textAlign: \"center\",\n paddingRight: \".6em\",\n opacity: \"0.6\",\n boxSizing: \"content-box\"\n },\n \".cm-completionIcon-function, .cm-completionIcon-method\": {\n \"&:after\": { content: \"'ƒ'\" }\n },\n \".cm-completionIcon-class\": {\n \"&:after\": { content: \"'○'\" }\n },\n \".cm-completionIcon-interface\": {\n \"&:after\": { content: \"'◌'\" }\n },\n \".cm-completionIcon-variable\": {\n \"&:after\": { content: \"'𝑥'\" }\n },\n \".cm-completionIcon-constant\": {\n \"&:after\": { content: \"'𝐶'\" }\n },\n \".cm-completionIcon-type\": {\n \"&:after\": { content: \"'𝑡'\" }\n },\n \".cm-completionIcon-enum\": {\n \"&:after\": { content: \"'∪'\" }\n },\n \".cm-completionIcon-property\": {\n \"&:after\": { content: \"'□'\" }\n },\n \".cm-completionIcon-keyword\": {\n \"&:after\": { content: \"'🔑\\uFE0E'\" } // Disable emoji rendering\n },\n \".cm-completionIcon-namespace\": {\n \"&:after\": { content: \"'▢'\" }\n },\n \".cm-completionIcon-text\": {\n \"&:after\": { content: \"'abc'\", fontSize: \"50%\", verticalAlign: \"middle\" }\n }\n});\n\nclass FieldPos {\n constructor(field, line, from, to) {\n this.field = field;\n this.line = line;\n this.from = from;\n this.to = to;\n }\n}\nclass FieldRange {\n constructor(field, from, to) {\n this.field = field;\n this.from = from;\n this.to = to;\n }\n map(changes) {\n let from = changes.mapPos(this.from, -1, MapMode.TrackDel);\n let to = changes.mapPos(this.to, 1, MapMode.TrackDel);\n return from == null || to == null ? null : new FieldRange(this.field, from, to);\n }\n}\nclass Snippet {\n constructor(lines, fieldPositions) {\n this.lines = lines;\n this.fieldPositions = fieldPositions;\n }\n instantiate(state, pos) {\n let text = [], lineStart = [pos];\n let lineObj = state.doc.lineAt(pos), baseIndent = /^\\s*/.exec(lineObj.text)[0];\n for (let line of this.lines) {\n if (text.length) {\n let indent = baseIndent, tabs = /^\\t*/.exec(line)[0].length;\n for (let i = 0; i < tabs; i++)\n indent += state.facet(indentUnit);\n lineStart.push(pos + indent.length - tabs);\n line = indent + line.slice(tabs);\n }\n text.push(line);\n pos += line.length + 1;\n }\n let ranges = this.fieldPositions.map(pos => new FieldRange(pos.field, lineStart[pos.line] + pos.from, lineStart[pos.line] + pos.to));\n return { text, ranges };\n }\n static parse(template) {\n let fields = [];\n let lines = [], positions = [], m;\n for (let line of template.split(/\\r\\n?|\\n/)) {\n while (m = /[#$]\\{(?:(\\d+)(?::([^}]*))?|((?:\\\\[{}]|[^}])*))\\}/.exec(line)) {\n let seq = m[1] ? +m[1] : null, rawName = m[2] || m[3] || \"\", found = -1;\n let name = rawName.replace(/\\\\[{}]/g, m => m[1]);\n for (let i = 0; i < fields.length; i++) {\n if (seq != null ? fields[i].seq == seq : name ? fields[i].name == name : false)\n found = i;\n }\n if (found < 0) {\n let i = 0;\n while (i < fields.length && (seq == null || (fields[i].seq != null && fields[i].seq < seq)))\n i++;\n fields.splice(i, 0, { seq, name });\n found = i;\n for (let pos of positions)\n if (pos.field >= found)\n pos.field++;\n }\n positions.push(new FieldPos(found, lines.length, m.index, m.index + name.length));\n line = line.slice(0, m.index) + rawName + line.slice(m.index + m[0].length);\n }\n line = line.replace(/\\\\([{}])/g, (_, brace, index) => {\n for (let pos of positions)\n if (pos.line == lines.length && pos.from > index) {\n pos.from--;\n pos.to--;\n }\n return brace;\n });\n lines.push(line);\n }\n return new Snippet(lines, positions);\n }\n}\nlet fieldMarker = /*@__PURE__*/Decoration.widget({ widget: /*@__PURE__*/new class extends WidgetType {\n toDOM() {\n let span = document.createElement(\"span\");\n span.className = \"cm-snippetFieldPosition\";\n return span;\n }\n ignoreEvent() { return false; }\n } });\nlet fieldRange = /*@__PURE__*/Decoration.mark({ class: \"cm-snippetField\" });\nclass ActiveSnippet {\n constructor(ranges, active) {\n this.ranges = ranges;\n this.active = active;\n this.deco = Decoration.set(ranges.map(r => (r.from == r.to ? fieldMarker : fieldRange).range(r.from, r.to)));\n }\n map(changes) {\n let ranges = [];\n for (let r of this.ranges) {\n let mapped = r.map(changes);\n if (!mapped)\n return null;\n ranges.push(mapped);\n }\n return new ActiveSnippet(ranges, this.active);\n }\n selectionInsideField(sel) {\n return sel.ranges.every(range => this.ranges.some(r => r.field == this.active && r.from <= range.from && r.to >= range.to));\n }\n}\nconst setActive = /*@__PURE__*/StateEffect.define({\n map(value, changes) { return value && value.map(changes); }\n});\nconst moveToField = /*@__PURE__*/StateEffect.define();\nconst snippetState = /*@__PURE__*/StateField.define({\n create() { return null; },\n update(value, tr) {\n for (let effect of tr.effects) {\n if (effect.is(setActive))\n return effect.value;\n if (effect.is(moveToField) && value)\n return new ActiveSnippet(value.ranges, effect.value);\n }\n if (value && tr.docChanged)\n value = value.map(tr.changes);\n if (value && tr.selection && !value.selectionInsideField(tr.selection))\n value = null;\n return value;\n },\n provide: f => EditorView.decorations.from(f, val => val ? val.deco : Decoration.none)\n});\nfunction fieldSelection(ranges, field) {\n return EditorSelection.create(ranges.filter(r => r.field == field).map(r => EditorSelection.range(r.from, r.to)));\n}\n/**\nConvert a snippet template to a function that can\n[apply](https://codemirror.net/6/docs/ref/#autocomplete.Completion.apply) it. Snippets are written\nusing syntax like this:\n\n \"for (let ${index} = 0; ${index} < ${end}; ${index}++) {\\n\\t${}\\n}\"\n\nEach `${}` placeholder (you may also use `#{}`) indicates a field\nthat the user can fill in. Its name, if any, will be the default\ncontent for the field.\n\nWhen the snippet is activated by calling the returned function,\nthe code is inserted at the given position. Newlines in the\ntemplate are indented by the indentation of the start line, plus\none [indent unit](https://codemirror.net/6/docs/ref/#language.indentUnit) per tab character after\nthe newline.\n\nOn activation, (all instances of) the first field are selected.\nThe user can move between fields with Tab and Shift-Tab as long as\nthe fields are active. Moving to the last field or moving the\ncursor out of the current field deactivates the fields.\n\nThe order of fields defaults to textual order, but you can add\nnumbers to placeholders (`${1}` or `${1:defaultText}`) to provide\na custom order.\n\nTo include a literal `{` or `}` in your template, put a backslash\nin front of it. This will be removed and the brace will not be\ninterpreted as indicating a placeholder.\n*/\nfunction snippet(template) {\n let snippet = Snippet.parse(template);\n return (editor, completion, from, to) => {\n let { text, ranges } = snippet.instantiate(editor.state, from);\n let { main } = editor.state.selection;\n let spec = {\n changes: { from, to: to == main.from ? main.to : to, insert: Text.of(text) },\n scrollIntoView: true,\n annotations: completion ? [pickedCompletion.of(completion), Transaction.userEvent.of(\"input.complete\")] : undefined\n };\n if (ranges.length)\n spec.selection = fieldSelection(ranges, 0);\n if (ranges.some(r => r.field > 0)) {\n let active = new ActiveSnippet(ranges, 0);\n let effects = spec.effects = [setActive.of(active)];\n if (editor.state.field(snippetState, false) === undefined)\n effects.push(StateEffect.appendConfig.of([snippetState, addSnippetKeymap, snippetPointerHandler, baseTheme]));\n }\n editor.dispatch(editor.state.update(spec));\n };\n}\nfunction moveField(dir) {\n return ({ state, dispatch }) => {\n let active = state.field(snippetState, false);\n if (!active || dir < 0 && active.active == 0)\n return false;\n let next = active.active + dir, last = dir > 0 && !active.ranges.some(r => r.field == next + dir);\n dispatch(state.update({\n selection: fieldSelection(active.ranges, next),\n effects: setActive.of(last ? null : new ActiveSnippet(active.ranges, next)),\n scrollIntoView: true\n }));\n return true;\n };\n}\n/**\nA command that clears the active snippet, if any.\n*/\nconst clearSnippet = ({ state, dispatch }) => {\n let active = state.field(snippetState, false);\n if (!active)\n return false;\n dispatch(state.update({ effects: setActive.of(null) }));\n return true;\n};\n/**\nMove to the next snippet field, if available.\n*/\nconst nextSnippetField = /*@__PURE__*/moveField(1);\n/**\nMove to the previous snippet field, if available.\n*/\nconst prevSnippetField = /*@__PURE__*/moveField(-1);\n/**\nCheck if there is an active snippet with a next field for\n`nextSnippetField` to move to.\n*/\nfunction hasNextSnippetField(state) {\n let active = state.field(snippetState, false);\n return !!(active && active.ranges.some(r => r.field == active.active + 1));\n}\n/**\nReturns true if there is an active snippet and a previous field\nfor `prevSnippetField` to move to.\n*/\nfunction hasPrevSnippetField(state) {\n let active = state.field(snippetState, false);\n return !!(active && active.active > 0);\n}\nconst defaultSnippetKeymap = [\n { key: \"Tab\", run: nextSnippetField, shift: prevSnippetField },\n { key: \"Escape\", run: clearSnippet }\n];\n/**\nA facet that can be used to configure the key bindings used by\nsnippets. The default binds Tab to\n[`nextSnippetField`](https://codemirror.net/6/docs/ref/#autocomplete.nextSnippetField), Shift-Tab to\n[`prevSnippetField`](https://codemirror.net/6/docs/ref/#autocomplete.prevSnippetField), and Escape\nto [`clearSnippet`](https://codemirror.net/6/docs/ref/#autocomplete.clearSnippet).\n*/\nconst snippetKeymap = /*@__PURE__*/Facet.define({\n combine(maps) { return maps.length ? maps[0] : defaultSnippetKeymap; }\n});\nconst addSnippetKeymap = /*@__PURE__*/Prec.highest(/*@__PURE__*/keymap.compute([snippetKeymap], state => state.facet(snippetKeymap)));\n/**\nCreate a completion from a snippet. Returns an object with the\nproperties from `completion`, plus an `apply` function that\napplies the snippet.\n*/\nfunction snippetCompletion(template, completion) {\n return Object.assign(Object.assign({}, completion), { apply: snippet(template) });\n}\nconst snippetPointerHandler = /*@__PURE__*/EditorView.domEventHandlers({\n mousedown(event, view) {\n let active = view.state.field(snippetState, false), pos;\n if (!active || (pos = view.posAtCoords({ x: event.clientX, y: event.clientY })) == null)\n return false;\n let match = active.ranges.find(r => r.from <= pos && r.to >= pos);\n if (!match || match.field == active.active)\n return false;\n view.dispatch({\n selection: fieldSelection(active.ranges, match.field),\n effects: setActive.of(active.ranges.some(r => r.field > match.field)\n ? new ActiveSnippet(active.ranges, match.field) : null),\n scrollIntoView: true\n });\n return true;\n }\n});\n\nfunction wordRE(wordChars) {\n let escaped = wordChars.replace(/[\\]\\-\\\\]/g, \"\\\\$&\");\n try {\n return new RegExp(`[\\\\p{Alphabetic}\\\\p{Number}_${escaped}]+`, \"ug\");\n }\n catch (_a) {\n return new RegExp(`[\\w${escaped}]`, \"g\");\n }\n}\nfunction mapRE(re, f) {\n return new RegExp(f(re.source), re.unicode ? \"u\" : \"\");\n}\nconst wordCaches = /*@__PURE__*/Object.create(null);\nfunction wordCache(wordChars) {\n return wordCaches[wordChars] || (wordCaches[wordChars] = new WeakMap);\n}\nfunction storeWords(doc, wordRE, result, seen, ignoreAt) {\n for (let lines = doc.iterLines(), pos = 0; !lines.next().done;) {\n let { value } = lines, m;\n wordRE.lastIndex = 0;\n while (m = wordRE.exec(value)) {\n if (!seen[m[0]] && pos + m.index != ignoreAt) {\n result.push({ type: \"text\", label: m[0] });\n seen[m[0]] = true;\n if (result.length >= 2000 /* C.MaxList */)\n return;\n }\n }\n pos += value.length + 1;\n }\n}\nfunction collectWords(doc, cache, wordRE, to, ignoreAt) {\n let big = doc.length >= 1000 /* C.MinCacheLen */;\n let cached = big && cache.get(doc);\n if (cached)\n return cached;\n let result = [], seen = Object.create(null);\n if (doc.children) {\n let pos = 0;\n for (let ch of doc.children) {\n if (ch.length >= 1000 /* C.MinCacheLen */) {\n for (let c of collectWords(ch, cache, wordRE, to - pos, ignoreAt - pos)) {\n if (!seen[c.label]) {\n seen[c.label] = true;\n result.push(c);\n }\n }\n }\n else {\n storeWords(ch, wordRE, result, seen, ignoreAt - pos);\n }\n pos += ch.length + 1;\n }\n }\n else {\n storeWords(doc, wordRE, result, seen, ignoreAt);\n }\n if (big && result.length < 2000 /* C.MaxList */)\n cache.set(doc, result);\n return result;\n}\n/**\nA completion source that will scan the document for words (using a\n[character categorizer](https://codemirror.net/6/docs/ref/#state.EditorState.charCategorizer)), and\nreturn those as completions.\n*/\nconst completeAnyWord = context => {\n let wordChars = context.state.languageDataAt(\"wordChars\", context.pos).join(\"\");\n let re = wordRE(wordChars);\n let token = context.matchBefore(mapRE(re, s => s + \"$\"));\n if (!token && !context.explicit)\n return null;\n let from = token ? token.from : context.pos;\n let options = collectWords(context.state.doc, wordCache(wordChars), re, 50000 /* C.Range */, from);\n return { from, options, validFor: mapRE(re, s => \"^\" + s) };\n};\n\nconst defaults = {\n brackets: [\"(\", \"[\", \"{\", \"'\", '\"'],\n before: \")]}:;>\",\n stringPrefixes: []\n};\nconst closeBracketEffect = /*@__PURE__*/StateEffect.define({\n map(value, mapping) {\n let mapped = mapping.mapPos(value, -1, MapMode.TrackAfter);\n return mapped == null ? undefined : mapped;\n }\n});\nconst closedBracket = /*@__PURE__*/new class extends RangeValue {\n};\nclosedBracket.startSide = 1;\nclosedBracket.endSide = -1;\nconst bracketState = /*@__PURE__*/StateField.define({\n create() { return RangeSet.empty; },\n update(value, tr) {\n value = value.map(tr.changes);\n if (tr.selection) {\n let line = tr.state.doc.lineAt(tr.selection.main.head);\n value = value.update({ filter: from => from >= line.from && from <= line.to });\n }\n for (let effect of tr.effects)\n if (effect.is(closeBracketEffect))\n value = value.update({ add: [closedBracket.range(effect.value, effect.value + 1)] });\n return value;\n }\n});\n/**\nExtension to enable bracket-closing behavior. When a closeable\nbracket is typed, its closing bracket is immediately inserted\nafter the cursor. When closing a bracket directly in front of a\nclosing bracket inserted by the extension, the cursor moves over\nthat bracket.\n*/\nfunction closeBrackets() {\n return [inputHandler, bracketState];\n}\nconst definedClosing = \"()[]{}<>«»»«[]{}\";\nfunction closing(ch) {\n for (let i = 0; i < definedClosing.length; i += 2)\n if (definedClosing.charCodeAt(i) == ch)\n return definedClosing.charAt(i + 1);\n return fromCodePoint(ch < 128 ? ch : ch + 1);\n}\nfunction config(state, pos) {\n return state.languageDataAt(\"closeBrackets\", pos)[0] || defaults;\n}\nconst android = typeof navigator == \"object\" && /*@__PURE__*//Android\\b/.test(navigator.userAgent);\nconst inputHandler = /*@__PURE__*/EditorView.inputHandler.of((view, from, to, insert) => {\n if ((android ? view.composing : view.compositionStarted) || view.state.readOnly)\n return false;\n let sel = view.state.selection.main;\n if (insert.length > 2 || insert.length == 2 && codePointSize(codePointAt(insert, 0)) == 1 ||\n from != sel.from || to != sel.to)\n return false;\n let tr = insertBracket(view.state, insert);\n if (!tr)\n return false;\n view.dispatch(tr);\n return true;\n});\n/**\nCommand that implements deleting a pair of matching brackets when\nthe cursor is between them.\n*/\nconst deleteBracketPair = ({ state, dispatch }) => {\n if (state.readOnly)\n return false;\n let conf = config(state, state.selection.main.head);\n let tokens = conf.brackets || defaults.brackets;\n let dont = null, changes = state.changeByRange(range => {\n if (range.empty) {\n let before = prevChar(state.doc, range.head);\n for (let token of tokens) {\n if (token == before && nextChar(state.doc, range.head) == closing(codePointAt(token, 0)))\n return { changes: { from: range.head - token.length, to: range.head + token.length },\n range: EditorSelection.cursor(range.head - token.length) };\n }\n }\n return { range: dont = range };\n });\n if (!dont)\n dispatch(state.update(changes, { scrollIntoView: true, userEvent: \"delete.backward\" }));\n return !dont;\n};\n/**\nClose-brackets related key bindings. Binds Backspace to\n[`deleteBracketPair`](https://codemirror.net/6/docs/ref/#autocomplete.deleteBracketPair).\n*/\nconst closeBracketsKeymap = [\n { key: \"Backspace\", run: deleteBracketPair }\n];\n/**\nImplements the extension's behavior on text insertion. If the\ngiven string counts as a bracket in the language around the\nselection, and replacing the selection with it requires custom\nbehavior (inserting a closing version or skipping past a\npreviously-closed bracket), this function returns a transaction\nrepresenting that custom behavior. (You only need this if you want\nto programmatically insert brackets—the\n[`closeBrackets`](https://codemirror.net/6/docs/ref/#autocomplete.closeBrackets) extension will\ntake care of running this for user input.)\n*/\nfunction insertBracket(state, bracket) {\n let conf = config(state, state.selection.main.head);\n let tokens = conf.brackets || defaults.brackets;\n for (let tok of tokens) {\n let closed = closing(codePointAt(tok, 0));\n if (bracket == tok)\n return closed == tok ? handleSame(state, tok, tokens.indexOf(tok + tok + tok) > -1, conf)\n : handleOpen(state, tok, closed, conf.before || defaults.before);\n if (bracket == closed && closedBracketAt(state, state.selection.main.from))\n return handleClose(state, tok, closed);\n }\n return null;\n}\nfunction closedBracketAt(state, pos) {\n let found = false;\n state.field(bracketState).between(0, state.doc.length, from => {\n if (from == pos)\n found = true;\n });\n return found;\n}\nfunction nextChar(doc, pos) {\n let next = doc.sliceString(pos, pos + 2);\n return next.slice(0, codePointSize(codePointAt(next, 0)));\n}\nfunction prevChar(doc, pos) {\n let prev = doc.sliceString(pos - 2, pos);\n return codePointSize(codePointAt(prev, 0)) == prev.length ? prev : prev.slice(1);\n}\nfunction handleOpen(state, open, close, closeBefore) {\n let dont = null, changes = state.changeByRange(range => {\n if (!range.empty)\n return { changes: [{ insert: open, from: range.from }, { insert: close, from: range.to }],\n effects: closeBracketEffect.of(range.to + open.length),\n range: EditorSelection.range(range.anchor + open.length, range.head + open.length) };\n let next = nextChar(state.doc, range.head);\n if (!next || /\\s/.test(next) || closeBefore.indexOf(next) > -1)\n return { changes: { insert: open + close, from: range.head },\n effects: closeBracketEffect.of(range.head + open.length),\n range: EditorSelection.cursor(range.head + open.length) };\n return { range: dont = range };\n });\n return dont ? null : state.update(changes, {\n scrollIntoView: true,\n userEvent: \"input.type\"\n });\n}\nfunction handleClose(state, _open, close) {\n let dont = null, changes = state.changeByRange(range => {\n if (range.empty && nextChar(state.doc, range.head) == close)\n return { changes: { from: range.head, to: range.head + close.length, insert: close },\n range: EditorSelection.cursor(range.head + close.length) };\n return dont = { range };\n });\n return dont ? null : state.update(changes, {\n scrollIntoView: true,\n userEvent: \"input.type\"\n });\n}\n// Handles cases where the open and close token are the same, and\n// possibly triple quotes (as in `\"\"\"abc\"\"\"`-style quoting).\nfunction handleSame(state, token, allowTriple, config) {\n let stringPrefixes = config.stringPrefixes || defaults.stringPrefixes;\n let dont = null, changes = state.changeByRange(range => {\n if (!range.empty)\n return { changes: [{ insert: token, from: range.from }, { insert: token, from: range.to }],\n effects: closeBracketEffect.of(range.to + token.length),\n range: EditorSelection.range(range.anchor + token.length, range.head + token.length) };\n let pos = range.head, next = nextChar(state.doc, pos), start;\n if (next == token) {\n if (nodeStart(state, pos)) {\n return { changes: { insert: token + token, from: pos },\n effects: closeBracketEffect.of(pos + token.length),\n range: EditorSelection.cursor(pos + token.length) };\n }\n else if (closedBracketAt(state, pos)) {\n let isTriple = allowTriple && state.sliceDoc(pos, pos + token.length * 3) == token + token + token;\n let content = isTriple ? token + token + token : token;\n return { changes: { from: pos, to: pos + content.length, insert: content },\n range: EditorSelection.cursor(pos + content.length) };\n }\n }\n else if (allowTriple && state.sliceDoc(pos - 2 * token.length, pos) == token + token &&\n (start = canStartStringAt(state, pos - 2 * token.length, stringPrefixes)) > -1 &&\n nodeStart(state, start)) {\n return { changes: { insert: token + token + token + token, from: pos },\n effects: closeBracketEffect.of(pos + token.length),\n range: EditorSelection.cursor(pos + token.length) };\n }\n else if (state.charCategorizer(pos)(next) != CharCategory.Word) {\n if (canStartStringAt(state, pos, stringPrefixes) > -1 && !probablyInString(state, pos, token, stringPrefixes))\n return { changes: { insert: token + token, from: pos },\n effects: closeBracketEffect.of(pos + token.length),\n range: EditorSelection.cursor(pos + token.length) };\n }\n return { range: dont = range };\n });\n return dont ? null : state.update(changes, {\n scrollIntoView: true,\n userEvent: \"input.type\"\n });\n}\nfunction nodeStart(state, pos) {\n let tree = syntaxTree(state).resolveInner(pos + 1);\n return tree.parent && tree.from == pos;\n}\nfunction probablyInString(state, pos, quoteToken, prefixes) {\n let node = syntaxTree(state).resolveInner(pos, -1);\n let maxPrefix = prefixes.reduce((m, p) => Math.max(m, p.length), 0);\n for (let i = 0; i < 5; i++) {\n let start = state.sliceDoc(node.from, Math.min(node.to, node.from + quoteToken.length + maxPrefix));\n let quotePos = start.indexOf(quoteToken);\n if (!quotePos || quotePos > -1 && prefixes.indexOf(start.slice(0, quotePos)) > -1) {\n let first = node.firstChild;\n while (first && first.from == node.from && first.to - first.from > quoteToken.length + quotePos) {\n if (state.sliceDoc(first.to - quoteToken.length, first.to) == quoteToken)\n return false;\n first = first.firstChild;\n }\n return true;\n }\n let parent = node.to == pos && node.parent;\n if (!parent)\n break;\n node = parent;\n }\n return false;\n}\nfunction canStartStringAt(state, pos, prefixes) {\n let charCat = state.charCategorizer(pos);\n if (charCat(state.sliceDoc(pos - 1, pos)) != CharCategory.Word)\n return pos;\n for (let prefix of prefixes) {\n let start = pos - prefix.length;\n if (state.sliceDoc(start, pos) == prefix && charCat(state.sliceDoc(start - 1, start)) != CharCategory.Word)\n return start;\n }\n return -1;\n}\n\n/**\nReturns an extension that enables autocompletion.\n*/\nfunction autocompletion(config = {}) {\n return [\n commitCharacters,\n completionState,\n completionConfig.of(config),\n completionPlugin,\n completionKeymapExt,\n baseTheme\n ];\n}\n/**\nBasic keybindings for autocompletion.\n\n - Ctrl-Space (and Alt-\\` on macOS): [`startCompletion`](https://codemirror.net/6/docs/ref/#autocomplete.startCompletion)\n - Escape: [`closeCompletion`](https://codemirror.net/6/docs/ref/#autocomplete.closeCompletion)\n - ArrowDown: [`moveCompletionSelection`](https://codemirror.net/6/docs/ref/#autocomplete.moveCompletionSelection)`(true)`\n - ArrowUp: [`moveCompletionSelection`](https://codemirror.net/6/docs/ref/#autocomplete.moveCompletionSelection)`(false)`\n - PageDown: [`moveCompletionSelection`](https://codemirror.net/6/docs/ref/#autocomplete.moveCompletionSelection)`(true, \"page\")`\n - PageDown: [`moveCompletionSelection`](https://codemirror.net/6/docs/ref/#autocomplete.moveCompletionSelection)`(true, \"page\")`\n - Enter: [`acceptCompletion`](https://codemirror.net/6/docs/ref/#autocomplete.acceptCompletion)\n*/\nconst completionKeymap = [\n { key: \"Ctrl-Space\", run: startCompletion },\n { mac: \"Alt-`\", run: startCompletion },\n { key: \"Escape\", run: closeCompletion },\n { key: \"ArrowDown\", run: /*@__PURE__*/moveCompletionSelection(true) },\n { key: \"ArrowUp\", run: /*@__PURE__*/moveCompletionSelection(false) },\n { key: \"PageDown\", run: /*@__PURE__*/moveCompletionSelection(true, \"page\") },\n { key: \"PageUp\", run: /*@__PURE__*/moveCompletionSelection(false, \"page\") },\n { key: \"Enter\", run: acceptCompletion }\n];\nconst completionKeymapExt = /*@__PURE__*/Prec.highest(/*@__PURE__*/keymap.computeN([completionConfig], state => state.facet(completionConfig).defaultKeymap ? [completionKeymap] : []));\n/**\nGet the current completion status. When completions are available,\nthis will return `\"active\"`. When completions are pending (in the\nprocess of being queried), this returns `\"pending\"`. Otherwise, it\nreturns `null`.\n*/\nfunction completionStatus(state) {\n let cState = state.field(completionState, false);\n return cState && cState.active.some(a => a.isPending) ? \"pending\"\n : cState && cState.active.some(a => a.state != 0 /* State.Inactive */) ? \"active\" : null;\n}\nconst completionArrayCache = /*@__PURE__*/new WeakMap;\n/**\nReturns the available completions as an array.\n*/\nfunction currentCompletions(state) {\n var _a;\n let open = (_a = state.field(completionState, false)) === null || _a === void 0 ? void 0 : _a.open;\n if (!open || open.disabled)\n return [];\n let completions = completionArrayCache.get(open.options);\n if (!completions)\n completionArrayCache.set(open.options, completions = open.options.map(o => o.completion));\n return completions;\n}\n/**\nReturn the currently selected completion, if any.\n*/\nfunction selectedCompletion(state) {\n var _a;\n let open = (_a = state.field(completionState, false)) === null || _a === void 0 ? void 0 : _a.open;\n return open && !open.disabled && open.selected >= 0 ? open.options[open.selected].completion : null;\n}\n/**\nReturns the currently selected position in the active completion\nlist, or null if no completions are active.\n*/\nfunction selectedCompletionIndex(state) {\n var _a;\n let open = (_a = state.field(completionState, false)) === null || _a === void 0 ? void 0 : _a.open;\n return open && !open.disabled && open.selected >= 0 ? open.selected : null;\n}\n/**\nCreate an effect that can be attached to a transaction to change\nthe currently selected completion.\n*/\nfunction setSelectedCompletion(index) {\n return setSelectedEffect.of(index);\n}\n\nexport { CompletionContext, acceptCompletion, autocompletion, clearSnippet, closeBrackets, closeBracketsKeymap, closeCompletion, completeAnyWord, completeFromList, completionKeymap, completionStatus, currentCompletions, deleteBracketPair, hasNextSnippetField, hasPrevSnippetField, ifIn, ifNotIn, insertBracket, insertCompletionText, moveCompletionSelection, nextSnippetField, pickedCompletion, prevSnippetField, selectedCompletion, selectedCompletionIndex, setSelectedCompletion, snippet, snippetCompletion, snippetKeymap, startCompletion };\n","import { Decoration, showPanel, EditorView, ViewPlugin, gutter, showTooltip, hoverTooltip, getPanel, logException, WidgetType, GutterMarker } from '@codemirror/view';\nimport { StateEffect, StateField, Facet, combineConfig, RangeSet, RangeSetBuilder } from '@codemirror/state';\nimport elt from 'crelt';\n\nclass SelectedDiagnostic {\n constructor(from, to, diagnostic) {\n this.from = from;\n this.to = to;\n this.diagnostic = diagnostic;\n }\n}\nclass LintState {\n constructor(diagnostics, panel, selected) {\n this.diagnostics = diagnostics;\n this.panel = panel;\n this.selected = selected;\n }\n static init(diagnostics, panel, state) {\n // Filter the list of diagnostics for which to create markers\n let diagnosticFilter = state.facet(lintConfig).markerFilter;\n if (diagnosticFilter)\n diagnostics = diagnosticFilter(diagnostics, state);\n let sorted = diagnostics.slice().sort((a, b) => a.from - b.from || a.to - b.to);\n let deco = new RangeSetBuilder(), active = [], pos = 0;\n for (let i = 0;;) {\n let next = i == sorted.length ? null : sorted[i];\n if (!next && !active.length)\n break;\n let from, to;\n if (active.length) {\n from = pos;\n to = active.reduce((p, d) => Math.min(p, d.to), next && next.from > from ? next.from : 1e8);\n }\n else {\n from = next.from;\n to = next.to;\n active.push(next);\n i++;\n }\n while (i < sorted.length) {\n let next = sorted[i];\n if (next.from == from && (next.to > next.from || next.to == from)) {\n active.push(next);\n i++;\n to = Math.min(next.to, to);\n }\n else {\n to = Math.min(next.from, to);\n break;\n }\n }\n let sev = maxSeverity(active);\n if (active.some(d => d.from == d.to || (d.from == d.to - 1 && state.doc.lineAt(d.from).to == d.from))) {\n deco.add(from, from, Decoration.widget({\n widget: new DiagnosticWidget(sev),\n diagnostics: active.slice()\n }));\n }\n else {\n let markClass = active.reduce((c, d) => d.markClass ? c + \" \" + d.markClass : c, \"\");\n deco.add(from, to, Decoration.mark({\n class: \"cm-lintRange cm-lintRange-\" + sev + markClass,\n diagnostics: active.slice(),\n inclusiveEnd: active.some(a => a.to > to)\n }));\n }\n pos = to;\n for (let i = 0; i < active.length; i++)\n if (active[i].to <= pos)\n active.splice(i--, 1);\n }\n let set = deco.finish();\n return new LintState(set, panel, findDiagnostic(set));\n }\n}\nfunction findDiagnostic(diagnostics, diagnostic = null, after = 0) {\n let found = null;\n diagnostics.between(after, 1e9, (from, to, { spec }) => {\n if (diagnostic && spec.diagnostics.indexOf(diagnostic) < 0)\n return;\n if (!found)\n found = new SelectedDiagnostic(from, to, diagnostic || spec.diagnostics[0]);\n else if (spec.diagnostics.indexOf(found.diagnostic) < 0)\n return false;\n else\n found = new SelectedDiagnostic(found.from, to, found.diagnostic);\n });\n return found;\n}\nfunction hideTooltip(tr, tooltip) {\n let from = tooltip.pos, to = tooltip.end || from;\n let result = tr.state.facet(lintConfig).hideOn(tr, from, to);\n if (result != null)\n return result;\n let line = tr.startState.doc.lineAt(tooltip.pos);\n return !!(tr.effects.some(e => e.is(setDiagnosticsEffect)) || tr.changes.touchesRange(line.from, Math.max(line.to, to)));\n}\nfunction maybeEnableLint(state, effects) {\n return state.field(lintState, false) ? effects : effects.concat(StateEffect.appendConfig.of(lintExtensions));\n}\n/**\nReturns a transaction spec which updates the current set of\ndiagnostics, and enables the lint extension if if wasn't already\nactive.\n*/\nfunction setDiagnostics(state, diagnostics) {\n return {\n effects: maybeEnableLint(state, [setDiagnosticsEffect.of(diagnostics)])\n };\n}\n/**\nThe state effect that updates the set of active diagnostics. Can\nbe useful when writing an extension that needs to track these.\n*/\nconst setDiagnosticsEffect = /*@__PURE__*/StateEffect.define();\nconst togglePanel = /*@__PURE__*/StateEffect.define();\nconst movePanelSelection = /*@__PURE__*/StateEffect.define();\nconst lintState = /*@__PURE__*/StateField.define({\n create() {\n return new LintState(Decoration.none, null, null);\n },\n update(value, tr) {\n if (tr.docChanged && value.diagnostics.size) {\n let mapped = value.diagnostics.map(tr.changes), selected = null, panel = value.panel;\n if (value.selected) {\n let selPos = tr.changes.mapPos(value.selected.from, 1);\n selected = findDiagnostic(mapped, value.selected.diagnostic, selPos) || findDiagnostic(mapped, null, selPos);\n }\n if (!mapped.size && panel && tr.state.facet(lintConfig).autoPanel)\n panel = null;\n value = new LintState(mapped, panel, selected);\n }\n for (let effect of tr.effects) {\n if (effect.is(setDiagnosticsEffect)) {\n let panel = !tr.state.facet(lintConfig).autoPanel ? value.panel : effect.value.length ? LintPanel.open : null;\n value = LintState.init(effect.value, panel, tr.state);\n }\n else if (effect.is(togglePanel)) {\n value = new LintState(value.diagnostics, effect.value ? LintPanel.open : null, value.selected);\n }\n else if (effect.is(movePanelSelection)) {\n value = new LintState(value.diagnostics, value.panel, effect.value);\n }\n }\n return value;\n },\n provide: f => [showPanel.from(f, val => val.panel),\n EditorView.decorations.from(f, s => s.diagnostics)]\n});\n/**\nReturns the number of active lint diagnostics in the given state.\n*/\nfunction diagnosticCount(state) {\n let lint = state.field(lintState, false);\n return lint ? lint.diagnostics.size : 0;\n}\nconst activeMark = /*@__PURE__*/Decoration.mark({ class: \"cm-lintRange cm-lintRange-active\" });\nfunction lintTooltip(view, pos, side) {\n let { diagnostics } = view.state.field(lintState);\n let found, start = -1, end = -1;\n diagnostics.between(pos - (side < 0 ? 1 : 0), pos + (side > 0 ? 1 : 0), (from, to, { spec }) => {\n if (pos >= from && pos <= to &&\n (from == to || ((pos > from || side > 0) && (pos < to || side < 0)))) {\n found = spec.diagnostics;\n start = from;\n end = to;\n return false;\n }\n });\n let diagnosticFilter = view.state.facet(lintConfig).tooltipFilter;\n if (found && diagnosticFilter)\n found = diagnosticFilter(found, view.state);\n if (!found)\n return null;\n return {\n pos: start,\n end: end,\n above: view.state.doc.lineAt(start).to < end,\n create() {\n return { dom: diagnosticsTooltip(view, found) };\n }\n };\n}\nfunction diagnosticsTooltip(view, diagnostics) {\n return elt(\"ul\", { class: \"cm-tooltip-lint\" }, diagnostics.map(d => renderDiagnostic(view, d, false)));\n}\n/**\nCommand to open and focus the lint panel.\n*/\nconst openLintPanel = (view) => {\n let field = view.state.field(lintState, false);\n if (!field || !field.panel)\n view.dispatch({ effects: maybeEnableLint(view.state, [togglePanel.of(true)]) });\n let panel = getPanel(view, LintPanel.open);\n if (panel)\n panel.dom.querySelector(\".cm-panel-lint ul\").focus();\n return true;\n};\n/**\nCommand to close the lint panel, when open.\n*/\nconst closeLintPanel = (view) => {\n let field = view.state.field(lintState, false);\n if (!field || !field.panel)\n return false;\n view.dispatch({ effects: togglePanel.of(false) });\n return true;\n};\n/**\nMove the selection to the next diagnostic.\n*/\nconst nextDiagnostic = (view) => {\n let field = view.state.field(lintState, false);\n if (!field)\n return false;\n let sel = view.state.selection.main, next = field.diagnostics.iter(sel.to + 1);\n if (!next.value) {\n next = field.diagnostics.iter(0);\n if (!next.value || next.from == sel.from && next.to == sel.to)\n return false;\n }\n view.dispatch({ selection: { anchor: next.from, head: next.to }, scrollIntoView: true });\n return true;\n};\n/**\nMove the selection to the previous diagnostic.\n*/\nconst previousDiagnostic = (view) => {\n let { state } = view, field = state.field(lintState, false);\n if (!field)\n return false;\n let sel = state.selection.main;\n let prevFrom, prevTo, lastFrom, lastTo;\n field.diagnostics.between(0, state.doc.length, (from, to) => {\n if (to < sel.to && (prevFrom == null || prevFrom < from)) {\n prevFrom = from;\n prevTo = to;\n }\n if (lastFrom == null || from > lastFrom) {\n lastFrom = from;\n lastTo = to;\n }\n });\n if (lastFrom == null || prevFrom == null && lastFrom == sel.from)\n return false;\n view.dispatch({ selection: { anchor: prevFrom !== null && prevFrom !== void 0 ? prevFrom : lastFrom, head: prevTo !== null && prevTo !== void 0 ? prevTo : lastTo }, scrollIntoView: true });\n return true;\n};\n/**\nA set of default key bindings for the lint functionality.\n\n- Ctrl-Shift-m (Cmd-Shift-m on macOS): [`openLintPanel`](https://codemirror.net/6/docs/ref/#lint.openLintPanel)\n- F8: [`nextDiagnostic`](https://codemirror.net/6/docs/ref/#lint.nextDiagnostic)\n*/\nconst lintKeymap = [\n { key: \"Mod-Shift-m\", run: openLintPanel, preventDefault: true },\n { key: \"F8\", run: nextDiagnostic }\n];\nconst lintPlugin = /*@__PURE__*/ViewPlugin.fromClass(class {\n constructor(view) {\n this.view = view;\n this.timeout = -1;\n this.set = true;\n let { delay } = view.state.facet(lintConfig);\n this.lintTime = Date.now() + delay;\n this.run = this.run.bind(this);\n this.timeout = setTimeout(this.run, delay);\n }\n run() {\n clearTimeout(this.timeout);\n let now = Date.now();\n if (now < this.lintTime - 10) {\n this.timeout = setTimeout(this.run, this.lintTime - now);\n }\n else {\n this.set = false;\n let { state } = this.view, { sources } = state.facet(lintConfig);\n if (sources.length)\n batchResults(sources.map(s => Promise.resolve(s(this.view))), annotations => {\n if (this.view.state.doc == state.doc)\n this.view.dispatch(setDiagnostics(this.view.state, annotations.reduce((a, b) => a.concat(b))));\n }, error => { logException(this.view.state, error); });\n }\n }\n update(update) {\n let config = update.state.facet(lintConfig);\n if (update.docChanged || config != update.startState.facet(lintConfig) ||\n config.needsRefresh && config.needsRefresh(update)) {\n this.lintTime = Date.now() + config.delay;\n if (!this.set) {\n this.set = true;\n this.timeout = setTimeout(this.run, config.delay);\n }\n }\n }\n force() {\n if (this.set) {\n this.lintTime = Date.now();\n this.run();\n }\n }\n destroy() {\n clearTimeout(this.timeout);\n }\n});\nfunction batchResults(promises, sink, error) {\n let collected = [], timeout = -1;\n for (let p of promises)\n p.then(value => {\n collected.push(value);\n clearTimeout(timeout);\n if (collected.length == promises.length)\n sink(collected);\n else\n timeout = setTimeout(() => sink(collected), 200);\n }, error);\n}\nconst lintConfig = /*@__PURE__*/Facet.define({\n combine(input) {\n return Object.assign({ sources: input.map(i => i.source).filter(x => x != null) }, combineConfig(input.map(i => i.config), {\n delay: 750,\n markerFilter: null,\n tooltipFilter: null,\n needsRefresh: null,\n hideOn: () => null,\n }, {\n needsRefresh: (a, b) => !a ? b : !b ? a : u => a(u) || b(u)\n }));\n }\n});\n/**\nGiven a diagnostic source, this function returns an extension that\nenables linting with that source. It will be called whenever the\neditor is idle (after its content changed). If `null` is given as\nsource, this only configures the lint extension.\n*/\nfunction linter(source, config = {}) {\n return [\n lintConfig.of({ source, config }),\n lintPlugin,\n lintExtensions\n ];\n}\n/**\nForces any linters [configured](https://codemirror.net/6/docs/ref/#lint.linter) to run when the\neditor is idle to run right away.\n*/\nfunction forceLinting(view) {\n let plugin = view.plugin(lintPlugin);\n if (plugin)\n plugin.force();\n}\nfunction assignKeys(actions) {\n let assigned = [];\n if (actions)\n actions: for (let { name } of actions) {\n for (let i = 0; i < name.length; i++) {\n let ch = name[i];\n if (/[a-zA-Z]/.test(ch) && !assigned.some(c => c.toLowerCase() == ch.toLowerCase())) {\n assigned.push(ch);\n continue actions;\n }\n }\n assigned.push(\"\");\n }\n return assigned;\n}\nfunction renderDiagnostic(view, diagnostic, inPanel) {\n var _a;\n let keys = inPanel ? assignKeys(diagnostic.actions) : [];\n return elt(\"li\", { class: \"cm-diagnostic cm-diagnostic-\" + diagnostic.severity }, elt(\"span\", { class: \"cm-diagnosticText\" }, diagnostic.renderMessage ? diagnostic.renderMessage(view) : diagnostic.message), (_a = diagnostic.actions) === null || _a === void 0 ? void 0 : _a.map((action, i) => {\n let fired = false, click = (e) => {\n e.preventDefault();\n if (fired)\n return;\n fired = true;\n let found = findDiagnostic(view.state.field(lintState).diagnostics, diagnostic);\n if (found)\n action.apply(view, found.from, found.to);\n };\n let { name } = action, keyIndex = keys[i] ? name.indexOf(keys[i]) : -1;\n let nameElt = keyIndex < 0 ? name : [name.slice(0, keyIndex),\n elt(\"u\", name.slice(keyIndex, keyIndex + 1)),\n name.slice(keyIndex + 1)];\n return elt(\"button\", {\n type: \"button\",\n class: \"cm-diagnosticAction\",\n onclick: click,\n onmousedown: click,\n \"aria-label\": ` Action: ${name}${keyIndex < 0 ? \"\" : ` (access key \"${keys[i]})\"`}.`\n }, nameElt);\n }), diagnostic.source && elt(\"div\", { class: \"cm-diagnosticSource\" }, diagnostic.source));\n}\nclass DiagnosticWidget extends WidgetType {\n constructor(sev) {\n super();\n this.sev = sev;\n }\n eq(other) { return other.sev == this.sev; }\n toDOM() {\n return elt(\"span\", { class: \"cm-lintPoint cm-lintPoint-\" + this.sev });\n }\n}\nclass PanelItem {\n constructor(view, diagnostic) {\n this.diagnostic = diagnostic;\n this.id = \"item_\" + Math.floor(Math.random() * 0xffffffff).toString(16);\n this.dom = renderDiagnostic(view, diagnostic, true);\n this.dom.id = this.id;\n this.dom.setAttribute(\"role\", \"option\");\n }\n}\nclass LintPanel {\n constructor(view) {\n this.view = view;\n this.items = [];\n let onkeydown = (event) => {\n if (event.keyCode == 27) { // Escape\n closeLintPanel(this.view);\n this.view.focus();\n }\n else if (event.keyCode == 38 || event.keyCode == 33) { // ArrowUp, PageUp\n this.moveSelection((this.selectedIndex - 1 + this.items.length) % this.items.length);\n }\n else if (event.keyCode == 40 || event.keyCode == 34) { // ArrowDown, PageDown\n this.moveSelection((this.selectedIndex + 1) % this.items.length);\n }\n else if (event.keyCode == 36) { // Home\n this.moveSelection(0);\n }\n else if (event.keyCode == 35) { // End\n this.moveSelection(this.items.length - 1);\n }\n else if (event.keyCode == 13) { // Enter\n this.view.focus();\n }\n else if (event.keyCode >= 65 && event.keyCode <= 90 && this.selectedIndex >= 0) { // A-Z\n let { diagnostic } = this.items[this.selectedIndex], keys = assignKeys(diagnostic.actions);\n for (let i = 0; i < keys.length; i++)\n if (keys[i].toUpperCase().charCodeAt(0) == event.keyCode) {\n let found = findDiagnostic(this.view.state.field(lintState).diagnostics, diagnostic);\n if (found)\n diagnostic.actions[i].apply(view, found.from, found.to);\n }\n }\n else {\n return;\n }\n event.preventDefault();\n };\n let onclick = (event) => {\n for (let i = 0; i < this.items.length; i++) {\n if (this.items[i].dom.contains(event.target))\n this.moveSelection(i);\n }\n };\n this.list = elt(\"ul\", {\n tabIndex: 0,\n role: \"listbox\",\n \"aria-label\": this.view.state.phrase(\"Diagnostics\"),\n onkeydown,\n onclick\n });\n this.dom = elt(\"div\", { class: \"cm-panel-lint\" }, this.list, elt(\"button\", {\n type: \"button\",\n name: \"close\",\n \"aria-label\": this.view.state.phrase(\"close\"),\n onclick: () => closeLintPanel(this.view)\n }, \"×\"));\n this.update();\n }\n get selectedIndex() {\n let selected = this.view.state.field(lintState).selected;\n if (!selected)\n return -1;\n for (let i = 0; i < this.items.length; i++)\n if (this.items[i].diagnostic == selected.diagnostic)\n return i;\n return -1;\n }\n update() {\n let { diagnostics, selected } = this.view.state.field(lintState);\n let i = 0, needsSync = false, newSelectedItem = null;\n let seen = new Set();\n diagnostics.between(0, this.view.state.doc.length, (_start, _end, { spec }) => {\n for (let diagnostic of spec.diagnostics) {\n if (seen.has(diagnostic))\n continue;\n seen.add(diagnostic);\n let found = -1, item;\n for (let j = i; j < this.items.length; j++)\n if (this.items[j].diagnostic == diagnostic) {\n found = j;\n break;\n }\n if (found < 0) {\n item = new PanelItem(this.view, diagnostic);\n this.items.splice(i, 0, item);\n needsSync = true;\n }\n else {\n item = this.items[found];\n if (found > i) {\n this.items.splice(i, found - i);\n needsSync = true;\n }\n }\n if (selected && item.diagnostic == selected.diagnostic) {\n if (!item.dom.hasAttribute(\"aria-selected\")) {\n item.dom.setAttribute(\"aria-selected\", \"true\");\n newSelectedItem = item;\n }\n }\n else if (item.dom.hasAttribute(\"aria-selected\")) {\n item.dom.removeAttribute(\"aria-selected\");\n }\n i++;\n }\n });\n while (i < this.items.length && !(this.items.length == 1 && this.items[0].diagnostic.from < 0)) {\n needsSync = true;\n this.items.pop();\n }\n if (this.items.length == 0) {\n this.items.push(new PanelItem(this.view, {\n from: -1, to: -1,\n severity: \"info\",\n message: this.view.state.phrase(\"No diagnostics\")\n }));\n needsSync = true;\n }\n if (newSelectedItem) {\n this.list.setAttribute(\"aria-activedescendant\", newSelectedItem.id);\n this.view.requestMeasure({\n key: this,\n read: () => ({ sel: newSelectedItem.dom.getBoundingClientRect(), panel: this.list.getBoundingClientRect() }),\n write: ({ sel, panel }) => {\n let scaleY = panel.height / this.list.offsetHeight;\n if (sel.top < panel.top)\n this.list.scrollTop -= (panel.top - sel.top) / scaleY;\n else if (sel.bottom > panel.bottom)\n this.list.scrollTop += (sel.bottom - panel.bottom) / scaleY;\n }\n });\n }\n else if (this.selectedIndex < 0) {\n this.list.removeAttribute(\"aria-activedescendant\");\n }\n if (needsSync)\n this.sync();\n }\n sync() {\n let domPos = this.list.firstChild;\n function rm() {\n let prev = domPos;\n domPos = prev.nextSibling;\n prev.remove();\n }\n for (let item of this.items) {\n if (item.dom.parentNode == this.list) {\n while (domPos != item.dom)\n rm();\n domPos = item.dom.nextSibling;\n }\n else {\n this.list.insertBefore(item.dom, domPos);\n }\n }\n while (domPos)\n rm();\n }\n moveSelection(selectedIndex) {\n if (this.selectedIndex < 0)\n return;\n let field = this.view.state.field(lintState);\n let selection = findDiagnostic(field.diagnostics, this.items[selectedIndex].diagnostic);\n if (!selection)\n return;\n this.view.dispatch({\n selection: { anchor: selection.from, head: selection.to },\n scrollIntoView: true,\n effects: movePanelSelection.of(selection)\n });\n }\n static open(view) { return new LintPanel(view); }\n}\nfunction svg(content, attrs = `viewBox=\"0 0 40 40\"`) {\n return `url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" ${attrs}>${encodeURIComponent(content)}</svg>')`;\n}\nfunction underline(color) {\n return svg(`<path d=\"m0 2.5 l2 -1.5 l1 0 l2 1.5 l1 0\" stroke=\"${color}\" fill=\"none\" stroke-width=\".7\"/>`, `width=\"6\" height=\"3\"`);\n}\nconst baseTheme = /*@__PURE__*/EditorView.baseTheme({\n \".cm-diagnostic\": {\n padding: \"3px 6px 3px 8px\",\n marginLeft: \"-1px\",\n display: \"block\",\n whiteSpace: \"pre-wrap\"\n },\n \".cm-diagnostic-error\": { borderLeft: \"5px solid #d11\" },\n \".cm-diagnostic-warning\": { borderLeft: \"5px solid orange\" },\n \".cm-diagnostic-info\": { borderLeft: \"5px solid #999\" },\n \".cm-diagnostic-hint\": { borderLeft: \"5px solid #66d\" },\n \".cm-diagnosticAction\": {\n font: \"inherit\",\n border: \"none\",\n padding: \"2px 4px\",\n backgroundColor: \"#444\",\n color: \"white\",\n borderRadius: \"3px\",\n marginLeft: \"8px\",\n cursor: \"pointer\"\n },\n \".cm-diagnosticSource\": {\n fontSize: \"70%\",\n opacity: .7\n },\n \".cm-lintRange\": {\n backgroundPosition: \"left bottom\",\n backgroundRepeat: \"repeat-x\",\n paddingBottom: \"0.7px\",\n },\n \".cm-lintRange-error\": { backgroundImage: /*@__PURE__*/underline(\"#d11\") },\n \".cm-lintRange-warning\": { backgroundImage: /*@__PURE__*/underline(\"orange\") },\n \".cm-lintRange-info\": { backgroundImage: /*@__PURE__*/underline(\"#999\") },\n \".cm-lintRange-hint\": { backgroundImage: /*@__PURE__*/underline(\"#66d\") },\n \".cm-lintRange-active\": { backgroundColor: \"#ffdd9980\" },\n \".cm-tooltip-lint\": {\n padding: 0,\n margin: 0\n },\n \".cm-lintPoint\": {\n position: \"relative\",\n \"&:after\": {\n content: '\"\"',\n position: \"absolute\",\n bottom: 0,\n left: \"-2px\",\n borderLeft: \"3px solid transparent\",\n borderRight: \"3px solid transparent\",\n borderBottom: \"4px solid #d11\"\n }\n },\n \".cm-lintPoint-warning\": {\n \"&:after\": { borderBottomColor: \"orange\" }\n },\n \".cm-lintPoint-info\": {\n \"&:after\": { borderBottomColor: \"#999\" }\n },\n \".cm-lintPoint-hint\": {\n \"&:after\": { borderBottomColor: \"#66d\" }\n },\n \".cm-panel.cm-panel-lint\": {\n position: \"relative\",\n \"& ul\": {\n maxHeight: \"100px\",\n overflowY: \"auto\",\n \"& [aria-selected]\": {\n backgroundColor: \"#ddd\",\n \"& u\": { textDecoration: \"underline\" }\n },\n \"&:focus [aria-selected]\": {\n background_fallback: \"#bdf\",\n backgroundColor: \"Highlight\",\n color_fallback: \"white\",\n color: \"HighlightText\"\n },\n \"& u\": { textDecoration: \"none\" },\n padding: 0,\n margin: 0\n },\n \"& [name=close]\": {\n position: \"absolute\",\n top: \"0\",\n right: \"2px\",\n background: \"inherit\",\n border: \"none\",\n font: \"inherit\",\n padding: 0,\n margin: 0\n }\n }\n});\nfunction severityWeight(sev) {\n return sev == \"error\" ? 4 : sev == \"warning\" ? 3 : sev == \"info\" ? 2 : 1;\n}\nfunction maxSeverity(diagnostics) {\n let sev = \"hint\", weight = 1;\n for (let d of diagnostics) {\n let w = severityWeight(d.severity);\n if (w > weight) {\n weight = w;\n sev = d.severity;\n }\n }\n return sev;\n}\nclass LintGutterMarker extends GutterMarker {\n constructor(diagnostics) {\n super();\n this.diagnostics = diagnostics;\n this.severity = maxSeverity(diagnostics);\n }\n toDOM(view) {\n let elt = document.createElement(\"div\");\n elt.className = \"cm-lint-marker cm-lint-marker-\" + this.severity;\n let diagnostics = this.diagnostics;\n let diagnosticsFilter = view.state.facet(lintGutterConfig).tooltipFilter;\n if (diagnosticsFilter)\n diagnostics = diagnosticsFilter(diagnostics, view.state);\n if (diagnostics.length)\n elt.onmouseover = () => gutterMarkerMouseOver(view, elt, diagnostics);\n return elt;\n }\n}\nfunction trackHoverOn(view, marker) {\n let mousemove = (event) => {\n let rect = marker.getBoundingClientRect();\n if (event.clientX > rect.left - 10 /* Hover.Margin */ && event.clientX < rect.right + 10 /* Hover.Margin */ &&\n event.clientY > rect.top - 10 /* Hover.Margin */ && event.clientY < rect.bottom + 10 /* Hover.Margin */)\n return;\n for (let target = event.target; target; target = target.parentNode) {\n if (target.nodeType == 1 && target.classList.contains(\"cm-tooltip-lint\"))\n return;\n }\n window.removeEventListener(\"mousemove\", mousemove);\n if (view.state.field(lintGutterTooltip))\n view.dispatch({ effects: setLintGutterTooltip.of(null) });\n };\n window.addEventListener(\"mousemove\", mousemove);\n}\nfunction gutterMarkerMouseOver(view, marker, diagnostics) {\n function hovered() {\n let line = view.elementAtHeight(marker.getBoundingClientRect().top + 5 - view.documentTop);\n const linePos = view.coordsAtPos(line.from);\n if (linePos) {\n view.dispatch({ effects: setLintGutterTooltip.of({\n pos: line.from,\n above: false,\n clip: false,\n create() {\n return {\n dom: diagnosticsTooltip(view, diagnostics),\n getCoords: () => marker.getBoundingClientRect()\n };\n }\n }) });\n }\n marker.onmouseout = marker.onmousemove = null;\n trackHoverOn(view, marker);\n }\n let { hoverTime } = view.state.facet(lintGutterConfig);\n let hoverTimeout = setTimeout(hovered, hoverTime);\n marker.onmouseout = () => {\n clearTimeout(hoverTimeout);\n marker.onmouseout = marker.onmousemove = null;\n };\n marker.onmousemove = () => {\n clearTimeout(hoverTimeout);\n hoverTimeout = setTimeout(hovered, hoverTime);\n };\n}\nfunction markersForDiagnostics(doc, diagnostics) {\n let byLine = Object.create(null);\n for (let diagnostic of diagnostics) {\n let line = doc.lineAt(diagnostic.from);\n (byLine[line.from] || (byLine[line.from] = [])).push(diagnostic);\n }\n let markers = [];\n for (let line in byLine) {\n markers.push(new LintGutterMarker(byLine[line]).range(+line));\n }\n return RangeSet.of(markers, true);\n}\nconst lintGutterExtension = /*@__PURE__*/gutter({\n class: \"cm-gutter-lint\",\n markers: view => view.state.field(lintGutterMarkers),\n widgetMarker: (view, widget, block) => {\n let diagnostics = [];\n view.state.field(lintGutterMarkers).between(block.from, block.to, (from, to, value) => {\n if (from > block.from && from < block.to)\n diagnostics.push(...value.diagnostics);\n });\n return diagnostics.length ? new LintGutterMarker(diagnostics) : null;\n }\n});\nconst lintGutterMarkers = /*@__PURE__*/StateField.define({\n create() {\n return RangeSet.empty;\n },\n update(markers, tr) {\n markers = markers.map(tr.changes);\n let diagnosticFilter = tr.state.facet(lintGutterConfig).markerFilter;\n for (let effect of tr.effects) {\n if (effect.is(setDiagnosticsEffect)) {\n let diagnostics = effect.value;\n if (diagnosticFilter)\n diagnostics = diagnosticFilter(diagnostics || [], tr.state);\n markers = markersForDiagnostics(tr.state.doc, diagnostics.slice(0));\n }\n }\n return markers;\n }\n});\nconst setLintGutterTooltip = /*@__PURE__*/StateEffect.define();\nconst lintGutterTooltip = /*@__PURE__*/StateField.define({\n create() { return null; },\n update(tooltip, tr) {\n if (tooltip && tr.docChanged)\n tooltip = hideTooltip(tr, tooltip) ? null : Object.assign(Object.assign({}, tooltip), { pos: tr.changes.mapPos(tooltip.pos) });\n return tr.effects.reduce((t, e) => e.is(setLintGutterTooltip) ? e.value : t, tooltip);\n },\n provide: field => showTooltip.from(field)\n});\nconst lintGutterTheme = /*@__PURE__*/EditorView.baseTheme({\n \".cm-gutter-lint\": {\n width: \"1.4em\",\n \"& .cm-gutterElement\": {\n padding: \".2em\"\n }\n },\n \".cm-lint-marker\": {\n width: \"1em\",\n height: \"1em\"\n },\n \".cm-lint-marker-info\": {\n content: /*@__PURE__*/svg(`<path fill=\"#aaf\" stroke=\"#77e\" stroke-width=\"6\" stroke-linejoin=\"round\" d=\"M5 5L35 5L35 35L5 35Z\"/>`)\n },\n \".cm-lint-marker-warning\": {\n content: /*@__PURE__*/svg(`<path fill=\"#fe8\" stroke=\"#fd7\" stroke-width=\"6\" stroke-linejoin=\"round\" d=\"M20 6L37 35L3 35Z\"/>`),\n },\n \".cm-lint-marker-error\": {\n content: /*@__PURE__*/svg(`<circle cx=\"20\" cy=\"20\" r=\"15\" fill=\"#f87\" stroke=\"#f43\" stroke-width=\"6\"/>`)\n },\n});\nconst lintExtensions = [\n lintState,\n /*@__PURE__*/EditorView.decorations.compute([lintState], state => {\n let { selected, panel } = state.field(lintState);\n return !selected || !panel || selected.from == selected.to ? Decoration.none : Decoration.set([\n activeMark.range(selected.from, selected.to)\n ]);\n }),\n /*@__PURE__*/hoverTooltip(lintTooltip, { hideOn: hideTooltip }),\n baseTheme\n];\nconst lintGutterConfig = /*@__PURE__*/Facet.define({\n combine(configs) {\n return combineConfig(configs, {\n hoverTime: 300 /* Hover.Time */,\n markerFilter: null,\n tooltipFilter: null\n });\n }\n});\n/**\nReturns an extension that installs a gutter showing markers for\neach line that has diagnostics, which can be hovered over to see\nthe diagnostics.\n*/\nfunction lintGutter(config = {}) {\n return [lintGutterConfig.of(config), lintGutterMarkers, lintGutterExtension, lintGutterTheme, lintGutterTooltip];\n}\n/**\nIterate over the marked diagnostics for the given editor state,\ncalling `f` for each of them. Note that, if the document changed\nsince the diagnostics were created, the `Diagnostic` object will\nhold the original outdated position, whereas the `to` and `from`\narguments hold the diagnostic's current position.\n*/\nfunction forEachDiagnostic(state, f) {\n let lState = state.field(lintState, false);\n if (lState && lState.diagnostics.size) {\n let pending = [], pendingStart = [], lastEnd = -1;\n for (let iter = RangeSet.iter([lState.diagnostics]);; iter.next()) {\n for (let i = 0; i < pending.length; i++)\n if (!iter.value || iter.value.spec.diagnostics.indexOf(pending[i]) < 0) {\n f(pending[i], pendingStart[i], lastEnd);\n pending.splice(i, 1);\n pendingStart.splice(i--, 1);\n }\n if (!iter.value)\n break;\n for (let d of iter.value.spec.diagnostics)\n if (pending.indexOf(d) < 0) {\n pending.push(d);\n pendingStart.push(iter.from);\n }\n lastEnd = iter.to;\n }\n }\n}\n\nexport { closeLintPanel, diagnosticCount, forEachDiagnostic, forceLinting, lintGutter, lintKeymap, linter, nextDiagnostic, openLintPanel, previousDiagnostic, setDiagnostics, setDiagnosticsEffect };\n","import {\n CharCategory,\n EditorSelection,\n type EditorState,\n type SelectionRange,\n findClusterBreak,\n} from '@codemirror/state';\nimport { type DOMEventHandlers, type DOMEventMap } from '@codemirror/view';\nimport type { TreeCursor } from '@lezer/common';\nimport { EditorView } from 'codemirror';\n\n/* This is a reference to vim's WORD: a \"word\" including any non-whitespace character */\nexport function stateWORDAt(\n state: EditorState,\n pos: number,\n): SelectionRange | null {\n const { text, from, length } = state.doc.lineAt(pos);\n const cat = state.charCategorizer(pos);\n let start = pos - from,\n end = pos - from;\n while (start > 0) {\n const prev = findClusterBreak(text, start, false);\n if (cat(text.slice(prev, start)) === CharCategory.Space) break;\n start = prev;\n }\n while (end < length) {\n const next = findClusterBreak(text, end);\n if (cat(text.slice(end, next)) === CharCategory.Space) break;\n end = next;\n }\n return start == end ? null : EditorSelection.range(start + from, end + from);\n}\n\nexport interface RangeLike {\n from: number;\n to: number;\n}\n\nexport function rangeTouchesRange(a: RangeLike, b: RangeLike): boolean {\n return a.from <= b.to && b.from <= a.to;\n}\n\nexport function selectionTouchesRange(\n selection: readonly SelectionRange[],\n b: RangeLike,\n): boolean {\n return selection.some((range) => rangeTouchesRange(range, b));\n}\n\n// function rangeSetIncludes<V extends RangeValue>(\n// from: number,\n// to: number,\n// set: RangeSet<V>,\n// ) {\n// let touches = false;\n// set.between(from, to, () => {\n// touches = true;\n// return false;\n// });\n// return touches;\n// }\n\nexport function iterChildren(\n cursor: TreeCursor,\n enter: (cursor: TreeCursor) => undefined | boolean,\n): void {\n if (!cursor.firstChild()) return;\n do {\n if (enter(cursor)) break;\n } while (cursor.nextSibling());\n console.assert(cursor.parent());\n}\n\nexport type ClassBasedEventHandlers<This> = {\n [event in keyof DOMEventMap]?: Record<string, DOMEventHandlers<This>[event]>;\n};\n\nexport function eventHandlersWithClass<This>(\n handlers: ClassBasedEventHandlers<This>,\n): DOMEventHandlers<This> {\n return Object.fromEntries(\n Object.entries(handlers)\n .filter(([_event, handlers]) => !!handlers)\n .map(([event, handlers]) => [\n event,\n function (this: This, ev: Event, view: EditorView) {\n const res = [];\n for (const className in handlers) {\n if (\n ev.composedPath().some((el) => {\n if (!(el instanceof Element)) return false;\n\n return el.classList.contains(className);\n })\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n res.push(handlers[className]?.call(this, ev as any, view));\n }\n }\n return res.some((res) => !!res);\n },\n ]),\n );\n}\n","import { Decoration, type DecorationSet, EditorView } from '@codemirror/view';\nimport {\n type EditorState,\n Facet,\n type Range,\n StateField,\n} from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\nimport type { SyntaxNodeRef } from '@lezer/common';\nimport { type RangeLike, rangeTouchesRange } from '../utils';\n\nconst hideTheme = EditorView.theme({\n '.cm-hidden-token': {\n fontSize: '0px',\n },\n});\n\nexport const hideInlineDecoration = Decoration.mark({\n class: 'cm-hidden-token',\n});\nexport const hideBlockDecoration = Decoration.replace({\n block: true,\n});\n\nconst buildDecorations = (state: EditorState) => {\n const decorations: Range<Decoration>[] = [];\n const specs = state.facet(hidableNodeFacet);\n syntaxTree(state).iterate({\n enter: (node) => {\n // If the selection overlaps with the node, don't hide it\n if (\n state.selection.ranges.some((range) => rangeTouchesRange(node, range))\n ) {\n return;\n }\n\n for (const spec of specs) {\n // Check spec\n if (spec.nodeName instanceof Function) {\n if (!spec.nodeName(node.type.name)) {\n continue;\n }\n } else if (spec.nodeName instanceof Array) {\n if (!spec.nodeName.includes(node.type.name)) {\n continue;\n }\n } else if (node.type.name !== spec.nodeName) {\n continue;\n }\n\n // Check custom show zone\n if (spec.unhideZone) {\n const res = spec.unhideZone(state, node);\n if (\n state.selection.ranges.some((range) =>\n rangeTouchesRange(res, range),\n )\n ) {\n return;\n }\n }\n\n // Hide node using one of the provided methods\n if (spec.onHide) {\n const res = spec.onHide(state, node);\n if (res instanceof Array) {\n decorations.push(...res);\n } else if (res) {\n decorations.push(res);\n }\n }\n if (spec.subNodeNameToHide) {\n let names: string[];\n if (!Array.isArray(spec.subNodeNameToHide)) {\n names = [spec.subNodeNameToHide];\n } else {\n names = spec.subNodeNameToHide;\n }\n\n const cursor = node.node.cursor();\n console.assert(cursor.firstChild(), 'A hide node must have children');\n cursor.iterate((node) => {\n if (names.includes(node.type.name)) {\n decorations.push(\n (spec.block ? hideBlockDecoration : hideInlineDecoration).range(\n node.from,\n node.to,\n ),\n );\n }\n });\n }\n }\n },\n });\n return Decoration.set(decorations, true);\n};\n\nconst hideExtension = StateField.define<DecorationSet>({\n create(state) {\n return buildDecorations(state);\n },\n\n update(deco, tr) {\n if (tr.docChanged || tr.selection) {\n return buildDecorations(tr.state);\n }\n return deco.map(tr.changes);\n },\n provide: (f) => [EditorView.decorations.from(f), hideTheme],\n});\n\nexport interface HidableNodeSpec {\n nodeName: string | string[] | ((nodeName: string) => boolean);\n subNodeNameToHide?: string | string[];\n onHide?: (\n state: EditorState,\n node: SyntaxNodeRef,\n ) => Range<Decoration> | Range<Decoration>[] | undefined;\n block?: boolean;\n unhideZone?: (state: EditorState, node: SyntaxNodeRef) => RangeLike;\n}\n\nexport const hidableNodeFacet = Facet.define<\n HidableNodeSpec,\n HidableNodeSpec[]\n>({\n combine(value: readonly HidableNodeSpec[]) {\n return [...value];\n },\n enables: hideExtension,\n});\n","import { Tag } from '@lezer/highlight';\n\nexport const markdownTags = {\n headerMark: Tag.define(),\n inlineCode: Tag.define(),\n fencedCode: Tag.define(),\n linkURL: Tag.define(),\n escapeMark: Tag.define(),\n emoji: Tag.define(),\n emojiMark: Tag.define(),\n listMark: Tag.define(),\n};\n","import { Decoration } from '@codemirror/view';\nimport {\n type HidableNodeSpec,\n hidableNodeFacet,\n hideInlineDecoration,\n} from './core';\nimport type { InlineContext, MarkdownConfig } from '@lezer/markdown';\nimport { markdownTags } from '../markdownTags';\nimport { stateWORDAt } from '../utils';\n\nconst renderedLinkDecoration = Decoration.mark({\n class: 'cm-rendered-link',\n});\n\nconst defaultHidableSpecs: HidableNodeSpec[] = [\n {\n nodeName: (name) => name.startsWith('ATXHeading'),\n onHide: (_view, node) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const headerMark = node.node.firstChild!;\n return hideInlineDecoration.range(\n headerMark.from,\n Math.min(headerMark.to + 1, node.to),\n );\n },\n },\n {\n nodeName: (name) => name.startsWith('SetextHeading'),\n subNodeNameToHide: 'HeaderMark',\n block: true,\n },\n {\n nodeName: ['StrongEmphasis', 'Emphasis'],\n subNodeNameToHide: 'EmphasisMark',\n },\n {\n nodeName: 'InlineCode',\n subNodeNameToHide: 'CodeMark',\n },\n {\n nodeName: 'Link',\n subNodeNameToHide: ['LinkMark', 'URL'],\n onHide: (_state, node) => {\n return renderedLinkDecoration.range(node.from, node.to);\n },\n },\n {\n nodeName: 'Strikethrough',\n subNodeNameToHide: 'StrikethroughMark',\n },\n {\n nodeName: 'Escape',\n subNodeNameToHide: 'EscapeMark',\n unhideZone: (state, node) => {\n const WORDAt = stateWORDAt(state, node.from);\n if (WORDAt && WORDAt.to > node.from + 1) return WORDAt;\n return state.doc.lineAt(node.from);\n },\n },\n {\n nodeName: 'FencedCode',\n subNodeNameToHide: ['CodeMark', 'CodeInfo'],\n },\n {\n nodeName: 'Blockquote',\n subNodeNameToHide: 'QuoteMark',\n },\n];\n\nexport const defaultHideExtensions = defaultHidableSpecs.map((spec) =>\n hidableNodeFacet.of(spec),\n);\n\nexport const escapeMarkdownSyntaxExtension: MarkdownConfig = {\n defineNodes: [\n {\n name: 'EscapeMark',\n style: markdownTags.escapeMark,\n },\n ],\n parseInline: [\n {\n name: 'EscapeMark',\n parse: (cx: InlineContext, next: number, pos: number): number => {\n if (next !== 92 /* \\ */) return -1;\n return cx.addElement(\n cx.elt('Escape', pos, pos + 2, [cx.elt('EscapeMark', pos, pos + 1)]),\n );\n },\n before: 'Escape',\n },\n ],\n};\n","import {\n type EditorState,\n StateField,\n type Range,\n Facet,\n EditorSelection,\n type Extension,\n} from '@codemirror/state';\nimport {\n type DOMEventHandlers,\n Decoration,\n type DecorationSet,\n EditorView,\n} from '@codemirror/view';\nimport {\n eventHandlersWithClass,\n type RangeLike,\n selectionTouchesRange,\n} from '../utils';\n\nimport type { SyntaxNodeRef } from '@lezer/common';\nimport { syntaxTree } from '@codemirror/language';\n\nconst buildDecorations = (state: EditorState) => {\n const decorations: Range<Decoration>[] = [];\n const specs = state.facet(foldableSyntaxFacet);\n syntaxTree(state).iterate({\n enter: (node) => {\n if (selectionTouchesRange(state.selection.ranges, node)) return;\n\n for (const spec of specs) {\n // Generate Path\n const lineage = [];\n let node_: SyntaxNodeRef | null = node;\n while (node_) {\n lineage.push(node_.name);\n node_ = node_.node.parent;\n }\n const path = lineage.reverse().join('/');\n\n // Check node path\n if (spec.nodePath instanceof Function) {\n if (!spec.nodePath(path)) {\n continue;\n }\n } else if (spec.nodePath instanceof Array) {\n if (!spec.nodePath.some((testPath) => path.endsWith(testPath))) {\n continue;\n }\n } else if (!path.endsWith(spec.nodePath)) {\n continue;\n }\n\n // Check custom unfold zone\n if (spec.unfoldZone) {\n if (\n selectionTouchesRange(\n state.selection.ranges,\n spec.unfoldZone(state, node),\n )\n ) {\n return;\n }\n }\n\n // Run folding logic\n if (spec.onFold) {\n const res = spec.onFold(state, node);\n if (res instanceof Array) {\n decorations.push(...res);\n } else if (res) {\n decorations.push(res);\n }\n }\n }\n },\n });\n return Decoration.set(decorations, true);\n};\n\nexport const foldDecorationExtension = StateField.define<DecorationSet>({\n create(state) {\n return buildDecorations(state);\n },\n\n update(deco, tr) {\n if (tr.docChanged || tr.selection) {\n return buildDecorations(tr.state);\n }\n return deco.map(tr.changes);\n },\n provide: (f) => [EditorView.decorations.from(f)],\n});\n\nexport const foldExtension = [foldDecorationExtension];\n\nexport interface FoldableSyntaxSpec {\n nodePath: string | string[] | ((nodePath: string) => boolean);\n onFold?: (\n state: EditorState,\n node: SyntaxNodeRef,\n ) => Range<Decoration> | Range<Decoration>[] | undefined;\n unfoldZone?: (state: EditorState, node: SyntaxNodeRef) => RangeLike;\n eventHandlers?: DOMEventHandlers<void>;\n}\n\nexport const foldableSyntaxFacet = Facet.define<\n FoldableSyntaxSpec,\n FoldableSyntaxSpec[]\n>({\n combine(value: readonly FoldableSyntaxSpec[]) {\n return [...value];\n },\n enables: foldExtension,\n});\n\nexport const selectAllDecorationsOnSelectExtension = (\n widgetClass: string,\n): Extension =>\n EditorView.domEventHandlers(\n eventHandlersWithClass({\n mousedown: {\n [widgetClass]: (e: MouseEvent, view: EditorView) => {\n // Change selection when appropriate so that the content can be edited\n // (selection by mouse would overshoot the widget content range)\n\n const ranges = view.state.selection.ranges;\n if (ranges.length === 0 || ranges[0]?.anchor !== ranges[0]?.head)\n return;\n\n const target = e.target as HTMLElement;\n const pos = view.posAtDOM(target);\n\n const decorations = view.state.field(foldDecorationExtension);\n decorations.between(pos, pos, (from: number, to: number) => {\n setTimeout(() => {\n view.dispatch({\n selection: EditorSelection.single(to, from),\n });\n }, 0);\n return false;\n });\n },\n },\n }),\n );\n","import { Decoration, WidgetType } from '@codemirror/view';\nimport { foldableSyntaxFacet } from './core';\n\nclass BulletPoint extends WidgetType {\n toDOM() {\n const span = document.createElement('span');\n span.className = 'cm-rendered-list-mark';\n span.innerHTML = '•';\n return span;\n }\n\n ignoreEvent(_event: Event) {\n return false;\n }\n}\n\nexport const bulletListExtension = foldableSyntaxFacet.of({\n nodePath: 'BulletList/ListItem/ListMark',\n onFold: (_state, node) => {\n const cursor = node.node.cursor();\n if (cursor.nextSibling() && cursor.name === 'Task') return;\n\n return Decoration.replace({ widget: new BulletPoint() }).range(\n node.from,\n node.to,\n );\n },\n});\n","import type { InlineContext, MarkdownConfig } from '@lezer/markdown';\nimport { markdownTags } from '../markdownTags';\nimport { Decoration, WidgetType } from '@codemirror/view';\nimport { foldableSyntaxFacet } from './core';\nimport * as emoji from 'node-emoji';\n\nconst emojiDelimiter = { resolve: 'Emoji', mark: 'EmojiMark' };\n\nexport const emojiMarkdownSyntaxExtension: MarkdownConfig = {\n defineNodes: [\n {\n name: 'Emoji',\n style: markdownTags.emoji,\n },\n {\n name: 'EmojiMark',\n style: markdownTags.emojiMark,\n },\n ],\n parseInline: [\n {\n name: 'Emoji',\n parse: (cx: InlineContext, next: number, pos: number): number => {\n if (next !== 58 /* : */) return -1;\n\n const open = /^\\w+:/.test(cx.slice(pos + 1, cx.end));\n const close = /:\\w+$/.test(cx.slice(cx.offset, pos));\n\n if (!open && !close) {\n return -1;\n }\n\n return cx.addDelimiter(emojiDelimiter, pos, pos + 1, open, close);\n },\n before: 'Emphasis',\n },\n ],\n};\n\nclass EmojiWidget extends WidgetType {\n constructor(public emoji: string) {\n super();\n }\n\n toDOM() {\n const span = document.createElement('span');\n span.className = 'cm-emoji';\n span.innerHTML = this.emoji;\n return span;\n }\n}\n\nexport const emojiExtension = foldableSyntaxFacet.of({\n nodePath: 'Emoji',\n onFold: (state, node) => {\n const emojiName = state.doc.sliceString(node.from + 1, node.to - 1);\n const emoji_ = emoji.get(emojiName);\n if (!emoji_) {\n return;\n }\n\n return Decoration.replace({\n widget: new EmojiWidget(emoji_),\n }).range(node.from, node.to);\n },\n});\n","import { Decoration, EditorView, WidgetType } from '@codemirror/view';\nimport { foldableSyntaxFacet, selectAllDecorationsOnSelectExtension } from './core';\n\nclass HorizontalRuleWidget extends WidgetType {\n toDOM() {\n const div = document.createElement('div');\n div.className = 'cm-horizontal-rule-container';\n const hr = document.createElement('hr');\n div.appendChild(hr);\n return div;\n }\n\n // allows clicks to pass through to the editor\n ignoreEvent(_event: Event) {\n return false;\n }\n\n destroy(dom: HTMLElement): void {\n dom.remove();\n }\n}\n\nconst horizontalRuleTheme = EditorView.theme({\n '.cm-horizontal-rule-container': {\n height: '1.4em',\n display: 'flow-root',\n 'align-items': 'center',\n padding: '0 2px 0 6px',\n }\n});\n\nexport const horizonalRuleExtension = [\n foldableSyntaxFacet.of({\n nodePath: 'HorizontalRule',\n onFold: (_state, node) => {\n return Decoration.replace({\n widget: new HorizontalRuleWidget(),\n block: true,\n inclusiveStart: true,\n }).range(node.from, node.to);\n },\n }),\n horizontalRuleTheme,\n selectAllDecorationsOnSelectExtension('cm-horizontal-rule-container'),\n];\n","import { Decoration, WidgetType } from '@codemirror/view';\nimport { foldableSyntaxFacet, selectAllDecorationsOnSelectExtension } from './core';\nimport { iterChildren } from '../utils';\n\nclass ImageWidget extends WidgetType {\n constructor(public url?: string) {\n super();\n }\n\n toDOM() {\n const span = document.createElement('span');\n span.className = 'cm-image';\n if (this.url) {\n span.innerHTML = `<img src=\"${this.url}\" />`;\n }\n return span;\n }\n\n // allows clicks to pass through to the editor\n ignoreEvent(_event: Event) {\n return false;\n }\n}\n\nexport const imageExtension = [\n foldableSyntaxFacet.of({\n nodePath: 'Image',\n onFold: (state, node) => {\n let imageUrl: string | undefined;\n iterChildren(node.node.cursor(), (node) => {\n if (node.name === 'URL') {\n imageUrl = state.doc.sliceString(node.from, node.to);\n }\n\n return undefined;\n });\n\n if (imageUrl) {\n return Decoration.replace({\n widget: new ImageWidget(imageUrl),\n }).range(node.from, node.to);\n }\n },\n }),\n selectAllDecorationsOnSelectExtension('cm-image'),\n];\n","import { Decoration, EditorView, WidgetType } from '@codemirror/view';\nimport { foldableSyntaxFacet } from './core';\nimport { eventHandlersWithClass } from '../utils';\n\nclass Checkbox extends WidgetType {\n value: boolean;\n\n constructor(value: boolean) {\n super();\n this.value = value;\n }\n\n toDOM() {\n const el = document.createElement('input');\n el.type = 'checkbox';\n el.className = 'cm-checkbox';\n el.checked = this.value;\n return el;\n }\n\n ignoreEvent(_event: Event) {\n return false;\n }\n}\n\nexport const taskExtension = [\n foldableSyntaxFacet.of({\n nodePath: 'BulletList/ListItem/Task/TaskMarker',\n onFold: (state, node) => {\n const value =\n state.doc.sliceString(node.from + 1, node.to - 1).toLowerCase() === 'x';\n return Decoration.replace({\n widget: new Checkbox(value),\n }).range(node.from - 2, node.to);\n },\n unfoldZone: (_state, node) => ({\n from: node.from - 2,\n to: node.to,\n }),\n }),\n EditorView.domEventHandlers(\n eventHandlersWithClass({\n mousedown: {\n 'cm-checkbox': (ev, view) => {\n const pos = view.posAtDOM(ev.target as HTMLElement);\n const change = {\n from: pos + 3,\n to: pos + 4,\n insert: (ev.target as HTMLInputElement).checked ? ' ' : 'x', // this value is old, so the text is swap\n };\n view.dispatch({\n changes: change,\n });\n return true; // prevent default\n },\n },\n }),\n ),\n];\n","import { Decoration, WidgetType } from '@codemirror/view';\nimport { foldableSyntaxFacet } from './core';\n\nclass BlockQuoteVerticalLine extends WidgetType {\n toDOM() {\n const span = document.createElement('span');\n span.className = 'cm-blockquote-vertical-line';\n return span;\n }\n\n ignoreEvent(_event: Event) {\n return false;\n }\n}\n\nexport const blockQuoteExtension = foldableSyntaxFacet.of({\n nodePath: (nodePath) =>\n nodePath.endsWith('Blockquote/QuoteMark') ||\n nodePath.endsWith('Blockquote/Paragraph/QuoteMark'),\n onFold: (_state, node) => {\n return Decoration.replace({ widget: new BlockQuoteVerticalLine() }).range(\n node.from,\n node.to,\n );\n },\n});\n","import { EditorView } from '@codemirror/view';\nimport { styleTags, Tag, tags } from '@lezer/highlight';\nimport { markdownTags } from './markdownTags';\nimport {\n HighlightStyle,\n syntaxHighlighting,\n type TagStyle,\n} from '@codemirror/language';\n\nexport const additionalMarkdownSyntaxTags = {\n // Define new nodes with tags here\n defineNodes: [],\n props: [\n // Override tags here\n styleTags({\n HeaderMark: markdownTags.headerMark,\n FencedCode: markdownTags.fencedCode,\n InlineCode: markdownTags.inlineCode,\n URL: markdownTags.linkURL,\n ListMark: markdownTags.listMark,\n }),\n ],\n};\n\nconst headingTagStyles = (fontSizes: (string | null)[]): TagStyle[] =>\n fontSizes.map((fontSize, i) => ({\n tag: tags[`heading${(i + 1).toString()}` as keyof typeof tags] as Tag,\n fontSize,\n fontWeight: 'bold',\n }));\n\nexport const baseSyntaxHighlights = syntaxHighlighting(\n HighlightStyle.define([\n ...headingTagStyles(['1.6em', '1.4em', '1.2em', null, null, null]),\n {\n tag: markdownTags.headerMark,\n color: 'var(--pm-header-mark-color)',\n },\n {\n tag: tags.strong,\n fontWeight: 'bold',\n },\n {\n tag: tags.emphasis,\n fontStyle: 'italic',\n },\n {\n tag: tags.strikethrough,\n textDecoration: 'line-through',\n },\n {\n tag: tags.meta,\n color: 'var(--pm-muted-color)',\n },\n {\n tag: tags.comment,\n color: 'var(--pm-muted-color)',\n },\n {\n tag: markdownTags.listMark,\n color: 'var(--pm-muted-color)',\n },\n {\n tag: markdownTags.escapeMark,\n color: 'var(--pm-muted-color)',\n },\n {\n tag: markdownTags.inlineCode,\n fontFamily: 'monospace',\n padding: '0.2rem',\n borderRadius: '0.4rem',\n fontSize: '0.8rem',\n backgroundColor: 'var(--pm-code-background-color)',\n },\n {\n tag: markdownTags.linkURL,\n color: 'var(--pm-link-color)',\n textDecoration: 'underline',\n cursor: 'pointer',\n },\n ]),\n);\n\nexport const baseTheme = EditorView.theme({\n '.cm-content': {\n fontFamily: 'var(--font)',\n fontSize: '0.9rem',\n caretColor: 'var(--pm-cursor-color)',\n },\n '.cm-editor .cm-cursor, .cm-editor .cm-dropCursor': {\n borderLeftColor: 'var(--pm-cursor-color)',\n },\n '&.cm-focused': {\n outline: 'none',\n },\n '.cm-gutters': {\n backgroundColor: 'transparent',\n border: 'none',\n },\n '.cm-rendered-link': {\n textDecoration: 'underline',\n cursor: 'pointer',\n color: 'var(--pm-link-color)',\n },\n '.cm-rendered-list-mark': {\n color: 'var(--pm-muted-color)',\n margin: '0 0.2em',\n },\n '.cm-blockquote-vertical-line': {\n display: 'inline-block',\n width: '4px',\n marginRight: '4px',\n marginLeft: '4px',\n height: '1.4em',\n verticalAlign: 'bottom',\n backgroundColor: 'var(--pm-blockquote-vertical-line-background-color)',\n },\n});\n\nexport const generalSyntaxHighlights = syntaxHighlighting(\n HighlightStyle.define([\n {\n tag: tags.link,\n color: 'var(--pm-syntax-link)',\n },\n {\n tag: tags.keyword,\n color: 'var(--pm-syntax-keyword)',\n },\n {\n tag: [\n tags.atom,\n tags.bool,\n tags.url,\n tags.contentSeparator,\n tags.labelName,\n ],\n color: 'var(--pm-syntax-atom)',\n },\n {\n tag: [tags.literal, tags.inserted],\n color: 'var(--pm-syntax-literal)',\n },\n {\n tag: [tags.string, tags.deleted],\n color: 'var(--pm-syntax-string)',\n },\n {\n tag: [tags.regexp, tags.escape, tags.special(tags.string)],\n color: 'var(--pm-syntax-regexp)',\n },\n {\n tag: tags.definition(tags.variableName),\n color: 'var(--pm-syntax-definition-variable)',\n },\n {\n tag: tags.local(tags.variableName),\n color: 'var(--pm-syntax-local-variable)',\n },\n {\n tag: [tags.typeName, tags.namespace],\n color: 'var(--pm-syntax-type-namespace)',\n },\n {\n tag: tags.className,\n color: 'var(--pm-syntax-class-name)',\n },\n {\n tag: [tags.special(tags.variableName), tags.macroName],\n color: 'var(--pm-syntax-special-variable-macro)',\n },\n {\n tag: tags.definition(tags.propertyName),\n color: 'var(--pm-syntax-definition-property)',\n },\n {\n tag: tags.comment,\n color: 'var(--pm-syntax-comment)',\n },\n {\n tag: tags.invalid,\n color: 'var(--pm-syntax-invalid)',\n },\n ]),\n);\n\nexport const lightTheme = EditorView.theme({\n '.cm-content': {\n '--pm-cursor-color': 'black',\n '--pm-header-mark-color': 'oklch(82.8% 0.111 230.318)',\n '--pm-link-color': 'oklch(58.8% 0.158 241.966)',\n '--pm-muted-color': 'oklch(37.2% 0.044 257.287)',\n '--pm-code-background-color': 'oklch(92.9% 0.013 255.508)',\n '--pm-code-btn-background-color': 'oklch(86.9% 0.022 252.894)',\n '--pm-code-btn-hover-background-color': 'oklch(70.4% 0.04 256.788)',\n '--pm-blockquote-vertical-line-background-color':\n 'oklch(70.4% 0.04 256.788)',\n '--pm-syntax-link': 'oklch(62.75% 0.188 259.38)',\n '--pm-syntax-keyword': 'oklch(58.13% 0.248 297.57)',\n '--pm-syntax-atom': 'oklch(51.29% 0.219 260.63)',\n '--pm-syntax-literal': 'oklch(57.38% 0.111 170.31)',\n '--pm-syntax-string': 'oklch(54.86% 0.184 25.53)',\n '--pm-syntax-regexp': 'oklch(65.88% 0.184 43.8)',\n '--pm-syntax-definition-variable': 'oklch(45.32% 0.171 260.3)',\n '--pm-syntax-local-variable': 'oklch(64.13% 0.09 184.42)',\n '--pm-syntax-type-namespace': 'oklch(49.1% 0.091 165.52)',\n '--pm-syntax-class-name': 'oklch(64.42% 0.11 168.83)',\n '--pm-syntax-special-variable-macro': 'oklch(52.58% 0.212 282.71)',\n '--pm-syntax-definition-property': 'oklch(42.1% 0.142 260.08)',\n '--pm-syntax-comment': 'oklch(62.79% 0.022 252.89)',\n '--pm-syntax-invalid': 'oklch(64.62% 0.203 29.2)',\n },\n});\n","import { EditorView } from 'codemirror';\nimport {\n HighlightStyle,\n syntaxHighlighting,\n syntaxTree,\n} from '@codemirror/language';\nimport { eventHandlersWithClass, iterChildren } from './utils';\nimport { markdownTags } from './markdownTags';\n\nfunction getUrlFromLink(view: EditorView, pos: number): string | undefined {\n const tree = syntaxTree(view.state);\n\n let url: string | undefined;\n\n tree.iterate({\n to: pos,\n from: pos,\n enter(node) {\n if (node.name !== 'Link') return;\n\n iterChildren(node.node.cursor(), (cursor) => {\n if (cursor.name === 'URL') {\n url = view.state.doc.sliceString(cursor.from, cursor.to);\n return true;\n }\n });\n return true;\n },\n });\n\n return url;\n}\n\nconst clickFullLinkExtension = EditorView.domEventHandlers(\n eventHandlersWithClass({\n mousedown: {\n 'cm-rendered-link': (e: MouseEvent, view: EditorView) => {\n const pos = view.posAtCoords(e);\n if (pos === null) {\n return;\n }\n\n const url = getUrlFromLink(view, pos);\n if (!url) {\n return;\n }\n\n window.open(url, '_blank');\n },\n },\n }),\n);\n\nconst getRawUrl = (view: EditorView, pos: number): string | undefined => {\n const tree = syntaxTree(view.state);\n\n let url: string | undefined;\n\n tree.iterate({\n to: pos,\n from: pos,\n enter(node) {\n if (node.name !== 'URL') return;\n if (node.node.parent?.name === 'Link') return;\n\n url = view.state.doc.sliceString(node.from, node.to);\n return true;\n },\n });\n\n return url;\n};\n\nconst addClassToUrl = syntaxHighlighting(\n HighlightStyle.define([\n {\n tag: markdownTags.linkURL,\n class: 'cm-url', // needed for click event\n },\n ]),\n);\n\nconst clickRawUrlExtension = EditorView.domEventHandlers(\n eventHandlersWithClass({\n mousedown: {\n 'cm-url': (e: MouseEvent, view: EditorView) => {\n const pos = view.posAtCoords(e);\n if (pos === null) {\n return;\n }\n\n const url = getRawUrl(view, pos);\n if (!url) {\n return;\n }\n\n window.open(url, '_blank');\n },\n },\n }),\n);\n\nexport const clickLinkExtension = [\n clickFullLinkExtension,\n addClassToUrl,\n clickRawUrlExtension,\n];\n","import {\n Decoration,\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n} from '@codemirror/view';\nimport { syntaxTree } from '@codemirror/language';\nimport { RangeSetBuilder } from '@codemirror/state';\nimport type { DecorationSet } from '@codemirror/view';\nimport { WidgetType } from '@codemirror/view';\nimport { type Extension } from '@codemirror/state';\n\nconst codeBlockDecorations = (view: EditorView) => {\n const builder = new RangeSetBuilder<Decoration>();\n\n // If there are multiple visible ranges, it's possible to see\n // the same code block multiple times\n const visited = new Set<string>();\n\n for (const { from, to } of view.visibleRanges) {\n syntaxTree(view.state).iterate({\n from,\n to,\n enter: (node) => {\n if (node.name === 'FencedCode') {\n const key = JSON.stringify([node.from, node.to]);\n if (visited.has(key)) return;\n visited.add(key);\n\n let lang = '';\n const codeInfoNode = node.node.getChild('CodeInfo');\n if (codeInfoNode) {\n lang = view.state.doc\n .sliceString(codeInfoNode.from, codeInfoNode.to)\n .toUpperCase();\n }\n\n for (let pos = node.from; pos <= node.to; ) {\n const line = view.state.doc.lineAt(pos);\n const isFirstLine = pos === node.from;\n const isLastLine = line.to >= node.to;\n\n builder.add(\n line.from,\n line.from,\n Decoration.line({\n class: `cm-fenced-code-line ${\n isFirstLine ? 'cm-fenced-code-line-first' : ''\n } ${isLastLine ? 'cm-fenced-code-line-last' : ''}`,\n }),\n );\n\n if (isFirstLine) {\n builder.add(\n line.from,\n line.from,\n Decoration.widget({\n widget: new CodeBlockInfoWidget(\n lang,\n view.state.doc.sliceString(line.to + 1, node.to - 4),\n ),\n }),\n );\n }\n\n pos = line.to + 1;\n }\n }\n },\n });\n }\n\n return builder.finish();\n};\n\nclass CodeBlockInfoWidget extends WidgetType {\n constructor(\n readonly lang: string,\n readonly code: string,\n ) {\n super();\n }\n\n eq(other: CodeBlockInfoWidget) {\n return other.lang === this.lang && other.code === this.code;\n }\n\n toDOM() {\n const container = document.createElement('div');\n container.className = 'cm-code-block-info';\n\n const langContainer = document.createElement('span');\n langContainer.className = 'cm-code-block-lang-container';\n langContainer.innerText = this.lang;\n container.appendChild(langContainer);\n\n const copyButton = document.createElement('button');\n copyButton.className = 'cm-code-block-copy-button';\n // Copy icon from Lucide\n copyButton.innerHTML = `\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n class=\"lucide lucide-copy-icon lucide-copy\">\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/>\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/>\n </svg>`;\n copyButton.onclick = () => {\n void navigator.clipboard.writeText(this.code);\n };\n container.appendChild(copyButton);\n\n return container;\n }\n}\n\nexport const codeBlockDecorationsExtension: Extension = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = codeBlockDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = codeBlockDecorations(update.view);\n }\n }\n },\n {\n decorations: (v) => v.decorations,\n },\n);\n\nexport const codeFenceTheme = EditorView.theme({\n '.cm-fenced-code-line': {\n display: 'block',\n marginLeft: '6px',\n backgroundColor: 'var(--pm-code-background-color)',\n },\n // In case the active line color changes\n '.cm-activeLine.cm-fenced-code-line': {\n backgroundColor: 'var(--pm-code-background-color)',\n },\n '.cm-fenced-code-line-first': {\n borderTopLeftRadius: '0.4rem',\n borderTopRightRadius: '0.4rem',\n },\n '.cm-fenced-code-line-last': {\n borderBottomLeftRadius: '0.4rem',\n borderBottomRightRadius: '0.4rem',\n },\n '.cm-code-block-info': {\n float: 'right',\n padding: '0.2rem',\n display: 'flex',\n gap: '0.3rem',\n alignItems: 'center',\n },\n '.cm-code-block-lang-container': {\n fontSize: '0.8rem',\n color: 'var(--pm-muted-color)',\n },\n '.cm-code-block-copy-button': {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n border: 'none',\n padding: '0.2rem',\n borderRadius: '0.2rem',\n cursor: 'pointer',\n backgroundColor: 'var(--pm-code-btn-background-color)',\n color: 'var(--pm-muted-color)',\n },\n '.cm-code-block-copy-button:hover': {\n backgroundColor: 'var(--pm-code-btn-hover-background-color)',\n },\n '.cm-code-block-copy-button svg': {\n width: '16px',\n height: '16px',\n },\n});\n","import { keymap, dropCursor, EditorView } from '@codemirror/view';\nimport { type Extension } from '@codemirror/state';\nimport {\n indentOnInput,\n bracketMatching,\n foldGutter,\n foldKeymap,\n} from '@codemirror/language';\nimport {\n defaultKeymap,\n history,\n historyKeymap,\n indentWithTab,\n} from '@codemirror/commands';\nimport { searchKeymap } from '@codemirror/search';\nimport {\n autocompletion,\n completionKeymap,\n closeBrackets,\n closeBracketsKeymap,\n} from '@codemirror/autocomplete';\nimport { lintKeymap } from '@codemirror/lint';\nimport { defaultHideExtensions, escapeMarkdownSyntaxExtension } from './hide';\nimport {\n blockQuoteExtension,\n emojiExtension,\n emojiMarkdownSyntaxExtension,\n bulletListExtension,\n horizonalRuleExtension,\n imageExtension,\n taskExtension,\n} from './fold';\nimport { clickLinkExtension } from './clickLink';\nimport {\n codeBlockDecorationsExtension,\n codeFenceTheme,\n} from './codeFenceExtension';\nimport {\n additionalMarkdownSyntaxTags,\n baseSyntaxHighlights,\n baseTheme,\n generalSyntaxHighlights,\n lightTheme,\n} from './syntaxHighlighting';\n\nexport const prosemarkMarkdownSyntaxExtensions = [\n additionalMarkdownSyntaxTags,\n escapeMarkdownSyntaxExtension,\n emojiMarkdownSyntaxExtension,\n];\n\nexport const defaultFoldableSyntaxExtensions = [\n blockQuoteExtension,\n bulletListExtension,\n taskExtension,\n imageExtension,\n emojiExtension,\n horizonalRuleExtension,\n];\n\nexport const prosemarkBasicSetup = (): Extension => [\n // Basic CodeMirror Setup\n history(),\n dropCursor(),\n indentOnInput(),\n bracketMatching(),\n closeBrackets(),\n autocompletion(),\n keymap.of([\n ...closeBracketsKeymap,\n ...defaultKeymap,\n ...searchKeymap,\n ...historyKeymap,\n ...foldKeymap,\n ...completionKeymap,\n ...lintKeymap,\n indentWithTab,\n ]),\n foldGutter(),\n EditorView.lineWrapping,\n\n // ProseMark Setup\n defaultHideExtensions,\n defaultFoldableSyntaxExtensions,\n clickLinkExtension,\n codeBlockDecorationsExtension,\n];\n\nexport const prosemarkBaseThemeSetup = (): Extension => [\n baseSyntaxHighlights,\n generalSyntaxHighlights,\n baseTheme,\n codeFenceTheme,\n];\n\nexport const prosemarkLightThemeSetup = (): Extension => lightTheme;\n"],"names":["elt","line","baseTheme$1","word","config","add","togglePanel","from","to","cur","phrase","baseTheme","score","off","applyCompletion","options","next","i","handlers","res","buildDecorations","node","emoji"],"mappings":"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","x_google_ignoreList":[0,1,2,3]}
|