@gravity-ui/markdown-editor 15.36.0 → 15.38.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 (245) hide show
  1. package/README.md +87 -0
  2. package/build/cjs/core/ExtensionBuilder.d.ts +21 -0
  3. package/build/cjs/core/ExtensionBuilder.js +306 -4
  4. package/build/cjs/core/ExtensionBuilder.js.map +1 -1
  5. package/build/cjs/core/markdown/MarkdownSerializer.d.ts +4 -1
  6. package/build/cjs/core/markdown/MarkdownSerializer.js +86 -23
  7. package/build/cjs/core/markdown/MarkdownSerializer.js.map +1 -1
  8. package/build/cjs/extensions/additional/QuoteLink/QuoteLinkSpecs/index.js +1 -0
  9. package/build/cjs/extensions/additional/QuoteLink/QuoteLinkSpecs/index.js.map +1 -1
  10. package/build/cjs/extensions/behavior/Clipboard/clipboard.js +2 -13
  11. package/build/cjs/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  12. package/build/cjs/extensions/behavior/Clipboard/selection-content.d.ts +1 -0
  13. package/build/cjs/extensions/behavior/Clipboard/selection-content.js +35 -0
  14. package/build/cjs/extensions/behavior/Clipboard/selection-content.js.map +1 -0
  15. package/build/cjs/extensions/behavior/Selection/commands.d.ts +2 -1
  16. package/build/cjs/extensions/behavior/Selection/commands.js +47 -1
  17. package/build/cjs/extensions/behavior/Selection/commands.js.map +1 -1
  18. package/build/cjs/extensions/behavior/Selection/selection.d.ts +15 -0
  19. package/build/cjs/extensions/behavior/Selection/selection.js +1 -0
  20. package/build/cjs/extensions/behavior/Selection/selection.js.map +1 -1
  21. package/build/cjs/extensions/behavior/SelectionContext/TextSelectionTooltip.d.ts +13 -0
  22. package/build/cjs/extensions/behavior/SelectionContext/TextSelectionTooltip.js +42 -0
  23. package/build/cjs/extensions/behavior/SelectionContext/TextSelectionTooltip.js.map +1 -0
  24. package/build/cjs/extensions/behavior/SelectionContext/index.js +10 -7
  25. package/build/cjs/extensions/behavior/SelectionContext/index.js.map +1 -1
  26. package/build/cjs/extensions/behavior/SelectionContext/tooltip.d.ts +11 -15
  27. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js +24 -56
  28. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  29. package/build/cjs/extensions/behavior/SelectionContext/types.d.ts +10 -0
  30. package/build/cjs/extensions/behavior/SelectionContext/types.js +3 -0
  31. package/build/cjs/extensions/behavior/SelectionContext/types.js.map +1 -0
  32. package/build/cjs/extensions/markdown/Blockquote/BlockquoteSpecs/index.js +1 -0
  33. package/build/cjs/extensions/markdown/Blockquote/BlockquoteSpecs/index.js.map +1 -1
  34. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +2 -2
  35. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +17 -75
  36. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  37. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.d.ts +14 -0
  38. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.js +117 -0
  39. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.js.map +1 -0
  40. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.d.ts +9 -0
  41. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.js +22 -0
  42. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.js.map +1 -0
  43. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +2 -3
  44. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +5 -93
  45. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
  46. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.d.ts +23 -0
  47. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.js +88 -0
  48. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.js.map +1 -0
  49. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js +24 -34
  50. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
  51. package/build/cjs/extensions/markdown/Deflist/DeflistSpecs/schema.js +2 -0
  52. package/build/cjs/extensions/markdown/Deflist/DeflistSpecs/schema.js.map +1 -1
  53. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/const.d.ts +4 -0
  54. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/const.js +9 -0
  55. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/const.js.map +1 -0
  56. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/index.d.ts +3 -5
  57. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/index.js +22 -25
  58. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/index.js.map +1 -1
  59. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/utils.d.ts +7 -0
  60. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/utils.js +15 -0
  61. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/utils.js.map +1 -0
  62. package/build/cjs/extensions/markdown/Heading/actions.d.ts +2 -2
  63. package/build/cjs/extensions/markdown/Heading/actions.js +3 -4
  64. package/build/cjs/extensions/markdown/Heading/actions.js.map +1 -1
  65. package/build/cjs/extensions/markdown/Heading/commands.d.ts +3 -1
  66. package/build/cjs/extensions/markdown/Heading/commands.js +16 -1
  67. package/build/cjs/extensions/markdown/Heading/commands.js.map +1 -1
  68. package/build/cjs/extensions/markdown/Heading/index.js +7 -9
  69. package/build/cjs/extensions/markdown/Heading/index.js.map +1 -1
  70. package/build/cjs/extensions/markdown/Lists/index.js +1 -0
  71. package/build/cjs/extensions/markdown/Lists/index.js.map +1 -1
  72. package/build/cjs/extensions/markdown/Lists/plugins/CollapseListsPlugin.d.ts +14 -2
  73. package/build/cjs/extensions/markdown/Lists/plugins/CollapseListsPlugin.js +97 -51
  74. package/build/cjs/extensions/markdown/Lists/plugins/CollapseListsPlugin.js.map +1 -1
  75. package/build/cjs/extensions/markdown/Table/TableSpecs/schema.js +1 -0
  76. package/build/cjs/extensions/markdown/Table/TableSpecs/schema.js.map +1 -1
  77. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +2 -0
  78. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
  79. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.d.ts +1 -1
  80. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.js +2 -2
  81. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.js.map +1 -1
  82. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.d.ts +3 -7
  83. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.js +72 -90
  84. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.js.map +1 -1
  85. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.d.ts +3 -0
  86. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.js +14 -1
  87. package/build/cjs/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.js.map +1 -1
  88. package/build/cjs/extensions/yfm/YfmHeading/actions.js +2 -10
  89. package/build/cjs/extensions/yfm/YfmHeading/actions.js.map +1 -1
  90. package/build/cjs/extensions/yfm/YfmHeading/commands.d.ts +1 -4
  91. package/build/cjs/extensions/yfm/YfmHeading/commands.js +3 -21
  92. package/build/cjs/extensions/yfm/YfmHeading/commands.js.map +1 -1
  93. package/build/cjs/extensions/yfm/YfmHeading/index.d.ts +3 -22
  94. package/build/cjs/extensions/yfm/YfmHeading/index.js +2 -33
  95. package/build/cjs/extensions/yfm/YfmHeading/index.js.map +1 -1
  96. package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/schema.js +2 -0
  97. package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/schema.js.map +1 -1
  98. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.css +20 -0
  99. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.d.ts +9 -0
  100. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.js +77 -0
  101. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.js.map +1 -0
  102. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.d.ts +1 -2
  103. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.js +5 -65
  104. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.js.map +1 -1
  105. package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/schema.js +2 -0
  106. package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/schema.js.map +1 -1
  107. package/build/cjs/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js +3 -0
  108. package/build/cjs/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js.map +1 -1
  109. package/build/cjs/plugins/BaseTooltip/index.d.ts +1 -0
  110. package/build/cjs/plugins/BaseTooltip/index.js +4 -3
  111. package/build/cjs/plugins/BaseTooltip/index.js.map +1 -1
  112. package/build/cjs/presets/yfm-specs.js +5 -1
  113. package/build/cjs/presets/yfm-specs.js.map +1 -1
  114. package/build/cjs/presets/yfm.js +5 -1
  115. package/build/cjs/presets/yfm.js.map +1 -1
  116. package/build/cjs/toolbar/ToolbarGroup.js +4 -3
  117. package/build/cjs/toolbar/ToolbarGroup.js.map +1 -1
  118. package/build/cjs/toolbar/types.d.ts +2 -0
  119. package/build/cjs/toolbar/types.js.map +1 -1
  120. package/build/cjs/version.js +1 -1
  121. package/build/cjs/version.js.map +1 -1
  122. package/build/esm/core/ExtensionBuilder.d.ts +21 -0
  123. package/build/esm/core/ExtensionBuilder.js +306 -4
  124. package/build/esm/core/ExtensionBuilder.js.map +1 -1
  125. package/build/esm/core/markdown/MarkdownSerializer.d.ts +4 -1
  126. package/build/esm/core/markdown/MarkdownSerializer.js +86 -23
  127. package/build/esm/core/markdown/MarkdownSerializer.js.map +1 -1
  128. package/build/esm/extensions/additional/QuoteLink/QuoteLinkSpecs/index.js +1 -0
  129. package/build/esm/extensions/additional/QuoteLink/QuoteLinkSpecs/index.js.map +1 -1
  130. package/build/esm/extensions/behavior/Clipboard/clipboard.js +1 -12
  131. package/build/esm/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  132. package/build/esm/extensions/behavior/Clipboard/selection-content.d.ts +1 -0
  133. package/build/esm/extensions/behavior/Clipboard/selection-content.js +32 -0
  134. package/build/esm/extensions/behavior/Clipboard/selection-content.js.map +1 -0
  135. package/build/esm/extensions/behavior/Selection/commands.d.ts +2 -1
  136. package/build/esm/extensions/behavior/Selection/commands.js +47 -2
  137. package/build/esm/extensions/behavior/Selection/commands.js.map +1 -1
  138. package/build/esm/extensions/behavior/Selection/selection.d.ts +15 -0
  139. package/build/esm/extensions/behavior/Selection/selection.js +2 -1
  140. package/build/esm/extensions/behavior/Selection/selection.js.map +1 -1
  141. package/build/esm/extensions/behavior/SelectionContext/TextSelectionTooltip.d.ts +13 -0
  142. package/build/esm/extensions/behavior/SelectionContext/TextSelectionTooltip.js +38 -0
  143. package/build/esm/extensions/behavior/SelectionContext/TextSelectionTooltip.js.map +1 -0
  144. package/build/esm/extensions/behavior/SelectionContext/index.js +10 -7
  145. package/build/esm/extensions/behavior/SelectionContext/index.js.map +1 -1
  146. package/build/esm/extensions/behavior/SelectionContext/tooltip.d.ts +11 -15
  147. package/build/esm/extensions/behavior/SelectionContext/tooltip.js +24 -56
  148. package/build/esm/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  149. package/build/esm/extensions/behavior/SelectionContext/types.d.ts +10 -0
  150. package/build/esm/extensions/behavior/SelectionContext/types.js +2 -0
  151. package/build/esm/extensions/behavior/SelectionContext/types.js.map +1 -0
  152. package/build/esm/extensions/markdown/Blockquote/BlockquoteSpecs/index.js +1 -0
  153. package/build/esm/extensions/markdown/Blockquote/BlockquoteSpecs/index.js.map +1 -1
  154. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +2 -2
  155. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +17 -75
  156. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  157. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.d.ts +14 -0
  158. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.js +114 -0
  159. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.js.map +1 -0
  160. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.d.ts +9 -0
  161. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.js +19 -0
  162. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.js.map +1 -0
  163. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +2 -3
  164. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +6 -94
  165. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
  166. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.d.ts +23 -0
  167. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.js +83 -0
  168. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.js.map +1 -0
  169. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js +24 -34
  170. package/build/esm/extensions/markdown/CodeBlock/CodeBlockSpecs/index.js.map +1 -1
  171. package/build/esm/extensions/markdown/Deflist/DeflistSpecs/schema.js +2 -0
  172. package/build/esm/extensions/markdown/Deflist/DeflistSpecs/schema.js.map +1 -1
  173. package/build/esm/extensions/markdown/Heading/HeadingSpecs/const.d.ts +4 -0
  174. package/build/esm/extensions/markdown/Heading/HeadingSpecs/const.js +6 -0
  175. package/build/esm/extensions/markdown/Heading/HeadingSpecs/const.js.map +1 -0
  176. package/build/esm/extensions/markdown/Heading/HeadingSpecs/index.d.ts +3 -5
  177. package/build/esm/extensions/markdown/Heading/HeadingSpecs/index.js +5 -10
  178. package/build/esm/extensions/markdown/Heading/HeadingSpecs/index.js.map +1 -1
  179. package/build/esm/extensions/markdown/Heading/HeadingSpecs/utils.d.ts +7 -0
  180. package/build/esm/extensions/markdown/Heading/HeadingSpecs/utils.js +12 -0
  181. package/build/esm/extensions/markdown/Heading/HeadingSpecs/utils.js.map +1 -0
  182. package/build/esm/extensions/markdown/Heading/actions.d.ts +2 -2
  183. package/build/esm/extensions/markdown/Heading/actions.js +3 -4
  184. package/build/esm/extensions/markdown/Heading/actions.js.map +1 -1
  185. package/build/esm/extensions/markdown/Heading/commands.d.ts +3 -1
  186. package/build/esm/extensions/markdown/Heading/commands.js +15 -1
  187. package/build/esm/extensions/markdown/Heading/commands.js.map +1 -1
  188. package/build/esm/extensions/markdown/Heading/index.js +9 -11
  189. package/build/esm/extensions/markdown/Heading/index.js.map +1 -1
  190. package/build/esm/extensions/markdown/Lists/index.js +1 -0
  191. package/build/esm/extensions/markdown/Lists/index.js.map +1 -1
  192. package/build/esm/extensions/markdown/Lists/plugins/CollapseListsPlugin.d.ts +14 -2
  193. package/build/esm/extensions/markdown/Lists/plugins/CollapseListsPlugin.js +95 -49
  194. package/build/esm/extensions/markdown/Lists/plugins/CollapseListsPlugin.js.map +1 -1
  195. package/build/esm/extensions/markdown/Table/TableSpecs/schema.js +1 -0
  196. package/build/esm/extensions/markdown/Table/TableSpecs/schema.js.map +1 -1
  197. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +2 -0
  198. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
  199. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.d.ts +1 -1
  200. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.js +3 -3
  201. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/const.js.map +1 -1
  202. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.d.ts +3 -7
  203. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.js +70 -90
  204. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/index.js.map +1 -1
  205. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.d.ts +3 -0
  206. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.js +11 -0
  207. package/build/esm/extensions/yfm/YfmHeading/YfmHeadingSpecs/utils.js.map +1 -1
  208. package/build/esm/extensions/yfm/YfmHeading/actions.js +2 -10
  209. package/build/esm/extensions/yfm/YfmHeading/actions.js.map +1 -1
  210. package/build/esm/extensions/yfm/YfmHeading/commands.d.ts +1 -4
  211. package/build/esm/extensions/yfm/YfmHeading/commands.js +3 -21
  212. package/build/esm/extensions/yfm/YfmHeading/commands.js.map +1 -1
  213. package/build/esm/extensions/yfm/YfmHeading/index.d.ts +3 -22
  214. package/build/esm/extensions/yfm/YfmHeading/index.js +0 -31
  215. package/build/esm/extensions/yfm/YfmHeading/index.js.map +1 -1
  216. package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/schema.js +2 -0
  217. package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/schema.js.map +1 -1
  218. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.css +20 -0
  219. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.d.ts +9 -0
  220. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.js +74 -0
  221. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.js.map +1 -0
  222. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.d.ts +1 -2
  223. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.js +4 -64
  224. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.js.map +1 -1
  225. package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/schema.js +2 -0
  226. package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/schema.js.map +1 -1
  227. package/build/esm/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js +3 -0
  228. package/build/esm/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js.map +1 -1
  229. package/build/esm/plugins/BaseTooltip/index.d.ts +1 -0
  230. package/build/esm/plugins/BaseTooltip/index.js +4 -3
  231. package/build/esm/plugins/BaseTooltip/index.js.map +1 -1
  232. package/build/esm/presets/yfm-specs.js +5 -1
  233. package/build/esm/presets/yfm-specs.js.map +1 -1
  234. package/build/esm/presets/yfm.js +5 -1
  235. package/build/esm/presets/yfm.js.map +1 -1
  236. package/build/esm/toolbar/ToolbarGroup.js +4 -3
  237. package/build/esm/toolbar/ToolbarGroup.js.map +1 -1
  238. package/build/esm/toolbar/types.d.ts +2 -0
  239. package/build/esm/toolbar/types.js.map +1 -1
  240. package/build/esm/version.js +1 -1
  241. package/build/esm/version.js.map +1 -1
  242. package/build/styles.css +9 -5
  243. package/package.json +5 -4
  244. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.css +0 -16
  245. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.css +0 -16
@@ -1,3 +1,4 @@
1
+ const blankMark = { open: '', close: '', mixable: false };
1
2
  export class MarkdownSerializer {
2
3
  nodes;
3
4
  marks;
@@ -69,6 +70,7 @@ export class MarkdownSerializerState {
69
70
  inTightList;
70
71
  noAutoBlank;
71
72
  isAutolink;
73
+ atBlockStart;
72
74
  escapeWhitespace;
73
75
  escapeCharacters;
74
76
  nodes;
@@ -85,6 +87,7 @@ export class MarkdownSerializerState {
85
87
  this.inTightList = false;
86
88
  this.noAutoBlank = false;
87
89
  this.isAutolink = undefined;
90
+ this.atBlockStart = false;
88
91
  this.escapeWhitespace = false;
89
92
  // :: Object
90
93
  // The options passed to the serializer.
@@ -169,11 +172,13 @@ export class MarkdownSerializerState {
169
172
  text(text, escape) {
170
173
  const lines = text.split('\n');
171
174
  for (let i = 0; i < lines.length; i++) {
172
- const startOfLine = this.atBlank() || this.closed;
173
175
  this.write();
176
+ // Escape ! before [ to prevent being parsed as image syntax
177
+ if (escape === false && lines[i][0] === '[' && /(^|[^\\])!$/.test(this.out))
178
+ this.out = this.out.slice(0, this.out.length - 1) + '\\!';
174
179
  let text = lines[i];
175
180
  if (escape !== false && this.options.escape !== false)
176
- text = this.esc(text, startOfLine);
181
+ text = this.esc(text, this.atBlockStart);
177
182
  if (this.escapeWhitespace)
178
183
  text = this.escWhitespace(text);
179
184
  this.out += text;
@@ -187,15 +192,27 @@ export class MarkdownSerializerState {
187
192
  if (typeof parent === 'number') {
188
193
  throw new Error('!');
189
194
  }
190
- if (!this.nodes[node.type.name]) {
191
- throw new Error('Token type `' + node.type.name + '` not supported by Markdown renderer');
192
- }
193
195
  const callback = this.nodes[node.type.name];
194
- if (this.dynamicModifier) {
195
- this.dynamicModifier.processNode(this, node, parent, index, callback);
196
+ if (callback) {
197
+ if (this.dynamicModifier) {
198
+ this.dynamicModifier.processNode(this, node, parent, index, callback);
199
+ }
200
+ else {
201
+ callback(this, node, parent, index);
202
+ }
196
203
  }
197
204
  else {
198
- callback(this, node, parent, index);
205
+ if (this.options.strict !== false) {
206
+ throw new Error('Token type `' + node.type.name + '` not supported by Markdown renderer');
207
+ }
208
+ else if (!node.type.isLeaf) {
209
+ if (node.type.inlineContent)
210
+ this.renderInline(node);
211
+ else
212
+ this.renderContent(node);
213
+ if (node.isBlock)
214
+ this.closeBlock(node);
215
+ }
199
216
  }
200
217
  }
201
218
  // :: (Node)
@@ -203,9 +220,9 @@ export class MarkdownSerializerState {
203
220
  renderContent(parent) {
204
221
  parent.forEach((node, _, i) => this.render(node, parent, i));
205
222
  }
206
- // :: (Node)
207
223
  // Render the contents of `parent` as inline content.
208
- renderInline(parent) {
224
+ renderInline(parent, fromBlockStart = true) {
225
+ this.atBlockStart = fromBlockStart;
209
226
  const active = [];
210
227
  let trailing = '';
211
228
  const progress = (node, _, index) => {
@@ -217,7 +234,7 @@ export class MarkdownSerializerState {
217
234
  marks = marks.filter((m) => {
218
235
  if (index === 0)
219
236
  return false;
220
- if (index + 1 == parent.childCount)
237
+ if (index + 1 === parent.childCount)
221
238
  return false;
222
239
  const prev = parent.child(index - 1);
223
240
  const next = parent.child(index + 1);
@@ -230,20 +247,31 @@ export class MarkdownSerializerState {
230
247
  // If whitespace has to be expelled from the node, adjust
231
248
  // leading and trailing accordingly.
232
249
  if (node && node.isText && marks.some((mark) => {
233
- const info = this.marks[mark.type.name];
234
- return info && info.expelEnclosingWhitespace;
250
+ const info = this.getMark(mark.type.name);
251
+ return info && info.expelEnclosingWhitespace && !mark.isInSet(active);
235
252
  })) {
236
- const [_, lead, inner, trail] = /^(\s*)(.*?)(\s*)$/m.exec(node.text ?? '');
237
- leading += lead;
238
- trailing = trail;
239
- if (lead || trail) {
240
- node = inner ? node.withText(inner) : null;
253
+ const [_, lead, rest] = /^(\s*)(.*)$/m.exec(node.text);
254
+ if (lead) {
255
+ leading += lead;
256
+ node = rest ? node.withText(rest) : null;
257
+ if (!node)
258
+ marks = active;
259
+ }
260
+ }
261
+ if (node && node.isText && marks.some((mark) => {
262
+ const info = this.getMark(mark.type.name);
263
+ return info && info.expelEnclosingWhitespace && !this.isMarkAhead(parent, index + 1, mark);
264
+ })) {
265
+ const [_, rest, trail] = /^(.*?)(\s*)$/m.exec(node.text);
266
+ if (trail) {
267
+ trailing = trail;
268
+ node = rest ? node.withText(rest) : null;
241
269
  if (!node)
242
270
  marks = active;
243
271
  }
244
272
  }
245
273
  const inner = marks.length && marks[marks.length - 1];
246
- const noEsc = inner && this.marks[inner.type.name].escape === false;
274
+ const noEsc = inner && this.getMark(inner.type.name).escape === false;
247
275
  const len = marks.length - (noEsc ? 1 : 0);
248
276
  // Try to reorder 'mixable' marks, such as em and strong, which
249
277
  // in Markdown may be opened and closed in different order, so
@@ -252,11 +280,11 @@ export class MarkdownSerializerState {
252
280
  // eslint-disable-next-line no-labels
253
281
  outer: for (let i = 0; i < len; i++) {
254
282
  const mark = marks[i];
255
- if (!this.marks[mark.type.name].mixable)
283
+ if (!this.getMark(mark.type.name).mixable)
256
284
  break;
257
285
  for (let j = 0; j < active.length; j++) {
258
286
  const other = active[j];
259
- if (!this.marks[other.type.name].mixable)
287
+ if (!this.getMark(other.type.name).mixable)
260
288
  break;
261
289
  if (mark.eq(other)) {
262
290
  if (i > j) {
@@ -287,6 +315,7 @@ export class MarkdownSerializerState {
287
315
  const add = marks[active.length];
288
316
  active.push(add);
289
317
  this.text(this.markString(add, true, parent, index), false);
318
+ this.atBlockStart = false;
290
319
  }
291
320
  // Render the node. Special case code marks, since their content
292
321
  // may not be escaped.
@@ -297,10 +326,21 @@ export class MarkdownSerializerState {
297
326
  else {
298
327
  this.render(node, parent, index);
299
328
  }
329
+ this.atBlockStart = false;
330
+ }
331
+ // After the first non-empty text node is rendered, the end of output
332
+ // is no longer at block start.
333
+ //
334
+ // FIXME: If a non-text node writes something to the output for this
335
+ // block, the end of output is also no longer at block start. But how
336
+ // can we detect that?
337
+ if (node?.isText && node.nodeSize > 0) {
338
+ this.atBlockStart = false;
300
339
  }
301
340
  };
302
341
  parent.forEach(progress);
303
342
  progress(null, null, parent.childCount);
343
+ this.atBlockStart = false;
304
344
  }
305
345
  // :: (Node, string, (number) → string)
306
346
  // Render a node's content as a list. `delim` should be the extra
@@ -330,13 +370,17 @@ export class MarkdownSerializerState {
330
370
  // have special meaning only at the start of the line.
331
371
  esc(str, startOfLine = false) {
332
372
  // eslint-disable-next-line no-useless-escape
333
- const defaultEsc = /[`\^+*\\\|~\[\]\{\}<>\$_]/g;
373
+ const defaultEsc = /[`\^+*\\\|~\[\]\{\}<>\$]/g;
334
374
  const extraChars = this.escapeCharacters?.length ? this.escapeCharacters.map(c => '\\' + c).join('') : '';
335
375
  const escRegexp = this.options?.commonEscape ||
336
376
  // Compose the escape regexp from default, options, and extra characters
337
377
  new RegExp(defaultEsc.source + (extraChars ? `|[${extraChars}]` : ''), 'g');
338
378
  const startOfLineEscRegexp = this.options?.startOfLineEscape || /^[:#\-*+>]/;
339
379
  str = str.replace(escRegexp, '\\$&');
380
+ // Smart underscore: don't escape _ between word characters (e.g. foo_bar)
381
+ str = str.replace(/_/g, (m, i) => i > 0 && i + 1 < str.length && /\w/.test(str[i - 1]) && /\w/.test(str[i + 1])
382
+ ? m
383
+ : '\\' + m);
340
384
  if (startOfLine)
341
385
  str = str.replace(startOfLineEscRegexp, '\\$&').replace(/^(\s*\d+)\./, '$1\\.');
342
386
  return str;
@@ -360,7 +404,7 @@ export class MarkdownSerializerState {
360
404
  // :: (Mark, bool, string?) → string
361
405
  // Get the markdown string for a given opening or closing mark.
362
406
  markString(mark, open, parent, index) {
363
- const info = this.marks[mark.type.name];
407
+ const info = this.getMark(mark.type.name);
364
408
  const value = open ? info.open : info.close;
365
409
  return typeof value === 'string' ? value : value(this, mark, parent, index);
366
410
  }
@@ -374,5 +418,24 @@ export class MarkdownSerializerState {
374
418
  trailing: (text.match(/(\s+)$/) || [])[0],
375
419
  };
376
420
  }
421
+ isMarkAhead(parent, index, mark) {
422
+ for (;; index++) {
423
+ if (index >= parent.childCount)
424
+ return false;
425
+ const next = parent.child(index);
426
+ if (!next.type.spec.isBreak)
427
+ return !!mark.isInSet(next.marks);
428
+ }
429
+ }
430
+ // Get mark info by name, with fallback to blankMark when strict mode is off.
431
+ getMark(name) {
432
+ const info = this.marks[name];
433
+ if (!info) {
434
+ if (this.options.strict !== false)
435
+ throw new Error(`Mark type \`${name}\` not supported by Markdown renderer`);
436
+ return blankMark;
437
+ }
438
+ return info;
439
+ }
377
440
  }
378
441
  //# sourceMappingURL=MarkdownSerializer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownSerializer.js","sourceRoot":"../../../../src","sources":["core/markdown/MarkdownSerializer.ts"],"names":[],"mappings":"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","sourcesContent":["// ::- A specification for serializing a ProseMirror document as\n// Markdown/CommonMark text.\n// prettier-ignore\nimport type {Mark, Node} from \"prosemirror-model\";\n\nimport type {MarkdownSerializerDynamicModifier} from './MarkdownSerializerDynamicModifier';\n\nexport interface SerializerNodeToken {\n (state: MarkdownSerializerState, node: Node, parent: Node, index: number): void;\n}\n\nexport interface SerializerMarkToken {\n open:\n | string\n | ((state: MarkdownSerializerState, mark: Mark, parent: Node, index: number) => string);\n close:\n | string\n | ((state: MarkdownSerializerState, mark: Mark, parent: Node, index: number) => string);\n mixable?: boolean;\n expelEnclosingWhitespace?: boolean;\n escape?: boolean;\n}\n\ninterface SerializerOptions {\n tightLists?: boolean;\n escapeExtraCharacters?: RegExp;\n hardBreakNodeName?: string;\n strict?: boolean;\n commonEscape?: RegExp;\n startOfLineEscape?: RegExp;\n escape?: boolean; // Added to fix types\n}\n\ninterface MarkMap {\n [markName: string]: SerializerMarkToken;\n}\n\ninterface NodeMap {\n [nodeName: string]: SerializerNodeToken;\n}\n\nexport class MarkdownSerializer {\n private readonly nodes: NodeMap;\n private readonly marks: MarkMap;\n private readonly dynamicModifier?: MarkdownSerializerDynamicModifier;\n\n // :: (Object<(state: MarkdownSerializerState, node: Node, parent: Node, index: number)>, Object)\n // Construct a serializer with the given configuration. The `nodes`\n // object should map node names in a given schema to function that\n // take a serializer state and such a node, and serialize the node.\n //\n // The `marks` object should hold objects with `open` and `close`\n // properties, which hold the strings that should appear before and\n // after a piece of text marked that way, either directly or as a\n // function that takes a serializer state and a mark, and returns a\n // string. `open` and `close` can also be functions, which will be\n // called as\n //\n // (state: MarkdownSerializerState, mark: Mark,\n // parent: Fragment, index: number) → string\n //\n // Where `parent` and `index` allow you to inspect the mark's\n // context to see which nodes it applies to.\n //\n // Mark information objects can also have a `mixable` property\n // which, when `true`, indicates that the order in which the mark's\n // opening and closing syntax appears relative to other mixable\n // marks can be varied. (For example, you can say `**a *b***` and\n // `*a **b***`, but not `` `a *b*` ``.)\n //\n // To disable character escaping in a mark, you can give it an\n // `escape` property of `false`. Such a mark has to have the highest\n // precedence (must always be the innermost mark).\n //\n // The `expelEnclosingWhitespace` mark property causes the\n // serializer to move enclosing whitespace from inside the marks to\n // outside the marks. This is necessary for emphasis marks as\n // CommonMark does not permit enclosing whitespace inside emphasis\n // marks, see: http://spec.commonmark.org/0.26/#example-330\n constructor(\n nodes: NodeMap,\n marks: MarkMap,\n dynamicModifier?: MarkdownSerializerDynamicModifier,\n ) {\n // :: Object<(MarkdownSerializerState, Node)> The node serializer\n // functions for this serializer.\n this.nodes = nodes;\n // :: Object The mark serializer info.\n this.marks = marks;\n\n this.dynamicModifier = dynamicModifier;\n }\n\n // :: (Node, ?Object) → string\n // Serialize the content of the given node to\n // [CommonMark](http://commonmark.org/).\n serialize(content: Node, options: Partial<SerializerOptions> = {}): string {\n const state = new MarkdownSerializerState(\n this.nodes,\n this.marks,\n options,\n this.dynamicModifier,\n );\n state.renderContent(content);\n return state.out;\n }\n\n // for tests (implements SerializerTests interface)\n containsNode(nodeName: string): boolean {\n return nodeName in this.nodes;\n }\n\n // for tests (implements SerializerTests interface)\n containsMark(markName: string): boolean {\n return markName in this.marks;\n }\n}\n\n// ::- This is an object used to track state and expose\n// methods related to markdown serialization. Instances are passed to\n// node and mark serialization methods (see `toMarkdown`).\n// prettier-ignore\nexport class MarkdownSerializerState {\n out: string;\n inTightList: boolean;\n noAutoBlank: boolean;\n isAutolink: boolean | undefined;\n escapeWhitespace: boolean;\n escapeCharacters?: string[];\n\n private readonly nodes: NodeMap;\n private readonly marks: MarkMap;\n private readonly options: SerializerOptions;\n private delim: string;\n private closed: Node | false;\n private readonly dynamicModifier?: MarkdownSerializerDynamicModifier;\n\n constructor(nodes: NodeMap, marks: MarkMap, options: Partial<SerializerOptions> = {}, dynamicModifier?: MarkdownSerializerDynamicModifier) {\n this.nodes = nodes;\n this.marks = marks;\n this.delim = this.out = '';\n this.closed = false;\n this.inTightList = false;\n this.noAutoBlank = false;\n this.isAutolink = undefined;\n this.escapeWhitespace = false;\n // :: Object\n // The options passed to the serializer.\n // tightLists:: ?bool\n // Whether to render lists in a tight style. This can be overridden\n // on a node level by specifying a tight attribute on the node.\n // Defaults to false.\n this.options = options || {};\n this.dynamicModifier = dynamicModifier;\n if (typeof this.options.tightLists === 'undefined') { this.options.tightLists = false }\n }\n\n setNoAutoBlank() {\n this.noAutoBlank = true;\n }\n\n unsetNoAutoBlank() {\n this.noAutoBlank = false;\n }\n\n flushClose(size?: number | null) {\n if (this.closed) {\n if (!this.atBlank() && !this.noAutoBlank) this.out += '\\n';\n if (size === null || size === undefined) size = 2;\n if (size > 1) {\n let delimMin = this.delim;\n const trim = /\\s+$/.exec(delimMin);\n if (trim) delimMin = delimMin.slice(0, delimMin.length - trim[0].length);\n\n if (!this.noAutoBlank) {\n for (let i = 1; i < size; i++) { this.out += delimMin + '\\n' }\n }\n }\n this.closed = false;\n }\n }\n\n // :: (string, ?string, Node, ())\n // Render a block, prefixing each line with `delim`, and the first\n // line in `firstDelim`. `node` should be the node that is closed at\n // the end of the block, and `f` is a function that renders the\n // content of the block.\n wrapBlock(delim: string, firstDelim: string | null, node: Node, f: () => void) {\n const old = this.delim;\n this.write(firstDelim || delim);\n this.delim += delim;\n f();\n this.delim = old;\n this.closeBlock(node);\n }\n\n atBlank(): boolean {\n return /(^|\\n)$/.test(this.out);\n }\n\n // :: ()\n // Ensure the current content ends with a newline.\n ensureNewLine() {\n if (!this.atBlank()) this.out += '\\n';\n }\n\n // :: (?string)\n // Prepare the state for writing output (closing closed paragraphs,\n // adding delimiters, and so on), and then optionally add content\n // (unescaped) to the output.\n write(content?: string | null): void {\n this.flushClose();\n if (this.delim && this.atBlank()) { this.out += this.delim }\n if (content) this.out += content;\n }\n\n // :: (Node)\n // Close the block for the given node.\n closeBlock(node?: Node) {\n this.closed = node ?? false;\n }\n\n // :: (string, ?bool)\n // Add the given text to the document. When escape is not `false`,\n // it will be escaped.\n text(text: string, escape?: boolean) {\n const lines = text.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const startOfLine = this.atBlank() || this.closed;\n this.write();\n let text = lines[i];\n if (escape !== false && this.options.escape !== false) text = this.esc(text, startOfLine as any)\n if (this.escapeWhitespace) text = this.escWhitespace(text);\n this.out += text\n if (i != lines.length - 1) this.out += '\\n';\n }\n }\n\n // :: (Node)\n // Render the given node as a block.\n render(node: Node, parent: Node, index: number) {\n if (typeof parent === 'number') {\n throw new Error('!');\n }\n if (!this.nodes[node.type.name]) {\n throw new Error('Token type `' + node.type.name + '` not supported by Markdown renderer');\n }\n\n const callback = this.nodes[node.type.name];\n if (this.dynamicModifier) {\n this.dynamicModifier.processNode(this, node, parent, index, callback);\n } else {\n callback(this, node, parent, index);\n }\n }\n\n // :: (Node)\n // Render the contents of `parent` as block nodes.\n renderContent(parent: Node) {\n parent.forEach((node, _, i) => this.render(node, parent, i));\n }\n\n // :: (Node)\n // Render the contents of `parent` as inline content.\n renderInline(parent: Node) {\n const active: Mark[] = []; let\n trailing = '';\n const progress = (node: Node | null, _: any, index: number) => {\n let marks = node ? node.marks : [];\n\n // Remove marks from breaks (hard_break or soft_break) that are the edge node inside\n // that mark to prevent parser edge cases with new lines just\n // before closing or after opening marks.\n if (node && node.type.spec.isBreak) {\n marks = marks.filter((m: any) => {\n if (index === 0) return false;\n if (index + 1 == parent.childCount) return false;\n const prev = parent.child(index - 1);\n const next = parent.child(index + 1);\n return (\n (m.isInSet(prev.marks) && (!prev.isText || /\\S/.test(prev.text ?? ''))) &&\n (m.isInSet(next.marks) && (!next.isText || /\\S/.test(next.text ?? '')))\n );\n });\n }\n\n let leading = trailing;\n trailing = '';\n // If whitespace has to be expelled from the node, adjust\n // leading and trailing accordingly.\n if (node && node.isText && marks.some((mark: any) => {\n const info = this.marks[mark.type.name];\n return info && info.expelEnclosingWhitespace;\n })) {\n const [_, lead, inner, trail] = /^(\\s*)(.*?)(\\s*)$/m.exec(node.text ?? '')!;\n leading += lead;\n trailing = trail;\n if (lead || trail) {\n node = inner ? (node as any).withText(inner) : null;\n if (!node) marks = active;\n }\n }\n\n const inner = marks.length && marks[marks.length - 1];\n const noEsc = inner && this.marks[inner.type.name].escape === false;\n const len = marks.length - (noEsc ? 1 : 0);\n\n // Try to reorder 'mixable' marks, such as em and strong, which\n // in Markdown may be opened and closed in different order, so\n // that order of the marks for the token matches the order in\n // active.\n // eslint-disable-next-line no-labels\n outer: for (let i = 0; i < len; i++) {\n const mark = marks[i];\n if (!this.marks[mark.type.name].mixable) break;\n for (let j = 0; j < active.length; j++) {\n const other = active[j];\n if (!this.marks[other.type.name].mixable) break;\n if (mark.eq(other)) {\n if (i > j) { marks = marks.slice(0, j).concat(mark).concat(marks.slice(j, i)).concat(marks.slice(i + 1, len)) } else if (j > i) { marks = marks.slice(0, i).concat(marks.slice(i + 1, j)).concat(mark).concat(marks.slice(j, len)) }\n // eslint-disable-next-line no-labels\n continue outer;\n }\n }\n }\n\n // Find the prefix of the mark set that didn't change\n let keep = 0;\n while (keep < Math.min(active.length, len) && marks[keep].eq(active[keep])) ++keep;\n\n // Close the marks that need to be closed\n while (keep < active.length) {\n this.text(this.markString(active.pop()!, false, parent, index), false)\n }\n\n // Output any previously expelled trailing whitespace outside the marks\n if (leading) this.text(leading)\n\n // Open the marks that need to be opened\n if (node) {\n while (active.length < len) {\n const add = marks[active.length];\n active.push(add);\n this.text(this.markString(add, true, parent, index), false);\n }\n\n // Render the node. Special case code marks, since their content\n // may not be escaped.\n if (noEsc && node.isText) {\n this.text(this.markString(inner, true, parent, index) + node.text +\n this.markString(inner, false, parent, index + 1), false);\n } else { this.render(node, parent, index) }\n }\n };\n parent.forEach(progress);\n progress(null, null, parent.childCount);\n }\n\n // :: (Node, string, (number) → string)\n // Render a node's content as a list. `delim` should be the extra\n // indentation added to all lines except the first in an item,\n // `firstDelim` is a function going from an item index to a\n // delimiter for the first line of the item.\n renderList(node: Node, delim: string, firstDelim: (index: number, firstDelimNode: Node) => string): void {\n if (this.closed && this.closed.type == node.type) { this.flushClose(3) } else if (this.inTightList) { this.flushClose(1) }\n\n const isTight = typeof node.attrs.tight !== 'undefined' ? node.attrs.tight : this.options.tightLists;\n const prevTight = this.inTightList;\n this.inTightList = isTight;\n node.forEach((child: any, _: any, i: any) => {\n if (i && isTight) this.flushClose(1);\n this.wrapBlock(delim, firstDelim(i, child), node, () => this.render(child, node, i))\n });\n this.inTightList = prevTight;\n }\n\n // :: (string, ?bool) → string\n // Escape the given string so that it can safely appear in Markdown\n // content. If `startOfLine` is true, also escape characters that\n // have special meaning only at the start of the line.\n esc(str: string, startOfLine = false) {\n // eslint-disable-next-line no-useless-escape\n const defaultEsc = /[`\\^+*\\\\\\|~\\[\\]\\{\\}<>\\$_]/g;\n const extraChars = this.escapeCharacters?.length ? this.escapeCharacters.map(c => '\\\\' + c).join('') : '';\n const escRegexp = this.options?.commonEscape ||\n // Compose the escape regexp from default, options, and extra characters\n new RegExp(defaultEsc.source + (extraChars ? `|[${extraChars}]` : ''), 'g');\n\n const startOfLineEscRegexp = this.options?.startOfLineEscape || /^[:#\\-*+>]/;\n\n str = str.replace(escRegexp, '\\\\$&');\n if (startOfLine) str = str.replace(startOfLineEscRegexp, '\\\\$&').replace(/^(\\s*\\d+)\\./, '$1\\\\.');\n return str;\n }\n\n escWhitespace(str: string): string {\n return str.replace(/ /g, '\\\\ ');\n }\n\n /// @internal\n quote(str: string): string {\n const wrap = str.indexOf('\"') == -1 ? '\"\"' : str.indexOf(\"'\") == -1 ? \"''\" : '()';\n return wrap[0] + str + wrap[1];\n }\n\n // :: (string, number) → string\n // Repeat the given string `n` times.\n repeat(str: string, n: number) {\n let out = '';\n for (let i = 0; i < n; i++) out += str;\n return out;\n }\n\n // :: (Mark, bool, string?) → string\n // Get the markdown string for a given opening or closing mark.\n markString(mark: Mark, open: boolean, parent: Node, index: number): string {\n const info = this.marks[mark.type.name];\n const value = open ? info.open : info.close;\n return typeof value === 'string' ? value : value(this, mark, parent, index);\n }\n\n // :: (string) → { leading: ?string, trailing: ?string }\n // Get leading and trailing whitespace from a string. Values of\n // leading or trailing property of the return object will be undefined\n // if there is no match.\n getEnclosingWhitespace(text: string) {\n return {\n leading: (text.match(/^(\\s+)/) || [])[0],\n trailing: (text.match(/(\\s+)$/) || [])[0],\n };\n }\n}\n"]}
1
+ {"version":3,"file":"MarkdownSerializer.js","sourceRoot":"../../../../src","sources":["core/markdown/MarkdownSerializer.ts"],"names":[],"mappings":"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","sourcesContent":["// ::- A specification for serializing a ProseMirror document as\n// Markdown/CommonMark text.\n// prettier-ignore\nimport type {Mark, Node} from \"prosemirror-model\";\n\nimport type {MarkdownSerializerDynamicModifier} from './MarkdownSerializerDynamicModifier';\n\nexport interface SerializerNodeToken {\n (state: MarkdownSerializerState, node: Node, parent: Node, index: number): void;\n}\n\nexport interface SerializerMarkToken {\n open:\n | string\n | ((state: MarkdownSerializerState, mark: Mark, parent: Node, index: number) => string);\n close:\n | string\n | ((state: MarkdownSerializerState, mark: Mark, parent: Node, index: number) => string);\n mixable?: boolean;\n expelEnclosingWhitespace?: boolean;\n escape?: boolean;\n}\n\ninterface SerializerOptions {\n tightLists?: boolean;\n escapeExtraCharacters?: RegExp;\n hardBreakNodeName?: string;\n strict?: boolean;\n commonEscape?: RegExp;\n startOfLineEscape?: RegExp;\n escape?: boolean; // Added to fix types\n}\n\nconst blankMark: SerializerMarkToken = {open: '', close: '', mixable: false};\n\ninterface MarkMap {\n [markName: string]: SerializerMarkToken;\n}\n\ninterface NodeMap {\n [nodeName: string]: SerializerNodeToken;\n}\n\nexport class MarkdownSerializer {\n private readonly nodes: NodeMap;\n private readonly marks: MarkMap;\n private readonly dynamicModifier?: MarkdownSerializerDynamicModifier;\n\n // :: (Object<(state: MarkdownSerializerState, node: Node, parent: Node, index: number)>, Object)\n // Construct a serializer with the given configuration. The `nodes`\n // object should map node names in a given schema to function that\n // take a serializer state and such a node, and serialize the node.\n //\n // The `marks` object should hold objects with `open` and `close`\n // properties, which hold the strings that should appear before and\n // after a piece of text marked that way, either directly or as a\n // function that takes a serializer state and a mark, and returns a\n // string. `open` and `close` can also be functions, which will be\n // called as\n //\n // (state: MarkdownSerializerState, mark: Mark,\n // parent: Fragment, index: number) → string\n //\n // Where `parent` and `index` allow you to inspect the mark's\n // context to see which nodes it applies to.\n //\n // Mark information objects can also have a `mixable` property\n // which, when `true`, indicates that the order in which the mark's\n // opening and closing syntax appears relative to other mixable\n // marks can be varied. (For example, you can say `**a *b***` and\n // `*a **b***`, but not `` `a *b*` ``.)\n //\n // To disable character escaping in a mark, you can give it an\n // `escape` property of `false`. Such a mark has to have the highest\n // precedence (must always be the innermost mark).\n //\n // The `expelEnclosingWhitespace` mark property causes the\n // serializer to move enclosing whitespace from inside the marks to\n // outside the marks. This is necessary for emphasis marks as\n // CommonMark does not permit enclosing whitespace inside emphasis\n // marks, see: http://spec.commonmark.org/0.26/#example-330\n constructor(\n nodes: NodeMap,\n marks: MarkMap,\n dynamicModifier?: MarkdownSerializerDynamicModifier,\n ) {\n // :: Object<(MarkdownSerializerState, Node)> The node serializer\n // functions for this serializer.\n this.nodes = nodes;\n // :: Object The mark serializer info.\n this.marks = marks;\n\n this.dynamicModifier = dynamicModifier;\n }\n\n // :: (Node, ?Object) → string\n // Serialize the content of the given node to\n // [CommonMark](http://commonmark.org/).\n serialize(content: Node, options: Partial<SerializerOptions> = {}): string {\n const state = new MarkdownSerializerState(\n this.nodes,\n this.marks,\n options,\n this.dynamicModifier,\n );\n state.renderContent(content);\n return state.out;\n }\n\n // for tests (implements SerializerTests interface)\n containsNode(nodeName: string): boolean {\n return nodeName in this.nodes;\n }\n\n // for tests (implements SerializerTests interface)\n containsMark(markName: string): boolean {\n return markName in this.marks;\n }\n}\n\n// ::- This is an object used to track state and expose\n// methods related to markdown serialization. Instances are passed to\n// node and mark serialization methods (see `toMarkdown`).\n// prettier-ignore\nexport class MarkdownSerializerState {\n out: string;\n inTightList: boolean;\n noAutoBlank: boolean;\n isAutolink: boolean | undefined;\n atBlockStart: boolean;\n escapeWhitespace: boolean;\n escapeCharacters?: string[];\n\n private readonly nodes: NodeMap;\n private readonly marks: MarkMap;\n private readonly options: SerializerOptions;\n private delim: string;\n private closed: Node | false;\n private readonly dynamicModifier?: MarkdownSerializerDynamicModifier;\n\n constructor(nodes: NodeMap, marks: MarkMap, options: Partial<SerializerOptions> = {}, dynamicModifier?: MarkdownSerializerDynamicModifier) {\n this.nodes = nodes;\n this.marks = marks;\n this.delim = this.out = '';\n this.closed = false;\n this.inTightList = false;\n this.noAutoBlank = false;\n this.isAutolink = undefined;\n this.atBlockStart = false;\n this.escapeWhitespace = false;\n // :: Object\n // The options passed to the serializer.\n // tightLists:: ?bool\n // Whether to render lists in a tight style. This can be overridden\n // on a node level by specifying a tight attribute on the node.\n // Defaults to false.\n this.options = options || {};\n this.dynamicModifier = dynamicModifier;\n if (typeof this.options.tightLists === 'undefined') { this.options.tightLists = false }\n }\n\n setNoAutoBlank() {\n this.noAutoBlank = true;\n }\n\n unsetNoAutoBlank() {\n this.noAutoBlank = false;\n }\n\n flushClose(size?: number | null) {\n if (this.closed) {\n if (!this.atBlank() && !this.noAutoBlank) this.out += '\\n';\n if (size === null || size === undefined) size = 2;\n if (size > 1) {\n let delimMin = this.delim;\n const trim = /\\s+$/.exec(delimMin);\n if (trim) delimMin = delimMin.slice(0, delimMin.length - trim[0].length);\n\n if (!this.noAutoBlank) {\n for (let i = 1; i < size; i++) { this.out += delimMin + '\\n' }\n }\n }\n this.closed = false;\n }\n }\n\n // :: (string, ?string, Node, ())\n // Render a block, prefixing each line with `delim`, and the first\n // line in `firstDelim`. `node` should be the node that is closed at\n // the end of the block, and `f` is a function that renders the\n // content of the block.\n wrapBlock(delim: string, firstDelim: string | null, node: Node, f: () => void) {\n const old = this.delim;\n this.write(firstDelim || delim);\n this.delim += delim;\n f();\n this.delim = old;\n this.closeBlock(node);\n }\n\n atBlank(): boolean {\n return /(^|\\n)$/.test(this.out);\n }\n\n // :: ()\n // Ensure the current content ends with a newline.\n ensureNewLine() {\n if (!this.atBlank()) this.out += '\\n';\n }\n\n // :: (?string)\n // Prepare the state for writing output (closing closed paragraphs,\n // adding delimiters, and so on), and then optionally add content\n // (unescaped) to the output.\n write(content?: string | null): void {\n this.flushClose();\n if (this.delim && this.atBlank()) { this.out += this.delim }\n if (content) this.out += content;\n }\n\n // :: (Node)\n // Close the block for the given node.\n closeBlock(node?: Node) {\n this.closed = node ?? false;\n }\n\n // :: (string, ?bool)\n // Add the given text to the document. When escape is not `false`,\n // it will be escaped.\n text(text: string, escape?: boolean) {\n const lines = text.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n this.write();\n // Escape ! before [ to prevent being parsed as image syntax\n if (escape === false && lines[i][0] === '[' && /(^|[^\\\\])!$/.test(this.out))\n this.out = this.out.slice(0, this.out.length - 1) + '\\\\!';\n let text = lines[i];\n if (escape !== false && this.options.escape !== false) text = this.esc(text, this.atBlockStart)\n if (this.escapeWhitespace) text = this.escWhitespace(text);\n this.out += text\n if (i != lines.length - 1) this.out += '\\n';\n }\n }\n\n // :: (Node)\n // Render the given node as a block.\n render(node: Node, parent: Node, index: number) {\n if (typeof parent === 'number') {\n throw new Error('!');\n }\n\n const callback = this.nodes[node.type.name];\n if (callback) {\n if (this.dynamicModifier) {\n this.dynamicModifier.processNode(this, node, parent, index, callback);\n } else {\n callback(this, node, parent, index);\n }\n } else {\n if (this.options.strict !== false) {\n throw new Error('Token type `' + node.type.name + '` not supported by Markdown renderer');\n } else if (!node.type.isLeaf) {\n if (node.type.inlineContent) this.renderInline(node);\n else this.renderContent(node);\n if (node.isBlock) this.closeBlock(node);\n }\n }\n }\n\n // :: (Node)\n // Render the contents of `parent` as block nodes.\n renderContent(parent: Node) {\n parent.forEach((node, _, i) => this.render(node, parent, i));\n }\n\n // Render the contents of `parent` as inline content.\n renderInline(parent: Node, fromBlockStart = true) {\n this.atBlockStart = fromBlockStart;\n const active: Mark[] = [];\n let trailing = '';\n const progress = (node: Node | null, _: any, index: number) => {\n let marks = node ? node.marks : [];\n\n // Remove marks from breaks (hard_break or soft_break) that are the edge node inside\n // that mark to prevent parser edge cases with new lines just\n // before closing or after opening marks.\n if (node && node.type.spec.isBreak) {\n marks = marks.filter((m) => {\n if (index === 0) return false;\n if (index + 1 === parent.childCount) return false;\n const prev = parent.child(index - 1);\n const next = parent.child(index + 1);\n return (\n (m.isInSet(prev.marks) && (!prev.isText || /\\S/.test(prev.text ?? ''))) &&\n (m.isInSet(next.marks) && (!next.isText || /\\S/.test(next.text ?? '')))\n );\n });\n }\n\n let leading = trailing;\n trailing = '';\n // If whitespace has to be expelled from the node, adjust\n // leading and trailing accordingly.\n if (node && node.isText && marks.some((mark) => {\n const info = this.getMark(mark.type.name);\n return info && info.expelEnclosingWhitespace && !mark.isInSet(active);\n })) {\n const [_, lead, rest] = /^(\\s*)(.*)$/m.exec(node.text!)!;\n if (lead) {\n leading += lead;\n node = rest ? (node as any).withText(rest) : null;\n if (!node) marks = active;\n }\n }\n if (node && node.isText && marks.some((mark) => {\n const info = this.getMark(mark.type.name);\n return info && info.expelEnclosingWhitespace && !this.isMarkAhead(parent, index + 1, mark);\n })) {\n const [_, rest, trail] = /^(.*?)(\\s*)$/m.exec(node.text!)!;\n if (trail) {\n trailing = trail;\n node = rest ? (node as any).withText(rest) : null;\n if (!node) marks = active;\n }\n }\n\n const inner = marks.length && marks[marks.length - 1];\n const noEsc = inner && this.getMark(inner.type.name).escape === false;\n const len = marks.length - (noEsc ? 1 : 0);\n\n // Try to reorder 'mixable' marks, such as em and strong, which\n // in Markdown may be opened and closed in different order, so\n // that order of the marks for the token matches the order in\n // active.\n // eslint-disable-next-line no-labels\n outer: for (let i = 0; i < len; i++) {\n const mark = marks[i];\n if (!this.getMark(mark.type.name).mixable) break;\n for (let j = 0; j < active.length; j++) {\n const other = active[j];\n if (!this.getMark(other.type.name).mixable) break;\n if (mark.eq(other)) {\n if (i > j) {\n marks = marks.slice(0, j).concat(mark).concat(marks.slice(j, i)).concat(marks.slice(i + 1, len))\n }\n else if (j > i) {\n marks = marks.slice(0, i).concat(marks.slice(i + 1, j)).concat(mark).concat(marks.slice(j, len))\n }\n // eslint-disable-next-line no-labels\n continue outer;\n }\n }\n }\n\n // Find the prefix of the mark set that didn't change\n let keep = 0;\n while (keep < Math.min(active.length, len) && marks[keep].eq(active[keep])) ++keep;\n\n // Close the marks that need to be closed\n while (keep < active.length) {\n this.text(this.markString(active.pop()!, false, parent, index), false)\n }\n\n // Output any previously expelled trailing whitespace outside the marks\n if (leading) this.text(leading)\n\n // Open the marks that need to be opened\n if (node) {\n while (active.length < len) {\n const add = marks[active.length];\n active.push(add);\n this.text(this.markString(add, true, parent, index), false);\n this.atBlockStart = false;\n }\n\n // Render the node. Special case code marks, since their content\n // may not be escaped.\n if (noEsc && node.isText) {\n this.text(this.markString(inner, true, parent, index) + node.text +\n this.markString(inner, false, parent, index + 1), false);\n } else {\n this.render(node, parent, index)\n }\n this.atBlockStart = false;\n }\n\n // After the first non-empty text node is rendered, the end of output\n // is no longer at block start.\n //\n // FIXME: If a non-text node writes something to the output for this\n // block, the end of output is also no longer at block start. But how\n // can we detect that?\n if (node?.isText && node.nodeSize > 0) {\n this.atBlockStart = false;\n }\n };\n parent.forEach(progress);\n progress(null, null, parent.childCount);\n this.atBlockStart = false;\n }\n\n // :: (Node, string, (number) → string)\n // Render a node's content as a list. `delim` should be the extra\n // indentation added to all lines except the first in an item,\n // `firstDelim` is a function going from an item index to a\n // delimiter for the first line of the item.\n renderList(node: Node, delim: string, firstDelim: (index: number, firstDelimNode: Node) => string): void {\n if (this.closed && this.closed.type == node.type) { this.flushClose(3) } else if (this.inTightList) { this.flushClose(1) }\n\n const isTight = typeof node.attrs.tight !== 'undefined' ? node.attrs.tight : this.options.tightLists;\n const prevTight = this.inTightList;\n this.inTightList = isTight;\n node.forEach((child: any, _: any, i: any) => {\n if (i && isTight) this.flushClose(1);\n this.wrapBlock(delim, firstDelim(i, child), node, () => this.render(child, node, i))\n });\n this.inTightList = prevTight;\n }\n\n // :: (string, ?bool) → string\n // Escape the given string so that it can safely appear in Markdown\n // content. If `startOfLine` is true, also escape characters that\n // have special meaning only at the start of the line.\n esc(str: string, startOfLine = false) {\n // eslint-disable-next-line no-useless-escape\n const defaultEsc = /[`\\^+*\\\\\\|~\\[\\]\\{\\}<>\\$]/g;\n const extraChars = this.escapeCharacters?.length ? this.escapeCharacters.map(c => '\\\\' + c).join('') : '';\n const escRegexp = this.options?.commonEscape ||\n // Compose the escape regexp from default, options, and extra characters\n new RegExp(defaultEsc.source + (extraChars ? `|[${extraChars}]` : ''), 'g');\n\n const startOfLineEscRegexp = this.options?.startOfLineEscape || /^[:#\\-*+>]/;\n\n str = str.replace(escRegexp, '\\\\$&');\n // Smart underscore: don't escape _ between word characters (e.g. foo_bar)\n str = str.replace(/_/g, (m, i) =>\n i > 0 && i + 1 < str.length && /\\w/.test(str[i - 1]) && /\\w/.test(str[i + 1])\n ? m\n : '\\\\' + m\n );\n if (startOfLine) str = str.replace(startOfLineEscRegexp, '\\\\$&').replace(/^(\\s*\\d+)\\./, '$1\\\\.');\n return str;\n }\n\n escWhitespace(str: string): string {\n return str.replace(/ /g, '\\\\ ');\n }\n\n /// @internal\n quote(str: string): string {\n const wrap = str.indexOf('\"') == -1 ? '\"\"' : str.indexOf(\"'\") == -1 ? \"''\" : '()';\n return wrap[0] + str + wrap[1];\n }\n\n // :: (string, number) → string\n // Repeat the given string `n` times.\n repeat(str: string, n: number) {\n let out = '';\n for (let i = 0; i < n; i++) out += str;\n return out;\n }\n\n // :: (Mark, bool, string?) → string\n // Get the markdown string for a given opening or closing mark.\n markString(mark: Mark, open: boolean, parent: Node, index: number): string {\n const info = this.getMark(mark.type.name);\n const value = open ? info.open : info.close;\n return typeof value === 'string' ? value : value(this, mark, parent, index);\n }\n\n // :: (string) → { leading: ?string, trailing: ?string }\n // Get leading and trailing whitespace from a string. Values of\n // leading or trailing property of the return object will be undefined\n // if there is no match.\n getEnclosingWhitespace(text: string) {\n return {\n leading: (text.match(/^(\\s+)/) || [])[0],\n trailing: (text.match(/(\\s+)$/) || [])[0],\n };\n }\n\n private isMarkAhead(parent: Node, index: number, mark: Mark): boolean {\n for (;; index++) {\n if (index >= parent.childCount) return false;\n const next = parent.child(index);\n if (!next.type.spec.isBreak) return !!mark.isInSet(next.marks);\n }\n }\n\n // Get mark info by name, with fallback to blankMark when strict mode is off.\n private getMark(name: string): SerializerMarkToken {\n const info = this.marks[name];\n if (!info) {\n if (this.options.strict !== false)\n throw new Error(`Mark type \\`${name}\\` not supported by Markdown renderer`);\n return blankMark;\n }\n return info;\n }\n}\n"]}
@@ -42,6 +42,7 @@ export const QuoteLinkSpecs = (builder) => {
42
42
  return ['blockquote', node.attrs, 0];
43
43
  },
44
44
  selectable: true,
45
+ selectAll: 'node',
45
46
  },
46
47
  fromMd: {
47
48
  tokenSpec: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/QuoteLink/QuoteLinkSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {transform as quoteLink} from '@diplodoc/quote-link-extension';\nimport type {Node} from 'prosemirror-model';\n\nimport type {ExtensionAuto} from '#core';\nimport {nodeTypeFactory} from 'src/utils';\n\nimport {moveLinkToQuoteAttributes} from './md/moveLinkToQuoteAttributes';\n\nexport const quoteLinkNodeName = 'yfm_quote-link';\nexport const quoteLinkType = nodeTypeFactory(quoteLinkNodeName);\nexport const isQuoteLinkNode = (node: Node) => node.type.name === quoteLinkNodeName;\n\nexport enum QuoteLinkAttr {\n Cite = 'cite',\n DataContent = 'data-content',\n}\n\nexport const QuoteLinkSpecs: ExtensionAuto = (builder) => {\n builder\n .configureMd((md) =>\n md\n .use(\n quoteLink({\n bundle: false,\n }),\n )\n .use(moveLinkToQuoteAttributes),\n )\n .addNode(quoteLinkNodeName, () => ({\n spec: {\n attrs: {\n class: {default: 'yfm-quote-link'},\n [QuoteLinkAttr.Cite]: {default: ''},\n [QuoteLinkAttr.DataContent]: {default: ''},\n },\n content: 'block+',\n group: 'block',\n defining: true,\n parseDOM: [\n {\n tag: '.yfm-quote-link',\n getAttrs(dom) {\n return {\n [QuoteLinkAttr.Cite]: (dom as Element).getAttribute(\n QuoteLinkAttr.Cite,\n ),\n [QuoteLinkAttr.DataContent]: (dom as Element).getAttribute(\n QuoteLinkAttr.DataContent,\n ),\n };\n },\n priority: builder.Priority.VeryHigh,\n },\n ],\n toDOM(node) {\n return ['blockquote', node.attrs, 0];\n },\n selectable: true,\n },\n fromMd: {\n tokenSpec: {\n name: quoteLinkNodeName,\n type: 'block',\n getAttrs: (tok) => ({\n [QuoteLinkAttr.Cite]: tok.attrGet('cite'),\n [QuoteLinkAttr.DataContent]: tok.attrGet('data-content') || null,\n }),\n },\n },\n toMd: (state, node) => {\n state.wrapBlock('> ', null, node, () => {\n state.write(\n `[${node.attrs[QuoteLinkAttr.DataContent]}](${\n node.attrs[QuoteLinkAttr.Cite]\n }){data-quotelink=true}`,\n );\n state.write('\\n');\n state.write('\\n');\n state.renderContent(node);\n });\n },\n }));\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/QuoteLink/QuoteLinkSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {transform as quoteLink} from '@diplodoc/quote-link-extension';\nimport type {Node} from 'prosemirror-model';\n\nimport type {ExtensionAuto} from '#core';\nimport {nodeTypeFactory} from 'src/utils';\n\nimport {moveLinkToQuoteAttributes} from './md/moveLinkToQuoteAttributes';\n\nexport const quoteLinkNodeName = 'yfm_quote-link';\nexport const quoteLinkType = nodeTypeFactory(quoteLinkNodeName);\nexport const isQuoteLinkNode = (node: Node) => node.type.name === quoteLinkNodeName;\n\nexport enum QuoteLinkAttr {\n Cite = 'cite',\n DataContent = 'data-content',\n}\n\nexport const QuoteLinkSpecs: ExtensionAuto = (builder) => {\n builder\n .configureMd((md) =>\n md\n .use(\n quoteLink({\n bundle: false,\n }),\n )\n .use(moveLinkToQuoteAttributes),\n )\n .addNode(quoteLinkNodeName, () => ({\n spec: {\n attrs: {\n class: {default: 'yfm-quote-link'},\n [QuoteLinkAttr.Cite]: {default: ''},\n [QuoteLinkAttr.DataContent]: {default: ''},\n },\n content: 'block+',\n group: 'block',\n defining: true,\n parseDOM: [\n {\n tag: '.yfm-quote-link',\n getAttrs(dom) {\n return {\n [QuoteLinkAttr.Cite]: (dom as Element).getAttribute(\n QuoteLinkAttr.Cite,\n ),\n [QuoteLinkAttr.DataContent]: (dom as Element).getAttribute(\n QuoteLinkAttr.DataContent,\n ),\n };\n },\n priority: builder.Priority.VeryHigh,\n },\n ],\n toDOM(node) {\n return ['blockquote', node.attrs, 0];\n },\n selectable: true,\n selectAll: 'node',\n },\n fromMd: {\n tokenSpec: {\n name: quoteLinkNodeName,\n type: 'block',\n getAttrs: (tok) => ({\n [QuoteLinkAttr.Cite]: tok.attrGet('cite'),\n [QuoteLinkAttr.DataContent]: tok.attrGet('data-content') || null,\n }),\n },\n },\n toMd: (state, node) => {\n state.wrapBlock('> ', null, node, () => {\n state.write(\n `[${node.attrs[QuoteLinkAttr.DataContent]}](${\n node.attrs[QuoteLinkAttr.Cite]\n }){data-quotelink=true}`,\n );\n state.write('\\n');\n state.write('\\n');\n state.renderContent(node);\n });\n },\n }));\n};\n"]}
@@ -7,6 +7,7 @@ import { tryCatch } from "../../../utils/helpers.js";
7
7
  import { isNodeSelection, isTextSelection, isWholeSelection } from "../../../utils/selection.js";
8
8
  import { BaseNode, pType } from "../../base/BaseSchema/index.js";
9
9
  import { isInsideCode } from "./code.js";
10
+ import { getSelectionContent } from "./selection-content.js";
10
11
  import { trimTextSelection } from "./trim-selection.js";
11
12
  import { DataTransferType, extractTextContentFromHtml, isIosSafariShare, trimContent } from "./utils.js";
12
13
  export const clipboard = ({ logger, textParser, mdParser, serializer, pasteFileHandler, }) => {
@@ -258,18 +259,6 @@ function createFragmentFromInlineSelection(state, sel) {
258
259
  }
259
260
  return Fragment.from(sel.$from.parent.copy(inlineSlice.content));
260
261
  }
261
- /**
262
- * Like `selection.content()`, but smarter.
263
- * Copy a structure of complex nodes,
264
- * e.g. if select part of cut title it creates slice with yfm-cut –> yfm-cut-title -> selected text
265
- * it works well with simple nodes, but to handle cases as described above, custom logic needed
266
- */
267
- function getSelectionContent(sel) {
268
- const sharedNodeType = getSharedDepthNode(sel).type;
269
- const sharedNodeComplex = sharedNodeType.spec.complex;
270
- const includeParents = sharedNodeComplex && sharedNodeComplex !== 'leaf';
271
- return sel.$from.doc.slice(sel.$from.pos, sel.to, includeParents);
272
- }
273
262
  function getSharedDepthNode({ $from, $to }) {
274
263
  return $from.node($from.sharedDepth($to.pos));
275
264
  }
@@ -1 +1 @@
1
- {"version":3,"file":"clipboard.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/clipboard.ts"],"names":[],"mappings":"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","sourcesContent":["import {type Parser, type Serializer, trackTransactionMetrics} from '#core';\nimport {Fragment, type Node, type ResolvedPos, type Schema, Slice} from '#pm/model';\nimport {type EditorState, Plugin, type Selection} from '#pm/state';\nimport type {EditorView} from '#pm/view';\nimport {type Logger2, globalLogger} from 'src/logger';\nimport 'src/types/spec';\nimport {tryCatch} from 'src/utils/helpers';\nimport {isNodeSelection, isTextSelection, isWholeSelection} from 'src/utils/selection';\n\nimport {BaseNode, pType} from '../../base/BaseSchema';\n\nimport {isInsideCode} from './code';\nimport {trimTextSelection} from './trim-selection';\nimport {DataTransferType, extractTextContentFromHtml, isIosSafariShare, trimContent} from './utils';\n\nexport type ClipboardPluginOptions = {\n logger: Logger2.ILogger;\n mdParser: Parser;\n textParser: Parser;\n serializer: Serializer;\n pasteFileHandler?: (file: File) => void;\n};\n\nexport const clipboard = ({\n logger,\n textParser,\n mdParser,\n serializer,\n pasteFileHandler,\n}: ClipboardPluginOptions) => {\n return new Plugin({\n props: {\n handleDOMEvents: {\n copy(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n return true;\n }\n return false;\n },\n cut(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n view.dispatch(\n view.state.tr\n .deleteSelection()\n .scrollIntoView()\n .setMeta('uiEvent', 'cut'),\n );\n return true;\n }\n return false;\n },\n paste(view, e) {\n if (!e.clipboardData) return false;\n\n const pasteLogger = logger.nested({\n domEvent: 'paste',\n dataTypes: e.clipboardData.types,\n });\n\n let data: string;\n let isPasteHandled = false;\n\n if (\n isIosSafariShare(e.clipboardData) &&\n (data = e.clipboardData.getData(DataTransferType.UriList))\n ) {\n const schema: Schema = view.state.schema;\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(\n // paste link inline\n new Slice(\n Fragment.from(\n pType(schema).create(null, schema.text(data)),\n ),\n 1,\n 1,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.UriList},\n ),\n );\n pasteLogger.event({\n event: 'paste-uri-list',\n });\n isPasteHandled = true;\n e.preventDefault();\n return true;\n }\n\n if (\n !e.clipboardData.types.includes(DataTransferType.Yfm) &&\n (data = e.clipboardData.getData(DataTransferType.Html))\n ) {\n const textFromHtml = extractTextContentFromHtml(data);\n if (textFromHtml) {\n const res = tryCatch(() => textParser.parse(textFromHtml));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: DataTransferType.Html},\n ),\n );\n pasteLogger.event({\n event: 'paste-parsed-html',\n });\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'parse-html',\n });\n console.error(res.error);\n }\n } else return false; // default html pasting\n }\n\n if (\n !isPasteHandled &&\n ((data = e.clipboardData.getData(DataTransferType.Yfm)) ||\n (data = e.clipboardData.getData(DataTransferType.Text)))\n ) {\n let parser: Parser;\n let dataFormat: string;\n if (e.clipboardData.types.includes(DataTransferType.Yfm)) {\n parser = mdParser;\n dataFormat = DataTransferType.Yfm;\n } else {\n parser = textParser;\n dataFormat = DataTransferType.Text;\n }\n const codeType = isInsideCode(view.state);\n if (codeType) {\n const schema: Schema = view.state.schema;\n const insideCodeData = e.clipboardData.getData(DataTransferType.Text);\n\n pasteLogger.event({\n event: 'paste-text-to-code',\n codeType,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelectionWith(\n schema.text(\n codeType === 'inline'\n ? insideCodeData.trim()\n : insideCodeData,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.Text, code: codeType},\n ),\n );\n isPasteHandled = true;\n } else {\n const res = tryCatch(() => parser.parse(data));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n pasteLogger.event({\n event: 'paste-parsed-content',\n dataFormat,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: dataFormat},\n ),\n );\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'paste',\n dataFormat,\n });\n console.error(res.error);\n }\n }\n }\n\n if (e.clipboardData.files.length && pasteFileHandler) {\n pasteLogger.event({\n event: 'paste-files',\n });\n for (const file of Array.from(e.clipboardData.files)) {\n pasteFileHandler(file);\n }\n isPasteHandled = true;\n }\n\n if (isPasteHandled) {\n e.preventDefault();\n return true;\n }\n\n return false;\n },\n },\n },\n });\n};\n\nfunction getSliceFromMarkupFragment(fragment: Fragment) {\n let start = 0;\n let end = 0;\n if (fragment.firstChild?.isTextblock) {\n start = 1;\n if (fragment.childCount === 1) {\n end = 1;\n }\n }\n return new Slice(fragment, start, end);\n}\n\ntype SerializeResult = {\n text: string;\n html?: string;\n markup?: string;\n};\nfunction serializeSelected(view: EditorView, serializer: Serializer): SerializeResult | null {\n const sel = view.state.selection;\n\n if (sel.empty) return null;\n\n // handle selection in codeblocks\n if (getSharedDepthNode(sel).type.spec.code) {\n const fragment = sel.content().content;\n return {text: fragment.textBetween(0, fragment.size)};\n }\n\n // FIXME: Verify and use Node instead of Fragment\n const markup = serializer.serialize(getCopyContent(view.state).content as any);\n const {dom, text} = view.serializeForClipboard(sel.content());\n return {markup, text, html: dom.innerHTML};\n}\n\nfunction setClipboardData(data: DataTransfer, result: SerializeResult) {\n data.clearData();\n if (typeof result.markup === 'string') data.setData(DataTransferType.Yfm, result.markup);\n if (typeof result.html === 'string') data.setData(DataTransferType.Html, result.html);\n data.setData(DataTransferType.Text, result.text);\n}\n\nfunction getCopyContent(state: EditorState): Slice {\n let sel = state.selection;\n\n if (isWholeSelection(sel)) {\n return new Slice(state.doc.content, 0, 0);\n }\n\n if (isNodeSelection(sel)) {\n const {node} = sel;\n if (node.type.spec.complex) {\n if (node.isTextblock) {\n return new Slice(\n Fragment.from(state.schema.node(BaseNode.Paragraph, {}, node.content)),\n 1,\n 1,\n );\n } else {\n const {complex} = node.type.spec;\n if (complex === 'root') {\n return new Slice(Fragment.from(node), 1, 1);\n } else if (complex === 'leaf') {\n return new Slice(Fragment.from(node.content), 1, 1);\n } else {\n // TODO: handle copy of intermediate complex block node\n }\n }\n } else {\n return new Slice(Fragment.from(node), 1, 1);\n }\n }\n\n if (isTextSelection(sel)) {\n sel = trimTextSelection(sel);\n }\n\n if (isTextSelectionWithinSameTextBlock(sel)) {\n return new Slice(createFragmentFromInlineSelection(state, sel), 0, 0);\n }\n\n let slice = getSelectionContent(sel);\n\n // replace first node with paragraph if needed\n if (\n slice.content.firstChild?.isTextblock &&\n slice.content.firstChild.type.name !== BaseNode.Paragraph\n ) {\n let shouldTransformFirstChildToPara = true;\n const {firstChild} = slice.content;\n\n // if all text selected inside first node, don't replace it with paragraph\n if (firstChild.eq(sel.$from.parent)) {\n shouldTransformFirstChildToPara = false;\n }\n\n if (shouldTransformFirstChildToPara) {\n slice = new Slice(\n slice.content.replaceChild(\n 0,\n state.schema.node(BaseNode.Paragraph, {}, firstChild.content),\n ),\n slice.openStart,\n slice.openStart,\n );\n }\n } else {\n // trim empty list items\n const createEmptyParagraph = () => Fragment.from(pType(state.schema).createAndFill());\n const trimmedContent = trimContent(slice.content, createEmptyParagraph);\n if (trimmedContent !== slice.content) {\n slice = new Slice(trimmedContent, 1, 1);\n }\n }\n\n return slice;\n}\n\nfunction isTextSelectionWithinSameTextBlock(sel: Selection) {\n return isTextSelection(sel) && sel.$from.sameParent(sel.$to) && sel.$from.parent.isTextblock;\n}\n\nfunction createFragmentFromInlineSelection(state: EditorState, sel: Selection) {\n const inlineSlice = state.doc.slice(sel.from, sel.to);\n const isComplexTextblock = Boolean(sel.$from.parent.type.spec.complex);\n const isAllContentSelected = sel.$from.parent.content.eq(inlineSlice.content);\n if (isComplexTextblock || !isAllContentSelected) {\n // copy selected inline content to paragraph if current node is complex\n // or if only part of it's content was selected\n return Fragment.from(state.schema.node(BaseNode.Paragraph, {}, inlineSlice.content));\n }\n return Fragment.from(sel.$from.parent.copy(inlineSlice.content));\n}\n\n/**\n * Like `selection.content()`, but smarter.\n * Copy a structure of complex nodes,\n * e.g. if select part of cut title it creates slice with yfm-cut –> yfm-cut-title -> selected text\n * it works well with simple nodes, but to handle cases as described above, custom logic needed\n */\nfunction getSelectionContent(sel: Selection) {\n const sharedNodeType = getSharedDepthNode(sel).type;\n const sharedNodeComplex = sharedNodeType.spec.complex;\n const includeParents = sharedNodeComplex && sharedNodeComplex !== 'leaf';\n return sel.$from.doc.slice(sel.$from.pos, sel.to, includeParents);\n}\n\nfunction getSharedDepthNode({$from, $to}: {$from: ResolvedPos; $to: ResolvedPos}): Node {\n return $from.node($from.sharedDepth($to.pos));\n}\n"]}
1
+ {"version":3,"file":"clipboard.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/clipboard.ts"],"names":[],"mappings":"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","sourcesContent":["import {type Parser, type Serializer, trackTransactionMetrics} from '#core';\nimport {Fragment, type Node, type ResolvedPos, type Schema, Slice} from '#pm/model';\nimport {type EditorState, Plugin, type Selection} from '#pm/state';\nimport type {EditorView} from '#pm/view';\nimport {type Logger2, globalLogger} from 'src/logger';\nimport 'src/types/spec';\nimport {tryCatch} from 'src/utils/helpers';\nimport {isNodeSelection, isTextSelection, isWholeSelection} from 'src/utils/selection';\n\nimport {BaseNode, pType} from '../../base/BaseSchema';\n\nimport {isInsideCode} from './code';\nimport {getSelectionContent} from './selection-content';\nimport {trimTextSelection} from './trim-selection';\nimport {DataTransferType, extractTextContentFromHtml, isIosSafariShare, trimContent} from './utils';\n\nexport type ClipboardPluginOptions = {\n logger: Logger2.ILogger;\n mdParser: Parser;\n textParser: Parser;\n serializer: Serializer;\n pasteFileHandler?: (file: File) => void;\n};\n\nexport const clipboard = ({\n logger,\n textParser,\n mdParser,\n serializer,\n pasteFileHandler,\n}: ClipboardPluginOptions) => {\n return new Plugin({\n props: {\n handleDOMEvents: {\n copy(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n return true;\n }\n return false;\n },\n cut(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n view.dispatch(\n view.state.tr\n .deleteSelection()\n .scrollIntoView()\n .setMeta('uiEvent', 'cut'),\n );\n return true;\n }\n return false;\n },\n paste(view, e) {\n if (!e.clipboardData) return false;\n\n const pasteLogger = logger.nested({\n domEvent: 'paste',\n dataTypes: e.clipboardData.types,\n });\n\n let data: string;\n let isPasteHandled = false;\n\n if (\n isIosSafariShare(e.clipboardData) &&\n (data = e.clipboardData.getData(DataTransferType.UriList))\n ) {\n const schema: Schema = view.state.schema;\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(\n // paste link inline\n new Slice(\n Fragment.from(\n pType(schema).create(null, schema.text(data)),\n ),\n 1,\n 1,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.UriList},\n ),\n );\n pasteLogger.event({\n event: 'paste-uri-list',\n });\n isPasteHandled = true;\n e.preventDefault();\n return true;\n }\n\n if (\n !e.clipboardData.types.includes(DataTransferType.Yfm) &&\n (data = e.clipboardData.getData(DataTransferType.Html))\n ) {\n const textFromHtml = extractTextContentFromHtml(data);\n if (textFromHtml) {\n const res = tryCatch(() => textParser.parse(textFromHtml));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: DataTransferType.Html},\n ),\n );\n pasteLogger.event({\n event: 'paste-parsed-html',\n });\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'parse-html',\n });\n console.error(res.error);\n }\n } else return false; // default html pasting\n }\n\n if (\n !isPasteHandled &&\n ((data = e.clipboardData.getData(DataTransferType.Yfm)) ||\n (data = e.clipboardData.getData(DataTransferType.Text)))\n ) {\n let parser: Parser;\n let dataFormat: string;\n if (e.clipboardData.types.includes(DataTransferType.Yfm)) {\n parser = mdParser;\n dataFormat = DataTransferType.Yfm;\n } else {\n parser = textParser;\n dataFormat = DataTransferType.Text;\n }\n const codeType = isInsideCode(view.state);\n if (codeType) {\n const schema: Schema = view.state.schema;\n const insideCodeData = e.clipboardData.getData(DataTransferType.Text);\n\n pasteLogger.event({\n event: 'paste-text-to-code',\n codeType,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelectionWith(\n schema.text(\n codeType === 'inline'\n ? insideCodeData.trim()\n : insideCodeData,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.Text, code: codeType},\n ),\n );\n isPasteHandled = true;\n } else {\n const res = tryCatch(() => parser.parse(data));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n pasteLogger.event({\n event: 'paste-parsed-content',\n dataFormat,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: dataFormat},\n ),\n );\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'paste',\n dataFormat,\n });\n console.error(res.error);\n }\n }\n }\n\n if (e.clipboardData.files.length && pasteFileHandler) {\n pasteLogger.event({\n event: 'paste-files',\n });\n for (const file of Array.from(e.clipboardData.files)) {\n pasteFileHandler(file);\n }\n isPasteHandled = true;\n }\n\n if (isPasteHandled) {\n e.preventDefault();\n return true;\n }\n\n return false;\n },\n },\n },\n });\n};\n\nfunction getSliceFromMarkupFragment(fragment: Fragment) {\n let start = 0;\n let end = 0;\n if (fragment.firstChild?.isTextblock) {\n start = 1;\n if (fragment.childCount === 1) {\n end = 1;\n }\n }\n return new Slice(fragment, start, end);\n}\n\ntype SerializeResult = {\n text: string;\n html?: string;\n markup?: string;\n};\nfunction serializeSelected(view: EditorView, serializer: Serializer): SerializeResult | null {\n const sel = view.state.selection;\n\n if (sel.empty) return null;\n\n // handle selection in codeblocks\n if (getSharedDepthNode(sel).type.spec.code) {\n const fragment = sel.content().content;\n return {text: fragment.textBetween(0, fragment.size)};\n }\n\n // FIXME: Verify and use Node instead of Fragment\n const markup = serializer.serialize(getCopyContent(view.state).content as any);\n const {dom, text} = view.serializeForClipboard(sel.content());\n return {markup, text, html: dom.innerHTML};\n}\n\nfunction setClipboardData(data: DataTransfer, result: SerializeResult) {\n data.clearData();\n if (typeof result.markup === 'string') data.setData(DataTransferType.Yfm, result.markup);\n if (typeof result.html === 'string') data.setData(DataTransferType.Html, result.html);\n data.setData(DataTransferType.Text, result.text);\n}\n\nfunction getCopyContent(state: EditorState): Slice {\n let sel = state.selection;\n\n if (isWholeSelection(sel)) {\n return new Slice(state.doc.content, 0, 0);\n }\n\n if (isNodeSelection(sel)) {\n const {node} = sel;\n if (node.type.spec.complex) {\n if (node.isTextblock) {\n return new Slice(\n Fragment.from(state.schema.node(BaseNode.Paragraph, {}, node.content)),\n 1,\n 1,\n );\n } else {\n const {complex} = node.type.spec;\n if (complex === 'root') {\n return new Slice(Fragment.from(node), 1, 1);\n } else if (complex === 'leaf') {\n return new Slice(Fragment.from(node.content), 1, 1);\n } else {\n // TODO: handle copy of intermediate complex block node\n }\n }\n } else {\n return new Slice(Fragment.from(node), 1, 1);\n }\n }\n\n if (isTextSelection(sel)) {\n sel = trimTextSelection(sel);\n }\n\n if (isTextSelectionWithinSameTextBlock(sel)) {\n return new Slice(createFragmentFromInlineSelection(state, sel), 0, 0);\n }\n\n let slice = getSelectionContent(sel);\n\n // replace first node with paragraph if needed\n if (\n slice.content.firstChild?.isTextblock &&\n slice.content.firstChild.type.name !== BaseNode.Paragraph\n ) {\n let shouldTransformFirstChildToPara = true;\n const {firstChild} = slice.content;\n\n // if all text selected inside first node, don't replace it with paragraph\n if (firstChild.eq(sel.$from.parent)) {\n shouldTransformFirstChildToPara = false;\n }\n\n if (shouldTransformFirstChildToPara) {\n slice = new Slice(\n slice.content.replaceChild(\n 0,\n state.schema.node(BaseNode.Paragraph, {}, firstChild.content),\n ),\n slice.openStart,\n slice.openStart,\n );\n }\n } else {\n // trim empty list items\n const createEmptyParagraph = () => Fragment.from(pType(state.schema).createAndFill());\n const trimmedContent = trimContent(slice.content, createEmptyParagraph);\n if (trimmedContent !== slice.content) {\n slice = new Slice(trimmedContent, 1, 1);\n }\n }\n\n return slice;\n}\n\nfunction isTextSelectionWithinSameTextBlock(sel: Selection) {\n return isTextSelection(sel) && sel.$from.sameParent(sel.$to) && sel.$from.parent.isTextblock;\n}\n\nfunction createFragmentFromInlineSelection(state: EditorState, sel: Selection) {\n const inlineSlice = state.doc.slice(sel.from, sel.to);\n const isComplexTextblock = Boolean(sel.$from.parent.type.spec.complex);\n const isAllContentSelected = sel.$from.parent.content.eq(inlineSlice.content);\n if (isComplexTextblock || !isAllContentSelected) {\n // copy selected inline content to paragraph if current node is complex\n // or if only part of it's content was selected\n return Fragment.from(state.schema.node(BaseNode.Paragraph, {}, inlineSlice.content));\n }\n return Fragment.from(sel.$from.parent.copy(inlineSlice.content));\n}\n\nfunction getSharedDepthNode({$from, $to}: {$from: ResolvedPos; $to: ResolvedPos}): Node {\n return $from.node($from.sharedDepth($to.pos));\n}\n"]}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @internal
3
+ *
4
+ * Like `selection.content()`, but smarter.
5
+ * Copy a structure of complex nodes,
6
+ * e.g. if select part of cut title it creates slice with yfm-cut –> yfm-cut-title -> selected text
7
+ * it works well with simple nodes, but to handle cases as described above, custom logic needed
8
+ */
9
+ export function getSelectionContent(sel) {
10
+ const sharedDepth = sel.$from.sharedDepth(sel.$to.pos);
11
+ const sharedNode = sel.$from.node(sharedDepth);
12
+ const sharedNodeComplex = sharedNode.type.spec.complex;
13
+ if (sharedNodeComplex && sharedNodeComplex !== 'leaf') {
14
+ // Find the nearest ancestor with complex='root' to avoid
15
+ // wrapping copied content in outer containers (blockquote, table cell, etc.)
16
+ let rootDepth = sharedDepth;
17
+ for (let d = sharedDepth; d >= 0; d--) {
18
+ if (sel.$from.node(d).type.spec.complex === 'root') {
19
+ rootDepth = d;
20
+ break;
21
+ }
22
+ }
23
+ // Slice from the parent of the root node so that the root node itself
24
+ // (e.g. bullet_list) is included in the slice, but its outer containers are not.
25
+ const parentDepth = Math.max(0, rootDepth - 1);
26
+ const parentNode = sel.$from.node(parentDepth);
27
+ const parentStart = sel.$from.start(parentDepth);
28
+ return parentNode.slice(sel.$from.pos - parentStart, sel.$to.pos - parentStart, true);
29
+ }
30
+ return sel.$from.doc.slice(sel.$from.pos, sel.to, false);
31
+ }
32
+ //# sourceMappingURL=selection-content.js.map