@uiw/react-md-editor 3.8.5 → 3.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -1
- package/esm/Context.d.ts +2 -0
- package/esm/Context.js.map +2 -2
- package/esm/Editor.d.ts +4 -0
- package/esm/Editor.js +3 -1
- package/esm/Editor.js.map +3 -2
- package/esm/components/TextArea/Textarea.js +2 -1
- package/esm/components/TextArea/Textarea.js.map +3 -2
- package/esm/components/TextArea/handleKeyDown.d.ts +1 -1
- package/esm/components/TextArea/handleKeyDown.js +12 -2
- package/esm/components/TextArea/handleKeyDown.js.map +3 -2
- package/esm/components/TextArea/index.css +1 -2
- package/esm/components/Toolbar/index.js +15 -3
- package/esm/components/Toolbar/index.js.map +7 -2
- package/esm/index.css +1 -1
- package/esm/index.less +1 -1
- package/lib/Context.d.ts +2 -0
- package/lib/Context.js.map +2 -2
- package/lib/Editor.d.ts +4 -0
- package/lib/Editor.js +4 -1
- package/lib/Editor.js.map +3 -2
- package/lib/components/TextArea/Textarea.js +2 -1
- package/lib/components/TextArea/Textarea.js.map +3 -2
- package/lib/components/TextArea/handleKeyDown.d.ts +1 -1
- package/lib/components/TextArea/handleKeyDown.js +8 -1
- package/lib/components/TextArea/handleKeyDown.js.map +3 -2
- package/lib/components/Toolbar/index.js +15 -2
- package/lib/components/Toolbar/index.js.map +6 -2
- package/lib/index.less +1 -1
- package/markdown-editor.css +2 -3
- package/package.json +12 -12
- package/src/Context.tsx +1 -0
- package/src/Editor.tsx +6 -1
- package/src/components/TextArea/Textarea.tsx +12 -3
- package/src/components/TextArea/handleKeyDown.tsx +11 -1
- package/src/components/Toolbar/index.tsx +15 -3
- package/src/index.less +1 -1
package/lib/Editor.js.map
CHANGED
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"minHeight",
|
|
35
35
|
"autoFocus",
|
|
36
36
|
"tabSize",
|
|
37
|
+
"defaultTabEnable",
|
|
37
38
|
"onChange",
|
|
38
39
|
"hideToolbar",
|
|
39
40
|
"renderTextarea",
|
|
@@ -86,8 +87,8 @@
|
|
|
86
87
|
"Markdown",
|
|
87
88
|
"MarkdownPreview"
|
|
88
89
|
],
|
|
89
|
-
"mappings": ";;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;
|
|
90
|
+
"mappings": "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",
|
|
90
91
|
"sourcesContent": [
|
|
91
|
-
"import React, { useEffect, useReducer, useMemo, useRef, useImperativeHandle } from 'react';\nimport MarkdownPreview, { MarkdownPreviewProps, MarkdownPreviewRef } from '@uiw/react-markdown-preview';\nimport TextArea, { ITextAreaProps } from './components/TextArea';\nimport Toolbar from './components/Toolbar';\nimport DragBar from './components/DragBar';\nimport { getCommands, getExtraCommands, ICommand } from './commands';\nimport { reducer, EditorContext, ContextStore, PreviewType } from './Context';\nimport './index.less';\n\nexport interface IProps {\n prefixCls?: string;\n className?: string;\n}\n\nexport interface MDEditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>, IProps {\n /**\n * The Markdown value.\n */\n value?: string;\n /**\n * Event handler for the `onChange` event.\n */\n onChange?: (value?: string) => void;\n /**\n * Can be used to make `Markdown Editor` focus itself on initialization. Defaults to on.\n * it will be set to true when either the source `textarea` is focused,\n * or it has an `autofocus` attribute and no other element is focused.\n */\n autoFocus?: ITextAreaProps['autoFocus'];\n /**\n * The height of the editor.\n */\n height?: number;\n /**\n * Custom toolbar heigth\n * @default 29px\n */\n toolbarHeight?: number;\n /**\n * Show drag and drop tool. Set the height of the editor.\n */\n visiableDragbar?: boolean;\n /**\n * Show markdown preview.\n */\n preview?: PreviewType;\n /**\n * Full screen display editor.\n */\n fullscreen?: boolean;\n /**\n * Maximum drag height. `visiableDragbar=true`\n */\n maxHeight?: number;\n /**\n * Minimum drag height. `visiableDragbar=true`\n */\n minHeight?: number;\n /**\n * This is reset [react-markdown](https://github.com/rexxars/react-markdown) settings.\n */\n previewOptions?: Omit<MarkdownPreviewProps, 'source'>;\n /**\n * Set the `textarea` related props.\n */\n textareaProps?: ITextAreaProps;\n /** Use div to replace TextArea or re-render TextArea */\n renderTextarea?: ITextAreaProps['renderTextarea'];\n /**\n * Disable editing area code highlighting. The value is `false`, which increases the editing speed.\n * @default true\n */\n highlightEnable?: boolean;\n /**\n * The number of characters to insert when pressing tab key.\n * Default `2` spaces.\n */\n tabSize?: number;\n /**\n * You can create your own commands or reuse existing commands.\n */\n commands?: ICommand[];\n /**\n * Filter or modify your commands.\n * https://github.com/uiwjs/react-md-editor/issues/296\n */\n commandsFilter?: (command: ICommand, isExtra: boolean) => false | ICommand;\n /**\n * You can create your own commands or reuse existing commands.\n */\n extraCommands?: ICommand[];\n /**\n * Hide the tool bar\n */\n hideToolbar?: boolean;\n /** Whether to enable scrolling */\n enableScroll?: boolean;\n}\n\nfunction setGroupPopFalse(data: Record<string, boolean> = {}) {\n Object.keys(data).forEach((keyname) => {\n data[keyname] = false;\n });\n return data;\n}\n\nconst InternalMDEditor = (\n props: MDEditorProps,\n ref?: ((instance: ContextStore) => void) | React.RefObject<ContextStore> | null,\n) => {\n const {\n prefixCls = 'w-md-editor',\n className,\n value: propsValue,\n commands = getCommands(),\n commandsFilter,\n extraCommands = getExtraCommands(),\n height = 200,\n toolbarHeight = 29,\n enableScroll = true,\n visiableDragbar = true,\n highlightEnable = true,\n preview: previewType = 'live',\n fullscreen = false,\n previewOptions = {},\n textareaProps,\n maxHeight = 1200,\n minHeight = 100,\n autoFocus,\n tabSize = 2,\n onChange,\n hideToolbar,\n renderTextarea,\n ...other\n } = props || {};\n\n const cmds = commands\n .map((item) => (commandsFilter ? commandsFilter(item, false) : item))\n .filter(Boolean) as ICommand[];\n const extraCmds = extraCommands\n .map((item) => (commandsFilter ? commandsFilter(item, true) : item))\n .filter(Boolean) as ICommand[];\n let [state, dispatch] = useReducer(reducer, {\n markdown: propsValue,\n preview: previewType,\n height,\n highlightEnable,\n tabSize,\n scrollTop: 0,\n scrollTopPreview: 0,\n commands: cmds,\n extraCommands: extraCmds,\n fullscreen,\n barPopup: {},\n });\n const container = useRef<HTMLDivElement>(null);\n const previewRef = useRef<MarkdownPreviewRef>(null);\n const enableScrollRef = useRef(enableScroll);\n\n useImperativeHandle(ref, () => ({ ...state }));\n useMemo(() => (enableScrollRef.current = enableScroll), [enableScroll]);\n useEffect(() => {\n const stateInit: ContextStore = {};\n if (container.current) {\n stateInit.container = container.current || undefined;\n }\n stateInit.markdown = propsValue || '';\n stateInit.barPopup = {};\n if (dispatch) {\n dispatch({ ...state, ...stateInit });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const cls = [\n className,\n prefixCls,\n state.preview ? `${prefixCls}-show-${state.preview}` : null,\n state.fullscreen ? `${prefixCls}-fullscreen` : null,\n ]\n .filter(Boolean)\n .join(' ')\n .trim();\n\n useMemo(\n () => propsValue !== state.markdown && dispatch({ markdown: propsValue || '' }),\n [propsValue, state.markdown],\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useMemo(() => previewType !== state.preview && dispatch({ preview: previewType }), [previewType]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useMemo(() => height !== state.height && dispatch({ height: height }), [height]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useMemo(() => tabSize !== state.tabSize && dispatch({ tabSize }), [tabSize]);\n useMemo(\n () => highlightEnable !== state.highlightEnable && dispatch({ highlightEnable }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [highlightEnable],\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useMemo(() => autoFocus !== state.autoFocus && dispatch({ autoFocus: autoFocus }), [autoFocus]);\n useMemo(\n () => fullscreen !== state.fullscreen && dispatch({ fullscreen: fullscreen }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [fullscreen],\n );\n\n const textareaDomRef = useRef<HTMLDivElement>();\n const active = useRef<'text' | 'preview'>('preview');\n const initScroll = useRef(false);\n\n useMemo(() => {\n textareaDomRef.current = state.textareaWarp;\n if (state.textareaWarp) {\n state.textareaWarp.addEventListener('mouseover', () => {\n active.current = 'text';\n });\n state.textareaWarp.addEventListener('mouseleave', () => {\n active.current = 'preview';\n });\n }\n }, [state.textareaWarp]);\n\n const handleScroll = (e: React.UIEvent<HTMLDivElement>, type: 'text' | 'preview') => {\n if (!enableScrollRef.current) return;\n const textareaDom = textareaDomRef.current;\n const previewDom = previewRef.current ? previewRef.current.mdp.current : undefined;\n if (!initScroll.current) {\n active.current = type;\n initScroll.current = true;\n }\n if (textareaDom && previewDom) {\n const scale =\n (textareaDom.scrollHeight - textareaDom.offsetHeight) / (previewDom.scrollHeight - previewDom.offsetHeight);\n if (e.target === textareaDom && active.current === 'text') {\n previewDom.scrollTop = textareaDom.scrollTop / scale;\n }\n if (e.target === previewDom && active.current === 'preview') {\n textareaDom.scrollTop = previewDom.scrollTop * scale;\n }\n let scrollTop = 0;\n if (active.current === 'text') {\n scrollTop = textareaDom.scrollTop || 0;\n } else if (active.current === 'preview') {\n scrollTop = previewDom.scrollTop || 0;\n }\n dispatch({ scrollTop });\n }\n };\n\n return (\n <EditorContext.Provider value={{ ...state, dispatch }}>\n <div\n ref={container}\n className={cls}\n {...other}\n onClick={() => {\n dispatch({ barPopup: { ...setGroupPopFalse(state.barPopup) } });\n }}\n style={{\n ...other.style,\n height: state.fullscreen ? '100%' : hideToolbar ? Number(state.height) - toolbarHeight : state.height,\n }}\n >\n {!hideToolbar && <Toolbar prefixCls={prefixCls} height={toolbarHeight} />}\n <div\n className={`${prefixCls}-content`}\n style={{\n height: state.fullscreen ? `calc(100% - ${toolbarHeight}px)` : Number(state.height) - toolbarHeight,\n }}\n >\n {/(edit|live)/.test(state.preview || '') && (\n <TextArea\n className={`${prefixCls}-input`}\n prefixCls={prefixCls}\n autoFocus={autoFocus}\n {...textareaProps}\n onChange={(evn) => {\n onChange && onChange(evn.target.value);\n if (textareaProps && textareaProps.onChange) {\n textareaProps.onChange(evn);\n }\n }}\n renderTextarea={renderTextarea}\n onScroll={(e) => handleScroll(e, 'text')}\n />\n )}\n {/(live|preview)/.test(state.preview || '') && (\n <MarkdownPreview\n {...previewOptions}\n onScroll={(e) => handleScroll(e, 'preview')}\n ref={previewRef}\n source={state.markdown || ''}\n className={`${prefixCls}-preview ${previewOptions.className || ''}`}\n />\n )}\n </div>\n {visiableDragbar && !state.fullscreen && (\n <DragBar\n prefixCls={prefixCls}\n height={state.height as number}\n maxHeight={maxHeight!}\n minHeight={minHeight!}\n onChange={(newHeight) => {\n dispatch({ height: newHeight });\n }}\n />\n )}\n </div>\n </EditorContext.Provider>\n );\n};\n\nconst mdEditor = React.forwardRef<ContextStore, MDEditorProps>(InternalMDEditor);\n\ntype MDEditor = typeof mdEditor & {\n Markdown: typeof MarkdownPreview;\n};\n\n(mdEditor as MDEditor).Markdown = MarkdownPreview;\n\nexport default mdEditor as MDEditor;\n"
|
|
92
|
+
"import React, { useEffect, useReducer, useMemo, useRef, useImperativeHandle } from 'react';\nimport MarkdownPreview, { MarkdownPreviewProps, MarkdownPreviewRef } from '@uiw/react-markdown-preview';\nimport TextArea, { ITextAreaProps } from './components/TextArea';\nimport Toolbar from './components/Toolbar';\nimport DragBar from './components/DragBar';\nimport { getCommands, getExtraCommands, ICommand } from './commands';\nimport { reducer, EditorContext, ContextStore, PreviewType } from './Context';\nimport './index.less';\n\nexport interface IProps {\n prefixCls?: string;\n className?: string;\n}\n\nexport interface MDEditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>, IProps {\n /**\n * The Markdown value.\n */\n value?: string;\n /**\n * Event handler for the `onChange` event.\n */\n onChange?: (value?: string) => void;\n /**\n * Can be used to make `Markdown Editor` focus itself on initialization. Defaults to on.\n * it will be set to true when either the source `textarea` is focused,\n * or it has an `autofocus` attribute and no other element is focused.\n */\n autoFocus?: ITextAreaProps['autoFocus'];\n /**\n * The height of the editor.\n */\n height?: number;\n /**\n * Custom toolbar heigth\n * @default 29px\n */\n toolbarHeight?: number;\n /**\n * Show drag and drop tool. Set the height of the editor.\n */\n visiableDragbar?: boolean;\n /**\n * Show markdown preview.\n */\n preview?: PreviewType;\n /**\n * Full screen display editor.\n */\n fullscreen?: boolean;\n /**\n * Maximum drag height. `visiableDragbar=true`\n */\n maxHeight?: number;\n /**\n * Minimum drag height. `visiableDragbar=true`\n */\n minHeight?: number;\n /**\n * This is reset [react-markdown](https://github.com/rexxars/react-markdown) settings.\n */\n previewOptions?: Omit<MarkdownPreviewProps, 'source'>;\n /**\n * Set the `textarea` related props.\n */\n textareaProps?: ITextAreaProps;\n /** Use div to replace TextArea or re-render TextArea */\n renderTextarea?: ITextAreaProps['renderTextarea'];\n /**\n * Disable editing area code highlighting. The value is `false`, which increases the editing speed.\n * @default true\n */\n highlightEnable?: boolean;\n /**\n * The number of characters to insert when pressing tab key.\n * Default `2` spaces.\n */\n tabSize?: number;\n /**\n * If `false`, the `tab` key inserts a tab character into the textarea. If `true`, the `tab` key executes default behavior e.g. focus shifts to next element.\n */\n defaultTabEnable?: boolean;\n /**\n * You can create your own commands or reuse existing commands.\n */\n commands?: ICommand[];\n /**\n * Filter or modify your commands.\n * https://github.com/uiwjs/react-md-editor/issues/296\n */\n commandsFilter?: (command: ICommand, isExtra: boolean) => false | ICommand;\n /**\n * You can create your own commands or reuse existing commands.\n */\n extraCommands?: ICommand[];\n /**\n * Hide the tool bar\n */\n hideToolbar?: boolean;\n /** Whether to enable scrolling */\n enableScroll?: boolean;\n}\n\nfunction setGroupPopFalse(data: Record<string, boolean> = {}) {\n Object.keys(data).forEach((keyname) => {\n data[keyname] = false;\n });\n return data;\n}\n\nconst InternalMDEditor = (\n props: MDEditorProps,\n ref?: ((instance: ContextStore) => void) | React.RefObject<ContextStore> | null,\n) => {\n const {\n prefixCls = 'w-md-editor',\n className,\n value: propsValue,\n commands = getCommands(),\n commandsFilter,\n extraCommands = getExtraCommands(),\n height = 200,\n toolbarHeight = 29,\n enableScroll = true,\n visiableDragbar = true,\n highlightEnable = true,\n preview: previewType = 'live',\n fullscreen = false,\n previewOptions = {},\n textareaProps,\n maxHeight = 1200,\n minHeight = 100,\n autoFocus,\n tabSize = 2,\n defaultTabEnable = false,\n onChange,\n hideToolbar,\n renderTextarea,\n ...other\n } = props || {};\n const cmds = commands\n .map((item) => (commandsFilter ? commandsFilter(item, false) : item))\n .filter(Boolean) as ICommand[];\n const extraCmds = extraCommands\n .map((item) => (commandsFilter ? commandsFilter(item, true) : item))\n .filter(Boolean) as ICommand[];\n let [state, dispatch] = useReducer(reducer, {\n markdown: propsValue,\n preview: previewType,\n height,\n highlightEnable,\n tabSize,\n defaultTabEnable,\n scrollTop: 0,\n scrollTopPreview: 0,\n commands: cmds,\n extraCommands: extraCmds,\n fullscreen,\n barPopup: {},\n });\n const container = useRef<HTMLDivElement>(null);\n const previewRef = useRef<MarkdownPreviewRef>(null);\n const enableScrollRef = useRef(enableScroll);\n\n useImperativeHandle(ref, () => ({ ...state }));\n useMemo(() => (enableScrollRef.current = enableScroll), [enableScroll]);\n useEffect(() => {\n const stateInit: ContextStore = {};\n if (container.current) {\n stateInit.container = container.current || undefined;\n }\n stateInit.markdown = propsValue || '';\n stateInit.barPopup = {};\n if (dispatch) {\n dispatch({ ...state, ...stateInit });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const cls = [\n className,\n prefixCls,\n state.preview ? `${prefixCls}-show-${state.preview}` : null,\n state.fullscreen ? `${prefixCls}-fullscreen` : null,\n ]\n .filter(Boolean)\n .join(' ')\n .trim();\n\n useMemo(\n () => propsValue !== state.markdown && dispatch({ markdown: propsValue || '' }),\n [propsValue, state.markdown],\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useMemo(() => previewType !== state.preview && dispatch({ preview: previewType }), [previewType]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useMemo(() => height !== state.height && dispatch({ height: height }), [height]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useMemo(() => tabSize !== state.tabSize && dispatch({ tabSize }), [tabSize]);\n useMemo(\n () => highlightEnable !== state.highlightEnable && dispatch({ highlightEnable }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [highlightEnable],\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useMemo(() => autoFocus !== state.autoFocus && dispatch({ autoFocus: autoFocus }), [autoFocus]);\n useMemo(\n () => fullscreen !== state.fullscreen && dispatch({ fullscreen: fullscreen }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [fullscreen],\n );\n\n const textareaDomRef = useRef<HTMLDivElement>();\n const active = useRef<'text' | 'preview'>('preview');\n const initScroll = useRef(false);\n\n useMemo(() => {\n textareaDomRef.current = state.textareaWarp;\n if (state.textareaWarp) {\n state.textareaWarp.addEventListener('mouseover', () => {\n active.current = 'text';\n });\n state.textareaWarp.addEventListener('mouseleave', () => {\n active.current = 'preview';\n });\n }\n }, [state.textareaWarp]);\n\n const handleScroll = (e: React.UIEvent<HTMLDivElement>, type: 'text' | 'preview') => {\n if (!enableScrollRef.current) return;\n const textareaDom = textareaDomRef.current;\n const previewDom = previewRef.current ? previewRef.current.mdp.current : undefined;\n if (!initScroll.current) {\n active.current = type;\n initScroll.current = true;\n }\n if (textareaDom && previewDom) {\n const scale =\n (textareaDom.scrollHeight - textareaDom.offsetHeight) / (previewDom.scrollHeight - previewDom.offsetHeight);\n if (e.target === textareaDom && active.current === 'text') {\n previewDom.scrollTop = textareaDom.scrollTop / scale;\n }\n if (e.target === previewDom && active.current === 'preview') {\n textareaDom.scrollTop = previewDom.scrollTop * scale;\n }\n let scrollTop = 0;\n if (active.current === 'text') {\n scrollTop = textareaDom.scrollTop || 0;\n } else if (active.current === 'preview') {\n scrollTop = previewDom.scrollTop || 0;\n }\n dispatch({ scrollTop });\n }\n };\n\n return (\n <EditorContext.Provider value={{ ...state, dispatch }}>\n <div\n ref={container}\n className={cls}\n {...other}\n onClick={() => {\n dispatch({ barPopup: { ...setGroupPopFalse(state.barPopup) } });\n }}\n style={{\n ...other.style,\n height: state.fullscreen ? '100%' : hideToolbar ? Number(state.height) - toolbarHeight : state.height,\n }}\n >\n {!hideToolbar && <Toolbar prefixCls={prefixCls} height={toolbarHeight} />}\n <div\n className={`${prefixCls}-content`}\n style={{\n height: state.fullscreen ? `calc(100% - ${toolbarHeight}px)` : Number(state.height) - toolbarHeight,\n }}\n >\n {/(edit|live)/.test(state.preview || '') && (\n <TextArea\n className={`${prefixCls}-input`}\n prefixCls={prefixCls}\n autoFocus={autoFocus}\n {...textareaProps}\n onChange={(evn) => {\n onChange && onChange(evn.target.value);\n if (textareaProps && textareaProps.onChange) {\n textareaProps.onChange(evn);\n }\n }}\n renderTextarea={renderTextarea}\n onScroll={(e) => handleScroll(e, 'text')}\n />\n )}\n {/(live|preview)/.test(state.preview || '') && (\n <MarkdownPreview\n {...previewOptions}\n onScroll={(e) => handleScroll(e, 'preview')}\n ref={previewRef}\n source={state.markdown || ''}\n className={`${prefixCls}-preview ${previewOptions.className || ''}`}\n />\n )}\n </div>\n {visiableDragbar && !state.fullscreen && (\n <DragBar\n prefixCls={prefixCls}\n height={state.height as number}\n maxHeight={maxHeight!}\n minHeight={minHeight!}\n onChange={(newHeight) => {\n dispatch({ height: newHeight });\n }}\n />\n )}\n </div>\n </EditorContext.Provider>\n );\n};\n\nconst mdEditor = React.forwardRef<ContextStore, MDEditorProps>(InternalMDEditor);\n\ntype MDEditor = typeof mdEditor & {\n Markdown: typeof MarkdownPreview;\n};\n\n(mdEditor as MDEditor).Markdown = MarkdownPreview;\n\nexport default mdEditor as MDEditor;\n"
|
|
92
93
|
]
|
|
93
94
|
}
|
|
@@ -42,6 +42,7 @@ function Textarea(props) {
|
|
|
42
42
|
highlightEnable = _useContext.highlightEnable,
|
|
43
43
|
extraCommands = _useContext.extraCommands,
|
|
44
44
|
tabSize = _useContext.tabSize,
|
|
45
|
+
defaultTabEnable = _useContext.defaultTabEnable,
|
|
45
46
|
dispatch = _useContext.dispatch;
|
|
46
47
|
|
|
47
48
|
var textRef = _react.default.useRef(null);
|
|
@@ -73,7 +74,7 @@ function Textarea(props) {
|
|
|
73
74
|
}, []);
|
|
74
75
|
|
|
75
76
|
var onKeyDown = function onKeyDown(e) {
|
|
76
|
-
(0, _handleKeyDown.default)(e, tabSize);
|
|
77
|
+
(0, _handleKeyDown.default)(e, tabSize, defaultTabEnable);
|
|
77
78
|
(0, _shortcuts.default)(e, [].concat((0, _toConsumableArray2.default)(commands || []), (0, _toConsumableArray2.default)(extraCommands || [])), executeRef.current, dispatch, statesRef.current);
|
|
78
79
|
};
|
|
79
80
|
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"highlightEnable",
|
|
18
18
|
"extraCommands",
|
|
19
19
|
"tabSize",
|
|
20
|
+
"defaultTabEnable",
|
|
20
21
|
"dispatch",
|
|
21
22
|
"textRef",
|
|
22
23
|
"React",
|
|
@@ -35,8 +36,8 @@
|
|
|
35
36
|
"target",
|
|
36
37
|
"value"
|
|
37
38
|
],
|
|
38
|
-
"mappings": ";;;;;;;;;;;;;;;;;AAAA;;AAEA;;AACA;;AACA;;AACA;;;;;;AAKe,SAASA,QAAT,CAAkBC,KAAlB,EAAwC;AACrD,MAAQC,SAAR,GAA0CD,KAA1C,CAAQC,SAAR;AAAA,MAAmBC,SAAnB,GAA0CF,KAA1C,CAAmBE,QAAnB;AAAA,MAAgCC,KAAhC,0CAA0CH,KAA1C;;AACA,
|
|
39
|
+
"mappings": ";;;;;;;;;;;;;;;;;AAAA;;AAEA;;AACA;;AACA;;AACA;;;;;;AAKe,SAASA,QAAT,CAAkBC,KAAlB,EAAwC;AACrD,MAAQC,SAAR,GAA0CD,KAA1C,CAAQC,SAAR;AAAA,MAAmBC,SAAnB,GAA0CF,KAA1C,CAAmBE,QAAnB;AAAA,MAAgCC,KAAhC,0CAA0CH,KAA1C;;AACA,oBAUI,uBAAWI,sBAAX,CAVJ;AAAA,MACEC,QADF,eACEA,QADF;AAAA,MAEEC,QAFF,eAEEA,QAFF;AAAA,MAGEC,UAHF,eAGEA,UAHF;AAAA,MAIEC,OAJF,eAIEA,OAJF;AAAA,MAKEC,eALF,eAKEA,eALF;AAAA,MAMEC,aANF,eAMEA,aANF;AAAA,MAOEC,OAPF,eAOEA,OAPF;AAAA,MAQEC,gBARF,eAQEA,gBARF;AAAA,MASEC,QATF,eASEA,QATF;;AAWA,MAAMC,OAAO,GAAGC,eAAMC,MAAN,CAAkC,IAAlC,CAAhB;;AACA,MAAMC,UAAU,GAAGF,eAAMC,MAAN,EAAnB;;AACA,MAAME,SAAS,GAAGH,eAAMC,MAAN,CAAkC;AAAET,IAAAA,UAAU,EAAVA,UAAF;AAAcC,IAAAA,OAAO,EAAPA;AAAd,GAAlC,CAAlB;;AAEA,wBAAU,YAAM;AACdU,IAAAA,SAAS,CAACC,OAAV,GAAoB;AAAEZ,MAAAA,UAAU,EAAVA,UAAF;AAAcC,MAAAA,OAAO,EAAPA,OAAd;AAAuBC,MAAAA,eAAe,EAAfA;AAAvB,KAApB;AACD,GAFD,EAEG,CAACF,UAAD,EAAaC,OAAb,EAAsBC,eAAtB,CAFH;AAIA,wBAAU,YAAM;AACd,QAAIK,OAAO,CAACK,OAAR,IAAmBN,QAAvB,EAAiC;AAC/B,UAAMO,mBAAmB,GAAG,IAAIC,qCAAJ,CAAgCP,OAAO,CAACK,OAAxC,CAA5B;AACAF,MAAAA,UAAU,CAACE,OAAX,GAAqBC,mBAArB;AACAP,MAAAA,QAAQ,CAAC;AAAES,QAAAA,QAAQ,EAAER,OAAO,CAACK,OAApB;AAA6BC,QAAAA,mBAAmB,EAAnBA;AAA7B,OAAD,CAAR;AACD,KALa,CAMd;;AACD,GAPD,EAOG,EAPH;;AASA,MAAMG,SAAS,GAAG,SAAZA,SAAY,CAACC,CAAD,EAAiE;AACjF,gCAAcA,CAAd,EAAiBb,OAAjB,EAA0BC,gBAA1B;AACA,4BAAUY,CAAV,6CAAkBlB,QAAQ,IAAI,EAA9B,oCAAuCI,aAAa,IAAI,EAAxD,IAA8DO,UAAU,CAACE,OAAzE,EAAkFN,QAAlF,EAA4FK,SAAS,CAACC,OAAtG;AACD,GAHD;;AAIA,wBAAU,YAAM;AACd,QAAIL,OAAO,CAACK,OAAZ,EAAqB;AACnBL,MAAAA,OAAO,CAACK,OAAR,CAAgBM,gBAAhB,CAAiC,SAAjC,EAA4CF,SAA5C;AACD;;AACD,WAAO,YAAM;AACX,UAAIT,OAAO,CAACK,OAAZ,EAAqB;AACnB;AACAL,QAAAA,OAAO,CAACK,OAAR,CAAgBO,mBAAhB,CAAoC,SAApC,EAA+CH,SAA/C;AACD;AACF,KALD,CAJc,CAUd;AACD,GAXD,EAWG,EAXH;AAaA,sBACE;AACE,IAAA,YAAY,EAAC,KADf;AAEE,IAAA,WAAW,EAAC,KAFd;AAGE,IAAA,cAAc,EAAC,KAHjB;AAIE,IAAA,UAAU,EAAE;AAJd,KAKMpB,KALN;AAME,IAAA,GAAG,EAAEW,OANP;AAOE,IAAA,SAAS,YAAKb,SAAL,yBAA6BE,KAAK,CAACwB,SAAN,GAAkBxB,KAAK,CAACwB,SAAxB,GAAoC,EAAjE,CAPX;AAQE,IAAA,KAAK,EAAEtB,QART;AASE,IAAA,QAAQ,EAAE,kBAACmB,CAAD,EAAO;AACfX,MAAAA,QAAQ,IAAIA,QAAQ,CAAC;AAAER,QAAAA,QAAQ,EAAEmB,CAAC,CAACI,MAAF,CAASC;AAArB,OAAD,CAApB;AACA3B,MAAAA,SAAQ,IAAIA,SAAQ,CAACsB,CAAD,CAApB;AACD;AAZH,KADF;AAgBD",
|
|
39
40
|
"sourcesContent": [
|
|
40
|
-
"import React, { useContext, useEffect } from 'react';\nimport { IProps } from '../../Editor';\nimport { EditorContext, ExecuteCommandState } from '../../Context';\nimport { TextAreaCommandOrchestrator } from '../../commands';\nimport handleKeyDown from './handleKeyDown';\nimport shortcuts from './shortcuts';\nimport './index.less';\n\nexport interface TextAreaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'value'>, IProps {}\n\nexport default function Textarea(props: TextAreaProps) {\n const { prefixCls, onChange, ...other } = props;\n const {
|
|
41
|
+
"import React, { useContext, useEffect } from 'react';\nimport { IProps } from '../../Editor';\nimport { EditorContext, ExecuteCommandState } from '../../Context';\nimport { TextAreaCommandOrchestrator } from '../../commands';\nimport handleKeyDown from './handleKeyDown';\nimport shortcuts from './shortcuts';\nimport './index.less';\n\nexport interface TextAreaProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'value'>, IProps {}\n\nexport default function Textarea(props: TextAreaProps) {\n const { prefixCls, onChange, ...other } = props;\n const {\n markdown,\n commands,\n fullscreen,\n preview,\n highlightEnable,\n extraCommands,\n tabSize,\n defaultTabEnable,\n dispatch,\n } = useContext(EditorContext);\n const textRef = React.useRef<HTMLTextAreaElement>(null);\n const executeRef = React.useRef<TextAreaCommandOrchestrator>();\n const statesRef = React.useRef<ExecuteCommandState>({ fullscreen, preview });\n\n useEffect(() => {\n statesRef.current = { fullscreen, preview, highlightEnable };\n }, [fullscreen, preview, highlightEnable]);\n\n useEffect(() => {\n if (textRef.current && dispatch) {\n const commandOrchestrator = new TextAreaCommandOrchestrator(textRef.current);\n executeRef.current = commandOrchestrator;\n dispatch({ textarea: textRef.current, commandOrchestrator });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const onKeyDown = (e: KeyboardEvent | React.KeyboardEvent<HTMLTextAreaElement>) => {\n handleKeyDown(e, tabSize, defaultTabEnable);\n shortcuts(e, [...(commands || []), ...(extraCommands || [])], executeRef.current, dispatch, statesRef.current);\n };\n useEffect(() => {\n if (textRef.current) {\n textRef.current.addEventListener('keydown', onKeyDown);\n }\n return () => {\n if (textRef.current) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n textRef.current.removeEventListener('keydown', onKeyDown);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <textarea\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n {...other}\n ref={textRef}\n className={`${prefixCls}-text-input ${other.className ? other.className : ''}`}\n value={markdown}\n onChange={(e) => {\n dispatch && dispatch({ markdown: e.target.value });\n onChange && onChange(e);\n }}\n />\n );\n}\n"
|
|
41
42
|
]
|
|
42
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export default function handleKeyDown(e: KeyboardEvent | React.KeyboardEvent<HTMLTextAreaElement>, tabSize?: number): void;
|
|
1
|
+
export default function handleKeyDown(e: KeyboardEvent | React.KeyboardEvent<HTMLTextAreaElement>, tabSize?: number, defaultTabEnable?: boolean): void;
|
|
@@ -22,6 +22,7 @@ function stopPropagation(e) {
|
|
|
22
22
|
|
|
23
23
|
function handleKeyDown(e) {
|
|
24
24
|
var tabSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;
|
|
25
|
+
var defaultTabEnable = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
25
26
|
var target = e.target;
|
|
26
27
|
var starVal = target.value.substr(0, target.selectionStart);
|
|
27
28
|
var valArr = starVal.split('\n');
|
|
@@ -31,7 +32,7 @@ function handleKeyDown(e) {
|
|
|
31
32
|
* `9` - `Tab`
|
|
32
33
|
*/
|
|
33
34
|
|
|
34
|
-
if (e.code && e.code.toLowerCase() === 'tab') {
|
|
35
|
+
if (!defaultTabEnable && e.code && e.code.toLowerCase() === 'tab') {
|
|
35
36
|
stopPropagation(e);
|
|
36
37
|
var space = new Array(tabSize + 1).join(' ');
|
|
37
38
|
|
|
@@ -85,6 +86,12 @@ function handleKeyDown(e) {
|
|
|
85
86
|
startStr = '\n* ';
|
|
86
87
|
}
|
|
87
88
|
|
|
89
|
+
if (currentLineStr.startsWith('- [ ]')) {
|
|
90
|
+
startStr = '\n- [ ] ';
|
|
91
|
+
} else if (currentLineStr.startsWith('- [X]')) {
|
|
92
|
+
startStr = '\n- [X] ';
|
|
93
|
+
}
|
|
94
|
+
|
|
88
95
|
if (/^\d+.\s/.test(currentLineStr)) {
|
|
89
96
|
startStr = "\n".concat(parseInt(currentLineStr) + 1, ". ");
|
|
90
97
|
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"preventDefault",
|
|
10
10
|
"handleKeyDown",
|
|
11
11
|
"tabSize",
|
|
12
|
+
"defaultTabEnable",
|
|
12
13
|
"target",
|
|
13
14
|
"starVal",
|
|
14
15
|
"value",
|
|
@@ -55,8 +56,8 @@
|
|
|
55
56
|
"startsWith",
|
|
56
57
|
"parseInt"
|
|
57
58
|
],
|
|
58
|
-
"mappings": ";;;;;;;AAAA;;AACA;;AACA;;AAEA;AACA;AACA;AACA;AACA,SAASA,eAAT,CAAyBC,CAAzB,EAAsF;AACpFA,EAAAA,CAAC,CAACD,eAAF;AACAC,EAAAA,CAAC,CAACC,cAAF;AACD;;AAEc,SAASC,aAAT,CACbF,CADa,
|
|
59
|
+
"mappings": "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",
|
|
59
60
|
"sourcesContent": [
|
|
60
|
-
"import { insertTextAtPosition } from '../../utils/InsertTextAtPosition';\nimport { TextAreaTextApi } from '../../commands';\nimport { insertBeforeEachLine } from '../../commands/list';\n\n/**\n * - `13` - `Enter`\n * - `9` - `Tab`\n */\nfunction stopPropagation(e: KeyboardEvent | React.KeyboardEvent<HTMLTextAreaElement>) {\n e.stopPropagation();\n e.preventDefault();\n}\n\nexport default function handleKeyDown(\n e: KeyboardEvent | React.KeyboardEvent<HTMLTextAreaElement>,\n tabSize: number = 2,\n) {\n const target = e.target as HTMLTextAreaElement;\n const starVal = target.value.substr(0, target.selectionStart);\n const valArr = starVal.split('\\n');\n const currentLineStr = valArr[valArr.length - 1];\n const textArea = new TextAreaTextApi(target);\n /**\n * `9` - `Tab`\n */\n if (e.code && e.code.toLowerCase() === 'tab') {\n stopPropagation(e);\n const space = new Array(tabSize + 1).join(' ');\n if (target.selectionStart !== target.selectionEnd) {\n const _star = target.value.substring(0, target.selectionStart).split('\\n');\n const _end = target.value.substring(0, target.selectionEnd).split('\\n');\n const modifiedTextLine: string[] = [];\n _end.forEach((item, idx) => {\n if (item !== _star[idx]) {\n modifiedTextLine.push(item);\n }\n });\n const modifiedText = modifiedTextLine.join('\\n');\n const oldSelectText = target.value.substring(target.selectionStart, target.selectionEnd);\n const newStarNum = target.value.substring(0, target.selectionStart).length;\n\n textArea.setSelectionRange({\n start: target.value.indexOf(modifiedText),\n end: target.selectionEnd,\n });\n\n const modifiedTextObj = insertBeforeEachLine(modifiedText, e.shiftKey ? '' : space);\n\n let text = modifiedTextObj.modifiedText;\n if (e.shiftKey) {\n text = text\n .split('\\n')\n .map((item) => item.replace(new RegExp(`^${space}`), ''))\n .join('\\n');\n }\n textArea.replaceSelection(text);\n\n let startTabSize = e.shiftKey ? -tabSize : tabSize;\n let endTabSize = e.shiftKey ? -modifiedTextLine.length * tabSize : modifiedTextLine.length * tabSize;\n\n textArea.setSelectionRange({\n start: newStarNum + startTabSize,\n end: newStarNum + oldSelectText.length + endTabSize,\n });\n } else {\n return insertTextAtPosition(target, space);\n }\n } else if (\n e.code &&\n e.code.toLowerCase() === 'enter' &&\n (/^(-|\\*)\\s/.test(currentLineStr) || /^\\d+.\\s/.test(currentLineStr))\n ) {\n /**\n * `13` - `Enter`\n */\n stopPropagation(e);\n let startStr = '\\n- ';\n if (currentLineStr.startsWith('*')) {\n startStr = '\\n* ';\n }\n if (/^\\d+.\\s/.test(currentLineStr)) {\n startStr = `\\n${parseInt(currentLineStr) + 1}. `;\n }\n return insertTextAtPosition(target, startStr);\n }\n}\n"
|
|
61
|
+
"import { insertTextAtPosition } from '../../utils/InsertTextAtPosition';\nimport { TextAreaTextApi } from '../../commands';\nimport { insertBeforeEachLine } from '../../commands/list';\n\n/**\n * - `13` - `Enter`\n * - `9` - `Tab`\n */\nfunction stopPropagation(e: KeyboardEvent | React.KeyboardEvent<HTMLTextAreaElement>) {\n e.stopPropagation();\n e.preventDefault();\n}\n\nexport default function handleKeyDown(\n e: KeyboardEvent | React.KeyboardEvent<HTMLTextAreaElement>,\n tabSize: number = 2,\n defaultTabEnable: boolean = false,\n) {\n const target = e.target as HTMLTextAreaElement;\n const starVal = target.value.substr(0, target.selectionStart);\n const valArr = starVal.split('\\n');\n const currentLineStr = valArr[valArr.length - 1];\n const textArea = new TextAreaTextApi(target);\n\n /**\n * `9` - `Tab`\n */\n if (!defaultTabEnable && e.code && e.code.toLowerCase() === 'tab') {\n stopPropagation(e);\n const space = new Array(tabSize + 1).join(' ');\n if (target.selectionStart !== target.selectionEnd) {\n const _star = target.value.substring(0, target.selectionStart).split('\\n');\n const _end = target.value.substring(0, target.selectionEnd).split('\\n');\n const modifiedTextLine: string[] = [];\n _end.forEach((item, idx) => {\n if (item !== _star[idx]) {\n modifiedTextLine.push(item);\n }\n });\n const modifiedText = modifiedTextLine.join('\\n');\n const oldSelectText = target.value.substring(target.selectionStart, target.selectionEnd);\n const newStarNum = target.value.substring(0, target.selectionStart).length;\n\n textArea.setSelectionRange({\n start: target.value.indexOf(modifiedText),\n end: target.selectionEnd,\n });\n\n const modifiedTextObj = insertBeforeEachLine(modifiedText, e.shiftKey ? '' : space);\n\n let text = modifiedTextObj.modifiedText;\n if (e.shiftKey) {\n text = text\n .split('\\n')\n .map((item) => item.replace(new RegExp(`^${space}`), ''))\n .join('\\n');\n }\n textArea.replaceSelection(text);\n\n let startTabSize = e.shiftKey ? -tabSize : tabSize;\n let endTabSize = e.shiftKey ? -modifiedTextLine.length * tabSize : modifiedTextLine.length * tabSize;\n\n textArea.setSelectionRange({\n start: newStarNum + startTabSize,\n end: newStarNum + oldSelectText.length + endTabSize,\n });\n } else {\n return insertTextAtPosition(target, space);\n }\n } else if (\n e.code &&\n e.code.toLowerCase() === 'enter' &&\n (/^(-|\\*)\\s/.test(currentLineStr) || /^\\d+.\\s/.test(currentLineStr))\n ) {\n /**\n * `13` - `Enter`\n */\n stopPropagation(e);\n let startStr = '\\n- ';\n\n if (currentLineStr.startsWith('*')) {\n startStr = '\\n* ';\n }\n\n if (currentLineStr.startsWith('- [ ]')) {\n startStr = '\\n- [ ] ';\n } else if (currentLineStr.startsWith('- [X]')) {\n startStr = '\\n- [X] ';\n }\n\n if (/^\\d+.\\s/.test(currentLineStr)) {\n startStr = `\\n${parseInt(currentLineStr) + 1}. `;\n }\n return insertTextAtPosition(target, startStr);\n }\n}\n"
|
|
61
62
|
]
|
|
62
63
|
}
|
|
@@ -31,6 +31,8 @@ function ToolbarItems(props) {
|
|
|
31
31
|
commandOrchestrator = _useContext.commandOrchestrator,
|
|
32
32
|
dispatch = _useContext.dispatch;
|
|
33
33
|
|
|
34
|
+
var originalOverflow = (0, _react.useRef)('');
|
|
35
|
+
|
|
34
36
|
function handleClick(command, name) {
|
|
35
37
|
if (!dispatch) return;
|
|
36
38
|
var state = {
|
|
@@ -68,9 +70,20 @@ function ToolbarItems(props) {
|
|
|
68
70
|
|
|
69
71
|
(0, _react.useEffect)(function () {
|
|
70
72
|
if (document) {
|
|
71
|
-
|
|
73
|
+
if (fullscreen) {
|
|
74
|
+
// prevent scroll on fullscreen
|
|
75
|
+
document.body.style.overflow = 'hidden';
|
|
76
|
+
} else {
|
|
77
|
+
// get the original overflow only the first time
|
|
78
|
+
if (!originalOverflow.current) {
|
|
79
|
+
originalOverflow.current = window.getComputedStyle(document.body, null).overflow;
|
|
80
|
+
} // reset to the original overflow
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
document.body.style.overflow = originalOverflow.current;
|
|
84
|
+
}
|
|
72
85
|
}
|
|
73
|
-
}, [fullscreen]);
|
|
86
|
+
}, [fullscreen, originalOverflow]);
|
|
74
87
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)("ul", {
|
|
75
88
|
children: (props.commands || []).map(function (item, idx) {
|
|
76
89
|
if (item.keyCommand === 'divider') {
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"barPopup",
|
|
14
14
|
"commandOrchestrator",
|
|
15
15
|
"dispatch",
|
|
16
|
+
"originalOverflow",
|
|
16
17
|
"handleClick",
|
|
17
18
|
"command",
|
|
18
19
|
"name",
|
|
@@ -33,6 +34,9 @@
|
|
|
33
34
|
"body",
|
|
34
35
|
"style",
|
|
35
36
|
"overflow",
|
|
37
|
+
"current",
|
|
38
|
+
"window",
|
|
39
|
+
"getComputedStyle",
|
|
36
40
|
"map",
|
|
37
41
|
"idx",
|
|
38
42
|
"liProps",
|
|
@@ -61,8 +65,8 @@
|
|
|
61
65
|
"isChild",
|
|
62
66
|
"extraCommands"
|
|
63
67
|
],
|
|
64
|
-
"mappings": ";;;;;;;;;;;;;;AAAA;;AAEA;;AAEA;;;;AAUO,SAASA,YAAT,CAAsBC,KAAtB,EAA4C;AACjD,MAAQC,SAAR,GAAsBD,KAAtB,CAAQC,SAAR;;AACA,oBAA8E,uBAAWC,sBAAX,CAA9E;AAAA,MAAQC,UAAR,eAAQA,UAAR;AAAA,MAAoBC,OAApB,eAAoBA,OAApB;AAAA,yCAA6BC,QAA7B;AAAA,MAA6BA,QAA7B,qCAAwC,EAAxC;AAAA,MAA4CC,mBAA5C,eAA4CA,mBAA5C;AAAA,MAAiEC,QAAjE,eAAiEA,QAAjE;;AACA,WAASC,WAAT,CAAqBC,OAArB,EAAgDC,IAAhD,EAA+D;AAC7D,QAAI,
|
|
68
|
+
"mappings": "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",
|
|
65
69
|
"sourcesContent": [
|
|
66
|
-
"import React, { Fragment, useContext, useEffect } from 'react';\nimport { IProps } from '../../Editor';\nimport { EditorContext, PreviewType, ContextStore } from '../../Context';\nimport { ICommand } from '../../commands';\nimport Child from './Child';\nimport './index.less';\n\nexport interface IToolbarProps extends IProps {\n height?: React.CSSProperties['height'];\n onCommand?: (command: ICommand<string>, groupName?: string) => void;\n commands?: ICommand<string>[];\n isChild?: boolean;\n}\n\nexport function ToolbarItems(props: IToolbarProps) {\n const { prefixCls } = props;\n const { fullscreen, preview, barPopup = {}, commandOrchestrator, dispatch } = useContext(EditorContext);\n function handleClick(command: ICommand<string>, name?: string) {\n if (!dispatch) return;\n const state: ContextStore = { barPopup: { ...barPopup } };\n if (command.keyCommand === 'preview') {\n state.preview = command.value as PreviewType;\n }\n if (command.keyCommand === 'fullscreen') {\n state.fullscreen = !fullscreen;\n }\n if (props.commands && command.keyCommand === 'group') {\n props.commands.forEach((item) => {\n if (name === item.groupName) {\n state.barPopup![name!] = true;\n } else if (item.keyCommand) {\n state.barPopup![item.groupName!] = false;\n }\n });\n } else if (name || command.parent) {\n Object.keys(state.barPopup || {}).forEach((keyName) => {\n state.barPopup![keyName] = false;\n });\n }\n\n if (Object.keys(state).length) {\n dispatch({ ...state });\n }\n commandOrchestrator && commandOrchestrator.executeCommand(command);\n }\n\n useEffect(() => {\n if (document) {\n document.body.style.overflow = !
|
|
70
|
+
"import React, { Fragment, useContext, useEffect, useRef } from 'react';\nimport { IProps } from '../../Editor';\nimport { EditorContext, PreviewType, ContextStore } from '../../Context';\nimport { ICommand } from '../../commands';\nimport Child from './Child';\nimport './index.less';\n\nexport interface IToolbarProps extends IProps {\n height?: React.CSSProperties['height'];\n onCommand?: (command: ICommand<string>, groupName?: string) => void;\n commands?: ICommand<string>[];\n isChild?: boolean;\n}\n\nexport function ToolbarItems(props: IToolbarProps) {\n const { prefixCls } = props;\n const { fullscreen, preview, barPopup = {}, commandOrchestrator, dispatch } = useContext(EditorContext);\n const originalOverflow = useRef('');\n\n function handleClick(command: ICommand<string>, name?: string) {\n if (!dispatch) return;\n const state: ContextStore = { barPopup: { ...barPopup } };\n if (command.keyCommand === 'preview') {\n state.preview = command.value as PreviewType;\n }\n if (command.keyCommand === 'fullscreen') {\n state.fullscreen = !fullscreen;\n }\n if (props.commands && command.keyCommand === 'group') {\n props.commands.forEach((item) => {\n if (name === item.groupName) {\n state.barPopup![name!] = true;\n } else if (item.keyCommand) {\n state.barPopup![item.groupName!] = false;\n }\n });\n } else if (name || command.parent) {\n Object.keys(state.barPopup || {}).forEach((keyName) => {\n state.barPopup![keyName] = false;\n });\n }\n\n if (Object.keys(state).length) {\n dispatch({ ...state });\n }\n commandOrchestrator && commandOrchestrator.executeCommand(command);\n }\n\n useEffect(() => {\n if (document) {\n if (fullscreen) {\n // prevent scroll on fullscreen\n document.body.style.overflow = 'hidden';\n } else {\n // get the original overflow only the first time\n if (!originalOverflow.current) {\n originalOverflow.current = window.getComputedStyle(document.body, null).overflow;\n }\n // reset to the original overflow\n document.body.style.overflow = originalOverflow.current;\n }\n }\n }, [fullscreen, originalOverflow]);\n\n return (\n <ul>\n {(props.commands || []).map((item, idx) => {\n if (item.keyCommand === 'divider') {\n return <li key={idx} {...item.liProps} className={`${prefixCls}-toolbar-divider`} />;\n }\n if (!item.keyCommand) return <Fragment />;\n const activeBtn =\n (fullscreen && item.keyCommand === 'fullscreen') || (item.keyCommand === 'preview' && preview === item.value);\n const childNode =\n item.children && typeof item.children === 'function'\n ? item.children({\n getState: () => commandOrchestrator!.getState(),\n textApi: commandOrchestrator ? commandOrchestrator!.textApi : undefined,\n close: () => handleClick({}, item.groupName),\n execute: () => handleClick({ execute: item.execute }),\n })\n : undefined;\n const disabled = barPopup && preview && preview === 'preview' && !/(preview|fullscreen)/.test(item.keyCommand);\n return (\n <li key={idx} {...item.liProps} className={activeBtn ? `active` : ''}>\n {!item.buttonProps && item.icon}\n {item.buttonProps &&\n React.createElement(\n 'button',\n {\n type: 'button',\n disabled,\n 'data-name': item.name,\n ...item.buttonProps,\n onClick: (evn: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n evn.stopPropagation();\n handleClick(item, item.groupName);\n },\n },\n item.icon,\n )}\n {item.children && (\n <Child\n groupName={item.groupName}\n prefixCls={prefixCls}\n children={childNode}\n commands={Array.isArray(item.children) ? item.children : undefined}\n />\n )}\n </li>\n );\n })}\n </ul>\n );\n}\n\nexport default function Toolbar(props: IToolbarProps = {}) {\n const { prefixCls, height = 29, isChild } = props;\n const { commands, extraCommands } = useContext(EditorContext);\n return (\n <div className={`${prefixCls}-toolbar`} style={{ height }}>\n <ToolbarItems {...props} commands={props.commands || commands || []} />\n {!isChild && <ToolbarItems {...props} commands={extraCommands || []} />}\n </div>\n );\n}\n"
|
|
67
71
|
]
|
|
68
72
|
}
|
package/lib/index.less
CHANGED
package/markdown-editor.css
CHANGED
|
@@ -50,8 +50,7 @@
|
|
|
50
50
|
font-weight: inherit;
|
|
51
51
|
letter-spacing: inherit;
|
|
52
52
|
line-height: inherit;
|
|
53
|
-
|
|
54
|
-
tab-size: inherit;
|
|
53
|
+
tab-size: inherit;
|
|
55
54
|
text-indent: inherit;
|
|
56
55
|
text-rendering: inherit;
|
|
57
56
|
text-transform: inherit;
|
|
@@ -294,7 +293,7 @@
|
|
|
294
293
|
.w-md-editor-fullscreen {
|
|
295
294
|
overflow: hidden;
|
|
296
295
|
position: fixed;
|
|
297
|
-
z-index:
|
|
296
|
+
z-index: 99999;
|
|
298
297
|
top: 0;
|
|
299
298
|
left: 0;
|
|
300
299
|
right: 0;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uiw/react-md-editor",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.9.3",
|
|
4
4
|
"description": "A markdown editor with preview, implemented with React.js and TypeScript.",
|
|
5
5
|
"homepage": "https://uiwjs.github.io/react-md-editor/",
|
|
6
6
|
"author": "kenny wang <wowohoo@qq.com>",
|
|
@@ -39,33 +39,33 @@
|
|
|
39
39
|
"react-dom": ">=16.8.0"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@kkt/less-modules": "
|
|
43
|
-
"@kkt/raw-modules": "
|
|
44
|
-
"@kkt/react-library": "
|
|
45
|
-
"@kkt/scope-plugin-options": "
|
|
42
|
+
"@kkt/less-modules": "7.0.4",
|
|
43
|
+
"@kkt/raw-modules": "7.0.4",
|
|
44
|
+
"@kkt/react-library": "7.0.4",
|
|
45
|
+
"@kkt/scope-plugin-options": "7.0.4",
|
|
46
46
|
"@types/katex": "0.11.1",
|
|
47
|
-
"@types/react": "17.0.
|
|
47
|
+
"@types/react": "17.0.38",
|
|
48
48
|
"@types/react-dom": "17.0.11",
|
|
49
49
|
"@types/react-test-renderer": "17.0.1",
|
|
50
50
|
"@uiw/react-github-corners": "1.5.3",
|
|
51
|
-
"@uiw/react-codesandbox": "1.1.
|
|
51
|
+
"@uiw/react-codesandbox": "1.1.4",
|
|
52
52
|
"@uiw/react-shields": "1.1.2",
|
|
53
|
-
"compile-less-cli": "1.8.
|
|
53
|
+
"compile-less-cli": "1.8.11",
|
|
54
54
|
"katex": "0.15.1",
|
|
55
55
|
"husky": "7.0.4",
|
|
56
56
|
"jest-environment-jsdom": "27.4.4",
|
|
57
|
-
"kkt": "
|
|
58
|
-
"lint-staged": "12.1.
|
|
57
|
+
"kkt": "7.0.4",
|
|
58
|
+
"lint-staged": "12.1.5",
|
|
59
59
|
"prettier": "2.5.1",
|
|
60
60
|
"react": "17.0.2",
|
|
61
61
|
"react-dom": "17.0.2",
|
|
62
62
|
"react-test-renderer": "17.0.2",
|
|
63
63
|
"source-map-explorer": "2.5.2",
|
|
64
|
-
"tsbb": "3.5.
|
|
64
|
+
"tsbb": "3.5.4"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
67
|
"@babel/runtime": "^7.14.6",
|
|
68
|
-
"@uiw/react-markdown-preview": "3.4.
|
|
68
|
+
"@uiw/react-markdown-preview": "3.4.6",
|
|
69
69
|
"rehype-sanitize": "5.0.1",
|
|
70
70
|
"rehype": "12.0.0"
|
|
71
71
|
},
|
package/src/Context.tsx
CHANGED
package/src/Editor.tsx
CHANGED
|
@@ -76,6 +76,10 @@ export interface MDEditorProps extends Omit<React.HTMLAttributes<HTMLDivElement>
|
|
|
76
76
|
* Default `2` spaces.
|
|
77
77
|
*/
|
|
78
78
|
tabSize?: number;
|
|
79
|
+
/**
|
|
80
|
+
* If `false`, the `tab` key inserts a tab character into the textarea. If `true`, the `tab` key executes default behavior e.g. focus shifts to next element.
|
|
81
|
+
*/
|
|
82
|
+
defaultTabEnable?: boolean;
|
|
79
83
|
/**
|
|
80
84
|
* You can create your own commands or reuse existing commands.
|
|
81
85
|
*/
|
|
@@ -128,12 +132,12 @@ const InternalMDEditor = (
|
|
|
128
132
|
minHeight = 100,
|
|
129
133
|
autoFocus,
|
|
130
134
|
tabSize = 2,
|
|
135
|
+
defaultTabEnable = false,
|
|
131
136
|
onChange,
|
|
132
137
|
hideToolbar,
|
|
133
138
|
renderTextarea,
|
|
134
139
|
...other
|
|
135
140
|
} = props || {};
|
|
136
|
-
|
|
137
141
|
const cmds = commands
|
|
138
142
|
.map((item) => (commandsFilter ? commandsFilter(item, false) : item))
|
|
139
143
|
.filter(Boolean) as ICommand[];
|
|
@@ -146,6 +150,7 @@ const InternalMDEditor = (
|
|
|
146
150
|
height,
|
|
147
151
|
highlightEnable,
|
|
148
152
|
tabSize,
|
|
153
|
+
defaultTabEnable,
|
|
149
154
|
scrollTop: 0,
|
|
150
155
|
scrollTopPreview: 0,
|
|
151
156
|
commands: cmds,
|
|
@@ -10,8 +10,17 @@ export interface TextAreaProps extends Omit<React.TextareaHTMLAttributes<HTMLTex
|
|
|
10
10
|
|
|
11
11
|
export default function Textarea(props: TextAreaProps) {
|
|
12
12
|
const { prefixCls, onChange, ...other } = props;
|
|
13
|
-
const {
|
|
14
|
-
|
|
13
|
+
const {
|
|
14
|
+
markdown,
|
|
15
|
+
commands,
|
|
16
|
+
fullscreen,
|
|
17
|
+
preview,
|
|
18
|
+
highlightEnable,
|
|
19
|
+
extraCommands,
|
|
20
|
+
tabSize,
|
|
21
|
+
defaultTabEnable,
|
|
22
|
+
dispatch,
|
|
23
|
+
} = useContext(EditorContext);
|
|
15
24
|
const textRef = React.useRef<HTMLTextAreaElement>(null);
|
|
16
25
|
const executeRef = React.useRef<TextAreaCommandOrchestrator>();
|
|
17
26
|
const statesRef = React.useRef<ExecuteCommandState>({ fullscreen, preview });
|
|
@@ -30,7 +39,7 @@ export default function Textarea(props: TextAreaProps) {
|
|
|
30
39
|
}, []);
|
|
31
40
|
|
|
32
41
|
const onKeyDown = (e: KeyboardEvent | React.KeyboardEvent<HTMLTextAreaElement>) => {
|
|
33
|
-
handleKeyDown(e, tabSize);
|
|
42
|
+
handleKeyDown(e, tabSize, defaultTabEnable);
|
|
34
43
|
shortcuts(e, [...(commands || []), ...(extraCommands || [])], executeRef.current, dispatch, statesRef.current);
|
|
35
44
|
};
|
|
36
45
|
useEffect(() => {
|
|
@@ -14,16 +14,18 @@ function stopPropagation(e: KeyboardEvent | React.KeyboardEvent<HTMLTextAreaElem
|
|
|
14
14
|
export default function handleKeyDown(
|
|
15
15
|
e: KeyboardEvent | React.KeyboardEvent<HTMLTextAreaElement>,
|
|
16
16
|
tabSize: number = 2,
|
|
17
|
+
defaultTabEnable: boolean = false,
|
|
17
18
|
) {
|
|
18
19
|
const target = e.target as HTMLTextAreaElement;
|
|
19
20
|
const starVal = target.value.substr(0, target.selectionStart);
|
|
20
21
|
const valArr = starVal.split('\n');
|
|
21
22
|
const currentLineStr = valArr[valArr.length - 1];
|
|
22
23
|
const textArea = new TextAreaTextApi(target);
|
|
24
|
+
|
|
23
25
|
/**
|
|
24
26
|
* `9` - `Tab`
|
|
25
27
|
*/
|
|
26
|
-
if (e.code && e.code.toLowerCase() === 'tab') {
|
|
28
|
+
if (!defaultTabEnable && e.code && e.code.toLowerCase() === 'tab') {
|
|
27
29
|
stopPropagation(e);
|
|
28
30
|
const space = new Array(tabSize + 1).join(' ');
|
|
29
31
|
if (target.selectionStart !== target.selectionEnd) {
|
|
@@ -75,9 +77,17 @@ export default function handleKeyDown(
|
|
|
75
77
|
*/
|
|
76
78
|
stopPropagation(e);
|
|
77
79
|
let startStr = '\n- ';
|
|
80
|
+
|
|
78
81
|
if (currentLineStr.startsWith('*')) {
|
|
79
82
|
startStr = '\n* ';
|
|
80
83
|
}
|
|
84
|
+
|
|
85
|
+
if (currentLineStr.startsWith('- [ ]')) {
|
|
86
|
+
startStr = '\n- [ ] ';
|
|
87
|
+
} else if (currentLineStr.startsWith('- [X]')) {
|
|
88
|
+
startStr = '\n- [X] ';
|
|
89
|
+
}
|
|
90
|
+
|
|
81
91
|
if (/^\d+.\s/.test(currentLineStr)) {
|
|
82
92
|
startStr = `\n${parseInt(currentLineStr) + 1}. `;
|
|
83
93
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { Fragment, useContext, useEffect } from 'react';
|
|
1
|
+
import React, { Fragment, useContext, useEffect, useRef } from 'react';
|
|
2
2
|
import { IProps } from '../../Editor';
|
|
3
3
|
import { EditorContext, PreviewType, ContextStore } from '../../Context';
|
|
4
4
|
import { ICommand } from '../../commands';
|
|
@@ -15,6 +15,8 @@ export interface IToolbarProps extends IProps {
|
|
|
15
15
|
export function ToolbarItems(props: IToolbarProps) {
|
|
16
16
|
const { prefixCls } = props;
|
|
17
17
|
const { fullscreen, preview, barPopup = {}, commandOrchestrator, dispatch } = useContext(EditorContext);
|
|
18
|
+
const originalOverflow = useRef('');
|
|
19
|
+
|
|
18
20
|
function handleClick(command: ICommand<string>, name?: string) {
|
|
19
21
|
if (!dispatch) return;
|
|
20
22
|
const state: ContextStore = { barPopup: { ...barPopup } };
|
|
@@ -46,9 +48,19 @@ export function ToolbarItems(props: IToolbarProps) {
|
|
|
46
48
|
|
|
47
49
|
useEffect(() => {
|
|
48
50
|
if (document) {
|
|
49
|
-
|
|
51
|
+
if (fullscreen) {
|
|
52
|
+
// prevent scroll on fullscreen
|
|
53
|
+
document.body.style.overflow = 'hidden';
|
|
54
|
+
} else {
|
|
55
|
+
// get the original overflow only the first time
|
|
56
|
+
if (!originalOverflow.current) {
|
|
57
|
+
originalOverflow.current = window.getComputedStyle(document.body, null).overflow;
|
|
58
|
+
}
|
|
59
|
+
// reset to the original overflow
|
|
60
|
+
document.body.style.overflow = originalOverflow.current;
|
|
61
|
+
}
|
|
50
62
|
}
|
|
51
|
-
}, [fullscreen]);
|
|
63
|
+
}, [fullscreen, originalOverflow]);
|
|
52
64
|
|
|
53
65
|
return (
|
|
54
66
|
<ul>
|