@krainovsd/markdown-editor 0.0.4 → 0.1.1

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 (253) hide show
  1. package/lib/cjs/index-Byjf17iv.js +501 -0
  2. package/lib/cjs/index-Byjf17iv.js.map +1 -0
  3. package/lib/cjs/index-lPo-3QDL.js +1374 -0
  4. package/lib/cjs/index-lPo-3QDL.js.map +1 -0
  5. package/lib/cjs/index.js +14 -1
  6. package/lib/cjs/index.js.map +1 -1
  7. package/lib/esm/extensions/compartments/index.js +8 -0
  8. package/lib/esm/extensions/compartments/index.js.map +1 -0
  9. package/lib/esm/extensions/init-extensions.js +45 -0
  10. package/lib/esm/extensions/init-extensions.js.map +1 -0
  11. package/lib/esm/extensions/keymaps/init-key-map.js +91 -0
  12. package/lib/esm/extensions/keymaps/init-key-map.js.map +1 -0
  13. package/lib/esm/extensions/listeners/get-change-event.js +14 -0
  14. package/lib/esm/extensions/listeners/get-change-event.js.map +1 -0
  15. package/lib/esm/extensions/listeners/get-focus-event.js +16 -0
  16. package/lib/esm/extensions/listeners/get-focus-event.js.map +1 -0
  17. package/lib/esm/extensions/listeners/init-listeners.js +9 -0
  18. package/lib/esm/extensions/listeners/init-listeners.js.map +1 -0
  19. package/lib/esm/extensions/markdown/blockquote/blockquote-constants.js +6 -0
  20. package/lib/esm/extensions/markdown/blockquote/blockquote-constants.js.map +1 -0
  21. package/lib/esm/extensions/markdown/blockquote/blockquote-decoration.js +99 -0
  22. package/lib/esm/extensions/markdown/blockquote/blockquote-decoration.js.map +1 -0
  23. package/lib/esm/extensions/markdown/blockquote/blockquote-widget.js +25 -0
  24. package/lib/esm/extensions/markdown/blockquote/blockquote-widget.js.map +1 -0
  25. package/lib/esm/extensions/markdown/bold/bold-constants.js +5 -0
  26. package/lib/esm/extensions/markdown/bold/bold-constants.js.map +1 -0
  27. package/lib/esm/extensions/markdown/bold/bold-decoration.js +41 -0
  28. package/lib/esm/extensions/markdown/bold/bold-decoration.js.map +1 -0
  29. package/lib/esm/extensions/markdown/code/code-constants.js +6 -0
  30. package/lib/esm/extensions/markdown/code/code-constants.js.map +1 -0
  31. package/lib/esm/extensions/markdown/code/code-decoration.js +109 -0
  32. package/lib/esm/extensions/markdown/code/code-decoration.js.map +1 -0
  33. package/lib/esm/extensions/markdown/code/code-widget.js +83 -0
  34. package/lib/esm/extensions/markdown/code/code-widget.js.map +1 -0
  35. package/lib/esm/extensions/markdown/header/header-constants.js +6 -0
  36. package/lib/esm/extensions/markdown/header/header-constants.js.map +1 -0
  37. package/lib/esm/extensions/markdown/header/header-decoration.js +64 -0
  38. package/lib/esm/extensions/markdown/header/header-decoration.js.map +1 -0
  39. package/lib/esm/extensions/markdown/horizontal/horizontal-constants.js +4 -0
  40. package/lib/esm/extensions/markdown/horizontal/horizontal-constants.js.map +1 -0
  41. package/lib/esm/extensions/markdown/horizontal/horizontal-decoration.js +31 -0
  42. package/lib/esm/extensions/markdown/horizontal/horizontal-decoration.js.map +1 -0
  43. package/lib/esm/extensions/markdown/image/image-constants.js +8 -0
  44. package/lib/esm/extensions/markdown/image/image-constants.js.map +1 -0
  45. package/lib/esm/extensions/markdown/image/image-decoration.js +75 -0
  46. package/lib/esm/extensions/markdown/image/image-decoration.js.map +1 -0
  47. package/lib/esm/extensions/markdown/image/image-widget.js +184 -0
  48. package/lib/esm/extensions/markdown/image/image-widget.js.map +1 -0
  49. package/lib/esm/extensions/markdown/index.js +2 -0
  50. package/lib/esm/extensions/markdown/index.js.map +1 -0
  51. package/lib/esm/extensions/markdown/init-markdown.js +18 -0
  52. package/lib/esm/extensions/markdown/init-markdown.js.map +1 -0
  53. package/lib/esm/extensions/markdown/italic/italic-constants.js +5 -0
  54. package/lib/esm/extensions/markdown/italic/italic-constants.js.map +1 -0
  55. package/lib/esm/extensions/markdown/italic/italic-decoration.js +77 -0
  56. package/lib/esm/extensions/markdown/italic/italic-decoration.js.map +1 -0
  57. package/lib/esm/extensions/markdown/link/auto-link-decoration.js +24 -0
  58. package/lib/esm/extensions/markdown/link/auto-link-decoration.js.map +1 -0
  59. package/lib/esm/extensions/markdown/link/link-constants.js +10 -0
  60. package/lib/esm/extensions/markdown/link/link-constants.js.map +1 -0
  61. package/lib/esm/extensions/markdown/link/link-decoration.js +51 -0
  62. package/lib/esm/extensions/markdown/link/link-decoration.js.map +1 -0
  63. package/lib/esm/extensions/markdown/link/link-label-decoration.js +22 -0
  64. package/lib/esm/extensions/markdown/link/link-label-decoration.js.map +1 -0
  65. package/lib/esm/extensions/markdown/link/link-widget.js +144 -0
  66. package/lib/esm/extensions/markdown/link/link-widget.js.map +1 -0
  67. package/lib/esm/extensions/markdown/list/list-constants.js +7 -0
  68. package/lib/esm/extensions/markdown/list/list-constants.js.map +1 -0
  69. package/lib/esm/extensions/markdown/list/list-decoration.js +38 -0
  70. package/lib/esm/extensions/markdown/list/list-decoration.js.map +1 -0
  71. package/lib/esm/extensions/markdown/list/list-widget.js +33 -0
  72. package/lib/esm/extensions/markdown/list/list-widget.js.map +1 -0
  73. package/lib/esm/extensions/markdown/markdown-decoration.js +105 -0
  74. package/lib/esm/extensions/markdown/markdown-decoration.js.map +1 -0
  75. package/lib/esm/extensions/markdown/markdown-parser.js +6 -0
  76. package/lib/esm/extensions/markdown/markdown-parser.js.map +1 -0
  77. package/lib/esm/extensions/markdown/mention/mention-constants.js +6 -0
  78. package/lib/esm/extensions/markdown/mention/mention-constants.js.map +1 -0
  79. package/lib/esm/extensions/markdown/mention/mention-decoration.js +37 -0
  80. package/lib/esm/extensions/markdown/mention/mention-decoration.js.map +1 -0
  81. package/lib/esm/extensions/markdown/mention/mention-parser.js +25 -0
  82. package/lib/esm/extensions/markdown/mention/mention-parser.js.map +1 -0
  83. package/lib/esm/extensions/markdown/strike-through/strike-through-constants.js +4 -0
  84. package/lib/esm/extensions/markdown/strike-through/strike-through-constants.js.map +1 -0
  85. package/lib/esm/extensions/markdown/strike-through/strike-through-decoration.js +32 -0
  86. package/lib/esm/extensions/markdown/strike-through/strike-through-decoration.js.map +1 -0
  87. package/lib/esm/extensions/markdown/styles.module.scss.js +8 -0
  88. package/lib/esm/extensions/markdown/styles.module.scss.js.map +1 -0
  89. package/lib/esm/extensions/markdown/todo/todo-constants.js +6 -0
  90. package/lib/esm/extensions/markdown/todo/todo-constants.js.map +1 -0
  91. package/lib/esm/extensions/markdown/todo/todo-decoration.js +35 -0
  92. package/lib/esm/extensions/markdown/todo/todo-decoration.js.map +1 -0
  93. package/lib/esm/extensions/markdown/todo/todo-widget.js +51 -0
  94. package/lib/esm/extensions/markdown/todo/todo-widget.js.map +1 -0
  95. package/lib/esm/extensions/settings/init-settings.js +19 -0
  96. package/lib/esm/extensions/settings/init-settings.js.map +1 -0
  97. package/lib/esm/extensions/theme/init-theme.js +15 -0
  98. package/lib/esm/extensions/theme/init-theme.js.map +1 -0
  99. package/lib/esm/extensions/theme/theme-constants.js +17 -0
  100. package/lib/esm/extensions/theme/theme-constants.js.map +1 -0
  101. package/lib/esm/extensions/theme/themes/get-dark-theme.js +40 -0
  102. package/lib/esm/extensions/theme/themes/get-dark-theme.js.map +1 -0
  103. package/lib/esm/extensions/theme/themes/get-highlight-template.js +35 -0
  104. package/lib/esm/extensions/theme/themes/get-highlight-template.js.map +1 -0
  105. package/lib/esm/extensions/theme/themes/get-light-theme.js +40 -0
  106. package/lib/esm/extensions/theme/themes/get-light-theme.js.map +1 -0
  107. package/lib/esm/extensions/theme/themes/get-theme-template.js +69 -0
  108. package/lib/esm/extensions/theme/themes/get-theme-template.js.map +1 -0
  109. package/lib/esm/index.js +1 -1
  110. package/lib/esm/lib/utils/copy-to-clipboard.js +35 -0
  111. package/lib/esm/lib/utils/copy-to-clipboard.js.map +1 -0
  112. package/lib/esm/lib/utils/get-decoration.js +24 -0
  113. package/lib/esm/lib/utils/get-decoration.js.map +1 -0
  114. package/lib/esm/lib/utils/is-in-range.js +8 -0
  115. package/lib/esm/lib/utils/is-in-range.js.map +1 -0
  116. package/lib/esm/lib/utils/is-range-overlap.js +6 -0
  117. package/lib/esm/lib/utils/is-range-overlap.js.map +1 -0
  118. package/lib/esm/lib/utils/tick.js +22 -0
  119. package/lib/esm/lib/utils/tick.js.map +1 -0
  120. package/lib/esm/module/Editor/Editor.js +91 -0
  121. package/lib/esm/module/Editor/Editor.js.map +1 -0
  122. package/lib/esm/module/Editor/lib/init-editor-provider.js +32 -0
  123. package/lib/esm/module/Editor/lib/init-editor-provider.js.map +1 -0
  124. package/lib/esm/module/Editor/lib/init-editor-state.js +18 -0
  125. package/lib/esm/module/Editor/lib/init-editor-state.js.map +1 -0
  126. package/lib/esm/module/Editor/lib/init-editor.js +27 -0
  127. package/lib/esm/module/Editor/lib/init-editor.js.map +1 -0
  128. package/lib/esm/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js +29 -0
  129. package/lib/esm/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js.map +1 -0
  130. package/lib/index.d.ts +137 -0
  131. package/package.json +37 -30
  132. package/lib/cjs/editor-qKPDa91b.js +0 -2
  133. package/lib/cjs/editor-qKPDa91b.js.map +0 -1
  134. package/lib/cjs/markdown_plugin-IXFRDWyN.js +0 -2
  135. package/lib/cjs/markdown_plugin-IXFRDWyN.js.map +0 -1
  136. package/lib/cjs/vendor_vim-BHa51_r7.js +0 -2
  137. package/lib/cjs/vendor_vim-BHa51_r7.js.map +0 -1
  138. package/lib/cjs/vendor_y.next-CVyX1ZQB.js +0 -2
  139. package/lib/cjs/vendor_y.next-CVyX1ZQB.js.map +0 -1
  140. package/lib/cjs/vendor_y.websocket-Dr9ojjFR.js +0 -2
  141. package/lib/cjs/vendor_y.websocket-Dr9ojjFR.js.map +0 -1
  142. package/lib/cjs/vendor_yjs-DXWp84x5.js +0 -2
  143. package/lib/cjs/vendor_yjs-DXWp84x5.js.map +0 -1
  144. package/lib/esm/editor-CLyV23xt.js +0 -2
  145. package/lib/esm/editor-CLyV23xt.js.map +0 -1
  146. package/lib/esm/markdown_plugin-DdBeaig8.js +0 -2
  147. package/lib/esm/markdown_plugin-DdBeaig8.js.map +0 -1
  148. package/lib/esm/vendor_vim-PF2jWG0J.js +0 -2
  149. package/lib/esm/vendor_vim-PF2jWG0J.js.map +0 -1
  150. package/lib/esm/vendor_y.next-B9hhKe5T.js +0 -2
  151. package/lib/esm/vendor_y.next-B9hhKe5T.js.map +0 -1
  152. package/lib/esm/vendor_y.websocket-gIpX3Cmo.js +0 -2
  153. package/lib/esm/vendor_y.websocket-gIpX3Cmo.js.map +0 -1
  154. package/lib/esm/vendor_yjs-otxZW90b.js +0 -2
  155. package/lib/esm/vendor_yjs-otxZW90b.js.map +0 -1
  156. package/tmp/app/helpers/common-test.d.ts +0 -1
  157. package/tmp/app/helpers/full-example.d.ts +0 -1
  158. package/tmp/app/helpers/index.d.ts +0 -5
  159. package/tmp/app/helpers/random-color.d.ts +0 -1
  160. package/tmp/app/helpers/random-string.d.ts +0 -1
  161. package/tmp/app/helpers/stress-test.d.ts +0 -1
  162. package/tmp/app/index.d.ts +0 -1
  163. package/tmp/extensions/compartments/index.d.ts +0 -4
  164. package/tmp/extensions/index.d.ts +0 -8
  165. package/tmp/extensions/init-extensions.d.ts +0 -14
  166. package/tmp/extensions/keymaps/bold-keymap.d.ts +0 -2
  167. package/tmp/extensions/keymaps/index.d.ts +0 -1
  168. package/tmp/extensions/keymaps/init-key-map.d.ts +0 -23
  169. package/tmp/extensions/keymaps/italic-key-map.d.ts +0 -2
  170. package/tmp/extensions/keymaps/line-through-key-map.d.ts +0 -2
  171. package/tmp/extensions/keymaps/underline-key-map.d.ts +0 -2
  172. package/tmp/extensions/listeners/get-change-event.d.ts +0 -6
  173. package/tmp/extensions/listeners/get-focus-event.d.ts +0 -8
  174. package/tmp/extensions/listeners/index.d.ts +0 -3
  175. package/tmp/extensions/listeners/init-listeners.d.ts +0 -4
  176. package/tmp/extensions/markdown/blockquote/blockquote-constants.d.ts +0 -3
  177. package/tmp/extensions/markdown/blockquote/blockquote-decoration.d.ts +0 -2
  178. package/tmp/extensions/markdown/blockquote/blockquote-widget.d.ts +0 -6
  179. package/tmp/extensions/markdown/blockquote/index.d.ts +0 -1
  180. package/tmp/extensions/markdown/bold/bold-constants.d.ts +0 -2
  181. package/tmp/extensions/markdown/bold/bold-decoration.d.ts +0 -2
  182. package/tmp/extensions/markdown/bold/index.d.ts +0 -1
  183. package/tmp/extensions/markdown/code/code-constants.d.ts +0 -3
  184. package/tmp/extensions/markdown/code/code-decoration.d.ts +0 -2
  185. package/tmp/extensions/markdown/code/code-widget.d.ts +0 -13
  186. package/tmp/extensions/markdown/code/index.d.ts +0 -1
  187. package/tmp/extensions/markdown/header/header-constants.d.ts +0 -3
  188. package/tmp/extensions/markdown/header/header-decoration.d.ts +0 -2
  189. package/tmp/extensions/markdown/header/index.d.ts +0 -1
  190. package/tmp/extensions/markdown/horizontal/horizontal-constants.d.ts +0 -1
  191. package/tmp/extensions/markdown/horizontal/horizontal-decoration.d.ts +0 -2
  192. package/tmp/extensions/markdown/horizontal/index.d.ts +0 -1
  193. package/tmp/extensions/markdown/image/image-constants.d.ts +0 -5
  194. package/tmp/extensions/markdown/image/image-decoration.d.ts +0 -2
  195. package/tmp/extensions/markdown/image/image-widget.d.ts +0 -14
  196. package/tmp/extensions/markdown/image/index.d.ts +0 -1
  197. package/tmp/extensions/markdown/index.d.ts +0 -2
  198. package/tmp/extensions/markdown/init-markdown.d.ts +0 -3
  199. package/tmp/extensions/markdown/italic/index.d.ts +0 -1
  200. package/tmp/extensions/markdown/italic/italic-constants.d.ts +0 -2
  201. package/tmp/extensions/markdown/italic/italic-decoration.d.ts +0 -2
  202. package/tmp/extensions/markdown/link/auto-link-decoration.d.ts +0 -2
  203. package/tmp/extensions/markdown/link/index.d.ts +0 -2
  204. package/tmp/extensions/markdown/link/link-constants.d.ts +0 -7
  205. package/tmp/extensions/markdown/link/link-decoration.d.ts +0 -2
  206. package/tmp/extensions/markdown/link/link-label-decoration.d.ts +0 -2
  207. package/tmp/extensions/markdown/link/link-widget.d.ts +0 -17
  208. package/tmp/extensions/markdown/list/index.d.ts +0 -1
  209. package/tmp/extensions/markdown/list/list-constants.d.ts +0 -4
  210. package/tmp/extensions/markdown/list/list-decoration.d.ts +0 -2
  211. package/tmp/extensions/markdown/list/list-widget.d.ts +0 -7
  212. package/tmp/extensions/markdown/markdown-decoration.d.ts +0 -5
  213. package/tmp/extensions/markdown/markdown-parser.d.ts +0 -2
  214. package/tmp/extensions/markdown/markdown-types.d.ts +0 -24
  215. package/tmp/extensions/markdown/mention/index.d.ts +0 -1
  216. package/tmp/extensions/markdown/mention/mention-constants.d.ts +0 -3
  217. package/tmp/extensions/markdown/mention/mention-decoration.d.ts +0 -2
  218. package/tmp/extensions/markdown/mention/mention-parser.d.ts +0 -2
  219. package/tmp/extensions/markdown/strike-through/index.d.ts +0 -1
  220. package/tmp/extensions/markdown/strike-through/strike-through-constants.d.ts +0 -1
  221. package/tmp/extensions/markdown/strike-through/strike-through-decoration.d.ts +0 -2
  222. package/tmp/extensions/markdown/todo/index.d.ts +0 -1
  223. package/tmp/extensions/markdown/todo/todo-constants.d.ts +0 -3
  224. package/tmp/extensions/markdown/todo/todo-decoration.d.ts +0 -2
  225. package/tmp/extensions/markdown/todo/todo-widget.d.ts +0 -11
  226. package/tmp/extensions/settings/index.d.ts +0 -1
  227. package/tmp/extensions/settings/init-settings.d.ts +0 -6
  228. package/tmp/extensions/theme/index.d.ts +0 -4
  229. package/tmp/extensions/theme/init-theme.d.ts +0 -3
  230. package/tmp/extensions/theme/theme-constants.d.ts +0 -14
  231. package/tmp/extensions/theme/theme-types.d.ts +0 -39
  232. package/tmp/extensions/theme/themes/get-dark-theme.d.ts +0 -2
  233. package/tmp/extensions/theme/themes/get-highlight-template.d.ts +0 -6
  234. package/tmp/extensions/theme/themes/get-light-theme.d.ts +0 -2
  235. package/tmp/extensions/theme/themes/get-theme-template.d.ts +0 -2
  236. package/tmp/extensions/theme/themes/index.d.ts +0 -2
  237. package/tmp/index.d.ts +0 -3
  238. package/tmp/lib/index.d.ts +0 -1
  239. package/tmp/lib/utils/copy-to-clipboard.d.ts +0 -1
  240. package/tmp/lib/utils/get-decoration.d.ts +0 -26
  241. package/tmp/lib/utils/index.d.ts +0 -6
  242. package/tmp/lib/utils/is-in-range.d.ts +0 -2
  243. package/tmp/lib/utils/is-range-overlap.d.ts +0 -1
  244. package/tmp/lib/utils/random-string.d.ts +0 -1
  245. package/tmp/lib/utils/tick.d.ts +0 -10
  246. package/tmp/module/Editor/Editor.d.ts +0 -18
  247. package/tmp/module/Editor/Editor.types.d.ts +0 -13
  248. package/tmp/module/Editor/index.d.ts +0 -3
  249. package/tmp/module/Editor/lib/index.d.ts +0 -1
  250. package/tmp/module/Editor/lib/init-editor-provider.d.ts +0 -9
  251. package/tmp/module/Editor/lib/init-editor-state.d.ts +0 -7
  252. package/tmp/module/Editor/lib/init-editor.d.ts +0 -7
  253. package/tmp/module/index.d.ts +0 -1
@@ -0,0 +1,75 @@
1
+ import { getReplaceDecoration, getWidgetDecorationOptions } from '../../../lib/utils/get-decoration.js';
2
+ import { isInRange } from '../../../lib/utils/is-in-range.js';
3
+ import { NAME_OF_IMAGE, CODE_OF_START_IMAGE_TEXT, CODE_OF_START_IMAGE_URL, CODE_OF_END_IMAGE_TEXT, CODE_OF_END_IMAGE_URL } from './image-constants.js';
4
+ import { ImageWidget } from './image-widget.js';
5
+
6
+ function getImageSelectionDecorations({ decorations, node, view, isReadonly, }) {
7
+ if (node.name !== NAME_OF_IMAGE) {
8
+ return;
9
+ }
10
+ const { text, url } = parseInfo(view, node);
11
+ const line = view.lineBlockAt(node.from);
12
+ if (line.from === node.from && line.to === node.to) {
13
+ if (isReadonly ||
14
+ !view.hasFocus ||
15
+ !isInRange(view.state.selection.ranges, [line.from, line.to])) {
16
+ decorations.push(getReplaceDecoration({
17
+ range: [line.from, line.to],
18
+ widget: new ImageWidget(text, url, node.from, node.to),
19
+ }));
20
+ }
21
+ else {
22
+ decorations.push(getWidgetDecorationOptions({
23
+ range: [node.to + 1],
24
+ widget: new ImageWidget(text, url, node.from, node.to),
25
+ }));
26
+ }
27
+ }
28
+ else if (isReadonly ||
29
+ !view.hasFocus ||
30
+ !isInRange(view.state.selection.ranges, [line.from, line.to])) {
31
+ decorations.push(getReplaceDecoration({
32
+ range: [node.from, node.to],
33
+ widget: new ImageWidget(text, url, node.from, node.to),
34
+ }));
35
+ }
36
+ else {
37
+ decorations.push(getWidgetDecorationOptions({
38
+ range: [node.to],
39
+ widget: new ImageWidget(text, url, node.from, node.to),
40
+ }));
41
+ }
42
+ }
43
+ function parseInfo(view, node) {
44
+ const content = view.state.doc.sliceString(node.from, node.to);
45
+ const textCoordinates = { from: -1, to: -1 };
46
+ const urlCoordinates = { from: -1, to: -1 };
47
+ let pos = -1;
48
+ while (pos < content.length) {
49
+ pos++;
50
+ const code = content.charCodeAt(pos);
51
+ if (textCoordinates.from === -1 && code === CODE_OF_START_IMAGE_TEXT)
52
+ textCoordinates.from = pos + 1;
53
+ else if (urlCoordinates.from === -1 &&
54
+ textCoordinates.to !== -1 &&
55
+ code === CODE_OF_START_IMAGE_URL)
56
+ urlCoordinates.from = pos + 1;
57
+ else if (textCoordinates.from !== -1 &&
58
+ textCoordinates.to === -1 &&
59
+ code === CODE_OF_END_IMAGE_TEXT)
60
+ textCoordinates.to = pos;
61
+ else if (urlCoordinates.from !== -1 &&
62
+ urlCoordinates.to === -1 &&
63
+ code === CODE_OF_END_IMAGE_URL)
64
+ urlCoordinates.to = pos;
65
+ }
66
+ const text = content.substring(textCoordinates.from, textCoordinates.to);
67
+ const url = content.substring(urlCoordinates.from, urlCoordinates.to);
68
+ return { text, url };
69
+ }
70
+ const imageDecorationPlugin = {
71
+ selectionDecorations: [getImageSelectionDecorations],
72
+ };
73
+
74
+ export { imageDecorationPlugin };
75
+ //# sourceMappingURL=image-decoration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-decoration.js","sources":["../../../../../src/extensions/markdown/image/image-decoration.ts"],"sourcesContent":["import { type EditorView } from \"@codemirror/view\";\nimport type { SyntaxNodeRef } from \"@lezer/common\";\nimport { utils } from \"@/lib\";\nimport type { DecorationPlugin, GetSelectionDecorationOptions } from \"../markdown-types\";\nimport {\n CODE_OF_END_IMAGE_TEXT,\n CODE_OF_END_IMAGE_URL,\n CODE_OF_START_IMAGE_TEXT,\n CODE_OF_START_IMAGE_URL,\n NAME_OF_IMAGE,\n} from \"./image-constants\";\nimport { ImageWidget } from \"./image-widget\";\n\nfunction getImageSelectionDecorations({\n decorations,\n node,\n view,\n isReadonly,\n}: GetSelectionDecorationOptions) {\n if (node.name !== NAME_OF_IMAGE) {\n return;\n }\n\n const { text, url } = parseInfo(view, node);\n const line = view.lineBlockAt(node.from);\n\n if (line.from === node.from && line.to === node.to) {\n if (\n isReadonly ||\n !view.hasFocus ||\n !utils.isInRange(view.state.selection.ranges, [line.from, line.to])\n ) {\n decorations.push(\n utils.getReplaceDecoration({\n range: [line.from, line.to],\n widget: new ImageWidget(text, url, node.from, node.to),\n }),\n );\n } else {\n decorations.push(\n utils.getWidgetDecorationOptions({\n range: [node.to + 1],\n widget: new ImageWidget(text, url, node.from, node.to),\n }),\n );\n }\n } else if (\n isReadonly ||\n !view.hasFocus ||\n !utils.isInRange(view.state.selection.ranges, [line.from, line.to])\n ) {\n decorations.push(\n utils.getReplaceDecoration({\n range: [node.from, node.to],\n widget: new ImageWidget(text, url, node.from, node.to),\n }),\n );\n } else {\n decorations.push(\n utils.getWidgetDecorationOptions({\n range: [node.to],\n widget: new ImageWidget(text, url, node.from, node.to),\n }),\n );\n }\n}\n\nfunction parseInfo(view: EditorView, node: SyntaxNodeRef) {\n const content = view.state.doc.sliceString(node.from, node.to);\n const textCoordinates = { from: -1, to: -1 };\n const urlCoordinates = { from: -1, to: -1 };\n let pos = -1;\n\n while (pos < content.length) {\n pos++;\n const code = content.charCodeAt(pos);\n\n if (textCoordinates.from === -1 && code === CODE_OF_START_IMAGE_TEXT)\n textCoordinates.from = pos + 1;\n else if (\n urlCoordinates.from === -1 &&\n textCoordinates.to !== -1 &&\n code === CODE_OF_START_IMAGE_URL\n )\n urlCoordinates.from = pos + 1;\n else if (\n textCoordinates.from !== -1 &&\n textCoordinates.to === -1 &&\n code === CODE_OF_END_IMAGE_TEXT\n )\n textCoordinates.to = pos;\n else if (\n urlCoordinates.from !== -1 &&\n urlCoordinates.to === -1 &&\n code === CODE_OF_END_IMAGE_URL\n )\n urlCoordinates.to = pos;\n }\n\n const text = content.substring(textCoordinates.from, textCoordinates.to);\n const url = content.substring(urlCoordinates.from, urlCoordinates.to);\n\n return { text, url };\n}\n\nexport const imageDecorationPlugin: DecorationPlugin = {\n selectionDecorations: [getImageSelectionDecorations],\n};\n"],"names":["utils.isInRange","utils.getReplaceDecoration","utils.getWidgetDecorationOptions"],"mappings":"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"}
@@ -0,0 +1,184 @@
1
+ import { WidgetType } from '@codemirror/view';
2
+ import { tick } from '../../../lib/utils/tick.js';
3
+ import styles from '../styles.module.scss.js';
4
+
5
+ const INTERVAL_DELAY = 10000;
6
+ const IMAGE_NODES = {};
7
+ const EXISTING_WIDGETS = new Set();
8
+ let interval = null;
9
+ class ImageWidget extends WidgetType {
10
+ text;
11
+ link;
12
+ from;
13
+ to;
14
+ view;
15
+ constructor(text, link, from, to) {
16
+ super();
17
+ this.text = text;
18
+ this.link = link;
19
+ this.from = from;
20
+ this.to = to;
21
+ }
22
+ get key() {
23
+ return `${this.link}:${this.text}:${this.from}:${this.to}`;
24
+ }
25
+ eq(widget) {
26
+ const image = IMAGE_NODES[this.key];
27
+ delete IMAGE_NODES[this.key];
28
+ EXISTING_WIDGETS.delete(this.key);
29
+ if (image.src !== widget.link)
30
+ image.src = widget.link;
31
+ if (image.alt !== widget.text)
32
+ image.alt = widget.text;
33
+ this.link = widget.link;
34
+ this.text = widget.text;
35
+ this.from = widget.from;
36
+ this.to = widget.to;
37
+ IMAGE_NODES[this.key] = image;
38
+ EXISTING_WIDGETS.add(this.key);
39
+ return true;
40
+ }
41
+ updateDOM() {
42
+ return true;
43
+ }
44
+ toDOM(view) {
45
+ EXISTING_WIDGETS.add(this.key);
46
+ if (IMAGE_NODES[this.key]) {
47
+ const image = IMAGE_NODES[this.key];
48
+ if (image.src !== this.link) {
49
+ image.src = this.link;
50
+ }
51
+ if (image.alt !== this.text)
52
+ image.alt = this.text;
53
+ return image;
54
+ }
55
+ this.view = view;
56
+ const image = document.createElement("img");
57
+ image.classList.add(styles.image);
58
+ image.alt = this.text;
59
+ image.src = this.link;
60
+ image.addEventListener("mousedown", handleClick);
61
+ image.addEventListener("click", handleClick);
62
+ IMAGE_NODES[this.key] = image;
63
+ if (!interval)
64
+ interval = setInterval(garbageCollectorInterval, INTERVAL_DELAY);
65
+ return image;
66
+ }
67
+ destroy() {
68
+ EXISTING_WIDGETS.delete(this.key);
69
+ }
70
+ }
71
+ function garbageCollectorInterval() {
72
+ for (const [key, node] of Object.entries(IMAGE_NODES)) {
73
+ if (EXISTING_WIDGETS.has(key))
74
+ continue;
75
+ delete IMAGE_NODES[key];
76
+ node.removeEventListener("mousedown", handleClick);
77
+ node.removeEventListener("click", handleClick);
78
+ node.remove();
79
+ }
80
+ if (Object.keys(IMAGE_NODES).length === 0 && interval) {
81
+ clearInterval(interval);
82
+ interval = null;
83
+ }
84
+ }
85
+ /** recursively find the link text node in line */
86
+ function getTextNode(imageNode, line) {
87
+ if (!line)
88
+ return null;
89
+ const link = imageNode.src;
90
+ let textNode = null;
91
+ for (const node of Array.from(line.childNodes)) {
92
+ if (node.nodeType !== 3) {
93
+ const innerNode = getTextNode(imageNode, node);
94
+ if (innerNode) {
95
+ textNode = innerNode;
96
+ break;
97
+ }
98
+ continue;
99
+ }
100
+ const textContent = node.textContent;
101
+ if (textContent && textContent.includes(link)) {
102
+ textNode = node;
103
+ break;
104
+ }
105
+ }
106
+ return textNode;
107
+ }
108
+ function getMinLength(imageNode) {
109
+ const text = imageNode.alt || "";
110
+ const link = imageNode.src;
111
+ const startPosition = 4 + text.length;
112
+ const endPosition = startPosition + link.length + 1;
113
+ return endPosition;
114
+ }
115
+ function isCorrectNode(imageNode, node) {
116
+ if (!node)
117
+ return false;
118
+ const textContent = node?.textContent;
119
+ const minLength = getMinLength(imageNode);
120
+ return Boolean(node && textContent && node.nodeType === 3 && textContent.length >= minLength);
121
+ }
122
+ function selectLink({ imageNode, node, selection, start }) {
123
+ const link = imageNode.src;
124
+ const startPosition = start ?? (node.textContent?.indexOf?.(link) || 0);
125
+ const endPosition = startPosition + link.length;
126
+ const range = document.createRange();
127
+ range.setStart(node, startPosition);
128
+ range.setEnd(node, endPosition);
129
+ selection.removeAllRanges();
130
+ selection.addRange(range);
131
+ }
132
+ function handleClick(event) {
133
+ const selection = window.getSelection();
134
+ if (event.shiftKey || event.ctrlKey || event.altKey || event.metaKey) {
135
+ return;
136
+ }
137
+ event.stopPropagation();
138
+ event.preventDefault();
139
+ const target = event.target;
140
+ const parent = target.parentNode;
141
+ let line = parent;
142
+ /** recursively find line that contains link */
143
+ while (line && !line.classList.contains("cm-line")) {
144
+ line = line.parentNode;
145
+ }
146
+ const editor = Array.from(document.querySelectorAll(".cm-editor")).find((element) => element.contains(target));
147
+ if (!selection || !editor || !parent)
148
+ return;
149
+ const prevLine = parent.previousSibling;
150
+ let textNode = getTextNode(target, prevLine);
151
+ if (!textNode)
152
+ textNode = getTextNode(target, parent);
153
+ if (textNode) {
154
+ if (isCorrectNode(target, textNode))
155
+ selectLink({ selection, imageNode: target, node: textNode });
156
+ return;
157
+ }
158
+ const range = document.createRange();
159
+ range.selectNode(target);
160
+ range.collapse(true);
161
+ selection.removeAllRanges();
162
+ selection.addRange(range);
163
+ /** wait for the widget to disappear and link will be visible */
164
+ void tick({
165
+ delay: 0,
166
+ maxDeep: 5,
167
+ delayGetter: (deep) => {
168
+ return deep > 1 ? 10 : 0;
169
+ },
170
+ recursiveCondition: () => {
171
+ const textNode = getTextNode(target, line);
172
+ return isCorrectNode(target, textNode);
173
+ },
174
+ })
175
+ .then(() => {
176
+ const textNode = getTextNode(target, line);
177
+ if (isCorrectNode(target, textNode))
178
+ selectLink({ selection, imageNode: target, node: textNode });
179
+ });
180
+ return false;
181
+ }
182
+
183
+ export { ImageWidget };
184
+ //# sourceMappingURL=image-widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-widget.js","sources":["../../../../../src/extensions/markdown/image/image-widget.ts"],"sourcesContent":["import { type EditorView, WidgetType } from \"@codemirror/view\";\nimport { utils } from \"@/lib\";\nimport styles from \"../styles.module.scss\";\n\nconst INTERVAL_DELAY = 10000;\nconst IMAGE_NODES: Record<string, HTMLImageElement> = {};\nconst EXISTING_WIDGETS: Set<string> = new Set();\nlet interval: NodeJS.Timeout | null = null;\n\nexport class ImageWidget extends WidgetType {\n view: EditorView | undefined;\n\n constructor(\n private text: string,\n private link: string,\n private from: number,\n private to: number,\n ) {\n super();\n }\n\n get key() {\n return `${this.link}:${this.text}:${this.from}:${this.to}`;\n }\n\n eq(widget: ImageWidget): boolean {\n const image = IMAGE_NODES[this.key];\n\n delete IMAGE_NODES[this.key];\n EXISTING_WIDGETS.delete(this.key);\n\n if (image.src !== widget.link) image.src = widget.link;\n if (image.alt !== widget.text) image.alt = widget.text;\n\n this.link = widget.link;\n this.text = widget.text;\n this.from = widget.from;\n this.to = widget.to;\n\n IMAGE_NODES[this.key] = image;\n EXISTING_WIDGETS.add(this.key);\n\n return true;\n }\n\n updateDOM(): boolean {\n return true;\n }\n\n toDOM(view: EditorView): HTMLElement {\n EXISTING_WIDGETS.add(this.key);\n\n if (IMAGE_NODES[this.key]) {\n const image = IMAGE_NODES[this.key];\n if (image.src !== this.link) {\n image.src = this.link;\n }\n if (image.alt !== this.text) image.alt = this.text;\n\n return image;\n }\n\n this.view = view;\n const image = document.createElement(\"img\");\n image.classList.add(styles.image);\n image.alt = this.text;\n image.src = this.link;\n\n image.addEventListener(\"mousedown\", handleClick);\n image.addEventListener(\"click\", handleClick);\n\n IMAGE_NODES[this.key] = image;\n\n if (!interval) interval = setInterval(garbageCollectorInterval, INTERVAL_DELAY);\n\n return image;\n }\n\n destroy(): void {\n EXISTING_WIDGETS.delete(this.key);\n }\n}\n\nfunction garbageCollectorInterval() {\n for (const [key, node] of Object.entries(IMAGE_NODES)) {\n if (EXISTING_WIDGETS.has(key)) continue;\n\n delete IMAGE_NODES[key];\n node.removeEventListener(\"mousedown\", handleClick);\n node.removeEventListener(\"click\", handleClick);\n node.remove();\n }\n\n if (Object.keys(IMAGE_NODES).length === 0 && interval) {\n clearInterval(interval);\n interval = null;\n }\n}\n\n/** recursively find the link text node in line */\nfunction getTextNode(\n imageNode: HTMLImageElement,\n line: ChildNode | Node | null | undefined,\n): ChildNode | null {\n if (!line) return null;\n const link = imageNode.src;\n let textNode: ChildNode | null = null;\n\n for (const node of Array.from(line.childNodes)) {\n if (node.nodeType !== 3) {\n const innerNode = getTextNode(imageNode, node);\n if (innerNode) {\n textNode = innerNode;\n break;\n }\n\n continue;\n }\n\n const textContent = node.textContent;\n if (textContent && textContent.includes(link)) {\n textNode = node;\n break;\n }\n }\n\n return textNode;\n}\n\nfunction getMinLength(imageNode: HTMLImageElement) {\n const text = imageNode.alt || \"\";\n const link = imageNode.src;\n\n const startPosition = 4 + text.length;\n const endPosition = startPosition + link.length + 1;\n\n return endPosition;\n}\n\nfunction isCorrectNode(\n imageNode: HTMLImageElement,\n node: ChildNode | Node | null | undefined,\n): node is ChildNode | Node {\n if (!node) return false;\n\n const textContent = node?.textContent;\n const minLength = getMinLength(imageNode);\n\n return Boolean(node && textContent && node.nodeType === 3 && textContent.length >= minLength);\n}\n\ntype SelectLinkOptions = {\n node: ChildNode | Node;\n selection: Selection;\n start?: number;\n imageNode: HTMLImageElement;\n};\nfunction selectLink({ imageNode, node, selection, start }: SelectLinkOptions) {\n const link = imageNode.src;\n const startPosition = start ?? (node.textContent?.indexOf?.(link) || 0);\n const endPosition = startPosition + link.length;\n\n const range = document.createRange();\n range.setStart(node, startPosition);\n range.setEnd(node, endPosition);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n\nfunction handleClick(event: MouseEvent) {\n const selection = window.getSelection();\n\n if (event.shiftKey || event.ctrlKey || event.altKey || event.metaKey) {\n return;\n }\n\n event.stopPropagation();\n event.preventDefault();\n const target = event.target as HTMLImageElement;\n const parent = target.parentNode;\n let line: HTMLElement | null = parent as HTMLElement | null;\n\n /** recursively find line that contains link */\n while (line && !line.classList.contains(\"cm-line\")) {\n line = line.parentNode as HTMLElement | null;\n }\n\n const editor = Array.from(document.querySelectorAll(\".cm-editor\")).find((element) =>\n element.contains(target),\n );\n\n if (!selection || !editor || !parent) return;\n\n const prevLine = parent.previousSibling;\n let textNode = getTextNode(target, prevLine);\n if (!textNode) textNode = getTextNode(target, parent);\n if (textNode) {\n if (isCorrectNode(target, textNode))\n selectLink({ selection, imageNode: target, node: textNode });\n\n return;\n }\n\n const range = document.createRange();\n range.selectNode(target);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n\n /** wait for the widget to disappear and link will be visible */\n void utils\n .tick({\n delay: 0,\n maxDeep: 5,\n delayGetter: (deep) => {\n return deep > 1 ? 10 : 0;\n },\n recursiveCondition: () => {\n const textNode = getTextNode(target, line);\n\n return isCorrectNode(target, textNode);\n },\n })\n .then(() => {\n const textNode = getTextNode(target, line);\n if (isCorrectNode(target, textNode))\n selectLink({ selection, imageNode: target, node: textNode });\n });\n\n return false;\n}\n"],"names":["utils\n .tick"],"mappings":";;;;AAIA,MAAM,cAAc,GAAG,KAAK;AAC5B,MAAM,WAAW,GAAqC,EAAE;AACxD,MAAM,gBAAgB,GAAgB,IAAI,GAAG,EAAE;AAC/C,IAAI,QAAQ,GAA0B,IAAI;AAEpC,MAAO,WAAY,SAAQ,UAAU,CAAA;AAI/B,IAAA,IAAA;AACA,IAAA,IAAA;AACA,IAAA,IAAA;AACA,IAAA,EAAA;AANV,IAAA,IAAI;AAEJ,IAAA,WAAA,CACU,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,EAAU,EAAA;AAElB,QAAA,KAAK,EAAE;QALC,IAAI,CAAA,IAAA,GAAJ,IAAI;QACJ,IAAI,CAAA,IAAA,GAAJ,IAAI;QACJ,IAAI,CAAA,IAAA,GAAJ,IAAI;QACJ,IAAE,CAAA,EAAA,GAAF,EAAE;;AAKZ,IAAA,IAAI,GAAG,GAAA;AACL,QAAA,OAAO,GAAG,IAAI,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAI,CAAA,EAAA,IAAI,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,EAAE,EAAE;;AAG5D,IAAA,EAAE,CAAC,MAAmB,EAAA;QACpB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;AAEnC,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;AAC5B,QAAA,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AAEjC,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,IAAI;AAAE,YAAA,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI;AACtD,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,IAAI;AAAE,YAAA,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI;AAEtD,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;AACvB,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;AACvB,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI;AACvB,QAAA,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE;AAEnB,QAAA,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK;AAC7B,QAAA,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;AAE9B,QAAA,OAAO,IAAI;;IAGb,SAAS,GAAA;AACP,QAAA,OAAO,IAAI;;AAGb,IAAA,KAAK,CAAC,IAAgB,EAAA;AACpB,QAAA,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;AAE9B,QAAA,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACzB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;YACnC,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI,EAAE;AAC3B,gBAAA,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI;;AAEvB,YAAA,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,IAAI;AAAE,gBAAA,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI;AAElD,YAAA,OAAO,KAAK;;AAGd,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;QAChB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;QAC3C,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;AACjC,QAAA,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI;AACrB,QAAA,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI;AAErB,QAAA,KAAK,CAAC,gBAAgB,CAAC,WAAW,EAAE,WAAW,CAAC;AAChD,QAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC;AAE5C,QAAA,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK;AAE7B,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,QAAQ,GAAG,WAAW,CAAC,wBAAwB,EAAE,cAAc,CAAC;AAE/E,QAAA,OAAO,KAAK;;IAGd,OAAO,GAAA;AACL,QAAA,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;;AAEpC;AAED,SAAS,wBAAwB,GAAA;AAC/B,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AACrD,QAAA,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE;AAE/B,QAAA,OAAO,WAAW,CAAC,GAAG,CAAC;AACvB,QAAA,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC;AAClD,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE;;AAGf,IAAA,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,EAAE;QACrD,aAAa,CAAC,QAAQ,CAAC;QACvB,QAAQ,GAAG,IAAI;;AAEnB;AAEA;AACA,SAAS,WAAW,CAClB,SAA2B,EAC3B,IAAyC,EAAA;AAEzC,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;AACtB,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG;IAC1B,IAAI,QAAQ,GAAqB,IAAI;AAErC,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AAC9C,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE;YACvB,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC;YAC9C,IAAI,SAAS,EAAE;gBACb,QAAQ,GAAG,SAAS;gBACpB;;YAGF;;AAGF,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW;QACpC,IAAI,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAC7C,QAAQ,GAAG,IAAI;YACf;;;AAIJ,IAAA,OAAO,QAAQ;AACjB;AAEA,SAAS,YAAY,CAAC,SAA2B,EAAA;AAC/C,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,IAAI,EAAE;AAChC,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG;AAE1B,IAAA,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;IACrC,MAAM,WAAW,GAAG,aAAa,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;AAEnD,IAAA,OAAO,WAAW;AACpB;AAEA,SAAS,aAAa,CACpB,SAA2B,EAC3B,IAAyC,EAAA;AAEzC,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,KAAK;AAEvB,IAAA,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW;AACrC,IAAA,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC;AAEzC,IAAA,OAAO,OAAO,CAAC,IAAI,IAAI,WAAW,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,IAAI,SAAS,CAAC;AAC/F;AAQA,SAAS,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAqB,EAAA;AAC1E,IAAA,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG;AAC1B,IAAA,MAAM,aAAa,GAAG,KAAK,KAAK,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;AACvE,IAAA,MAAM,WAAW,GAAG,aAAa,GAAG,IAAI,CAAC,MAAM;AAE/C,IAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE;AACpC,IAAA,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;AACnC,IAAA,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC;IAC/B,SAAS,CAAC,eAAe,EAAE;AAC3B,IAAA,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC3B;AAEA,SAAS,WAAW,CAAC,KAAiB,EAAA;AACpC,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE;AAEvC,IAAA,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE;QACpE;;IAGF,KAAK,CAAC,eAAe,EAAE;IACvB,KAAK,CAAC,cAAc,EAAE;AACtB,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B;AAC/C,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU;IAChC,IAAI,IAAI,GAAuB,MAA4B;;AAG3D,IAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;AAClD,QAAA,IAAI,GAAG,IAAI,CAAC,UAAgC;;AAG9C,IAAA,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAC9E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CACzB;AAED,IAAA,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;QAAE;AAEtC,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe;IACvC,IAAI,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC;AAC5C,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IACrD,IAAI,QAAQ,EAAE;AACZ,QAAA,IAAI,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC;AACjC,YAAA,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAE9D;;AAGF,IAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE;AACpC,IAAA,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;AACxB,IAAA,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;IACpB,SAAS,CAAC,eAAe,EAAE;AAC3B,IAAA,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;;AAGzB,IAAA,KAAKA,IACE,CAAC;AACJ,QAAA,KAAK,EAAE,CAAC;AACR,QAAA,OAAO,EAAE,CAAC;AACV,QAAA,WAAW,EAAE,CAAC,IAAI,KAAI;YACpB,OAAO,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;SACzB;QACD,kBAAkB,EAAE,MAAK;YACvB,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC;AAE1C,YAAA,OAAO,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC;SACvC;KACF;SACA,IAAI,CAAC,MAAK;QACT,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC;AAC1C,QAAA,IAAI,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC;AACjC,YAAA,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAChE,KAAC,CAAC;AAEJ,IAAA,OAAO,KAAK;AACd;;;;"}
@@ -0,0 +1,2 @@
1
+ export { initMarkdown } from './init-markdown.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { markdown, markdownLanguage } from '@codemirror/lang-markdown';
2
+ import { markdownDecorationPlugin } from './markdown-decoration.js';
3
+ import { markdownParserPlugin } from './markdown-parser.js';
4
+
5
+ const initMarkdown = ({ languages }) => {
6
+ return [
7
+ markdown({
8
+ base: markdownLanguage,
9
+ codeLanguages: languages,
10
+ addKeymap: true,
11
+ extensions: [markdownParserPlugin],
12
+ }),
13
+ markdownDecorationPlugin,
14
+ ];
15
+ };
16
+
17
+ export { initMarkdown };
18
+ //# sourceMappingURL=init-markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-markdown.js","sources":["../../../../src/extensions/markdown/init-markdown.ts"],"sourcesContent":["import { markdown, markdownLanguage } from \"@codemirror/lang-markdown\";\nimport { type Extension } from \"@codemirror/state\";\nimport { markdownDecorationPlugin } from \"./markdown-decoration\";\nimport { markdownParserPlugin } from \"./markdown-parser\";\nimport type { InitMarkdownOptions } from \"./markdown-types\";\n\nexport const initMarkdown = ({ languages }: InitMarkdownOptions): Extension => {\n return [\n markdown({\n base: markdownLanguage,\n codeLanguages: languages,\n addKeymap: true,\n extensions: [markdownParserPlugin],\n }),\n markdownDecorationPlugin,\n ];\n};\n"],"names":[],"mappings":";;;;MAMa,YAAY,GAAG,CAAC,EAAE,SAAS,EAAuB,KAAe;IAC5E,OAAO;AACL,QAAA,QAAQ,CAAC;AACP,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,aAAa,EAAE,SAAS;AACxB,YAAA,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,CAAC,oBAAoB,CAAC;SACnC,CAAC;QACF,wBAAwB;KACzB;AACH;;;;"}
@@ -0,0 +1,5 @@
1
+ const NAME_OF_ITALIC = "Emphasis";
2
+ const LIST_OF_ITALIC_MARKS = new Set([95, 42]); // _ *
3
+
4
+ export { LIST_OF_ITALIC_MARKS, NAME_OF_ITALIC };
5
+ //# sourceMappingURL=italic-constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"italic-constants.js","sources":["../../../../../src/extensions/markdown/italic/italic-constants.ts"],"sourcesContent":["export const NAME_OF_ITALIC = \"Emphasis\";\nexport const LIST_OF_ITALIC_MARKS = new Set([95, 42]); // _ *\n"],"names":[],"mappings":"AAAO,MAAM,cAAc,GAAG;AACvB,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE;;;;"}
@@ -0,0 +1,77 @@
1
+ import { getMarkDecoration, getHideDecoration } from '../../../lib/utils/get-decoration.js';
2
+ import { isInRange } from '../../../lib/utils/is-in-range.js';
3
+ import styles from '../styles.module.scss.js';
4
+ import { NAME_OF_ITALIC, LIST_OF_ITALIC_MARKS } from './italic-constants.js';
5
+
6
+ function getItalicDecorations({ decorations, node }) {
7
+ if (node.name !== NAME_OF_ITALIC) {
8
+ return;
9
+ }
10
+ decorations.push(getMarkDecoration({
11
+ style: styles.italic,
12
+ range: [node.from, node.to],
13
+ }));
14
+ }
15
+ function getItalicSelectionDecorations({ decorations, node, view, isReadonly, }) {
16
+ if (node.name !== NAME_OF_ITALIC) {
17
+ return;
18
+ }
19
+ if (checkIsSeveralEmphasis({ decorations, node, view, isReadonly })) {
20
+ return void splitEmphasis({ decorations, node, view, isReadonly });
21
+ }
22
+ let step = 1;
23
+ const startText = view.state.doc.sliceString(node.from, node.from + 3);
24
+ if (LIST_OF_ITALIC_MARKS.has(startText.charCodeAt(0)) &&
25
+ LIST_OF_ITALIC_MARKS.has(startText.charCodeAt(1)) &&
26
+ LIST_OF_ITALIC_MARKS.has(startText.charCodeAt(2)))
27
+ step = 3;
28
+ if (isReadonly ||
29
+ !view.hasFocus ||
30
+ !isInRange(view.state.selection.ranges, [node.from, node.to])) {
31
+ decorations.push(getHideDecoration({ range: [node.from, node.from + step] }));
32
+ decorations.push(getHideDecoration({ range: [node.to - step, node.to] }));
33
+ }
34
+ }
35
+ /** Fixed wide italic + italic */
36
+ function checkIsSeveralEmphasis({ node, view }) {
37
+ let marks = 0;
38
+ let pos = 0;
39
+ const text = view.state.doc.sliceString(node.from, node.to);
40
+ while (pos <= text.length) {
41
+ if (LIST_OF_ITALIC_MARKS.has(text.charCodeAt(pos)))
42
+ marks++;
43
+ pos++;
44
+ }
45
+ if (marks === 8)
46
+ return true;
47
+ return false;
48
+ }
49
+ function splitEmphasis({ decorations, node, view, isReadonly }) {
50
+ const text = view.state.doc.sliceString(node.from, node.to);
51
+ let marks = 0;
52
+ let pos = 0;
53
+ while (pos <= text.length && marks < 6) {
54
+ if (LIST_OF_ITALIC_MARKS.has(text.charCodeAt(pos)))
55
+ marks++;
56
+ pos++;
57
+ }
58
+ getItalicSelectionDecorations({
59
+ decorations,
60
+ view,
61
+ node: { ...node, name: node.name, from: node.from, to: node.from + pos },
62
+ isReadonly,
63
+ });
64
+ getItalicSelectionDecorations({
65
+ decorations,
66
+ view,
67
+ node: { ...node, name: node.name, from: node.from + pos, to: node.to },
68
+ isReadonly,
69
+ });
70
+ }
71
+ const italicDecorationPlugin = {
72
+ decorations: [getItalicDecorations],
73
+ selectionDecorations: [getItalicSelectionDecorations],
74
+ };
75
+
76
+ export { italicDecorationPlugin };
77
+ //# sourceMappingURL=italic-decoration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"italic-decoration.js","sources":["../../../../../src/extensions/markdown/italic/italic-decoration.ts"],"sourcesContent":["import { utils } from \"@/lib\";\nimport type {\n DecorationPlugin,\n GetDecorationOptions,\n GetSelectionDecorationOptions,\n} from \"../markdown-types\";\nimport styles from \"../styles.module.scss\";\nimport { LIST_OF_ITALIC_MARKS, NAME_OF_ITALIC } from \"./italic-constants\";\n\nfunction getItalicDecorations({ decorations, node }: GetDecorationOptions) {\n if (node.name !== NAME_OF_ITALIC) {\n return;\n }\n\n decorations.push(\n utils.getMarkDecoration({\n style: styles.italic,\n range: [node.from, node.to],\n }),\n );\n}\n\nfunction getItalicSelectionDecorations({\n decorations,\n node,\n view,\n isReadonly,\n}: GetSelectionDecorationOptions) {\n if (node.name !== NAME_OF_ITALIC) {\n return;\n }\n\n if (checkIsSeveralEmphasis({ decorations, node, view, isReadonly })) {\n return void splitEmphasis({ decorations, node, view, isReadonly });\n }\n\n let step = 1;\n const startText = view.state.doc.sliceString(node.from, node.from + 3);\n if (\n LIST_OF_ITALIC_MARKS.has(startText.charCodeAt(0)) &&\n LIST_OF_ITALIC_MARKS.has(startText.charCodeAt(1)) &&\n LIST_OF_ITALIC_MARKS.has(startText.charCodeAt(2))\n )\n step = 3;\n\n if (\n isReadonly ||\n !view.hasFocus ||\n !utils.isInRange(view.state.selection.ranges, [node.from, node.to])\n ) {\n decorations.push(utils.getHideDecoration({ range: [node.from, node.from + step] }));\n decorations.push(utils.getHideDecoration({ range: [node.to - step, node.to] }));\n }\n}\n\n/** Fixed wide italic + italic */\nfunction checkIsSeveralEmphasis({ node, view }: GetSelectionDecorationOptions) {\n let marks = 0;\n let pos = 0;\n\n const text = view.state.doc.sliceString(node.from, node.to);\n\n while (pos <= text.length) {\n if (LIST_OF_ITALIC_MARKS.has(text.charCodeAt(pos))) marks++;\n pos++;\n }\n\n if (marks === 8) return true;\n\n return false;\n}\n\nfunction splitEmphasis({ decorations, node, view, isReadonly }: GetSelectionDecorationOptions) {\n const text = view.state.doc.sliceString(node.from, node.to);\n let marks = 0;\n let pos = 0;\n\n while (pos <= text.length && marks < 6) {\n if (LIST_OF_ITALIC_MARKS.has(text.charCodeAt(pos))) marks++;\n pos++;\n }\n\n getItalicSelectionDecorations({\n decorations,\n view,\n node: { ...node, name: node.name, from: node.from, to: node.from + pos },\n isReadonly,\n });\n getItalicSelectionDecorations({\n decorations,\n view,\n node: { ...node, name: node.name, from: node.from + pos, to: node.to },\n isReadonly,\n });\n}\n\nexport const italicDecorationPlugin: DecorationPlugin = {\n decorations: [getItalicDecorations],\n selectionDecorations: [getItalicSelectionDecorations],\n};\n"],"names":["utils.getMarkDecoration","utils.isInRange","utils.getHideDecoration"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { getReplaceDecoration } from '../../../lib/utils/get-decoration.js';
2
+ import { isInRange } from '../../../lib/utils/is-in-range.js';
3
+ import { NAME_OF_AUTO_LINK } from './link-constants.js';
4
+ import { LinkWidget } from './link-widget.js';
5
+
6
+ function getAutoLinkSelectionDecorations({ decorations, node, view, isReadonly, }) {
7
+ if (node.name !== NAME_OF_AUTO_LINK)
8
+ return;
9
+ const url = view.state.doc.sliceString(node.from + 1, node.to - 1);
10
+ if (isReadonly ||
11
+ !view.hasFocus ||
12
+ !isInRange(view.state.selection.ranges, [node.from, node.to])) {
13
+ decorations.push(getReplaceDecoration({
14
+ range: [node.from, node.to],
15
+ widget: new LinkWidget(url, url, "auto"),
16
+ }));
17
+ }
18
+ }
19
+ const autoLinkDecorationPlugin = {
20
+ selectionDecorations: [getAutoLinkSelectionDecorations],
21
+ };
22
+
23
+ export { autoLinkDecorationPlugin };
24
+ //# sourceMappingURL=auto-link-decoration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-link-decoration.js","sources":["../../../../../src/extensions/markdown/link/auto-link-decoration.ts"],"sourcesContent":["import { utils } from \"@/lib\";\nimport type { DecorationPlugin, GetSelectionDecorationOptions } from \"../markdown-types\";\nimport { NAME_OF_AUTO_LINK } from \"./link-constants\";\nimport { LinkWidget } from \"./link-widget\";\n\nfunction getAutoLinkSelectionDecorations({\n decorations,\n node,\n view,\n isReadonly,\n}: GetSelectionDecorationOptions) {\n if (node.name !== NAME_OF_AUTO_LINK) return;\n\n const url = view.state.doc.sliceString(node.from + 1, node.to - 1);\n\n if (\n isReadonly ||\n !view.hasFocus ||\n !utils.isInRange(view.state.selection.ranges, [node.from, node.to])\n ) {\n decorations.push(\n utils.getReplaceDecoration({\n range: [node.from, node.to],\n widget: new LinkWidget(url, url, \"auto\"),\n }),\n );\n }\n}\n\nexport const autoLinkDecorationPlugin: DecorationPlugin = {\n selectionDecorations: [getAutoLinkSelectionDecorations],\n};\n"],"names":["utils.isInRange","utils.getReplaceDecoration"],"mappings":";;;;;AAKA,SAAS,+BAA+B,CAAC,EACvC,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,UAAU,GACoB,EAAA;AAC9B,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB;QAAE;IAErC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AAElE,IAAA,IACE,UAAU;QACV,CAAC,IAAI,CAAC,QAAQ;QACd,CAACA,SAAe,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EACnE;AACA,QAAA,WAAW,CAAC,IAAI,CACdC,oBAA0B,CAAC;YACzB,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,EAAE,IAAI,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC;AACzC,SAAA,CAAC,CACH;;AAEL;AAEa,MAAA,wBAAwB,GAAqB;IACxD,oBAAoB,EAAE,CAAC,+BAA+B,CAAC;;;;;"}
@@ -0,0 +1,10 @@
1
+ const NAME_OF_LINK = "Link";
2
+ const CODE_OF_START_LINK_TEXT = 91; // [
3
+ const CODE_OF_END_LINK_TEXT = 93; // ]
4
+ const CODE_OF_START_LINK_URL = 40; // (
5
+ const CODE_OF_END_LINK_URL = 41; // )
6
+ const NAME_OF_AUTO_LINK = "Autolink";
7
+ const CODE_OF_LINK_LABEL_END = 58; // :
8
+
9
+ export { CODE_OF_END_LINK_TEXT, CODE_OF_END_LINK_URL, CODE_OF_LINK_LABEL_END, CODE_OF_START_LINK_TEXT, CODE_OF_START_LINK_URL, NAME_OF_AUTO_LINK, NAME_OF_LINK };
10
+ //# sourceMappingURL=link-constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-constants.js","sources":["../../../../../src/extensions/markdown/link/link-constants.ts"],"sourcesContent":["export const NAME_OF_LINK = \"Link\";\nexport const CODE_OF_START_LINK_TEXT = 91; // [\nexport const CODE_OF_END_LINK_TEXT = 93; // ]\nexport const CODE_OF_START_LINK_URL = 40; // (\nexport const CODE_OF_END_LINK_URL = 41; // )\n\nexport const NAME_OF_AUTO_LINK = \"Autolink\";\n\nexport const CODE_OF_LINK_LABEL_END = 58; // :\n"],"names":[],"mappings":"AAAO,MAAM,YAAY,GAAG;AACf,MAAA,uBAAuB,GAAG,GAAG;AAC7B,MAAA,qBAAqB,GAAG,GAAG;AAC3B,MAAA,sBAAsB,GAAG,GAAG;AAC5B,MAAA,oBAAoB,GAAG,GAAG;AAEhC,MAAM,iBAAiB,GAAG;AAEpB,MAAA,sBAAsB,GAAG,GAAG;;;;"}
@@ -0,0 +1,51 @@
1
+ import { getReplaceDecoration } from '../../../lib/utils/get-decoration.js';
2
+ import { isInRange } from '../../../lib/utils/is-in-range.js';
3
+ import { NAME_OF_LINK, CODE_OF_START_LINK_TEXT, CODE_OF_START_LINK_URL, CODE_OF_END_LINK_TEXT, CODE_OF_END_LINK_URL } from './link-constants.js';
4
+ import { getLinkLabelSelectionDecoration } from './link-label-decoration.js';
5
+ import { LinkWidget } from './link-widget.js';
6
+
7
+ function getLinkSelectionDecorations({ decorations, node, view, isReadonly, }) {
8
+ if (node.name !== NAME_OF_LINK) {
9
+ return;
10
+ }
11
+ const content = view.state.doc.sliceString(node.from, node.to);
12
+ const textCoordinates = { from: -1, to: -1 };
13
+ const urlCoordinates = { from: -1, to: -1 };
14
+ let pos = -1;
15
+ while (pos < content.length) {
16
+ pos++;
17
+ const code = content.charCodeAt(pos);
18
+ if (textCoordinates.from === -1 && code === CODE_OF_START_LINK_TEXT)
19
+ textCoordinates.from = pos + 1;
20
+ else if (urlCoordinates.from === -1 &&
21
+ textCoordinates.to !== -1 &&
22
+ code === CODE_OF_START_LINK_URL)
23
+ urlCoordinates.from = pos + 1;
24
+ else if (textCoordinates.from !== -1 &&
25
+ textCoordinates.to === -1 &&
26
+ code === CODE_OF_END_LINK_TEXT)
27
+ textCoordinates.to = pos;
28
+ else if (urlCoordinates.from !== -1 &&
29
+ urlCoordinates.to === -1 &&
30
+ code === CODE_OF_END_LINK_URL)
31
+ urlCoordinates.to = pos;
32
+ }
33
+ if (urlCoordinates.from === -1 || urlCoordinates.to === -1)
34
+ return void getLinkLabelSelectionDecoration({ decorations, isReadonly, node, view });
35
+ const text = content.substring(textCoordinates.from, textCoordinates.to);
36
+ const url = content.substring(urlCoordinates.from, urlCoordinates.to);
37
+ if (isReadonly ||
38
+ !view.hasFocus ||
39
+ !isInRange(view.state.selection.ranges, [node.from, node.to])) {
40
+ decorations.push(getReplaceDecoration({
41
+ range: [node.from, node.to],
42
+ widget: new LinkWidget(text, url, "link"),
43
+ }));
44
+ }
45
+ }
46
+ const linkDecorationPlugin = {
47
+ selectionDecorations: [getLinkSelectionDecorations],
48
+ };
49
+
50
+ export { linkDecorationPlugin };
51
+ //# sourceMappingURL=link-decoration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-decoration.js","sources":["../../../../../src/extensions/markdown/link/link-decoration.ts"],"sourcesContent":["import { utils } from \"@/lib\";\nimport type { DecorationPlugin, GetSelectionDecorationOptions } from \"../markdown-types\";\nimport {\n CODE_OF_END_LINK_TEXT,\n CODE_OF_END_LINK_URL,\n CODE_OF_START_LINK_TEXT,\n CODE_OF_START_LINK_URL,\n NAME_OF_LINK,\n} from \"./link-constants\";\nimport { getLinkLabelSelectionDecoration } from \"./link-label-decoration\";\nimport { LinkWidget } from \"./link-widget\";\n\nfunction getLinkSelectionDecorations({\n decorations,\n node,\n view,\n isReadonly,\n}: GetSelectionDecorationOptions) {\n if (node.name !== NAME_OF_LINK) {\n return;\n }\n\n const content = view.state.doc.sliceString(node.from, node.to);\n const textCoordinates = { from: -1, to: -1 };\n const urlCoordinates = { from: -1, to: -1 };\n let pos = -1;\n\n while (pos < content.length) {\n pos++;\n const code = content.charCodeAt(pos);\n\n if (textCoordinates.from === -1 && code === CODE_OF_START_LINK_TEXT)\n textCoordinates.from = pos + 1;\n else if (\n urlCoordinates.from === -1 &&\n textCoordinates.to !== -1 &&\n code === CODE_OF_START_LINK_URL\n )\n urlCoordinates.from = pos + 1;\n else if (\n textCoordinates.from !== -1 &&\n textCoordinates.to === -1 &&\n code === CODE_OF_END_LINK_TEXT\n )\n textCoordinates.to = pos;\n else if (\n urlCoordinates.from !== -1 &&\n urlCoordinates.to === -1 &&\n code === CODE_OF_END_LINK_URL\n )\n urlCoordinates.to = pos;\n }\n\n if (urlCoordinates.from === -1 || urlCoordinates.to === -1)\n return void getLinkLabelSelectionDecoration({ decorations, isReadonly, node, view });\n\n const text = content.substring(textCoordinates.from, textCoordinates.to);\n const url = content.substring(urlCoordinates.from, urlCoordinates.to);\n\n if (\n isReadonly ||\n !view.hasFocus ||\n !utils.isInRange(view.state.selection.ranges, [node.from, node.to])\n ) {\n decorations.push(\n utils.getReplaceDecoration({\n range: [node.from, node.to],\n widget: new LinkWidget(text, url, \"link\"),\n }),\n );\n }\n}\n\nexport const linkDecorationPlugin: DecorationPlugin = {\n selectionDecorations: [getLinkSelectionDecorations],\n};\n"],"names":["utils.isInRange","utils.getReplaceDecoration"],"mappings":";;;;;;AAYA,SAAS,2BAA2B,CAAC,EACnC,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,UAAU,GACoB,EAAA;AAC9B,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE;QAC9B;;AAGF,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;AAC9D,IAAA,MAAM,eAAe,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE;AAC5C,IAAA,MAAM,cAAc,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE;AAC3C,IAAA,IAAI,GAAG,GAAG,CAAC,CAAC;AAEZ,IAAA,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE;AAC3B,QAAA,GAAG,EAAE;QACL,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAEpC,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,KAAK,uBAAuB;AACjE,YAAA,eAAe,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC;AAC3B,aAAA,IACH,cAAc,CAAC,IAAI,KAAK,CAAC,CAAC;AAC1B,YAAA,eAAe,CAAC,EAAE,KAAK,CAAC,CAAC;AACzB,YAAA,IAAI,KAAK,sBAAsB;AAE/B,YAAA,cAAc,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC;AAC1B,aAAA,IACH,eAAe,CAAC,IAAI,KAAK,CAAC,CAAC;AAC3B,YAAA,eAAe,CAAC,EAAE,KAAK,CAAC,CAAC;AACzB,YAAA,IAAI,KAAK,qBAAqB;AAE9B,YAAA,eAAe,CAAC,EAAE,GAAG,GAAG;AACrB,aAAA,IACH,cAAc,CAAC,IAAI,KAAK,CAAC,CAAC;AAC1B,YAAA,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC;AACxB,YAAA,IAAI,KAAK,oBAAoB;AAE7B,YAAA,cAAc,CAAC,EAAE,GAAG,GAAG;;AAG3B,IAAA,IAAI,cAAc,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC;AACxD,QAAA,OAAO,KAAK,+BAA+B,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAEtF,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;AACxE,IAAA,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;AAErE,IAAA,IACE,UAAU;QACV,CAAC,IAAI,CAAC,QAAQ;QACd,CAACA,SAAe,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,EACnE;AACA,QAAA,WAAW,CAAC,IAAI,CACdC,oBAA0B,CAAC;YACzB,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,EAAE,IAAI,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC;AAC1C,SAAA,CAAC,CACH;;AAEL;AAEa,MAAA,oBAAoB,GAAqB;IACpD,oBAAoB,EAAE,CAAC,2BAA2B,CAAC;;;;;"}
@@ -0,0 +1,22 @@
1
+ import { getMarkDecoration, getHideDecoration } from '../../../lib/utils/get-decoration.js';
2
+ import { isInRange } from '../../../lib/utils/is-in-range.js';
3
+ import styles from '../styles.module.scss.js';
4
+ import { CODE_OF_LINK_LABEL_END } from './link-constants.js';
5
+
6
+ function getLinkLabelSelectionDecoration({ decorations, node, view, isReadonly, }) {
7
+ if (view.state.doc.sliceString(node.to, node.to + 1).charCodeAt(0) !== CODE_OF_LINK_LABEL_END)
8
+ return;
9
+ if (isReadonly ||
10
+ !view.hasFocus ||
11
+ !isInRange(view.state.selection.ranges, [node.from, node.to + 1])) {
12
+ decorations.push(getMarkDecoration({
13
+ range: [node.from, node.to + 1],
14
+ style: styles.link__label,
15
+ }));
16
+ decorations.push(getHideDecoration({ range: [node.from, node.from + 1] }));
17
+ decorations.push(getHideDecoration({ range: [node.to - 1, node.to + 1] }));
18
+ }
19
+ }
20
+
21
+ export { getLinkLabelSelectionDecoration };
22
+ //# sourceMappingURL=link-label-decoration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-label-decoration.js","sources":["../../../../../src/extensions/markdown/link/link-label-decoration.ts"],"sourcesContent":["import { utils } from \"@/lib\";\nimport { type GetSelectionDecorationOptions } from \"../markdown-types\";\nimport styles from \"../styles.module.scss\";\nimport { CODE_OF_LINK_LABEL_END } from \"./link-constants\";\n\nexport function getLinkLabelSelectionDecoration({\n decorations,\n node,\n view,\n isReadonly,\n}: GetSelectionDecorationOptions) {\n if (view.state.doc.sliceString(node.to, node.to + 1).charCodeAt(0) !== CODE_OF_LINK_LABEL_END)\n return;\n\n if (\n isReadonly ||\n !view.hasFocus ||\n !utils.isInRange(view.state.selection.ranges, [node.from, node.to + 1])\n ) {\n decorations.push(\n utils.getMarkDecoration({\n range: [node.from, node.to + 1],\n style: styles.link__label,\n }),\n );\n decorations.push(utils.getHideDecoration({ range: [node.from, node.from + 1] }));\n decorations.push(utils.getHideDecoration({ range: [node.to - 1, node.to + 1] }));\n }\n}\n"],"names":["utils.isInRange","utils.getMarkDecoration","utils.getHideDecoration"],"mappings":";;;;;AAKM,SAAU,+BAA+B,CAAC,EAC9C,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,UAAU,GACoB,EAAA;IAC9B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,sBAAsB;QAC3F;AAEF,IAAA,IACE,UAAU;QACV,CAAC,IAAI,CAAC,QAAQ;QACd,CAACA,SAAe,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EACvE;AACA,QAAA,WAAW,CAAC,IAAI,CACdC,iBAAuB,CAAC;YACtB,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAC/B,KAAK,EAAE,MAAM,CAAC,WAAW;AAC1B,SAAA,CAAC,CACH;QACD,WAAW,CAAC,IAAI,CAACC,iBAAuB,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QAChF,WAAW,CAAC,IAAI,CAACA,iBAAuB,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;;AAEpF;;;;"}