index.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import {
  2. EditorView,
  3. highlightSpecialChars,
  4. rectangularSelection,
  5. tooltips,
  6. crosshairCursor,
  7. dropCursor,
  8. highlightActiveLineGutter,
  9. } from '@codemirror/view'
  10. import { EditorState, Extension } from '@codemirror/state'
  11. import { foldGutter, indentOnInput } from '@codemirror/language'
  12. import { history } from '@codemirror/commands'
  13. import { language } from './language'
  14. import { lineWrappingIndentation } from './line-wrapping-indentation'
  15. import { theme } from './theme'
  16. import { realtime } from './realtime'
  17. import { cursorPosition } from './cursor-position'
  18. import { scrollPosition } from './scroll-position'
  19. import { annotations } from './annotations'
  20. import { cursorHighlights } from './cursor-highlights'
  21. import { autoComplete } from './auto-complete'
  22. import { editable } from './editable'
  23. import { autoPair } from './auto-pair'
  24. import { phrases } from './phrases'
  25. import { spelling } from './spelling'
  26. import { symbolPalette } from './symbol-palette'
  27. import { trackChanges } from './track-changes'
  28. import { search } from './search'
  29. import { filterCharacters } from './filter-characters'
  30. import { keybindings } from './keybindings'
  31. import { bracketMatching, bracketSelection } from './bracket-matching'
  32. import { verticalOverflow } from './vertical-overflow'
  33. import { exceptionLogger } from './exception-logger'
  34. import { thirdPartyExtensions } from './third-party-extensions'
  35. import { lineNumbers } from './line-numbers'
  36. import { highlightActiveLine } from './highlight-active-line'
  37. import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
  38. import { emptyLineFiller } from './empty-line-filler'
  39. import { goToLinePanel } from './go-to-line'
  40. import { drawSelection } from './draw-selection'
  41. import { sourceOnly, visual } from './visual/visual'
  42. import { inlineBackground } from './inline-background'
  43. import { indentationMarkers } from './indentation-markers'
  44. import { codemirrorDevTools } from '../languages/latex/codemirror-dev-tools'
  45. import { keymaps } from './keymaps'
  46. import { shortcuts } from './shortcuts'
  47. import { effectListeners } from './effect-listeners'
  48. const moduleExtensions: Array<() => Extension> = importOverleafModules(
  49. 'sourceEditorExtensions'
  50. ).map((item: { import: { extension: Extension } }) => item.import.extension)
  51. export const createExtensions = (options: Record<string, any>): Extension[] => [
  52. lineNumbers(),
  53. sourceOnly(
  54. false,
  55. highlightSpecialChars({
  56. addSpecialChars: new RegExp(
  57. // non standard space characters (https://jkorpela.fi/chars/spaces.html)
  58. '[\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u200B\u202F\u205F\u3000\uFEFF]',
  59. /x/.unicode != null ? 'gu' : 'g'
  60. ),
  61. })
  62. ),
  63. history({ newGroupDelay: 250 }),
  64. foldGutter({
  65. openText: '▾',
  66. closedText: '▸',
  67. }),
  68. drawSelection(),
  69. EditorState.allowMultipleSelections.of(true),
  70. EditorView.lineWrapping,
  71. indentOnInput(),
  72. lineWrappingIndentation(options.visual.visual),
  73. indentationMarkers(options.visual.visual),
  74. bracketMatching(),
  75. bracketSelection(),
  76. rectangularSelection(),
  77. crosshairCursor(),
  78. dropCursor(),
  79. tooltips({
  80. parent: document.body,
  81. }),
  82. keymaps,
  83. goToLinePanel(),
  84. filterCharacters(),
  85. // `autoComplete` needs to be before `keybindings` so that arrow key handling
  86. // in the autocomplete pop-up takes precedence over Vim/Emacs key bindings
  87. autoComplete(options.settings),
  88. // `keybindings` needs to be before `language` so that Vim/Emacs bindings take
  89. // precedence over language-specific keyboard shortcuts
  90. keybindings(),
  91. annotations(), // NOTE: must be before `language`
  92. language(options.currentDoc, options.metadata, options.settings),
  93. theme(options.theme),
  94. realtime(options.currentDoc, options.handleError),
  95. cursorPosition(options.currentDoc),
  96. scrollPosition(options.currentDoc),
  97. cursorHighlights(),
  98. autoPair(options.settings),
  99. editable(),
  100. search(),
  101. phrases(options.phrases),
  102. spelling(options.spelling),
  103. shortcuts,
  104. symbolPalette(),
  105. emptyLineFiller(), // NOTE: must be before `trackChanges`
  106. trackChanges(options.currentDoc, options.changeManager),
  107. visual(options.currentDoc, options.visual),
  108. verticalOverflow(),
  109. highlightActiveLine(options.visual.visual),
  110. highlightActiveLineGutter(),
  111. inlineBackground(options.visual.visual),
  112. codemirrorDevTools(),
  113. exceptionLogger(),
  114. moduleExtensions.map(extension => extension()),
  115. thirdPartyExtensions(),
  116. effectListeners(),
  117. ]