@dxos/react-ui-editor 0.8.4-main.84f28bd → 0.8.4-main.ae835ea
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/dist/lib/browser/{chunk-22UMM3QJ.mjs → chunk-HL3YF6WC.mjs} +2 -2
- package/dist/lib/browser/chunk-HL3YF6WC.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +4225 -3369
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +71 -1
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/browser/types/index.mjs +1 -1
- package/dist/lib/node-esm/{chunk-YXYQPV6R.mjs → chunk-YJZGD3LY.mjs} +2 -2
- package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +4225 -3369
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +71 -1
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/types/index.mjs +1 -1
- package/dist/types/src/components/Editor/Editor.d.ts +24 -9
- package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
- package/dist/types/src/components/Editor/Editor.stories.d.ts +27 -0
- package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +17 -2
- package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/util.d.ts +6 -20
- package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -1
- package/dist/types/src/components/EditorToolbar/view-mode.d.ts +1 -1
- package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +0 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/defaults.d.ts.map +1 -1
- package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +26 -0
- package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -0
- package/dist/types/src/extensions/autocomplete/index.d.ts +5 -0
- package/dist/types/src/extensions/autocomplete/index.d.ts.map +1 -0
- package/dist/types/src/extensions/autocomplete/match.d.ts +13 -0
- package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -0
- package/dist/types/src/extensions/autocomplete/placeholder.d.ts +20 -0
- package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -0
- package/dist/types/src/extensions/autocomplete/typeahead.d.ts +10 -0
- package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -0
- package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
- package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/automerge.stories.d.ts +10 -19
- package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
- package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/defs.d.ts +1 -1
- package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/sync.d.ts +3 -3
- package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
- package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
- package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
- package/dist/types/src/extensions/autoscroll.d.ts +10 -0
- package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
- package/dist/types/src/extensions/awareness/awareness-provider.d.ts +1 -1
- package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
- package/dist/types/src/extensions/comments.d.ts +1 -1
- package/dist/types/src/extensions/comments.d.ts.map +1 -1
- package/dist/types/src/extensions/dnd.d.ts.map +1 -1
- package/dist/types/src/extensions/factories.d.ts +20 -19
- package/dist/types/src/extensions/factories.d.ts.map +1 -1
- package/dist/types/src/extensions/focus.d.ts.map +1 -1
- package/dist/types/src/extensions/folding.d.ts.map +1 -1
- package/dist/types/src/extensions/index.d.ts +4 -1
- package/dist/types/src/extensions/index.d.ts.map +1 -1
- package/dist/types/src/extensions/json.d.ts +1 -1
- package/dist/types/src/extensions/json.d.ts.map +1 -1
- package/dist/types/src/extensions/listener.d.ts +8 -6
- package/dist/types/src/extensions/listener.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/action.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/bundle.d.ts +8 -2
- package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/changes.d.ts +1 -1
- package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/decorate.d.ts +9 -1
- package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/formatting.d.ts +2 -3
- package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
- package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
- package/dist/types/src/extensions/modes.d.ts +1 -1
- package/dist/types/src/extensions/modes.d.ts.map +1 -1
- package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
- package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
- package/dist/types/src/extensions/outliner/outliner.d.ts +1 -1
- package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
- package/dist/types/src/extensions/outliner/selection.d.ts.map +1 -1
- package/dist/types/src/extensions/outliner/tree.d.ts +2 -2
- package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
- package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts +36 -0
- package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts.map +1 -0
- package/dist/types/src/extensions/popover/index.d.ts +8 -0
- package/dist/types/src/extensions/popover/index.d.ts.map +1 -0
- package/dist/types/src/extensions/popover/menu-presets.d.ts +4 -0
- package/dist/types/src/extensions/popover/menu-presets.d.ts.map +1 -0
- package/dist/types/src/extensions/popover/menu.d.ts +24 -0
- package/dist/types/src/extensions/popover/menu.d.ts.map +1 -0
- package/dist/types/src/extensions/popover/modal.d.ts +7 -0
- package/dist/types/src/extensions/popover/modal.d.ts.map +1 -0
- package/dist/types/src/extensions/popover/popover.d.ts +47 -0
- package/dist/types/src/extensions/popover/popover.d.ts.map +1 -0
- package/dist/types/src/extensions/popover/usePopoverMenu.d.ts +34 -0
- package/dist/types/src/extensions/popover/usePopoverMenu.d.ts.map +1 -0
- package/dist/types/src/extensions/popover/util.d.ts +8 -0
- package/dist/types/src/extensions/popover/util.d.ts.map +1 -0
- package/dist/types/src/extensions/preview/preview.d.ts +8 -8
- package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
- package/dist/types/src/extensions/state.d.ts +2 -0
- package/dist/types/src/extensions/state.d.ts.map +1 -0
- package/dist/types/src/extensions/tags/extended-markdown.d.ts +10 -0
- package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -0
- package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +2 -0
- package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +1 -0
- package/dist/types/src/extensions/tags/index.d.ts +4 -0
- package/dist/types/src/extensions/tags/index.d.ts.map +1 -0
- package/dist/types/src/extensions/tags/streamer.d.ts +12 -0
- package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -0
- package/dist/types/src/extensions/tags/xml-tags.d.ts +72 -0
- package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -0
- package/dist/types/src/extensions/tags/xml-util.d.ts +10 -0
- package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -0
- package/dist/types/src/hooks/useTextEditor.d.ts +4 -8
- package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
- package/dist/types/src/stories/CommandDialog.stories.d.ts +14 -0
- package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
- package/dist/types/src/stories/Comments.stories.d.ts +21 -10
- package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
- package/dist/types/src/stories/EditorToolbar.stories.d.ts +39 -3
- package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Experimental.stories.d.ts +22 -13
- package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Markdown.stories.d.ts +32 -43
- package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Outliner.stories.d.ts +15 -21
- package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Popover.stories.d.ts +20 -0
- package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
- package/dist/types/src/stories/Preview.stories.d.ts +21 -7
- package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
- package/dist/types/src/stories/Tags.stories.d.ts +16 -0
- package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
- package/dist/types/src/stories/TextEditor.stories.d.ts +37 -52
- package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
- package/dist/types/src/stories/components/EditorStory.d.ts +6 -9
- package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
- package/dist/types/src/styles/theme.d.ts.map +1 -1
- package/dist/types/src/testing/PreviewPopover.d.ts +20 -0
- package/dist/types/src/testing/PreviewPopover.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +1 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/util.d.ts +1 -0
- package/dist/types/src/testing/util.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +1 -1
- package/dist/types/src/types/types.d.ts +2 -2
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util/cursor.d.ts.map +1 -1
- package/dist/types/src/util/debug.d.ts +1 -1
- package/dist/types/src/util/debug.d.ts.map +1 -1
- package/dist/types/src/util/decorations.d.ts +4 -0
- package/dist/types/src/util/decorations.d.ts.map +1 -0
- package/dist/types/src/util/dom.d.ts +2 -12
- package/dist/types/src/util/dom.d.ts.map +1 -1
- package/dist/types/src/util/index.d.ts +1 -0
- package/dist/types/src/util/index.d.ts.map +1 -1
- package/dist/types/src/util/react.d.ts +1 -1
- package/dist/types/src/util/react.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +71 -61
- package/src/components/Editor/Editor.stories.tsx +69 -0
- package/src/components/Editor/Editor.tsx +58 -15
- package/src/components/EditorToolbar/EditorToolbar.tsx +104 -93
- package/src/components/EditorToolbar/blocks.ts +22 -25
- package/src/components/EditorToolbar/formatting.ts +22 -25
- package/src/components/EditorToolbar/headings.ts +16 -9
- package/src/components/EditorToolbar/image.ts +8 -4
- package/src/components/EditorToolbar/lists.ts +16 -19
- package/src/components/EditorToolbar/search.ts +8 -4
- package/src/components/EditorToolbar/util.ts +18 -23
- package/src/components/EditorToolbar/view-mode.ts +11 -6
- package/src/components/index.ts +0 -1
- package/src/defaults.ts +5 -2
- package/src/extensions/autocomplete/autocomplete.ts +220 -0
- package/src/extensions/autocomplete/index.ts +8 -0
- package/src/extensions/autocomplete/match.ts +46 -0
- package/src/extensions/{command → autocomplete}/placeholder.ts +22 -18
- package/src/extensions/{command → autocomplete}/typeahead.ts +8 -50
- package/src/extensions/automerge/automerge.stories.tsx +31 -24
- package/src/extensions/automerge/automerge.ts +31 -11
- package/src/extensions/automerge/cursor.ts +1 -1
- package/src/extensions/automerge/defs.ts +1 -1
- package/src/extensions/automerge/sync.ts +9 -5
- package/src/extensions/automerge/update-automerge.ts +2 -2
- package/src/extensions/autoscroll.ts +157 -0
- package/src/extensions/awareness/awareness-provider.ts +2 -2
- package/src/extensions/awareness/awareness.ts +2 -2
- package/src/extensions/comments.ts +18 -13
- package/src/extensions/dnd.ts +1 -1
- package/src/extensions/factories.ts +55 -37
- package/src/extensions/focus.ts +5 -4
- package/src/extensions/folding.tsx +4 -6
- package/src/extensions/hashtag.tsx +2 -2
- package/src/extensions/index.ts +4 -1
- package/src/extensions/json.ts +1 -1
- package/src/extensions/listener.ts +14 -20
- package/src/extensions/markdown/action.ts +2 -1
- package/src/extensions/markdown/bundle.ts +40 -6
- package/src/extensions/markdown/changes.ts +1 -1
- package/src/extensions/markdown/decorate.ts +24 -14
- package/src/extensions/markdown/formatting.test.ts +6 -6
- package/src/extensions/markdown/formatting.ts +11 -11
- package/src/extensions/markdown/highlight.ts +1 -1
- package/src/extensions/markdown/image.ts +3 -4
- package/src/extensions/markdown/link.ts +3 -0
- package/src/extensions/markdown/table.ts +7 -1
- package/src/extensions/mention.ts +1 -1
- package/src/extensions/modes.ts +2 -2
- package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +16 -21
- package/src/extensions/outliner/outliner.test.ts +3 -2
- package/src/extensions/outliner/outliner.ts +7 -6
- package/src/extensions/outliner/selection.ts +1 -1
- package/src/extensions/outliner/tree.test.ts +2 -1
- package/src/extensions/outliner/tree.ts +2 -2
- package/src/extensions/popover/PopoverMenuProvider.tsx +220 -0
- package/src/extensions/popover/index.ts +12 -0
- package/src/extensions/popover/menu-presets.ts +124 -0
- package/src/extensions/popover/menu.ts +67 -0
- package/src/extensions/popover/modal.ts +24 -0
- package/src/extensions/popover/popover.ts +289 -0
- package/src/extensions/popover/usePopoverMenu.ts +173 -0
- package/src/extensions/popover/util.ts +29 -0
- package/src/extensions/preview/index.ts +1 -1
- package/src/extensions/preview/preview.ts +67 -67
- package/src/extensions/selection.ts +2 -2
- package/src/extensions/state.ts +7 -0
- package/src/extensions/tags/extended-markdown.test.ts +261 -0
- package/src/extensions/tags/extended-markdown.ts +78 -0
- package/src/extensions/tags/index.ts +7 -0
- package/src/extensions/tags/streamer.ts +243 -0
- package/src/extensions/tags/xml-tags.ts +393 -0
- package/src/extensions/tags/xml-util.ts +94 -0
- package/src/hooks/useTextEditor.ts +27 -39
- package/src/stories/CommandDialog.stories.tsx +78 -0
- package/src/stories/Comments.stories.tsx +14 -10
- package/src/stories/EditorToolbar.stories.tsx +17 -17
- package/src/stories/Experimental.stories.tsx +17 -13
- package/src/stories/Markdown.stories.tsx +25 -21
- package/src/stories/Outliner.stories.tsx +54 -35
- package/src/stories/Popover.stories.tsx +163 -0
- package/src/stories/Preview.stories.tsx +49 -41
- package/src/stories/Tags.stories.tsx +81 -0
- package/src/stories/TextEditor.stories.tsx +41 -60
- package/src/stories/components/EditorStory.tsx +17 -16
- package/src/styles/theme.ts +18 -15
- package/src/testing/PreviewPopover.tsx +80 -0
- package/src/testing/index.ts +1 -0
- package/src/testing/util.ts +2 -0
- package/src/translations.ts +1 -1
- package/src/types/types.ts +1 -1
- package/src/util/cursor.ts +2 -1
- package/src/util/debug.ts +2 -2
- package/src/util/decorations.ts +21 -0
- package/src/util/dom.ts +5 -27
- package/src/util/index.ts +1 -0
- package/src/util/react.tsx +1 -1
- package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
- package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
- package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
- package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
- package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
- package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
- package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
- package/dist/types/src/components/Popover/index.d.ts +0 -4
- package/dist/types/src/components/Popover/index.d.ts.map +0 -1
- package/dist/types/src/extensions/autocomplete.d.ts +0 -13
- package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
- package/dist/types/src/extensions/command/action.d.ts +0 -17
- package/dist/types/src/extensions/command/action.d.ts.map +0 -1
- package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
- package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
- package/dist/types/src/extensions/command/command.d.ts +0 -6
- package/dist/types/src/extensions/command/command.d.ts.map +0 -1
- package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
- package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
- package/dist/types/src/extensions/command/hint.d.ts +0 -24
- package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
- package/dist/types/src/extensions/command/index.d.ts +0 -7
- package/dist/types/src/extensions/command/index.d.ts.map +0 -1
- package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
- package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
- package/dist/types/src/extensions/command/state.d.ts +0 -16
- package/dist/types/src/extensions/command/state.d.ts.map +0 -1
- package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
- package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
- package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
- package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
- package/dist/types/src/stories/Command.stories.d.ts +0 -7
- package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
- package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
- package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
- package/src/components/Popover/CommandMenu.tsx +0 -279
- package/src/components/Popover/RefDropdownMenu.tsx +0 -85
- package/src/components/Popover/RefPopover.tsx +0 -99
- package/src/components/Popover/index.ts +0 -7
- package/src/extensions/autocomplete.ts +0 -69
- package/src/extensions/command/action.ts +0 -56
- package/src/extensions/command/command-menu.ts +0 -210
- package/src/extensions/command/command.ts +0 -34
- package/src/extensions/command/hint.ts +0 -102
- package/src/extensions/command/index.ts +0 -10
- package/src/extensions/command/state.ts +0 -89
- package/src/extensions/command/useCommandMenu.ts +0 -118
- package/src/stories/Command.stories.tsx +0 -97
- package/src/stories/CommandMenu.stories.tsx +0 -159
|
@@ -2,20 +2,16 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@dxos/lit-ui/dx-ref-tag.pcss';
|
|
6
|
-
|
|
7
5
|
import { syntaxTree } from '@codemirror/language';
|
|
8
|
-
import {
|
|
9
|
-
type EditorState,
|
|
10
|
-
type Extension,
|
|
11
|
-
type RangeSet,
|
|
12
|
-
RangeSetBuilder,
|
|
13
|
-
StateField,
|
|
14
|
-
type Transaction,
|
|
15
|
-
} from '@codemirror/state';
|
|
6
|
+
import { type EditorState, type Extension, RangeSetBuilder, StateField } from '@codemirror/state';
|
|
16
7
|
import { Decoration, type DecorationSet, EditorView, WidgetType } from '@codemirror/view';
|
|
17
8
|
import { type SyntaxNode } from '@lezer/common';
|
|
18
9
|
|
|
10
|
+
export type PreviewBlock = {
|
|
11
|
+
link: PreviewLinkRef;
|
|
12
|
+
el: HTMLElement;
|
|
13
|
+
};
|
|
14
|
+
|
|
19
15
|
export type PreviewLinkRef = {
|
|
20
16
|
suggest?: boolean;
|
|
21
17
|
block?: boolean;
|
|
@@ -29,13 +25,9 @@ export type PreviewLinkTarget = {
|
|
|
29
25
|
object?: any;
|
|
30
26
|
};
|
|
31
27
|
|
|
32
|
-
// TODO(wittjosiah): Remove.
|
|
33
|
-
// TODO(burdon): Handle error.
|
|
34
|
-
export type PreviewLookup = (link: PreviewLinkRef) => Promise<PreviewLinkTarget | null | undefined>;
|
|
35
|
-
|
|
36
28
|
export type PreviewOptions = {
|
|
37
|
-
addBlockContainer?: (
|
|
38
|
-
removeBlockContainer?: (
|
|
29
|
+
addBlockContainer?: (block: PreviewBlock) => void;
|
|
30
|
+
removeBlockContainer?: (block: PreviewBlock) => void;
|
|
39
31
|
};
|
|
40
32
|
|
|
41
33
|
/**
|
|
@@ -44,10 +36,16 @@ export type PreviewOptions = {
|
|
|
44
36
|
export const preview = (options: PreviewOptions = {}): Extension => {
|
|
45
37
|
return [
|
|
46
38
|
// NOTE: Atomic block decorations must be created from a state field, now a widget, otherwise it results in the following error:
|
|
47
|
-
// "Block decorations may not be specified via plugins"
|
|
39
|
+
// "Block decorations may not be specified via plugins".
|
|
48
40
|
StateField.define<DecorationSet>({
|
|
49
41
|
create: (state) => buildDecorations(state, options),
|
|
50
|
-
update: (
|
|
42
|
+
update: (decorations, tr) => {
|
|
43
|
+
if (tr.docChanged) {
|
|
44
|
+
return buildDecorations(tr.state, options);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return decorations.map(tr.changes);
|
|
48
|
+
},
|
|
51
49
|
provide: (field) => [
|
|
52
50
|
EditorView.decorations.from(field),
|
|
53
51
|
EditorView.atomicRanges.of((view) => view.state.field(field)),
|
|
@@ -56,42 +54,19 @@ export const preview = (options: PreviewOptions = {}): Extension => {
|
|
|
56
54
|
];
|
|
57
55
|
};
|
|
58
56
|
|
|
59
|
-
/**
|
|
60
|
-
* Link references.
|
|
61
|
-
*
|
|
62
|
-
* [Label][dxn:echo:123] Inline reference
|
|
63
|
-
* ![Label][dxn:echo:123] Block reference
|
|
64
|
-
* ![Label][?dxn:echo:123] Suggestion
|
|
65
|
-
*/
|
|
66
|
-
export const getLinkRef = (state: EditorState, node: SyntaxNode): PreviewLinkRef | undefined => {
|
|
67
|
-
const mark = node.getChild('LinkMark');
|
|
68
|
-
const label = node.getChild('LinkLabel');
|
|
69
|
-
if (mark && label) {
|
|
70
|
-
const ref = state.sliceDoc(label.from + 1, label.to - 1);
|
|
71
|
-
return {
|
|
72
|
-
suggest: ref.startsWith('?'),
|
|
73
|
-
block: state.sliceDoc(mark.from, mark.from + 1) === '!',
|
|
74
|
-
label: state.sliceDoc(mark.to, label.from - 1),
|
|
75
|
-
ref: ref.startsWith('?') ? ref.slice(1) : ref,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
|
|
80
57
|
/**
|
|
81
58
|
* Echo references are represented as markdown reference links.
|
|
82
59
|
* https://www.markdownguide.org/basic-syntax/#reference-style-links
|
|
83
|
-
* [Label|block][dxn:echo:123]
|
|
84
|
-
* [Label|inline][dxn:echo:123]
|
|
85
60
|
*/
|
|
86
|
-
const buildDecorations = (state: EditorState, options: PreviewOptions) => {
|
|
61
|
+
const buildDecorations = (state: EditorState, options: PreviewOptions): DecorationSet => {
|
|
87
62
|
const builder = new RangeSetBuilder<Decoration>();
|
|
88
63
|
|
|
89
64
|
syntaxTree(state).iterate({
|
|
90
65
|
enter: (node) => {
|
|
91
66
|
switch (node.name) {
|
|
92
67
|
//
|
|
93
|
-
//
|
|
94
|
-
// [Label]
|
|
68
|
+
// Inline widget.
|
|
69
|
+
// [Label](dxn:echo:123)
|
|
95
70
|
//
|
|
96
71
|
case 'Link': {
|
|
97
72
|
const link = getLinkRef(state, node.node);
|
|
@@ -101,29 +76,32 @@ const buildDecorations = (state: EditorState, options: PreviewOptions) => {
|
|
|
101
76
|
node.to,
|
|
102
77
|
Decoration.replace({
|
|
103
78
|
widget: new PreviewInlineWidget(options, link),
|
|
79
|
+
side: 1,
|
|
104
80
|
}),
|
|
105
81
|
);
|
|
106
82
|
}
|
|
107
|
-
|
|
83
|
+
return false;
|
|
108
84
|
}
|
|
85
|
+
|
|
109
86
|
//
|
|
110
|
-
// Block widget.
|
|
111
|
-
// ![Label]
|
|
87
|
+
// Block widget (transclusion).
|
|
88
|
+
// 
|
|
112
89
|
//
|
|
113
90
|
case 'Image': {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
91
|
+
if (options.addBlockContainer && options.removeBlockContainer) {
|
|
92
|
+
const link = getLinkRef(state, node.node);
|
|
93
|
+
if (link) {
|
|
94
|
+
builder.add(
|
|
95
|
+
node.from,
|
|
96
|
+
node.to,
|
|
97
|
+
Decoration.replace({
|
|
98
|
+
block: true,
|
|
99
|
+
widget: new PreviewBlockWidget(options, link),
|
|
100
|
+
}),
|
|
101
|
+
);
|
|
102
|
+
}
|
|
125
103
|
}
|
|
126
|
-
|
|
104
|
+
return false;
|
|
127
105
|
}
|
|
128
106
|
}
|
|
129
107
|
},
|
|
@@ -132,9 +110,30 @@ const buildDecorations = (state: EditorState, options: PreviewOptions) => {
|
|
|
132
110
|
return builder.finish();
|
|
133
111
|
};
|
|
134
112
|
|
|
113
|
+
/**
|
|
114
|
+
* Link references.
|
|
115
|
+
* [Label](dxn:echo:123) Inline reference
|
|
116
|
+
*  Block reference
|
|
117
|
+
*/
|
|
118
|
+
export const getLinkRef = (state: EditorState, node: SyntaxNode): PreviewLinkRef | undefined => {
|
|
119
|
+
const mark = node.getChildren('LinkMark');
|
|
120
|
+
const urlNode = node.getChild('URL');
|
|
121
|
+
if (mark && urlNode) {
|
|
122
|
+
const url = state.sliceDoc(urlNode.from, urlNode.to);
|
|
123
|
+
if (url.startsWith('dxn:')) {
|
|
124
|
+
const label = state.sliceDoc(mark[0].to, mark[1].from);
|
|
125
|
+
return {
|
|
126
|
+
block: state.sliceDoc(mark[0].from, mark[0].from + 1) === '!',
|
|
127
|
+
label,
|
|
128
|
+
ref: url,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
|
|
135
134
|
/**
|
|
136
135
|
* Inline widget.
|
|
137
|
-
*
|
|
136
|
+
* [Label](dxn:echo:123)
|
|
138
137
|
*/
|
|
139
138
|
class PreviewInlineWidget extends WidgetType {
|
|
140
139
|
constructor(
|
|
@@ -152,8 +151,9 @@ class PreviewInlineWidget extends WidgetType {
|
|
|
152
151
|
return this._link.ref === other._link.ref && this._link.label === other._link.label;
|
|
153
152
|
}
|
|
154
153
|
|
|
155
|
-
override toDOM(
|
|
156
|
-
const root = document.createElement('dx-
|
|
154
|
+
override toDOM(_view: EditorView): HTMLElement {
|
|
155
|
+
const root = document.createElement('dx-anchor');
|
|
156
|
+
root.classList.add('dx-tag--anchor');
|
|
157
157
|
root.textContent = this._link.label;
|
|
158
158
|
root.setAttribute('refId', this._link.ref);
|
|
159
159
|
return root;
|
|
@@ -161,7 +161,7 @@ class PreviewInlineWidget extends WidgetType {
|
|
|
161
161
|
}
|
|
162
162
|
|
|
163
163
|
/**
|
|
164
|
-
* Block widget.
|
|
164
|
+
* Block widget (e.g., for surfaces).
|
|
165
165
|
* ![Label][dxn:echo:123]
|
|
166
166
|
*/
|
|
167
167
|
class PreviewBlockWidget extends WidgetType {
|
|
@@ -180,14 +180,14 @@ class PreviewBlockWidget extends WidgetType {
|
|
|
180
180
|
return this._link.ref === other._link.ref;
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
-
override toDOM(
|
|
183
|
+
override toDOM(_view: EditorView): HTMLDivElement {
|
|
184
184
|
const root = document.createElement('div');
|
|
185
185
|
root.classList.add('cm-preview-block', 'density-coarse');
|
|
186
|
-
this._options.addBlockContainer?.(this._link, root);
|
|
186
|
+
this._options.addBlockContainer?.({ link: this._link, el: root });
|
|
187
187
|
return root;
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
-
override destroy() {
|
|
191
|
-
this._options.removeBlockContainer?.(this._link);
|
|
190
|
+
override destroy(root: HTMLDivElement) {
|
|
191
|
+
this._options.removeBlockContainer?.({ link: this._link, el: root });
|
|
192
192
|
}
|
|
193
193
|
}
|
|
@@ -7,7 +7,7 @@ import { EditorView, keymap } from '@codemirror/view';
|
|
|
7
7
|
|
|
8
8
|
import { debounce } from '@dxos/async';
|
|
9
9
|
import { invariant } from '@dxos/invariant';
|
|
10
|
-
import {
|
|
10
|
+
import { isTruthy } from '@dxos/util';
|
|
11
11
|
|
|
12
12
|
import { singleValueFacet } from '../util';
|
|
13
13
|
|
|
@@ -96,5 +96,5 @@ export const selectionState = ({ getState, setState }: Partial<EditorStateStore>
|
|
|
96
96
|
},
|
|
97
97
|
},
|
|
98
98
|
]),
|
|
99
|
-
].filter(
|
|
99
|
+
].filter(isTruthy);
|
|
100
100
|
};
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { syntaxTree } from '@codemirror/language';
|
|
6
|
+
import { EditorState } from '@codemirror/state';
|
|
7
|
+
import { type SyntaxNode } from '@lezer/common';
|
|
8
|
+
import { describe, test } from 'vitest';
|
|
9
|
+
|
|
10
|
+
import { trim } from '@dxos/util';
|
|
11
|
+
|
|
12
|
+
import { extendedMarkdown } from './extended-markdown';
|
|
13
|
+
import { nodeToJson } from './xml-util';
|
|
14
|
+
|
|
15
|
+
describe('extended-markdown', () => {
|
|
16
|
+
const createEditorState = (doc: string) => {
|
|
17
|
+
return EditorState.create({
|
|
18
|
+
doc,
|
|
19
|
+
extensions: [extendedMarkdown()],
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
test('tree', async ({ expect }) => {
|
|
24
|
+
const doc = trim`
|
|
25
|
+
<prompt>
|
|
26
|
+
Hello
|
|
27
|
+
</prompt>
|
|
28
|
+
|
|
29
|
+
Hi there!
|
|
30
|
+
|
|
31
|
+
What can I do for you?
|
|
32
|
+
|
|
33
|
+
<suggestion>Summarize tools</suggestion>
|
|
34
|
+
|
|
35
|
+
<choice>
|
|
36
|
+
<option>Summarize tools</option>
|
|
37
|
+
<option>Retry</option>
|
|
38
|
+
</choice>
|
|
39
|
+
|
|
40
|
+
<toolkit />
|
|
41
|
+
`;
|
|
42
|
+
|
|
43
|
+
const nodes: SyntaxNode[] = [];
|
|
44
|
+
const state = createEditorState(doc);
|
|
45
|
+
const tree = syntaxTree(state);
|
|
46
|
+
tree.iterate({
|
|
47
|
+
enter: (node) => {
|
|
48
|
+
if (node.type.name === 'Element') {
|
|
49
|
+
nodes.push(node.node);
|
|
50
|
+
return false; // Stop traversal.
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
expect(nodes).toHaveLength(4);
|
|
56
|
+
expect(
|
|
57
|
+
nodes.map((node) => ({
|
|
58
|
+
content: doc.slice(node.from, node.to),
|
|
59
|
+
data: nodeToJson(state, node.node),
|
|
60
|
+
})),
|
|
61
|
+
).toEqual([
|
|
62
|
+
{
|
|
63
|
+
content: '<prompt>\n Hello\n</prompt>',
|
|
64
|
+
data: {
|
|
65
|
+
_tag: 'prompt',
|
|
66
|
+
children: ['Hello'],
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
content: '<suggestion>Summarize tools</suggestion>',
|
|
71
|
+
data: {
|
|
72
|
+
_tag: 'suggestion',
|
|
73
|
+
children: ['Summarize tools'],
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
content: '<choice>\n <option>Summarize tools</option>\n <option>Retry</option>\n</choice>',
|
|
78
|
+
data: {
|
|
79
|
+
_tag: 'choice',
|
|
80
|
+
children: [
|
|
81
|
+
{
|
|
82
|
+
_tag: 'option',
|
|
83
|
+
children: ['Summarize tools'],
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
_tag: 'option',
|
|
87
|
+
children: ['Retry'],
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
content: '<toolkit />',
|
|
94
|
+
data: {
|
|
95
|
+
_tag: 'toolkit',
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
]);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test('setext heading disabled', () => {
|
|
102
|
+
const doc = trim`
|
|
103
|
+
This should NOT be a heading
|
|
104
|
+
=
|
|
105
|
+
|
|
106
|
+
Another line that should NOT be a heading
|
|
107
|
+
-
|
|
108
|
+
`;
|
|
109
|
+
|
|
110
|
+
const state = createEditorState(doc);
|
|
111
|
+
const tree = syntaxTree(state);
|
|
112
|
+
|
|
113
|
+
tree.iterate({
|
|
114
|
+
enter: (node) => {
|
|
115
|
+
if (node.type.name === 'SetextHeading') {
|
|
116
|
+
throw new Error('SetextHeading should be disabled!');
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
//
|
|
123
|
+
// TODO(burdon): All tests below should test the tree.
|
|
124
|
+
//
|
|
125
|
+
|
|
126
|
+
test('should parse standard markdown elements', ({ expect }) => {
|
|
127
|
+
const doc = trim`
|
|
128
|
+
# Heading 1
|
|
129
|
+
## Heading 2
|
|
130
|
+
### Heading 3
|
|
131
|
+
|
|
132
|
+
This is a paragraph with **bold** and *italic* text.
|
|
133
|
+
|
|
134
|
+
\`\`\`javascript
|
|
135
|
+
const code = 'block';
|
|
136
|
+
\`\`\`
|
|
137
|
+
`;
|
|
138
|
+
|
|
139
|
+
const state = createEditorState(doc);
|
|
140
|
+
const tree = state.sliceDoc(0, state.doc.length);
|
|
141
|
+
|
|
142
|
+
// Verify the document is parsed without errors.
|
|
143
|
+
expect(tree).toBe(doc);
|
|
144
|
+
expect(state.doc.lines).toBeGreaterThan(1);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test('should parse custom XML tags', ({ expect }) => {
|
|
148
|
+
const doc = trim`
|
|
149
|
+
# Document with Custom Tags
|
|
150
|
+
|
|
151
|
+
<prompt>This is a custom prompt block</prompt>
|
|
152
|
+
|
|
153
|
+
Regular paragraph text.
|
|
154
|
+
|
|
155
|
+
<prompt />
|
|
156
|
+
|
|
157
|
+
Regular paragraph text.
|
|
158
|
+
|
|
159
|
+
<prompt>
|
|
160
|
+
Multi-line
|
|
161
|
+
prompt content
|
|
162
|
+
</prompt>
|
|
163
|
+
`;
|
|
164
|
+
|
|
165
|
+
const state = createEditorState(doc);
|
|
166
|
+
const tree = state.sliceDoc(0, state.doc.length);
|
|
167
|
+
|
|
168
|
+
// Verify the document contains custom tags.
|
|
169
|
+
expect(tree).toContain('<prompt>');
|
|
170
|
+
expect(tree).toContain('<prompt />');
|
|
171
|
+
expect(tree).toContain('</prompt>');
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
test('should handle mixed markdown and XML content', ({ expect }) => {
|
|
175
|
+
const doc = trim`
|
|
176
|
+
# Mixed Content
|
|
177
|
+
|
|
178
|
+
This is a paragraph with a <prompt>inline prompt</prompt> tag.
|
|
179
|
+
|
|
180
|
+
## Section 2
|
|
181
|
+
|
|
182
|
+
<prompt>
|
|
183
|
+
This prompt contains **markdown** formatting
|
|
184
|
+
</prompt>
|
|
185
|
+
|
|
186
|
+
\`\`\`
|
|
187
|
+
<prompt>This should not be parsed as XML inside code block</prompt>
|
|
188
|
+
\`\`\`
|
|
189
|
+
`;
|
|
190
|
+
|
|
191
|
+
const state = createEditorState(doc);
|
|
192
|
+
const tree = state.sliceDoc(0, state.doc.length);
|
|
193
|
+
|
|
194
|
+
// Verify mixed content is preserved.
|
|
195
|
+
expect(tree).toBe(doc);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
test('should not parse XML tags in code blocks', ({ expect }) => {
|
|
199
|
+
const doc = trim`
|
|
200
|
+
\`\`\`xml
|
|
201
|
+
<prompt>This is inside a code block</prompt>
|
|
202
|
+
\`\`\`
|
|
203
|
+
|
|
204
|
+
\`<prompt>inline code</prompt>\`
|
|
205
|
+
`;
|
|
206
|
+
|
|
207
|
+
const state = createEditorState(doc);
|
|
208
|
+
const tree = state.sliceDoc(0, state.doc.length);
|
|
209
|
+
|
|
210
|
+
// Verify code blocks are preserved as-is.
|
|
211
|
+
expect(tree).toContain('```xml');
|
|
212
|
+
expect(tree).toContain('<prompt>This is inside a code block</prompt>');
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
test('should handle nested and complex structures', ({ expect }) => {
|
|
216
|
+
const doc = trim`
|
|
217
|
+
# Complex Document
|
|
218
|
+
|
|
219
|
+
<prompt>
|
|
220
|
+
First prompt with some content
|
|
221
|
+
</prompt>
|
|
222
|
+
|
|
223
|
+
## Lists and Prompts
|
|
224
|
+
|
|
225
|
+
- Item 1
|
|
226
|
+
- Item 2 with <prompt>embedded prompt</prompt>
|
|
227
|
+
- Item 3
|
|
228
|
+
|
|
229
|
+
<prompt>
|
|
230
|
+
Another prompt after the list
|
|
231
|
+
</prompt>
|
|
232
|
+
|
|
233
|
+
### Code Example
|
|
234
|
+
|
|
235
|
+
\`\`\`typescript
|
|
236
|
+
const example = '<prompt>not parsed</prompt>';
|
|
237
|
+
\`\`\`
|
|
238
|
+
`;
|
|
239
|
+
|
|
240
|
+
const state = createEditorState(doc);
|
|
241
|
+
const tree = state.sliceDoc(0, state.doc.length);
|
|
242
|
+
|
|
243
|
+
// Verify complex structures are handled.
|
|
244
|
+
expect(tree).toBe(doc);
|
|
245
|
+
expect(tree).toMatch(/Item 2 with <prompt>embedded prompt<\/prompt>/);
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
test('should handle empty and edge cases', ({ expect }) => {
|
|
249
|
+
const emptyDoc = '';
|
|
250
|
+
const emptyState = createEditorState(emptyDoc);
|
|
251
|
+
expect(emptyState.doc.length).toBe(0);
|
|
252
|
+
|
|
253
|
+
const onlyPromptDoc = '<prompt>Only prompt content</prompt>';
|
|
254
|
+
const onlyPromptState = createEditorState(onlyPromptDoc);
|
|
255
|
+
expect(onlyPromptState.sliceDoc(0)).toBe(onlyPromptDoc);
|
|
256
|
+
|
|
257
|
+
const unclosedPromptDoc = '<prompt>Unclosed prompt';
|
|
258
|
+
const unclosedState = createEditorState(unclosedPromptDoc);
|
|
259
|
+
expect(unclosedState.sliceDoc(0)).toBe(unclosedPromptDoc);
|
|
260
|
+
});
|
|
261
|
+
});
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { xmlLanguage } from '@codemirror/lang-xml';
|
|
6
|
+
import { type Extension } from '@codemirror/state';
|
|
7
|
+
import { type ParseWrapper, parseMixed } from '@lezer/common';
|
|
8
|
+
|
|
9
|
+
import { createMarkdownExtensions } from '../markdown';
|
|
10
|
+
|
|
11
|
+
import { type XmlWidgetRegistry } from './xml-tags';
|
|
12
|
+
|
|
13
|
+
export type ExtendedMarkdownOptions = {
|
|
14
|
+
registry?: XmlWidgetRegistry;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Extended markdown parser with mixed parser for custom rendering of XML tags.
|
|
19
|
+
*/
|
|
20
|
+
export const extendedMarkdown = ({ registry }: ExtendedMarkdownOptions = {}): Extension => {
|
|
21
|
+
return [
|
|
22
|
+
createMarkdownExtensions({
|
|
23
|
+
extensions: [
|
|
24
|
+
{
|
|
25
|
+
wrap: mixedParser(registry),
|
|
26
|
+
parseBlock: [
|
|
27
|
+
// Disable SetextHeading since it causes flickering when parsing/rendering tasks in chunks.
|
|
28
|
+
{
|
|
29
|
+
name: 'SetextHeading',
|
|
30
|
+
parse: () => false,
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
}),
|
|
36
|
+
];
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Configure mixed parser to recognize custom tags.
|
|
41
|
+
*/
|
|
42
|
+
const mixedParser = (registry?: XmlWidgetRegistry): ParseWrapper => {
|
|
43
|
+
const customTags = Object.keys(registry ?? {});
|
|
44
|
+
const tagPattern = new RegExp(`<(${customTags.join('|')})`);
|
|
45
|
+
|
|
46
|
+
return parseMixed((node, input) => {
|
|
47
|
+
switch (node.name) {
|
|
48
|
+
// Ignore XML inside of fenced and inline code.
|
|
49
|
+
case 'FencedCode':
|
|
50
|
+
case 'InlineCode': {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Parse multi-line HTML blocks.
|
|
55
|
+
// case 'XMLBlock':
|
|
56
|
+
case 'HTMLBlock': {
|
|
57
|
+
return {
|
|
58
|
+
parser: xmlLanguage.parser,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Parse paragraphs that contain custom XML tags.
|
|
63
|
+
// TODO(burdon): Entire paragraph should be parsed as XML.
|
|
64
|
+
case 'Paragraph': {
|
|
65
|
+
const content = input.read(node.from, node.to);
|
|
66
|
+
if (tagPattern.test(content)) {
|
|
67
|
+
return {
|
|
68
|
+
parser: xmlLanguage.parser,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return null;
|
|
77
|
+
});
|
|
78
|
+
};
|