@uiw/react-codemirror 3.0.14 → 3.2.2

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.
@@ -0,0 +1,345 @@
1
+ /* BASICS */
2
+
3
+ .CodeMirror {
4
+ /* Set height, width, borders, and global font properties here */
5
+ font-family: 'source-code-pro', Menlo, 'Courier New', Consolas, monospace;
6
+ color: black;
7
+ direction: ltr;
8
+ font-size: 14px;
9
+ z-index: 0;
10
+ border-radius: 5px;
11
+ height: auto;
12
+ background: transparent;
13
+ }
14
+
15
+ /* PADDING */
16
+
17
+ .CodeMirror-lines {
18
+ padding: 4px 0; /* Vertical padding around content */
19
+ }
20
+ .CodeMirror pre.CodeMirror-line,
21
+ .CodeMirror pre.CodeMirror-line-like {
22
+ padding: 0 4px; /* Horizontal padding of content */
23
+ }
24
+
25
+ .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
26
+ background-color: white; /* The little square between H and V scrollbars */
27
+ }
28
+
29
+ /* GUTTER */
30
+
31
+ .CodeMirror-gutters {
32
+ border-right: 1px solid #ddd;
33
+ background-color: #f7f7f7;
34
+ white-space: nowrap;
35
+ }
36
+ .CodeMirror-linenumber {
37
+ padding: 0 3px 0 5px;
38
+ min-width: 20px;
39
+ text-align: right;
40
+ color: #999;
41
+ white-space: nowrap;
42
+ }
43
+
44
+ .CodeMirror-guttermarker { color: black; }
45
+ .CodeMirror-guttermarker-subtle { color: #999; }
46
+
47
+ /* CURSOR */
48
+
49
+ .CodeMirror-cursor {
50
+ border-left: 1px solid black;
51
+ border-right: none;
52
+ width: 0;
53
+ }
54
+ /* Shown when moving in bi-directional text */
55
+ .CodeMirror div.CodeMirror-secondarycursor {
56
+ border-left: 1px solid silver;
57
+ }
58
+ .cm-fat-cursor .CodeMirror-cursor {
59
+ width: auto;
60
+ border: 0 !important;
61
+ background: #7e7;
62
+ }
63
+ .cm-fat-cursor div.CodeMirror-cursors {
64
+ z-index: 1;
65
+ }
66
+ .cm-fat-cursor-mark {
67
+ background-color: rgba(20, 255, 20, 0.5);
68
+ -webkit-animation: blink 1.06s steps(1) infinite;
69
+ -moz-animation: blink 1.06s steps(1) infinite;
70
+ animation: blink 1.06s steps(1) infinite;
71
+ }
72
+ .cm-animate-fat-cursor {
73
+ width: auto;
74
+ border: 0;
75
+ -webkit-animation: blink 1.06s steps(1) infinite;
76
+ -moz-animation: blink 1.06s steps(1) infinite;
77
+ animation: blink 1.06s steps(1) infinite;
78
+ background-color: #7e7;
79
+ }
80
+ @-moz-keyframes blink {
81
+ 0% {}
82
+ 50% { background-color: transparent; }
83
+ 100% {}
84
+ }
85
+ @-webkit-keyframes blink {
86
+ 0% {}
87
+ 50% { background-color: transparent; }
88
+ 100% {}
89
+ }
90
+ @keyframes blink {
91
+ 0% {}
92
+ 50% { background-color: transparent; }
93
+ 100% {}
94
+ }
95
+
96
+ .cm-tab { display: inline-block; text-decoration: inherit; }
97
+
98
+ .CodeMirror-rulers {
99
+ position: absolute;
100
+ left: 0; right: 0; top: -50px; bottom: 0;
101
+ overflow: hidden;
102
+ }
103
+ .CodeMirror-ruler {
104
+ border-left: 1px solid #ccc;
105
+ top: 0; bottom: 0;
106
+ position: absolute;
107
+ }
108
+
109
+ /* DEFAULT THEME */
110
+
111
+ .cm-s-default .cm-header {color: blue;}
112
+ .cm-s-default .cm-quote {color: #090;}
113
+ .cm-negative {color: #d44;}
114
+ .cm-positive {color: #292;}
115
+ .cm-header, .cm-strong {font-weight: bold;}
116
+ .cm-em {font-style: italic;}
117
+ .cm-link {text-decoration: underline;}
118
+ .cm-strikethrough {text-decoration: line-through;}
119
+
120
+ .cm-s-default .cm-keyword {color: #708;}
121
+ .cm-s-default .cm-atom {color: #219;}
122
+ .cm-s-default .cm-number {color: #164;}
123
+ .cm-s-default .cm-def {color: #00f;}
124
+ .cm-s-default .cm-variable-2 {color: #05a;}
125
+ .cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}
126
+ .cm-s-default .cm-comment {color: #a50;}
127
+ .cm-s-default .cm-string {color: #a11;}
128
+ .cm-s-default .cm-string-2 {color: #f50;}
129
+ .cm-s-default .cm-meta {color: #555;}
130
+ .cm-s-default .cm-qualifier {color: #555;}
131
+ .cm-s-default .cm-builtin {color: #30a;}
132
+ .cm-s-default .cm-bracket {color: #997;}
133
+ .cm-s-default .cm-tag {color: #170;}
134
+ .cm-s-default .cm-attribute {color: #00c;}
135
+ .cm-s-default .cm-hr {color: #999;}
136
+ .cm-s-default .cm-link {color: #00c;}
137
+
138
+ .cm-s-default .cm-error {color: #f00;}
139
+ .cm-invalidchar {color: #f00;}
140
+
141
+ .CodeMirror-composing { border-bottom: 2px solid; }
142
+
143
+ /* Default styles for common addons */
144
+
145
+ div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}
146
+ div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
147
+ .CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
148
+ .CodeMirror-activeline-background {background: #e8f2ff;}
149
+
150
+ /* STOP */
151
+
152
+ /* The rest of this file contains styles related to the mechanics of
153
+ the editor. You probably shouldn't touch them. */
154
+
155
+ .CodeMirror {
156
+ position: relative;
157
+ overflow: hidden;
158
+ background: white;
159
+ }
160
+
161
+ .CodeMirror-scroll {
162
+ overflow: scroll !important; /* Things will break if this is overridden */
163
+ /* 30px is the magic margin used to hide the element's real scrollbars */
164
+ /* See overflow: hidden in .CodeMirror */
165
+ margin-bottom: -30px; margin-right: -30px;
166
+ padding-bottom: 30px;
167
+ height: 100%;
168
+ outline: none; /* Prevent dragging from highlighting the element */
169
+ position: relative;
170
+ }
171
+ .CodeMirror-sizer {
172
+ position: relative;
173
+ border-right: 30px solid transparent;
174
+ }
175
+
176
+ /* The fake, visible scrollbars. Used to force redraw during scrolling
177
+ before actual scrolling happens, thus preventing shaking and
178
+ flickering artifacts. */
179
+ .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
180
+ position: absolute;
181
+ z-index: 6;
182
+ display: none;
183
+ }
184
+ .CodeMirror-vscrollbar {
185
+ right: 0; top: 0;
186
+ overflow-x: hidden;
187
+ overflow-y: scroll;
188
+ }
189
+ .CodeMirror-hscrollbar {
190
+ bottom: 0; left: 0;
191
+ overflow-y: hidden;
192
+ overflow-x: scroll;
193
+ }
194
+ .CodeMirror-scrollbar-filler {
195
+ right: 0; bottom: 0;
196
+ }
197
+ .CodeMirror-gutter-filler {
198
+ left: 0; bottom: 0;
199
+ }
200
+
201
+ .CodeMirror-gutters {
202
+ position: absolute; left: 0; top: 0;
203
+ min-height: 100%;
204
+ z-index: 3;
205
+ }
206
+ .CodeMirror-gutter {
207
+ white-space: normal;
208
+ height: 100%;
209
+ display: inline-block;
210
+ vertical-align: top;
211
+ margin-bottom: -30px;
212
+ }
213
+ .CodeMirror-gutter-wrapper {
214
+ position: absolute;
215
+ z-index: 4;
216
+ background: none !important;
217
+ border: none !important;
218
+ }
219
+ .CodeMirror-gutter-background {
220
+ position: absolute;
221
+ top: 0; bottom: 0;
222
+ z-index: 4;
223
+ }
224
+ .CodeMirror-gutter-elt {
225
+ position: absolute;
226
+ cursor: default;
227
+ z-index: 4;
228
+ }
229
+ .CodeMirror-gutter-wrapper ::selection { background-color: transparent }
230
+ .CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }
231
+
232
+ .CodeMirror-lines {
233
+ cursor: text;
234
+ min-height: 1px; /* prevents collapsing before first draw */
235
+ }
236
+ .CodeMirror pre.CodeMirror-line,
237
+ .CodeMirror pre.CodeMirror-line-like {
238
+ /* Reset some styles that the rest of the page might have set */
239
+ -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
240
+ border-width: 0;
241
+ background: transparent;
242
+ font-family: inherit;
243
+ font-size: inherit;
244
+ margin: 0;
245
+ white-space: pre;
246
+ word-wrap: normal;
247
+ line-height: inherit;
248
+ color: inherit;
249
+ z-index: 2;
250
+ position: relative;
251
+ overflow: visible;
252
+ -webkit-tap-highlight-color: transparent;
253
+ -webkit-font-variant-ligatures: contextual;
254
+ font-variant-ligatures: contextual;
255
+ }
256
+ .CodeMirror-wrap pre.CodeMirror-line,
257
+ .CodeMirror-wrap pre.CodeMirror-line-like {
258
+ word-wrap: break-word;
259
+ white-space: pre-wrap;
260
+ word-break: normal;
261
+ }
262
+
263
+ .CodeMirror-linebackground {
264
+ position: absolute;
265
+ left: 0; right: 0; top: 0; bottom: 0;
266
+ z-index: 0;
267
+ }
268
+
269
+ .CodeMirror-linewidget {
270
+ position: relative;
271
+ z-index: 2;
272
+ padding: 0.1px; /* Force widget margins to stay inside of the container */
273
+ }
274
+
275
+ .CodeMirror-widget {}
276
+
277
+ .CodeMirror-rtl pre { direction: rtl; }
278
+
279
+ .CodeMirror-code {
280
+ outline: none;
281
+ }
282
+
283
+ /* Force content-box sizing for the elements where we expect it */
284
+ .CodeMirror-scroll,
285
+ .CodeMirror-sizer,
286
+ .CodeMirror-gutter,
287
+ .CodeMirror-gutters,
288
+ .CodeMirror-linenumber {
289
+ -moz-box-sizing: content-box;
290
+ box-sizing: content-box;
291
+ }
292
+
293
+ .CodeMirror-measure {
294
+ position: absolute;
295
+ width: 100%;
296
+ height: 0;
297
+ overflow: hidden;
298
+ visibility: hidden;
299
+ }
300
+
301
+ .CodeMirror-cursor {
302
+ position: absolute;
303
+ pointer-events: none;
304
+ }
305
+ .CodeMirror-measure pre { position: static; }
306
+
307
+ div.CodeMirror-cursors {
308
+ visibility: hidden;
309
+ position: relative;
310
+ z-index: 3;
311
+ }
312
+ div.CodeMirror-dragcursors {
313
+ visibility: visible;
314
+ }
315
+
316
+ .CodeMirror-focused div.CodeMirror-cursors {
317
+ visibility: visible;
318
+ }
319
+
320
+ .CodeMirror-selected { background: #d9d9d9; }
321
+ .CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
322
+ .CodeMirror-crosshair { cursor: crosshair; }
323
+ .CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
324
+ .CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
325
+
326
+ .cm-searching {
327
+ background-color: #ffa;
328
+ background-color: rgba(255, 255, 0, .4);
329
+ }
330
+
331
+ /* Used to force a border model for a node */
332
+ .cm-force-border { padding-right: .1px; }
333
+
334
+ @media print {
335
+ /* Hide the cursor when printing */
336
+ .CodeMirror div.CodeMirror-cursors {
337
+ visibility: hidden;
338
+ }
339
+ }
340
+
341
+ /* See issue #2901 */
342
+ .cm-tab-wrap-hack:after { content: ''; }
343
+
344
+ /* Help users use markselection to safely style text background */
345
+ span.CodeMirror-selectedtext { background: none; }
package/src/index.js ADDED
@@ -0,0 +1,110 @@
1
+ import React, { useRef, useEffect, useImperativeHandle, useState, useMemo } from 'react';
2
+ import CodeMirror from 'codemirror';
3
+ import 'codemirror/mode/meta';
4
+ import './codemirror.css';
5
+
6
+ const defaultOptions = {
7
+ tabSize: 2,
8
+ autoCloseBrackets: true,
9
+ matchBrackets: true,
10
+ showCursorWhenSelecting: true,
11
+ // 显示行号
12
+ lineNumbers: true,
13
+ fullScreen: true,
14
+ }
15
+
16
+ function ReactCodeMirror(props = {}, ref) {
17
+ const { options = {}, value = '', width = '100%', height = '100%', lazyLoadMode = true } = props;
18
+ const [editor, setEditor] = useState();
19
+ const textareaRef = useRef();
20
+ const lastestProps = useRef(props);
21
+
22
+ useImperativeHandle(ref, () => ({ editor, textarea: textareaRef.current }), [editor, textareaRef]);
23
+ lastestProps.current = props;
24
+
25
+ // 将props中所有的事件处理函数映射并保存
26
+ function getEventHandleFromProps() {
27
+ const propNames = Object.keys(props);
28
+ const eventHandle = propNames.filter((keyName) => {
29
+ return /^on+/.test(keyName);
30
+ });
31
+
32
+ const eventDict = {};
33
+ eventHandle.forEach((ele) => {
34
+ const name = ele.slice(2);
35
+ if (name && name[0]) {
36
+ eventDict[ele] = name.replace(name[0], name[0].toLowerCase());
37
+ }
38
+ });
39
+
40
+ return eventDict;
41
+ }
42
+
43
+ // http://codemirror.net/doc/manual.html#config
44
+ async function setOptions(instance, opt = {}) {
45
+ if (typeof opt === 'object' && window) {
46
+ const mode = CodeMirror.findModeByName(opt.mode || '');
47
+ if (lazyLoadMode && mode && mode.mode) {
48
+ await import(`codemirror/mode/${mode.mode}/${mode.mode}.js`);
49
+ }
50
+ if (mode) {
51
+ opt.mode = mode.mime;
52
+ }
53
+ Object.keys(opt).forEach((name) => {
54
+ if ((opt[name] || opt[name] === false) && JSON.stringify(opt[name])) {
55
+ instance.setOption(name, opt[name]);
56
+ }
57
+ });
58
+ }
59
+ }
60
+
61
+ useEffect(() => {
62
+ if (!editor && window) {
63
+ // 生成codemirror实例
64
+ const instance = CodeMirror.fromTextArea(textareaRef.current, {...defaultOptions, ...options});
65
+ const eventDict = getEventHandleFromProps();
66
+ Object.keys(eventDict).forEach((event) => {
67
+ instance.on(eventDict[event], (...params) => lastestProps.current[event](...params));
68
+ });
69
+ instance.setValue(value || '');
70
+
71
+ if (width || height) {
72
+ // 设置尺寸
73
+ instance.setSize(width, height);
74
+ }
75
+ setEditor(instance);
76
+ setOptions(instance, {...defaultOptions, ...options});
77
+ }
78
+ return () => {
79
+ if (editor && window) {
80
+ editor.toTextArea();
81
+ setEditor(undefined);
82
+ }
83
+ }
84
+ }, []);
85
+
86
+ useMemo(() => {
87
+ if (!editor || !window) return;
88
+ const val = editor.getValue();
89
+ if (value !== undefined && value !== val) {
90
+ editor.setValue(value);
91
+ }
92
+ }, [value]);
93
+
94
+ useMemo(() => {
95
+ if (!editor || !window) return;
96
+ editor.setSize(width, height);
97
+ }, [width, height]);
98
+
99
+
100
+ useMemo(() => {
101
+ if (!editor || !window) return;
102
+ setOptions(editor, {...defaultOptions, ...options});
103
+ }, [editor, options]);
104
+
105
+ return (
106
+ <textarea ref={textareaRef} />
107
+ );
108
+ }
109
+
110
+ export default React.forwardRef(ReactCodeMirror);
@@ -23,6 +23,10 @@ export interface IReactCodemirror extends IDOMEvent {
23
23
  * height of editor. Defaults to 100%.
24
24
  */
25
25
  height?: any;
26
+ /**
27
+ * should modes be loaded dynamically. Defaults to true.
28
+ */
29
+ lazyLoadMode?: boolean;
26
30
  /**
27
31
  * refer to codemirror options.
28
32
  */
@@ -32,14 +36,14 @@ export interface IReactCodemirror extends IDOMEvent {
32
36
  * changeObj has a similar type as the object passed to the editor's "change" event,
33
37
  * but it never has a next property, because document change events are not batched (whereas editor change events are).
34
38
  */
35
- onChange?: (instance: CodeMirror.Editor, change: CodeMirror.EditorChangeLinkedList) => void;
39
+ onChange?: (instance: CodeMirror.Editor, change: CodeMirror.EditorChange) => void;
36
40
  /**
37
41
  * Like the "change" event, but batched per operation, passing an
38
42
  * array containing all the changes that happened in the operation.
39
43
  * This event is fired after the operation finished, and display
40
44
  * changes it makes will trigger a new operation.
41
45
  * */
42
- onChanges?: (instance: CodeMirror.Editor, change: CodeMirror.EditorChangeLinkedList[]) => void;
46
+ onChanges?: (instance: CodeMirror.Editor, change: CodeMirror.EditorChange[]) => void;
43
47
  /**
44
48
  * This event is fired before a change is applied, and its handler may choose to modify or cancel the change.
45
49
  * The changeObj never has a next property, since this is fired for each individual change, and not batched per operation.
@@ -121,8 +125,11 @@ export interface IReactCodemirror extends IDOMEvent {
121
125
  * */
122
126
  onRedraw?(): void;
123
127
  }
124
- export default class ReactCodemirror extends React.Component<IReactCodemirror> {
128
+
129
+ export interface IEditorInstance {
125
130
  editor: Editor;
126
- static defaultProps: IReactCodemirror;
127
- render(): JSX.Element;
128
131
  }
132
+
133
+ declare const ReactCodemirror: (props: IReactCodemirror & React.RefAttributes<IEditorInstance | undefined>) => JSX.Element;
134
+
135
+ export default ReactCodemirror;
package/lib/cjs/index.js DELETED
@@ -1,192 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireWildcard3 = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
-
5
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
6
-
7
- Object.defineProperty(exports, "__esModule", {
8
- value: true
9
- });
10
- exports.default = void 0;
11
-
12
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
13
-
14
- var _interopRequireWildcard2 = _interopRequireDefault(require("@babel/runtime/helpers/interopRequireWildcard"));
15
-
16
- var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
17
-
18
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
19
-
20
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
21
-
22
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
23
-
24
- var _react = _interopRequireWildcard3(require("react"));
25
-
26
- var _codemirror = _interopRequireDefault(require("codemirror"));
27
-
28
- require("codemirror/mode/meta");
29
-
30
- var defaultOptions = {
31
- tabSize: 2,
32
- autoCloseBrackets: true,
33
- matchBrackets: true,
34
- showCursorWhenSelecting: true,
35
- // 显示行号
36
- lineNumbers: true,
37
- fullScreen: true
38
- };
39
-
40
- function ReactCodeMirror() {
41
- var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
42
- var ref = arguments.length > 1 ? arguments[1] : undefined;
43
- var _props$options = props.options,
44
- options = _props$options === void 0 ? {} : _props$options,
45
- _props$value = props.value,
46
- value = _props$value === void 0 ? '' : _props$value,
47
- _props$width = props.width,
48
- width = _props$width === void 0 ? '100%' : _props$width,
49
- _props$height = props.height,
50
- height = _props$height === void 0 ? '100%' : _props$height;
51
-
52
- var _useState = (0, _react.useState)(),
53
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
54
- editor = _useState2[0],
55
- setEditor = _useState2[1];
56
-
57
- var textareaRef = (0, _react.useRef)();
58
- var lastestProps = (0, _react.useRef)(props);
59
- (0, _react.useImperativeHandle)(ref, function () {
60
- return {
61
- editor: editor
62
- };
63
- }, [editor]);
64
- lastestProps.current = props; // 将props中所有的事件处理函数映射并保存
65
-
66
- function getEventHandleFromProps() {
67
- var propNames = Object.keys(props);
68
- var eventHandle = propNames.filter(function (keyName) {
69
- return /^on+/.test(keyName);
70
- });
71
- var eventDict = {};
72
- eventHandle.forEach(function (ele) {
73
- var name = ele.slice(2);
74
-
75
- if (name && name[0]) {
76
- eventDict[ele] = name.replace(name[0], name[0].toLowerCase());
77
- }
78
- });
79
- return eventDict;
80
- } // http://codemirror.net/doc/manual.html#config
81
-
82
-
83
- function setOptions(_x) {
84
- return _setOptions.apply(this, arguments);
85
- }
86
-
87
- function _setOptions() {
88
- _setOptions = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(instance) {
89
- var opt,
90
- mode,
91
- _args = arguments;
92
- return _regenerator.default.wrap(function _callee$(_context) {
93
- while (1) {
94
- switch (_context.prev = _context.next) {
95
- case 0:
96
- opt = _args.length > 1 && _args[1] !== undefined ? _args[1] : {};
97
-
98
- if (!((0, _typeof2.default)(opt) === 'object' && window)) {
99
- _context.next = 8;
100
- break;
101
- }
102
-
103
- mode = _codemirror.default.findModeByName(opt.mode || '');
104
-
105
- if (!(mode && mode.mode)) {
106
- _context.next = 6;
107
- break;
108
- }
109
-
110
- _context.next = 6;
111
- return Promise.resolve("codemirror/mode/".concat(mode.mode, "/").concat(mode.mode, ".js")).then(function (s) {
112
- return (0, _interopRequireWildcard2.default)(require(s));
113
- });
114
-
115
- case 6:
116
- if (mode) {
117
- opt.mode = mode.mime;
118
- }
119
-
120
- Object.keys(opt).forEach(function (name) {
121
- if ((opt[name] || opt[name] === false) && JSON.stringify(opt[name])) {
122
- instance.setOption(name, opt[name]);
123
- }
124
- });
125
-
126
- case 8:
127
- case "end":
128
- return _context.stop();
129
- }
130
- }
131
- }, _callee);
132
- }));
133
- return _setOptions.apply(this, arguments);
134
- }
135
-
136
- (0, _react.useEffect)(function () {
137
- if (!editor && window) {
138
- // 生成codemirror实例
139
- var instance = _codemirror.default.fromTextArea(textareaRef.current, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, defaultOptions), options));
140
-
141
- var eventDict = getEventHandleFromProps();
142
- Object.keys(eventDict).forEach(function (event) {
143
- instance.on(eventDict[event], function () {
144
- var _lastestProps$current;
145
-
146
- return (_lastestProps$current = lastestProps.current)[event].apply(_lastestProps$current, arguments);
147
- });
148
- });
149
- instance.setValue(value || '');
150
-
151
- if (width || height) {
152
- // 设置尺寸
153
- instance.setSize(width, height);
154
- }
155
-
156
- setEditor(instance);
157
- setOptions(instance, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, defaultOptions), options));
158
- }
159
-
160
- return function () {
161
- if (editor && window) {
162
- editor.toTextArea();
163
- setEditor(undefined);
164
- }
165
- };
166
- }, []);
167
- (0, _react.useMemo)(function () {
168
- if (!editor || !window) return;
169
- var val = editor.getValue();
170
-
171
- if (value !== undefined && value !== val) {
172
- editor.setValue(value);
173
- }
174
- }, [value]);
175
- (0, _react.useMemo)(function () {
176
- if (!editor || !window) return;
177
- editor.setSize(width, height);
178
- }, [width, height]);
179
- (0, _react.useMemo)(function () {
180
- if (!editor || !window) return;
181
- setOptions(editor, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, defaultOptions), options));
182
- }, [editor, options]);
183
- return /*#__PURE__*/_react.default.createElement("textarea", {
184
- ref: textareaRef
185
- });
186
- }
187
-
188
- var _default = /*#__PURE__*/_react.default.forwardRef(ReactCodeMirror);
189
-
190
- exports.default = _default;
191
- module.exports = exports.default;
192
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0T3B0aW9ucyIsInRhYlNpemUiLCJhdXRvQ2xvc2VCcmFja2V0cyIsIm1hdGNoQnJhY2tldHMiLCJzaG93Q3Vyc29yV2hlblNlbGVjdGluZyIsImxpbmVOdW1iZXJzIiwiZnVsbFNjcmVlbiIsIlJlYWN0Q29kZU1pcnJvciIsInByb3BzIiwicmVmIiwib3B0aW9ucyIsInZhbHVlIiwid2lkdGgiLCJoZWlnaHQiLCJlZGl0b3IiLCJzZXRFZGl0b3IiLCJ0ZXh0YXJlYVJlZiIsImxhc3Rlc3RQcm9wcyIsImN1cnJlbnQiLCJnZXRFdmVudEhhbmRsZUZyb21Qcm9wcyIsInByb3BOYW1lcyIsIk9iamVjdCIsImtleXMiLCJldmVudEhhbmRsZSIsImZpbHRlciIsImtleU5hbWUiLCJ0ZXN0IiwiZXZlbnREaWN0IiwiZm9yRWFjaCIsImVsZSIsIm5hbWUiLCJzbGljZSIsInJlcGxhY2UiLCJ0b0xvd2VyQ2FzZSIsInNldE9wdGlvbnMiLCJpbnN0YW5jZSIsIm9wdCIsIndpbmRvdyIsIm1vZGUiLCJDb2RlTWlycm9yIiwiZmluZE1vZGVCeU5hbWUiLCJtaW1lIiwiSlNPTiIsInN0cmluZ2lmeSIsInNldE9wdGlvbiIsImZyb21UZXh0QXJlYSIsImV2ZW50Iiwib24iLCJzZXRWYWx1ZSIsInNldFNpemUiLCJ0b1RleHRBcmVhIiwidW5kZWZpbmVkIiwidmFsIiwiZ2V0VmFsdWUiLCJSZWFjdCIsImZvcndhcmRSZWYiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBR0EsSUFBTUEsY0FBYyxHQUFHO0FBQ3JCQyxFQUFBQSxPQUFPLEVBQUUsQ0FEWTtBQUVyQkMsRUFBQUEsaUJBQWlCLEVBQUUsSUFGRTtBQUdyQkMsRUFBQUEsYUFBYSxFQUFFLElBSE07QUFJckJDLEVBQUFBLHVCQUF1QixFQUFFLElBSko7QUFLckI7QUFDQUMsRUFBQUEsV0FBVyxF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QUFWO0FBQ0Q7O0FBQ0QsV0FBTyxZQUFNO0FBQ1gsVUFBSUksTUFBTSxJQUFJdUIsTUFBZCxFQUFzQjtBQUNwQnZCLFFBQUFBLE1BQU0sQ0FBQ29DLFVBQVA7QUFDQW5DLFFBQUFBLFNBQVMsQ0FBQ29DLFNBQUQsQ0FBVDtBQUNEO0FBQ0YsS0FMRDtBQU1ELEdBdkJELEVBdUJHLEVBdkJIO0FBeUJBLHNCQUFRLFlBQU07QUFDWixRQUFJLENBQUNyQyxNQUFELElBQVcsQ0FBQ3VCLE1BQWhCLEVBQXdCO0FBQ3hCLFFBQU1lLEdBQUcsR0FBR3RDLE1BQU0sQ0FBQ3VDLFFBQVAsRUFBWjs7QUFDQSxRQUFJMUMsS0FBSyxLQUFLd0MsU0FBVixJQUF1QnhDLEtBQUssS0FBS3lDLEdBQXJDLEVBQTBDO0FBQ3hDdEMsTUFBQUEsTUFBTSxDQUFDa0MsUUFBUCxDQUFnQnJDLEtBQWhCO0FBQ0Q7QUFDRixHQU5ELEVBTUcsQ0FBQ0EsS0FBRCxDQU5IO0FBUUEsc0JBQVEsWUFBTTtBQUNaLFFBQUksQ0FBQ0csTUFBRCxJQUFXLENBQUN1QixNQUFoQixFQUF3QjtBQUN4QnZCLElBQUFBLE1BQU0sQ0FBQ21DLE9BQVAsQ0FBZXJDLEtBQWYsRUFBc0JDLE1BQXRCO0FBQ0QsR0FIRCxFQUdHLENBQUNELEtBQUQsRUFBUUMsTUFBUixDQUhIO0FBTUEsc0JBQVEsWUFBTTtBQUNaLFFBQUksQ0FBQ0MsTUFBRCxJQUFXLENBQUN1QixNQUFoQixFQUF3QjtBQUN4QkgsSUFBQUEsVUFBVSxDQUFDcEIsTUFBRCw4REFBYWQsY0FBYixHQUFnQ1UsT0FBaEMsRUFBVjtBQUNELEdBSEQsRUFHRyxDQUFDSSxNQUFELEVBQVNKLE9BQVQsQ0FISDtBQUtBLHNCQUNFO0FBQVUsSUFBQSxHQUFHLEVBQUVNO0FBQWYsSUFERjtBQUdEOzs0QkFFY3NDLGVBQU1DLFVBQU4sQ0FBaUJoRCxlQUFqQixDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZVJlZiwgdXNlRWZmZWN0LCB1c2VJbXBlcmF0aXZlSGFuZGxlLCB1c2VTdGF0ZSwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDb2RlTWlycm9yIGZyb20gJ2NvZGVtaXJyb3InO1xuaW1wb3J0ICdjb2RlbWlycm9yL21vZGUvbWV0YSc7XG5pbXBvcnQgJy4vY29kZW1pcnJvci5jc3MnO1xuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgdGFiU2l6ZTogMixcbiAgYXV0b0Nsb3NlQnJhY2tldHM6IHRydWUsXG4gIG1hdGNoQnJhY2tldHM6IHRydWUsXG4gIHNob3dDdXJzb3JXaGVuU2VsZWN0aW5nOiB0cnVlLFxuICAvLyDmmL7npLrooYzlj7dcbiAgbGluZU51bWJlcnM6IHRydWUsXG4gIGZ1bGxTY3JlZW46IHRydWUsXG59XG5cbmZ1bmN0aW9uIFJlYWN0Q29kZU1pcnJvcihwcm9wcyA9IHt9LCByZWYpIHtcbiAgY29uc3QgeyBvcHRpb25zID0ge30sIHZhbHVlID0gJycsIHdpZHRoID0gJzEwMCUnLCBoZWlnaHQgPSAnMTAwJScgIH0gPSBwcm9wcztcbiAgY29uc3QgW2VkaXRvciwgc2V0RWRpdG9yXSA9IHVzZVN0YXRlKCk7XG4gIGNvbnN0IHRleHRhcmVhUmVmID0gdXNlUmVmKCk7XG4gIGNvbnN0IGxhc3Rlc3RQcm9wcyA9IHVzZVJlZihwcm9wcyk7XG5cbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+ICh7IGVkaXRvciB9KSwgW2VkaXRvcl0pO1xuICBsYXN0ZXN0UHJvcHMuY3VycmVudCA9IHByb3BzO1xuICBcbiAgLy8g5bCGcHJvcHPkuK3miYDmnInnmoTkuovku7blpITnkIblh73mlbDmmKDlsITlubbkv53lrZhcbiAgZnVuY3Rpb24gZ2V0RXZlbnRIYW5kbGVGcm9tUHJvcHMoKSB7XG4gICAgY29uc3QgcHJvcE5hbWVzID0gT2JqZWN0LmtleXMocHJvcHMpO1xuICAgIGNvbnN0IGV2ZW50SGFuZGxlID0gcHJvcE5hbWVzLmZpbHRlcigoa2V5TmFtZSkgPT4ge1xuICAgICAgcmV0dXJuIC9eb24rLy50ZXN0KGtleU5hbWUpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZXZlbnREaWN0ID0ge307XG4gICAgZXZlbnRIYW5kbGUuZm9yRWFjaCgoZWxlKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gZWxlLnNsaWNlKDIpO1xuICAgICAgaWYgKG5hbWUgJiYgbmFtZVswXSkge1xuICAgICAgICBldmVudERpY3RbZWxlXSA9IG5hbWUucmVwbGFjZShuYW1lWzBdLCBuYW1lWzBdLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGV2ZW50RGljdDtcbiAgfVxuXG4gIC8vIGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjY29uZmlnXG4gIGFzeW5jIGZ1bmN0aW9uIHNldE9wdGlvbnMoaW5zdGFuY2UsIG9wdCA9IHt9KSB7XG4gICAgaWYgKHR5cGVvZiBvcHQgPT09ICdvYmplY3QnICYmIHdpbmRvdykge1xuICAgICAgY29uc3QgbW9kZSA9IENvZGVNaXJyb3IuZmluZE1vZGVCeU5hbWUob3B0Lm1vZGUgfHwgJycpO1xuICAgICAgaWYgKG1vZGUgJiYgbW9kZS5tb2RlKSB7XG4gICAgICAgIGF3YWl0IGltcG9ydChgY29kZW1pcnJvci9tb2RlLyR7bW9kZS5tb2RlfS8ke21vZGUubW9kZX0uanNgKTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlKSB7XG4gICAgICAgIG9wdC5tb2RlID0gbW9kZS5taW1lO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmtleXMob3B0KS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgIGlmICgob3B0W25hbWVdIHx8IG9wdFtuYW1lXSA9PT0gZmFsc2UpICYmIEpTT04uc3RyaW5naWZ5KG9wdFtuYW1lXSkpIHtcbiAgICAgICAgICBpbnN0YW5jZS5zZXRPcHRpb24obmFtZSwgb3B0W25hbWVdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWVkaXRvciAmJiB3aW5kb3cpIHtcbiAgICAgIC8vIOeUn+aIkGNvZGVtaXJyb3Llrp7kvotcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEodGV4dGFyZWFSZWYuY3VycmVudCwgey4uLmRlZmF1bHRPcHRpb25zLCAuLi5vcHRpb25zfSk7XG4gICAgICBjb25zdCBldmVudERpY3QgPSBnZXRFdmVudEhhbmRsZUZyb21Qcm9wcygpO1xuICAgICAgT2JqZWN0LmtleXMoZXZlbnREaWN0KS5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgICBpbnN0YW5jZS5vbihldmVudERpY3RbZXZlbnRdLCAoLi4ucGFyYW1zKSA9PiBsYXN0ZXN0UHJvcHMuY3VycmVudFtldmVudF0oLi4ucGFyYW1zKSk7XG4gICAgICB9KTtcbiAgICAgIGluc3RhbmNlLnNldFZhbHVlKHZhbHVlIHx8ICcnKTtcblxuICAgICAgaWYgKHdpZHRoIHx8IGhlaWdodCkge1xuICAgICAgICAvLyDorr7nva7lsLrlr7hcbiAgICAgICAgaW5zdGFuY2Uuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH1cbiAgICAgIHNldEVkaXRvcihpbnN0YW5jZSk7XG4gICAgICBzZXRPcHRpb25zKGluc3RhbmNlLCB7Li4uZGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnN9KTtcbiAgICB9XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChlZGl0b3IgJiYgd2luZG93KSB7XG4gICAgICAgIGVkaXRvci50b1RleHRBcmVhKCk7XG4gICAgICAgIHNldEVkaXRvcih1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW10pO1xuXG4gIHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICghZWRpdG9yIHx8ICF3aW5kb3cpIHJldHVybjtcbiAgICBjb25zdCB2YWwgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gdmFsKSB7XG4gICAgICBlZGl0b3Iuc2V0VmFsdWUodmFsdWUpO1xuICAgIH1cbiAgfSwgW3ZhbHVlXSk7XG5cbiAgdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFlZGl0b3IgfHwgIXdpbmRvdykgcmV0dXJuO1xuICAgIGVkaXRvci5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICB9LCBbd2lkdGgsIGhlaWdodF0pO1xuXG5cbiAgdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFlZGl0b3IgfHwgIXdpbmRvdykgcmV0dXJuO1xuICAgIHNldE9wdGlvbnMoZWRpdG9yLCB7Li4uZGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnN9KTtcbiAgfSwgW2VkaXRvciwgb3B0aW9uc10pO1xuICBcbiAgcmV0dXJuIChcbiAgICA8dGV4dGFyZWEgcmVmPXt0ZXh0YXJlYVJlZn0gLz5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVhY3QuZm9yd2FyZFJlZihSZWFjdENvZGVNaXJyb3IpO1xuIl19