@gravity-ui/markdown-editor 15.22.2 → 15.24.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 (188) hide show
  1. package/build/cjs/bundle/ToolbarView.js +2 -1
  2. package/build/cjs/bundle/ToolbarView.js.map +1 -1
  3. package/build/cjs/bundle/settings/index.d.ts +2 -1
  4. package/build/cjs/bundle/settings/index.js +6 -2
  5. package/build/cjs/bundle/settings/index.js.map +1 -1
  6. package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.js +4 -1
  7. package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
  8. package/build/cjs/common/layout.d.ts +3 -0
  9. package/build/cjs/common/layout.js +7 -0
  10. package/build/cjs/common/layout.js.map +1 -0
  11. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.d.ts +1 -1
  12. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +2 -2
  13. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
  14. package/build/cjs/extensions/markdown/Table/commands.d.ts +2 -0
  15. package/build/cjs/extensions/markdown/Table/commands.js +73 -0
  16. package/build/cjs/extensions/markdown/Table/commands.js.map +1 -0
  17. package/build/cjs/extensions/markdown/Table/helpers.d.ts +7 -2
  18. package/build/cjs/extensions/markdown/Table/helpers.js +22 -9
  19. package/build/cjs/extensions/markdown/Table/helpers.js.map +1 -1
  20. package/build/cjs/extensions/markdown/Table/index.js +3 -0
  21. package/build/cjs/extensions/markdown/Table/index.js.map +1 -1
  22. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js +35 -0
  23. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
  24. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.d.ts +1 -0
  25. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.js +1 -0
  26. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.js.map +1 -1
  27. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +3 -0
  28. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
  29. package/build/cjs/extensions/yfm/ImgSize/utils.d.ts +6 -0
  30. package/build/cjs/extensions/yfm/ImgSize/utils.js +25 -0
  31. package/build/cjs/extensions/yfm/ImgSize/utils.js.map +1 -1
  32. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/const.d.ts +5 -0
  33. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/const.js +6 -1
  34. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/const.js.map +1 -1
  35. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/index.d.ts +1 -1
  36. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/index.js +2 -1
  37. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/index.js.map +1 -1
  38. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.d.ts +1 -1
  39. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +6 -6
  40. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
  41. package/build/cjs/extensions/yfm/YfmCut/actions/toYfmCut.d.ts +1 -1
  42. package/build/cjs/extensions/yfm/YfmCut/actions/toYfmCut.js +6 -6
  43. package/build/cjs/extensions/yfm/YfmCut/actions/toYfmCut.js.map +1 -1
  44. package/build/cjs/extensions/yfm/YfmCut/const.d.ts +9 -1
  45. package/build/cjs/extensions/yfm/YfmCut/const.js +13 -6
  46. package/build/cjs/extensions/yfm/YfmCut/const.js.map +1 -1
  47. package/build/cjs/extensions/yfm/YfmCut/index.css +0 -3
  48. package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.css +6 -5
  49. package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.d.ts +5 -2
  50. package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js +26 -9
  51. package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js.map +1 -1
  52. package/build/cjs/extensions/yfm/YfmCut/plugins/active.d.ts +1 -1
  53. package/build/cjs/extensions/yfm/YfmCut/plugins/active.js +6 -7
  54. package/build/cjs/extensions/yfm/YfmCut/plugins/active.js.map +1 -1
  55. package/build/cjs/extensions/yfm/YfmCut/plugins/auto-open.d.ts +1 -1
  56. package/build/cjs/extensions/yfm/YfmCut/plugins/auto-open.js +8 -9
  57. package/build/cjs/extensions/yfm/YfmCut/plugins/auto-open.js.map +1 -1
  58. package/build/cjs/extensions/yfm/YfmTable/commands/backspace.d.ts +1 -1
  59. package/build/cjs/extensions/yfm/YfmTable/commands/backspace.js +61 -84
  60. package/build/cjs/extensions/yfm/YfmTable/commands/backspace.js.map +1 -1
  61. package/build/cjs/i18n/search/en.json +5 -2
  62. package/build/cjs/i18n/search/index.d.ts +4 -1
  63. package/build/cjs/i18n/search/ru.json +5 -2
  64. package/build/cjs/markup/codemirror/search-plugin/plugin.d.ts +2 -0
  65. package/build/cjs/markup/codemirror/search-plugin/plugin.js +13 -0
  66. package/build/cjs/markup/codemirror/search-plugin/plugin.js.map +1 -1
  67. package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.d.ts +3 -0
  68. package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.js +9 -0
  69. package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.js.map +1 -0
  70. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.css +1 -0
  71. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.d.ts +2 -0
  72. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.js +12 -2
  73. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.js.map +1 -1
  74. package/build/cjs/react-utils/index.d.ts +1 -0
  75. package/build/cjs/react-utils/index.js +1 -0
  76. package/build/cjs/react-utils/index.js.map +1 -1
  77. package/build/cjs/react-utils/useSticky.js +13 -2
  78. package/build/cjs/react-utils/useSticky.js.map +1 -1
  79. package/build/cjs/react-utils/useTargetZIndex.d.ts +1 -0
  80. package/build/cjs/react-utils/useTargetZIndex.js +50 -0
  81. package/build/cjs/react-utils/useTargetZIndex.js.map +1 -0
  82. package/build/cjs/toolbar/ToolbarListButton.js +4 -1
  83. package/build/cjs/toolbar/ToolbarListButton.js.map +1 -1
  84. package/build/cjs/utils/get-target-z-index.d.ts +1 -0
  85. package/build/cjs/utils/get-target-z-index.js +17 -0
  86. package/build/cjs/utils/get-target-z-index.js.map +1 -0
  87. package/build/cjs/utils/inputrules.d.ts +1 -0
  88. package/build/cjs/utils/inputrules.js +8 -3
  89. package/build/cjs/utils/inputrules.js.map +1 -1
  90. package/build/cjs/utils/rulebuilders.js +2 -0
  91. package/build/cjs/utils/rulebuilders.js.map +1 -1
  92. package/build/cjs/version.js +1 -1
  93. package/build/cjs/version.js.map +1 -1
  94. package/build/esm/bundle/ToolbarView.js +2 -1
  95. package/build/esm/bundle/ToolbarView.js.map +1 -1
  96. package/build/esm/bundle/settings/index.d.ts +2 -1
  97. package/build/esm/bundle/settings/index.js +6 -2
  98. package/build/esm/bundle/settings/index.js.map +1 -1
  99. package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js +4 -1
  100. package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
  101. package/build/esm/common/layout.d.ts +3 -0
  102. package/build/esm/common/layout.js +4 -0
  103. package/build/esm/common/layout.js.map +1 -0
  104. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.d.ts +1 -1
  105. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +1 -1
  106. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
  107. package/build/esm/extensions/markdown/Table/commands.d.ts +2 -0
  108. package/build/esm/extensions/markdown/Table/commands.js +69 -0
  109. package/build/esm/extensions/markdown/Table/commands.js.map +1 -0
  110. package/build/esm/extensions/markdown/Table/helpers.d.ts +7 -2
  111. package/build/esm/extensions/markdown/Table/helpers.js +9 -3
  112. package/build/esm/extensions/markdown/Table/helpers.js.map +1 -1
  113. package/build/esm/extensions/markdown/Table/index.js +3 -0
  114. package/build/esm/extensions/markdown/Table/index.js.map +1 -1
  115. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js +36 -1
  116. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
  117. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.d.ts +1 -0
  118. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.js +1 -0
  119. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.js.map +1 -1
  120. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +3 -0
  121. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
  122. package/build/esm/extensions/yfm/ImgSize/utils.d.ts +6 -0
  123. package/build/esm/extensions/yfm/ImgSize/utils.js +22 -0
  124. package/build/esm/extensions/yfm/ImgSize/utils.js.map +1 -1
  125. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.d.ts +5 -0
  126. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.js +5 -0
  127. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.js.map +1 -1
  128. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.d.ts +1 -1
  129. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.js +1 -1
  130. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.js.map +1 -1
  131. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.d.ts +1 -1
  132. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +7 -7
  133. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
  134. package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.d.ts +1 -1
  135. package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.js +5 -5
  136. package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.js.map +1 -1
  137. package/build/esm/extensions/yfm/YfmCut/const.d.ts +9 -1
  138. package/build/esm/extensions/yfm/YfmCut/const.js +8 -1
  139. package/build/esm/extensions/yfm/YfmCut/const.js.map +1 -1
  140. package/build/esm/extensions/yfm/YfmCut/index.css +0 -3
  141. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.css +6 -5
  142. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.d.ts +5 -2
  143. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js +26 -9
  144. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js.map +1 -1
  145. package/build/esm/extensions/yfm/YfmCut/plugins/active.d.ts +1 -1
  146. package/build/esm/extensions/yfm/YfmCut/plugins/active.js +4 -5
  147. package/build/esm/extensions/yfm/YfmCut/plugins/active.js.map +1 -1
  148. package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.d.ts +1 -1
  149. package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.js +6 -7
  150. package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.js.map +1 -1
  151. package/build/esm/extensions/yfm/YfmTable/commands/backspace.d.ts +1 -1
  152. package/build/esm/extensions/yfm/YfmTable/commands/backspace.js +60 -83
  153. package/build/esm/extensions/yfm/YfmTable/commands/backspace.js.map +1 -1
  154. package/build/esm/i18n/search/en.json +5 -2
  155. package/build/esm/i18n/search/index.d.ts +4 -1
  156. package/build/esm/i18n/search/ru.json +5 -2
  157. package/build/esm/markup/codemirror/search-plugin/plugin.d.ts +2 -0
  158. package/build/esm/markup/codemirror/search-plugin/plugin.js +14 -1
  159. package/build/esm/markup/codemirror/search-plugin/plugin.js.map +1 -1
  160. package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.d.ts +3 -0
  161. package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.js +4 -0
  162. package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.js.map +1 -0
  163. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.css +1 -0
  164. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.d.ts +2 -0
  165. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.js +12 -2
  166. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.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/useSticky.js +13 -2
  171. package/build/esm/react-utils/useSticky.js.map +1 -1
  172. package/build/esm/react-utils/useTargetZIndex.d.ts +1 -0
  173. package/build/esm/react-utils/useTargetZIndex.js +47 -0
  174. package/build/esm/react-utils/useTargetZIndex.js.map +1 -0
  175. package/build/esm/toolbar/ToolbarListButton.js +4 -1
  176. package/build/esm/toolbar/ToolbarListButton.js.map +1 -1
  177. package/build/esm/utils/get-target-z-index.d.ts +1 -0
  178. package/build/esm/utils/get-target-z-index.js +14 -0
  179. package/build/esm/utils/get-target-z-index.js.map +1 -0
  180. package/build/esm/utils/inputrules.d.ts +1 -0
  181. package/build/esm/utils/inputrules.js +5 -1
  182. package/build/esm/utils/inputrules.js.map +1 -1
  183. package/build/esm/utils/rulebuilders.js +3 -1
  184. package/build/esm/utils/rulebuilders.js.map +1 -1
  185. package/build/esm/version.js +1 -1
  186. package/build/esm/version.js.map +1 -1
  187. package/build/styles.css +7 -8
  188. package/package.json +2 -2
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.YfmCutTitleNodeView = void 0;
4
+ const const_1 = require("../const.js");
4
5
  require("./yfm-cut-title.css");
5
6
  class YfmCutTitleNodeView {
6
7
  dom;
@@ -9,15 +10,11 @@ class YfmCutTitleNodeView {
9
10
  constructor(node) {
10
11
  this.node = node;
11
12
  this.dom = document.createElement('div');
12
- this.dom.classList.add('yfm-cut-title');
13
- this.dom.replaceChildren((this.contentDOM = document.createElement('div')));
14
- this.contentDOM.classList.add('g-md-yfm-cut-title-inner');
15
- this.contentDOM.addEventListener('click', (e) => {
16
- // ignore clicking on the title content
17
- // you can open/close yfm-cut by clicking on the arrow icon
18
- e.stopPropagation();
19
- e.preventDefault();
20
- });
13
+ this.dom.classList.add(const_1.YfmCutClassName.Title);
14
+ this.dom.addEventListener('click', this._onTitleClick);
15
+ this.contentDOM = this.dom.appendChild(document.createElement('div'));
16
+ this.contentDOM.classList.add(const_1.YfmCutClassName.TitleInner);
17
+ this.contentDOM.addEventListener('click', this._onTitleInnerClick);
21
18
  }
22
19
  update(node) {
23
20
  if (this.node.type !== node.type)
@@ -25,6 +22,26 @@ class YfmCutTitleNodeView {
25
22
  this.node = node;
26
23
  return true;
27
24
  }
25
+ destroy() {
26
+ this.dom.removeEventListener('click', this._onTitleClick);
27
+ this.contentDOM.removeEventListener('click', this._onTitleInnerClick);
28
+ }
29
+ _onTitleClick = (e) => {
30
+ const { currentTarget } = e;
31
+ if (currentTarget instanceof HTMLElement) {
32
+ const parent = currentTarget.parentElement;
33
+ if (parent?.classList.contains(const_1.YfmCutClassName.Cut)) {
34
+ // TODO: toggle open classname via prosemirror decoration
35
+ parent.classList.toggle(const_1.YfmCutClassName.Open);
36
+ }
37
+ }
38
+ };
39
+ _onTitleInnerClick = (e) => {
40
+ // ignore clicking on the title content
41
+ // you can open/close yfm-cut by clicking on the arrow icon
42
+ e.stopPropagation();
43
+ e.preventDefault();
44
+ };
28
45
  }
29
46
  exports.YfmCutTitleNodeView = YfmCutTitleNodeView;
30
47
  //# sourceMappingURL=yfm-cut-title.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"yfm-cut-title.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/nodeviews/yfm-cut-title.ts"],"names":[],"mappings":";;;AAGA,+BAA8B;AAE9B,MAAa,mBAAmB;IACnB,GAAG,CAAc;IACjB,UAAU,CAAc;IAEzB,IAAI,CAAO;IAEnB,YAAY,IAAU;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YAC5C,uCAAuC;YACvC,2DAA2D;YAC3D,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,CAAC,CAAC,cAAc,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,CAAC,IAAU;QACb,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AA1BD,kDA0BC","sourcesContent":["import type {Node} from 'prosemirror-model';\nimport type {NodeView} from 'prosemirror-view';\n\nimport './yfm-cut-title.scss';\n\nexport class YfmCutTitleNodeView implements NodeView {\n readonly dom: HTMLElement;\n readonly contentDOM: HTMLElement;\n\n private node: Node;\n\n constructor(node: Node) {\n this.node = node;\n\n this.dom = document.createElement('div');\n this.dom.classList.add('yfm-cut-title');\n this.dom.replaceChildren((this.contentDOM = document.createElement('div')));\n this.contentDOM.classList.add('g-md-yfm-cut-title-inner');\n this.contentDOM.addEventListener('click', (e) => {\n // ignore clicking on the title content\n // you can open/close yfm-cut by clicking on the arrow icon\n e.stopPropagation();\n e.preventDefault();\n });\n }\n\n update(node: Node): boolean {\n if (this.node.type !== node.type) return false;\n this.node = node;\n return true;\n }\n}\n"]}
1
+ {"version":3,"file":"yfm-cut-title.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/nodeviews/yfm-cut-title.ts"],"names":[],"mappings":";;;AAGA,uCAAyC;AAEzC,+BAA8B;AAE9B,MAAa,mBAAmB;IACnB,GAAG,CAAc;IACjB,UAAU,CAAc;IAEzB,IAAI,CAAO;IAEnB,YAAY,IAAU;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,uBAAe,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAEvD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,uBAAe,CAAC,UAAU,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,IAAU;QACb,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO;QACH,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1E,CAAC;IAEO,aAAa,GAAG,CAAC,CAAa,EAAE,EAAE;QACtC,MAAM,EAAC,aAAa,EAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,aAAa,YAAY,WAAW,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,CAAC;YAC3C,IAAI,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,uBAAe,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClD,yDAAyD;gBACzD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,uBAAe,CAAC,IAAI,CAAC,CAAC;YAClD,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IAEM,kBAAkB,GAAG,CAAC,CAAa,EAAE,EAAE;QAC3C,uCAAuC;QACvC,2DAA2D;QAC3D,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,CAAC,CAAC,cAAc,EAAE,CAAC;IACvB,CAAC,CAAC;CACL;AA9CD,kDA8CC","sourcesContent":["import type {Node} from '#pm/model';\nimport type {NodeView} from '#pm/view';\n\nimport {YfmCutClassName} from '../const';\n\nimport './yfm-cut-title.scss';\n\nexport class YfmCutTitleNodeView implements NodeView {\n readonly dom: HTMLElement;\n readonly contentDOM: HTMLElement;\n\n private node: Node;\n\n constructor(node: Node) {\n this.node = node;\n\n this.dom = document.createElement('div');\n this.dom.classList.add(YfmCutClassName.Title);\n this.dom.addEventListener('click', this._onTitleClick);\n\n this.contentDOM = this.dom.appendChild(document.createElement('div'));\n this.contentDOM.classList.add(YfmCutClassName.TitleInner);\n this.contentDOM.addEventListener('click', this._onTitleInnerClick);\n }\n\n update(node: Node): boolean {\n if (this.node.type !== node.type) return false;\n this.node = node;\n return true;\n }\n\n destroy() {\n this.dom.removeEventListener('click', this._onTitleClick);\n this.contentDOM.removeEventListener('click', this._onTitleInnerClick);\n }\n\n private _onTitleClick = (e: MouseEvent) => {\n const {currentTarget} = e;\n if (currentTarget instanceof HTMLElement) {\n const parent = currentTarget.parentElement;\n if (parent?.classList.contains(YfmCutClassName.Cut)) {\n // TODO: toggle open classname via prosemirror decoration\n parent.classList.toggle(YfmCutClassName.Open);\n }\n }\n };\n\n private _onTitleInnerClick = (e: MouseEvent) => {\n // ignore clicking on the title content\n // you can open/close yfm-cut by clicking on the arrow icon\n e.stopPropagation();\n e.preventDefault();\n };\n}\n"]}
@@ -1,2 +1,2 @@
1
- import { Plugin } from 'prosemirror-state';
1
+ import { Plugin } from "../../../../pm/state.js";
2
2
  export declare const cutActivePlugin: () => Plugin<any>;
@@ -1,21 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.cutActivePlugin = void 0;
4
- const prosemirror_state_1 = require("prosemirror-state");
5
- const prosemirror_view_1 = require("prosemirror-view");
4
+ const state_1 = require("../../../../pm/state.js");
5
+ const view_1 = require("../../../../pm/view.js");
6
6
  const selection_1 = require("../../../../utils/selection.js");
7
7
  const const_1 = require("../const.js");
8
- const YFM_CUT_ACTIVE_CLASSNAME = 'yfm-cut-active';
9
8
  const cutActivePlugin = () => {
10
- return new prosemirror_state_1.Plugin({
9
+ return new state_1.Plugin({
11
10
  props: {
12
11
  decorations(state) {
13
12
  const decos = [];
14
13
  const sel = state.selection;
15
14
  const yfmCutType = (0, const_1.cutType)(state.schema);
16
15
  const createDeco = ({ pos, node }) => {
17
- decos.push(prosemirror_view_1.Decoration.node(pos, pos + node.nodeSize, {
18
- class: YFM_CUT_ACTIVE_CLASSNAME,
16
+ decos.push(view_1.Decoration.node(pos, pos + node.nodeSize, {
17
+ class: const_1.YfmCutClassName.Active,
19
18
  }));
20
19
  };
21
20
  if ((0, selection_1.isNodeSelection)(sel)) {
@@ -40,7 +39,7 @@ const cutActivePlugin = () => {
40
39
  // some other selection
41
40
  findParentNodesOfType(yfmCutType, sel.$from).forEach(createDeco);
42
41
  }
43
- return decos.length ? prosemirror_view_1.DecorationSet.create(state.doc, decos) : prosemirror_view_1.DecorationSet.empty;
42
+ return decos.length ? view_1.DecorationSet.create(state.doc, decos) : view_1.DecorationSet.empty;
44
43
  },
45
44
  },
46
45
  });
@@ -1 +1 @@
1
- {"version":3,"file":"active.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/plugins/active.ts"],"names":[],"mappings":"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","sourcesContent":["import type {NodeType, ResolvedPos} from 'prosemirror-model';\nimport {Plugin} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport type {NodeWithPos} from 'prosemirror-utils';\nimport {Decoration, DecorationSet} from 'prosemirror-view';\n\nimport {isNodeSelection, isTextSelection} from '../../../../utils/selection';\nimport {cutType} from '../const';\n\nconst YFM_CUT_ACTIVE_CLASSNAME = 'yfm-cut-active';\n\nexport const cutActivePlugin = () => {\n return new Plugin({\n props: {\n decorations(state) {\n const decos: Decoration[] = [];\n const sel = state.selection;\n const yfmCutType = cutType(state.schema);\n\n const createDeco = ({pos, node}: NodeWithPos) => {\n decos.push(\n Decoration.node(pos, pos + node.nodeSize, {\n class: YFM_CUT_ACTIVE_CLASSNAME,\n }),\n );\n };\n\n if (isNodeSelection(sel)) {\n if (sel.node.type === yfmCutType) createDeco({pos: sel.from, node: sel.node});\n findParentNodesOfType(yfmCutType, sel.$from).forEach(createDeco);\n } else if (isTextSelection(sel)) {\n findParentNodesOfType(yfmCutType, sel.$from).forEach(createDeco);\n if (!sel.$from.sameParent(sel.$to)) {\n findParentNodesOfType(yfmCutType, sel.$to).forEach(createDeco);\n state.doc.nodesBetween(sel.from, sel.to, (node, pos) => {\n if (node.type === yfmCutType) createDeco({pos, node});\n if (node.isTextblock) return false;\n return true;\n });\n }\n } else {\n // some other selection\n findParentNodesOfType(yfmCutType, sel.$from).forEach(createDeco);\n }\n\n return decos.length ? DecorationSet.create(state.doc, decos) : DecorationSet.empty;\n },\n },\n });\n};\n\nfunction findParentNodesOfType(\n type: NodeType,\n $pos: ResolvedPos,\n): (NodeWithPos & {depth: number})[] {\n let {depth} = $pos;\n const nodes: (NodeWithPos & {depth: number})[] = [];\n\n while (depth >= 0) {\n const node = $pos.node(depth);\n if (node.type === type) nodes.push({depth, node, pos: $pos.before(depth)});\n depth--;\n }\n\n return nodes;\n}\n"]}
1
+ {"version":3,"file":"active.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/plugins/active.ts"],"names":[],"mappings":";;;AACA,mDAAiC;AAEjC,iDAAmD;AACnD,8DAAqE;AAErE,uCAAkD;AAE3C,MAAM,eAAe,GAAG,GAAG,EAAE;IAChC,OAAO,IAAI,cAAM,CAAC;QACd,KAAK,EAAE;YACH,WAAW,CAAC,KAAK;gBACb,MAAM,KAAK,GAAiB,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC;gBAC5B,MAAM,UAAU,GAAG,IAAA,eAAO,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAEzC,MAAM,UAAU,GAAG,CAAC,EAAC,GAAG,EAAE,IAAI,EAAc,EAAE,EAAE;oBAC5C,KAAK,CAAC,IAAI,CACN,iBAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;wBACtC,KAAK,EAAE,uBAAe,CAAC,MAAM;qBAChC,CAAC,CACL,CAAC;gBACN,CAAC,CAAC;gBAEF,IAAI,IAAA,2BAAe,EAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU;wBAAE,UAAU,CAAC,EAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAC,CAAC,CAAC;oBAC9E,qBAAqB,CAAC,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACrE,CAAC;qBAAM,IAAI,IAAA,2BAAe,EAAC,GAAG,CAAC,EAAE,CAAC;oBAC9B,qBAAqB,CAAC,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;oBACjE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBACjC,qBAAqB,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;wBAC/D,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;4BACnD,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;gCAAE,UAAU,CAAC,EAAC,GAAG,EAAE,IAAI,EAAC,CAAC,CAAC;4BACtD,IAAI,IAAI,CAAC,WAAW;gCAAE,OAAO,KAAK,CAAC;4BACnC,OAAO,IAAI,CAAC;wBAChB,CAAC,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,uBAAuB;oBACvB,qBAAqB,CAAC,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACrE,CAAC;gBAED,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAa,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,oBAAa,CAAC,KAAK,CAAC;YACvF,CAAC;SACJ;KACJ,CAAC,CAAC;AACP,CAAC,CAAC;AAtCW,QAAA,eAAe,mBAsC1B;AAEF,SAAS,qBAAqB,CAC1B,IAAc,EACd,IAAiB;IAEjB,IAAI,EAAC,KAAK,EAAC,GAAG,IAAI,CAAC;IACnB,MAAM,KAAK,GAAsC,EAAE,CAAC;IAEpD,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,EAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAC,CAAC,CAAC;QAC3E,KAAK,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC","sourcesContent":["import type {NodeType, ResolvedPos} from '#pm/model';\nimport {Plugin} from '#pm/state';\nimport type {NodeWithPos} from '#pm/utils';\nimport {Decoration, DecorationSet} from '#pm/view';\nimport {isNodeSelection, isTextSelection} from 'src/utils/selection';\n\nimport {YfmCutClassName, cutType} from '../const';\n\nexport const cutActivePlugin = () => {\n return new Plugin({\n props: {\n decorations(state) {\n const decos: Decoration[] = [];\n const sel = state.selection;\n const yfmCutType = cutType(state.schema);\n\n const createDeco = ({pos, node}: NodeWithPos) => {\n decos.push(\n Decoration.node(pos, pos + node.nodeSize, {\n class: YfmCutClassName.Active,\n }),\n );\n };\n\n if (isNodeSelection(sel)) {\n if (sel.node.type === yfmCutType) createDeco({pos: sel.from, node: sel.node});\n findParentNodesOfType(yfmCutType, sel.$from).forEach(createDeco);\n } else if (isTextSelection(sel)) {\n findParentNodesOfType(yfmCutType, sel.$from).forEach(createDeco);\n if (!sel.$from.sameParent(sel.$to)) {\n findParentNodesOfType(yfmCutType, sel.$to).forEach(createDeco);\n state.doc.nodesBetween(sel.from, sel.to, (node, pos) => {\n if (node.type === yfmCutType) createDeco({pos, node});\n if (node.isTextblock) return false;\n return true;\n });\n }\n } else {\n // some other selection\n findParentNodesOfType(yfmCutType, sel.$from).forEach(createDeco);\n }\n\n return decos.length ? DecorationSet.create(state.doc, decos) : DecorationSet.empty;\n },\n },\n });\n};\n\nfunction findParentNodesOfType(\n type: NodeType,\n $pos: ResolvedPos,\n): (NodeWithPos & {depth: number})[] {\n let {depth} = $pos;\n const nodes: (NodeWithPos & {depth: number})[] = [];\n\n while (depth >= 0) {\n const node = $pos.node(depth);\n if (node.type === type) nodes.push({depth, node, pos: $pos.before(depth)});\n depth--;\n }\n\n return nodes;\n}\n"]}
@@ -1,2 +1,2 @@
1
- import { Plugin } from 'prosemirror-state';
1
+ import { Plugin } from "../../../../pm/state.js";
2
2
  export declare const cutAutoOpenPlugin: () => Plugin<any>;
@@ -1,15 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.cutAutoOpenPlugin = void 0;
4
- const prosemirror_state_1 = require("prosemirror-state");
5
- // @ts-ignore // TODO: fix cjs build
6
- const prosemirror_utils_1 = require("prosemirror-utils");
4
+ const state_1 = require("../../../../pm/state.js");
5
+ const utils_1 = require("../../../../pm/utils.js");
7
6
  const lodash_1 = require("../../../../lodash.js");
8
7
  const selection_1 = require("../../../../utils/selection.js");
9
8
  const const_1 = require("../const.js");
10
- const key = new prosemirror_state_1.PluginKey('yfm-cut-auto-open');
9
+ const key = new state_1.PluginKey('yfm-cut-auto-open');
11
10
  const cutAutoOpenPlugin = () => {
12
- return new prosemirror_state_1.Plugin({
11
+ return new state_1.Plugin({
13
12
  key,
14
13
  view(view) {
15
14
  update(view);
@@ -42,7 +41,7 @@ function openParentYfmCuts($pos, domAtPos) {
42
41
  if ($pos.node(depth).type === (0, const_1.cutContentType)(schema)) {
43
42
  if ($pos.node(depth - 1).type === (0, const_1.cutType)(schema)) {
44
43
  const { node: cutDomNode } = domAtPos($pos.start(depth - 1), 0);
45
- cutDomNode.classList.add('open');
44
+ cutDomNode.classList.add(const_1.YfmCutClassName.Open);
46
45
  depth--;
47
46
  }
48
47
  }
@@ -50,7 +49,7 @@ function openParentYfmCuts($pos, domAtPos) {
50
49
  }
51
50
  }
52
51
  class CutAutoOpenOnDragOver {
53
- static YFM_CUT_SELECTOR = '.yfm-cut:not(.open)';
52
+ static YFM_CUT_SELECTOR = `.${const_1.YfmCutClassName.Cut}:not(.${const_1.YfmCutClassName.Open})`;
54
53
  static OPEN_TIMEOUT = 500; //ms
55
54
  static THROTTLE_WAIT = 50; //ms
56
55
  _cutElem = null;
@@ -76,7 +75,7 @@ class CutAutoOpenOnDragOver {
76
75
  const pos = view.posAtCoords({ left: event.clientX, top: event.clientY });
77
76
  if (!pos)
78
77
  return;
79
- const elem = (0, prosemirror_utils_1.findDomRefAtPos)(pos.pos, view.domAtPos.bind(view));
78
+ const elem = (0, utils_1.findDomRefAtPos)(pos.pos, view.domAtPos.bind(view));
80
79
  const cutElem = elem.closest(CutAutoOpenOnDragOver.YFM_CUT_SELECTOR);
81
80
  if (cutElem === this._cutElem)
82
81
  return;
@@ -96,7 +95,7 @@ class CutAutoOpenOnDragOver {
96
95
  }
97
96
  _openCut() {
98
97
  if (this._editorView.dragging) {
99
- this._cutElem?.classList.add('open');
98
+ this._cutElem?.classList.add(const_1.YfmCutClassName.Open);
100
99
  }
101
100
  this._clear();
102
101
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auto-open.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/plugins/auto-open.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ResolvedPos} from 'prosemirror-model';\nimport {Plugin, PluginKey, type PluginView} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findDomRefAtPos} from 'prosemirror-utils';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {throttle} from '../../../../lodash';\nimport {isTextSelection} from '../../../../utils/selection';\nimport {cutContentType, cutType} from '../const';\n\nconst key = new PluginKey('yfm-cut-auto-open');\n\nexport const cutAutoOpenPlugin = () => {\n return new Plugin({\n key,\n view(view) {\n update(view);\n const dragHandler = new CutAutoOpenOnDragOver(view);\n return {\n update: (view) => update(view),\n destroy: () => dragHandler.destroy(),\n };\n },\n });\n};\n\nfunction update(view: EditorView) {\n const sel = view.state.selection;\n const domAtPos = view.domAtPos.bind(view);\n if (isTextSelection(sel)) {\n if (sel.$cursor) {\n openParentYfmCuts(sel.$cursor, domAtPos);\n } else {\n openParentYfmCuts(sel.$head, domAtPos);\n openParentYfmCuts(sel.$anchor, domAtPos);\n }\n }\n}\n\nfunction openParentYfmCuts($pos: ResolvedPos, domAtPos: EditorView['domAtPos']): void {\n let {depth} = $pos;\n const {schema} = $pos.parent.type;\n while (depth > 0) {\n if ($pos.node(depth).type === cutContentType(schema)) {\n if ($pos.node(depth - 1).type === cutType(schema)) {\n const {node: cutDomNode} = domAtPos($pos.start(depth - 1), 0);\n (cutDomNode as Element).classList.add('open');\n depth--;\n }\n }\n depth--;\n }\n}\n\nclass CutAutoOpenOnDragOver implements PluginView {\n private static readonly YFM_CUT_SELECTOR = '.yfm-cut:not(.open)';\n private static readonly OPEN_TIMEOUT = 500; //ms\n private static readonly THROTTLE_WAIT = 50; //ms\n\n private _cutElem: HTMLElement | null = null;\n private _editorView: EditorView;\n private _timeout: ReturnType<typeof setTimeout> | null = null;\n private readonly _docListener;\n\n constructor(view: EditorView) {\n this._editorView = view;\n this._docListener = throttle(\n this._onDocEvent.bind(this),\n CutAutoOpenOnDragOver.THROTTLE_WAIT,\n );\n document.addEventListener('mousemove', this._docListener);\n document.addEventListener('dragover', this._docListener);\n }\n\n destroy(): void {\n this._clear();\n this._docListener.cancel();\n document.removeEventListener('mousemove', this._docListener);\n document.removeEventListener('dragover', this._docListener);\n }\n\n private _onDocEvent(event: MouseEvent) {\n const view = this._editorView;\n if (!view.dragging) return;\n const pos = view.posAtCoords({left: event.clientX, top: event.clientY});\n if (!pos) return;\n const elem = findDomRefAtPos(pos.pos, view.domAtPos.bind(view)) as HTMLElement;\n const cutElem = elem.closest(CutAutoOpenOnDragOver.YFM_CUT_SELECTOR);\n if (cutElem === this._cutElem) return;\n this._clear();\n if (cutElem) this._setCutElem(cutElem as HTMLElement);\n }\n\n private _clear() {\n if (this._timeout !== null) clearTimeout(this._timeout);\n this._timeout = null;\n this._cutElem = null;\n }\n\n private _setCutElem(elem: HTMLElement) {\n this._cutElem = elem;\n this._timeout = setTimeout(this._openCut.bind(this), CutAutoOpenOnDragOver.OPEN_TIMEOUT);\n }\n\n private _openCut() {\n if (this._editorView.dragging) {\n this._cutElem?.classList.add('open');\n }\n this._clear();\n }\n}\n"]}
1
+ {"version":3,"file":"auto-open.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/plugins/auto-open.ts"],"names":[],"mappings":";;;AACA,mDAA6D;AAC7D,mDAA0C;AAE1C,kDAAoC;AACpC,8DAAoD;AAEpD,uCAAkE;AAElE,MAAM,GAAG,GAAG,IAAI,iBAAS,CAAC,mBAAmB,CAAC,CAAC;AAExC,MAAM,iBAAiB,GAAG,GAAG,EAAE;IAClC,OAAO,IAAI,cAAM,CAAC;QACd,GAAG;QACH,IAAI,CAAC,IAAI;YACL,MAAM,CAAC,IAAI,CAAC,CAAC;YACb,MAAM,WAAW,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACpD,OAAO;gBACH,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE;aACvC,CAAC;QACN,CAAC;KACJ,CAAC,CAAC;AACP,CAAC,CAAC;AAZW,QAAA,iBAAiB,qBAY5B;AAEF,SAAS,MAAM,CAAC,IAAgB;IAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,IAAA,2BAAe,EAAC,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACJ,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACvC,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAiB,EAAE,QAAgC;IAC1E,IAAI,EAAC,KAAK,EAAC,GAAG,IAAI,CAAC;IACnB,MAAM,EAAC,MAAM,EAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAClC,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC;QACf,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAA,sBAAc,EAAC,MAAM,CAAC,EAAE,CAAC;YACnD,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,IAAA,eAAO,EAAC,MAAM,CAAC,EAAE,CAAC;gBAChD,MAAM,EAAC,IAAI,EAAE,UAAU,EAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7D,UAAsB,CAAC,SAAS,CAAC,GAAG,CAAC,uBAAe,CAAC,IAAI,CAAC,CAAC;gBAC5D,KAAK,EAAE,CAAC;YACZ,CAAC;QACL,CAAC;QACD,KAAK,EAAE,CAAC;IACZ,CAAC;AACL,CAAC;AAED,MAAM,qBAAqB;IACf,MAAM,CAAU,gBAAgB,GACpC,IAAI,uBAAe,CAAC,GAAG,SAAS,uBAAe,CAAC,IAAI,GAAY,CAAC;IAC7D,MAAM,CAAU,YAAY,GAAG,GAAG,CAAC,CAAC,IAAI;IACxC,MAAM,CAAU,aAAa,GAAG,EAAE,CAAC,CAAC,IAAI;IAExC,QAAQ,GAAuB,IAAI,CAAC;IACpC,WAAW,CAAa;IACxB,QAAQ,GAAyC,IAAI,CAAC;IAC7C,YAAY,CAAC;IAE9B,YAAY,IAAgB;QACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,IAAA,iBAAQ,EACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAC3B,qBAAqB,CAAC,aAAa,CACtC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1D,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO;QACH,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAC3B,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7D,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAChE,CAAC;IAEO,WAAW,CAAC,KAAiB;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,EAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,EAAC,CAAC,CAAC;QACxE,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,IAAI,GAAG,IAAA,uBAAe,EAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAgB,CAAC;QAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;QACrE,IAAI,OAAO,KAAK,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,OAAO;YAAE,IAAI,CAAC,WAAW,CAAC,OAAsB,CAAC,CAAC;IAC1D,CAAC;IAEO,MAAM;QACV,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACzB,CAAC;IAEO,WAAW,CAAC,IAAiB;QACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,qBAAqB,CAAC,YAAY,CAAC,CAAC;IAC7F,CAAC;IAEO,QAAQ;QACZ,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,uBAAe,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC","sourcesContent":["import type {ResolvedPos} from '#pm/model';\nimport {Plugin, PluginKey, type PluginView} from '#pm/state';\nimport {findDomRefAtPos} from '#pm/utils';\nimport type {EditorView} from '#pm/view';\nimport {throttle} from 'src/lodash';\nimport {isTextSelection} from 'src/utils/selection';\n\nimport {YfmCutClassName, cutContentType, cutType} from '../const';\n\nconst key = new PluginKey('yfm-cut-auto-open');\n\nexport const cutAutoOpenPlugin = () => {\n return new Plugin({\n key,\n view(view) {\n update(view);\n const dragHandler = new CutAutoOpenOnDragOver(view);\n return {\n update: (view) => update(view),\n destroy: () => dragHandler.destroy(),\n };\n },\n });\n};\n\nfunction update(view: EditorView) {\n const sel = view.state.selection;\n const domAtPos = view.domAtPos.bind(view);\n if (isTextSelection(sel)) {\n if (sel.$cursor) {\n openParentYfmCuts(sel.$cursor, domAtPos);\n } else {\n openParentYfmCuts(sel.$head, domAtPos);\n openParentYfmCuts(sel.$anchor, domAtPos);\n }\n }\n}\n\nfunction openParentYfmCuts($pos: ResolvedPos, domAtPos: EditorView['domAtPos']): void {\n let {depth} = $pos;\n const {schema} = $pos.parent.type;\n while (depth > 0) {\n if ($pos.node(depth).type === cutContentType(schema)) {\n if ($pos.node(depth - 1).type === cutType(schema)) {\n const {node: cutDomNode} = domAtPos($pos.start(depth - 1), 0);\n (cutDomNode as Element).classList.add(YfmCutClassName.Open);\n depth--;\n }\n }\n depth--;\n }\n}\n\nclass CutAutoOpenOnDragOver implements PluginView {\n private static readonly YFM_CUT_SELECTOR =\n `.${YfmCutClassName.Cut}:not(.${YfmCutClassName.Open})` as const;\n private static readonly OPEN_TIMEOUT = 500; //ms\n private static readonly THROTTLE_WAIT = 50; //ms\n\n private _cutElem: HTMLElement | null = null;\n private _editorView: EditorView;\n private _timeout: ReturnType<typeof setTimeout> | null = null;\n private readonly _docListener;\n\n constructor(view: EditorView) {\n this._editorView = view;\n this._docListener = throttle(\n this._onDocEvent.bind(this),\n CutAutoOpenOnDragOver.THROTTLE_WAIT,\n );\n document.addEventListener('mousemove', this._docListener);\n document.addEventListener('dragover', this._docListener);\n }\n\n destroy(): void {\n this._clear();\n this._docListener.cancel();\n document.removeEventListener('mousemove', this._docListener);\n document.removeEventListener('dragover', this._docListener);\n }\n\n private _onDocEvent(event: MouseEvent) {\n const view = this._editorView;\n if (!view.dragging) return;\n const pos = view.posAtCoords({left: event.clientX, top: event.clientY});\n if (!pos) return;\n const elem = findDomRefAtPos(pos.pos, view.domAtPos.bind(view)) as HTMLElement;\n const cutElem = elem.closest(CutAutoOpenOnDragOver.YFM_CUT_SELECTOR);\n if (cutElem === this._cutElem) return;\n this._clear();\n if (cutElem) this._setCutElem(cutElem as HTMLElement);\n }\n\n private _clear() {\n if (this._timeout !== null) clearTimeout(this._timeout);\n this._timeout = null;\n this._cutElem = null;\n }\n\n private _setCutElem(elem: HTMLElement) {\n this._cutElem = elem;\n this._timeout = setTimeout(this._openCut.bind(this), CutAutoOpenOnDragOver.OPEN_TIMEOUT);\n }\n\n private _openCut() {\n if (this._editorView.dragging) {\n this._cutElem?.classList.add(YfmCutClassName.Open);\n }\n this._clear();\n }\n}\n"]}
@@ -1,3 +1,3 @@
1
- import { type Command } from 'prosemirror-state';
1
+ import { type Command } from "../../../../pm/state.js";
2
2
  export declare const clearSelectedCells: Command;
3
3
  export declare const backspaceCommand: Command;
@@ -1,10 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.backspaceCommand = exports.clearSelectedCells = void 0;
4
- const prosemirror_commands_1 = require("prosemirror-commands");
5
- const prosemirror_state_1 = require("prosemirror-state");
4
+ const commands_1 = require("../../../../pm/commands.js");
5
+ const state_1 = require("../../../../pm/state.js");
6
+ const specs_1 = require("../../../base/specs.js");
7
+ const lodash_1 = require("../../../../lodash.js");
6
8
  const table_utils_1 = require("../../../../table-utils/index.js");
9
+ const table_desc_1 = require("../../../../table-utils/table-desc.js");
7
10
  const selection_1 = require("../../../../utils/selection.js");
11
+ const utils_1 = require("../utils.js");
8
12
  const removeCellNodeContent = (state, dispatch) => {
9
13
  const sel = state.selection;
10
14
  if (!(0, selection_1.isNodeSelection)(sel))
@@ -21,105 +25,78 @@ const removeCellNodeContent = (state, dispatch) => {
21
25
  const from = sel.from + 1;
22
26
  const to = sel.to - 1;
23
27
  let tr = state.tr.delete(from, to);
24
- tr = tr.setSelection(prosemirror_state_1.TextSelection.create(tr.doc, from));
28
+ tr = tr.setSelection(state_1.TextSelection.create(tr.doc, from));
25
29
  dispatch(tr);
26
30
  }
27
31
  return true;
28
32
  }
29
33
  return false;
30
34
  };
31
- // eslint-disable-next-line complexity
32
35
  const clearSelectedCells = (state, dispatch) => {
33
36
  const sel = state.selection;
34
37
  if (!(0, selection_1.isTextSelection)(sel))
35
38
  return false;
36
39
  const { $from, $to } = sel;
37
- const fromCell = (0, table_utils_1.findParentTableCellFromPos)($from);
38
- const toCell = (0, table_utils_1.findParentTableCellFromPos)($to);
39
- const fromTBody = (0, table_utils_1.findParentTableBodyFromPos)($from);
40
- const toTBody = (0, table_utils_1.findParentTableBodyFromPos)($to);
41
- const fromTable = (0, table_utils_1.findParentTableFromPos)($to);
42
- if (!fromCell || !toCell || !fromTBody || !toTBody || !fromTable)
40
+ const sharedDepth = $from.sharedDepth($to.pos);
41
+ const commonAncestor = $from.node(sharedDepth);
42
+ const { schema } = commonAncestor.type;
43
+ if (!isAnyOfTypes(commonAncestor, [
44
+ (0, utils_1.yfmTableType)(schema),
45
+ (0, utils_1.yfmTableBodyType)(schema),
46
+ (0, utils_1.yfmTableRowType)(schema),
47
+ ]))
43
48
  return false;
44
- if (fromCell.node === toCell.node) {
45
- // selection inside table cell
46
- return false; // should executes default command
47
- }
48
- if (fromTBody && toTBody && fromTBody.pos === toTBody.pos) {
49
- if (dispatch) {
50
- const table = fromTable;
51
- const tBody = fromTBody;
52
- const fromCellIndexInRow = $from.index(fromCell.depth - 1);
53
- const toCellIndexInRow = $to.index(toCell.depth - 1);
54
- const fromRowIndexInBody = $from.index(fromCell.depth - 2);
55
- const toRowIndexInBody = $to.index(toCell.depth - 2);
56
- const bodyRows = (0, table_utils_1.findChildTableRows)(tBody.node);
57
- let tr = state.tr;
58
- tr = tr.delete(toCell.start, $to.pos);
59
- let rowIndex = toRowIndexInBody;
60
- while (rowIndex >= fromRowIndexInBody) {
61
- const row = bodyRows[rowIndex];
62
- const rowCells = (0, table_utils_1.findChildTableCells)(row.node);
63
- let cellIndex = rowIndex === toRowIndexInBody ? toCellIndexInRow - 1 : rowCells.length - 1;
64
- while (cellIndex > (rowIndex === fromRowIndexInBody ? fromCellIndexInRow : -1)) {
65
- const cell = rowCells[cellIndex];
66
- const from = tBody.pos + row.pos + cell.pos + 3;
67
- const to = from + cell.node.nodeSize - 2;
68
- tr = tr.delete(from, to);
69
- cellIndex--;
70
- }
71
- if (rowIndex !== fromRowIndexInBody) {
72
- const rowPos = tBody.pos + row.pos + 1;
73
- const trRow = tr.doc.nodeAt(rowPos);
74
- if (trRow && isEmptyTableRow(trRow)) {
75
- tr = tr.delete(rowPos, rowPos + trRow.nodeSize);
76
- }
77
- }
78
- rowIndex--;
79
- }
80
- tr = tr.delete($from.pos, fromCell.pos + fromCell.node.nodeSize);
81
- const fromRowPos = tBody.pos + bodyRows[fromRowIndexInBody].pos + 1;
82
- const trFromRow = tr.doc.nodeAt(fromRowPos);
83
- if (fromCellIndexInRow === 0 && trFromRow && isEmptyTableRow(trFromRow)) {
84
- const rowsCountBeforeDelete = tr.doc.nodeAt(tBody.pos).childCount;
85
- tr = tr.delete(fromRowPos, fromRowPos + tr.doc.nodeAt(fromRowPos).nodeSize);
86
- const trTable = tr.doc.nodeAt(table.pos);
87
- if (rowsCountBeforeDelete <= 1) {
88
- if (trTable) {
89
- if (trTable.childCount <= 1) {
90
- tr = tr.delete(table.pos, trTable.nodeSize);
91
- }
92
- }
93
- else {
94
- tr = tr.delete(tBody.pos, tBody.pos + tr.doc.nodeAt(tBody.pos).nodeSize);
95
- }
96
- }
49
+ const tablePos = findTablePos($from, sharedDepth);
50
+ if (typeof tablePos !== 'number')
51
+ return false;
52
+ const tableNode = $from.doc.nodeAt(tablePos);
53
+ if (!tableNode)
54
+ return false;
55
+ const tableDesc = table_desc_1.TableDesc.create(tableNode)?.bind(tablePos);
56
+ if (!tableDesc)
57
+ return false;
58
+ if (dispatch) {
59
+ const tr = state.tr;
60
+ const cells = (0, lodash_1.range)(0, tableDesc.rows)
61
+ .flatMap((rowIdx) => tableDesc.getPosForRowCells(rowIdx))
62
+ .filter((cell) => cell.type === 'real');
63
+ const isAllSelected = $from.pos <= cells[0].from + 2 && $to.pos >= cells[cells.length - 1].to - 2;
64
+ if (isAllSelected) {
65
+ // all table content is selected, we should remove table
66
+ tr.replaceWith(tablePos, tablePos + tableNode.nodeSize, (0, specs_1.pType)(schema).create());
67
+ tr.setSelection(state_1.TextSelection.create(tr.doc, tablePos + 1));
68
+ }
69
+ else {
70
+ for (const cell of cells) {
71
+ if ($from.pos > cell.to)
72
+ continue;
73
+ if ($to.pos < cell.from)
74
+ break;
75
+ const from = Math.max($from.pos, cell.from + 1);
76
+ const to = Math.min($to.pos, cell.to - 1);
77
+ tr.delete(tr.mapping.map(from), tr.mapping.map(to));
78
+ tr.setSelection(state_1.TextSelection.near(tr.doc.resolve(tr.mapping.map(to)), -1));
97
79
  }
98
- tr = tr.setSelection(prosemirror_state_1.TextSelection.create(tr.doc, tr.mapping.map(sel.head)));
99
- dispatch(tr);
100
80
  }
101
- return true;
81
+ dispatch(tr.scrollIntoView());
102
82
  }
103
- return false;
83
+ return true;
104
84
  };
105
85
  exports.clearSelectedCells = clearSelectedCells;
106
- exports.backspaceCommand = (0, prosemirror_commands_1.chainCommands)(removeCellNodeContent, exports.clearSelectedCells);
107
- function isEmptyTableRow(node) {
108
- if (!(0, table_utils_1.isTableRowNode)(node))
109
- return false;
110
- if (node.childCount === 0)
111
- return true;
112
- let isRowEmpty = true;
113
- node.forEach((cellNode) => {
114
- isRowEmpty = isEmptyTableCell(cellNode);
115
- });
116
- return isRowEmpty;
86
+ exports.backspaceCommand = (0, commands_1.chainCommands)(removeCellNodeContent, exports.clearSelectedCells);
87
+ function isAnyOfTypes(node, types) {
88
+ return types.some((type) => type === node.type);
117
89
  }
118
- function isEmptyTableCell(node) {
119
- if (!(0, table_utils_1.isTableCellNode)(node))
120
- return false;
121
- if (node.childCount === 0)
122
- return true;
123
- return node.childCount === 1 && node.child(0).isTextblock && node.child(0).childCount === 0;
90
+ function findTablePos($pos, startDepth) {
91
+ const ASCENTS = 5;
92
+ let depth = startDepth;
93
+ while (depth >= 0 && startDepth - depth <= ASCENTS) {
94
+ const node = $pos.node(depth);
95
+ if ((0, table_utils_1.isTableNode)(node)) {
96
+ return $pos.before(depth);
97
+ }
98
+ depth--;
99
+ }
100
+ return null;
124
101
  }
125
102
  //# sourceMappingURL=backspace.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"backspace.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmTable/commands/backspace.ts"],"names":[],"mappings":"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","sourcesContent":["import {chainCommands} from 'prosemirror-commands';\nimport type {Node} from 'prosemirror-model';\nimport {type Command, TextSelection} from 'prosemirror-state';\n\nimport {\n findChildTableCells,\n findChildTableRows,\n findParentTableBodyFromPos,\n findParentTableCellFromPos,\n findParentTableFromPos,\n isTableCellNode,\n isTableRowNode,\n} from '../../../../table-utils';\nimport {isNodeSelection, isTextSelection} from '../../../../utils/selection';\n\nconst removeCellNodeContent: Command = (state, dispatch) => {\n const sel = state.selection;\n if (!isNodeSelection(sel)) return false;\n const selNode = sel.node;\n if (isTableRowNode(selNode)) {\n // remove the table row\n dispatch?.(state.tr.deleteSelection());\n return true;\n }\n if (isTableCellNode(selNode)) {\n if (dispatch) {\n // clearing the table cell\n const from = sel.from + 1;\n const to = sel.to - 1;\n let tr = state.tr.delete(from, to);\n tr = tr.setSelection(TextSelection.create(tr.doc, from));\n dispatch(tr);\n }\n return true;\n }\n return false;\n};\n\n// eslint-disable-next-line complexity\nexport const clearSelectedCells: Command = (state, dispatch) => {\n const sel = state.selection;\n if (!isTextSelection(sel)) return false;\n const {$from, $to} = sel;\n\n const fromCell = findParentTableCellFromPos($from);\n const toCell = findParentTableCellFromPos($to);\n const fromTBody = findParentTableBodyFromPos($from);\n const toTBody = findParentTableBodyFromPos($to);\n const fromTable = findParentTableFromPos($to);\n\n if (!fromCell || !toCell || !fromTBody || !toTBody || !fromTable) return false;\n\n if (fromCell.node === toCell.node) {\n // selection inside table cell\n return false; // should executes default command\n }\n\n if (fromTBody && toTBody && fromTBody.pos === toTBody.pos) {\n if (dispatch) {\n const table = fromTable;\n const tBody = fromTBody;\n\n const fromCellIndexInRow = $from.index(fromCell.depth - 1);\n const toCellIndexInRow = $to.index(toCell.depth - 1);\n\n const fromRowIndexInBody = $from.index(fromCell.depth - 2);\n const toRowIndexInBody = $to.index(toCell.depth - 2);\n\n const bodyRows = findChildTableRows(tBody.node);\n\n let tr = state.tr;\n tr = tr.delete(toCell.start, $to.pos);\n\n let rowIndex = toRowIndexInBody;\n while (rowIndex >= fromRowIndexInBody) {\n const row = bodyRows[rowIndex];\n const rowCells = findChildTableCells(row.node);\n\n let cellIndex =\n rowIndex === toRowIndexInBody ? toCellIndexInRow - 1 : rowCells.length - 1;\n while (cellIndex > (rowIndex === fromRowIndexInBody ? fromCellIndexInRow : -1)) {\n const cell = rowCells[cellIndex];\n\n const from = tBody.pos + row.pos + cell.pos + 3;\n const to = from + cell.node.nodeSize - 2;\n\n tr = tr.delete(from, to);\n\n cellIndex--;\n }\n\n if (rowIndex !== fromRowIndexInBody) {\n const rowPos = tBody.pos + row.pos + 1;\n const trRow = tr.doc.nodeAt(rowPos);\n if (trRow && isEmptyTableRow(trRow)) {\n tr = tr.delete(rowPos, rowPos + trRow.nodeSize);\n }\n }\n\n rowIndex--;\n }\n\n tr = tr.delete($from.pos, fromCell.pos + fromCell.node.nodeSize);\n\n const fromRowPos = tBody.pos + bodyRows[fromRowIndexInBody].pos + 1;\n const trFromRow = tr.doc.nodeAt(fromRowPos);\n if (fromCellIndexInRow === 0 && trFromRow && isEmptyTableRow(trFromRow)) {\n const rowsCountBeforeDelete = tr.doc.nodeAt(tBody.pos)!.childCount;\n tr = tr.delete(fromRowPos, fromRowPos + tr.doc.nodeAt(fromRowPos)!.nodeSize);\n\n const trTable = tr.doc.nodeAt(table.pos);\n if (rowsCountBeforeDelete <= 1) {\n if (trTable) {\n if (trTable.childCount <= 1) {\n tr = tr.delete(table.pos, trTable.nodeSize);\n }\n } else {\n tr = tr.delete(tBody.pos, tBody.pos + tr.doc.nodeAt(tBody.pos)!.nodeSize);\n }\n }\n }\n tr = tr.setSelection(TextSelection.create(tr.doc, tr.mapping.map(sel.head)));\n\n dispatch(tr);\n }\n\n return true;\n }\n\n return false;\n};\n\nexport const backspaceCommand = chainCommands(removeCellNodeContent, clearSelectedCells);\n\nfunction isEmptyTableRow(node: Node) {\n if (!isTableRowNode(node)) return false;\n if (node.childCount === 0) return true;\n let isRowEmpty = true;\n node.forEach((cellNode) => {\n isRowEmpty = isEmptyTableCell(cellNode);\n });\n return isRowEmpty;\n}\n\nfunction isEmptyTableCell(node: Node): boolean {\n if (!isTableCellNode(node)) return false;\n if (node.childCount === 0) return true;\n return node.childCount === 1 && node.child(0).isTextblock && node.child(0).childCount === 0;\n}\n"]}
1
+ {"version":3,"file":"backspace.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmTable/commands/backspace.ts"],"names":[],"mappings":"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","sourcesContent":["import {chainCommands} from '#pm/commands';\nimport type {Node, NodeType, ResolvedPos} from '#pm/model';\nimport {type Command, TextSelection} from '#pm/state';\nimport {pType} from 'src/extensions/base/specs';\nimport {range} from 'src/lodash';\nimport {isTableCellNode, isTableNode, isTableRowNode} from 'src/table-utils';\nimport {TableDesc} from 'src/table-utils/table-desc';\nimport {isNodeSelection, isTextSelection} from 'src/utils/selection';\n\nimport {yfmTableBodyType, yfmTableRowType, yfmTableType} from '../utils';\n\nconst removeCellNodeContent: Command = (state, dispatch) => {\n const sel = state.selection;\n if (!isNodeSelection(sel)) return false;\n const selNode = sel.node;\n if (isTableRowNode(selNode)) {\n // remove the table row\n dispatch?.(state.tr.deleteSelection());\n return true;\n }\n if (isTableCellNode(selNode)) {\n if (dispatch) {\n // clearing the table cell\n const from = sel.from + 1;\n const to = sel.to - 1;\n let tr = state.tr.delete(from, to);\n tr = tr.setSelection(TextSelection.create(tr.doc, from));\n dispatch(tr);\n }\n return true;\n }\n return false;\n};\n\nexport const clearSelectedCells: Command = (state, dispatch) => {\n const sel = state.selection;\n if (!isTextSelection(sel)) return false;\n const {$from, $to} = sel;\n\n const sharedDepth = $from.sharedDepth($to.pos);\n const commonAncestor = $from.node(sharedDepth);\n const {schema} = commonAncestor.type;\n\n if (\n !isAnyOfTypes(commonAncestor, [\n yfmTableType(schema),\n yfmTableBodyType(schema),\n yfmTableRowType(schema),\n ])\n )\n return false;\n\n const tablePos = findTablePos($from, sharedDepth);\n if (typeof tablePos !== 'number') return false;\n const tableNode = $from.doc.nodeAt(tablePos);\n if (!tableNode) return false;\n const tableDesc = TableDesc.create(tableNode)?.bind(tablePos);\n if (!tableDesc) return false;\n\n if (dispatch) {\n const tr = state.tr;\n\n const cells = range(0, tableDesc.rows)\n .flatMap((rowIdx) => tableDesc.getPosForRowCells(rowIdx))\n .filter((cell) => cell.type === 'real');\n\n const isAllSelected =\n $from.pos <= cells[0].from + 2 && $to.pos >= cells[cells.length - 1].to - 2;\n\n if (isAllSelected) {\n // all table content is selected, we should remove table\n tr.replaceWith(tablePos, tablePos + tableNode.nodeSize, pType(schema).create());\n tr.setSelection(TextSelection.create(tr.doc, tablePos + 1));\n } else {\n for (const cell of cells) {\n if ($from.pos > cell.to) continue;\n if ($to.pos < cell.from) break;\n\n const from = Math.max($from.pos, cell.from + 1);\n const to = Math.min($to.pos, cell.to - 1);\n\n tr.delete(tr.mapping.map(from), tr.mapping.map(to));\n tr.setSelection(TextSelection.near(tr.doc.resolve(tr.mapping.map(to)), -1));\n }\n }\n\n dispatch(tr.scrollIntoView());\n }\n\n return true;\n};\n\nexport const backspaceCommand = chainCommands(removeCellNodeContent, clearSelectedCells);\n\nfunction isAnyOfTypes(node: Node, types: NodeType[]): boolean {\n return types.some((type) => type === node.type);\n}\n\nfunction findTablePos($pos: ResolvedPos, startDepth: number): number | null {\n const ASCENTS = 5;\n let depth = startDepth;\n while (depth >= 0 && startDepth - depth <= ASCENTS) {\n const node = $pos.node(depth);\n if (isTableNode(node)) {\n return $pos.before(depth);\n }\n depth--;\n }\n return null;\n}\n"]}
@@ -1,5 +1,8 @@
1
1
  {
2
2
  "label_case-sensitive": "Case sensitive",
3
3
  "label_whole-word": "Whole word",
4
- "title": "Search in code"
5
- }
4
+ "title": "Search in code",
5
+ "action_replace": "Replace",
6
+ "action_replace_all": "Replace all",
7
+ "replace_placeholder": "Replacement text"
8
+ }
@@ -1,7 +1,10 @@
1
- export declare const i18n: <G extends "title" | "label_case-sensitive" | "label_whole-word", S extends string>(key: G | (string extends S ? S : never), params?: {
1
+ export declare const i18n: <G extends "title" | "label_case-sensitive" | "label_whole-word" | "action_replace" | "action_replace_all" | "replace_placeholder", S extends string>(key: G | (string extends S ? S : never), params?: {
2
2
  [key: string]: any;
3
3
  }) => S extends G ? {
4
4
  "label_case-sensitive": string;
5
5
  "label_whole-word": string;
6
6
  title: string;
7
+ action_replace: string;
8
+ action_replace_all: string;
9
+ replace_placeholder: string;
7
10
  }[G] : string;
@@ -1,5 +1,8 @@
1
1
  {
2
2
  "label_case-sensitive": "С учетом регистра",
3
3
  "label_whole-word": "Слово целиком",
4
- "title": "Найти в коде"
5
- }
4
+ "title": "Найти в коде",
5
+ "action_replace": "Заменить",
6
+ "action_replace_all": "Заменить всё",
7
+ "replace_placeholder": "Текст замены"
8
+ }
@@ -29,5 +29,7 @@ export declare const SearchPanelPlugin: (params: SearchPanelPluginParams) => Vie
29
29
  handleSearchNext(): void;
30
30
  handleSearchPrev(): void;
31
31
  handleSearchConfigChange(config: Partial<SearchQueryConfig>): void;
32
+ handleReplaceNext(query: string, replacement: string): void;
33
+ handleReplaceAll(query: string, replacement: string): void;
32
34
  }>;
33
35
  export {};
@@ -16,6 +16,7 @@ const SearchPanelPlugin = (params) => view_1.ViewPlugin.fromClass(class {
16
16
  search: '',
17
17
  caseSensitive: false,
18
18
  wholeWord: false,
19
+ replace: '',
19
20
  };
20
21
  receiver;
21
22
  setViewSearchWithDelay;
@@ -29,6 +30,8 @@ const SearchPanelPlugin = (params) => view_1.ViewPlugin.fromClass(class {
29
30
  this.handleChange = this.handleChange.bind(this);
30
31
  this.handleSearchNext = this.handleSearchNext.bind(this);
31
32
  this.handleSearchPrev = this.handleSearchPrev.bind(this);
33
+ this.handleReplaceNext = this.handleReplaceNext.bind(this);
34
+ this.handleReplaceAll = this.handleReplaceAll.bind(this);
32
35
  this.handleSearchConfigChange = this.handleSearchConfigChange.bind(this);
33
36
  this.handleEditorModeChange = this.handleEditorModeChange.bind(this);
34
37
  this.setViewSearchWithDelay = (0, lodash_1.debounce)(this.setViewSearch, this.params.inputDelay ?? INPUT_DELAY);
@@ -49,6 +52,8 @@ const SearchPanelPlugin = (params) => view_1.ViewPlugin.fromClass(class {
49
52
  onClose: this.handleClose,
50
53
  onSearchNext: this.handleSearchNext,
51
54
  onSearchPrev: this.handleSearchPrev,
55
+ onReplaceNext: this.handleReplaceNext,
56
+ onReplaceAll: this.handleReplaceAll,
52
57
  onConfigChange: this.handleSearchConfigChange,
53
58
  }));
54
59
  }
@@ -93,6 +98,14 @@ const SearchPanelPlugin = (params) => view_1.ViewPlugin.fromClass(class {
93
98
  handleSearchConfigChange(config) {
94
99
  this.setViewSearch(config);
95
100
  }
101
+ handleReplaceNext(query, replacement) {
102
+ this.setViewSearch({ search: query, replace: replacement });
103
+ (0, search_1.replaceNext)(this.view);
104
+ }
105
+ handleReplaceAll(query, replacement) {
106
+ this.setViewSearch({ search: query, replace: replacement });
107
+ (0, search_1.replaceAll)(this.view);
108
+ }
96
109
  }, {
97
110
  provide: () => [
98
111
  view_1.keymap.of(search_1.searchKeymap),
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"../../../../../src","sources":["markup/codemirror/search-plugin/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n SearchQuery,\n closeSearchPanel,\n findNext,\n findPrevious,\n getSearchQuery,\n search,\n searchKeymap,\n searchPanelOpen,\n setSearchQuery,\n} from '@codemirror/search';\nimport {\n type EditorView,\n type PluginValue,\n ViewPlugin,\n type ViewUpdate,\n keymap,\n} from '@codemirror/view';\n\nimport type {MarkdownEditorMode} from '../../../bundle';\nimport type {EventMap} from '../../../bundle/Editor';\nimport type {RendererItem} from '../../../extensions';\nimport {debounce} from '../../../lodash';\nimport type {Receiver} from '../../../utils';\nimport {ReactRendererFacet} from '../react-facet';\n\nimport {renderSearchPopup} from './view/SearchPopup';\n\ntype SearchQueryConfig = ConstructorParameters<typeof SearchQuery>[0];\n\nconst INPUT_DELAY = 200;\n\nexport interface SearchPanelPluginParams {\n anchorSelector: string;\n inputDelay?: number;\n receiver?: Receiver<EventMap>;\n}\n\nexport const SearchPanelPlugin = (params: SearchPanelPluginParams) =>\n ViewPlugin.fromClass(\n class implements PluginValue {\n readonly view: EditorView;\n readonly params: SearchPanelPluginParams;\n\n anchor: HTMLElement | null;\n renderer: RendererItem | null;\n searchConfig: SearchQueryConfig = {\n search: '',\n caseSensitive: false,\n wholeWord: false,\n };\n receiver: Receiver<EventMap> | undefined;\n\n setViewSearchWithDelay: (config: Partial<SearchQueryConfig>) => void;\n\n constructor(view: EditorView) {\n this.view = view;\n this.anchor = null;\n this.renderer = null;\n this.params = params;\n this.receiver = params.receiver;\n\n this.handleClose = this.handleClose.bind(this);\n this.handleChange = this.handleChange.bind(this);\n this.handleSearchNext = this.handleSearchNext.bind(this);\n this.handleSearchPrev = this.handleSearchPrev.bind(this);\n this.handleSearchConfigChange = this.handleSearchConfigChange.bind(this);\n this.handleEditorModeChange = this.handleEditorModeChange.bind(this);\n\n this.setViewSearchWithDelay = debounce(\n this.setViewSearch,\n this.params.inputDelay ?? INPUT_DELAY,\n );\n this.receiver?.on('change-editor-mode', this.handleEditorModeChange);\n }\n\n update(update: ViewUpdate): void {\n const isPanelOpen = searchPanelOpen(update.state);\n\n if (isPanelOpen && !this.renderer) {\n const initial = getSearchQuery(update.state);\n this.anchor = document.querySelector(this.params.anchorSelector);\n this.renderer = this.view.state\n .facet(ReactRendererFacet)\n .createItem('cm-search', () =>\n renderSearchPopup({\n initial,\n open: true,\n anchor: this.anchor,\n onChange: this.handleChange,\n onClose: this.handleClose,\n onSearchNext: this.handleSearchNext,\n onSearchPrev: this.handleSearchPrev,\n onConfigChange: this.handleSearchConfigChange,\n }),\n );\n } else if (!isPanelOpen && this.renderer) {\n this.renderer?.remove();\n this.renderer = null;\n }\n }\n\n destroy() {\n this.renderer?.remove();\n this.renderer = null;\n this.receiver?.off('change-editor-mode', this.handleEditorModeChange);\n }\n\n setViewSearch(config: Partial<SearchQueryConfig>) {\n this.searchConfig = {\n ...this.searchConfig,\n ...config,\n };\n const searchQuery = new SearchQuery({\n ...this.searchConfig,\n });\n\n this.view.dispatch({effects: setSearchQuery.of(searchQuery)});\n }\n\n handleEditorModeChange({mode}: {mode: MarkdownEditorMode}) {\n if (mode === 'wysiwyg') {\n closeSearchPanel(this.view);\n }\n }\n\n handleChange(search: string) {\n this.setViewSearchWithDelay({search});\n }\n\n handleClose() {\n this.setViewSearch({search: ''});\n closeSearchPanel(this.view);\n }\n\n handleSearchNext() {\n findNext(this.view);\n }\n\n handleSearchPrev() {\n findPrevious(this.view);\n }\n\n handleSearchConfigChange(config: Partial<SearchQueryConfig>) {\n this.setViewSearch(config);\n }\n },\n {\n provide: () => [\n keymap.of(searchKeymap),\n search({\n createPanel: () => ({\n // Create an empty search panel\n dom: document.createElement('div'),\n }),\n }),\n ],\n },\n );\n"]}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"../../../../../src","sources":["markup/codemirror/search-plugin/plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n SearchQuery,\n closeSearchPanel,\n findNext,\n findPrevious,\n getSearchQuery,\n replaceAll,\n replaceNext,\n search,\n searchKeymap,\n searchPanelOpen,\n setSearchQuery,\n} from '@codemirror/search';\nimport {\n type EditorView,\n type PluginValue,\n ViewPlugin,\n type ViewUpdate,\n keymap,\n} from '@codemirror/view';\n\nimport type {MarkdownEditorMode} from '../../../bundle';\nimport type {EventMap} from '../../../bundle/Editor';\nimport type {RendererItem} from '../../../extensions';\nimport {debounce} from '../../../lodash';\nimport type {Receiver} from '../../../utils';\nimport {ReactRendererFacet} from '../react-facet';\n\nimport {renderSearchPopup} from './view/SearchPopup';\n\ntype SearchQueryConfig = ConstructorParameters<typeof SearchQuery>[0];\n\nconst INPUT_DELAY = 200;\n\nexport interface SearchPanelPluginParams {\n anchorSelector: string;\n inputDelay?: number;\n receiver?: Receiver<EventMap>;\n}\n\nexport const SearchPanelPlugin = (params: SearchPanelPluginParams) =>\n ViewPlugin.fromClass(\n class implements PluginValue {\n readonly view: EditorView;\n readonly params: SearchPanelPluginParams;\n\n anchor: HTMLElement | null;\n renderer: RendererItem | null;\n searchConfig: SearchQueryConfig = {\n search: '',\n caseSensitive: false,\n wholeWord: false,\n replace: '',\n };\n receiver: Receiver<EventMap> | undefined;\n\n setViewSearchWithDelay: (config: Partial<SearchQueryConfig>) => void;\n\n constructor(view: EditorView) {\n this.view = view;\n this.anchor = null;\n this.renderer = null;\n this.params = params;\n this.receiver = params.receiver;\n\n this.handleClose = this.handleClose.bind(this);\n this.handleChange = this.handleChange.bind(this);\n this.handleSearchNext = this.handleSearchNext.bind(this);\n this.handleSearchPrev = this.handleSearchPrev.bind(this);\n this.handleReplaceNext = this.handleReplaceNext.bind(this);\n this.handleReplaceAll = this.handleReplaceAll.bind(this);\n this.handleSearchConfigChange = this.handleSearchConfigChange.bind(this);\n this.handleEditorModeChange = this.handleEditorModeChange.bind(this);\n\n this.setViewSearchWithDelay = debounce(\n this.setViewSearch,\n this.params.inputDelay ?? INPUT_DELAY,\n );\n this.receiver?.on('change-editor-mode', this.handleEditorModeChange);\n }\n\n update(update: ViewUpdate): void {\n const isPanelOpen = searchPanelOpen(update.state);\n\n if (isPanelOpen && !this.renderer) {\n const initial = getSearchQuery(update.state);\n this.anchor = document.querySelector(this.params.anchorSelector);\n this.renderer = this.view.state\n .facet(ReactRendererFacet)\n .createItem('cm-search', () =>\n renderSearchPopup({\n initial,\n open: true,\n anchor: this.anchor,\n onChange: this.handleChange,\n onClose: this.handleClose,\n onSearchNext: this.handleSearchNext,\n onSearchPrev: this.handleSearchPrev,\n onReplaceNext: this.handleReplaceNext,\n onReplaceAll: this.handleReplaceAll,\n onConfigChange: this.handleSearchConfigChange,\n }),\n );\n } else if (!isPanelOpen && this.renderer) {\n this.renderer?.remove();\n this.renderer = null;\n }\n }\n\n destroy() {\n this.renderer?.remove();\n this.renderer = null;\n this.receiver?.off('change-editor-mode', this.handleEditorModeChange);\n }\n\n setViewSearch(config: Partial<SearchQueryConfig>) {\n this.searchConfig = {\n ...this.searchConfig,\n ...config,\n };\n const searchQuery = new SearchQuery({\n ...this.searchConfig,\n });\n\n this.view.dispatch({effects: setSearchQuery.of(searchQuery)});\n }\n\n handleEditorModeChange({mode}: {mode: MarkdownEditorMode}) {\n if (mode === 'wysiwyg') {\n closeSearchPanel(this.view);\n }\n }\n\n handleChange(search: string) {\n this.setViewSearchWithDelay({search});\n }\n\n handleClose() {\n this.setViewSearch({search: ''});\n closeSearchPanel(this.view);\n }\n\n handleSearchNext() {\n findNext(this.view);\n }\n\n handleSearchPrev() {\n findPrevious(this.view);\n }\n\n handleSearchConfigChange(config: Partial<SearchQueryConfig>) {\n this.setViewSearch(config);\n }\n\n handleReplaceNext(query: string, replacement: string) {\n this.setViewSearch({search: query, replace: replacement});\n replaceNext(this.view);\n }\n\n handleReplaceAll(query: string, replacement: string) {\n this.setViewSearch({search: query, replace: replacement});\n replaceAll(this.view);\n }\n },\n {\n provide: () => [\n keymap.of(searchKeymap),\n search({\n createPanel: () => ({\n // Create an empty search panel\n dom: document.createElement('div'),\n }),\n }),\n ],\n },\n );\n"]}