@grafana/ui
Version:
Grafana Components Library
1 lines • 6.66 kB
Source Map (JSON)
{"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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"}