@gdquest/gd-exercise
Version:
Core package that handles logic for the GDExercise project.
8 lines (7 loc) • 17.1 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../codemirror-freeze/src/facet.mts", "../../codemirror-freeze/src/theme.mts", "../../codemirror-freeze/src/transaction-filter.mts", "../../codemirror-freeze/src/utils.mts", "../../codemirror-freeze/src/view.mts", "../../codemirror-freeze/src/index.mts"],
"sourcesContent": ["import { Facet } from \"@codemirror/state\";\n\nexport const startFreezeComment = Facet.define<string, string>({\n combine: (values) => {\n if (values.length > 0) {\n return values[values.length - 1];\n }\n return \"start-freeze\";\n },\n});\n\nexport const endFreezeComment = Facet.define<string, string>({\n combine: (values) => {\n if (values.length > 0) {\n return values[values.length - 1];\n }\n return \"end-freeze\";\n },\n});\n", "import { EditorView } from \"@codemirror/view\";\n\nexport const freezeTheme = EditorView.theme({\n \".cm-frozen\": {\n opacity: 0.75,\n fontStyle: \"italic\",\n },\n});\n", "import {\n EditorSelection,\n EditorState,\n type SelectionRange,\n} from \"@codemirror/state\";\n\nimport { startFreezeComment, endFreezeComment } from \"./facet.mts\";\nimport {\n createSelectionRangesFromSetRange,\n createSetRangeFromSelectionRange,\n getFreezeRanges,\n removeFromSetRange,\n} from \"./utils.mts\";\n\nexport function getFreezeTransactionFilter(): ReturnType<\n (typeof EditorState)[\"transactionFilter\"][\"of\"]\n> {\n return EditorState.transactionFilter.of((transaction) => {\n // If it's not releated to selection or the doc itself, skip\n if (!(transaction.selection != null || transaction.docChanged)) {\n return transaction;\n }\n\n const freezeRanges = getFreezeRanges(\n transaction.startState,\n transaction.startState.facet(startFreezeComment),\n transaction.startState.facet(endFreezeComment)\n );\n\n let ignoreChanges = false;\n\n if (transaction.docChanged) {\n transaction.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {\n const diff = Math.max(toA - fromA, toB - fromB);\n for (let i = 0; i < freezeRanges.length; i++) {\n let range = freezeRanges[i];\n\n if (diff > 0) {\n if (fromB < range.from) {\n range = EditorSelection.range(range.from + diff, range.to + diff);\n freezeRanges[i] = range;\n }\n }\n }\n });\n\n for (const freezeRange of freezeRanges) {\n const touchesRange = transaction.changes.desc.touchesRange(\n freezeRange.from,\n freezeRange.to\n );\n switch (touchesRange) {\n case \"cover\":\n case true:\n ignoreChanges = true;\n break;\n case false:\n default:\n // do nothing\n }\n\n if (ignoreChanges) {\n break;\n }\n }\n }\n\n let ranges: SelectionRange[] = [];\n\n if (transaction.selection != null) {\n let selection = transaction.newSelection;\n if (ignoreChanges) {\n selection = transaction.startState.selection;\n }\n\n for (const selectionRange of selection.ranges) {\n const selectionRangeSet =\n createSetRangeFromSelectionRange(selectionRange);\n for (const freezeRange of freezeRanges) {\n removeFromSetRange(freezeRange, selectionRangeSet);\n }\n ranges.push(...createSelectionRangesFromSetRange(selectionRangeSet));\n }\n\n // Removes the cursor at index 0 if a freeze range begins at zero\n const findHasFromZero = (selectionRange: SelectionRange): boolean => {\n return selectionRange.from === 0;\n };\n const fromZeroFreezeRange = freezeRanges.find(findHasFromZero);\n if (fromZeroFreezeRange != null) {\n const fromZeroRange = ranges.find(findHasFromZero);\n if (fromZeroRange != null) {\n ranges = ranges.filter((range) => range !== fromZeroRange);\n }\n }\n }\n\n const returnedTransaction = {\n ...transaction,\n ...(ranges.length > 0\n ? { selection: EditorSelection.create(ranges) }\n : {}),\n ...(ignoreChanges\n ? {\n changes: [],\n selection: transaction.startState.selection,\n }\n : {}),\n };\n\n return returnedTransaction;\n });\n}\n", "import { type CommentTokens } from \"@codemirror/commands\";\nimport { syntaxTree } from \"@codemirror/language\";\nimport {\n type EditorState,\n type SelectionRange,\n EditorSelection,\n} from \"@codemirror/state\";\n\nexport function getFreezeRanges(\n state: EditorState,\n startFreezeComment: string,\n endFreezeComment: string\n): SelectionRange[] {\n const tree = syntaxTree(state);\n const cursor = tree.cursor();\n\n const commentTokens = state.languageDataAt<CommentTokens>(\"commentTokens\", 0);\n\n const freezeRanges: SelectionRange[] = [];\n let currentRangeFrom = 0;\n\n do {\n if (cursor.name !== \"Comment\") {\n continue;\n }\n\n let fromOffset = 0;\n let toOffset = 0;\n\n const text = state.sliceDoc(cursor.from, cursor.to);\n let comment = \"\";\n\n for (const commentToken of commentTokens) {\n if (commentToken.line != null) {\n if (!text.startsWith(commentToken.line)) {\n continue;\n }\n\n fromOffset = commentToken.line.length;\n } else if (commentToken.block != null) {\n if (\n !(\n text.startsWith(commentToken.block.open) &&\n text.endsWith(commentToken.block.close)\n )\n ) {\n continue;\n }\n fromOffset = commentToken.block.open.length;\n toOffset = -commentToken.block.close.length;\n }\n }\n\n comment = text.slice(fromOffset, text.length + toOffset).trim();\n\n if (comment === startFreezeComment) {\n currentRangeFrom = cursor.from;\n } else if (comment === endFreezeComment) {\n freezeRanges.push(EditorSelection.range(currentRangeFrom, cursor.to));\n currentRangeFrom = 0;\n }\n } while (cursor.next());\n\n if (currentRangeFrom > 0) {\n freezeRanges.push(\n EditorSelection.range(currentRangeFrom, state.doc.toString().length)\n );\n }\n\n return freezeRanges;\n}\n\nexport function createSetRangeFromSelectionRange(\n range: SelectionRange\n): Set<number> {\n const setRange = new Set<number>();\n for (let i = range.from; i <= range.to; i++) {\n setRange.add(i);\n }\n return setRange;\n}\n\nexport function removeFromSetRange(\n rangeToRemove: SelectionRange,\n setRange: Set<number>\n): void {\n const numbersToRemove = Array.from(\n createSetRangeFromSelectionRange(rangeToRemove)\n );\n for (const numberToRemove of numbersToRemove) {\n setRange.delete(numberToRemove);\n }\n}\n\nexport function createSelectionRangesFromSetRange(\n range: Set<number>\n): SelectionRange[] {\n const elements = Array.from(range).sort((a, b) => a - b);\n const min = elements.reduce((previousValue, currentValue, currentIndex) => {\n if (currentIndex === 0) {\n return currentValue;\n }\n return Math.min(previousValue, currentValue);\n }, 0);\n const max = elements.reduce((previousValue, currentValue, currentIndex) => {\n if (currentIndex === 0) {\n return currentValue;\n }\n return Math.max(previousValue, currentValue);\n }, 0);\n\n const selectionRanges: SelectionRange[] = [];\n let selectionRange: SelectionRange | null = null;\n for (let i = min; i < max; i++) {\n const element = elements.find((element) => element === i);\n\n if (element == null && selectionRange != null) {\n selectionRanges.push(selectionRange);\n selectionRange = null;\n continue;\n }\n\n if (selectionRange == null) {\n selectionRange = EditorSelection.range(i, i);\n } else {\n selectionRange = EditorSelection.range(selectionRange.from, i);\n }\n }\n if (selectionRange != null) {\n selectionRanges.push(selectionRange);\n selectionRange = null;\n }\n\n return selectionRanges;\n}\n\nexport function handleEventFreezeFromPos(\n pos: number,\n event: Event,\n state: EditorState,\n startFreezeComment: string,\n endFreezeComment: string\n): void {\n const freezeRanges = getFreezeRanges(\n state,\n startFreezeComment,\n endFreezeComment\n );\n for (const freezeRange of freezeRanges) {\n if (freezeRange.from <= pos && pos < freezeRange.to) {\n event.preventDefault();\n event.stopImmediatePropagation();\n return;\n }\n }\n}\n", "import { type RangeSet, RangeSetBuilder } from \"@codemirror/state\";\nimport {\n Decoration,\n type DecorationSet,\n type EditorView,\n type PluginValue,\n type ViewUpdate,\n ViewPlugin,\n} from \"@codemirror/view\";\n\nimport { startFreezeComment, endFreezeComment } from \"./facet.mjs\";\nimport { getFreezeRanges } from \"./utils.mts\";\n\nconst frozenDecoration = Decoration.line({\n attributes: { class: \"cm-frozen\" },\n});\n\nfunction freezeDecoration(view: EditorView): RangeSet<Decoration> {\n const builder = new RangeSetBuilder<Decoration>();\n\n const freezeRanges = getFreezeRanges(\n view.state,\n view.state.facet(startFreezeComment),\n view.state.facet(endFreezeComment)\n );\n\n for (const { from, to } of view.visibleRanges) {\n for (let pos = from; pos <= to; ) {\n const line = view.state.doc.lineAt(pos);\n for (const freezeRange of freezeRanges) {\n if (\n (freezeRange.from < line.from && line.from < freezeRange.to) ||\n (freezeRange.from < line.to && line.to < freezeRange.to)\n ) {\n builder.add(line.from, line.from, frozenDecoration);\n }\n }\n pos = line.to + 1;\n }\n }\n\n return builder.finish();\n}\n\nclass FreezeViewPlugin implements PluginValue {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = freezeDecoration(view);\n }\n\n update(update: ViewUpdate): void {\n if (!(update.docChanged || update.viewportChanged)) {\n return;\n }\n this.decorations = freezeDecoration(update.view);\n }\n}\n\nexport function getFreezeViewPlugin(): ViewPlugin<FreezeViewPlugin> {\n const plugin = ViewPlugin.fromClass(FreezeViewPlugin, {\n decorations: (value) => value.decorations,\n });\n\n return plugin;\n}\n", "import { type Extension } from \"@codemirror/state\";\n\nimport { startFreezeComment, endFreezeComment } from \"./facet.mts\";\nimport { freezeTheme } from \"./theme.mts\";\nimport { getFreezeTransactionFilter } from \"./transaction-filter.mts\";\nimport { getFreezeViewPlugin } from \"./view.mts\";\n\nconst _startFreezeComment = startFreezeComment;\nconst _endFreezeComment = endFreezeComment;\n\nexport function freeze(\n startFreezeComment = \"start-freeze\",\n endFreezeComment = \"end-freeze\"\n): Extension {\n const startFreezeCommentOf = _startFreezeComment.of(startFreezeComment);\n const endFreezeCommentOf = _endFreezeComment.of(endFreezeComment);\n\n const freezeTransactionFilter = getFreezeTransactionFilter();\n const freezeViewPlugin = getFreezeViewPlugin();\n\n return [\n freezeTransactionFilter,\n freezeViewPlugin,\n startFreezeCommentOf,\n endFreezeCommentOf,\n freezeTheme,\n ];\n}\n\nexport { startFreezeComment, endFreezeComment };\n"],
"mappings": "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",
"names": ["Facet", "EditorView", "EditorSelection", "EditorState", "syntaxTree", "RangeSetBuilder", "Decoration", "ViewPlugin", "startFreezeComment", "values", "endFreezeComment", "freezeTheme", "getFreezeRanges", "state", "cursor", "commentTokens", "freezeRanges", "currentRangeFrom", "fromOffset", "toOffset", "text", "comment", "commentToken", "createSetRangeFromSelectionRange", "range", "setRange", "i", "removeFromSetRange", "rangeToRemove", "numbersToRemove", "numberToRemove", "createSelectionRangesFromSetRange", "elements", "a", "b", "min", "previousValue", "currentValue", "currentIndex", "max", "selectionRanges", "selectionRange", "element", "getFreezeTransactionFilter", "transaction", "ignoreChanges", "fromA", "toA", "fromB", "toB", "inserted", "diff", "freezeRange", "ranges", "selection", "selectionRangeSet", "findHasFromZero", "fromZeroRange", "frozenDecoration", "freezeDecoration", "view", "builder", "from", "to", "pos", "line", "FreezeViewPlugin", "update", "getFreezeViewPlugin", "value", "_startFreezeComment", "_endFreezeComment", "freeze", "startFreezeCommentOf", "endFreezeCommentOf", "freezeTransactionFilter", "freezeViewPlugin"]
}