@krainovsd/markdown-editor 0.0.3 → 0.1.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.
- package/README.md +21 -1
- package/lib/cjs/index-Byjf17iv.js +501 -0
- package/lib/cjs/index-Byjf17iv.js.map +1 -0
- package/lib/cjs/index-lPo-3QDL.js +1374 -0
- package/lib/cjs/index-lPo-3QDL.js.map +1 -0
- package/lib/cjs/index.js +15 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/esm/extensions/compartments/index.js +8 -0
- package/lib/esm/extensions/compartments/index.js.map +1 -0
- package/lib/esm/extensions/init-extensions.js +45 -0
- package/lib/esm/extensions/init-extensions.js.map +1 -0
- package/lib/esm/extensions/keymaps/init-key-map.js +91 -0
- package/lib/esm/extensions/keymaps/init-key-map.js.map +1 -0
- package/lib/esm/extensions/listeners/get-change-event.js +14 -0
- package/lib/esm/extensions/listeners/get-change-event.js.map +1 -0
- package/lib/esm/extensions/listeners/get-focus-event.js +16 -0
- package/lib/esm/extensions/listeners/get-focus-event.js.map +1 -0
- package/lib/esm/extensions/listeners/init-listeners.js +9 -0
- package/lib/esm/extensions/listeners/init-listeners.js.map +1 -0
- package/lib/esm/extensions/markdown/blockquote/blockquote-constants.js +6 -0
- package/lib/esm/extensions/markdown/blockquote/blockquote-constants.js.map +1 -0
- package/lib/esm/extensions/markdown/blockquote/blockquote-decoration.js +99 -0
- package/lib/esm/extensions/markdown/blockquote/blockquote-decoration.js.map +1 -0
- package/lib/esm/extensions/markdown/blockquote/blockquote-widget.js +25 -0
- package/lib/esm/extensions/markdown/blockquote/blockquote-widget.js.map +1 -0
- package/lib/esm/extensions/markdown/bold/bold-constants.js +5 -0
- package/lib/esm/extensions/markdown/bold/bold-constants.js.map +1 -0
- package/lib/esm/extensions/markdown/bold/bold-decoration.js +41 -0
- package/lib/esm/extensions/markdown/bold/bold-decoration.js.map +1 -0
- package/lib/esm/extensions/markdown/code/code-constants.js +6 -0
- package/lib/esm/extensions/markdown/code/code-constants.js.map +1 -0
- package/lib/esm/extensions/markdown/code/code-decoration.js +109 -0
- package/lib/esm/extensions/markdown/code/code-decoration.js.map +1 -0
- package/lib/esm/extensions/markdown/code/code-widget.js +83 -0
- package/lib/esm/extensions/markdown/code/code-widget.js.map +1 -0
- package/lib/esm/extensions/markdown/header/header-constants.js +6 -0
- package/lib/esm/extensions/markdown/header/header-constants.js.map +1 -0
- package/lib/esm/extensions/markdown/header/header-decoration.js +64 -0
- package/lib/esm/extensions/markdown/header/header-decoration.js.map +1 -0
- package/lib/esm/extensions/markdown/horizontal/horizontal-constants.js +4 -0
- package/lib/esm/extensions/markdown/horizontal/horizontal-constants.js.map +1 -0
- package/lib/esm/extensions/markdown/horizontal/horizontal-decoration.js +31 -0
- package/lib/esm/extensions/markdown/horizontal/horizontal-decoration.js.map +1 -0
- package/lib/esm/extensions/markdown/image/image-constants.js +8 -0
- package/lib/esm/extensions/markdown/image/image-constants.js.map +1 -0
- package/lib/esm/extensions/markdown/image/image-decoration.js +75 -0
- package/lib/esm/extensions/markdown/image/image-decoration.js.map +1 -0
- package/lib/esm/extensions/markdown/image/image-widget.js +184 -0
- package/lib/esm/extensions/markdown/image/image-widget.js.map +1 -0
- package/lib/esm/extensions/markdown/index.js +2 -0
- package/lib/esm/extensions/markdown/index.js.map +1 -0
- package/lib/esm/extensions/markdown/init-markdown.js +18 -0
- package/lib/esm/extensions/markdown/init-markdown.js.map +1 -0
- package/lib/esm/extensions/markdown/italic/italic-constants.js +5 -0
- package/lib/esm/extensions/markdown/italic/italic-constants.js.map +1 -0
- package/lib/esm/extensions/markdown/italic/italic-decoration.js +77 -0
- package/lib/esm/extensions/markdown/italic/italic-decoration.js.map +1 -0
- package/lib/esm/extensions/markdown/link/auto-link-decoration.js +24 -0
- package/lib/esm/extensions/markdown/link/auto-link-decoration.js.map +1 -0
- package/lib/esm/extensions/markdown/link/link-constants.js +10 -0
- package/lib/esm/extensions/markdown/link/link-constants.js.map +1 -0
- package/lib/esm/extensions/markdown/link/link-decoration.js +51 -0
- package/lib/esm/extensions/markdown/link/link-decoration.js.map +1 -0
- package/lib/esm/extensions/markdown/link/link-label-decoration.js +22 -0
- package/lib/esm/extensions/markdown/link/link-label-decoration.js.map +1 -0
- package/lib/esm/extensions/markdown/link/link-widget.js +144 -0
- package/lib/esm/extensions/markdown/link/link-widget.js.map +1 -0
- package/lib/esm/extensions/markdown/list/list-constants.js +7 -0
- package/lib/esm/extensions/markdown/list/list-constants.js.map +1 -0
- package/lib/esm/extensions/markdown/list/list-decoration.js +38 -0
- package/lib/esm/extensions/markdown/list/list-decoration.js.map +1 -0
- package/lib/esm/extensions/markdown/list/list-widget.js +33 -0
- package/lib/esm/extensions/markdown/list/list-widget.js.map +1 -0
- package/lib/esm/extensions/markdown/markdown-decoration.js +105 -0
- package/lib/esm/extensions/markdown/markdown-decoration.js.map +1 -0
- package/lib/esm/extensions/markdown/markdown-parser.js +6 -0
- package/lib/esm/extensions/markdown/markdown-parser.js.map +1 -0
- package/lib/esm/extensions/markdown/mention/mention-constants.js +6 -0
- package/lib/esm/extensions/markdown/mention/mention-constants.js.map +1 -0
- package/lib/esm/extensions/markdown/mention/mention-decoration.js +37 -0
- package/lib/esm/extensions/markdown/mention/mention-decoration.js.map +1 -0
- package/lib/esm/extensions/markdown/mention/mention-parser.js +25 -0
- package/lib/esm/extensions/markdown/mention/mention-parser.js.map +1 -0
- package/lib/esm/extensions/markdown/strike-through/strike-through-constants.js +4 -0
- package/lib/esm/extensions/markdown/strike-through/strike-through-constants.js.map +1 -0
- package/lib/esm/extensions/markdown/strike-through/strike-through-decoration.js +32 -0
- package/lib/esm/extensions/markdown/strike-through/strike-through-decoration.js.map +1 -0
- package/lib/esm/extensions/markdown/styles.module.scss.js +8 -0
- package/lib/esm/extensions/markdown/styles.module.scss.js.map +1 -0
- package/lib/esm/extensions/markdown/todo/todo-constants.js +6 -0
- package/lib/esm/extensions/markdown/todo/todo-constants.js.map +1 -0
- package/lib/esm/extensions/markdown/todo/todo-decoration.js +35 -0
- package/lib/esm/extensions/markdown/todo/todo-decoration.js.map +1 -0
- package/lib/esm/extensions/markdown/todo/todo-widget.js +51 -0
- package/lib/esm/extensions/markdown/todo/todo-widget.js.map +1 -0
- package/lib/esm/extensions/settings/init-settings.js +19 -0
- package/lib/esm/extensions/settings/init-settings.js.map +1 -0
- package/lib/esm/extensions/theme/init-theme.js +15 -0
- package/lib/esm/extensions/theme/init-theme.js.map +1 -0
- package/lib/esm/extensions/theme/theme-constants.js +17 -0
- package/lib/esm/extensions/theme/theme-constants.js.map +1 -0
- package/lib/esm/extensions/theme/themes/get-dark-theme.js +40 -0
- package/lib/esm/extensions/theme/themes/get-dark-theme.js.map +1 -0
- package/lib/esm/extensions/theme/themes/get-highlight-template.js +35 -0
- package/lib/esm/extensions/theme/themes/get-highlight-template.js.map +1 -0
- package/lib/esm/extensions/theme/themes/get-light-theme.js +40 -0
- package/lib/esm/extensions/theme/themes/get-light-theme.js.map +1 -0
- package/lib/esm/extensions/theme/themes/get-theme-template.js +69 -0
- package/lib/esm/extensions/theme/themes/get-theme-template.js.map +1 -0
- package/lib/esm/index.js +1 -1
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/lib/utils/copy-to-clipboard.js +35 -0
- package/lib/esm/lib/utils/copy-to-clipboard.js.map +1 -0
- package/lib/esm/lib/utils/get-decoration.js +24 -0
- package/lib/esm/lib/utils/get-decoration.js.map +1 -0
- package/lib/esm/lib/utils/is-in-range.js +8 -0
- package/lib/esm/lib/utils/is-in-range.js.map +1 -0
- package/lib/esm/lib/utils/is-range-overlap.js +6 -0
- package/lib/esm/lib/utils/is-range-overlap.js.map +1 -0
- package/lib/esm/lib/utils/tick.js +22 -0
- package/lib/esm/lib/utils/tick.js.map +1 -0
- package/lib/esm/module/Editor/Editor.js +91 -0
- package/lib/esm/module/Editor/Editor.js.map +1 -0
- package/lib/esm/module/Editor/lib/init-editor-provider.js +32 -0
- package/lib/esm/module/Editor/lib/init-editor-provider.js.map +1 -0
- package/lib/esm/module/Editor/lib/init-editor-state.js +18 -0
- package/lib/esm/module/Editor/lib/init-editor-state.js.map +1 -0
- package/lib/esm/module/Editor/lib/init-editor.js +27 -0
- package/lib/esm/module/Editor/lib/init-editor.js.map +1 -0
- package/lib/esm/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js +29 -0
- package/lib/esm/node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js.map +1 -0
- package/lib/index.d.ts +137 -0
- package/package.json +32 -24
- package/lib/cjs/bundle.cjs +0 -2
- package/lib/cjs/bundle.cjs.map +0 -1
- package/tmp/app/helpers/common-test.d.ts +0 -1
- package/tmp/app/helpers/full-example.d.ts +0 -1
- package/tmp/app/helpers/index.d.ts +0 -5
- package/tmp/app/helpers/random-color.d.ts +0 -1
- package/tmp/app/helpers/random-string.d.ts +0 -1
- package/tmp/app/helpers/stress-test.d.ts +0 -1
- package/tmp/app/index.d.ts +0 -1
- package/tmp/extensions/compartments/index.d.ts +0 -4
- package/tmp/extensions/index.d.ts +0 -8
- package/tmp/extensions/init-extensions.d.ts +0 -14
- package/tmp/extensions/keymaps/bold-keymap.d.ts +0 -2
- package/tmp/extensions/keymaps/index.d.ts +0 -1
- package/tmp/extensions/keymaps/init-key-map.d.ts +0 -9
- package/tmp/extensions/keymaps/italic-key-map.d.ts +0 -2
- package/tmp/extensions/keymaps/line-through-key-map.d.ts +0 -2
- package/tmp/extensions/keymaps/underline-key-map.d.ts +0 -2
- package/tmp/extensions/listeners/get-change-event.d.ts +0 -6
- package/tmp/extensions/listeners/get-focus-event.d.ts +0 -8
- package/tmp/extensions/listeners/index.d.ts +0 -3
- package/tmp/extensions/listeners/init-listeners.d.ts +0 -4
- package/tmp/extensions/markdown/blockquote/blockquote-constants.d.ts +0 -3
- package/tmp/extensions/markdown/blockquote/blockquote-decoration.d.ts +0 -2
- package/tmp/extensions/markdown/blockquote/blockquote-widget.d.ts +0 -6
- package/tmp/extensions/markdown/blockquote/index.d.ts +0 -1
- package/tmp/extensions/markdown/bold/bold-constants.d.ts +0 -2
- package/tmp/extensions/markdown/bold/bold-decoration.d.ts +0 -2
- package/tmp/extensions/markdown/bold/index.d.ts +0 -1
- package/tmp/extensions/markdown/code/code-constants.d.ts +0 -3
- package/tmp/extensions/markdown/code/code-decoration.d.ts +0 -2
- package/tmp/extensions/markdown/code/code-widget.d.ts +0 -13
- package/tmp/extensions/markdown/code/index.d.ts +0 -1
- package/tmp/extensions/markdown/header/header-constants.d.ts +0 -3
- package/tmp/extensions/markdown/header/header-decoration.d.ts +0 -2
- package/tmp/extensions/markdown/header/index.d.ts +0 -1
- package/tmp/extensions/markdown/horizontal/horizontal-constants.d.ts +0 -1
- package/tmp/extensions/markdown/horizontal/horizontal-decoration.d.ts +0 -2
- package/tmp/extensions/markdown/horizontal/index.d.ts +0 -1
- package/tmp/extensions/markdown/image/image-constants.d.ts +0 -5
- package/tmp/extensions/markdown/image/image-decoration.d.ts +0 -2
- package/tmp/extensions/markdown/image/image-widget.d.ts +0 -15
- package/tmp/extensions/markdown/image/index.d.ts +0 -1
- package/tmp/extensions/markdown/index.d.ts +0 -2
- package/tmp/extensions/markdown/init-markdown.d.ts +0 -3
- package/tmp/extensions/markdown/italic/index.d.ts +0 -1
- package/tmp/extensions/markdown/italic/italic-constants.d.ts +0 -2
- package/tmp/extensions/markdown/italic/italic-decoration.d.ts +0 -2
- package/tmp/extensions/markdown/link/auto-link-decoration.d.ts +0 -2
- package/tmp/extensions/markdown/link/index.d.ts +0 -2
- package/tmp/extensions/markdown/link/link-constants.d.ts +0 -7
- package/tmp/extensions/markdown/link/link-decoration.d.ts +0 -2
- package/tmp/extensions/markdown/link/link-label-decoration.d.ts +0 -2
- package/tmp/extensions/markdown/link/link-widget.d.ts +0 -17
- package/tmp/extensions/markdown/list/index.d.ts +0 -1
- package/tmp/extensions/markdown/list/list-constants.d.ts +0 -4
- package/tmp/extensions/markdown/list/list-decoration.d.ts +0 -2
- package/tmp/extensions/markdown/list/list-widget.d.ts +0 -7
- package/tmp/extensions/markdown/markdown-decoration.d.ts +0 -5
- package/tmp/extensions/markdown/markdown-types.d.ts +0 -24
- package/tmp/extensions/markdown/mention/index.d.ts +0 -1
- package/tmp/extensions/markdown/mention/mention-constants.d.ts +0 -3
- package/tmp/extensions/markdown/mention/mention-decoration.d.ts +0 -2
- package/tmp/extensions/markdown/mention/mention-parser.d.ts +0 -2
- package/tmp/extensions/markdown/strike-through/index.d.ts +0 -1
- package/tmp/extensions/markdown/strike-through/strike-through-constants.d.ts +0 -1
- package/tmp/extensions/markdown/strike-through/strike-through-decoration.d.ts +0 -2
- package/tmp/extensions/markdown/todo/index.d.ts +0 -1
- package/tmp/extensions/markdown/todo/todo-constants.d.ts +0 -3
- package/tmp/extensions/markdown/todo/todo-decoration.d.ts +0 -2
- package/tmp/extensions/markdown/todo/todo-widget.d.ts +0 -11
- package/tmp/extensions/settings/index.d.ts +0 -1
- package/tmp/extensions/settings/init-settings.d.ts +0 -6
- package/tmp/extensions/theme/index.d.ts +0 -4
- package/tmp/extensions/theme/init-theme.d.ts +0 -3
- package/tmp/extensions/theme/theme-constants.d.ts +0 -14
- package/tmp/extensions/theme/theme-types.d.ts +0 -36
- package/tmp/extensions/theme/themes/get-dark-theme.d.ts +0 -2
- package/tmp/extensions/theme/themes/get-highlight-template.d.ts +0 -6
- package/tmp/extensions/theme/themes/get-light-theme.d.ts +0 -2
- package/tmp/extensions/theme/themes/get-theme-template.d.ts +0 -2
- package/tmp/extensions/theme/themes/index.d.ts +0 -2
- package/tmp/index.d.ts +0 -3
- package/tmp/lib/index.d.ts +0 -1
- package/tmp/lib/utils/copy-to-clipboard.d.ts +0 -1
- package/tmp/lib/utils/get-decoration.d.ts +0 -26
- package/tmp/lib/utils/index.d.ts +0 -5
- package/tmp/lib/utils/is-in-range.d.ts +0 -2
- package/tmp/lib/utils/is-range-overlap.d.ts +0 -1
- package/tmp/lib/utils/tick.d.ts +0 -10
- package/tmp/module/Editor/Editor.d.ts +0 -17
- package/tmp/module/Editor/Editor.types.d.ts +0 -13
- package/tmp/module/Editor/index.d.ts +0 -3
- package/tmp/module/Editor/lib/index.d.ts +0 -1
- package/tmp/module/Editor/lib/init-editor-provider.d.ts +0 -10
- package/tmp/module/Editor/lib/init-editor-state.d.ts +0 -7
- package/tmp/module/Editor/lib/init-editor.d.ts +0 -7
- 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":"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"}
|
|
@@ -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 @@
|
|
|
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;;;;"}
|