@dxos/plugin-markdown 0.6.13-main.ed424a1 → 0.6.13
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/DocumentCard-2P4EICBA.mjs +11 -0
- package/dist/lib/browser/DocumentEditor-GPWV3VN3.mjs +11 -0
- package/dist/lib/browser/MarkdownEditor-EKJJQEFL.mjs +10 -0
- package/dist/lib/browser/MarkdownEditor-EKJJQEFL.mjs.map +7 -0
- package/dist/lib/browser/chunk-354DCID5.mjs +117 -0
- package/dist/lib/browser/chunk-354DCID5.mjs.map +7 -0
- package/dist/lib/browser/chunk-4GGD6YJO.mjs +19 -0
- package/dist/lib/browser/chunk-4GGD6YJO.mjs.map +7 -0
- package/dist/lib/browser/chunk-7AF2JLK4.mjs +164 -0
- package/dist/lib/browser/chunk-7AF2JLK4.mjs.map +7 -0
- package/dist/lib/browser/{chunk-US5O2P3R.mjs → chunk-CQJL4G4X.mjs} +2 -4
- package/dist/lib/browser/chunk-CQJL4G4X.mjs.map +7 -0
- package/dist/lib/browser/chunk-RL7QY322.mjs +86 -0
- package/dist/lib/browser/chunk-RL7QY322.mjs.map +7 -0
- package/dist/lib/browser/chunk-VUN4QKTT.mjs +208 -0
- package/dist/lib/browser/chunk-VUN4QKTT.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +117 -78
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/meta.mjs +1 -1
- package/dist/lib/browser/types/index.mjs +4 -6
- package/dist/lib/node/{chunk-P7YU53RP.cjs → DocumentCard-EHJDDSRY.cjs} +10 -16
- package/dist/lib/node/DocumentCard-EHJDDSRY.cjs.map +7 -0
- package/dist/lib/node/DocumentEditor-I5GCRBKU.cjs +29 -0
- package/dist/lib/node/DocumentEditor-I5GCRBKU.cjs.map +7 -0
- package/dist/lib/node/MarkdownEditor-UE23H75V.cjs +31 -0
- package/dist/lib/node/MarkdownEditor-UE23H75V.cjs.map +7 -0
- package/dist/lib/node/chunk-7XIBNEI7.cjs +238 -0
- package/dist/lib/node/chunk-7XIBNEI7.cjs.map +7 -0
- package/dist/lib/node/chunk-KTYIOXL5.cjs +149 -0
- package/dist/lib/node/chunk-KTYIOXL5.cjs.map +7 -0
- package/dist/lib/node/chunk-Q4ZSCBQE.cjs +114 -0
- package/dist/lib/node/chunk-Q4ZSCBQE.cjs.map +7 -0
- package/dist/lib/node/chunk-RVGN72IX.cjs +189 -0
- package/dist/lib/node/chunk-RVGN72IX.cjs.map +7 -0
- package/dist/lib/node/chunk-TGMR2CKU.cjs +52 -0
- package/dist/lib/node/chunk-TGMR2CKU.cjs.map +7 -0
- package/dist/lib/node/{chunk-UJMOZCIA.cjs → chunk-VWQH4WC2.cjs} +8 -11
- package/dist/lib/node/chunk-VWQH4WC2.cjs.map +7 -0
- package/dist/lib/node/index.cjs +147 -112
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.cjs +3 -3
- package/dist/lib/node/meta.cjs.map +1 -1
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/types/index.cjs +6 -8
- package/dist/lib/node/types/index.cjs.map +2 -2
- package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
- package/dist/types/src/components/DocumentCard.d.ts +16 -0
- package/dist/types/src/components/DocumentCard.d.ts.map +1 -0
- package/dist/types/src/components/DocumentEditor.d.ts +14 -0
- package/dist/types/src/components/DocumentEditor.d.ts.map +1 -0
- package/dist/types/src/components/HeadingMenu.d.ts +13 -0
- package/dist/types/src/components/HeadingMenu.d.ts.map +1 -0
- package/dist/types/src/components/Layout.d.ts +6 -0
- package/dist/types/src/components/Layout.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownEditor.d.ts +3 -8
- package/dist/types/src/components/MarkdownEditor.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor.stories.d.ts +3 -3
- package/dist/types/src/components/MarkdownEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +11 -2
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/extensions.d.ts +15 -11
- package/dist/types/src/extensions.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +9 -4
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/types/document.d.ts +1 -10
- package/dist/types/src/types/document.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +9 -8
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/package.json +36 -41
- package/src/MarkdownPlugin.tsx +97 -50
- package/src/components/DocumentCard.tsx +107 -0
- package/src/components/DocumentEditor.tsx +137 -0
- package/src/components/HeadingMenu.tsx +46 -0
- package/src/components/Layout.tsx +27 -0
- package/src/components/MarkdownEditor.stories.tsx +7 -13
- package/src/components/MarkdownEditor.tsx +75 -40
- package/src/components/Toolbar.stories.tsx +2 -2
- package/src/components/index.ts +14 -2
- package/src/extensions.tsx +67 -124
- package/src/meta.tsx +19 -0
- package/src/types/document.ts +0 -12
- package/src/types/types.ts +7 -10
- package/src/util.tsx +2 -2
- package/dist/lib/browser/MarkdownContainer-AYBJNSXD.mjs +0 -467
- package/dist/lib/browser/MarkdownContainer-AYBJNSXD.mjs.map +0 -7
- package/dist/lib/browser/chunk-45N5MEOV.mjs +0 -50
- package/dist/lib/browser/chunk-45N5MEOV.mjs.map +0 -7
- package/dist/lib/browser/chunk-DRJ3FPYF.mjs +0 -15
- package/dist/lib/browser/chunk-DRJ3FPYF.mjs.map +0 -7
- package/dist/lib/browser/chunk-US5O2P3R.mjs.map +0 -7
- package/dist/lib/node/MarkdownContainer-IM3V72FY.cjs +0 -482
- package/dist/lib/node/MarkdownContainer-IM3V72FY.cjs.map +0 -7
- package/dist/lib/node/chunk-P7YU53RP.cjs.map +0 -7
- package/dist/lib/node/chunk-UJMOZCIA.cjs.map +0 -7
- package/dist/lib/node/chunk-W2YJVZ3N.cjs +0 -72
- package/dist/lib/node/chunk-W2YJVZ3N.cjs.map +0 -7
- package/dist/lib/node-esm/MarkdownContainer-56YBSFBE.mjs +0 -468
- package/dist/lib/node-esm/MarkdownContainer-56YBSFBE.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-MIDCCMIX.mjs +0 -42
- package/dist/lib/node-esm/chunk-MIDCCMIX.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-NEVN5WR6.mjs +0 -17
- package/dist/lib/node-esm/chunk-NEVN5WR6.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-UCNOGIBC.mjs +0 -51
- package/dist/lib/node-esm/chunk-UCNOGIBC.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -494
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/meta.mjs +0 -10
- package/dist/lib/node-esm/types/index.mjs +0 -15
- package/dist/types/src/components/MarkdownContainer.d.ts +0 -15
- package/dist/types/src/components/MarkdownContainer.d.ts.map +0 -1
- package/dist/types/src/hooks/index.d.ts +0 -2
- package/dist/types/src/hooks/index.d.ts.map +0 -1
- package/dist/types/src/hooks/useSelectCurrentThread.d.ts +0 -6
- package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +0 -1
- package/src/components/MarkdownContainer.tsx +0 -108
- package/src/hooks/index.ts +0 -5
- package/src/hooks/useSelectCurrentThread.tsx +0 -46
- package/src/meta.ts +0 -15
- /package/dist/lib/{node-esm/meta.mjs.map → browser/DocumentCard-2P4EICBA.mjs.map} +0 -0
- /package/dist/lib/{node-esm/types/index.mjs.map → browser/DocumentEditor-GPWV3VN3.mjs.map} +0 -0
package/src/extensions.tsx
CHANGED
|
@@ -2,117 +2,63 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
5
|
+
import { ArrowSquareDown, ArrowSquareOut, type Icon } from '@phosphor-icons/react';
|
|
6
|
+
import React, { type AnchorHTMLAttributes, StrictMode } from 'react';
|
|
6
7
|
import { createRoot } from 'react-dom/client';
|
|
7
8
|
|
|
8
|
-
import { type IntentDispatcher, NavigationAction
|
|
9
|
+
import { type IntentDispatcher, NavigationAction } from '@dxos/app-framework';
|
|
9
10
|
import { invariant } from '@dxos/invariant';
|
|
10
|
-
import {
|
|
11
|
-
import { useIdentity } from '@dxos/react-client/halo';
|
|
12
|
-
import { Icon, ThemeProvider } from '@dxos/react-ui';
|
|
13
|
-
import { createDataExtensions, listener, localStorageStateStoreAdapter, state } from '@dxos/react-ui-editor';
|
|
11
|
+
import { fullyQualifiedId, type Query } from '@dxos/react-client/echo';
|
|
14
12
|
import {
|
|
15
13
|
type AutocompleteResult,
|
|
16
|
-
type EditorViewMode,
|
|
17
14
|
type Extension,
|
|
18
|
-
|
|
15
|
+
type EditorViewMode,
|
|
19
16
|
autocomplete,
|
|
20
17
|
decorateMarkdown,
|
|
21
|
-
folding,
|
|
22
|
-
formattingKeymap,
|
|
23
18
|
linkTooltip,
|
|
24
19
|
typewriter,
|
|
20
|
+
formattingKeymap,
|
|
21
|
+
InputModeExtensions,
|
|
22
|
+
folding,
|
|
25
23
|
} from '@dxos/react-ui-editor';
|
|
26
|
-
import {
|
|
27
|
-
import { isNotFalsy } from '@dxos/util';
|
|
24
|
+
import { getSize, mx } from '@dxos/react-ui-theme';
|
|
25
|
+
import { isNotFalsy, nonNullable } from '@dxos/util';
|
|
28
26
|
|
|
29
|
-
import { type DocumentType, type
|
|
30
|
-
import { setFallbackName } from './util';
|
|
27
|
+
import { type DocumentType, type MarkdownSettingsProps } from './types';
|
|
31
28
|
|
|
32
|
-
type ExtensionsOptions = {
|
|
33
|
-
document: DocumentType;
|
|
34
|
-
dispatch?: IntentDispatcher;
|
|
35
|
-
query?: Query<DocumentType>;
|
|
36
|
-
settings: MarkdownSettingsProps;
|
|
29
|
+
export type ExtensionsOptions = {
|
|
37
30
|
viewMode?: EditorViewMode;
|
|
31
|
+
settings?: MarkdownSettingsProps;
|
|
32
|
+
document?: DocumentType;
|
|
33
|
+
debug?: boolean;
|
|
34
|
+
experimental?: boolean;
|
|
35
|
+
numberedHeadings?: boolean;
|
|
36
|
+
folding?: boolean;
|
|
37
|
+
query?: Query<DocumentType>;
|
|
38
|
+
dispatch?: IntentDispatcher;
|
|
38
39
|
};
|
|
39
40
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
settings,
|
|
41
|
+
/**
|
|
42
|
+
* Create extension instances for editor.
|
|
43
|
+
*/
|
|
44
|
+
export const createBaseExtensions = ({
|
|
45
45
|
viewMode,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
// TODO(wittjosiah): Autocomplete is not working and this query is causing performance issues.
|
|
53
|
-
// TODO(burdon): Unsubscribe.
|
|
54
|
-
// const query = space?.db.query(Filter.schema(DocumentType));
|
|
55
|
-
// query?.subscribe();
|
|
56
|
-
const baseExtensions = useMemo(
|
|
57
|
-
() =>
|
|
58
|
-
createBaseExtensions({
|
|
59
|
-
document,
|
|
60
|
-
settings,
|
|
61
|
-
viewMode,
|
|
62
|
-
dispatch,
|
|
63
|
-
// query,
|
|
64
|
-
}),
|
|
65
|
-
[document, viewMode, dispatch, settings, settings.folding, settings.numberedHeadings],
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
//
|
|
69
|
-
// External extensions from other plugins.
|
|
70
|
-
//
|
|
71
|
-
const pluginExtensions = useMemo<Extension[] | undefined>(
|
|
72
|
-
() =>
|
|
73
|
-
extensionProviders?.reduce((acc: Extension[], provider) => {
|
|
74
|
-
const extension = typeof provider === 'function' ? provider({ document }) : provider;
|
|
75
|
-
if (extension) {
|
|
76
|
-
acc.push(extension);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return acc;
|
|
80
|
-
}, []),
|
|
81
|
-
[extensionProviders],
|
|
82
|
-
);
|
|
46
|
+
settings,
|
|
47
|
+
document,
|
|
48
|
+
query,
|
|
49
|
+
dispatch,
|
|
50
|
+
}: ExtensionsOptions): Extension[] => {
|
|
51
|
+
const extensions: Extension[] = [];
|
|
83
52
|
|
|
84
53
|
//
|
|
85
|
-
//
|
|
54
|
+
// Editor mode.
|
|
86
55
|
//
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
text: document.content && createDocAccessor(document.content, ['content']),
|
|
94
|
-
space,
|
|
95
|
-
identity,
|
|
96
|
-
}),
|
|
97
|
-
state(localStorageStateStoreAdapter),
|
|
98
|
-
listener({
|
|
99
|
-
onChange: (text) => setFallbackName(document, text),
|
|
100
|
-
}),
|
|
101
|
-
baseExtensions,
|
|
102
|
-
pluginExtensions,
|
|
103
|
-
].filter(isNotFalsy),
|
|
104
|
-
[baseExtensions, pluginExtensions, document, document.content, space, identity],
|
|
105
|
-
);
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Create extension instances for editor.
|
|
110
|
-
*/
|
|
111
|
-
const createBaseExtensions = ({ document, dispatch, settings, query, viewMode }: ExtensionsOptions): Extension[] => {
|
|
112
|
-
const extensions: Extension[] = [
|
|
113
|
-
settings.editorInputMode && InputModeExtensions[settings.editorInputMode],
|
|
114
|
-
settings.folding && folding(),
|
|
115
|
-
].filter(isNotFalsy);
|
|
56
|
+
if (settings?.editorInputMode) {
|
|
57
|
+
const extension = InputModeExtensions[settings.editorInputMode];
|
|
58
|
+
if (extension) {
|
|
59
|
+
extensions.push(extension);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
116
62
|
|
|
117
63
|
//
|
|
118
64
|
// Markdown
|
|
@@ -123,7 +69,7 @@ const createBaseExtensions = ({ document, dispatch, settings, query, viewMode }:
|
|
|
123
69
|
formattingKeymap(),
|
|
124
70
|
decorateMarkdown({
|
|
125
71
|
selectionChangeDelay: 100,
|
|
126
|
-
numberedHeadings: settings
|
|
72
|
+
numberedHeadings: settings?.numberedHeadings ? { from: 2 } : undefined,
|
|
127
73
|
// TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
|
|
128
74
|
renderLinkButton:
|
|
129
75
|
dispatch && document
|
|
@@ -152,6 +98,7 @@ const createBaseExtensions = ({ document, dispatch, settings, query, viewMode }:
|
|
|
152
98
|
extensions.push(
|
|
153
99
|
autocomplete({
|
|
154
100
|
onSearch: (text: string) => {
|
|
101
|
+
// TODO query
|
|
155
102
|
// TODO(burdon): Specify filter (e.g., stack).
|
|
156
103
|
return query.objects
|
|
157
104
|
.map<AutocompleteResult | undefined>((object) =>
|
|
@@ -163,27 +110,29 @@ const createBaseExtensions = ({ document, dispatch, settings, query, viewMode }:
|
|
|
163
110
|
}
|
|
164
111
|
: undefined,
|
|
165
112
|
)
|
|
166
|
-
.filter(
|
|
113
|
+
.filter(nonNullable);
|
|
167
114
|
},
|
|
168
115
|
}),
|
|
169
116
|
);
|
|
170
117
|
}
|
|
171
118
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
119
|
+
extensions.push(
|
|
120
|
+
...[
|
|
121
|
+
//
|
|
122
|
+
settings?.folding && folding(),
|
|
123
|
+
].filter(isNotFalsy),
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
if (settings?.debug) {
|
|
127
|
+
const items = settings.typewriter ?? '';
|
|
128
|
+
extensions.push(...[items ? typewriter({ items: items.split(/[,\n]/) }) : undefined].filter(nonNullable));
|
|
177
129
|
}
|
|
178
130
|
|
|
179
131
|
return extensions;
|
|
180
132
|
};
|
|
181
133
|
|
|
182
|
-
// TODO(burdon): Factor out
|
|
183
|
-
const
|
|
184
|
-
hover: 'rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400',
|
|
185
|
-
icon: 'inline-block leading-none mis-1 cursor-pointer',
|
|
186
|
-
};
|
|
134
|
+
// TODO(burdon): Factor out style.
|
|
135
|
+
const hover = 'rounded-sm text-primary-600 hover:text-primary-500 dark:text-primary-300 hover:dark:text-primary-200';
|
|
187
136
|
|
|
188
137
|
const onRenderLink = (onSelectObject: (id: string) => void) => (el: Element, url: string) => {
|
|
189
138
|
// TODO(burdon): Formalize/document internal link format.
|
|
@@ -206,31 +155,25 @@ const onRenderLink = (onSelectObject: (id: string) => void) => (el: Element, url
|
|
|
206
155
|
target: '_blank',
|
|
207
156
|
};
|
|
208
157
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
</a>,
|
|
158
|
+
const LinkIcon: Icon = isInternal ? ArrowSquareDown : ArrowSquareOut;
|
|
159
|
+
|
|
160
|
+
createRoot(el).render(
|
|
161
|
+
<StrictMode>
|
|
162
|
+
<a {...options} className={hover}>
|
|
163
|
+
<LinkIcon weight='bold' className={mx(getSize(4), 'inline-block leading-none mis-1 cursor-pointer')} />
|
|
164
|
+
</a>
|
|
165
|
+
</StrictMode>,
|
|
218
166
|
);
|
|
219
167
|
};
|
|
220
168
|
|
|
221
169
|
const renderLinkTooltip = (el: Element, url: string) => {
|
|
222
170
|
const web = new URL(url);
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
171
|
+
createRoot(el).render(
|
|
172
|
+
<StrictMode>
|
|
173
|
+
<a href={url} target='_blank' rel='noreferrer' className={hover}>
|
|
174
|
+
{web.origin}
|
|
175
|
+
<ArrowSquareOut weight='bold' className={mx(getSize(4), 'inline-block leading-none mis-1 cursor-pointer')} />
|
|
176
|
+
</a>
|
|
177
|
+
</StrictMode>,
|
|
229
178
|
);
|
|
230
179
|
};
|
|
231
|
-
|
|
232
|
-
// TODO(burdon): Remove react rendering; use DOM directly.
|
|
233
|
-
export const renderRoot = <T extends Element>(root: T, node: ReactNode): T => {
|
|
234
|
-
createRoot(root).render(<ThemeProvider tx={defaultTx}>{node}</ThemeProvider>);
|
|
235
|
-
return root;
|
|
236
|
-
};
|
package/src/meta.tsx
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type IconProps, TextAa } from '@phosphor-icons/react';
|
|
6
|
+
import React from 'react';
|
|
7
|
+
|
|
8
|
+
import { pluginMeta } from '@dxos/app-framework';
|
|
9
|
+
|
|
10
|
+
export const MARKDOWN_PLUGIN = 'dxos.org/plugin/markdown';
|
|
11
|
+
|
|
12
|
+
export default pluginMeta({
|
|
13
|
+
id: MARKDOWN_PLUGIN,
|
|
14
|
+
name: 'Editor',
|
|
15
|
+
description: 'Markdown text editor.',
|
|
16
|
+
homePage: 'https://github.com/dxos/dxos/tree/main/packages/apps/plugins/plugin-markdown',
|
|
17
|
+
iconComponent: (props: IconProps) => <TextAa {...props} />,
|
|
18
|
+
iconSymbol: 'ph--text-aa--regular',
|
|
19
|
+
});
|
package/src/types/document.ts
CHANGED
|
@@ -15,15 +15,3 @@ export class DocumentType extends TypedObject({ typename: 'dxos.org/type/Documen
|
|
|
15
15
|
content: ref(TextType),
|
|
16
16
|
threads: S.mutable(S.Array(ref(ThreadType))),
|
|
17
17
|
}) {}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Checks if an object conforms to the interface needed to render an editor.
|
|
21
|
-
*/
|
|
22
|
-
// TODO(burdon): Normalize types (from FilesPlugin).
|
|
23
|
-
export const isEditorModel = (data: any): data is { id: string; text: string } =>
|
|
24
|
-
data &&
|
|
25
|
-
typeof data === 'object' &&
|
|
26
|
-
'id' in data &&
|
|
27
|
-
typeof data.id === 'string' &&
|
|
28
|
-
'text' in data &&
|
|
29
|
-
typeof data.text === 'string';
|
package/src/types/types.ts
CHANGED
|
@@ -12,7 +12,6 @@ import type {
|
|
|
12
12
|
TranslationsProvides,
|
|
13
13
|
} from '@dxos/app-framework';
|
|
14
14
|
import { type SchemaProvides } from '@dxos/plugin-client';
|
|
15
|
-
import { type SpaceInitProvides } from '@dxos/plugin-space';
|
|
16
15
|
import { type Extension, type EditorInputMode, type EditorViewMode } from '@dxos/react-ui-editor';
|
|
17
16
|
|
|
18
17
|
import { type DocumentType } from './document';
|
|
@@ -27,15 +26,13 @@ export enum MarkdownAction {
|
|
|
27
26
|
|
|
28
27
|
export type MarkdownProperties = Record<string, any>;
|
|
29
28
|
|
|
30
|
-
|
|
31
|
-
export type MarkdownExtensionProvider = (props: { document?: DocumentType }) => Extension | undefined;
|
|
29
|
+
export type ExtensionsProvider = (props: { document?: DocumentType }) => Extension[];
|
|
32
30
|
|
|
33
31
|
export type OnChange = (text: string) => void;
|
|
34
32
|
|
|
35
33
|
export type MarkdownExtensionProvides = {
|
|
36
|
-
// TODO(burdon): Rename.
|
|
37
34
|
markdown: {
|
|
38
|
-
extensions:
|
|
35
|
+
extensions: ExtensionsProvider;
|
|
39
36
|
};
|
|
40
37
|
};
|
|
41
38
|
|
|
@@ -48,11 +45,11 @@ type StackProvides = {
|
|
|
48
45
|
|
|
49
46
|
export type MarkdownPluginState = {
|
|
50
47
|
// Codemirror extensions provided by other plugins.
|
|
51
|
-
extensionProviders
|
|
48
|
+
extensionProviders: NonNullable<ExtensionsProvider>[];
|
|
52
49
|
|
|
53
50
|
// TODO(burdon): Extend view mode per document to include scroll position, etc.
|
|
54
51
|
// View mode per document.
|
|
55
|
-
viewMode:
|
|
52
|
+
viewMode: { [key: string]: EditorViewMode };
|
|
56
53
|
};
|
|
57
54
|
|
|
58
55
|
export type MarkdownSettingsProps = {
|
|
@@ -67,11 +64,12 @@ export type MarkdownSettingsProps = {
|
|
|
67
64
|
folding?: boolean;
|
|
68
65
|
};
|
|
69
66
|
|
|
70
|
-
// TODO(Zan): Move this to the plugin-space plugin or another common location
|
|
67
|
+
// TODO(Zan): Move this to the plugin-space plugin or another common location
|
|
68
|
+
// when we implement comments in sheets.
|
|
71
69
|
type ThreadProvides<T> = {
|
|
72
70
|
thread: {
|
|
73
71
|
predicate: (obj: any) => obj is T;
|
|
74
|
-
createSort: (obj: T) => (anchorA: string
|
|
72
|
+
createSort: (obj: T) => (anchorA: string, anchorB: string) => number;
|
|
75
73
|
};
|
|
76
74
|
};
|
|
77
75
|
|
|
@@ -83,6 +81,5 @@ export type MarkdownPluginProvides = SurfaceProvides &
|
|
|
83
81
|
SettingsProvides<MarkdownSettingsProps> &
|
|
84
82
|
TranslationsProvides &
|
|
85
83
|
SchemaProvides &
|
|
86
|
-
SpaceInitProvides &
|
|
87
84
|
StackProvides &
|
|
88
85
|
ThreadProvides<DocumentType>;
|
package/src/util.tsx
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { type Plugin } from '@dxos/app-framework';
|
|
6
6
|
import { debounce } from '@dxos/async';
|
|
7
7
|
import { type TypedObjectSerializer } from '@dxos/plugin-space/types';
|
|
8
|
-
import { create,
|
|
8
|
+
import { create, createEchoObject, isEchoObject, loadObjectReferences } from '@dxos/react-client/echo';
|
|
9
9
|
|
|
10
10
|
import { DocumentType, type MarkdownProperties, type MarkdownExtensionProvides, TextType } from './types';
|
|
11
11
|
|
|
@@ -43,6 +43,6 @@ export const serializer: TypedObjectSerializer<DocumentType> = {
|
|
|
43
43
|
|
|
44
44
|
deserialize: async ({ content: serialized }) => {
|
|
45
45
|
const { name, content } = JSON.parse(serialized);
|
|
46
|
-
return
|
|
46
|
+
return createEchoObject(create(DocumentType, { name, content: create(TextType, { content }), threads: [] }));
|
|
47
47
|
},
|
|
48
48
|
};
|