newline.ts 816 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. // @ts-ignore
  2. import { Change } from 'slate';
  3. function getIndent(text: any) {
  4. let offset = text.length - text.trimLeft().length;
  5. if (offset) {
  6. let indent = text[0];
  7. while (--offset) {
  8. indent += text[0];
  9. }
  10. return indent;
  11. }
  12. return '';
  13. }
  14. export default function NewlinePlugin() {
  15. return {
  16. onKeyDown(event: KeyboardEvent, change: Change) {
  17. const { value } = change;
  18. if (!value.isCollapsed) {
  19. return undefined;
  20. }
  21. if (event.key === 'Enter' && event.shiftKey) {
  22. event.preventDefault();
  23. const { startBlock } = value;
  24. const currentLineText = startBlock.text;
  25. const indent = getIndent(currentLineText);
  26. return change
  27. .splitBlock()
  28. .insertText(indent)
  29. .focus();
  30. }
  31. },
  32. };
  33. }