@gravity-ui/markdown-editor 15.3.1 → 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 (181) hide show
  1. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +7 -3
  2. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
  3. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
  4. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +19 -2
  5. package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
  6. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.d.ts +3 -0
  7. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.js +7 -1
  8. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.js.map +1 -1
  9. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.d.ts +1 -1
  10. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.js +8 -2
  11. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.js.map +1 -1
  12. package/build/cjs/extensions/additional/Mermaid/actions.js +12 -5
  13. package/build/cjs/extensions/additional/Mermaid/actions.js.map +1 -1
  14. package/build/cjs/extensions/additional/Mermaid/types.d.ts +3 -0
  15. package/build/cjs/extensions/additional/Mermaid/types.js +3 -0
  16. package/build/cjs/extensions/additional/Mermaid/types.js.map +1 -0
  17. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.d.ts +1 -0
  18. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js +14 -5
  19. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js.map +1 -1
  20. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +13 -12
  21. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  22. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.d.ts +3 -0
  23. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js +7 -1
  24. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js.map +1 -1
  25. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.d.ts +1 -1
  26. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js +8 -2
  27. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js.map +1 -1
  28. package/build/cjs/extensions/additional/YfmHtmlBlock/actions.js +9 -2
  29. package/build/cjs/extensions/additional/YfmHtmlBlock/actions.js.map +1 -1
  30. package/build/cjs/extensions/additional/YfmHtmlBlock/types.d.ts +3 -0
  31. package/build/cjs/extensions/additional/YfmHtmlBlock/types.js +3 -0
  32. package/build/cjs/extensions/additional/YfmHtmlBlock/types.js.map +1 -0
  33. package/build/cjs/extensions/behavior/Autocomplete/index.d.ts +1 -0
  34. package/build/cjs/extensions/behavior/Autocomplete/index.js +5 -3
  35. package/build/cjs/extensions/behavior/Autocomplete/index.js.map +1 -1
  36. package/build/cjs/extensions/behavior/Autocomplete/types.d.ts +1 -1
  37. package/build/cjs/extensions/behavior/Autocomplete/types.js.map +1 -1
  38. package/build/cjs/extensions/behavior/Autocomplete/utils.d.ts +3 -0
  39. package/build/cjs/extensions/behavior/Autocomplete/utils.js +8 -0
  40. package/build/cjs/extensions/behavior/Autocomplete/utils.js.map +1 -0
  41. package/build/cjs/extensions/behavior/Clipboard/code.d.ts +7 -1
  42. package/build/cjs/extensions/behavior/Clipboard/code.js +60 -0
  43. package/build/cjs/extensions/behavior/Clipboard/code.js.map +1 -1
  44. package/build/cjs/extensions/behavior/Clipboard/index.js +2 -0
  45. package/build/cjs/extensions/behavior/Clipboard/index.js.map +1 -1
  46. package/build/cjs/extensions/behavior/CommandMenu/handler.js +6 -6
  47. package/build/cjs/extensions/behavior/CommandMenu/handler.js.map +1 -1
  48. package/build/cjs/extensions/behavior/SharedState/SharedState.d.ts +7 -0
  49. package/build/cjs/extensions/behavior/SharedState/SharedState.js +16 -0
  50. package/build/cjs/extensions/behavior/SharedState/SharedState.js.map +1 -0
  51. package/build/cjs/extensions/behavior/SharedState/index.d.ts +1 -0
  52. package/build/cjs/extensions/behavior/SharedState/index.js +5 -0
  53. package/build/cjs/extensions/behavior/SharedState/index.js.map +1 -0
  54. package/build/cjs/extensions/behavior/SharedState/plugin.d.ts +3 -0
  55. package/build/cjs/extensions/behavior/SharedState/plugin.js +62 -0
  56. package/build/cjs/extensions/behavior/SharedState/plugin.js.map +1 -0
  57. package/build/cjs/extensions/behavior/SharedState/types.d.ts +1 -0
  58. package/build/cjs/extensions/behavior/SharedState/types.js +3 -0
  59. package/build/cjs/extensions/behavior/SharedState/types.js.map +1 -0
  60. package/build/cjs/extensions/behavior/SharedState/utils.d.ts +29 -0
  61. package/build/cjs/extensions/behavior/SharedState/utils.js +60 -0
  62. package/build/cjs/extensions/behavior/SharedState/utils.js.map +1 -0
  63. package/build/cjs/extensions/behavior/index.d.ts +2 -0
  64. package/build/cjs/extensions/behavior/index.js +4 -0
  65. package/build/cjs/extensions/behavior/index.js.map +1 -1
  66. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.d.ts +0 -1
  67. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +7 -6
  68. package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
  69. package/build/cjs/react-utils/index.d.ts +1 -0
  70. package/build/cjs/react-utils/index.js +1 -0
  71. package/build/cjs/react-utils/index.js.map +1 -1
  72. package/build/cjs/react-utils/useSharedEditingState.d.ts +5 -0
  73. package/build/cjs/react-utils/useSharedEditingState.js +25 -0
  74. package/build/cjs/react-utils/useSharedEditingState.js.map +1 -0
  75. package/build/cjs/utils/descedants.d.ts +8 -0
  76. package/build/cjs/utils/descedants.js +15 -0
  77. package/build/cjs/utils/descedants.js.map +1 -0
  78. package/build/cjs/utils/entity-id.d.ts +11 -0
  79. package/build/cjs/utils/entity-id.js +21 -0
  80. package/build/cjs/utils/entity-id.js.map +1 -0
  81. package/build/cjs/utils/index.d.ts +2 -0
  82. package/build/cjs/utils/index.js +2 -0
  83. package/build/cjs/utils/index.js.map +1 -1
  84. package/build/cjs/version.js +1 -1
  85. package/build/cjs/version.js.map +1 -1
  86. package/build/cjs/view/hocs/withYfmHtml/index.d.ts +2 -0
  87. package/build/cjs/view/hocs/withYfmHtml/index.js +2 -2
  88. package/build/cjs/view/hocs/withYfmHtml/index.js.map +1 -1
  89. package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js +3 -1
  90. package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js.map +1 -1
  91. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +8 -4
  92. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
  93. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
  94. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +18 -1
  95. package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
  96. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.d.ts +3 -0
  97. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.js +6 -0
  98. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.js.map +1 -1
  99. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.d.ts +2 -2
  100. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.js +8 -3
  101. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.js.map +1 -1
  102. package/build/esm/extensions/additional/Mermaid/actions.js +12 -5
  103. package/build/esm/extensions/additional/Mermaid/actions.js.map +1 -1
  104. package/build/esm/extensions/additional/Mermaid/types.d.ts +3 -0
  105. package/build/esm/extensions/additional/Mermaid/types.js +2 -0
  106. package/build/esm/extensions/additional/Mermaid/types.js.map +1 -0
  107. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.d.ts +1 -0
  108. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js +14 -5
  109. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js.map +1 -1
  110. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +13 -11
  111. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  112. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.d.ts +3 -0
  113. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js +6 -0
  114. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js.map +1 -1
  115. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.d.ts +2 -2
  116. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js +8 -3
  117. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js.map +1 -1
  118. package/build/esm/extensions/additional/YfmHtmlBlock/actions.js +9 -2
  119. package/build/esm/extensions/additional/YfmHtmlBlock/actions.js.map +1 -1
  120. package/build/esm/extensions/additional/YfmHtmlBlock/types.d.ts +3 -0
  121. package/build/esm/extensions/additional/YfmHtmlBlock/types.js +2 -0
  122. package/build/esm/extensions/additional/YfmHtmlBlock/types.js.map +1 -0
  123. package/build/esm/extensions/behavior/Autocomplete/index.d.ts +1 -0
  124. package/build/esm/extensions/behavior/Autocomplete/index.js +2 -1
  125. package/build/esm/extensions/behavior/Autocomplete/index.js.map +1 -1
  126. package/build/esm/extensions/behavior/Autocomplete/types.d.ts +1 -1
  127. package/build/esm/extensions/behavior/Autocomplete/types.js.map +1 -1
  128. package/build/esm/extensions/behavior/Autocomplete/utils.d.ts +3 -0
  129. package/build/esm/extensions/behavior/Autocomplete/utils.js +5 -0
  130. package/build/esm/extensions/behavior/Autocomplete/utils.js.map +1 -0
  131. package/build/esm/extensions/behavior/Clipboard/code.d.ts +7 -1
  132. package/build/esm/extensions/behavior/Clipboard/code.js +57 -0
  133. package/build/esm/extensions/behavior/Clipboard/code.js.map +1 -1
  134. package/build/esm/extensions/behavior/Clipboard/index.js +2 -0
  135. package/build/esm/extensions/behavior/Clipboard/index.js.map +1 -1
  136. package/build/esm/extensions/behavior/CommandMenu/handler.js +7 -7
  137. package/build/esm/extensions/behavior/CommandMenu/handler.js.map +1 -1
  138. package/build/esm/extensions/behavior/SharedState/SharedState.d.ts +7 -0
  139. package/build/esm/extensions/behavior/SharedState/SharedState.js +11 -0
  140. package/build/esm/extensions/behavior/SharedState/SharedState.js.map +1 -0
  141. package/build/esm/extensions/behavior/SharedState/index.d.ts +1 -0
  142. package/build/esm/extensions/behavior/SharedState/index.js +2 -0
  143. package/build/esm/extensions/behavior/SharedState/index.js.map +1 -0
  144. package/build/esm/extensions/behavior/SharedState/plugin.d.ts +3 -0
  145. package/build/esm/extensions/behavior/SharedState/plugin.js +59 -0
  146. package/build/esm/extensions/behavior/SharedState/plugin.js.map +1 -0
  147. package/build/esm/extensions/behavior/SharedState/types.d.ts +1 -0
  148. package/build/esm/extensions/behavior/SharedState/types.js +2 -0
  149. package/build/esm/extensions/behavior/SharedState/types.js.map +1 -0
  150. package/build/esm/extensions/behavior/SharedState/utils.d.ts +29 -0
  151. package/build/esm/extensions/behavior/SharedState/utils.js +56 -0
  152. package/build/esm/extensions/behavior/SharedState/utils.js.map +1 -0
  153. package/build/esm/extensions/behavior/index.d.ts +2 -0
  154. package/build/esm/extensions/behavior/index.js +4 -0
  155. package/build/esm/extensions/behavior/index.js.map +1 -1
  156. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.d.ts +0 -1
  157. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +8 -7
  158. package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
  159. package/build/esm/react-utils/index.d.ts +1 -0
  160. package/build/esm/react-utils/index.js +1 -0
  161. package/build/esm/react-utils/index.js.map +1 -1
  162. package/build/esm/react-utils/useSharedEditingState.d.ts +5 -0
  163. package/build/esm/react-utils/useSharedEditingState.js +22 -0
  164. package/build/esm/react-utils/useSharedEditingState.js.map +1 -0
  165. package/build/esm/utils/descedants.d.ts +8 -0
  166. package/build/esm/utils/descedants.js +12 -0
  167. package/build/esm/utils/descedants.js.map +1 -0
  168. package/build/esm/utils/entity-id.d.ts +11 -0
  169. package/build/esm/utils/entity-id.js +16 -0
  170. package/build/esm/utils/entity-id.js.map +1 -0
  171. package/build/esm/utils/index.d.ts +2 -0
  172. package/build/esm/utils/index.js +2 -0
  173. package/build/esm/utils/index.js.map +1 -1
  174. package/build/esm/version.js +1 -1
  175. package/build/esm/version.js.map +1 -1
  176. package/build/esm/view/hocs/withYfmHtml/index.d.ts +2 -0
  177. package/build/esm/view/hocs/withYfmHtml/index.js +2 -2
  178. package/build/esm/view/hocs/withYfmHtml/index.js.map +1 -1
  179. package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js +3 -1
  180. package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js.map +1 -1
  181. package/package.json +3 -3
@@ -1,13 +1,15 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useRef, useState } from 'react';
2
+ import { useEffect, useMemo, useRef, useState } from 'react';
3
3
  import { getStyles } from '@diplodoc/html-extension';
4
4
  import { Ellipsis as DotsIcon, Eye } from '@gravity-ui/icons';
5
5
  import { Button, Icon, Label, Menu, Popup } from '@gravity-ui/uikit';
6
- import debounce from "lodash/debounce.js";
7
6
  import { cn } from "../../../../classname.js";
7
+ import { SharedStateKey } from "../../../behavior/SharedState/index.js";
8
8
  import { TextAreaFixed as TextArea } from "../../../../forms/TextInput.js";
9
9
  import { i18n } from "../../../../i18n/common/index.js";
10
+ import { debounce } from "../../../../lodash.js";
10
11
  import { useBooleanState, useElementState } from "../../../../react-utils/hooks.js";
12
+ import { useSharedEditingState } from "../../../../react-utils/useSharedEditingState.js";
11
13
  import { removeNode } from "../../../../utils/remove-node.js";
12
14
  import { YfmHtmlBlockConsts } from "../YfmHtmlBlockSpecs/const.js";
13
15
  import "./YfmHtmlBlock.css";
@@ -29,7 +31,7 @@ const createLinkCLickHandler = (value, document) => (event) => {
29
31
  }
30
32
  }
31
33
  };
32
- const YfmHtmlBlockPreview = ({ html, onСlick, config }) => {
34
+ const YfmHtmlBlockPreview = ({ html, onClick, config }) => {
33
35
  const ref = useRef(null);
34
36
  const styles = useRef({});
35
37
  const classNames = useRef([]);
@@ -45,7 +47,7 @@ const YfmHtmlBlockPreview = ({ html, onСlick, config }) => {
45
47
  if (contentWindow) {
46
48
  const frameDocument = contentWindow.document;
47
49
  frameDocument.addEventListener('dblclick', () => {
48
- onСlick();
50
+ onClick();
49
51
  });
50
52
  }
51
53
  };
@@ -142,13 +144,12 @@ const CodeEditMode = ({ initialText, onSave, onCancel }) => {
142
144
  }, autoFocus: true }), _jsx("div", { className: b('controls'), children: _jsxs("div", { children: [_jsx(Button, { onClick: onCancel, view: 'flat', children: _jsx("span", { className: STOP_EVENT_CLASSNAME, children: i18n('cancel') }) }), _jsx(Button, { onClick: () => onSave(text), view: 'action', children: _jsx("span", { className: STOP_EVENT_CLASSNAME, children: i18n('save') }) })] }) })] }) }));
143
145
  };
144
146
  export const YfmHtmlBlockView = ({ onChange, node, getPos, view, options: { useConfig, sanitize, styles, baseTarget = '_parent', head: headContent = '' }, }) => {
145
- const [editing, setEditing, unsetEditing, toggleEditing] = useBooleanState(Boolean(node.attrs[YfmHtmlBlockConsts.NodeAttrs.newCreated]));
147
+ const entityId = node.attrs[YfmHtmlBlockConsts.NodeAttrs.EntityId];
148
+ const entityKey = useMemo(() => SharedStateKey.define({ name: entityId }), [entityId]);
146
149
  const config = useConfig?.();
150
+ const [editing, setEditing, unsetEditing] = useSharedEditingState(view, entityKey);
147
151
  const [menuOpen, _openMenu, closeMenu, toggleMenuOpen] = useBooleanState(false);
148
152
  const [anchorElement, setAnchorElement] = useElementState();
149
- const handleClick = () => {
150
- setEditing();
151
- };
152
153
  if (editing) {
153
154
  return (_jsx(CodeEditMode, { initialText: node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc], onCancel: unsetEditing, onSave: (v) => {
154
155
  onChange({ [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: v });
@@ -165,9 +166,10 @@ export const YfmHtmlBlockView = ({ onChange, node, getPos, view, options: { useC
165
166
  const head = `<head>${headContent || additional}</head>`;
166
167
  const body = `<body>${node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc] ?? ''}</body>`;
167
168
  const html = `<!DOCTYPE html><html>${head}${body}</html>`;
168
- const resultHtml = sanitize ? sanitize(html) : html;
169
- return (_jsxs("div", { className: b(), onDoubleClick: setEditing, children: [_jsx(Label, { className: b('label'), icon: _jsx(Icon, { size: 16, data: Eye }), children: i18n('preview') }), _jsx(YfmHtmlBlockPreview, { html: resultHtml, "on\u0421lick": handleClick, config: config }), _jsxs("div", { className: b('menu'), children: [_jsx(Button, { onClick: toggleMenuOpen, ref: setAnchorElement, size: "s", className: STOP_EVENT_CLASSNAME, children: _jsx(Icon, { data: DotsIcon, className: STOP_EVENT_CLASSNAME }) }), _jsx(Popup, { anchorElement: anchorElement, open: menuOpen, onOpenChange: closeMenu, placement: "bottom-end", children: _jsxs(Menu, { children: [_jsx(Menu.Item, { onClick: () => {
170
- toggleEditing();
169
+ const sanitizeFunction = typeof sanitize === 'function' ? sanitize : sanitize?.body;
170
+ const resultHtml = sanitizeFunction ? sanitizeFunction(html) : html;
171
+ return (_jsxs("div", { className: b(), onDoubleClick: setEditing, children: [_jsx(Label, { className: b('label'), icon: _jsx(Icon, { size: 16, data: Eye }), children: i18n('preview') }), _jsx(YfmHtmlBlockPreview, { html: resultHtml, onClick: setEditing, config: config }), _jsxs("div", { className: b('menu'), children: [_jsx(Button, { onClick: toggleMenuOpen, ref: setAnchorElement, size: "s", className: STOP_EVENT_CLASSNAME, children: _jsx(Icon, { data: DotsIcon, className: STOP_EVENT_CLASSNAME }) }), _jsx(Popup, { anchorElement: anchorElement, open: menuOpen, onOpenChange: closeMenu, placement: "bottom-end", children: _jsxs(Menu, { children: [_jsx(Menu.Item, { onClick: () => {
172
+ setEditing();
171
173
  closeMenu();
172
174
  }, children: i18n('edit') }), _jsx(Menu.Item, { onClick: () => {
173
175
  const pos = getPos();
@@ -1 +1 @@
1
- {"version":3,"file":"YfmHtmlBlockView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useEffect, useRef, useState} from 'react';\n\nimport {getStyles} from '@diplodoc/html-extension';\nimport type {IHTMLIFrameElementConfig} from '@diplodoc/html-extension/runtime';\nimport {Ellipsis as DotsIcon, Eye} from '@gravity-ui/icons';\nimport {Button, Icon, Label, Menu, Popup} from '@gravity-ui/uikit';\nimport debounce from 'lodash/debounce';\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from '../../../../classname';\nimport {TextAreaFixed as TextArea} from '../../../../forms/TextInput';\nimport {i18n} from '../../../../i18n/common';\nimport {useBooleanState, useElementState} from '../../../../react-utils/hooks';\nimport {removeNode} from '../../../../utils/remove-node';\nimport {YfmHtmlBlockConsts} from '../YfmHtmlBlockSpecs/const';\nimport type {YfmHtmlBlockOptions} from '../index';\n\nimport './YfmHtmlBlock.scss';\n\nexport const cnYfmHtmlBlock = cn('yfm-html-block');\nexport const STOP_EVENT_CLASSNAME = 'prosemirror-stop-event';\n\nconst b = cnYfmHtmlBlock;\n\ninterface YfmHtmlBlockViewProps {\n html: string;\n onСlick: () => void;\n config?: IHTMLIFrameElementConfig;\n}\n\nexport function generateID() {\n return Math.random().toString(36).substr(2, 8);\n}\n\nconst DEFAULT_PADDING = 20;\nconst DEFAULT_DELAY = 100;\n\nconst createLinkCLickHandler = (value: Element, document: Document) => (event: Event) => {\n event.preventDefault();\n const targetId = value.getAttribute('href');\n\n if (targetId) {\n const targetElement = document.querySelector(targetId);\n if (targetElement) {\n targetElement.scrollIntoView({behavior: 'smooth'});\n }\n }\n};\n\nconst YfmHtmlBlockPreview: React.FC<YfmHtmlBlockViewProps> = ({html, onСlick, config}) => {\n const ref = useRef<HTMLIFrameElement>(null);\n const styles = useRef<Record<string, string>>({});\n const classNames = useRef<string[]>([]);\n const resizeConfig = useRef<Record<string, number>>({});\n\n const [height, setHeight] = useState('100%');\n\n useEffect(() => {\n setStyles(config?.styles);\n setClassNames(config?.classNames);\n }, [config, ref.current?.contentWindow?.document?.body]);\n\n const handleLoadIFrame = () => {\n const contentWindow = ref.current?.contentWindow;\n\n handleResizeIFrame();\n\n if (contentWindow) {\n const frameDocument = contentWindow.document;\n frameDocument.addEventListener('dblclick', () => {\n onСlick();\n });\n }\n };\n\n const handleResizeIFrame = () => {\n if (ref.current) {\n const contentWindow = ref.current?.contentWindow;\n if (contentWindow) {\n const body = contentWindow.document.body;\n if (body) {\n const height =\n body.scrollHeight +\n (resizeConfig.current?.padding || DEFAULT_PADDING) +\n 'px';\n\n setHeight(height);\n }\n }\n }\n };\n\n const setClassNames = (newClassNames: string[] | undefined) => {\n const body = ref.current?.contentWindow?.document.body;\n\n if (body && newClassNames) {\n const previousClassNames = classNames.current;\n\n // remove all classes that were in previousClassNames but are not in classNames\n previousClassNames.forEach((className) => {\n if (!newClassNames.includes(className)) {\n body.classList.remove(className);\n }\n });\n\n // add classes that are in classNames\n newClassNames.forEach((className) => {\n if (!body.classList.contains(className)) {\n body.classList.add(className);\n }\n });\n\n classNames.current = newClassNames;\n }\n };\n\n const setStyles = (newStyles: Record<string, string> | undefined) => {\n const body = ref.current?.contentWindow?.document.body;\n\n if (body && newStyles) {\n const previousStyles = styles.current;\n\n // remove all styles that are in previousStyles but not in styles\n Object.keys(previousStyles).forEach((property) => {\n if (!Object.prototype.hasOwnProperty.call(newStyles, property)) {\n body.style.removeProperty(property);\n }\n });\n\n // sdd or update styles that are in styles\n Object.keys(newStyles).forEach((property) => {\n body.style.setProperty(property, newStyles[property]);\n });\n\n // update current styles to the new styles\n styles.current = newStyles;\n }\n };\n\n // finds all relative links (href^=\"#\") and changes their click behavior\n const createAnchorLinkHandlers = (type: 'add' | 'remove') => () => {\n const document = ref.current?.contentWindow!.document;\n\n if (document) {\n document.querySelectorAll('a[href^=\"#\"]').forEach((value: Element) => {\n const handler = createLinkCLickHandler(value, document);\n if (type === 'add') {\n value.addEventListener('click', handler);\n } else {\n value.removeEventListener('click', handler);\n }\n });\n }\n };\n\n useEffect(() => {\n ref.current?.addEventListener('load', handleLoadIFrame);\n ref.current?.addEventListener('load', createAnchorLinkHandlers('add'));\n return () => {\n ref.current?.removeEventListener('load', handleLoadIFrame);\n ref.current?.removeEventListener('load', createAnchorLinkHandlers('remove'));\n };\n }, [html]);\n\n useEffect(() => {\n if (ref.current) {\n const resizeObserver = new window.ResizeObserver(\n debounce(handleResizeIFrame, DEFAULT_DELAY),\n );\n resizeObserver.observe(ref.current);\n }\n }, [ref.current?.contentWindow?.document?.body]);\n\n return (\n <iframe\n style={{\n height,\n }}\n ref={ref}\n title={generateID()}\n frameBorder={0}\n className={b('content')}\n srcDoc={html}\n />\n );\n};\n\nconst CodeEditMode: React.FC<{\n initialText: string;\n onSave: (v: string) => void;\n onCancel: () => void;\n}> = ({initialText, onSave, onCancel}) => {\n const [text, setText] = useState(initialText || '\\n');\n\n return (\n <div className={b({editing: true})}>\n <div className={b('editor')}>\n <TextArea\n controlProps={{\n className: STOP_EVENT_CLASSNAME,\n }}\n value={text}\n onUpdate={(v) => {\n setText(v);\n }}\n autoFocus\n />\n\n <div className={b('controls')}>\n <div>\n <Button onClick={onCancel} view={'flat'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('cancel')}</span>\n </Button>\n <Button onClick={() => onSave(text)} view={'action'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('save')}</span>\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport const YfmHtmlBlockView: React.FC<{\n getPos: () => number | undefined;\n node: Node;\n onChange: (attrs: {[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: string}) => void;\n options: YfmHtmlBlockOptions;\n view: EditorView;\n}> = ({\n onChange,\n node,\n getPos,\n view,\n options: {useConfig, sanitize, styles, baseTarget = '_parent', head: headContent = ''},\n}) => {\n const [editing, setEditing, unsetEditing, toggleEditing] = useBooleanState(\n Boolean(node.attrs[YfmHtmlBlockConsts.NodeAttrs.newCreated]),\n );\n\n const config = useConfig?.();\n\n const [menuOpen, _openMenu, closeMenu, toggleMenuOpen] = useBooleanState(false);\n const [anchorElement, setAnchorElement] = useElementState();\n\n const handleClick = () => {\n setEditing();\n };\n\n if (editing) {\n return (\n <CodeEditMode\n initialText={node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc]}\n onCancel={unsetEditing}\n onSave={(v) => {\n onChange({[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: v});\n unsetEditing();\n }}\n />\n );\n }\n\n let additional = baseTarget ? `<base target=\"${baseTarget}\">` : '';\n if (styles) {\n const stylesContent =\n typeof styles === 'string'\n ? `<link rel=\"stylesheet\" href=\"${styles}\" />`\n : `<style>${getStyles(styles)}</style>`;\n additional += stylesContent;\n }\n\n const head = `<head>${headContent || additional}</head>`;\n const body = `<body>${node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc] ?? ''}</body>`;\n const html = `<!DOCTYPE html><html>${head}${body}</html>`;\n\n const resultHtml = sanitize ? sanitize(html) : html;\n\n return (\n <div className={b()} onDoubleClick={setEditing}>\n <Label className={b('label')} icon={<Icon size={16} data={Eye} />}>\n {i18n('preview')}\n </Label>\n <YfmHtmlBlockPreview html={resultHtml} onСlick={handleClick} config={config} />\n\n <div className={b('menu')}>\n <Button\n onClick={toggleMenuOpen}\n ref={setAnchorElement}\n size=\"s\"\n className={STOP_EVENT_CLASSNAME}\n >\n <Icon data={DotsIcon} className={STOP_EVENT_CLASSNAME} />\n </Button>\n <Popup\n anchorElement={anchorElement}\n open={menuOpen}\n onOpenChange={closeMenu}\n placement=\"bottom-end\"\n >\n <Menu>\n <Menu.Item\n onClick={() => {\n toggleEditing();\n closeMenu();\n }}\n >\n {i18n('edit')}\n </Menu.Item>\n <Menu.Item\n onClick={() => {\n const pos = getPos();\n if (pos === undefined) return;\n removeNode({\n node,\n pos,\n tr: view.state.tr,\n dispatch: view.dispatch,\n });\n }}\n >\n {i18n('remove')}\n </Menu.Item>\n </Menu>\n </Popup>\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"file":"YfmHtmlBlockView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useEffect, useMemo, useRef, useState} from 'react';\n\nimport {getStyles} from '@diplodoc/html-extension';\nimport type {IHTMLIFrameElementConfig} from '@diplodoc/html-extension/runtime';\nimport {Ellipsis as DotsIcon, Eye} from '@gravity-ui/icons';\nimport {Button, Icon, Label, Menu, Popup} from '@gravity-ui/uikit';\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from 'src/classname';\nimport {SharedStateKey} from 'src/extensions/behavior/SharedState';\nimport {TextAreaFixed as TextArea} from 'src/forms/TextInput';\nimport {i18n} from 'src/i18n/common';\nimport {debounce} from 'src/lodash';\nimport {useBooleanState, useElementState} from 'src/react-utils/hooks';\nimport {useSharedEditingState} from 'src/react-utils/useSharedEditingState';\nimport {removeNode} from 'src/utils/remove-node';\n\nimport {YfmHtmlBlockConsts} from '../YfmHtmlBlockSpecs/const';\nimport type {YfmHtmlBlockOptions} from '../index';\nimport type {YfmHtmlBlockEntitySharedState} from '../types';\n\nimport './YfmHtmlBlock.scss';\n\nexport const cnYfmHtmlBlock = cn('yfm-html-block');\nexport const STOP_EVENT_CLASSNAME = 'prosemirror-stop-event';\n\nconst b = cnYfmHtmlBlock;\n\ninterface YfmHtmlBlockViewProps {\n html: string;\n onClick: () => void;\n config?: IHTMLIFrameElementConfig;\n}\n\nexport function generateID() {\n return Math.random().toString(36).substr(2, 8);\n}\n\nconst DEFAULT_PADDING = 20;\nconst DEFAULT_DELAY = 100;\n\nconst createLinkCLickHandler = (value: Element, document: Document) => (event: Event) => {\n event.preventDefault();\n const targetId = value.getAttribute('href');\n\n if (targetId) {\n const targetElement = document.querySelector(targetId);\n if (targetElement) {\n targetElement.scrollIntoView({behavior: 'smooth'});\n }\n }\n};\n\nconst YfmHtmlBlockPreview: React.FC<YfmHtmlBlockViewProps> = ({html, onClick, config}) => {\n const ref = useRef<HTMLIFrameElement>(null);\n const styles = useRef<Record<string, string>>({});\n const classNames = useRef<string[]>([]);\n const resizeConfig = useRef<Record<string, number>>({});\n\n const [height, setHeight] = useState('100%');\n\n useEffect(() => {\n setStyles(config?.styles);\n setClassNames(config?.classNames);\n }, [config, ref.current?.contentWindow?.document?.body]);\n\n const handleLoadIFrame = () => {\n const contentWindow = ref.current?.contentWindow;\n\n handleResizeIFrame();\n\n if (contentWindow) {\n const frameDocument = contentWindow.document;\n frameDocument.addEventListener('dblclick', () => {\n onClick();\n });\n }\n };\n\n const handleResizeIFrame = () => {\n if (ref.current) {\n const contentWindow = ref.current?.contentWindow;\n if (contentWindow) {\n const body = contentWindow.document.body;\n if (body) {\n const height =\n body.scrollHeight +\n (resizeConfig.current?.padding || DEFAULT_PADDING) +\n 'px';\n\n setHeight(height);\n }\n }\n }\n };\n\n const setClassNames = (newClassNames: string[] | undefined) => {\n const body = ref.current?.contentWindow?.document.body;\n\n if (body && newClassNames) {\n const previousClassNames = classNames.current;\n\n // remove all classes that were in previousClassNames but are not in classNames\n previousClassNames.forEach((className) => {\n if (!newClassNames.includes(className)) {\n body.classList.remove(className);\n }\n });\n\n // add classes that are in classNames\n newClassNames.forEach((className) => {\n if (!body.classList.contains(className)) {\n body.classList.add(className);\n }\n });\n\n classNames.current = newClassNames;\n }\n };\n\n const setStyles = (newStyles: Record<string, string> | undefined) => {\n const body = ref.current?.contentWindow?.document.body;\n\n if (body && newStyles) {\n const previousStyles = styles.current;\n\n // remove all styles that are in previousStyles but not in styles\n Object.keys(previousStyles).forEach((property) => {\n if (!Object.prototype.hasOwnProperty.call(newStyles, property)) {\n body.style.removeProperty(property);\n }\n });\n\n // sdd or update styles that are in styles\n Object.keys(newStyles).forEach((property) => {\n body.style.setProperty(property, newStyles[property]);\n });\n\n // update current styles to the new styles\n styles.current = newStyles;\n }\n };\n\n // finds all relative links (href^=\"#\") and changes their click behavior\n const createAnchorLinkHandlers = (type: 'add' | 'remove') => () => {\n const document = ref.current?.contentWindow!.document;\n\n if (document) {\n document.querySelectorAll('a[href^=\"#\"]').forEach((value: Element) => {\n const handler = createLinkCLickHandler(value, document);\n if (type === 'add') {\n value.addEventListener('click', handler);\n } else {\n value.removeEventListener('click', handler);\n }\n });\n }\n };\n\n useEffect(() => {\n ref.current?.addEventListener('load', handleLoadIFrame);\n ref.current?.addEventListener('load', createAnchorLinkHandlers('add'));\n return () => {\n ref.current?.removeEventListener('load', handleLoadIFrame);\n ref.current?.removeEventListener('load', createAnchorLinkHandlers('remove'));\n };\n }, [html]);\n\n useEffect(() => {\n if (ref.current) {\n const resizeObserver = new window.ResizeObserver(\n debounce(handleResizeIFrame, DEFAULT_DELAY),\n );\n resizeObserver.observe(ref.current);\n }\n }, [ref.current?.contentWindow?.document?.body]);\n\n return (\n <iframe\n style={{\n height,\n }}\n ref={ref}\n title={generateID()}\n frameBorder={0}\n className={b('content')}\n srcDoc={html}\n />\n );\n};\n\nconst CodeEditMode: React.FC<{\n initialText: string;\n onSave: (v: string) => void;\n onCancel: () => void;\n}> = ({initialText, onSave, onCancel}) => {\n const [text, setText] = useState(initialText || '\\n');\n\n return (\n <div className={b({editing: true})}>\n <div className={b('editor')}>\n <TextArea\n controlProps={{\n className: STOP_EVENT_CLASSNAME,\n }}\n value={text}\n onUpdate={(v) => {\n setText(v);\n }}\n autoFocus\n />\n\n <div className={b('controls')}>\n <div>\n <Button onClick={onCancel} view={'flat'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('cancel')}</span>\n </Button>\n <Button onClick={() => onSave(text)} view={'action'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('save')}</span>\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport const YfmHtmlBlockView: React.FC<{\n getPos: () => number | undefined;\n node: Node;\n onChange: (attrs: {[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: string}) => void;\n options: YfmHtmlBlockOptions;\n view: EditorView;\n}> = ({\n onChange,\n node,\n getPos,\n view,\n options: {useConfig, sanitize, styles, baseTarget = '_parent', head: headContent = ''},\n}) => {\n const entityId: string = node.attrs[YfmHtmlBlockConsts.NodeAttrs.EntityId];\n const entityKey = useMemo(\n () => SharedStateKey.define<YfmHtmlBlockEntitySharedState>({name: entityId}),\n [entityId],\n );\n\n const config = useConfig?.();\n\n const [editing, setEditing, unsetEditing] = useSharedEditingState(view, entityKey);\n const [menuOpen, _openMenu, closeMenu, toggleMenuOpen] = useBooleanState(false);\n const [anchorElement, setAnchorElement] = useElementState();\n\n if (editing) {\n return (\n <CodeEditMode\n initialText={node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc]}\n onCancel={unsetEditing}\n onSave={(v) => {\n onChange({[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: v});\n unsetEditing();\n }}\n />\n );\n }\n\n let additional = baseTarget ? `<base target=\"${baseTarget}\">` : '';\n if (styles) {\n const stylesContent =\n typeof styles === 'string'\n ? `<link rel=\"stylesheet\" href=\"${styles}\" />`\n : `<style>${getStyles(styles)}</style>`;\n additional += stylesContent;\n }\n\n const head = `<head>${headContent || additional}</head>`;\n const body = `<body>${node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc] ?? ''}</body>`;\n const html = `<!DOCTYPE html><html>${head}${body}</html>`;\n\n const sanitizeFunction = typeof sanitize === 'function' ? sanitize : sanitize?.body;\n\n const resultHtml = sanitizeFunction ? sanitizeFunction(html) : html;\n\n return (\n <div className={b()} onDoubleClick={setEditing}>\n <Label className={b('label')} icon={<Icon size={16} data={Eye} />}>\n {i18n('preview')}\n </Label>\n <YfmHtmlBlockPreview html={resultHtml} onClick={setEditing} config={config} />\n\n <div className={b('menu')}>\n <Button\n onClick={toggleMenuOpen}\n ref={setAnchorElement}\n size=\"s\"\n className={STOP_EVENT_CLASSNAME}\n >\n <Icon data={DotsIcon} className={STOP_EVENT_CLASSNAME} />\n </Button>\n <Popup\n anchorElement={anchorElement}\n open={menuOpen}\n onOpenChange={closeMenu}\n placement=\"bottom-end\"\n >\n <Menu>\n <Menu.Item\n onClick={() => {\n setEditing();\n closeMenu();\n }}\n >\n {i18n('edit')}\n </Menu.Item>\n <Menu.Item\n onClick={() => {\n const pos = getPos();\n if (pos === undefined) return;\n removeNode({\n node,\n pos,\n tr: view.state.tr,\n dispatch: view.dispatch,\n });\n }}\n >\n {i18n('remove')}\n </Menu.Item>\n </Menu>\n </Popup>\n </div>\n </div>\n );\n};\n"]}
@@ -1,6 +1,8 @@
1
1
  export declare enum YfmHtmlBlockAttrs {
2
+ EntityId = "data-entity-id",
2
3
  class = "class",
3
4
  frameborder = "frameborder",
5
+ /** @deprecated This is no longer used. Removed in next major version */
4
6
  newCreated = "newCreated",
5
7
  srcdoc = "srcdoc",
6
8
  style = "style"
@@ -13,3 +15,4 @@ export declare const YfmHtmlBlockConsts: {
13
15
  readonly NodeAttrs: typeof YfmHtmlBlockAttrs;
14
16
  readonly nodeType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
15
17
  };
18
+ export declare const defaultYfmHtmlBlockEntityId: string;
@@ -1,8 +1,13 @@
1
+ import { entityIdAttr } from "../../../../utils/entity-id.js";
1
2
  import { nodeTypeFactory } from "../../../../utils/schema.js";
2
3
  export var YfmHtmlBlockAttrs;
3
4
  (function (YfmHtmlBlockAttrs) {
5
+ // @ts-expect-error error TS18055
6
+ YfmHtmlBlockAttrs["EntityId"] = "data-entity-id";
4
7
  YfmHtmlBlockAttrs["class"] = "class";
5
8
  YfmHtmlBlockAttrs["frameborder"] = "frameborder";
9
+ // MAJOR: remove before next major
10
+ /** @deprecated This is no longer used. Removed in next major version */
6
11
  YfmHtmlBlockAttrs["newCreated"] = "newCreated";
7
12
  YfmHtmlBlockAttrs["srcdoc"] = "srcdoc";
8
13
  YfmHtmlBlockAttrs["style"] = "style";
@@ -15,4 +20,5 @@ export const YfmHtmlBlockConsts = {
15
20
  NodeAttrs: YfmHtmlBlockAttrs,
16
21
  nodeType: yfmHtmlBlockNodeType,
17
22
  };
23
+ export const defaultYfmHtmlBlockEntityId = yfmHtmlBlockNodeName + '#0';
18
24
  //# sourceMappingURL=const.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,oCAAiC;AAEzD,MAAM,CAAN,IAAY,iBAMX;AAND,WAAY,iBAAiB;IACzB,oCAAe,CAAA;IACf,gDAA2B,CAAA;IAC3B,8CAAyB,CAAA;IACzB,sCAAiB,CAAA;IACjB,oCAAe,CAAA;AACnB,CAAC,EANW,iBAAiB,KAAjB,iBAAiB,QAM5B;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AACrD,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC,oBAAoB,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEvD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAC9B,QAAQ,EAAE,oBAAoB;IAC9B,SAAS,EAAE,iBAAiB;IAC5B,QAAQ,EAAE,oBAAoB;CACxB,CAAC","sourcesContent":["import {nodeTypeFactory} from '../../../../utils/schema';\n\nexport enum YfmHtmlBlockAttrs {\n class = 'class',\n frameborder = 'frameborder',\n newCreated = 'newCreated',\n srcdoc = 'srcdoc',\n style = 'style',\n}\n\nexport const yfmHtmlBlockNodeName = 'yfm_html_block';\nexport const yfmHtmlBlockNodeType = nodeTypeFactory(yfmHtmlBlockNodeName);\n\nexport const YfmHtmlBlockAction = 'createYfmHtmlBlock';\n\nexport const YfmHtmlBlockConsts = {\n NodeName: yfmHtmlBlockNodeName,\n NodeAttrs: YfmHtmlBlockAttrs,\n nodeType: yfmHtmlBlockNodeType,\n} as const;\n"]}
1
+ {"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,uCAA4B;AACjD,OAAO,EAAC,eAAe,EAAC,oCAAyB;AAEjD,MAAM,CAAN,IAAY,iBAUX;AAVD,WAAY,iBAAiB;IACzB,iCAAiC;IACjC,gDAAuB,CAAA;IACvB,oCAAe,CAAA;IACf,gDAA2B,CAAA;IAC3B,kCAAkC;IAClC,wEAAwE;IACxE,8CAAyB,CAAA;IACzB,sCAAiB,CAAA;IACjB,oCAAe,CAAA;AACnB,CAAC,EAVW,iBAAiB,KAAjB,iBAAiB,QAU5B;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AACrD,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC,oBAAoB,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AAEvD,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAC9B,QAAQ,EAAE,oBAAoB;IAC9B,SAAS,EAAE,iBAAiB;IAC5B,QAAQ,EAAE,oBAAoB;CACxB,CAAC;AAEX,MAAM,CAAC,MAAM,2BAA2B,GAAG,oBAAoB,GAAG,IAAI,CAAC","sourcesContent":["import {entityIdAttr} from 'src/utils/entity-id';\nimport {nodeTypeFactory} from 'src/utils/schema';\n\nexport enum YfmHtmlBlockAttrs {\n // @ts-expect-error error TS18055\n EntityId = entityIdAttr,\n class = 'class',\n frameborder = 'frameborder',\n // MAJOR: remove before next major\n /** @deprecated This is no longer used. Removed in next major version */\n newCreated = 'newCreated',\n srcdoc = 'srcdoc',\n style = 'style',\n}\n\nexport const yfmHtmlBlockNodeName = 'yfm_html_block';\nexport const yfmHtmlBlockNodeType = nodeTypeFactory(yfmHtmlBlockNodeName);\n\nexport const YfmHtmlBlockAction = 'createYfmHtmlBlock';\n\nexport const YfmHtmlBlockConsts = {\n NodeName: yfmHtmlBlockNodeName,\n NodeAttrs: YfmHtmlBlockAttrs,\n nodeType: yfmHtmlBlockNodeType,\n} as const;\n\nexport const defaultYfmHtmlBlockEntityId = yfmHtmlBlockNodeName + '#0';\n"]}
@@ -1,10 +1,10 @@
1
1
  import { type PluginOptions } from '@diplodoc/html-extension';
2
2
  import type { ExtensionNodeSpec } from "../../../../core/index.js";
3
- export { yfmHtmlBlockNodeName } from "./const.js";
3
+ export { yfmHtmlBlockNodeName, YfmHtmlBlockConsts } from "./const.js";
4
4
  export interface YfmHtmlBlockSpecsOptions extends Omit<PluginOptions, 'runtimeJsPath' | 'containerClasses' | 'bundle' | 'embeddingMode'> {
5
5
  nodeView?: ExtensionNodeSpec['view'];
6
6
  }
7
- export declare const YfmHtmlBlockSpecs: import("../../../../index.js").ExtensionWithOptions<YfmHtmlBlockSpecsOptions> & {
7
+ export declare const YfmHtmlBlockSpecs: import("../../../../core/index.js").ExtensionWithOptions<YfmHtmlBlockSpecsOptions> & {
8
8
  readonly NodeName: "yfm_html_block";
9
9
  readonly NodeAttrs: typeof import("./const.js").YfmHtmlBlockAttrs;
10
10
  readonly nodeType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
@@ -1,6 +1,7 @@
1
1
  import { transform } from '@diplodoc/html-extension';
2
- import { YfmHtmlBlockConsts } from "./const.js";
3
- export { yfmHtmlBlockNodeName } from "./const.js";
2
+ import { generateEntityId } from "../../../../utils/entity-id.js";
3
+ import { YfmHtmlBlockConsts, defaultYfmHtmlBlockEntityId } from "./const.js";
4
+ export { yfmHtmlBlockNodeName, YfmHtmlBlockConsts } from "./const.js";
4
5
  const YfmHtmlBlockSpecsExtension = (builder, { nodeView, ...options }) => {
5
6
  builder
6
7
  .configureMd((md) => md.use(transform({
@@ -14,7 +15,10 @@ const YfmHtmlBlockSpecsExtension = (builder, { nodeView, ...options }) => {
14
15
  name: YfmHtmlBlockConsts.NodeName,
15
16
  type: 'node',
16
17
  noCloseToken: true,
17
- getAttrs: ({ content }) => ({ srcdoc: content }),
18
+ getAttrs: ({ content }) => ({
19
+ [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: content,
20
+ [YfmHtmlBlockConsts.NodeAttrs.EntityId]: generateEntityId(YfmHtmlBlockConsts.NodeName),
21
+ }),
18
22
  },
19
23
  },
20
24
  spec: {
@@ -25,6 +29,7 @@ const YfmHtmlBlockSpecsExtension = (builder, { nodeView, ...options }) => {
25
29
  [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: { default: '' },
26
30
  [YfmHtmlBlockConsts.NodeAttrs.style]: { default: null },
27
31
  [YfmHtmlBlockConsts.NodeAttrs.newCreated]: { default: null },
32
+ [YfmHtmlBlockConsts.NodeAttrs.EntityId]: { default: defaultYfmHtmlBlockEntityId },
28
33
  },
29
34
  toDOM: (node) => ['iframe', node.attrs],
30
35
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,SAAS,EAAC,MAAM,0BAA0B,CAAC;AAIvE,OAAO,EAAC,kBAAkB,EAAC,mBAAgB;AAE3C,OAAO,EAAC,oBAAoB,EAAC,mBAAgB;AAO7C,MAAM,0BAA0B,GAA4C,CACxE,OAAO,EACP,EAAC,QAAQ,EAAE,GAAG,OAAO,EAAC,EACxB,EAAE;IACA,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAChB,EAAE,CAAC,GAAG,CACF,SAAS,CAAC;QACN,MAAM,EAAE,KAAK;QACb,aAAa,EAAE,QAAQ;QACvB,GAAG,OAAO;KACb,CAAC,EACF,EAAE,CACL,CACJ;SACA,OAAO,CAAC,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,EAAE;YACJ,SAAS,EAAE;gBACP,IAAI,EAAE,kBAAkB,CAAC,QAAQ;gBACjC,IAAI,EAAE,MAAM;gBACZ,YAAY,EAAE,IAAI;gBAClB,QAAQ,EAAE,CAAC,EAAC,OAAO,EAAC,EAAE,EAAE,CAAC,CAAC,EAAC,MAAM,EAAE,OAAO,EAAC,CAAC;aAC/C;SACJ;QACD,IAAI,EAAE;YACF,KAAK,EAAE,OAAO;YACd,KAAK,EAAE;gBACH,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAC,OAAO,EAAE,UAAU,EAAC;gBAC3D,CAAC,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,EAAC,OAAO,EAAE,EAAE,EAAC;gBACzD,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAC,OAAO,EAAE,EAAE,EAAC;gBACpD,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;gBACrD,CAAC,kBAAkB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;aAC7D;YACD,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;SAC1C;QACD,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAClB,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACxB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7D,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,0BAA0B,EAAE,kBAAkB,CAAC,CAAC","sourcesContent":["import {type PluginOptions, transform} from '@diplodoc/html-extension';\n\nimport type {ExtensionAuto, ExtensionNodeSpec} from '../../../../core';\n\nimport {YfmHtmlBlockConsts} from './const';\n\nexport {yfmHtmlBlockNodeName} from './const';\n\nexport interface YfmHtmlBlockSpecsOptions\n extends Omit<PluginOptions, 'runtimeJsPath' | 'containerClasses' | 'bundle' | 'embeddingMode'> {\n nodeView?: ExtensionNodeSpec['view'];\n}\n\nconst YfmHtmlBlockSpecsExtension: ExtensionAuto<YfmHtmlBlockSpecsOptions> = (\n builder,\n {nodeView, ...options},\n) => {\n builder\n .configureMd((md) =>\n md.use(\n transform({\n bundle: false,\n embeddingMode: 'srcdoc',\n ...options,\n }),\n {},\n ),\n )\n .addNode(YfmHtmlBlockConsts.NodeName, () => ({\n fromMd: {\n tokenSpec: {\n name: YfmHtmlBlockConsts.NodeName,\n type: 'node',\n noCloseToken: true,\n getAttrs: ({content}) => ({srcdoc: content}),\n },\n },\n spec: {\n group: 'block',\n attrs: {\n [YfmHtmlBlockConsts.NodeAttrs.class]: {default: 'yfm-html'},\n [YfmHtmlBlockConsts.NodeAttrs.frameborder]: {default: ''},\n [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: {default: ''},\n [YfmHtmlBlockConsts.NodeAttrs.style]: {default: null},\n [YfmHtmlBlockConsts.NodeAttrs.newCreated]: {default: null},\n },\n toDOM: (node) => ['iframe', node.attrs],\n },\n toMd: (state, node) => {\n state.write('::: html');\n state.write('\\n');\n state.write(node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc]);\n state.ensureNewLine();\n state.write(':::');\n state.closeBlock(node);\n },\n view: nodeView,\n }));\n};\n\nexport const YfmHtmlBlockSpecs = Object.assign(YfmHtmlBlockSpecsExtension, YfmHtmlBlockConsts);\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,SAAS,EAAC,MAAM,0BAA0B,CAAC;AAGvE,OAAO,EAAC,gBAAgB,EAAC,uCAA4B;AAErD,OAAO,EAAC,kBAAkB,EAAE,2BAA2B,EAAC,mBAAgB;AAExE,OAAO,EAAC,oBAAoB,EAAE,kBAAkB,EAAC,mBAAgB;AAOjE,MAAM,0BAA0B,GAA4C,CACxE,OAAO,EACP,EAAC,QAAQ,EAAE,GAAG,OAAO,EAAC,EACxB,EAAE;IACA,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAChB,EAAE,CAAC,GAAG,CACF,SAAS,CAAC;QACN,MAAM,EAAE,KAAK;QACb,aAAa,EAAE,QAAQ;QACvB,GAAG,OAAO;KACb,CAAC,EACF,EAAE,CACL,CACJ;SACA,OAAO,CAAC,kBAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,EAAE;YACJ,SAAS,EAAE;gBACP,IAAI,EAAE,kBAAkB,CAAC,QAAQ;gBACjC,IAAI,EAAE,MAAM;gBACZ,YAAY,EAAE,IAAI;gBAClB,QAAQ,EAAE,CAAC,EAAC,OAAO,EAAC,EAAE,EAAE,CAAC,CAAC;oBACtB,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO;oBAC9C,CAAC,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CACrD,kBAAkB,CAAC,QAAQ,CAC9B;iBACJ,CAAC;aACL;SACJ;QACD,IAAI,EAAE;YACF,KAAK,EAAE,OAAO;YACd,KAAK,EAAE;gBACH,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAC,OAAO,EAAE,UAAU,EAAC;gBAC3D,CAAC,kBAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,EAAC,OAAO,EAAE,EAAE,EAAC;gBACzD,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAC,OAAO,EAAE,EAAE,EAAC;gBACpD,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;gBACrD,CAAC,kBAAkB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;gBAC1D,CAAC,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAC,OAAO,EAAE,2BAA2B,EAAC;aAClF;YACD,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;SAC1C;QACD,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAClB,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACxB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7D,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,0BAA0B,EAAE,kBAAkB,CAAC,CAAC","sourcesContent":["import {type PluginOptions, transform} from '@diplodoc/html-extension';\n\nimport type {ExtensionAuto, ExtensionNodeSpec} from '#core';\nimport {generateEntityId} from 'src/utils/entity-id';\n\nimport {YfmHtmlBlockConsts, defaultYfmHtmlBlockEntityId} from './const';\n\nexport {yfmHtmlBlockNodeName, YfmHtmlBlockConsts} from './const';\n\nexport interface YfmHtmlBlockSpecsOptions\n extends Omit<PluginOptions, 'runtimeJsPath' | 'containerClasses' | 'bundle' | 'embeddingMode'> {\n nodeView?: ExtensionNodeSpec['view'];\n}\n\nconst YfmHtmlBlockSpecsExtension: ExtensionAuto<YfmHtmlBlockSpecsOptions> = (\n builder,\n {nodeView, ...options},\n) => {\n builder\n .configureMd((md) =>\n md.use(\n transform({\n bundle: false,\n embeddingMode: 'srcdoc',\n ...options,\n }),\n {},\n ),\n )\n .addNode(YfmHtmlBlockConsts.NodeName, () => ({\n fromMd: {\n tokenSpec: {\n name: YfmHtmlBlockConsts.NodeName,\n type: 'node',\n noCloseToken: true,\n getAttrs: ({content}) => ({\n [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: content,\n [YfmHtmlBlockConsts.NodeAttrs.EntityId]: generateEntityId(\n YfmHtmlBlockConsts.NodeName,\n ),\n }),\n },\n },\n spec: {\n group: 'block',\n attrs: {\n [YfmHtmlBlockConsts.NodeAttrs.class]: {default: 'yfm-html'},\n [YfmHtmlBlockConsts.NodeAttrs.frameborder]: {default: ''},\n [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: {default: ''},\n [YfmHtmlBlockConsts.NodeAttrs.style]: {default: null},\n [YfmHtmlBlockConsts.NodeAttrs.newCreated]: {default: null},\n [YfmHtmlBlockConsts.NodeAttrs.EntityId]: {default: defaultYfmHtmlBlockEntityId},\n },\n toDOM: (node) => ['iframe', node.attrs],\n },\n toMd: (state, node) => {\n state.write('::: html');\n state.write('\\n');\n state.write(node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc]);\n state.ensureNewLine();\n state.write(':::');\n state.closeBlock(node);\n },\n view: nodeView,\n }));\n};\n\nexport const YfmHtmlBlockSpecs = Object.assign(YfmHtmlBlockSpecsExtension, YfmHtmlBlockConsts);\n"]}
@@ -1,13 +1,20 @@
1
+ import { SharedStateKey } from "../../behavior/SharedState/index.js";
2
+ import { generateEntityId } from "../../../utils/entity-id.js";
1
3
  import { YfmHtmlBlockConsts, yfmHtmlBlockNodeType } from "./YfmHtmlBlockSpecs/const.js";
2
4
  export const addYfmHtmlBlock = {
3
5
  isEnable(state) {
4
6
  return state.selection.empty;
5
7
  },
6
8
  run(state, dispatch, _view) {
7
- dispatch(state.tr.insert(state.selection.from, yfmHtmlBlockNodeType(state.schema).create({
9
+ const entityId = generateEntityId(YfmHtmlBlockConsts.NodeName);
10
+ const sharedKey = SharedStateKey.define({ name: entityId });
11
+ const tr = state.tr.insert(state.selection.from, yfmHtmlBlockNodeType(state.schema).create({
8
12
  [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: '\n',
9
13
  [YfmHtmlBlockConsts.NodeAttrs.newCreated]: true,
10
- })));
14
+ [YfmHtmlBlockConsts.NodeAttrs.EntityId]: entityId,
15
+ }));
16
+ sharedKey.appendTransaction.set(tr, { editing: true });
17
+ dispatch(tr);
11
18
  },
12
19
  };
13
20
  //# sourceMappingURL=actions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","sourceRoot":"../../../../../src","sources":["extensions/additional/YfmHtmlBlock/actions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,kBAAkB,EAAE,oBAAoB,EAAC,qCAAkC;AAEnF,MAAM,CAAC,MAAM,eAAe,GAAe;IACvC,QAAQ,CAAC,KAAK;QACV,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;IACjC,CAAC;IACD,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK;QACtB,QAAQ,CACJ,KAAK,CAAC,EAAE,CAAC,MAAM,CACX,KAAK,CAAC,SAAS,CAAC,IAAI,EACpB,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;YACtC,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI;YAC3C,CAAC,kBAAkB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI;SAClD,CAAC,CACL,CACJ,CAAC;IACN,CAAC;CACJ,CAAC","sourcesContent":["import type {ActionSpec} from '../../../core';\n\nimport {YfmHtmlBlockConsts, yfmHtmlBlockNodeType} from './YfmHtmlBlockSpecs/const';\n\nexport const addYfmHtmlBlock: ActionSpec = {\n isEnable(state) {\n return state.selection.empty;\n },\n run(state, dispatch, _view) {\n dispatch(\n state.tr.insert(\n state.selection.from,\n yfmHtmlBlockNodeType(state.schema).create({\n [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: '\\n',\n [YfmHtmlBlockConsts.NodeAttrs.newCreated]: true,\n }),\n ),\n );\n },\n};\n"]}
1
+ {"version":3,"file":"actions.js","sourceRoot":"../../../../../src","sources":["extensions/additional/YfmHtmlBlock/actions.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,cAAc,EAAC,4CAA4C;AACnE,OAAO,EAAC,gBAAgB,EAAC,oCAA4B;AAErD,OAAO,EAAC,kBAAkB,EAAE,oBAAoB,EAAC,qCAAkC;AAGnF,MAAM,CAAC,MAAM,eAAe,GAAe;IACvC,QAAQ,CAAC,KAAK;QACV,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;IACjC,CAAC;IACD,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK;QACtB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAgC,EAAC,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC;QAEzF,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CACtB,KAAK,CAAC,SAAS,CAAC,IAAI,EACpB,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;YACtC,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI;YAC3C,CAAC,kBAAkB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI;YAC/C,CAAC,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ;SACpD,CAAC,CACL,CAAC;QAEF,SAAS,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC;QAErD,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;CACJ,CAAC","sourcesContent":["import type {ActionSpec} from '#core';\nimport {SharedStateKey} from 'src/extensions/behavior/SharedState';\nimport {generateEntityId} from 'src/utils/entity-id';\n\nimport {YfmHtmlBlockConsts, yfmHtmlBlockNodeType} from './YfmHtmlBlockSpecs/const';\nimport type {YfmHtmlBlockEntitySharedState} from './types';\n\nexport const addYfmHtmlBlock: ActionSpec = {\n isEnable(state) {\n return state.selection.empty;\n },\n run(state, dispatch, _view) {\n const entityId = generateEntityId(YfmHtmlBlockConsts.NodeName);\n const sharedKey = SharedStateKey.define<YfmHtmlBlockEntitySharedState>({name: entityId});\n\n const tr = state.tr.insert(\n state.selection.from,\n yfmHtmlBlockNodeType(state.schema).create({\n [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: '\\n',\n [YfmHtmlBlockConsts.NodeAttrs.newCreated]: true,\n [YfmHtmlBlockConsts.NodeAttrs.EntityId]: entityId,\n }),\n );\n\n sharedKey.appendTransaction.set(tr, {editing: true});\n\n dispatch(tr);\n },\n};\n"]}
@@ -0,0 +1,3 @@
1
+ export type YfmHtmlBlockEntitySharedState = {
2
+ editing: boolean;
3
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["extensions/additional/YfmHtmlBlock/types.ts"],"names":[],"mappings":"","sourcesContent":["export type YfmHtmlBlockEntitySharedState = {\n editing: boolean;\n};\n"]}
@@ -1,6 +1,7 @@
1
1
  import type { ExtensionAuto, ExtensionDeps } from "../../../core/index.js";
2
2
  import type { AutocompleteItem } from "./types.js";
3
3
  export { openAutocomplete, closeAutocomplete } from 'prosemirror-autocomplete';
4
+ export { getAutocompleteState } from "./utils.js";
4
5
  export declare const AutocompleteDecoClassName = "autocomplete";
5
6
  export type AutocompleteItemFn = (deps: ExtensionDeps) => AutocompleteItem;
6
7
  export * from "./types.js";
@@ -1,8 +1,9 @@
1
- import autocomplete from 'prosemirror-autocomplete';
1
+ import { autocomplete } from 'prosemirror-autocomplete';
2
2
  import { Plugin } from 'prosemirror-state';
3
3
  import { isFunction } from "../../../lodash.js";
4
4
  import { MainHandler } from "./handler.js";
5
5
  export { openAutocomplete, closeAutocomplete } from 'prosemirror-autocomplete';
6
+ export { getAutocompleteState } from "./utils.js";
6
7
  export const AutocompleteDecoClassName = 'autocomplete';
7
8
  export * from "./types.js";
8
9
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAGzC,OAAO,EAAC,UAAU,EAAC,2BAAwB;AAE3C,OAAO,EAAC,WAAW,EAAC,qBAAkB;AAGtC,OAAO,EAAC,gBAAgB,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAC7E,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAc,CAAC;AAGxD,2BAAwB;AAMxB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAkB,CAAC,OAAO,EAAE,EAAE;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyC,CAAC;IACjE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAE7C,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;QACvB,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAqB,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAChF,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,YAAY,CAAC;YACzB,QAAQ;YACR,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACpC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YACxC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;SACzC,CAAC,CAAC;QAEH;;;WAGG;QACH,OAAO,OAAO,CAAC,MAAM,CACjB,IAAI,MAAM,CAAC;YACP,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;gBACT,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE;aACrC,CAAC;SACL,CAAC,CACL,CAAC;IACN,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC,CAAC","sourcesContent":["import autocomplete from 'prosemirror-autocomplete';\nimport {Plugin} from 'prosemirror-state';\n\nimport type {ExtensionAuto, ExtensionDeps} from '../../../core';\nimport {isFunction} from '../../../lodash';\n\nimport {MainHandler} from './handler';\nimport type {AutocompleteItem, AutocompleteTrigger} from './types';\n\nexport {openAutocomplete, closeAutocomplete} from 'prosemirror-autocomplete';\nexport const AutocompleteDecoClassName = 'autocomplete';\n\nexport type AutocompleteItemFn = (deps: ExtensionDeps) => AutocompleteItem;\nexport * from './types';\n\ntype Storage = {\n add(item: AutocompleteItem | AutocompleteItemFn): Storage;\n};\n\n/**\n * This extension is wrapper of _prosemirror-autocomplete_\n * You only need to use it once.\n * Don't add this extension many times with different options.\n * Don't import anything from the _prosemirror-autocomplete_ source package.\n * Everything you need is exported from this module.\n */\nexport const Autocomplete: ExtensionAuto = (builder) => {\n const storage = new Set<AutocompleteItem | AutocompleteItemFn>();\n builder.context.set('autocomplete', storage);\n\n builder.addPlugin((deps) => {\n const triggers: AutocompleteTrigger[] = [];\n const config: AutocompleteItem[] = [];\n for (const itemOrFn of storage) {\n const item: AutocompleteItem = isFunction(itemOrFn) ? itemOrFn(deps) : itemOrFn;\n triggers.push(item.trigger);\n config.push(item);\n }\n\n const handler = new MainHandler(config, builder.logger);\n const plugins = autocomplete({\n triggers,\n onOpen: handler.onOpen.bind(handler),\n onClose: handler.onClose.bind(handler),\n onFilter: handler.onFilter.bind(handler),\n onArrow: handler.onArrow.bind(handler),\n onEnter: handler.onEnter.bind(handler),\n });\n\n /**\n * BugFix: because _prosemirror-autocomplete_ does not handle the destruction of the view,\n * we have to handle it ourselves\n */\n return plugins.concat(\n new Plugin({\n view: () => ({\n destroy: () => handler.onDestroy(),\n }),\n }),\n );\n }, builder.Priority.VeryHigh);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {\n autocomplete: Storage;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AAGzC,OAAO,EAAC,UAAU,EAAC,2BAAwB;AAE3C,OAAO,EAAC,WAAW,EAAC,qBAAkB;AAGtC,OAAO,EAAC,gBAAgB,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAC,oBAAoB,EAAC,mBAAgB;AAC7C,MAAM,CAAC,MAAM,yBAAyB,GAAG,cAAc,CAAC;AAGxD,2BAAwB;AAMxB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAkB,CAAC,OAAO,EAAE,EAAE;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyC,CAAC;IACjE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAE7C,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;QACvB,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAqB,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAChF,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,YAAY,CAAC;YACzB,QAAQ;YACR,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACpC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YACxC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;SACzC,CAAC,CAAC;QAEH;;;WAGG;QACH,OAAO,OAAO,CAAC,MAAM,CACjB,IAAI,MAAM,CAAC;YACP,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;gBACT,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE;aACrC,CAAC;SACL,CAAC,CACL,CAAC;IACN,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC,CAAC","sourcesContent":["import {autocomplete} from 'prosemirror-autocomplete';\nimport {Plugin} from 'prosemirror-state';\n\nimport type {ExtensionAuto, ExtensionDeps} from '../../../core';\nimport {isFunction} from '../../../lodash';\n\nimport {MainHandler} from './handler';\nimport type {AutocompleteItem, AutocompleteTrigger} from './types';\n\nexport {openAutocomplete, closeAutocomplete} from 'prosemirror-autocomplete';\nexport {getAutocompleteState} from './utils';\nexport const AutocompleteDecoClassName = 'autocomplete';\n\nexport type AutocompleteItemFn = (deps: ExtensionDeps) => AutocompleteItem;\nexport * from './types';\n\ntype Storage = {\n add(item: AutocompleteItem | AutocompleteItemFn): Storage;\n};\n\n/**\n * This extension is wrapper of _prosemirror-autocomplete_\n * You only need to use it once.\n * Don't add this extension many times with different options.\n * Don't import anything from the _prosemirror-autocomplete_ source package.\n * Everything you need is exported from this module.\n */\nexport const Autocomplete: ExtensionAuto = (builder) => {\n const storage = new Set<AutocompleteItem | AutocompleteItemFn>();\n builder.context.set('autocomplete', storage);\n\n builder.addPlugin((deps) => {\n const triggers: AutocompleteTrigger[] = [];\n const config: AutocompleteItem[] = [];\n for (const itemOrFn of storage) {\n const item: AutocompleteItem = isFunction(itemOrFn) ? itemOrFn(deps) : itemOrFn;\n triggers.push(item.trigger);\n config.push(item);\n }\n\n const handler = new MainHandler(config, builder.logger);\n const plugins = autocomplete({\n triggers,\n onOpen: handler.onOpen.bind(handler),\n onClose: handler.onClose.bind(handler),\n onFilter: handler.onFilter.bind(handler),\n onArrow: handler.onArrow.bind(handler),\n onEnter: handler.onEnter.bind(handler),\n });\n\n /**\n * BugFix: because _prosemirror-autocomplete_ does not handle the destruction of the view,\n * we have to handle it ourselves\n */\n return plugins.concat(\n new Plugin({\n view: () => ({\n destroy: () => handler.onDestroy(),\n }),\n }),\n );\n }, builder.Priority.VeryHigh);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {\n autocomplete: Storage;\n }\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { Options, Trigger } from 'prosemirror-autocomplete';
2
- export type { FromTo, AutocompleteAction, Trigger as AutocompleteTrigger, } from 'prosemirror-autocomplete';
2
+ export type { FromTo, AutocompleteAction, AutocompleteState, Trigger as AutocompleteTrigger, } from 'prosemirror-autocomplete';
3
3
  export { ActionKind as AutocompleteActionKind } from 'prosemirror-autocomplete';
4
4
  export interface AutocompleteHandler extends Pick<Options, 'onArrow' | 'onClose' | 'onEnter' | 'onFilter' | 'onOpen'> {
5
5
  onDestroy?: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/types.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,UAAU,IAAI,sBAAsB,EAAC,MAAM,0BAA0B,CAAC","sourcesContent":["import type {Options, Trigger} from 'prosemirror-autocomplete';\n\nexport type {\n FromTo,\n AutocompleteAction,\n Trigger as AutocompleteTrigger,\n} from 'prosemirror-autocomplete';\n\nexport {ActionKind as AutocompleteActionKind} from 'prosemirror-autocomplete';\n\nexport interface AutocompleteHandler\n extends Pick<Options, 'onArrow' | 'onClose' | 'onEnter' | 'onFilter' | 'onOpen'> {\n onDestroy?: () => void;\n}\n\nexport type AutocompleteItem = {trigger: Trigger; handler: AutocompleteHandler};\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/types.ts"],"names":[],"mappings":"AASA,OAAO,EAAC,UAAU,IAAI,sBAAsB,EAAC,MAAM,0BAA0B,CAAC","sourcesContent":["import type {Options, Trigger} from 'prosemirror-autocomplete';\n\nexport type {\n FromTo,\n AutocompleteAction,\n AutocompleteState,\n Trigger as AutocompleteTrigger,\n} from 'prosemirror-autocomplete';\n\nexport {ActionKind as AutocompleteActionKind} from 'prosemirror-autocomplete';\n\nexport interface AutocompleteHandler\n extends Pick<Options, 'onArrow' | 'onClose' | 'onEnter' | 'onFilter' | 'onOpen'> {\n onDestroy?: () => void;\n}\n\nexport type AutocompleteItem = {trigger: Trigger; handler: AutocompleteHandler};\n"]}
@@ -0,0 +1,3 @@
1
+ import type { EditorState } from "../../../pm/state.js";
2
+ import type { AutocompleteState } from "./types.js";
3
+ export declare function getAutocompleteState(state: EditorState): AutocompleteState | null;
@@ -0,0 +1,5 @@
1
+ import { pluginKey } from 'prosemirror-autocomplete';
2
+ export function getAutocompleteState(state) {
3
+ return pluginKey.getState(state) || null;
4
+ }
5
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAC;AAMnD,MAAM,UAAU,oBAAoB,CAAC,KAAkB;IACnD,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AAC7C,CAAC","sourcesContent":["import {pluginKey} from 'prosemirror-autocomplete';\n\nimport type {EditorState} from '#pm/state';\n\nimport type {AutocompleteState} from './types';\n\nexport function getAutocompleteState(state: EditorState): AutocompleteState | null {\n return pluginKey.getState(state) || null;\n}\n"]}
@@ -1,4 +1,10 @@
1
- import type { EditorState } from 'prosemirror-state';
1
+ import { type EditorState, Plugin } from "../../../pm/state.js";
2
2
  export declare function isInsideCode(state: EditorState): false | 'block' | 'inline';
3
3
  export declare function isInsideBlockCode(state: EditorState): boolean;
4
4
  export declare function isInsideInlineCode(state: EditorState): boolean;
5
+ /**
6
+ * This plugin handles paste into any type of code: code block or code mark.
7
+ * If selection is inside code, it always prevents execution of all next paste handlers.
8
+ * It takes a value from following clipboard data types: uri-list, files or text data.
9
+ */
10
+ export declare const handlePasteIntoCodePlugin: () => Plugin<any>;
@@ -1,3 +1,7 @@
1
+ import dd from 'ts-dedent';
2
+ import { getLoggerFromState } from "../../../core/index.js";
3
+ import { Plugin } from "../../../pm/state.js";
4
+ import { DataTransferType, isFilesOnly, isIosSafariShare } from "./utils.js";
1
5
  const isCodeMark = (mark) => mark.type.spec.code;
2
6
  export function isInsideCode(state) {
3
7
  if (isInsideBlockCode(state))
@@ -19,4 +23,57 @@ export function isInsideInlineCode(state) {
19
23
  }
20
24
  return fromHasCodeMark;
21
25
  }
26
+ /**
27
+ * This plugin handles paste into any type of code: code block or code mark.
28
+ * If selection is inside code, it always prevents execution of all next paste handlers.
29
+ * It takes a value from following clipboard data types: uri-list, files or text data.
30
+ */
31
+ export const handlePasteIntoCodePlugin = () => {
32
+ return new Plugin({
33
+ props: {
34
+ handleDOMEvents: {
35
+ paste(view, event) {
36
+ if (!event.clipboardData)
37
+ return false;
38
+ const { clipboardData } = event;
39
+ const codeType = isInsideCode(view.state);
40
+ if (!codeType)
41
+ return false;
42
+ let text;
43
+ let dataFormat;
44
+ if (isIosSafariShare(clipboardData)) {
45
+ dataFormat = DataTransferType.UriList;
46
+ text = clipboardData.getData(DataTransferType.UriList);
47
+ }
48
+ else if (isFilesOnly(clipboardData)) {
49
+ dataFormat = DataTransferType.Files;
50
+ text = Array.from(clipboardData.files)
51
+ .map((file) => file.name)
52
+ .join(' ');
53
+ }
54
+ else {
55
+ dataFormat = DataTransferType.Text;
56
+ text = dd(clipboardData.getData(DataTransferType.Text));
57
+ }
58
+ if (codeType === 'inline') {
59
+ text = text.replaceAll('\n', '↵');
60
+ }
61
+ const { state, dispatch } = view;
62
+ getLoggerFromState(state).event({
63
+ codeType,
64
+ dataFormat,
65
+ domEvent: 'paste',
66
+ event: 'paste-into-code',
67
+ dataTypes: clipboardData.types,
68
+ });
69
+ event.preventDefault();
70
+ dispatch(state.tr
71
+ .replaceSelectionWith(state.schema.text(text), true)
72
+ .scrollIntoView());
73
+ return true;
74
+ },
75
+ },
76
+ },
77
+ });
78
+ };
22
79
  //# sourceMappingURL=code.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"code.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/code.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAEvD,MAAM,UAAU,YAAY,CAAC,KAAkB;IAC3C,IAAI,iBAAiB,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAC7C,IAAI,kBAAkB,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC/C,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IAChD,mCAAmC;IACnC,8EAA8E;IAC9E,OAAO,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAkB;IACjD,yBAAyB;IACzB,MAAM,eAAe,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvE,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,eAAe,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,eAAe,CAAC;AAC3B,CAAC","sourcesContent":["import type {Mark} from 'prosemirror-model';\nimport type {EditorState} from 'prosemirror-state';\n\nconst isCodeMark = (mark: Mark) => mark.type.spec.code;\n\nexport function isInsideCode(state: EditorState): false | 'block' | 'inline' {\n if (isInsideBlockCode(state)) return 'block';\n if (isInsideInlineCode(state)) return 'inline';\n return false;\n}\n\nexport function isInsideBlockCode(state: EditorState): boolean {\n // it is enough to check only $from\n // when pasting, the content is inserted into a block with the type from $from\n return Boolean(state.selection.$from.parent.type.spec.code);\n}\n\nexport function isInsideInlineCode(state: EditorState): boolean {\n // same as for block code\n const fromHasCodeMark = state.selection.$from.marks().some(isCodeMark);\n if (state.selection.empty) {\n return fromHasCodeMark || (state.storedMarks ?? []).some(isCodeMark);\n }\n return fromHasCodeMark;\n}\n"]}
1
+ {"version":3,"file":"code.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/code.ts"],"names":[],"mappings":"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","sourcesContent":["import dd from 'ts-dedent';\n\nimport {getLoggerFromState} from '#core';\nimport type {Mark} from '#pm/model';\nimport {type EditorState, Plugin} from '#pm/state';\n\nimport {DataTransferType, isFilesOnly, isIosSafariShare} from './utils';\n\nconst isCodeMark = (mark: Mark) => mark.type.spec.code;\n\nexport function isInsideCode(state: EditorState): false | 'block' | 'inline' {\n if (isInsideBlockCode(state)) return 'block';\n if (isInsideInlineCode(state)) return 'inline';\n return false;\n}\n\nexport function isInsideBlockCode(state: EditorState): boolean {\n // it is enough to check only $from\n // when pasting, the content is inserted into a block with the type from $from\n return Boolean(state.selection.$from.parent.type.spec.code);\n}\n\nexport function isInsideInlineCode(state: EditorState): boolean {\n // same as for block code\n const fromHasCodeMark = state.selection.$from.marks().some(isCodeMark);\n if (state.selection.empty) {\n return fromHasCodeMark || (state.storedMarks ?? []).some(isCodeMark);\n }\n return fromHasCodeMark;\n}\n\n/**\n * This plugin handles paste into any type of code: code block or code mark.\n * If selection is inside code, it always prevents execution of all next paste handlers.\n * It takes a value from following clipboard data types: uri-list, files or text data.\n */\nexport const handlePasteIntoCodePlugin = () => {\n return new Plugin({\n props: {\n handleDOMEvents: {\n paste(view, event) {\n if (!event.clipboardData) return false;\n const {clipboardData} = event;\n\n const codeType = isInsideCode(view.state);\n if (!codeType) return false;\n\n let text: string;\n let dataFormat: string;\n\n if (isIosSafariShare(clipboardData)) {\n dataFormat = DataTransferType.UriList;\n text = clipboardData.getData(DataTransferType.UriList);\n } else if (isFilesOnly(clipboardData)) {\n dataFormat = DataTransferType.Files;\n text = Array.from(clipboardData.files)\n .map((file) => file.name)\n .join(' ');\n } else {\n dataFormat = DataTransferType.Text;\n text = dd(clipboardData.getData(DataTransferType.Text));\n }\n\n if (codeType === 'inline') {\n text = text.replaceAll('\\n', '↵');\n }\n\n const {state, dispatch} = view;\n\n getLoggerFromState(state).event({\n codeType,\n dataFormat,\n domEvent: 'paste',\n event: 'paste-into-code',\n dataTypes: clipboardData.types,\n });\n\n event.preventDefault();\n dispatch(\n state.tr\n .replaceSelectionWith(state.schema.text(text), true)\n .scrollIntoView(),\n );\n\n return true;\n },\n },\n },\n });\n};\n"]}
@@ -1,4 +1,5 @@
1
1
  import { clipboard } from "./clipboard.js";
2
+ import { handlePasteIntoCodePlugin } from "./code.js";
2
3
  import * as clipboardUtils from "./utils.js";
3
4
  export { clipboardUtils };
4
5
  export const Clipboard = (builder, opts) => {
@@ -12,5 +13,6 @@ export const Clipboard = (builder, opts) => {
12
13
  serializer: deps.serializer,
13
14
  pasteFileHandler: opts.pasteFileHandler,
14
15
  }), builder.Priority.VeryLow);
16
+ builder.addPlugin(handlePasteIntoCodePlugin, builder.Priority.Highest);
15
17
  };
16
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,SAAS,EAAC,uBAAoB;AACnE,OAAO,KAAK,cAAc,mBAAgB;AAE1C,OAAO,EAAC,cAAc,EAAC,CAAC;AAIxB,MAAM,CAAC,MAAM,SAAS,GAAoC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACxE,OAAO,CAAC,SAAS,CACb,CAAC,IAAI,EAAE,EAAE,CACL,SAAS,CAAC;QACN,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YAC1B,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,WAAW;SACtB,CAAC;QACF,QAAQ,EAAE,IAAI,CAAC,YAAY;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KAC1C,CAAC,EACN,OAAO,CAAC,QAAQ,CAAC,OAAO,CAC3B,CAAC;AACN,CAAC,CAAC","sourcesContent":["import type {ExtensionAuto} from '../../../core';\n\nimport {type ClipboardPluginOptions, clipboard} from './clipboard';\nimport * as clipboardUtils from './utils';\n\nexport {clipboardUtils};\n\nexport type ClipboardOptions = Pick<ClipboardPluginOptions, 'pasteFileHandler'>;\n\nexport const Clipboard: ExtensionAuto<ClipboardOptions> = (builder, opts) => {\n builder.addPlugin(\n (deps) =>\n clipboard({\n logger: builder.logger.nested({\n module: 'clipboard',\n plugin: 'clipboard',\n }),\n mdParser: deps.markupParser,\n textParser: deps.textParser,\n serializer: deps.serializer,\n pasteFileHandler: opts.pasteFileHandler,\n }),\n builder.Priority.VeryLow,\n );\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,SAAS,EAAC,uBAAoB;AACnE,OAAO,EAAC,yBAAyB,EAAC,kBAAe;AACjD,OAAO,KAAK,cAAc,mBAAgB;AAE1C,OAAO,EAAC,cAAc,EAAC,CAAC;AAIxB,MAAM,CAAC,MAAM,SAAS,GAAoC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACxE,OAAO,CAAC,SAAS,CACb,CAAC,IAAI,EAAE,EAAE,CACL,SAAS,CAAC;QACN,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YAC1B,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,WAAW;SACtB,CAAC;QACF,QAAQ,EAAE,IAAI,CAAC,YAAY;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KAC1C,CAAC,EACN,OAAO,CAAC,QAAQ,CAAC,OAAO,CAC3B,CAAC;IAEF,OAAO,CAAC,SAAS,CAAC,yBAAyB,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3E,CAAC,CAAC","sourcesContent":["import type {ExtensionAuto} from '#core';\n\nimport {type ClipboardPluginOptions, clipboard} from './clipboard';\nimport {handlePasteIntoCodePlugin} from './code';\nimport * as clipboardUtils from './utils';\n\nexport {clipboardUtils};\n\nexport type ClipboardOptions = Pick<ClipboardPluginOptions, 'pasteFileHandler'>;\n\nexport const Clipboard: ExtensionAuto<ClipboardOptions> = (builder, opts) => {\n builder.addPlugin(\n (deps) =>\n clipboard({\n logger: builder.logger.nested({\n module: 'clipboard',\n plugin: 'clipboard',\n }),\n mdParser: deps.markupParser,\n textParser: deps.textParser,\n serializer: deps.serializer,\n pasteFileHandler: opts.pasteFileHandler,\n }),\n builder.Priority.VeryLow,\n );\n\n builder.addPlugin(handlePasteIntoCodePlugin, builder.Priority.Highest);\n};\n"]}
@@ -2,7 +2,7 @@ import { isFunction } from "../../../lodash.js";
2
2
  import { globalLogger } from "../../../logger.js";
3
3
  import { AutocompletePopupCloser } from "../../../utils/autocomplete-popup.js";
4
4
  import { ArrayCarousel } from "../../../utils/carousel/index.js";
5
- import { AutocompleteActionKind, closeAutocomplete, } from "../Autocomplete/index.js";
5
+ import { AutocompleteActionKind, closeAutocomplete, getAutocompleteState, } from "../Autocomplete/index.js";
6
6
  import { getReactRendererFromState } from "../ReactRenderer/index.js";
7
7
  import { render } from "./component.js";
8
8
  import { findDecoElem } from "./utils.js";
@@ -14,7 +14,6 @@ export class CommandHandler {
14
14
  #filteredActionsCarousel;
15
15
  #view;
16
16
  #anchor = null;
17
- #range;
18
17
  #filterText;
19
18
  #popupCloser;
20
19
  #menuProps;
@@ -101,13 +100,16 @@ export class CommandHandler {
101
100
  return (parentType.spec.commandMenu === false || this.#nodesIgnoreList.includes(parentType.name));
102
101
  }
103
102
  select() {
104
- if (!this.#view || !this.#range)
103
+ if (!this.#view)
105
104
  return;
106
105
  const action = this.#filteredActionsCarousel?.currentItem;
107
106
  if (!action)
108
107
  return;
108
+ const autocompleteState = getAutocompleteState(this.#view.state);
109
+ if (!autocompleteState || !autocompleteState.active)
110
+ return;
109
111
  const view = this.#view;
110
- const range = this.#range;
112
+ const { range } = autocompleteState;
111
113
  view.dispatch(view.state.tr.deleteRange(range.from, range.to).scrollIntoView());
112
114
  action.exec(this.#actionStorage);
113
115
  view.focus();
@@ -153,13 +155,11 @@ export class CommandHandler {
153
155
  }
154
156
  this.#view?.focus();
155
157
  };
156
- updateState({ view, range }) {
158
+ updateState({ view }) {
157
159
  this.#view = view;
158
- this.#range = range;
159
160
  }
160
161
  clear() {
161
162
  this.#view = undefined;
162
- this.#range = undefined;
163
163
  this.#anchor = null;
164
164
  this.#filterText = undefined;
165
165
  this.#filteredActionsCarousel = undefined;