@dou-ui/editor 0.0.0-stage → 0.1.0-alpha.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/LICENSE +21 -0
- package/README.md +10 -2
- package/dist/catalog.js +18 -0
- package/dist/catalog.js.map +1 -0
- package/dist/code/code-editor-block.js +6 -0
- package/dist/code/code-editor-block.js.map +1 -0
- package/dist/code/code-editor-block.vue_vue_type_script_setup_true_lang.js +116 -0
- package/dist/code/code-editor-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/code/index.js +69 -0
- package/dist/code/index.js.map +1 -0
- package/dist/code/languages.js +51 -0
- package/dist/code/languages.js.map +1 -0
- package/dist/code/view.js +255 -0
- package/dist/code/view.js.map +1 -0
- package/dist/collaboration/binding.js +381 -0
- package/dist/collaboration/binding.js.map +1 -0
- package/dist/collaboration/cursors.js +150 -0
- package/dist/collaboration/cursors.js.map +1 -0
- package/dist/collaboration/index.js +108 -0
- package/dist/collaboration/index.js.map +1 -0
- package/dist/collaboration/order.js +88 -0
- package/dist/collaboration/order.js.map +1 -0
- package/dist/collaboration/table.js +234 -0
- package/dist/collaboration/table.js.map +1 -0
- package/dist/collaboration/text.js +91 -0
- package/dist/collaboration/text.js.map +1 -0
- package/dist/components/block-handle.js +6 -0
- package/dist/components/block-handle.js.map +1 -0
- package/dist/components/block-handle.vue_vue_type_script_setup_true_lang.js +474 -0
- package/dist/components/block-handle.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/bubble-toolbar.js +6 -0
- package/dist/components/bubble-toolbar.js.map +1 -0
- package/dist/components/bubble-toolbar.vue_vue_type_script_setup_true_lang.js +381 -0
- package/dist/components/bubble-toolbar.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/comment-button.js +6 -0
- package/dist/components/comment-button.js.map +1 -0
- package/dist/components/comment-button.vue_vue_type_script_setup_true_lang.js +83 -0
- package/dist/components/comment-button.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/comment-card.js +6 -0
- package/dist/components/comment-card.js.map +1 -0
- package/dist/components/comment-card.vue_vue_type_script_setup_true_lang.js +104 -0
- package/dist/components/comment-card.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/menu-escape.js +25 -0
- package/dist/components/menu-escape.js.map +1 -0
- package/dist/components/search-bar.js +6 -0
- package/dist/components/search-bar.js.map +1 -0
- package/dist/components/search-bar.vue_vue_type_script_setup_true_lang.js +192 -0
- package/dist/components/search-bar.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/slash-menu.js +6 -0
- package/dist/components/slash-menu.js.map +1 -0
- package/dist/components/slash-menu.vue_vue_type_script_setup_true_lang.js +164 -0
- package/dist/components/slash-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/core/align.js +94 -0
- package/dist/core/align.js.map +1 -0
- package/dist/core/block-selection.js +155 -0
- package/dist/core/block-selection.js.map +1 -0
- package/dist/core/blocks.js +132 -0
- package/dist/core/blocks.js.map +1 -0
- package/dist/core/changes.js +85 -0
- package/dist/core/changes.js.map +1 -0
- package/dist/core/colors.js +16 -0
- package/dist/core/colors.js.map +1 -0
- package/dist/core/commands.js +379 -0
- package/dist/core/commands.js.map +1 -0
- package/dist/core/comments.js +186 -0
- package/dist/core/comments.js.map +1 -0
- package/dist/core/compare.js +106 -0
- package/dist/core/compare.js.map +1 -0
- package/dist/core/convert.js +28 -0
- package/dist/core/convert.js.map +1 -0
- package/dist/core/diff.js +141 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/editor.js +138 -0
- package/dist/core/editor.js.map +1 -0
- package/dist/core/extension.js +99 -0
- package/dist/core/extension.js.map +1 -0
- package/dist/core/file-drop.js +56 -0
- package/dist/core/file-drop.js.map +1 -0
- package/dist/core/highlight.js +120 -0
- package/dist/core/highlight.js.map +1 -0
- package/dist/core/input-rules.js +61 -0
- package/dist/core/input-rules.js.map +1 -0
- package/dist/core/keymap.js +38 -0
- package/dist/core/keymap.js.map +1 -0
- package/dist/core/model.js +196 -0
- package/dist/core/model.js.map +1 -0
- package/dist/core/output.js +263 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/plugins.js +102 -0
- package/dist/core/plugins.js.map +1 -0
- package/dist/core/prepare.js +102 -0
- package/dist/core/prepare.js.map +1 -0
- package/dist/core/schema.js +158 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/search.js +197 -0
- package/dist/core/search.js.map +1 -0
- package/dist/core/selection.js +16 -0
- package/dist/core/selection.js.map +1 -0
- package/dist/core/slash.js +83 -0
- package/dist/core/slash.js.map +1 -0
- package/dist/core/transaction.js +311 -0
- package/dist/core/transaction.js.map +1 -0
- package/dist/define-block.js +177 -0
- package/dist/define-block.js.map +1 -0
- package/dist/document.js +157 -0
- package/dist/document.js.map +1 -0
- package/dist/dom.js +48 -0
- package/dist/dom.js.map +1 -0
- package/dist/editor.js +33 -0
- package/dist/editor.js.map +1 -0
- package/dist/editor.vue_vue_type_script_setup_true_lang.js +564 -0
- package/dist/editor.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/editor2.js +6 -0
- package/dist/editor2.js.map +1 -0
- package/dist/extensions/align/align-menu.js +6 -0
- package/dist/extensions/align/align-menu.js.map +1 -0
- package/dist/extensions/align/align-menu.vue_vue_type_script_setup_true_lang.js +82 -0
- package/dist/extensions/align/align-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/align/align-sub.js +6 -0
- package/dist/extensions/align/align-sub.js.map +1 -0
- package/dist/extensions/align/align-sub.vue_vue_type_script_setup_true_lang.js +57 -0
- package/dist/extensions/align/align-sub.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/align/commands.js +40 -0
- package/dist/extensions/align/commands.js.map +1 -0
- package/dist/extensions/align/index.js +27 -0
- package/dist/extensions/align/index.js.map +1 -0
- package/dist/extensions/attachment/attachment-block.js +6 -0
- package/dist/extensions/attachment/attachment-block.js.map +1 -0
- package/dist/extensions/attachment/attachment-block.vue_vue_type_script_setup_true_lang.js +119 -0
- package/dist/extensions/attachment/attachment-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/attachment/files.js +66 -0
- package/dist/extensions/attachment/files.js.map +1 -0
- package/dist/extensions/attachment/index.js +132 -0
- package/dist/extensions/attachment/index.js.map +1 -0
- package/dist/extensions/blocks.js +170 -0
- package/dist/extensions/blocks.js.map +1 -0
- package/dist/extensions/callout/callout-block.js +6 -0
- package/dist/extensions/callout/callout-block.js.map +1 -0
- package/dist/extensions/callout/callout-block.vue_vue_type_script_setup_true_lang.js +71 -0
- package/dist/extensions/callout/callout-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/callout/html.js +61 -0
- package/dist/extensions/callout/html.js.map +1 -0
- package/dist/extensions/callout/index.js +52 -0
- package/dist/extensions/callout/index.js.map +1 -0
- package/dist/extensions/callout/tones.js +12 -0
- package/dist/extensions/callout/tones.js.map +1 -0
- package/dist/extensions/code-block/code-block-view.js +6 -0
- package/dist/extensions/code-block/code-block-view.js.map +1 -0
- package/dist/extensions/code-block/code-block-view.vue_vue_type_script_setup_true_lang.js +87 -0
- package/dist/extensions/code-block/code-block-view.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/code-block/index.js +98 -0
- package/dist/extensions/code-block/index.js.map +1 -0
- package/dist/extensions/code-block/languages.js +116 -0
- package/dist/extensions/code-block/languages.js.map +1 -0
- package/dist/extensions/colors/color-menu.js +6 -0
- package/dist/extensions/colors/color-menu.js.map +1 -0
- package/dist/extensions/colors/color-menu.vue_vue_type_script_setup_true_lang.js +113 -0
- package/dist/extensions/colors/color-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/colors/index.js +49 -0
- package/dist/extensions/colors/index.js.map +1 -0
- package/dist/extensions/colors/palette.js +26 -0
- package/dist/extensions/colors/palette.js.map +1 -0
- package/dist/extensions/editor-kit.js +35 -0
- package/dist/extensions/editor-kit.js.map +1 -0
- package/dist/extensions/embed/embed-block.js +6 -0
- package/dist/extensions/embed/embed-block.js.map +1 -0
- package/dist/extensions/embed/embed-block.vue_vue_type_script_setup_true_lang.js +210 -0
- package/dist/extensions/embed/embed-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/embed/index.js +118 -0
- package/dist/extensions/embed/index.js.map +1 -0
- package/dist/extensions/embed/targets.js +79 -0
- package/dist/extensions/embed/targets.js.map +1 -0
- package/dist/extensions/formatting.js +153 -0
- package/dist/extensions/formatting.js.map +1 -0
- package/dist/extensions/image/image-block.js +6 -0
- package/dist/extensions/image/image-block.js.map +1 -0
- package/dist/extensions/image/image-block.vue_vue_type_script_setup_true_lang.js +206 -0
- package/dist/extensions/image/image-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/image/index.js +125 -0
- package/dist/extensions/image/index.js.map +1 -0
- package/dist/extensions/image/uploads.js +96 -0
- package/dist/extensions/image/uploads.js.map +1 -0
- package/dist/extensions/list-html.js +58 -0
- package/dist/extensions/list-html.js.map +1 -0
- package/dist/extensions/lists.js +182 -0
- package/dist/extensions/lists.js.map +1 -0
- package/dist/extensions/mention/index.js +56 -0
- package/dist/extensions/mention/index.js.map +1 -0
- package/dist/extensions/mention/mention-menu.js +6 -0
- package/dist/extensions/mention/mention-menu.js.map +1 -0
- package/dist/extensions/mention/mention-menu.vue_vue_type_script_setup_true_lang.js +132 -0
- package/dist/extensions/mention/mention-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/mention/state.js +113 -0
- package/dist/extensions/mention/state.js.map +1 -0
- package/dist/extensions/table/commands.js +356 -0
- package/dist/extensions/table/commands.js.map +1 -0
- package/dist/extensions/table/html.js +134 -0
- package/dist/extensions/table/html.js.map +1 -0
- package/dist/extensions/table/index.js +56 -0
- package/dist/extensions/table/index.js.map +1 -0
- package/dist/extensions/table/plugin.js +81 -0
- package/dist/extensions/table/plugin.js.map +1 -0
- package/dist/extensions/table/schema.js +258 -0
- package/dist/extensions/table/schema.js.map +1 -0
- package/dist/extensions/table/table-controls.js +6 -0
- package/dist/extensions/table/table-controls.js.map +1 -0
- package/dist/extensions/table/table-controls.vue_vue_type_script_setup_true_lang.js +698 -0
- package/dist/extensions/table/table-controls.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/extensions/table/view.js +19 -0
- package/dist/extensions/table/view.js.map +1 -0
- package/dist/extensions/toggle/index.js +87 -0
- package/dist/extensions/toggle/index.js.map +1 -0
- package/dist/extensions/toggle/state.js +120 -0
- package/dist/extensions/toggle/state.js.map +1 -0
- package/dist/extensions/toggle/toggle-block.js +6 -0
- package/dist/extensions/toggle/toggle-block.js.map +1 -0
- package/dist/extensions/toggle/toggle-block.vue_vue_type_script_setup_true_lang.js +42 -0
- package/dist/extensions/toggle/toggle-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/locale.js +522 -0
- package/dist/locale.js.map +1 -0
- package/dist/markdown/index.js +24 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/style.css +1 -0
- package/dist/style.d.ts +1 -0
- package/dist/style.js +8 -0
- package/dist/types/catalog.d.ts +8 -0
- package/dist/types/code/code-editor-block.vue.d.ts +17 -0
- package/dist/types/code/index.d.ts +18 -0
- package/dist/types/code/languages.d.ts +7 -0
- package/dist/types/code/types.d.ts +37 -0
- package/dist/types/code/view.d.ts +12 -0
- package/dist/types/collaboration/binding.d.ts +32 -0
- package/dist/types/collaboration/cursors.d.ts +26 -0
- package/dist/types/collaboration/index.d.ts +47 -0
- package/dist/types/collaboration/order.d.ts +20 -0
- package/dist/types/collaboration/table.d.ts +25 -0
- package/dist/types/collaboration/text.d.ts +9 -0
- package/dist/types/components/block-handle.vue.d.ts +3 -0
- package/dist/types/components/bubble-toolbar.vue.d.ts +7 -0
- package/dist/types/components/comment-button.vue.d.ts +3 -0
- package/dist/types/components/comment-card.vue.d.ts +3 -0
- package/dist/types/components/menu-escape.d.ts +7 -0
- package/dist/types/components/search-bar.vue.d.ts +22 -0
- package/dist/types/components/slash-menu.vue.d.ts +11 -0
- package/dist/types/core/align.d.ts +16 -0
- package/dist/types/core/block-selection.d.ts +22 -0
- package/dist/types/core/blocks.d.ts +52 -0
- package/dist/types/core/changes.d.ts +14 -0
- package/dist/types/core/colors.d.ts +4 -0
- package/dist/types/core/commands.d.ts +61 -0
- package/dist/types/core/comments.d.ts +44 -0
- package/dist/types/core/compare.d.ts +10 -0
- package/dist/types/core/convert.d.ts +12 -0
- package/dist/types/core/diff.d.ts +49 -0
- package/dist/types/core/editor.d.ts +64 -0
- package/dist/types/core/extension.d.ts +167 -0
- package/dist/types/core/file-drop.d.ts +19 -0
- package/dist/types/core/highlight.d.ts +32 -0
- package/dist/types/core/input-rules.d.ts +21 -0
- package/dist/types/core/keymap.d.ts +8 -0
- package/dist/types/core/model.d.ts +158 -0
- package/dist/types/core/output.d.ts +64 -0
- package/dist/types/core/plugins.d.ts +24 -0
- package/dist/types/core/prepare.d.ts +23 -0
- package/dist/types/core/schema.d.ts +38 -0
- package/dist/types/core/search.d.ts +83 -0
- package/dist/types/core/selection.d.ts +8 -0
- package/dist/types/core/slash.d.ts +21 -0
- package/dist/types/core/transaction.d.ts +97 -0
- package/dist/types/define-block.d.ts +66 -0
- package/dist/types/document.d.ts +46 -0
- package/dist/types/dom.d.ts +17 -0
- package/dist/types/editor.d.ts +252 -0
- package/dist/types/editor.vue.d.ts +210 -0
- package/dist/types/extensions/align/align-menu.vue.d.ts +3 -0
- package/dist/types/extensions/align/align-sub.vue.d.ts +7 -0
- package/dist/types/extensions/align/commands.d.ts +13 -0
- package/dist/types/extensions/align/index.d.ts +7 -0
- package/dist/types/extensions/attachment/attachment-block.vue.d.ts +17 -0
- package/dist/types/extensions/attachment/files.d.ts +6 -0
- package/dist/types/extensions/attachment/index.d.ts +20 -0
- package/dist/types/extensions/blocks.d.ts +8 -0
- package/dist/types/extensions/callout/callout-block.vue.d.ts +14 -0
- package/dist/types/extensions/callout/html.d.ts +4 -0
- package/dist/types/extensions/callout/index.d.ts +3 -0
- package/dist/types/extensions/callout/tones.d.ts +8 -0
- package/dist/types/extensions/code-block/code-block-view.vue.d.ts +16 -0
- package/dist/types/extensions/code-block/index.d.ts +19 -0
- package/dist/types/extensions/code-block/languages.d.ts +9 -0
- package/dist/types/extensions/colors/color-menu.vue.d.ts +3 -0
- package/dist/types/extensions/colors/index.d.ts +7 -0
- package/dist/types/extensions/colors/palette.d.ts +7 -0
- package/dist/types/extensions/editor-kit.d.ts +37 -0
- package/dist/types/extensions/embed/embed-block.vue.d.ts +16 -0
- package/dist/types/extensions/embed/index.d.ts +18 -0
- package/dist/types/extensions/embed/targets.d.ts +32 -0
- package/dist/types/extensions/formatting.d.ts +8 -0
- package/dist/types/extensions/image/image-block.vue.d.ts +16 -0
- package/dist/types/extensions/image/index.d.ts +16 -0
- package/dist/types/extensions/image/uploads.d.ts +35 -0
- package/dist/types/extensions/list-html.d.ts +11 -0
- package/dist/types/extensions/lists.d.ts +6 -0
- package/dist/types/extensions/mention/index.d.ts +11 -0
- package/dist/types/extensions/mention/mention-menu.vue.d.ts +7 -0
- package/dist/types/extensions/mention/state.d.ts +28 -0
- package/dist/types/extensions/table/commands.d.ts +69 -0
- package/dist/types/extensions/table/html.d.ts +4 -0
- package/dist/types/extensions/table/index.d.ts +8 -0
- package/dist/types/extensions/table/plugin.d.ts +4 -0
- package/dist/types/extensions/table/schema.d.ts +23 -0
- package/dist/types/extensions/table/table-controls.vue.d.ts +3 -0
- package/dist/types/extensions/table/view.d.ts +13 -0
- package/dist/types/extensions/toggle/index.d.ts +7 -0
- package/dist/types/extensions/toggle/state.d.ts +17 -0
- package/dist/types/extensions/toggle/toggle-block.vue.d.ts +14 -0
- package/dist/types/index.d.ts +266 -0
- package/dist/types/locale.d.ts +195 -0
- package/dist/types/markdown/index.d.ts +14 -0
- package/dist/types/use-comments.d.ts +17 -0
- package/dist/use-comments.js +141 -0
- package/dist/use-comments.js.map +1 -0
- package/package.json +98 -4
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import type { EditorContent } from './define-block';
|
|
2
|
+
export declare const DouEditor: import("dou-ui").WithInstall<import("vue").DefineComponent<import("./editor").EditorProps, import("./editor").EditorExpose, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
3
|
+
blur: (event: FocusEvent) => any;
|
|
4
|
+
change: (document: import("./index.js").EditorDocument<import("./index.js").Block>) => any;
|
|
5
|
+
focus: (event: FocusEvent) => any;
|
|
6
|
+
"update:modelValue": (document: import("./index.js").EditorDocument<import("./index.js").Block>) => any;
|
|
7
|
+
transaction: (result: import("./editor").EditorTransactionResult) => any;
|
|
8
|
+
"update:selection": (selection: import("./editor").EditorSelection) => any;
|
|
9
|
+
linkOpen: (event: import("./editor").EditorLinkOpenEvent) => any;
|
|
10
|
+
"update:comments": (threads: import("dou-ui").CommentThread[]) => any;
|
|
11
|
+
"update:activeComment": (id: string | null) => any;
|
|
12
|
+
commentAction: (action: import("dou-ui").CommentAction) => any;
|
|
13
|
+
}, string, import("vue").PublicProps, Readonly<import("./editor").EditorProps> & Readonly<{
|
|
14
|
+
onBlur?: ((event: FocusEvent) => any) | undefined;
|
|
15
|
+
onChange?: ((document: import("./index.js").EditorDocument<import("./index.js").Block>) => any) | undefined;
|
|
16
|
+
onFocus?: ((event: FocusEvent) => any) | undefined;
|
|
17
|
+
"onUpdate:modelValue"?: ((document: import("./index.js").EditorDocument<import("./index.js").Block>) => any) | undefined;
|
|
18
|
+
onTransaction?: ((result: import("./editor").EditorTransactionResult) => any) | undefined;
|
|
19
|
+
"onUpdate:selection"?: ((selection: import("./editor").EditorSelection) => any) | undefined;
|
|
20
|
+
onLinkOpen?: ((event: import("./editor").EditorLinkOpenEvent) => any) | undefined;
|
|
21
|
+
"onUpdate:comments"?: ((threads: import("dou-ui").CommentThread[]) => any) | undefined;
|
|
22
|
+
"onUpdate:activeComment"?: ((id: string | null) => any) | undefined;
|
|
23
|
+
onCommentAction?: ((action: import("dou-ui").CommentAction) => any) | undefined;
|
|
24
|
+
}>, {
|
|
25
|
+
placeholder: string;
|
|
26
|
+
comments: import("dou-ui").CommentThread[];
|
|
27
|
+
selection: import("./editor").EditorSelection;
|
|
28
|
+
undo: import("prosemirror-state").Command;
|
|
29
|
+
redo: import("prosemirror-state").Command;
|
|
30
|
+
plugins: import("prosemirror-state").Plugin<any>[];
|
|
31
|
+
history: boolean;
|
|
32
|
+
messages: {
|
|
33
|
+
placeholder?: string | undefined;
|
|
34
|
+
emptyPlaceholder?: string | undefined;
|
|
35
|
+
headingPlaceholder?: string | undefined;
|
|
36
|
+
types?: {
|
|
37
|
+
paragraph?: string | undefined;
|
|
38
|
+
heading1?: string | undefined;
|
|
39
|
+
heading2?: string | undefined;
|
|
40
|
+
heading3?: string | undefined;
|
|
41
|
+
bulletItem?: string | undefined;
|
|
42
|
+
numberedItem?: string | undefined;
|
|
43
|
+
checkItem?: string | undefined;
|
|
44
|
+
quote?: string | undefined;
|
|
45
|
+
codeBlock?: string | undefined;
|
|
46
|
+
divider?: string | undefined;
|
|
47
|
+
image?: string | undefined;
|
|
48
|
+
toggle?: string | undefined;
|
|
49
|
+
callout?: string | undefined;
|
|
50
|
+
table?: string | undefined;
|
|
51
|
+
attachment?: string | undefined;
|
|
52
|
+
embed?: string | undefined;
|
|
53
|
+
} | undefined;
|
|
54
|
+
hints?: {
|
|
55
|
+
paragraph?: string | undefined;
|
|
56
|
+
heading1?: string | undefined;
|
|
57
|
+
heading2?: string | undefined;
|
|
58
|
+
heading3?: string | undefined;
|
|
59
|
+
bulletItem?: string | undefined;
|
|
60
|
+
numberedItem?: string | undefined;
|
|
61
|
+
checkItem?: string | undefined;
|
|
62
|
+
quote?: string | undefined;
|
|
63
|
+
codeBlock?: string | undefined;
|
|
64
|
+
divider?: string | undefined;
|
|
65
|
+
image?: string | undefined;
|
|
66
|
+
toggle?: string | undefined;
|
|
67
|
+
callout?: string | undefined;
|
|
68
|
+
table?: string | undefined;
|
|
69
|
+
attachment?: string | undefined;
|
|
70
|
+
embed?: string | undefined;
|
|
71
|
+
} | undefined;
|
|
72
|
+
image?: {
|
|
73
|
+
empty?: string | undefined;
|
|
74
|
+
upload?: string | undefined;
|
|
75
|
+
embed?: string | undefined;
|
|
76
|
+
urlPlaceholder?: string | undefined;
|
|
77
|
+
apply?: string | undefined;
|
|
78
|
+
uploading?: string | undefined;
|
|
79
|
+
failed?: string | undefined;
|
|
80
|
+
caption?: string | undefined;
|
|
81
|
+
resize?: string | undefined;
|
|
82
|
+
} | undefined;
|
|
83
|
+
codeBlock?: {
|
|
84
|
+
language?: string | undefined;
|
|
85
|
+
plainText?: string | undefined;
|
|
86
|
+
} | undefined;
|
|
87
|
+
toggle?: {
|
|
88
|
+
expand?: string | undefined;
|
|
89
|
+
collapse?: string | undefined;
|
|
90
|
+
} | undefined;
|
|
91
|
+
callout?: {
|
|
92
|
+
change?: string | undefined;
|
|
93
|
+
tones?: {
|
|
94
|
+
info?: string | undefined;
|
|
95
|
+
tip?: string | undefined;
|
|
96
|
+
warning?: string | undefined;
|
|
97
|
+
danger?: string | undefined;
|
|
98
|
+
} | undefined;
|
|
99
|
+
} | undefined;
|
|
100
|
+
mention?: {
|
|
101
|
+
label?: string | undefined;
|
|
102
|
+
searching?: string | undefined;
|
|
103
|
+
noResults?: string | undefined;
|
|
104
|
+
} | undefined;
|
|
105
|
+
table?: {
|
|
106
|
+
row?: string | undefined;
|
|
107
|
+
column?: string | undefined;
|
|
108
|
+
insertAbove?: string | undefined;
|
|
109
|
+
insertBelow?: string | undefined;
|
|
110
|
+
insertLeft?: string | undefined;
|
|
111
|
+
insertRight?: string | undefined;
|
|
112
|
+
moveUp?: string | undefined;
|
|
113
|
+
moveDown?: string | undefined;
|
|
114
|
+
moveLeft?: string | undefined;
|
|
115
|
+
moveRight?: string | undefined;
|
|
116
|
+
deleteRow?: string | undefined;
|
|
117
|
+
deleteColumn?: string | undefined;
|
|
118
|
+
merge?: string | undefined;
|
|
119
|
+
split?: string | undefined;
|
|
120
|
+
clear?: string | undefined;
|
|
121
|
+
headerRow?: string | undefined;
|
|
122
|
+
headerColumn?: string | undefined;
|
|
123
|
+
alignLeft?: string | undefined;
|
|
124
|
+
alignCenter?: string | undefined;
|
|
125
|
+
alignRight?: string | undefined;
|
|
126
|
+
addRow?: string | undefined;
|
|
127
|
+
addColumn?: string | undefined;
|
|
128
|
+
} | undefined;
|
|
129
|
+
colors?: {
|
|
130
|
+
label?: string | undefined;
|
|
131
|
+
text?: string | undefined;
|
|
132
|
+
background?: string | undefined;
|
|
133
|
+
none?: string | undefined;
|
|
134
|
+
names?: {
|
|
135
|
+
gray?: string | undefined;
|
|
136
|
+
red?: string | undefined;
|
|
137
|
+
orange?: string | undefined;
|
|
138
|
+
yellow?: string | undefined;
|
|
139
|
+
green?: string | undefined;
|
|
140
|
+
blue?: string | undefined;
|
|
141
|
+
purple?: string | undefined;
|
|
142
|
+
pink?: string | undefined;
|
|
143
|
+
} | undefined;
|
|
144
|
+
} | undefined;
|
|
145
|
+
align?: {
|
|
146
|
+
label?: string | undefined;
|
|
147
|
+
left?: string | undefined;
|
|
148
|
+
center?: string | undefined;
|
|
149
|
+
right?: string | undefined;
|
|
150
|
+
} | undefined;
|
|
151
|
+
attachment?: {
|
|
152
|
+
empty?: string | undefined;
|
|
153
|
+
upload?: string | undefined;
|
|
154
|
+
uploading?: string | undefined;
|
|
155
|
+
failed?: string | undefined;
|
|
156
|
+
retry?: string | undefined;
|
|
157
|
+
download?: string | undefined;
|
|
158
|
+
} | undefined;
|
|
159
|
+
embed?: {
|
|
160
|
+
empty?: string | undefined;
|
|
161
|
+
urlPlaceholder?: string | undefined;
|
|
162
|
+
apply?: string | undefined;
|
|
163
|
+
invalid?: string | undefined;
|
|
164
|
+
insecure?: string | undefined;
|
|
165
|
+
caption?: string | undefined;
|
|
166
|
+
edit?: string | undefined;
|
|
167
|
+
cancel?: string | undefined;
|
|
168
|
+
} | undefined;
|
|
169
|
+
noResults?: string | undefined;
|
|
170
|
+
addBlock?: string | undefined;
|
|
171
|
+
dragHandle?: string | undefined;
|
|
172
|
+
turnInto?: string | undefined;
|
|
173
|
+
duplicate?: string | undefined;
|
|
174
|
+
delete?: string | undefined;
|
|
175
|
+
moveUp?: string | undefined;
|
|
176
|
+
moveDown?: string | undefined;
|
|
177
|
+
bold?: string | undefined;
|
|
178
|
+
italic?: string | undefined;
|
|
179
|
+
underline?: string | undefined;
|
|
180
|
+
strike?: string | undefined;
|
|
181
|
+
code?: string | undefined;
|
|
182
|
+
link?: string | undefined;
|
|
183
|
+
linkPlaceholder?: string | undefined;
|
|
184
|
+
applyLink?: string | undefined;
|
|
185
|
+
removeLink?: string | undefined;
|
|
186
|
+
comment?: string | undefined;
|
|
187
|
+
commentThread?: string | undefined;
|
|
188
|
+
removedBlock?: string | undefined;
|
|
189
|
+
restored?: string | undefined;
|
|
190
|
+
changeAdded?: string | undefined;
|
|
191
|
+
changeRemoved?: string | undefined;
|
|
192
|
+
changeChanged?: string | undefined;
|
|
193
|
+
formatting?: string | undefined;
|
|
194
|
+
blockTypes?: string | undefined;
|
|
195
|
+
};
|
|
196
|
+
autofocus: boolean;
|
|
197
|
+
modelValue: import("./index.js").EditorDocument<import("./index.js").PartialBlock>;
|
|
198
|
+
readonly: boolean;
|
|
199
|
+
author: import("dou-ui").CommentAuthor;
|
|
200
|
+
compare: import("./index.js").EditorDocument<import("./index.js").PartialBlock> | null;
|
|
201
|
+
extensions: (import("./index.js").EditorExtension | import("./index.js").EditorExtension[])[];
|
|
202
|
+
searchable: boolean;
|
|
203
|
+
ariaLabel: string;
|
|
204
|
+
activeComment: string | null;
|
|
205
|
+
commentable: boolean;
|
|
206
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, import("vue").HTMLAttributes>;
|
|
207
|
+
export default DouEditor;
|
|
208
|
+
export { useEditor, useToolbarMenu } from './editor';
|
|
209
|
+
export type { EditorComments, EditorContext, EditorEmits, EditorExpose, EditorLinkOpenEvent, EditorProps, EditorOrigin, EditorSelection, EditorTransactionResult, } from './editor';
|
|
210
|
+
export { EditorTransaction } from './core/transaction';
|
|
211
|
+
export type { BlockEdge, BlockPatch, BlockPlacement, EditorTransactionMeta, } from './core/transaction';
|
|
212
|
+
export type { BlockChanges } from './core/changes';
|
|
213
|
+
export type { CommentAnchor, CommentRange } from './core/comments';
|
|
214
|
+
export { editorLocales, useEditorMessages } from './locale';
|
|
215
|
+
export type { EditorMessages, EditorMessagesOverride } from './locale';
|
|
216
|
+
export { filterOptions } from './catalog';
|
|
217
|
+
export { defineEditorExtension, labelOf } from './core/extension';
|
|
218
|
+
export type { BlockOption, CommentsProvider, EditorExtension, EditorExtensionContext, FormatOption, HistoryProvider, Label, MountComponent, ResolvedEditorExtensions, } from './core/extension';
|
|
219
|
+
export { align, callout, codeBlock, colors, divider, formatting, heading, link, lists, paragraph, quote, editorKit, table, toggle, } from './extensions/editor-kit';
|
|
220
|
+
export type { CalloutTone } from './extensions/callout';
|
|
221
|
+
export { setHighlight, setTextColor, textColors } from './extensions/colors';
|
|
222
|
+
export type { TextColor } from './extensions/colors';
|
|
223
|
+
export { currentAlign, setAlign } from './extensions/align';
|
|
224
|
+
export { alignable } from './core/align';
|
|
225
|
+
export type { BlockAlign } from './core/align';
|
|
226
|
+
export { attachment, formatFileSize, isSafeFileSrc } from './extensions/attachment';
|
|
227
|
+
export type { AttachmentOptions } from './extensions/attachment';
|
|
228
|
+
export { embed, resolveEmbed } from './extensions/embed';
|
|
229
|
+
export type { EmbedOptions, EmbedResolver, EmbedTarget } from './extensions/embed';
|
|
230
|
+
export { alignColumns, clearCells, deleteColumns, deleteRows, insertColumn, insertRow, mergeCells, moveLines, moveLinesTo, splitMergedCell, toggleHeader, } from './extensions/table';
|
|
231
|
+
export type { TableAlign, TableColumn } from './extensions/table';
|
|
232
|
+
export type { EditorKitOptions } from './extensions/editor-kit';
|
|
233
|
+
export { componentMounter, defineBlock, EditorContent, vueNodeView } from './define-block';
|
|
234
|
+
export { historyCommands } from './core/editor';
|
|
235
|
+
export { defaultLanguages } from './extensions/code-block';
|
|
236
|
+
export type { CodeBlockOptions, CodeHighlighter, CodeLanguage } from './extensions/code-block';
|
|
237
|
+
export { image, isSafeImageSrc, readAsDataUrl } from './extensions/image';
|
|
238
|
+
export { mention } from './extensions/mention';
|
|
239
|
+
export type { MentionItem, MentionOptions } from './extensions/mention';
|
|
240
|
+
export type { FileUploader, ImageOptions } from './extensions/image';
|
|
241
|
+
export type { BlockViewProps, DefineBlockOptions } from './define-block';
|
|
242
|
+
export { atomInputRule, blockInputRule, markInputRule } from './core/input-rules';
|
|
243
|
+
export type { Block, BlockProps, BreakContent, EditorDocument, InlineContent, InlineNodeContent, PartialBlock, PartialTableCell, PartialTableRow, RowsSpec, TableCell, TableRow, TextContent, } from './core/model';
|
|
244
|
+
export { blocksToDoc, createId, docToBlocks } from './core/model';
|
|
245
|
+
export { diffBlocks, diffText, inlineText } from './core/diff';
|
|
246
|
+
export type { BlockVersionChange, BlocksDiff, TextPart } from './core/diff';
|
|
247
|
+
export { searchDoc } from './core/search';
|
|
248
|
+
export type { EditorMatch, EditorSearchQuery } from './core/search';
|
|
249
|
+
export { checkDocument, emptyDocument, migrateDocument } from './document';
|
|
250
|
+
export type { CheckDocumentOptions, DocumentProblem } from './document';
|
|
251
|
+
export type { BuiltinContentType, ContentType, MarkType } from './core/schema';
|
|
252
|
+
export { contentDOM, createSchema, isSafeHref, textBlock } from './core/schema';
|
|
253
|
+
export { duplicateBlocks, insertBlockAfter, liftBlocks, swapBlocks, moveRangeTo, setBlockType, sinkBlocks, } from './core/commands';
|
|
254
|
+
export { clearBlockSelection, getBlockSelection, selectBlocks } from './core/block-selection';
|
|
255
|
+
export { isRemote } from './core/plugins';
|
|
256
|
+
export { blocksToHTML, htmlToBlocks } from './core/convert';
|
|
257
|
+
export type { EditorExtensionList } from './core/convert';
|
|
258
|
+
export { escapeHTML, escapeMarkdown, indentLines } from './core/output';
|
|
259
|
+
export type { BlockOutput, BlockOutputContext, EditorExtensionOutput, InlineOutput, MarkdownBlockContext, MarkOutput, } from './core/output';
|
|
260
|
+
export { blockElement, splitContainer } from './core/prepare';
|
|
261
|
+
declare module 'vue' {
|
|
262
|
+
interface GlobalComponents {
|
|
263
|
+
DouEditor: typeof DouEditor;
|
|
264
|
+
DouEditorContent: typeof EditorContent;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { type MaybeRefOrGetter } from 'vue';
|
|
2
|
+
export interface EditorMessages {
|
|
3
|
+
placeholder: string;
|
|
4
|
+
emptyPlaceholder: string;
|
|
5
|
+
headingPlaceholder: string;
|
|
6
|
+
/** Names of the block types, also shown in menus. */
|
|
7
|
+
types: {
|
|
8
|
+
paragraph: string;
|
|
9
|
+
heading1: string;
|
|
10
|
+
heading2: string;
|
|
11
|
+
heading3: string;
|
|
12
|
+
bulletItem: string;
|
|
13
|
+
numberedItem: string;
|
|
14
|
+
checkItem: string;
|
|
15
|
+
quote: string;
|
|
16
|
+
codeBlock: string;
|
|
17
|
+
divider: string;
|
|
18
|
+
image: string;
|
|
19
|
+
toggle: string;
|
|
20
|
+
callout: string;
|
|
21
|
+
table: string;
|
|
22
|
+
attachment: string;
|
|
23
|
+
embed: string;
|
|
24
|
+
};
|
|
25
|
+
/** Short descriptions in the slash menu. */
|
|
26
|
+
hints: {
|
|
27
|
+
paragraph: string;
|
|
28
|
+
heading1: string;
|
|
29
|
+
heading2: string;
|
|
30
|
+
heading3: string;
|
|
31
|
+
bulletItem: string;
|
|
32
|
+
numberedItem: string;
|
|
33
|
+
checkItem: string;
|
|
34
|
+
quote: string;
|
|
35
|
+
codeBlock: string;
|
|
36
|
+
divider: string;
|
|
37
|
+
image: string;
|
|
38
|
+
toggle: string;
|
|
39
|
+
callout: string;
|
|
40
|
+
table: string;
|
|
41
|
+
attachment: string;
|
|
42
|
+
embed: string;
|
|
43
|
+
};
|
|
44
|
+
/** The image block. */
|
|
45
|
+
image: {
|
|
46
|
+
empty: string;
|
|
47
|
+
upload: string;
|
|
48
|
+
embed: string;
|
|
49
|
+
urlPlaceholder: string;
|
|
50
|
+
apply: string;
|
|
51
|
+
uploading: string;
|
|
52
|
+
failed: string;
|
|
53
|
+
caption: string;
|
|
54
|
+
resize: string;
|
|
55
|
+
};
|
|
56
|
+
/** The code block. */
|
|
57
|
+
codeBlock: {
|
|
58
|
+
/** The language picker's name. */
|
|
59
|
+
language: string;
|
|
60
|
+
plainText: string;
|
|
61
|
+
};
|
|
62
|
+
toggle: {
|
|
63
|
+
expand: string;
|
|
64
|
+
collapse: string;
|
|
65
|
+
};
|
|
66
|
+
callout: {
|
|
67
|
+
/** Said after the tone on the icon button. */
|
|
68
|
+
change: string;
|
|
69
|
+
tones: {
|
|
70
|
+
info: string;
|
|
71
|
+
tip: string;
|
|
72
|
+
warning: string;
|
|
73
|
+
danger: string;
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
mention: {
|
|
77
|
+
label: string;
|
|
78
|
+
searching: string;
|
|
79
|
+
noResults: string;
|
|
80
|
+
};
|
|
81
|
+
/** The table: its row and column menus. */
|
|
82
|
+
table: {
|
|
83
|
+
row: string;
|
|
84
|
+
column: string;
|
|
85
|
+
insertAbove: string;
|
|
86
|
+
insertBelow: string;
|
|
87
|
+
insertLeft: string;
|
|
88
|
+
insertRight: string;
|
|
89
|
+
moveUp: string;
|
|
90
|
+
moveDown: string;
|
|
91
|
+
moveLeft: string;
|
|
92
|
+
moveRight: string;
|
|
93
|
+
deleteRow: string;
|
|
94
|
+
deleteColumn: string;
|
|
95
|
+
merge: string;
|
|
96
|
+
split: string;
|
|
97
|
+
clear: string;
|
|
98
|
+
headerRow: string;
|
|
99
|
+
headerColumn: string;
|
|
100
|
+
alignLeft: string;
|
|
101
|
+
alignCenter: string;
|
|
102
|
+
alignRight: string;
|
|
103
|
+
addRow: string;
|
|
104
|
+
addColumn: string;
|
|
105
|
+
};
|
|
106
|
+
/** The color menu of the formatting toolbar. */
|
|
107
|
+
colors: {
|
|
108
|
+
label: string;
|
|
109
|
+
text: string;
|
|
110
|
+
background: string;
|
|
111
|
+
none: string;
|
|
112
|
+
names: {
|
|
113
|
+
gray: string;
|
|
114
|
+
red: string;
|
|
115
|
+
orange: string;
|
|
116
|
+
yellow: string;
|
|
117
|
+
green: string;
|
|
118
|
+
blue: string;
|
|
119
|
+
purple: string;
|
|
120
|
+
pink: string;
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
/** Aligning paragraphs, headings and quotes. */
|
|
124
|
+
align: {
|
|
125
|
+
label: string;
|
|
126
|
+
left: string;
|
|
127
|
+
center: string;
|
|
128
|
+
right: string;
|
|
129
|
+
};
|
|
130
|
+
/** The attachment block. */
|
|
131
|
+
attachment: {
|
|
132
|
+
empty: string;
|
|
133
|
+
upload: string;
|
|
134
|
+
uploading: string;
|
|
135
|
+
failed: string;
|
|
136
|
+
retry: string;
|
|
137
|
+
download: string;
|
|
138
|
+
};
|
|
139
|
+
/** The embed block. */
|
|
140
|
+
embed: {
|
|
141
|
+
empty: string;
|
|
142
|
+
urlPlaceholder: string;
|
|
143
|
+
apply: string;
|
|
144
|
+
invalid: string;
|
|
145
|
+
/** The link is not https. */
|
|
146
|
+
insecure: string;
|
|
147
|
+
caption: string;
|
|
148
|
+
edit: string;
|
|
149
|
+
cancel: string;
|
|
150
|
+
};
|
|
151
|
+
noResults: string;
|
|
152
|
+
addBlock: string;
|
|
153
|
+
dragHandle: string;
|
|
154
|
+
turnInto: string;
|
|
155
|
+
duplicate: string;
|
|
156
|
+
delete: string;
|
|
157
|
+
moveUp: string;
|
|
158
|
+
moveDown: string;
|
|
159
|
+
bold: string;
|
|
160
|
+
italic: string;
|
|
161
|
+
underline: string;
|
|
162
|
+
strike: string;
|
|
163
|
+
code: string;
|
|
164
|
+
link: string;
|
|
165
|
+
linkPlaceholder: string;
|
|
166
|
+
applyLink: string;
|
|
167
|
+
removeLink: string;
|
|
168
|
+
/** Starts a comment thread on the selected text. */
|
|
169
|
+
comment: string;
|
|
170
|
+
/** The name of the card that shows a thread. */
|
|
171
|
+
commentThread: string;
|
|
172
|
+
/** Shown for a removed block that has no text, such as a divider, when comparing versions. */
|
|
173
|
+
removedBlock: string;
|
|
174
|
+
/** Read out once a version is restored. */
|
|
175
|
+
restored: string;
|
|
176
|
+
/** Read out, before the text, when going to a change while comparing. */
|
|
177
|
+
changeAdded: string;
|
|
178
|
+
changeRemoved: string;
|
|
179
|
+
changeChanged: string;
|
|
180
|
+
formatting: string;
|
|
181
|
+
/** The name of the slash menu's list. */
|
|
182
|
+
blockTypes: string;
|
|
183
|
+
}
|
|
184
|
+
export declare const editorLocales: Record<string, EditorMessages>;
|
|
185
|
+
/**
|
|
186
|
+
* The editor's texts, picked by the name of DouUI's current locale.
|
|
187
|
+
* Pass `messages` to override any of them.
|
|
188
|
+
*/
|
|
189
|
+
type DeepPartial<T> = {
|
|
190
|
+
[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
|
|
191
|
+
};
|
|
192
|
+
/** Any part of the messages: a nested group can be given in part too. */
|
|
193
|
+
export type EditorMessagesOverride = DeepPartial<EditorMessages>;
|
|
194
|
+
export declare function useEditorMessages(override?: MaybeRefOrGetter<EditorMessagesOverride | undefined>): import("vue").ComputedRef<EditorMessages>;
|
|
195
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type EditorExtensionList } from '../core/convert';
|
|
2
|
+
import type { Block, PartialBlock } from '../core/model';
|
|
3
|
+
export interface MarkdownToBlocksOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Turns Markdown into HTML. Defaults to markdown-it with HTML allowed
|
|
6
|
+
* (the HTML is read like pasted HTML, so only what the extensions know
|
|
7
|
+
* is kept); pass your own to add syntax.
|
|
8
|
+
*/
|
|
9
|
+
render?: (markdown: string) => string;
|
|
10
|
+
}
|
|
11
|
+
/** Write blocks as Markdown (CommonMark with GitHub's extensions). Works without a browser. */
|
|
12
|
+
export declare function blocksToMarkdown(blocks: PartialBlock[], extensions: EditorExtensionList): string;
|
|
13
|
+
/** Read Markdown as blocks. Needs `DOMParser` (a browser, or a DOM library). */
|
|
14
|
+
export declare function markdownToBlocks(markdown: string, extensions: EditorExtensionList, options?: MarkdownToBlocksOptions): Block[];
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { EditorView } from 'prosemirror-view';
|
|
2
|
+
import { type ShallowRef } from 'vue';
|
|
3
|
+
import { type CommentAnchor } from './core/comments';
|
|
4
|
+
import type { CommentsProvider } from './core/extension';
|
|
5
|
+
import type { EditorComments, EditorEmits, EditorProps } from './editor';
|
|
6
|
+
type Emit = <K extends keyof EditorEmits>(event: K, ...args: EditorEmits[K]) => void;
|
|
7
|
+
export declare function useEditorComments(options: {
|
|
8
|
+
props: EditorProps;
|
|
9
|
+
emit: Emit;
|
|
10
|
+
view: ShallowRef<EditorView | null>;
|
|
11
|
+
provider: CommentsProvider | null;
|
|
12
|
+
}): {
|
|
13
|
+
comments: EditorComments;
|
|
14
|
+
plugin: import("prosemirror-state").Plugin<import("./core/comments").CommentPluginState>;
|
|
15
|
+
anchors: () => Record<string, CommentAnchor | null>;
|
|
16
|
+
};
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { anchorComment, commentAnchors, commentPlugin, commentsAt, setPendingComment, unanchorComment } from "./core/comments.js";
|
|
2
|
+
import { applyCommentAction } from "dou-ui";
|
|
3
|
+
import { computed, shallowRef, watch } from "vue";
|
|
4
|
+
import { TextSelection } from "prosemirror-state";
|
|
5
|
+
// src/use-comments.ts
|
|
6
|
+
/** The selected text in a read-only editor, which keeps no selection of its own. */
|
|
7
|
+
function domSelection(view) {
|
|
8
|
+
const selection = view.dom.ownerDocument.getSelection();
|
|
9
|
+
if (!selection || selection.isCollapsed || !selection.rangeCount) return null;
|
|
10
|
+
const range = selection.getRangeAt(0);
|
|
11
|
+
if (!view.dom.contains(range.startContainer) || !view.dom.contains(range.endContainer)) return null;
|
|
12
|
+
try {
|
|
13
|
+
const from = view.posAtDOM(range.startContainer, range.startOffset);
|
|
14
|
+
const to = view.posAtDOM(range.endContainer, range.endOffset);
|
|
15
|
+
return to > from ? {
|
|
16
|
+
from,
|
|
17
|
+
to
|
|
18
|
+
} : null;
|
|
19
|
+
} catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** Whether a range holds text a thread can be about: not only a divider, not in code. */
|
|
24
|
+
function hasText(state, range) {
|
|
25
|
+
let text = false;
|
|
26
|
+
state.doc.nodesBetween(range.from, range.to, (node) => {
|
|
27
|
+
if (text) return false;
|
|
28
|
+
if (!node.isTextblock) return true;
|
|
29
|
+
text = !node.type.spec.code && node.content.size > 0;
|
|
30
|
+
return false;
|
|
31
|
+
});
|
|
32
|
+
return text;
|
|
33
|
+
}
|
|
34
|
+
function useEditorComments(options) {
|
|
35
|
+
const { props, emit, view, provider } = options;
|
|
36
|
+
const threads = computed(() => provider?.threads.value ?? props.comments ?? []);
|
|
37
|
+
const enabled = computed(() => !!provider || props.comments !== void 0);
|
|
38
|
+
const writable = computed(() => enabled.value && !!props.author && props.commentable !== false);
|
|
39
|
+
const known = computed(() => new Set(threads.value.map((thread) => thread.id)));
|
|
40
|
+
if (provider) watch(provider.threads, (value) => emit("update:comments", [...value]), { immediate: true });
|
|
41
|
+
const innerActive = shallowRef(null);
|
|
42
|
+
const active = computed(() => props.activeComment === void 0 ? innerActive.value : props.activeComment);
|
|
43
|
+
function open(id) {
|
|
44
|
+
if (id === active.value) return;
|
|
45
|
+
innerActive.value = id;
|
|
46
|
+
emit("update:activeComment", id);
|
|
47
|
+
}
|
|
48
|
+
const pending = shallowRef(null);
|
|
49
|
+
function selection() {
|
|
50
|
+
const current = view.value;
|
|
51
|
+
if (!current) return null;
|
|
52
|
+
const range = current.editable ? current.state.selection instanceof TextSelection && !current.state.selection.empty ? {
|
|
53
|
+
from: current.state.selection.from,
|
|
54
|
+
to: current.state.selection.to
|
|
55
|
+
} : null : domSelection(current);
|
|
56
|
+
return range && hasText(current.state, range) ? range : null;
|
|
57
|
+
}
|
|
58
|
+
const focusRequest = shallowRef(0);
|
|
59
|
+
/** The open thread the cursor is in, innermost first. */
|
|
60
|
+
function threadAtCursor() {
|
|
61
|
+
const current = view.value;
|
|
62
|
+
if (!current) return null;
|
|
63
|
+
return commentsAt(current.state, current.state.selection.from).find((id) => isOpen(id)) ?? null;
|
|
64
|
+
}
|
|
65
|
+
function start() {
|
|
66
|
+
const current = view.value;
|
|
67
|
+
if (!current || !enabled.value) return false;
|
|
68
|
+
const range = selection();
|
|
69
|
+
if (!range) {
|
|
70
|
+
const id = threadAtCursor();
|
|
71
|
+
if (!id) return false;
|
|
72
|
+
open(id);
|
|
73
|
+
focusRequest.value++;
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
if (!writable.value) return false;
|
|
77
|
+
open(null);
|
|
78
|
+
setPendingComment(current, range);
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
function close() {
|
|
82
|
+
const current = view.value;
|
|
83
|
+
if (current && pending.value) setPendingComment(current, null);
|
|
84
|
+
open(null);
|
|
85
|
+
}
|
|
86
|
+
function apply(action) {
|
|
87
|
+
const current = view.value;
|
|
88
|
+
if (action.type === "create") {
|
|
89
|
+
const range = pending.value;
|
|
90
|
+
if (!current || !range) return;
|
|
91
|
+
anchorComment(current, range, action.thread.id);
|
|
92
|
+
} else if (current && action.type === "remove") unanchorComment(current, action.threadId);
|
|
93
|
+
if (provider) provider.apply(action);
|
|
94
|
+
else emit("update:comments", applyCommentAction(threads.value, action));
|
|
95
|
+
emit("commentAction", action);
|
|
96
|
+
if (action.type === "create") {
|
|
97
|
+
open(action.thread.id);
|
|
98
|
+
focusRequest.value++;
|
|
99
|
+
} else if (action.type === "remove" || action.type === "resolve") open(null);
|
|
100
|
+
}
|
|
101
|
+
const isOpen = (id) => {
|
|
102
|
+
const thread = threads.value.find((item) => item.id === id);
|
|
103
|
+
return !!thread && !thread.resolved;
|
|
104
|
+
};
|
|
105
|
+
const plugin = commentPlugin({
|
|
106
|
+
known: () => enabled.value ? known.value : null,
|
|
107
|
+
onClick: (ids) => {
|
|
108
|
+
if (pending.value && view.value) setPendingComment(view.value, null);
|
|
109
|
+
open(ids.find(isOpen) ?? null);
|
|
110
|
+
},
|
|
111
|
+
onSelect: () => {
|
|
112
|
+
if (!pending.value) open(null);
|
|
113
|
+
},
|
|
114
|
+
onPending: (range) => pending.value = range
|
|
115
|
+
});
|
|
116
|
+
function anchors() {
|
|
117
|
+
const found = view.value ? commentAnchors(view.value.state.doc) : /* @__PURE__ */ new Map();
|
|
118
|
+
return Object.fromEntries(threads.value.map((thread) => [thread.id, found.get(thread.id) ?? null]));
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
comments: {
|
|
122
|
+
enabled,
|
|
123
|
+
writable,
|
|
124
|
+
threads,
|
|
125
|
+
author: computed(() => props.author),
|
|
126
|
+
active,
|
|
127
|
+
pending,
|
|
128
|
+
focusRequest,
|
|
129
|
+
selection,
|
|
130
|
+
start,
|
|
131
|
+
apply,
|
|
132
|
+
open,
|
|
133
|
+
close
|
|
134
|
+
},
|
|
135
|
+
plugin,
|
|
136
|
+
anchors
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
export { useEditorComments };
|
|
140
|
+
|
|
141
|
+
//# sourceMappingURL=use-comments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-comments.js","names":[],"sources":["../src/use-comments.ts"],"sourcesContent":["import { applyCommentAction, type CommentAction, type CommentThread } from 'dou-ui'\nimport { TextSelection, type EditorState } from 'prosemirror-state'\nimport type { EditorView } from 'prosemirror-view'\nimport { computed, shallowRef, watch, type ShallowRef } from 'vue'\nimport {\n anchorComment,\n commentAnchors,\n commentsAt,\n commentPlugin,\n setPendingComment,\n unanchorComment,\n type CommentAnchor,\n type CommentRange,\n} from './core/comments'\nimport type { CommentsProvider } from './core/extension'\nimport type { EditorComments, EditorEmits, EditorProps } from './editor'\n\ntype Emit = <K extends keyof EditorEmits>(event: K, ...args: EditorEmits[K]) => void\n\n/** The selected text in a read-only editor, which keeps no selection of its own. */\nfunction domSelection(view: EditorView): CommentRange | null {\n const selection = view.dom.ownerDocument.getSelection()\n if (!selection || selection.isCollapsed || !selection.rangeCount) return null\n const range = selection.getRangeAt(0)\n if (!view.dom.contains(range.startContainer) || !view.dom.contains(range.endContainer))\n return null\n try {\n const from = view.posAtDOM(range.startContainer, range.startOffset)\n const to = view.posAtDOM(range.endContainer, range.endOffset)\n return to > from ? { from, to } : null\n } catch {\n return null\n }\n}\n\n/** Whether a range holds text a thread can be about: not only a divider, not in code. */\nfunction hasText(state: EditorState, range: CommentRange) {\n let text = false\n state.doc.nodesBetween(range.from, range.to, (node) => {\n if (text) return false\n if (!node.isTextblock) return true\n text = !node.type.spec.code && node.content.size > 0\n return false\n })\n return text\n}\n\nexport function useEditorComments(options: {\n props: EditorProps\n emit: Emit\n view: ShallowRef<EditorView | null>\n provider: CommentsProvider | null\n}) {\n const { props, emit, view, provider } = options\n\n const threads = computed<readonly CommentThread[]>(\n () => provider?.threads.value ?? props.comments ?? [],\n )\n const enabled = computed(() => !!provider || props.comments !== undefined)\n const writable = computed(() => enabled.value && !!props.author && props.commentable !== false)\n const known = computed(() => new Set(threads.value.map((thread) => thread.id)))\n\n // the shared document's threads, mirrored to `v-model:comments`\n if (provider)\n watch(provider.threads, (value) => emit('update:comments', [...value]), { immediate: true })\n\n const innerActive = shallowRef<string | null>(null)\n const active = computed(() =>\n props.activeComment === undefined ? innerActive.value : props.activeComment,\n )\n function open(id: string | null) {\n if (id === active.value) return\n innerActive.value = id\n emit('update:activeComment', id)\n }\n\n const pending = shallowRef<CommentRange | null>(null)\n\n function selection(): CommentRange | null {\n const current = view.value\n if (!current) return null\n const range = current.editable\n ? current.state.selection instanceof TextSelection && !current.state.selection.empty\n ? { from: current.state.selection.from, to: current.state.selection.to }\n : null\n : domSelection(current)\n return range && hasText(current.state, range) ? range : null\n }\n\n const focusRequest = shallowRef(0)\n\n /** The open thread the cursor is in, innermost first. */\n function threadAtCursor(): string | null {\n const current = view.value\n if (!current) return null\n const ids = commentsAt(current.state, current.state.selection.from)\n return ids.find((id) => isOpen(id)) ?? null\n }\n\n function start(): boolean {\n const current = view.value\n if (!current || !enabled.value) return false\n const range = selection()\n if (!range) {\n // on commented text: open its thread, ready to reply\n const id = threadAtCursor()\n if (!id) return false\n open(id)\n focusRequest.value++\n return true\n }\n if (!writable.value) return false\n open(null)\n setPendingComment(current, range)\n return true\n }\n\n function close() {\n const current = view.value\n if (current && pending.value) setPendingComment(current, null)\n open(null)\n }\n\n function apply(action: CommentAction) {\n const current = view.value\n if (action.type === 'create') {\n const range = pending.value\n if (!current || !range) return\n anchorComment(current, range, action.thread.id)\n } else if (current && action.type === 'remove') unanchorComment(current, action.threadId)\n if (provider) provider.apply(action)\n else emit('update:comments', applyCommentAction(threads.value, action))\n emit('commentAction', action)\n if (action.type === 'create') {\n open(action.thread.id)\n focusRequest.value++\n } else if (action.type === 'remove' || action.type === 'resolve') open(null)\n }\n\n const isOpen = (id: string) => {\n const thread = threads.value.find((item) => item.id === id)\n return !!thread && !thread.resolved\n }\n\n const plugin = commentPlugin({\n known: () => (enabled.value ? known.value : null),\n onClick: (ids) => {\n if (pending.value && view.value) setPendingComment(view.value, null)\n open(ids.find(isOpen) ?? null)\n },\n // selecting other text (the formatting toolbar shows) closes an open thread\n onSelect: () => {\n if (!pending.value) open(null)\n },\n onPending: (range) => (pending.value = range),\n })\n\n function anchors(): Record<string, CommentAnchor | null> {\n const found = view.value ? commentAnchors(view.value.state.doc) : new Map()\n return Object.fromEntries(\n threads.value.map((thread) => [thread.id, found.get(thread.id) ?? null]),\n )\n }\n\n const comments: EditorComments = {\n enabled,\n writable,\n threads,\n author: computed(() => props.author),\n active,\n pending,\n focusRequest,\n selection,\n start,\n apply,\n open,\n close,\n }\n\n return { comments, plugin, anchors }\n}\n"],"mappings":"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"}
|