braces.ts 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. const BRACES = {
  2. '[': ']',
  3. '{': '}',
  4. '(': ')',
  5. };
  6. export default function BracesPlugin() {
  7. return {
  8. onKeyDown(event, change) {
  9. const { value } = change;
  10. if (!value.isCollapsed) {
  11. return undefined;
  12. }
  13. switch (event.key) {
  14. case '{':
  15. case '[': {
  16. event.preventDefault();
  17. // Insert matching braces
  18. change
  19. .insertText(`${event.key}${BRACES[event.key]}`)
  20. .move(-1)
  21. .focus();
  22. return true;
  23. }
  24. case '(': {
  25. event.preventDefault();
  26. const text = value.anchorText.text;
  27. const offset = value.anchorOffset;
  28. const space = text.indexOf(' ', offset);
  29. const length = space > 0 ? space : text.length;
  30. const forward = length - offset;
  31. // Insert matching braces
  32. change
  33. .insertText(event.key)
  34. .move(forward)
  35. .insertText(BRACES[event.key])
  36. .move(-1 - forward)
  37. .focus();
  38. return true;
  39. }
  40. default: {
  41. break;
  42. }
  43. }
  44. return undefined;
  45. },
  46. };
  47. }