UNPKG

@grafana/ui

Version:
1 lines 6.58 kB
{"version":3,"file":"braces.mjs","sources":["../../../src/slate-plugins/braces.ts"],"sourcesContent":["import { Annotation } from 'slate';\nimport { Plugin } from 'slate-react';\nimport { v4 as uuidv4 } from 'uuid';\n\nconst BRACES: Record<string, string> = {\n '[': ']',\n '{': '}',\n '(': ')',\n};\n\nconst MATCH_MARK = 'brace_match';\n\nexport function BracesPlugin(): Plugin {\n return {\n onKeyDown(event, editor, next) {\n const { value } = editor;\n\n switch (event.key) {\n case '(':\n case '{':\n case '[': {\n const {\n start: { offset: startOffset, key: startKey },\n end: { offset: endOffset, key: endKey },\n focus: { offset: focusOffset },\n } = value.selection;\n const text = value.focusText.text;\n\n // If text is selected, wrap selected text in parens\n if (value.selection.isExpanded) {\n event.preventDefault();\n editor\n .insertTextByKey(startKey, startOffset, event.key)\n .insertTextByKey(endKey, endOffset + 1, BRACES[event.key])\n .moveEndBackward(1);\n return true;\n } else if (\n // Insert matching brace when there is no input after caret\n focusOffset === text.length ||\n text[focusOffset] === ' ' ||\n Object.values(BRACES).includes(text[focusOffset])\n ) {\n event.preventDefault();\n const complement = BRACES[event.key];\n const matchAnnotation = {\n key: `${MATCH_MARK}-${uuidv4()}`,\n type: `${MATCH_MARK}-${complement}`,\n anchor: {\n key: startKey,\n offset: startOffset,\n object: 'point',\n },\n focus: {\n key: endKey,\n offset: endOffset + 1,\n object: 'point',\n },\n object: 'annotation',\n } as Annotation;\n editor.insertText(event.key).insertText(complement).addAnnotation(matchAnnotation).moveBackward(1);\n\n return true;\n }\n break;\n }\n\n case ')':\n case '}':\n case ']': {\n const text = value.anchorText.text;\n const offset = value.selection.anchor.offset;\n const nextChar = text[offset];\n // Handle closing brace when it's already the next character\n const complement = event.key;\n const annotationType = `${MATCH_MARK}-${complement}`;\n const annotation = value.annotations.find(\n (a) => a?.type === annotationType && a.anchor.key === value.anchorText.key\n );\n if (annotation && nextChar === complement && !value.selection.isExpanded) {\n event.preventDefault();\n editor.moveFocusForward(1).removeAnnotation(annotation).moveAnchorForward(1);\n return true;\n }\n break;\n }\n\n case 'Backspace': {\n const text = value.anchorText.text;\n const offset = value.selection.anchor.offset;\n const previousChar = text[offset - 1];\n const nextChar = text[offset];\n if (BRACES[previousChar] && BRACES[previousChar] === nextChar) {\n event.preventDefault();\n // Remove closing brace if directly following\n editor.deleteBackward(1).deleteForward(1).focus();\n return true;\n }\n }\n\n default: {\n break;\n }\n }\n\n return next();\n },\n };\n}\n"],"names":["uuidv4"],"mappings":"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"}