UNPKG

@gdquest/gd-exercise

Version:

Core package that handles logic for the GDExercise project.

8 lines (7 loc) 16.4 kB
{ "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": ["EditorSelection", "startFreezeComment", "endFreezeComment", "element"] }