@gravity-ui/markdown-editor 15.3.0 → 15.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/build/cjs/extensions/additional/GPT/MarkupGpt/plugin.js +4 -1
  2. package/build/cjs/extensions/additional/GPT/MarkupGpt/plugin.js.map +1 -1
  3. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +7 -3
  4. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
  5. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
  6. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +19 -2
  7. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
  8. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.d.ts +3 -0
  9. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.js +7 -1
  10. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.js.map +1 -1
  11. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.d.ts +1 -1
  12. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.js +8 -2
  13. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.js.map +1 -1
  14. package/build/cjs/extensions/additional/Mermaid/actions.js +12 -5
  15. package/build/cjs/extensions/additional/Mermaid/actions.js.map +1 -1
  16. package/build/cjs/extensions/additional/Mermaid/types.d.ts +3 -0
  17. package/build/cjs/extensions/additional/Mermaid/types.js +3 -0
  18. package/build/cjs/extensions/additional/Mermaid/types.js.map +1 -0
  19. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.d.ts +1 -0
  20. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js +14 -5
  21. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js.map +1 -1
  22. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +13 -12
  23. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  24. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.d.ts +3 -0
  25. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js +7 -1
  26. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js.map +1 -1
  27. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.d.ts +1 -1
  28. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js +8 -2
  29. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js.map +1 -1
  30. package/build/cjs/extensions/additional/YfmHtmlBlock/actions.js +9 -2
  31. package/build/cjs/extensions/additional/YfmHtmlBlock/actions.js.map +1 -1
  32. package/build/cjs/extensions/additional/YfmHtmlBlock/types.d.ts +3 -0
  33. package/build/cjs/extensions/additional/YfmHtmlBlock/types.js +3 -0
  34. package/build/cjs/extensions/additional/YfmHtmlBlock/types.js.map +1 -0
  35. package/build/cjs/extensions/behavior/Autocomplete/index.d.ts +1 -0
  36. package/build/cjs/extensions/behavior/Autocomplete/index.js +5 -3
  37. package/build/cjs/extensions/behavior/Autocomplete/index.js.map +1 -1
  38. package/build/cjs/extensions/behavior/Autocomplete/types.d.ts +1 -1
  39. package/build/cjs/extensions/behavior/Autocomplete/types.js.map +1 -1
  40. package/build/cjs/extensions/behavior/Autocomplete/utils.d.ts +3 -0
  41. package/build/cjs/extensions/behavior/Autocomplete/utils.js +8 -0
  42. package/build/cjs/extensions/behavior/Autocomplete/utils.js.map +1 -0
  43. package/build/cjs/extensions/behavior/Clipboard/code.d.ts +7 -1
  44. package/build/cjs/extensions/behavior/Clipboard/code.js +60 -0
  45. package/build/cjs/extensions/behavior/Clipboard/code.js.map +1 -1
  46. package/build/cjs/extensions/behavior/Clipboard/index.js +2 -0
  47. package/build/cjs/extensions/behavior/Clipboard/index.js.map +1 -1
  48. package/build/cjs/extensions/behavior/CommandMenu/handler.js +6 -6
  49. package/build/cjs/extensions/behavior/CommandMenu/handler.js.map +1 -1
  50. package/build/cjs/extensions/behavior/SharedState/SharedState.d.ts +7 -0
  51. package/build/cjs/extensions/behavior/SharedState/SharedState.js +16 -0
  52. package/build/cjs/extensions/behavior/SharedState/SharedState.js.map +1 -0
  53. package/build/cjs/extensions/behavior/SharedState/index.d.ts +1 -0
  54. package/build/cjs/extensions/behavior/SharedState/index.js +5 -0
  55. package/build/cjs/extensions/behavior/SharedState/index.js.map +1 -0
  56. package/build/cjs/extensions/behavior/SharedState/plugin.d.ts +3 -0
  57. package/build/cjs/extensions/behavior/SharedState/plugin.js +62 -0
  58. package/build/cjs/extensions/behavior/SharedState/plugin.js.map +1 -0
  59. package/build/cjs/extensions/behavior/SharedState/types.d.ts +1 -0
  60. package/build/cjs/extensions/behavior/SharedState/types.js +3 -0
  61. package/build/cjs/extensions/behavior/SharedState/types.js.map +1 -0
  62. package/build/cjs/extensions/behavior/SharedState/utils.d.ts +29 -0
  63. package/build/cjs/extensions/behavior/SharedState/utils.js +60 -0
  64. package/build/cjs/extensions/behavior/SharedState/utils.js.map +1 -0
  65. package/build/cjs/extensions/behavior/index.d.ts +2 -0
  66. package/build/cjs/extensions/behavior/index.js +4 -0
  67. package/build/cjs/extensions/behavior/index.js.map +1 -1
  68. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +41 -26
  69. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  70. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.d.ts +0 -1
  71. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +7 -6
  72. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
  73. package/build/cjs/react-utils/index.d.ts +1 -0
  74. package/build/cjs/react-utils/index.js +1 -0
  75. package/build/cjs/react-utils/index.js.map +1 -1
  76. package/build/cjs/react-utils/useSharedEditingState.d.ts +5 -0
  77. package/build/cjs/react-utils/useSharedEditingState.js +25 -0
  78. package/build/cjs/react-utils/useSharedEditingState.js.map +1 -0
  79. package/build/cjs/utils/descedants.d.ts +8 -0
  80. package/build/cjs/utils/descedants.js +15 -0
  81. package/build/cjs/utils/descedants.js.map +1 -0
  82. package/build/cjs/utils/entity-id.d.ts +11 -0
  83. package/build/cjs/utils/entity-id.js +21 -0
  84. package/build/cjs/utils/entity-id.js.map +1 -0
  85. package/build/cjs/utils/index.d.ts +2 -0
  86. package/build/cjs/utils/index.js +2 -0
  87. package/build/cjs/utils/index.js.map +1 -1
  88. package/build/cjs/version.js +1 -1
  89. package/build/cjs/version.js.map +1 -1
  90. package/build/cjs/view/hocs/withYfmHtml/index.d.ts +2 -0
  91. package/build/cjs/view/hocs/withYfmHtml/index.js +2 -2
  92. package/build/cjs/view/hocs/withYfmHtml/index.js.map +1 -1
  93. package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js +3 -1
  94. package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js.map +1 -1
  95. package/build/esm/extensions/additional/GPT/MarkupGpt/plugin.js +4 -1
  96. package/build/esm/extensions/additional/GPT/MarkupGpt/plugin.js.map +1 -1
  97. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +8 -4
  98. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
  99. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
  100. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +18 -1
  101. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
  102. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.d.ts +3 -0
  103. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.js +6 -0
  104. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.js.map +1 -1
  105. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.d.ts +2 -2
  106. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.js +8 -3
  107. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.js.map +1 -1
  108. package/build/esm/extensions/additional/Mermaid/actions.js +12 -5
  109. package/build/esm/extensions/additional/Mermaid/actions.js.map +1 -1
  110. package/build/esm/extensions/additional/Mermaid/types.d.ts +3 -0
  111. package/build/esm/extensions/additional/Mermaid/types.js +2 -0
  112. package/build/esm/extensions/additional/Mermaid/types.js.map +1 -0
  113. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.d.ts +1 -0
  114. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js +14 -5
  115. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js.map +1 -1
  116. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +13 -11
  117. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  118. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.d.ts +3 -0
  119. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js +6 -0
  120. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js.map +1 -1
  121. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.d.ts +2 -2
  122. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js +8 -3
  123. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js.map +1 -1
  124. package/build/esm/extensions/additional/YfmHtmlBlock/actions.js +9 -2
  125. package/build/esm/extensions/additional/YfmHtmlBlock/actions.js.map +1 -1
  126. package/build/esm/extensions/additional/YfmHtmlBlock/types.d.ts +3 -0
  127. package/build/esm/extensions/additional/YfmHtmlBlock/types.js +2 -0
  128. package/build/esm/extensions/additional/YfmHtmlBlock/types.js.map +1 -0
  129. package/build/esm/extensions/behavior/Autocomplete/index.d.ts +1 -0
  130. package/build/esm/extensions/behavior/Autocomplete/index.js +2 -1
  131. package/build/esm/extensions/behavior/Autocomplete/index.js.map +1 -1
  132. package/build/esm/extensions/behavior/Autocomplete/types.d.ts +1 -1
  133. package/build/esm/extensions/behavior/Autocomplete/types.js.map +1 -1
  134. package/build/esm/extensions/behavior/Autocomplete/utils.d.ts +3 -0
  135. package/build/esm/extensions/behavior/Autocomplete/utils.js +5 -0
  136. package/build/esm/extensions/behavior/Autocomplete/utils.js.map +1 -0
  137. package/build/esm/extensions/behavior/Clipboard/code.d.ts +7 -1
  138. package/build/esm/extensions/behavior/Clipboard/code.js +57 -0
  139. package/build/esm/extensions/behavior/Clipboard/code.js.map +1 -1
  140. package/build/esm/extensions/behavior/Clipboard/index.js +2 -0
  141. package/build/esm/extensions/behavior/Clipboard/index.js.map +1 -1
  142. package/build/esm/extensions/behavior/CommandMenu/handler.js +7 -7
  143. package/build/esm/extensions/behavior/CommandMenu/handler.js.map +1 -1
  144. package/build/esm/extensions/behavior/SharedState/SharedState.d.ts +7 -0
  145. package/build/esm/extensions/behavior/SharedState/SharedState.js +11 -0
  146. package/build/esm/extensions/behavior/SharedState/SharedState.js.map +1 -0
  147. package/build/esm/extensions/behavior/SharedState/index.d.ts +1 -0
  148. package/build/esm/extensions/behavior/SharedState/index.js +2 -0
  149. package/build/esm/extensions/behavior/SharedState/index.js.map +1 -0
  150. package/build/esm/extensions/behavior/SharedState/plugin.d.ts +3 -0
  151. package/build/esm/extensions/behavior/SharedState/plugin.js +59 -0
  152. package/build/esm/extensions/behavior/SharedState/plugin.js.map +1 -0
  153. package/build/esm/extensions/behavior/SharedState/types.d.ts +1 -0
  154. package/build/esm/extensions/behavior/SharedState/types.js +2 -0
  155. package/build/esm/extensions/behavior/SharedState/types.js.map +1 -0
  156. package/build/esm/extensions/behavior/SharedState/utils.d.ts +29 -0
  157. package/build/esm/extensions/behavior/SharedState/utils.js +56 -0
  158. package/build/esm/extensions/behavior/SharedState/utils.js.map +1 -0
  159. package/build/esm/extensions/behavior/index.d.ts +2 -0
  160. package/build/esm/extensions/behavior/index.js +4 -0
  161. package/build/esm/extensions/behavior/index.js.map +1 -1
  162. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +41 -26
  163. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  164. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.d.ts +0 -1
  165. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +8 -7
  166. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
  167. package/build/esm/react-utils/index.d.ts +1 -0
  168. package/build/esm/react-utils/index.js +1 -0
  169. package/build/esm/react-utils/index.js.map +1 -1
  170. package/build/esm/react-utils/useSharedEditingState.d.ts +5 -0
  171. package/build/esm/react-utils/useSharedEditingState.js +22 -0
  172. package/build/esm/react-utils/useSharedEditingState.js.map +1 -0
  173. package/build/esm/utils/descedants.d.ts +8 -0
  174. package/build/esm/utils/descedants.js +12 -0
  175. package/build/esm/utils/descedants.js.map +1 -0
  176. package/build/esm/utils/entity-id.d.ts +11 -0
  177. package/build/esm/utils/entity-id.js +16 -0
  178. package/build/esm/utils/entity-id.js.map +1 -0
  179. package/build/esm/utils/index.d.ts +2 -0
  180. package/build/esm/utils/index.js +2 -0
  181. package/build/esm/utils/index.js.map +1 -1
  182. package/build/esm/version.js +1 -1
  183. package/build/esm/version.js.map +1 -1
  184. package/build/esm/view/hocs/withYfmHtml/index.d.ts +2 -0
  185. package/build/esm/view/hocs/withYfmHtml/index.js +2 -2
  186. package/build/esm/view/hocs/withYfmHtml/index.js.map +1 -1
  187. package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js +3 -1
  188. package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js.map +1 -1
  189. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/CommandMenu/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {AutocompletePopupCloser} from '../../../utils/autocomplete-popup';\nimport {ArrayCarousel} from '../../../utils/carousel';\nimport {\n type AutocompleteAction,\n AutocompleteActionKind,\n type AutocompleteHandler,\n type FromTo,\n closeAutocomplete,\n} from '../Autocomplete';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\nimport {type CommandMenuComponentProps, render} from './component';\nimport type {CommandAction, Config} from './types';\nimport {findDecoElem} from './utils';\n\ndeclare module 'prosemirror-model' {\n interface NodeSpec {\n commandMenu?: boolean;\n }\n}\n\nexport type CommandHandlerParams = {\n logger: Logger2.ILogger;\n actions: Config;\n storage: ActionStorage;\n nodesIgnoreList?: readonly string[];\n};\n\nexport class CommandHandler implements AutocompleteHandler {\n readonly #logger: Logger2.ILogger;\n readonly #actions: readonly CommandAction[];\n readonly #actionStorage: ActionStorage;\n readonly #nodesIgnoreList: readonly string[];\n #filteredActionsCarousel?: ArrayCarousel<CommandAction>;\n\n #view?: EditorView;\n #anchor: Element | null = null;\n #range?: FromTo;\n #filterText?: string;\n #popupCloser?: AutocompletePopupCloser;\n\n #menuProps?: CommandMenuComponentProps;\n #menuRenderItem?: RendererItem;\n\n constructor({logger, actions, storage, nodesIgnoreList = []}: CommandHandlerParams) {\n this.#logger = logger;\n this.#actions = actions;\n this.#actionStorage = storage;\n this.#nodesIgnoreList = nodesIgnoreList;\n }\n\n onOpen(action: AutocompleteAction): boolean {\n this.findAnchor();\n if (!this.#anchor || this.shouldIgnore(action)) {\n this.closeAutocomplete(action.view);\n return true;\n }\n\n this.#popupCloser = new AutocompletePopupCloser(action.view);\n this.updateState(action);\n this.filterActions();\n this.render();\n\n return true;\n }\n\n onFilter(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action) || action.filter?.endsWith(' ')) {\n this.closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n this.#filterText = action.filter?.trim().toLowerCase();\n const needToClose = this.filterActions();\n this.render();\n\n if (needToClose) {\n this.closeAutocomplete(action.view);\n }\n\n return true;\n }\n\n onArrow(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action)) {\n closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n if (!this.#filteredActionsCarousel) return false;\n\n switch (action.kind) {\n case AutocompleteActionKind.up: {\n this.#filteredActionsCarousel.prev();\n break;\n }\n case AutocompleteActionKind.down: {\n this.#filteredActionsCarousel.next();\n break;\n }\n default:\n return false;\n }\n\n this.render();\n\n return true;\n }\n\n onEnter(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action)) {\n closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n this.select();\n\n return true;\n }\n\n onClose(action: AutocompleteAction): boolean {\n this.updateState(action);\n\n this.clear();\n\n return true;\n }\n\n onDestroy(): void {\n this.clear();\n }\n\n private closeAutocomplete(view: EditorView) {\n setTimeout(() => {\n closeAutocomplete(view);\n });\n }\n\n private shouldIgnore(action: AutocompleteAction): boolean {\n const parentType = action.view.state.doc.resolve(action.range.from).parent.type;\n return (\n parentType.spec.commandMenu === false || this.#nodesIgnoreList.includes(parentType.name)\n );\n }\n\n private select() {\n if (!this.#view || !this.#range) return;\n\n const action = this.#filteredActionsCarousel?.currentItem;\n if (!action) return;\n\n const view = this.#view;\n const range = this.#range;\n\n view.dispatch(view.state.tr.deleteRange(range.from, range.to).scrollIntoView());\n action.exec(this.#actionStorage);\n view.focus();\n\n globalLogger.action({mode: 'wysiwyg', source: 'command-menu', action: action.id});\n this.#logger.action({source: 'command-menu', action: action.id});\n }\n\n private filterActions(): boolean {\n const currentItem = this.#filteredActionsCarousel?.currentItem;\n const inputText = this.#filterText;\n\n const enabledActions = this.#actions.filter((action) =>\n action.isEnable(this.#actionStorage),\n );\n\n let filteredActions = enabledActions;\n let needToClose = false;\n\n if (inputText) {\n filteredActions = filterActions(enabledActions, inputText);\n needToClose = !filteredActions.length && needToHide(enabledActions, inputText);\n }\n\n this.#filteredActionsCarousel = new ArrayCarousel(filteredActions);\n\n if (currentItem) {\n const newIndex = this.#filteredActionsCarousel.array.findIndex(\n (item) => item === currentItem,\n );\n if (newIndex !== -1) {\n this.#filteredActionsCarousel.currentIndex = newIndex;\n }\n }\n\n return needToClose;\n }\n\n private render() {\n this.findAnchor();\n const viewItems = this.#filteredActionsCarousel?.array ?? [];\n this.#menuProps = {\n anchorElement: this.#anchor,\n currentIndex: this.#filteredActionsCarousel?.currentIndex,\n items: viewItems,\n onItemClick: this.onItemClick,\n onOpenChange: this.#popupCloser?.popupOpenChangeHandler,\n };\n this.#menuRenderItem = this.#menuRenderItem ?? this.createMenuRenderItem();\n this.#menuRenderItem.rerender();\n }\n\n private onItemClick = (index: number) => {\n if (this.#filteredActionsCarousel) {\n this.#filteredActionsCarousel.currentIndex = index;\n this.select();\n }\n this.#view?.focus();\n };\n\n private updateState({view, range}: AutocompleteAction) {\n this.#view = view;\n this.#range = range;\n }\n\n private clear() {\n this.#view = undefined;\n this.#range = undefined;\n this.#anchor = null;\n this.#filterText = undefined;\n this.#filteredActionsCarousel = undefined;\n this.#popupCloser?.cancelTimer();\n this.#popupCloser = undefined;\n this.#menuProps = undefined;\n this.#menuRenderItem?.remove();\n this.#menuRenderItem = undefined;\n }\n\n private createMenuRenderItem(): RendererItem {\n return getReactRendererFromState(this.#view!.state).createItem('command_menu', () =>\n this.#menuProps ? render(this.#menuProps) : null,\n );\n }\n\n private findAnchor() {\n this.#anchor = findDecoElem(this.#view?.dom);\n }\n}\n\nfunction filterActions(actions: readonly CommandAction[], text: string): CommandAction[] {\n return actions.filter(\n (action) =>\n action.id.toLowerCase().includes(text) ||\n (isFunction(action.title) ? action.title() : action.title).toLowerCase().includes(text),\n );\n}\n\nconst CHARS_TO_HIDE = 4;\nfunction needToHide(actions: readonly CommandAction[], text: string): boolean {\n let iter = 1;\n do {\n const prevInput = text.slice(0, text.length - iter);\n const prevActions = filterActions(actions, prevInput);\n if (prevActions.length) break;\n iter++;\n } while (iter < text.length && iter < CHARS_TO_HIDE);\n return iter >= CHARS_TO_HIDE;\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/CommandMenu/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {AutocompletePopupCloser} from '../../../utils/autocomplete-popup';\nimport {ArrayCarousel} from '../../../utils/carousel';\nimport {\n type AutocompleteAction,\n AutocompleteActionKind,\n type AutocompleteHandler,\n closeAutocomplete,\n getAutocompleteState,\n} from '../Autocomplete';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\nimport {type CommandMenuComponentProps, render} from './component';\nimport type {CommandAction, Config} from './types';\nimport {findDecoElem} from './utils';\n\ndeclare module 'prosemirror-model' {\n interface NodeSpec {\n commandMenu?: boolean;\n }\n}\n\nexport type CommandHandlerParams = {\n logger: Logger2.ILogger;\n actions: Config;\n storage: ActionStorage;\n nodesIgnoreList?: readonly string[];\n};\n\nexport class CommandHandler implements AutocompleteHandler {\n readonly #logger: Logger2.ILogger;\n readonly #actions: readonly CommandAction[];\n readonly #actionStorage: ActionStorage;\n readonly #nodesIgnoreList: readonly string[];\n #filteredActionsCarousel?: ArrayCarousel<CommandAction>;\n\n #view?: EditorView;\n #anchor: Element | null = null;\n #filterText?: string;\n #popupCloser?: AutocompletePopupCloser;\n\n #menuProps?: CommandMenuComponentProps;\n #menuRenderItem?: RendererItem;\n\n constructor({logger, actions, storage, nodesIgnoreList = []}: CommandHandlerParams) {\n this.#logger = logger;\n this.#actions = actions;\n this.#actionStorage = storage;\n this.#nodesIgnoreList = nodesIgnoreList;\n }\n\n onOpen(action: AutocompleteAction): boolean {\n this.findAnchor();\n if (!this.#anchor || this.shouldIgnore(action)) {\n this.closeAutocomplete(action.view);\n return true;\n }\n\n this.#popupCloser = new AutocompletePopupCloser(action.view);\n this.updateState(action);\n this.filterActions();\n this.render();\n\n return true;\n }\n\n onFilter(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action) || action.filter?.endsWith(' ')) {\n this.closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n this.#filterText = action.filter?.trim().toLowerCase();\n const needToClose = this.filterActions();\n this.render();\n\n if (needToClose) {\n this.closeAutocomplete(action.view);\n }\n\n return true;\n }\n\n onArrow(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action)) {\n closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n if (!this.#filteredActionsCarousel) return false;\n\n switch (action.kind) {\n case AutocompleteActionKind.up: {\n this.#filteredActionsCarousel.prev();\n break;\n }\n case AutocompleteActionKind.down: {\n this.#filteredActionsCarousel.next();\n break;\n }\n default:\n return false;\n }\n\n this.render();\n\n return true;\n }\n\n onEnter(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action)) {\n closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n this.select();\n\n return true;\n }\n\n onClose(action: AutocompleteAction): boolean {\n this.updateState(action);\n\n this.clear();\n\n return true;\n }\n\n onDestroy(): void {\n this.clear();\n }\n\n private closeAutocomplete(view: EditorView) {\n setTimeout(() => {\n closeAutocomplete(view);\n });\n }\n\n private shouldIgnore(action: AutocompleteAction): boolean {\n const parentType = action.view.state.doc.resolve(action.range.from).parent.type;\n return (\n parentType.spec.commandMenu === false || this.#nodesIgnoreList.includes(parentType.name)\n );\n }\n\n private select() {\n if (!this.#view) return;\n\n const action = this.#filteredActionsCarousel?.currentItem;\n if (!action) return;\n\n const autocompleteState = getAutocompleteState(this.#view.state);\n if (!autocompleteState || !autocompleteState.active) return;\n\n const view = this.#view;\n const {range} = autocompleteState;\n\n view.dispatch(view.state.tr.deleteRange(range.from, range.to).scrollIntoView());\n action.exec(this.#actionStorage);\n view.focus();\n\n globalLogger.action({mode: 'wysiwyg', source: 'command-menu', action: action.id});\n this.#logger.action({source: 'command-menu', action: action.id});\n }\n\n private filterActions(): boolean {\n const currentItem = this.#filteredActionsCarousel?.currentItem;\n const inputText = this.#filterText;\n\n const enabledActions = this.#actions.filter((action) =>\n action.isEnable(this.#actionStorage),\n );\n\n let filteredActions = enabledActions;\n let needToClose = false;\n\n if (inputText) {\n filteredActions = filterActions(enabledActions, inputText);\n needToClose = !filteredActions.length && needToHide(enabledActions, inputText);\n }\n\n this.#filteredActionsCarousel = new ArrayCarousel(filteredActions);\n\n if (currentItem) {\n const newIndex = this.#filteredActionsCarousel.array.findIndex(\n (item) => item === currentItem,\n );\n if (newIndex !== -1) {\n this.#filteredActionsCarousel.currentIndex = newIndex;\n }\n }\n\n return needToClose;\n }\n\n private render() {\n this.findAnchor();\n const viewItems = this.#filteredActionsCarousel?.array ?? [];\n this.#menuProps = {\n anchorElement: this.#anchor,\n currentIndex: this.#filteredActionsCarousel?.currentIndex,\n items: viewItems,\n onItemClick: this.onItemClick,\n onOpenChange: this.#popupCloser?.popupOpenChangeHandler,\n };\n this.#menuRenderItem = this.#menuRenderItem ?? this.createMenuRenderItem();\n this.#menuRenderItem.rerender();\n }\n\n private onItemClick = (index: number) => {\n if (this.#filteredActionsCarousel) {\n this.#filteredActionsCarousel.currentIndex = index;\n this.select();\n }\n this.#view?.focus();\n };\n\n private updateState({view}: AutocompleteAction) {\n this.#view = view;\n }\n\n private clear() {\n this.#view = undefined;\n this.#anchor = null;\n this.#filterText = undefined;\n this.#filteredActionsCarousel = undefined;\n this.#popupCloser?.cancelTimer();\n this.#popupCloser = undefined;\n this.#menuProps = undefined;\n this.#menuRenderItem?.remove();\n this.#menuRenderItem = undefined;\n }\n\n private createMenuRenderItem(): RendererItem {\n return getReactRendererFromState(this.#view!.state).createItem('command_menu', () =>\n this.#menuProps ? render(this.#menuProps) : null,\n );\n }\n\n private findAnchor() {\n this.#anchor = findDecoElem(this.#view?.dom);\n }\n}\n\nfunction filterActions(actions: readonly CommandAction[], text: string): CommandAction[] {\n return actions.filter(\n (action) =>\n action.id.toLowerCase().includes(text) ||\n (isFunction(action.title) ? action.title() : action.title).toLowerCase().includes(text),\n );\n}\n\nconst CHARS_TO_HIDE = 4;\nfunction needToHide(actions: readonly CommandAction[], text: string): boolean {\n let iter = 1;\n do {\n const prevInput = text.slice(0, text.length - iter);\n const prevActions = filterActions(actions, prevInput);\n if (prevActions.length) break;\n iter++;\n } while (iter < text.length && iter < CHARS_TO_HIDE);\n return iter >= CHARS_TO_HIDE;\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import type { Extension } from "../../../core/index.js";
2
+ export { SharedStateKey, type SharedStateKeySpec } from "./utils.js";
3
+ /**
4
+ * This extension enables a plugin that stores internal state and handles its changes via meta-information in transactions.
5
+ * You can get, change and subscribe to state changes using a SharedStateKey instance.
6
+ */
7
+ export declare const SharedState: Extension;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SharedState = exports.SharedStateKey = void 0;
4
+ const state_1 = require("../../../pm/state.js");
5
+ const plugin_1 = require("./plugin.js");
6
+ var utils_1 = require("./utils.js");
7
+ Object.defineProperty(exports, "SharedStateKey", { enumerable: true, get: function () { return utils_1.SharedStateKey; } });
8
+ /**
9
+ * This extension enables a plugin that stores internal state and handles its changes via meta-information in transactions.
10
+ * You can get, change and subscribe to state changes using a SharedStateKey instance.
11
+ */
12
+ const SharedState = (builder) => {
13
+ builder.addPlugin(() => new state_1.Plugin(plugin_1.pluginSpec));
14
+ };
15
+ exports.SharedState = SharedState;
16
+ //# sourceMappingURL=SharedState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SharedState.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SharedState/SharedState.ts"],"names":[],"mappings":";;;AACA,gDAAiC;AAEjC,wCAAoC;AAEpC,oCAAgE;AAAxD,uGAAA,cAAc,OAAA;AAEtB;;;GAGG;AACI,MAAM,WAAW,GAAc,CAAC,OAAO,EAAE,EAAE;IAC9C,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,cAAM,CAAC,mBAAU,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAFW,QAAA,WAAW,eAEtB","sourcesContent":["import type {Extension} from '#core';\nimport {Plugin} from '#pm/state';\n\nimport {pluginSpec} from './plugin';\n\nexport {SharedStateKey, type SharedStateKeySpec} from './utils';\n\n/**\n * This extension enables a plugin that stores internal state and handles its changes via meta-information in transactions.\n * You can get, change and subscribe to state changes using a SharedStateKey instance.\n */\nexport const SharedState: Extension = (builder) => {\n builder.addPlugin(() => new Plugin(pluginSpec));\n};\n"]}
@@ -0,0 +1 @@
1
+ export * from "./SharedState.js";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./SharedState.js"), exports);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SharedState/index.ts"],"names":[],"mappings":";;;AAAA,2DAA8B","sourcesContent":["export * from './SharedState';\n"]}
@@ -0,0 +1,3 @@
1
+ import { type PluginSpec } from "../../../pm/state.js";
2
+ import type { SharedPluginState } from "./types.js";
3
+ export declare const pluginSpec: PluginSpec<SharedPluginState>;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pluginSpec = exports.pluginKey = void 0;
4
+ const state_1 = require("../../../pm/state.js");
5
+ const event_emitter_1 = require("../../../utils/event-emitter.js");
6
+ /** @internal */
7
+ exports.pluginKey = new state_1.PluginKey('shared-state');
8
+ exports.pluginSpec = {
9
+ key: exports.pluginKey,
10
+ state: {
11
+ init() {
12
+ return {
13
+ map: new Map(),
14
+ changedKeys: null,
15
+ notifyBus: new event_emitter_1.EventEmitter(),
16
+ };
17
+ },
18
+ apply(tr, { map, notifyBus }) {
19
+ const meta = tr.getMeta(exports.pluginKey);
20
+ if (!meta || !meta.actions.length)
21
+ return { changedKeys: null, map, notifyBus };
22
+ const changedKeys = new Set();
23
+ for (const action of meta.actions) {
24
+ switch (action.type) {
25
+ case 'delete': {
26
+ map.delete(action.key);
27
+ break;
28
+ }
29
+ case 'update': {
30
+ let value = map.get(action.key);
31
+ value = { ...value, ...action.data };
32
+ map.set(action.key, value);
33
+ break;
34
+ }
35
+ case 'set': {
36
+ map.set(action.key, action.data);
37
+ break;
38
+ }
39
+ default: {
40
+ continue;
41
+ }
42
+ }
43
+ changedKeys.add(action.key);
44
+ }
45
+ return { changedKeys, map, notifyBus };
46
+ },
47
+ },
48
+ view: () => {
49
+ return {
50
+ update(view) {
51
+ const state = exports.pluginKey.getState(view.state);
52
+ if (!state || !state.changedKeys || !state.changedKeys.size)
53
+ return;
54
+ for (const key of state.changedKeys) {
55
+ const value = state.map.get(key);
56
+ state.notifyBus.emit(key, value);
57
+ }
58
+ },
59
+ };
60
+ },
61
+ };
62
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SharedState/plugin.ts"],"names":[],"mappings":";;;AAAA,gDAAqD;AACrD,mEAAqD;AAIrD,gBAAgB;AACH,QAAA,SAAS,GAAG,IAAI,iBAAS,CAAoB,cAAc,CAAC,CAAC;AAE7D,QAAA,UAAU,GAAkC;IACrD,GAAG,EAAE,iBAAS;IACd,KAAK,EAAE;QACH,IAAI;YACA,OAAO;gBACH,GAAG,EAAE,IAAI,GAAG,EAAE;gBACd,WAAW,EAAE,IAAI;gBACjB,SAAS,EAAE,IAAI,4BAAY,EAAE;aAChC,CAAC;QACN,CAAC;QACD,KAAK,CAAC,EAAE,EAAE,EAAC,GAAG,EAAE,SAAS,EAAC;YACtB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,iBAAS,CAAuB,CAAC;YACzD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,EAAC,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAC,CAAC;YAE9E,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;YACtC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;oBAClB,KAAK,QAAQ,CAAC,CAAC,CAAC;wBACZ,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBACvB,MAAM;oBACV,CAAC;oBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;wBACZ,IAAI,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBAChC,KAAK,GAAG,EAAC,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,IAAI,EAAC,CAAC;wBACnC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;wBAC3B,MAAM;oBACV,CAAC;oBACD,KAAK,KAAK,CAAC,CAAC,CAAC;wBACT,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;wBACjC,MAAM;oBACV,CAAC;oBACD,OAAO,CAAC,CAAC,CAAC;wBACN,SAAS;oBACb,CAAC;gBACL,CAAC;gBACD,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;YAED,OAAO,EAAC,WAAW,EAAE,GAAG,EAAE,SAAS,EAAC,CAAC;QACzC,CAAC;KACJ;IACD,IAAI,EAAE,GAAG,EAAE;QACP,OAAO;YACH,MAAM,CAAC,IAAI;gBACP,MAAM,KAAK,GAAG,iBAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI;oBAAE,OAAO;gBAEpE,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;oBAClC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACjC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACrC,CAAC;YACL,CAAC;SACJ,CAAC;IACN,CAAC;CACJ,CAAC","sourcesContent":["import {PluginKey, type PluginSpec} from '#pm/state';\nimport {EventEmitter} from 'src/utils/event-emitter';\n\nimport type {SharedPluginState, TrMeta} from './types';\n\n/** @internal */\nexport const pluginKey = new PluginKey<SharedPluginState>('shared-state');\n\nexport const pluginSpec: PluginSpec<SharedPluginState> = {\n key: pluginKey,\n state: {\n init() {\n return {\n map: new Map(),\n changedKeys: null,\n notifyBus: new EventEmitter(),\n };\n },\n apply(tr, {map, notifyBus}) {\n const meta = tr.getMeta(pluginKey) as TrMeta | undefined;\n if (!meta || !meta.actions.length) return {changedKeys: null, map, notifyBus};\n\n const changedKeys = new Set<string>();\n for (const action of meta.actions) {\n switch (action.type) {\n case 'delete': {\n map.delete(action.key);\n break;\n }\n case 'update': {\n let value = map.get(action.key);\n value = {...value, ...action.data};\n map.set(action.key, value);\n break;\n }\n case 'set': {\n map.set(action.key, action.data);\n break;\n }\n default: {\n continue;\n }\n }\n changedKeys.add(action.key);\n }\n\n return {changedKeys, map, notifyBus};\n },\n },\n view: () => {\n return {\n update(view) {\n const state = pluginKey.getState(view.state);\n if (!state || !state.changedKeys || !state.changedKeys.size) return;\n\n for (const key of state.changedKeys) {\n const value = state.map.get(key);\n state.notifyBus.emit(key, value);\n }\n },\n };\n },\n};\n"]}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SharedState/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {EventEmitter} from 'src/utils/event-emitter';\n\n/** @internal */\nexport type SharedPluginState = {\n map: Map<string, object>;\n changedKeys: Set<string> | null;\n notifyBus: EventEmitter<{[key: string]: object | undefined}>;\n};\n\n/** @internal */\nexport type TrMeta = {\n actions: SharedStateAction<object>[];\n};\n\n/** @internal */\nexport type SharedStateAction<T extends object> =\n | {\n type: 'set';\n key: string;\n data: T;\n }\n | {\n type: 'update';\n key: string;\n data: Partial<T>;\n }\n | {\n type: 'delete';\n key: string;\n };\n"]}
@@ -0,0 +1,29 @@
1
+ import type { EditorState, Transaction } from "../../../pm/state.js";
2
+ export type SharedStateKeySpec = {
3
+ name?: string;
4
+ };
5
+ export declare class SharedStateKey<T extends object> {
6
+ #private;
7
+ /**
8
+ * Define a new key.
9
+ * If you create two keys with the same name, they will refer to the same value from the state.
10
+ * If name not passed, a unique one will be generated.
11
+ */
12
+ static define<T extends object>(spec?: SharedStateKeySpec): SharedStateKey<T>;
13
+ /** Add metadata to transaction to change data in state */
14
+ readonly appendTransaction: Readonly<{
15
+ /** Set or replace data stored by current key */
16
+ set: (tr: Transaction, data: T) => Transaction;
17
+ /** Update (patch) data stored by current key */
18
+ update: (tr: Transaction, data: Partial<T>) => Transaction;
19
+ /** Delete data stored by current key */
20
+ delete: (tr: Transaction) => Transaction;
21
+ }>;
22
+ private constructor();
23
+ getNotifier(state: EditorState): {
24
+ subscribe(fn: (data: T | undefined) => void): () => void;
25
+ unsubscribe(fn: (data: T | undefined) => void): void;
26
+ };
27
+ getValue(state: EditorState): T | undefined;
28
+ private appendTrMeta;
29
+ }
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SharedStateKey = void 0;
4
+ const lodash_1 = require("../../../lodash.js");
5
+ const plugin_1 = require("./plugin.js");
6
+ class SharedStateKey {
7
+ /**
8
+ * Define a new key.
9
+ * If you create two keys with the same name, they will refer to the same value from the state.
10
+ * If name not passed, a unique one will be generated.
11
+ */
12
+ static define(spec = {}) {
13
+ const key = spec.name ?? (0, lodash_1.uniqueId)('shared_state_key');
14
+ return new this(key);
15
+ }
16
+ #key;
17
+ /** Add metadata to transaction to change data in state */
18
+ appendTransaction = Object.freeze({
19
+ /** Set or replace data stored by current key */
20
+ set: (tr, data) => {
21
+ return this.appendTrMeta(tr, { type: 'set', data });
22
+ },
23
+ /** Update (patch) data stored by current key */
24
+ update: (tr, data) => {
25
+ return this.appendTrMeta(tr, { type: 'update', data });
26
+ },
27
+ /** Delete data stored by current key */
28
+ delete: (tr) => {
29
+ return this.appendTrMeta(tr, { type: 'delete' });
30
+ },
31
+ });
32
+ constructor(key) {
33
+ this.#key = key;
34
+ }
35
+ getNotifier(state) {
36
+ const self = this;
37
+ const notifyBus = plugin_1.pluginKey.getState(state)?.notifyBus;
38
+ return {
39
+ subscribe(fn) {
40
+ notifyBus?.on(self.#key, fn);
41
+ return () => {
42
+ this.unsubscribe(fn);
43
+ };
44
+ },
45
+ unsubscribe(fn) {
46
+ notifyBus?.off(self.#key, fn);
47
+ },
48
+ };
49
+ }
50
+ getValue(state) {
51
+ return plugin_1.pluginKey.getState(state)?.map.get(this.#key);
52
+ }
53
+ appendTrMeta(tr, action) {
54
+ const meta = tr.getMeta(plugin_1.pluginKey) || { actions: [] };
55
+ meta.actions.push({ ...action, key: this.#key });
56
+ return tr.setMeta(plugin_1.pluginKey, meta);
57
+ }
58
+ }
59
+ exports.SharedStateKey = SharedStateKey;
60
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SharedState/utils.ts"],"names":[],"mappings":";;;AACA,+CAAoC;AAEpC,wCAAmC;AAOnC,MAAa,cAAc;IACvB;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAmB,OAA2B,EAAE;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAA,iBAAQ,EAAC,kBAAkB,CAAC,CAAC;QACtD,OAAO,IAAI,IAAI,CAAI,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,CAAS;IAEb,0DAA0D;IACjD,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;QACvC,gDAAgD;QAChD,GAAG,EAAE,CAAC,EAAe,EAAE,IAAO,EAAe,EAAE;YAC3C,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,EAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;QACtD,CAAC;QACD,gDAAgD;QAChD,MAAM,EAAE,CAAC,EAAe,EAAE,IAAgB,EAAe,EAAE;YACvD,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC,CAAC;QACzD,CAAC;QACD,wCAAwC;QACxC,MAAM,EAAE,CAAC,EAAe,EAAe,EAAE;YACrC,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,EAAC,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC;QACnD,CAAC;KACJ,CAAC,CAAC;IAEH,YAAoB,GAAW;QAC3B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;IACpB,CAAC;IAED,WAAW,CAAC,KAAkB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC;QAClB,MAAM,SAAS,GAAG,kBAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;QACvD,OAAO;YACH,SAAS,CAAC,EAAiC;gBACvC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAA4B,CAAC,CAAC;gBACvD,OAAO,GAAG,EAAE;oBACR,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBACzB,CAAC,CAAC;YACN,CAAC;YACD,WAAW,CAAC,EAAiC;gBACzC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAA4B,CAAC,CAAC;YAC5D,CAAC;SACJ,CAAC;IACN,CAAC;IAED,QAAQ,CAAC,KAAkB;QACvB,OAAO,kBAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAkB,CAAC;IAC1E,CAAC;IAEO,YAAY,CAAC,EAAe,EAAE,MAAiB;QACnD,MAAM,IAAI,GAAW,EAAE,CAAC,OAAO,CAAC,kBAAS,CAAC,IAAI,EAAC,OAAO,EAAE,EAAE,EAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAC,GAAG,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAC,CAAC,CAAC;QAC/C,OAAO,EAAE,CAAC,OAAO,CAAC,kBAAS,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;CACJ;AA1DD,wCA0DC","sourcesContent":["import type {EditorState, Transaction} from '#pm/state';\nimport {uniqueId} from 'src/lodash';\n\nimport {pluginKey} from './plugin';\nimport type {TrMeta} from './types';\n\nexport type SharedStateKeySpec = {\n name?: string;\n};\n\nexport class SharedStateKey<T extends object> {\n /**\n * Define a new key.\n * If you create two keys with the same name, they will refer to the same value from the state.\n * If name not passed, a unique one will be generated.\n */\n static define<T extends object>(spec: SharedStateKeySpec = {}) {\n const key = spec.name ?? uniqueId('shared_state_key');\n return new this<T>(key);\n }\n\n #key: string;\n\n /** Add metadata to transaction to change data in state */\n readonly appendTransaction = Object.freeze({\n /** Set or replace data stored by current key */\n set: (tr: Transaction, data: T): Transaction => {\n return this.appendTrMeta(tr, {type: 'set', data});\n },\n /** Update (patch) data stored by current key */\n update: (tr: Transaction, data: Partial<T>): Transaction => {\n return this.appendTrMeta(tr, {type: 'update', data});\n },\n /** Delete data stored by current key */\n delete: (tr: Transaction): Transaction => {\n return this.appendTrMeta(tr, {type: 'delete'});\n },\n });\n\n private constructor(key: string) {\n this.#key = key;\n }\n\n getNotifier(state: EditorState) {\n const self = this;\n const notifyBus = pluginKey.getState(state)?.notifyBus;\n return {\n subscribe(fn: (data: T | undefined) => void) {\n notifyBus?.on(self.#key, fn as (arg: unknown) => void);\n return () => {\n this.unsubscribe(fn);\n };\n },\n unsubscribe(fn: (data: T | undefined) => void) {\n notifyBus?.off(self.#key, fn as (arg: unknown) => void);\n },\n };\n }\n\n getValue(state: EditorState): T | undefined {\n return pluginKey.getState(state)?.map.get(this.#key) as T | undefined;\n }\n\n private appendTrMeta(tr: Transaction, action: Action<T>) {\n const meta: TrMeta = tr.getMeta(pluginKey) || {actions: []};\n meta.actions.push({...action, key: this.#key});\n return tr.setMeta(pluginKey, meta);\n }\n}\n\n/** @internal */\ntype Action<T extends object> =\n | {\n type: 'set';\n data: T;\n }\n | {\n type: 'update';\n data: Partial<T>;\n }\n | {\n type: 'delete';\n };\n"]}
@@ -6,6 +6,7 @@ import { type CursorOptions } from "./Cursor/index.js";
6
6
  import { type HistoryOptions } from "./History/index.js";
7
7
  import { type ReactRenderer } from "./ReactRenderer/index.js";
8
8
  import { type SelectionContextOptions } from "./SelectionContext/index.js";
9
+ export * from "./Autocomplete/index.js";
9
10
  export * from "./ClicksOnEdges/index.js";
10
11
  export * from "./Clipboard/index.js";
11
12
  export * from "./CommandMenu/index.js";
@@ -16,6 +17,7 @@ export * from "./Placeholder/index.js";
16
17
  export * from "./ReactRenderer/index.js";
17
18
  export * from "./Selection/index.js";
18
19
  export * from "./SelectionContext/index.js";
20
+ export * from "./SharedState/index.js";
19
21
  export * from "./WidgetDecoration/index.js";
20
22
  export type BehaviorPresetOptions = {
21
23
  cursor?: CursorOptions;
@@ -12,7 +12,9 @@ const Placeholder_1 = require("./Placeholder/index.js");
12
12
  const ReactRenderer_1 = require("./ReactRenderer/index.js");
13
13
  const Selection_1 = require("./Selection/index.js");
14
14
  const SelectionContext_1 = require("./SelectionContext/index.js");
15
+ const SharedState_1 = require("./SharedState/index.js");
15
16
  const WidgetDecoration_1 = require("./WidgetDecoration/index.js");
17
+ tslib_1.__exportStar(require("./Autocomplete/index.js"), exports);
16
18
  tslib_1.__exportStar(require("./ClicksOnEdges/index.js"), exports);
17
19
  tslib_1.__exportStar(require("./Clipboard/index.js"), exports);
18
20
  tslib_1.__exportStar(require("./CommandMenu/index.js"), exports);
@@ -23,10 +25,12 @@ tslib_1.__exportStar(require("./Placeholder/index.js"), exports);
23
25
  tslib_1.__exportStar(require("./ReactRenderer/index.js"), exports);
24
26
  tslib_1.__exportStar(require("./Selection/index.js"), exports);
25
27
  tslib_1.__exportStar(require("./SelectionContext/index.js"), exports);
28
+ tslib_1.__exportStar(require("./SharedState/index.js"), exports);
26
29
  tslib_1.__exportStar(require("./WidgetDecoration/index.js"), exports);
27
30
  const BehaviorPreset = (builder, opts) => {
28
31
  builder
29
32
  .use(Selection_1.Selection)
33
+ .use(SharedState_1.SharedState)
30
34
  .use(Placeholder_1.Placeholder, opts.placeholder ?? {})
31
35
  .use(Cursor_1.Cursor, opts.cursor ?? {})
32
36
  .use(History_1.History, opts.history ?? {})
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["extensions/behavior/index.ts"],"names":[],"mappings":";;;;AAGA,4DAA8C;AAC9C,oDAA6D;AAC7D,wDAAmE;AACnE,8CAAoD;AACpD,oDAAsC;AACtC,gDAAuD;AACvD,wDAA0C;AAC1C,4DAA2E;AAC3E,oDAAsC;AACtC,kEAAkF;AAClF,kEAAoD;AAEpD,mEAAgC;AAChC,+DAA4B;AAC5B,iEAA8B;AAC9B,4DAAyB;AACzB,+DAA4B;AAC5B,6DAA0B;AAC1B,iEAA8B;AAC9B,mEAAgC;AAChC,+DAA4B;AAC5B,sEAAmC;AACnC,sEAAmC;AAa5B,MAAM,cAAc,GAAyC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAClF,OAAO;SACF,GAAG,CAAC,qBAAS,CAAC;SACd,GAAG,CAAC,yBAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;SACxC,GAAG,CAAC,eAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;SAC9B,GAAG,CAAC,iBAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SAChC,GAAG,CAAC,qBAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;SACpC,GAAG,CAAC,sCAAsB,EAAE,IAAI,CAAC,aAAa,CAAC;SAC/C,GAAG,CAAC,mCAAgB,CAAC;SACrB,GAAG,CAAC,mCAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAExD,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,CAAC,GAAG,CAAC,yBAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,qBAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,6BAAa,CAAC,CAAC;AAC/B,CAAC,CAAC;AAdW,QAAA,cAAc,kBAczB","sourcesContent":["import type {ExtensionAuto} from '../../core';\nimport type {PlaceholderOptions} from '../../utils/placeholder';\n\nimport {ClicksOnEdges} from './ClicksOnEdges';\nimport {Clipboard, type ClipboardOptions} from './Clipboard';\nimport {CommandMenu, type CommandMenuOptions} from './CommandMenu';\nimport {Cursor, type CursorOptions} from './Cursor';\nimport {FilePaste} from './FilePaste';\nimport {History, type HistoryOptions} from './History';\nimport {Placeholder} from './Placeholder';\nimport {type ReactRenderer, ReactRendererExtension} from './ReactRenderer';\nimport {Selection} from './Selection';\nimport {SelectionContext, type SelectionContextOptions} from './SelectionContext';\nimport {WidgetDecoration} from './WidgetDecoration';\n\nexport * from './ClicksOnEdges';\nexport * from './Clipboard';\nexport * from './CommandMenu';\nexport * from './Cursor';\nexport * from './FilePaste';\nexport * from './History';\nexport * from './Placeholder';\nexport * from './ReactRenderer';\nexport * from './Selection';\nexport * from './SelectionContext';\nexport * from './WidgetDecoration';\n\nexport type BehaviorPresetOptions = {\n cursor?: CursorOptions;\n history?: HistoryOptions;\n clipboard?: ClipboardOptions;\n placeholder?: PlaceholderOptions;\n reactRenderer: ReactRenderer;\n selectionContext?: SelectionContextOptions;\n\n commandMenu?: CommandMenuOptions;\n};\n\nexport const BehaviorPreset: ExtensionAuto<BehaviorPresetOptions> = (builder, opts) => {\n builder\n .use(Selection)\n .use(Placeholder, opts.placeholder ?? {})\n .use(Cursor, opts.cursor ?? {})\n .use(History, opts.history ?? {})\n .use(Clipboard, opts.clipboard ?? {})\n .use(ReactRendererExtension, opts.reactRenderer)\n .use(WidgetDecoration)\n .use(SelectionContext, opts.selectionContext ?? {});\n\n if (opts.commandMenu) builder.use(CommandMenu, opts.commandMenu);\n builder.use(FilePaste);\n builder.use(ClicksOnEdges);\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../src","sources":["extensions/behavior/index.ts"],"names":[],"mappings":";;;;AAGA,4DAA8C;AAC9C,oDAA6D;AAC7D,wDAAmE;AACnE,8CAAoD;AACpD,oDAAsC;AACtC,gDAAuD;AACvD,wDAA0C;AAC1C,4DAA2E;AAC3E,oDAAsC;AACtC,kEAAkF;AAClF,wDAA0C;AAC1C,kEAAoD;AAEpD,kEAA+B;AAC/B,mEAAgC;AAChC,+DAA4B;AAC5B,iEAA8B;AAC9B,4DAAyB;AACzB,+DAA4B;AAC5B,6DAA0B;AAC1B,iEAA8B;AAC9B,mEAAgC;AAChC,+DAA4B;AAC5B,sEAAmC;AACnC,iEAA8B;AAC9B,sEAAmC;AAa5B,MAAM,cAAc,GAAyC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAClF,OAAO;SACF,GAAG,CAAC,qBAAS,CAAC;SACd,GAAG,CAAC,yBAAW,CAAC;SAChB,GAAG,CAAC,yBAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;SACxC,GAAG,CAAC,eAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;SAC9B,GAAG,CAAC,iBAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SAChC,GAAG,CAAC,qBAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;SACpC,GAAG,CAAC,sCAAsB,EAAE,IAAI,CAAC,aAAa,CAAC;SAC/C,GAAG,CAAC,mCAAgB,CAAC;SACrB,GAAG,CAAC,mCAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAExD,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,CAAC,GAAG,CAAC,yBAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,qBAAS,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAC,6BAAa,CAAC,CAAC;AAC/B,CAAC,CAAC;AAfW,QAAA,cAAc,kBAezB","sourcesContent":["import type {ExtensionAuto} from '../../core';\nimport type {PlaceholderOptions} from '../../utils/placeholder';\n\nimport {ClicksOnEdges} from './ClicksOnEdges';\nimport {Clipboard, type ClipboardOptions} from './Clipboard';\nimport {CommandMenu, type CommandMenuOptions} from './CommandMenu';\nimport {Cursor, type CursorOptions} from './Cursor';\nimport {FilePaste} from './FilePaste';\nimport {History, type HistoryOptions} from './History';\nimport {Placeholder} from './Placeholder';\nimport {type ReactRenderer, ReactRendererExtension} from './ReactRenderer';\nimport {Selection} from './Selection';\nimport {SelectionContext, type SelectionContextOptions} from './SelectionContext';\nimport {SharedState} from './SharedState';\nimport {WidgetDecoration} from './WidgetDecoration';\n\nexport * from './Autocomplete';\nexport * from './ClicksOnEdges';\nexport * from './Clipboard';\nexport * from './CommandMenu';\nexport * from './Cursor';\nexport * from './FilePaste';\nexport * from './History';\nexport * from './Placeholder';\nexport * from './ReactRenderer';\nexport * from './Selection';\nexport * from './SelectionContext';\nexport * from './SharedState';\nexport * from './WidgetDecoration';\n\nexport type BehaviorPresetOptions = {\n cursor?: CursorOptions;\n history?: HistoryOptions;\n clipboard?: ClipboardOptions;\n placeholder?: PlaceholderOptions;\n reactRenderer: ReactRenderer;\n selectionContext?: SelectionContextOptions;\n\n commandMenu?: CommandMenuOptions;\n};\n\nexport const BehaviorPreset: ExtensionAuto<BehaviorPresetOptions> = (builder, opts) => {\n builder\n .use(Selection)\n .use(SharedState)\n .use(Placeholder, opts.placeholder ?? {})\n .use(Cursor, opts.cursor ?? {})\n .use(History, opts.history ?? {})\n .use(Clipboard, opts.clipboard ?? {})\n .use(ReactRendererExtension, opts.reactRenderer)\n .use(WidgetDecoration)\n .use(SelectionContext, opts.selectionContext ?? {});\n\n if (opts.commandMenu) builder.use(CommandMenu, opts.commandMenu);\n builder.use(FilePaste);\n builder.use(ClicksOnEdges);\n};\n"]}
@@ -14,41 +14,53 @@ const CodeBlockHighlight = (builder, opts) => {
14
14
  let langs;
15
15
  let lowlight;
16
16
  let hljs;
17
- try {
18
- hljs = require('highlight.js/lib/core');
19
- const low = require('lowlight');
20
- const all = low.all;
21
- const create = low.createLowlight;
22
- langs = { ...all, ...opts.langs };
23
- lowlight = create(langs);
24
- }
25
- catch (e) {
26
- logger_1.globalLogger.info('Skip code_block highlighting');
27
- builder.logger.log('Skip code_block highlighting');
28
- return;
29
- }
17
+ const loadModules = async () => {
18
+ try {
19
+ hljs = (await import('highlight.js/lib/core')).default;
20
+ const low = await import('lowlight');
21
+ const all = low.all;
22
+ const create = low.createLowlight;
23
+ langs = { ...all, ...opts.langs };
24
+ lowlight = create(langs);
25
+ return true;
26
+ }
27
+ catch (e) {
28
+ logger_1.globalLogger.info('Skip code_block highlighting');
29
+ builder.logger.log('Skip code_block highlighting');
30
+ return false;
31
+ }
32
+ };
30
33
  builder.addPlugin(() => {
34
+ let modulesLoaded = false;
31
35
  const selectItems = [];
32
36
  const mapping = {};
33
- for (const lang of Object.keys(langs)) {
34
- const defs = langs[lang](hljs);
35
- selectItems.push({
36
- value: lang,
37
- content: defs.name || (0, lodash_1.capitalize)(lang),
38
- });
39
- if (defs.aliases) {
40
- for (const alias of defs.aliases) {
41
- mapping[alias] = lang;
42
- }
43
- }
44
- }
45
37
  // TODO: add TAB key handler
46
38
  // TODO: Remove constant selection of block
47
39
  return new prosemirror_state_1.Plugin({
48
40
  key,
49
41
  state: {
50
- init: (_, state) => getDecorations(state.doc),
42
+ init: (_, state) => {
43
+ loadModules().then(() => {
44
+ modulesLoaded = true;
45
+ for (const lang of Object.keys(langs)) {
46
+ const defs = langs[lang](hljs);
47
+ selectItems.push({
48
+ value: lang,
49
+ content: defs.name || (0, lodash_1.capitalize)(lang),
50
+ });
51
+ if (defs.aliases) {
52
+ for (const alias of defs.aliases) {
53
+ mapping[alias] = lang;
54
+ }
55
+ }
56
+ }
57
+ });
58
+ return getDecorations(state.doc);
59
+ },
51
60
  apply: (tr, decos, oldState, newState) => {
61
+ if (!modulesLoaded) {
62
+ return prosemirror_view_1.DecorationSet.empty;
63
+ }
52
64
  if (tr.docChanged) {
53
65
  const oldNodeName = oldState.selection.$head.parent.type.name;
54
66
  const newNodeName = newState.selection.$head.parent.type.name;
@@ -123,6 +135,9 @@ const CodeBlockHighlight = (builder, opts) => {
123
135
  });
124
136
  function getDecorations(doc) {
125
137
  const decos = [];
138
+ if (!lowlight) {
139
+ return prosemirror_view_1.DecorationSet.empty;
140
+ }
126
141
  for (const { node, pos } of (0, prosemirror_utils_1.findChildrenByType)(doc, (0, CodeBlockSpecs_1.codeBlockType)(doc.type.schema), true)) {
127
142
  let from = pos + 1;
128
143
  let nodes;
@@ -1 +1 @@
1
- {"version":3,"file":"CodeBlockHighlight.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Options} from '@diplodoc/transform';\n// importing only type, because lowlight and highlight.js is optional deps\nimport type HLJS from 'highlight.js/lib/core';\nimport type {createLowlight} from 'lowlight' with {'resolution-mode': 'import'};\nimport type {Node} from 'prosemirror-model';\nimport {Plugin, PluginKey} from 'prosemirror-state';\nimport type {Step} from 'prosemirror-transform';\n// @ts-ignore // TODO: fix cjs build\nimport {findChildrenByType} from 'prosemirror-utils';\nimport {Decoration, DecorationSet} from 'prosemirror-view';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {capitalize} from '../../../../lodash';\nimport {globalLogger} from '../../../../logger';\nimport {CodeBlockNodeAttr, codeBlockNodeName, codeBlockType} from '../CodeBlockSpecs';\n\nimport {codeLangSelectTooltipViewCreator} from './TooltipPlugin';\n\nexport type HighlightLangMap = Options['highlightLangs'];\n\ntype Lowlight = ReturnType<typeof createLowlight>;\ntype Root = ReturnType<Lowlight['highlight']>;\n\ntype LangSelectItem = {\n value: string;\n content: string;\n};\n\nconst key = new PluginKey<DecorationSet>('code_block_highlight');\n\nexport type CodeBlockHighlightOptions = {\n langs?: HighlightLangMap;\n};\n\nexport const CodeBlockHighlight: ExtensionAuto<CodeBlockHighlightOptions> = (builder, opts) => {\n let langs: NonNullable<HighlightLangMap>;\n let lowlight: Lowlight;\n let hljs: typeof HLJS;\n\n try {\n hljs = require('highlight.js/lib/core');\n const low = require('lowlight');\n const all: HighlightLangMap = low.all;\n const create: typeof createLowlight = low.createLowlight;\n langs = {...all, ...opts.langs};\n lowlight = create(langs);\n } catch (e) {\n globalLogger.info('Skip code_block highlighting');\n builder.logger.log('Skip code_block highlighting');\n return;\n }\n\n builder.addPlugin(() => {\n const selectItems: LangSelectItem[] = [];\n const mapping: Record<string, string> = {};\n for (const lang of Object.keys(langs)) {\n const defs = langs[lang](hljs);\n selectItems.push({\n value: lang,\n content: defs.name || capitalize(lang),\n });\n if (defs.aliases) {\n for (const alias of defs.aliases) {\n mapping[alias] = lang;\n }\n }\n }\n\n // TODO: add TAB key handler\n // TODO: Remove constant selection of block\n return new Plugin<DecorationSet>({\n key,\n state: {\n init: (_, state) => getDecorations(state.doc),\n apply: (tr, decos, oldState, newState) => {\n if (tr.docChanged) {\n const oldNodeName = oldState.selection.$head.parent.type.name;\n const newNodeName = newState.selection.$head.parent.type.name;\n\n // Apply decorations if:\n if (\n oldNodeName === codeBlockNodeName ||\n newNodeName === codeBlockNodeName\n ) {\n // selection includes codeblock node,\n return getDecorations(tr.doc);\n } else {\n const oldNodes = findChildrenByType(\n oldState.doc,\n codeBlockType(oldState.schema),\n );\n const newNodes = findChildrenByType(\n newState.doc,\n codeBlockType(newState.schema),\n );\n if (\n // OR transaction adds/removes codeblock nodes,\n newNodes.length !== oldNodes.length ||\n // OR transaction has changes that completely encapsulate a node\n // (for example, a transaction that affects the entire document).\n // Such transactions can happen during collab syncing via y-prosemirror, for example.\n tr.steps.some((step) => {\n return (\n stepHasFromTo(step) &&\n oldNodes.some(\n (node: {node: Node; pos: number}) =>\n node.pos >= step.from &&\n node.pos + node.node.nodeSize <= step.to,\n )\n );\n })\n ) {\n return getDecorations(tr.doc);\n }\n }\n }\n return decos.map(tr.mapping, tr.doc);\n },\n },\n view: (view) => codeLangSelectTooltipViewCreator(view, selectItems, mapping),\n props: {\n decorations: (state) => {\n return key.getState(state);\n },\n nodeViews: {\n [codeBlockNodeName]: (node) => {\n let prevLang = node.attrs[CodeBlockNodeAttr.Lang];\n\n const dom = document.createElement('pre');\n\n const contentDOM = document.createElement('code');\n contentDOM.classList.add('hljs');\n\n if (prevLang) {\n dom.setAttribute(CodeBlockNodeAttr.Lang, prevLang);\n contentDOM.classList.add(prevLang);\n }\n\n dom.append(contentDOM);\n\n return {\n dom,\n contentDOM,\n update(newNode) {\n if (node.type !== newNode.type) return false;\n\n const newLang = newNode.attrs[CodeBlockNodeAttr.Lang];\n if (prevLang !== newLang) {\n contentDOM.className = 'hljs';\n if (newLang) {\n dom.setAttribute(CodeBlockNodeAttr.Lang, newLang);\n contentDOM.classList.add(newLang);\n } else {\n dom.removeAttribute(CodeBlockNodeAttr.Lang);\n }\n prevLang = newLang;\n }\n\n return true;\n },\n };\n },\n },\n },\n });\n });\n\n function getDecorations(doc: Node) {\n const decos: Decoration[] = [];\n\n for (const {node, pos} of findChildrenByType(doc, codeBlockType(doc.type.schema), true)) {\n let from = pos + 1;\n let nodes: Root['children'];\n\n const lang: string | undefined = node.attrs[CodeBlockNodeAttr.Lang];\n if (lang && lowlight.registered(lang)) {\n nodes = lowlight.highlight(lang, node.textContent).children;\n } else {\n continue;\n }\n\n for (const {text, classes} of parseNodes(nodes)) {\n const to = from + text.length;\n if (classes.length) {\n decos.push(\n Decoration.inline(from, to, {\n class: classes.join(' '),\n }),\n );\n }\n from = to;\n }\n }\n\n return DecorationSet.create(doc, decos);\n }\n};\n\nfunction parseNodes(\n nodes: Root['children'],\n className: readonly string[] = [],\n): {text: string; classes: readonly string[]}[] {\n return nodes\n .map((node) => {\n let classes = className;\n if (node.type === 'element') {\n classes = classes.concat((node.properties.className as string[]) ?? []);\n return parseNodes(node.children, classes);\n }\n\n return {\n text: node.type === 'comment' || node.type === 'text' ? node.value : '',\n classes,\n };\n })\n .flat();\n}\n\nfunction stepHasFromTo(step: Step): step is Step & {from: number; to: number} {\n // @ts-expect-error\n return typeof step.from === 'number' && typeof step.to === 'number';\n}\n"]}
1
+ {"version":3,"file":"CodeBlockHighlight.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Options} from '@diplodoc/transform';\n// importing only type, because lowlight and highlight.js is optional deps\nimport type HLJS from 'highlight.js/lib/core';\nimport type {createLowlight} from 'lowlight' with {'resolution-mode': 'import'};\nimport type {Node} from 'prosemirror-model';\nimport {Plugin, PluginKey} from 'prosemirror-state';\nimport type {Step} from 'prosemirror-transform';\n// @ts-ignore // TODO: fix cjs build\nimport {findChildrenByType} from 'prosemirror-utils';\nimport {Decoration, DecorationSet} from 'prosemirror-view';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {capitalize} from '../../../../lodash';\nimport {globalLogger} from '../../../../logger';\nimport {CodeBlockNodeAttr, codeBlockNodeName, codeBlockType} from '../CodeBlockSpecs';\n\nimport {codeLangSelectTooltipViewCreator} from './TooltipPlugin';\n\nexport type HighlightLangMap = Options['highlightLangs'];\n\ntype Lowlight = ReturnType<typeof createLowlight>;\ntype Root = ReturnType<Lowlight['highlight']>;\n\ntype LangSelectItem = {\n value: string;\n content: string;\n};\n\nconst key = new PluginKey<DecorationSet>('code_block_highlight');\n\nexport type CodeBlockHighlightOptions = {\n langs?: HighlightLangMap;\n};\n\nexport const CodeBlockHighlight: ExtensionAuto<CodeBlockHighlightOptions> = (builder, opts) => {\n let langs: NonNullable<HighlightLangMap>;\n let lowlight: Lowlight;\n let hljs: typeof HLJS;\n\n const loadModules = async () => {\n try {\n hljs = (await import('highlight.js/lib/core')).default;\n const low = await import('lowlight');\n\n const all: HighlightLangMap = low.all;\n const create: typeof createLowlight = low.createLowlight;\n langs = {...all, ...opts.langs};\n lowlight = create(langs);\n return true;\n } catch (e) {\n globalLogger.info('Skip code_block highlighting');\n builder.logger.log('Skip code_block highlighting');\n return false;\n }\n };\n\n builder.addPlugin(() => {\n let modulesLoaded = false;\n\n const selectItems: LangSelectItem[] = [];\n const mapping: Record<string, string> = {};\n\n // TODO: add TAB key handler\n // TODO: Remove constant selection of block\n return new Plugin<DecorationSet>({\n key,\n state: {\n init: (_, state) => {\n loadModules().then(() => {\n modulesLoaded = true;\n\n for (const lang of Object.keys(langs)) {\n const defs = langs[lang](hljs);\n selectItems.push({\n value: lang,\n content: defs.name || capitalize(lang),\n });\n if (defs.aliases) {\n for (const alias of defs.aliases) {\n mapping[alias] = lang;\n }\n }\n }\n });\n return getDecorations(state.doc);\n },\n apply: (tr, decos, oldState, newState) => {\n if (!modulesLoaded) {\n return DecorationSet.empty;\n }\n\n if (tr.docChanged) {\n const oldNodeName = oldState.selection.$head.parent.type.name;\n const newNodeName = newState.selection.$head.parent.type.name;\n\n // Apply decorations if:\n if (\n oldNodeName === codeBlockNodeName ||\n newNodeName === codeBlockNodeName\n ) {\n // selection includes codeblock node,\n return getDecorations(tr.doc);\n } else {\n const oldNodes = findChildrenByType(\n oldState.doc,\n codeBlockType(oldState.schema),\n );\n const newNodes = findChildrenByType(\n newState.doc,\n codeBlockType(newState.schema),\n );\n if (\n // OR transaction adds/removes codeblock nodes,\n newNodes.length !== oldNodes.length ||\n // OR transaction has changes that completely encapsulate a node\n // (for example, a transaction that affects the entire document).\n // Such transactions can happen during collab syncing via y-prosemirror, for example.\n tr.steps.some((step) => {\n return (\n stepHasFromTo(step) &&\n oldNodes.some(\n (node: {node: Node; pos: number}) =>\n node.pos >= step.from &&\n node.pos + node.node.nodeSize <= step.to,\n )\n );\n })\n ) {\n return getDecorations(tr.doc);\n }\n }\n }\n return decos.map(tr.mapping, tr.doc);\n },\n },\n view: (view) => codeLangSelectTooltipViewCreator(view, selectItems, mapping),\n props: {\n decorations: (state) => {\n return key.getState(state);\n },\n nodeViews: {\n [codeBlockNodeName]: (node) => {\n let prevLang = node.attrs[CodeBlockNodeAttr.Lang];\n\n const dom = document.createElement('pre');\n\n const contentDOM = document.createElement('code');\n contentDOM.classList.add('hljs');\n\n if (prevLang) {\n dom.setAttribute(CodeBlockNodeAttr.Lang, prevLang);\n contentDOM.classList.add(prevLang);\n }\n\n dom.append(contentDOM);\n\n return {\n dom,\n contentDOM,\n update(newNode) {\n if (node.type !== newNode.type) return false;\n\n const newLang = newNode.attrs[CodeBlockNodeAttr.Lang];\n if (prevLang !== newLang) {\n contentDOM.className = 'hljs';\n if (newLang) {\n dom.setAttribute(CodeBlockNodeAttr.Lang, newLang);\n contentDOM.classList.add(newLang);\n } else {\n dom.removeAttribute(CodeBlockNodeAttr.Lang);\n }\n prevLang = newLang;\n }\n\n return true;\n },\n };\n },\n },\n },\n });\n });\n\n function getDecorations(doc: Node) {\n const decos: Decoration[] = [];\n\n if (!lowlight) {\n return DecorationSet.empty;\n }\n\n for (const {node, pos} of findChildrenByType(doc, codeBlockType(doc.type.schema), true)) {\n let from = pos + 1;\n let nodes: Root['children'];\n\n const lang: string | undefined = node.attrs[CodeBlockNodeAttr.Lang];\n if (lang && lowlight.registered(lang)) {\n nodes = lowlight.highlight(lang, node.textContent).children;\n } else {\n continue;\n }\n\n for (const {text, classes} of parseNodes(nodes)) {\n const to = from + text.length;\n if (classes.length) {\n decos.push(\n Decoration.inline(from, to, {\n class: classes.join(' '),\n }),\n );\n }\n from = to;\n }\n }\n\n return DecorationSet.create(doc, decos);\n }\n};\n\nfunction parseNodes(\n nodes: Root['children'],\n className: readonly string[] = [],\n): {text: string; classes: readonly string[]}[] {\n return nodes\n .map((node) => {\n let classes = className;\n if (node.type === 'element') {\n classes = classes.concat((node.properties.className as string[]) ?? []);\n return parseNodes(node.children, classes);\n }\n\n return {\n text: node.type === 'comment' || node.type === 'text' ? node.value : '',\n classes,\n };\n })\n .flat();\n}\n\nfunction stepHasFromTo(step: Step): step is Step & {from: number; to: number} {\n // @ts-expect-error\n return typeof step.from === 'number' && typeof step.to === 'number';\n}\n"]}
@@ -8,7 +8,6 @@ export declare class EmojiHandler implements AutocompleteHandler {
8
8
  private _emojiCarousel?;
9
9
  private _view?;
10
10
  private _anchor;
11
- private _range?;
12
11
  private _popupCloser?;
13
12
  private _suggestProps?;
14
13
  private _suggestRenderItem?;
@@ -14,7 +14,6 @@ class EmojiHandler {
14
14
  _emojiCarousel;
15
15
  _view;
16
16
  _anchor = null;
17
- _range;
18
17
  _popupCloser;
19
18
  _suggestProps;
20
19
  _suggestRenderItem;
@@ -92,12 +91,16 @@ class EmojiHandler {
92
91
  });
93
92
  }
94
93
  select() {
95
- const { _view: view, _range: range } = this;
96
- if (!view || !range)
94
+ const { _view: view } = this;
95
+ if (!view)
97
96
  return;
98
97
  const emojiDef = this._emojiCarousel?.currentItem;
99
98
  if (!emojiDef)
100
99
  return;
100
+ const autocompleteState = (0, Autocomplete_1.getAutocompleteState)(view.state);
101
+ if (!autocompleteState || !autocompleteState.active)
102
+ return;
103
+ const { range } = autocompleteState;
101
104
  const { tr, schema } = view.state;
102
105
  view.dispatch(tr.replaceWith(range.from, range.to, createEmoji(schema, emojiDef)).scrollIntoView());
103
106
  view.focus();
@@ -139,13 +142,11 @@ class EmojiHandler {
139
142
  }
140
143
  this._view?.focus();
141
144
  };
142
- updateState({ view, range }) {
145
+ updateState({ view }) {
143
146
  this._view = view;
144
- this._range = range;
145
147
  }
146
148
  clear() {
147
149
  this._view = undefined;
148
- this._range = undefined;
149
150
  this._anchor = null;
150
151
  this._emojiCarousel = undefined;
151
152
  this._popupCloser?.cancelTimer();