UNPKG

@grafana/ui

Version:
1 lines 5.77 kB
{"version":3,"file":"indentation.mjs","sources":["../../../src/slate-plugins/indentation.ts"],"sourcesContent":["import { isKeyHotkey } from 'is-hotkey';\nimport * as React from 'react';\nimport { RangeJSON, Range as SlateRange } from 'slate';\nimport Plain from 'slate-plain-serializer';\nimport { Editor, Plugin } from 'slate-react';\n\nconst isIndentLeftHotkey = isKeyHotkey('mod+[');\nconst isShiftTabHotkey = isKeyHotkey('shift+tab');\nconst isIndentRightHotkey = isKeyHotkey('mod+]');\n\nconst SLATE_TAB = ' ';\n\nconst handleTabKey = (event: React.KeyboardEvent<Element>, editor: Editor, next: Function): void => {\n const {\n startBlock,\n endBlock,\n selection: {\n start: { offset: startOffset, key: startKey },\n end: { offset: endOffset, key: endKey },\n },\n } = editor.value;\n if (Plain.serialize(editor.value) === '') {\n return;\n }\n event.preventDefault();\n const first = startBlock.getFirstText();\n\n const startBlockIsSelected =\n first && startOffset === 0 && startKey === first.key && endOffset === first.text.length && endKey === first.key;\n\n if (startBlockIsSelected || !startBlock.equals(endBlock)) {\n handleIndent(editor, 'right');\n } else {\n editor.insertText(SLATE_TAB);\n }\n};\n\nconst handleIndent = (editor: Editor, indentDirection: 'left' | 'right') => {\n const curSelection = editor.value.selection;\n const selectedBlocks = editor.value.document.getLeafBlocksAtRange(curSelection).toArray();\n\n if (indentDirection === 'left') {\n for (const block of selectedBlocks) {\n const blockWhitespace = block.text.length - block.text.trimLeft().length;\n\n const textKey = block.getFirstText()!.key;\n\n const rangeProperties: RangeJSON = {\n anchor: {\n key: textKey,\n offset: blockWhitespace,\n path: [],\n },\n focus: {\n key: textKey,\n offset: blockWhitespace,\n path: [],\n },\n };\n\n editor.deleteBackwardAtRange(SlateRange.create(rangeProperties), Math.min(SLATE_TAB.length, blockWhitespace));\n }\n } else {\n const { startText } = editor.value;\n const textBeforeCaret = startText.text.slice(0, curSelection.start.offset);\n const isWhiteSpace = /^\\s*$/.test(textBeforeCaret);\n\n for (const block of selectedBlocks) {\n editor.insertTextByKey(block.getFirstText()!.key, 0, SLATE_TAB);\n }\n\n if (isWhiteSpace) {\n editor.moveStartBackward(SLATE_TAB.length);\n }\n }\n};\n\n// Clears the rest of the line after the caret\nexport function IndentationPlugin(): Plugin {\n return {\n onKeyDown(event, editor, next) {\n if (isIndentLeftHotkey(event) || isShiftTabHotkey(event)) {\n event.preventDefault();\n handleIndent(editor, 'left');\n } else if (isIndentRightHotkey(event)) {\n event.preventDefault();\n handleIndent(editor, 'right');\n } else if (event.key === 'Tab') {\n handleTabKey(event, editor, next);\n } else {\n return next();\n }\n\n return true;\n },\n };\n}\n"],"names":["SlateRange"],"mappings":"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"}