@taufik-nurrohman/text-editor.source 3.0.3 → 3.0.5
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 +1 -2
- package/index.js +81 -103
- package/index.min.js +1 -1
- package/index.mjs +46 -70
- package/package.json +1 -1
package/README.md
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
[Text Editor](https://github.com/taufik-nurrohman/text-editor) » Source
|
2
2
|
=============================================================================
|
3
3
|
|
4
|
-
|
5
|
-
key strokes to generate responses like in a typical source code editor.
|
4
|
+
This extension provides a set of key strokes to generate responses like in a typical source code editor.
|
6
5
|
|
7
6
|

|
8
7
|

|
package/index.js
CHANGED
@@ -33,19 +33,25 @@
|
|
33
33
|
var isArray = function isArray(x) {
|
34
34
|
return Array.isArray(x);
|
35
35
|
};
|
36
|
-
var isDefined
|
36
|
+
var isDefined = function isDefined(x) {
|
37
37
|
return 'undefined' !== typeof x;
|
38
38
|
};
|
39
39
|
var isFunction = function isFunction(x) {
|
40
40
|
return 'function' === typeof x;
|
41
41
|
};
|
42
|
-
var isInstance
|
43
|
-
|
42
|
+
var isInstance = function isInstance(x, of, exact) {
|
43
|
+
if (!x || 'object' !== typeof x) {
|
44
|
+
return false;
|
45
|
+
}
|
46
|
+
if (exact) {
|
47
|
+
return isSet(of) && isSet(x.constructor) && of === x.constructor;
|
48
|
+
}
|
49
|
+
return isSet(of) && x instanceof of ;
|
44
50
|
};
|
45
51
|
var isInteger = function isInteger(x) {
|
46
52
|
return isNumber(x) && 0 === x % 1;
|
47
53
|
};
|
48
|
-
var isNull
|
54
|
+
var isNull = function isNull(x) {
|
49
55
|
return null === x;
|
50
56
|
};
|
51
57
|
var isNumber = function isNumber(x) {
|
@@ -55,13 +61,13 @@
|
|
55
61
|
if (isPlain === void 0) {
|
56
62
|
isPlain = true;
|
57
63
|
}
|
58
|
-
if ('object' !== typeof x) {
|
64
|
+
if (!x || 'object' !== typeof x) {
|
59
65
|
return false;
|
60
66
|
}
|
61
|
-
return isPlain ? isInstance
|
67
|
+
return isPlain ? isInstance(x, Object, 1) : true;
|
62
68
|
};
|
63
|
-
var isSet
|
64
|
-
return isDefined
|
69
|
+
var isSet = function isSet(x) {
|
70
|
+
return isDefined(x) && !isNull(x);
|
65
71
|
};
|
66
72
|
var toCount = function toCount(x) {
|
67
73
|
return x.length;
|
@@ -77,7 +83,7 @@
|
|
77
83
|
for (var i = 0, j = toCount(lot); i < j; ++i) {
|
78
84
|
for (var k in lot[i]) {
|
79
85
|
// Assign value
|
80
|
-
if (!isSet
|
86
|
+
if (!isSet(out[k])) {
|
81
87
|
out[k] = lot[i][k];
|
82
88
|
continue;
|
83
89
|
}
|
@@ -116,18 +122,6 @@
|
|
116
122
|
var offEventDefault = function offEventDefault(e) {
|
117
123
|
return e && e.preventDefault();
|
118
124
|
};
|
119
|
-
var isDefined = function isDefined(x) {
|
120
|
-
return 'undefined' !== typeof x;
|
121
|
-
};
|
122
|
-
var isInstance = function isInstance(x, of) {
|
123
|
-
return x && isSet(of) && x instanceof of ;
|
124
|
-
};
|
125
|
-
var isNull = function isNull(x) {
|
126
|
-
return null === x;
|
127
|
-
};
|
128
|
-
var isSet = function isSet(x) {
|
129
|
-
return isDefined(x) && !isNull(x);
|
130
|
-
};
|
131
125
|
var isPattern = function isPattern(pattern) {
|
132
126
|
return isInstance(pattern, RegExp);
|
133
127
|
};
|
@@ -140,6 +134,13 @@
|
|
140
134
|
var ALT_PREFIX = 'Alt-';
|
141
135
|
var CTRL_PREFIX = 'Control-';
|
142
136
|
var SHIFT_PREFIX = 'Shift-';
|
137
|
+
var KEY_ARROW_DOWN = 'ArrowDown';
|
138
|
+
var KEY_ARROW_LEFT = 'ArrowLeft';
|
139
|
+
var KEY_ARROW_RIGHT = 'ArrowRight';
|
140
|
+
var KEY_ARROW_UP = 'ArrowUp';
|
141
|
+
var KEY_DELETE_LEFT = 'Backspace';
|
142
|
+
var KEY_DELETE_RIGHT = 'Delete';
|
143
|
+
var KEY_ENTER = 'Enter';
|
143
144
|
var bounce = debounce(function ($) {
|
144
145
|
return $.record();
|
145
146
|
}, 10);
|
@@ -172,7 +173,7 @@
|
|
172
173
|
lineBefore = before.split('\n').pop(),
|
173
174
|
lineMatch = /^\s+/.exec(lineBefore),
|
174
175
|
lineMatchIndent = lineMatch && lineMatch[0] || "";
|
175
|
-
if (CTRL_PREFIX + SHIFT_PREFIX +
|
176
|
+
if (CTRL_PREFIX + SHIFT_PREFIX + KEY_ENTER === keys) {
|
176
177
|
if (before || after) {
|
177
178
|
// Insert line above with `⎈⇧↵`
|
178
179
|
offEventDefault(e);
|
@@ -180,7 +181,7 @@
|
|
180
181
|
}
|
181
182
|
return;
|
182
183
|
}
|
183
|
-
if (CTRL_PREFIX +
|
184
|
+
if (CTRL_PREFIX + KEY_ENTER === keys) {
|
184
185
|
if (before || after) {
|
185
186
|
// Insert line below with `⎈↵`
|
186
187
|
offEventDefault(e);
|
@@ -200,7 +201,7 @@
|
|
200
201
|
}
|
201
202
|
return;
|
202
203
|
}
|
203
|
-
if (
|
204
|
+
if (KEY_DELETE_LEFT === keys || KEY_DELETE_RIGHT === keys) {
|
204
205
|
charAfter = charPairs[charBefore = before.slice(-1)];
|
205
206
|
// Do nothing on escape
|
206
207
|
if ('\\' === charBefore) {
|
@@ -222,7 +223,7 @@
|
|
222
223
|
}
|
223
224
|
}
|
224
225
|
// Outdent
|
225
|
-
if (
|
226
|
+
if (KEY_DELETE_RIGHT !== keys && lineBefore.endsWith(charIndent)) {
|
226
227
|
offEventDefault(e);
|
227
228
|
return $.pull(charIndent).record();
|
228
229
|
}
|
@@ -235,7 +236,7 @@
|
|
235
236
|
}
|
236
237
|
return;
|
237
238
|
}
|
238
|
-
if (
|
239
|
+
if (KEY_ENTER === keys || SHIFT_PREFIX + KEY_ENTER === keys) {
|
239
240
|
if (!value) {
|
240
241
|
if (after && before && (charAfter = charPairs[charBefore = before.slice(-1)]) && charAfter === after[0]) {
|
241
242
|
offEventDefault(e);
|
@@ -294,14 +295,14 @@
|
|
294
295
|
tokens.push('\\w+'); // Word(s)
|
295
296
|
tokens.push('\\s+'); // White-space(s)
|
296
297
|
tokens.push('[\\s\\S]'); // Last try!
|
297
|
-
if (CTRL_PREFIX +
|
298
|
+
if (CTRL_PREFIX + KEY_ARROW_LEFT === keys) {
|
298
299
|
offEventDefault(e);
|
299
300
|
if (m = toPattern('(' + tokens.join('|') + ')$', "").exec(before)) {
|
300
301
|
return $.insert("").select(start - toCount(m[0])).insert(value).record();
|
301
302
|
}
|
302
303
|
return $.select();
|
303
304
|
}
|
304
|
-
if (CTRL_PREFIX +
|
305
|
+
if (CTRL_PREFIX + KEY_ARROW_RIGHT === keys) {
|
305
306
|
offEventDefault(e);
|
306
307
|
if (m = after.match(toPattern('^(' + tokens.join('|') + ')', ""))) {
|
307
308
|
return $.insert("").select(end + toCount(m[0]) - toCount(value)).insert(value).record();
|
@@ -313,7 +314,7 @@
|
|
313
314
|
end += toCount(lineAfter);
|
314
315
|
start -= toCount(lineBefore);
|
315
316
|
value = lineBefore + value + lineAfter;
|
316
|
-
if (CTRL_PREFIX +
|
317
|
+
if (CTRL_PREFIX + KEY_ARROW_UP === keys) {
|
317
318
|
offEventDefault(e);
|
318
319
|
if (!hasValue('\n', before)) {
|
319
320
|
return $.select();
|
@@ -329,7 +330,7 @@
|
|
329
330
|
$.select(start, start + toCount(value));
|
330
331
|
return $.record();
|
331
332
|
}
|
332
|
-
if (CTRL_PREFIX +
|
333
|
+
if (CTRL_PREFIX + KEY_ARROW_DOWN === keys) {
|
333
334
|
offEventDefault(e);
|
334
335
|
if (!hasValue('\n', after)) {
|
335
336
|
return $.select();
|
@@ -348,10 +349,14 @@
|
|
348
349
|
}
|
349
350
|
return;
|
350
351
|
}
|
352
|
+
// Partial mobile support
|
353
|
+
function onPutDown(e) {
|
354
|
+
onKeyDown.call(this, e);
|
355
|
+
}
|
351
356
|
|
352
357
|
function attach() {
|
353
358
|
var $ = this;
|
354
|
-
var $$ = $.constructor.
|
359
|
+
var $$ = $.constructor._;
|
355
360
|
$.state = fromStates({
|
356
361
|
pairs: {
|
357
362
|
'`': '`',
|
@@ -370,9 +375,9 @@
|
|
370
375
|
!isFunction($$.confirm) && ($$.confirm = function (hint, then) {
|
371
376
|
return isFunction(then) && then.call(this, W.confirm && W.confirm(hint));
|
372
377
|
});
|
373
|
-
!isFunction($$.
|
374
|
-
var $ = this
|
375
|
-
|
378
|
+
!isFunction($$.insertLine) && ($$.insertLine = function (value, mode) {
|
379
|
+
var $ = this,
|
380
|
+
_$$$2 = $.$(),
|
376
381
|
after = _$$$2.after,
|
377
382
|
before = _$$$2.before,
|
378
383
|
end = _$$$2.end,
|
@@ -391,69 +396,45 @@
|
|
391
396
|
}
|
392
397
|
return $.select(start - lineBeforeCount, end + lineAfterCount).insert(value, mode, true).wrap(lineMatchIndent, "");
|
393
398
|
});
|
394
|
-
!isFunction($$.
|
395
|
-
|
396
|
-
|
397
|
-
after = _$$$3.after,
|
398
|
-
before = _$$$3.before,
|
399
|
-
end = _$$$3.end,
|
400
|
-
start = _$$$3.start,
|
401
|
-
value = _$$$3.value,
|
402
|
-
closeCount = toCount(close),
|
403
|
-
lineAfter = after.split('\n').shift(),
|
404
|
-
lineAfterCount = toCount(lineAfter),
|
405
|
-
lineBefore = before.split('\n').pop(),
|
406
|
-
lineBeforeCount = toCount(lineBefore),
|
407
|
-
openCount = toCount(open);
|
408
|
-
if (wrap && close === value.slice(-closeCount) && open === value.slice(0, openCount) || close === lineAfter.slice(-closeCount) && open === lineBefore.slice(0, openCount)) {
|
409
|
-
return $.select(start - lineBeforeCount + (wrap ? 0 : openCount), end + lineAfterCount - (wrap ? 0 : closeCount)).peel(open, close, wrap);
|
399
|
+
!isFunction($$.peelLine) && ($$.peelLine = function (open, close, wrap, withSpaces) {
|
400
|
+
if (withSpaces === void 0) {
|
401
|
+
withSpaces = false;
|
410
402
|
}
|
411
|
-
return
|
403
|
+
return this.selectLine(withSpaces).peel(open, close, wrap);
|
412
404
|
});
|
413
405
|
!isFunction($$.prompt) && ($$.prompt = function (hint, value, then) {
|
414
406
|
return isFunction(then) && then.call(this, W.prompt ? W.prompt(hint, value) : false);
|
415
407
|
});
|
416
|
-
!isFunction($$.
|
408
|
+
!isFunction($$.selectLine) && ($$.selectLine = function (withSpaces) {
|
417
409
|
if (withSpaces === void 0) {
|
418
410
|
withSpaces = true;
|
419
411
|
}
|
420
|
-
var $ = this
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
412
|
+
var $ = this,
|
413
|
+
m,
|
414
|
+
_$$$3 = $.$(),
|
415
|
+
after = _$$$3.after,
|
416
|
+
before = _$$$3.before,
|
417
|
+
end = _$$$3.end,
|
418
|
+
start = _$$$3.start,
|
427
419
|
lineAfter = after.split('\n').shift(),
|
428
420
|
lineAfterCount = toCount(lineAfter),
|
429
421
|
lineBefore = before.split('\n').pop(),
|
430
422
|
lineBeforeCount = toCount(lineBefore);
|
431
|
-
if (!withSpaces) {
|
432
|
-
var lineAfterSpaces = /\s+$/.exec(lineAfter),
|
433
|
-
lineBeforeSpaces = /^\s+/.exec(lineBefore);
|
434
|
-
if (lineAfterSpaces) {
|
435
|
-
lineAfterCount -= toCount(lineAfterSpaces[0]);
|
436
|
-
}
|
437
|
-
if (lineBeforeSpaces) {
|
438
|
-
lineBeforeCount -= toCount(lineBeforeSpaces[0]);
|
439
|
-
}
|
440
|
-
}
|
441
423
|
$.select(start - lineBeforeCount, end + lineAfterCount);
|
442
424
|
if (!withSpaces) {
|
443
|
-
var
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
return $.select(start + toCount(m[1] || ""), end - toCount(m[2] || ""));
|
425
|
+
var _$$$4 = $.$(),
|
426
|
+
_end = _$$$4.end,
|
427
|
+
_start = _$$$4.start,
|
428
|
+
value = _$$$4.value;
|
429
|
+
if (m = /^(\s+)?[\s\S]*?(\s+)?$/.exec(value)) {
|
430
|
+
return $.select(_start + toCount(m[1] || ""), _end - toCount(m[2] || ""));
|
450
431
|
}
|
451
432
|
}
|
452
433
|
return $;
|
453
434
|
});
|
454
435
|
!isFunction($$.toggle) && ($$.toggle = function (open, close, wrap) {
|
455
|
-
var $ = this
|
456
|
-
|
436
|
+
var $ = this,
|
437
|
+
_$$$5 = $.$(),
|
457
438
|
after = _$$$5.after,
|
458
439
|
before = _$$$5.before,
|
459
440
|
value = _$$$5.value,
|
@@ -464,39 +445,36 @@
|
|
464
445
|
}
|
465
446
|
return $.wrap(open, close, wrap);
|
466
447
|
});
|
467
|
-
!isFunction($$.
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
448
|
+
!isFunction($$.toggleLine) && ($$.toggleLine = function (open, close, wrap, withSpaces) {
|
449
|
+
if (withSpaces === void 0) {
|
450
|
+
withSpaces = false;
|
451
|
+
}
|
452
|
+
var $ = this.selectLine(withSpaces),
|
453
|
+
_$$$6 = $.$();
|
454
|
+
_$$$6.after;
|
455
|
+
_$$$6.before;
|
456
|
+
var value = _$$$6.value,
|
473
457
|
closeCount = toCount(close),
|
474
|
-
lineAfter = after.split('\n').shift(),
|
475
|
-
lineBefore = before.split('\n').pop(),
|
476
458
|
openCount = toCount(open);
|
477
|
-
if (wrap && close === value.slice(-closeCount) && open === value.slice(0, openCount)
|
478
|
-
|
459
|
+
if (!wrap && close === value.slice(-closeCount) && open === value.slice(0, openCount)) {
|
460
|
+
var _$$$7 = $.$(),
|
461
|
+
end = _$$$7.end,
|
462
|
+
start = _$$$7.start;
|
463
|
+
$.select(start + openCount, end - closeCount);
|
479
464
|
}
|
480
|
-
return $.
|
465
|
+
return $.toggle(open, close, wrap);
|
481
466
|
});
|
482
|
-
!isFunction($$.
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
end = _$$$7.end,
|
488
|
-
start = _$$$7.start,
|
489
|
-
lineAfter = after.split('\n').shift(),
|
490
|
-
lineAfterCount = toCount(lineAfter),
|
491
|
-
lineBefore = before.split('\n').pop(),
|
492
|
-
lineBeforeCount = toCount(lineBefore);
|
493
|
-
return $.select(start - lineBeforeCount, end + lineAfterCount).wrap(open, close, wrap);
|
467
|
+
!isFunction($$.wrapLine) && ($$.wrapLine = function (open, close, wrap, withSpaces) {
|
468
|
+
if (withSpaces === void 0) {
|
469
|
+
withSpaces = false;
|
470
|
+
}
|
471
|
+
return this.selectLine(withSpaces).wrap(open, close, wrap);
|
494
472
|
});
|
495
|
-
return $.on('key.down', onKeyDown).record();
|
473
|
+
return $.on('key.down', onKeyDown).on('put.down', onPutDown).record();
|
496
474
|
}
|
497
475
|
|
498
476
|
function detach() {
|
499
|
-
return this.off('key.down', onKeyDown);
|
477
|
+
return this.off('key.down', onKeyDown).off('put.down', onPutDown);
|
500
478
|
}
|
501
479
|
var index_js = {
|
502
480
|
attach: attach,
|
package/index.min.js
CHANGED
@@ -23,4 +23,4 @@
|
|
23
23
|
* SOFTWARE.
|
24
24
|
*
|
25
25
|
*/
|
26
|
-
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define(r):((e="undefined"!=typeof globalThis?globalThis:e||self).TextEditor=e.TextEditor||{},e.TextEditor.Source=r())}(this,(function(){"use strict";var e,r,t,n=function(e,r){return-1!==r.indexOf(e)},i=function(e){return Array.isArray(e)},o=function(e){return"function"==typeof e},s=function(e){return"number"==typeof e},
|
26
|
+
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define(r):((e="undefined"!=typeof globalThis?globalThis:e||self).TextEditor=e.TextEditor||{},e.TextEditor.Source=r())}(this,(function(){"use strict";var e,r,t,n=function(e,r){return-1!==r.indexOf(e)},i=function(e){return Array.isArray(e)},o=function(e){return"function"==typeof e},s=function(e,r,t){return!(!e||"object"!=typeof e)&&(t?u(r)&&u(e.constructor)&&r===e.constructor:u(r)&&e instanceof r)},c=function(e){return"number"==typeof e},f=function(e,r){return void 0===r&&(r=!0),!(!e||"object"!=typeof e)&&(!r||s(e,Object,1))},u=function(e){return function(e){return void 0!==e}(e)&&!function(e){return null===e}(e)},l=function(e){return e.length},a=function e(){for(var r=arguments.length,t=Array(r),o=0;o<r;o++)t[o]=arguments[o];for(var s=t.shift(),c=0,a=l(t);c<a;++c)for(var p in t[c])if(u(s[p]))if(i(s[p])&&i(t[c][p])){s[p]=[].concat(s[p]);for(var d=0,h=l(t[c][p]);d<h;++d)n(t[c][p][d],s[p])||s[p].push(t[c][p][d])}else f(s[p])&&f(t[c][p])?s[p]=e({},s[p],t[c][p]):s[p]=t[c][p];else s[p]=t[c][p];return s},p=window,d=function(e){return e&&e.preventDefault()},h=function(e,r){return function(e){return s(e,RegExp)}(e)?e:RegExp(e,u(r)?r:"g")},v="Control-",w="Shift-",g="Delete",m="Enter",$=(e=function(e){return e.record()},r=10,function(){var n=arguments,i=this;t&&clearTimeout(t),t=setTimeout((function(){return e.apply(i,n)}),r)});function b(e){var r=this,t=r.k(!1).pop(),i=r.k();if($(r),!e.defaultPrevented&&!r.keys[i]){var o,s,f=r.state.tab||"\t",u=r.state.pairs||{},a=Object.values(u);(function(e){return c(e)&&0==e%1})(f)&&(f=" ".repeat(f));var p=r.$(),b=p.after,y=p.before,L=p.end,x=p.start,A=p.value,T=b.split("\n").shift(),j=y.split("\n").pop(),k=/^\s+/.exec(j),E=k&&k[0]||"";if(v+w+m===i)return y||b?(d(e),r.select(x-l(j)).wrap(E,"\n").insert(A).record(),!1):void 0;if(v+m===i&&(y||b))return d(e),r.select(L+l(T)).wrap("\n"+E,"").insert(A).record(),!1;if("Alt-"!=i+"-"&&v!==i+"-"){if(" "===i)return o=u[s=y.slice(-1)],!A&&o&&s&&o===b[0]?(d(e),r.wrap(" "," ")):void 0;if("Backspace"===i||g===i){if(o=u[s=y.slice(-1)],"\\"===s)return;return A?b&&y&&o&&o===b[0]&&!y.endsWith("\\"+s)?(d(e),r.record().peel(s,o).record()):void 0:(o=u[s=y.trim().slice(-1)])&&s&&(b.startsWith(" "+o)&&y.endsWith(s+" ")||b.startsWith("\n"+E+o)&&y.endsWith(s+"\n"+E))?(d(e),r.trim("","").record()):g!==i&&j.endsWith(f)?(d(e),r.pull(f).record()):b&&y&&!y.endsWith("\\"+s)&&o===b[0]&&s===y.slice(-1)?(d(e),r.peel(s,o).record()):void 0}if(m!==i&&w+m!==i){if("\\"!==(s=y.slice(-1))){if(o=n(b[0],a)?b[0]:u[s],!A&&b&&y&&o&&t===o)return d(e),r.select(x+1).record();for(s in u){if(o=u[s],t===s&&o)return d(e),r.wrap(s,o).record();if(t===o){if(A)return d(e),r.record().wrap(s,o).record();break}}var W,S,D,O=[];if(A){for(W in u)(S=u[W])&&O.push("(?:\\"+W+"(?:\\\\.|[^\\"+W+(S!==W?"\\"+S:"")+"])*\\"+S+")");if(O.push("\\w+"),O.push("\\s+"),O.push("[\\s\\S]"),v+"ArrowLeft"===i)return d(e),(D=h("("+O.join("|")+")$","").exec(y))?r.insert("").select(x-l(D[0])).insert(A).record():r.select();if(v+"ArrowRight"===i)return d(e),(D=b.match(h("^("+O.join("|")+")","")))?r.insert("").select(L+l(D[0])-l(A)).insert(A).record():r.select()}if(L+=l(T),x-=l(j),A=j+A+T,v+"ArrowUp"===i){if(d(e),!n("\n",y))return r.select();r.insert(""),r.replace(/^([^\n]*?)(\n|$)/,"$2",1),r.replace(/(^|\n)([^\n]*?)$/,"",-1);var R=r.$();return y=R.before,x=R.start,j=y.split("\n").pop(),r.select(x-=l(j)).wrap(A,"\n"),r.select(x,x+l(A)),r.record()}if(v+"ArrowDown"===i){if(d(e),!n("\n",b))return r.select();r.insert(""),r.replace(/^([^\n]*?)(\n|$)/,"",1),r.replace(/(^|\n)([^\n]*?)$/,"$1",-1);var B=r.$();return b=B.after,L=B.end,T=b.split("\n").shift(),r.select(L+=l(T)).wrap("\n",A),L+=1,r.select(L,L+l(A)),r.record()}}}else if(!A){if(b&&y&&(o=u[s=y.slice(-1)])&&o===b[0])return d(e),r.wrap("\n"+E+(s!==o?f:""),"\n"+E).record();if(E)return d(e),r.insert("\n"+E,-1).record()}}else d(e)}}function y(e){b.call(this,e)}var L={attach:function(){var e=this,r=e.constructor._;return e.state=a({pairs:{"`":"`","(":")","{":"}","[":"]",'"':'"',"'":"'","<":">"}},e.state),!o(r.alert)&&(r.alert=function(e,r){return p.alert&&p.alert(e),o(r)&&r.call(this,!0)}),!o(r.confirm)&&(r.confirm=function(e,r){return o(r)&&r.call(this,p.confirm&&p.confirm(e))}),!o(r.insertLine)&&(r.insertLine=function(e,r){var t=this,n=t.$(),i=n.after,o=n.before,s=n.end,c=n.start,f=i.split("\n").shift(),u=l(f),a=o.split("\n").pop(),p=l(a),d=/^\s+/.exec(a),h=d&&d[0]||"";return-1===r?t.select(c-p).insert("\n",1).push(h).insert(e,1,!1):1===r?t.select(s+u).insert("\n",-1).push(h).insert(e,1,!1):t.select(c-p,s+u).insert(e,r,!0).wrap(h,"")}),!o(r.peelLine)&&(r.peelLine=function(e,r,t,n){return void 0===n&&(n=!1),this.selectLine(n).peel(e,r,t)}),!o(r.prompt)&&(r.prompt=function(e,r,t){return o(t)&&t.call(this,!!p.prompt&&p.prompt(e,r))}),!o(r.selectLine)&&(r.selectLine=function(e){void 0===e&&(e=!0);var r,t=this,n=t.$(),i=n.after,o=n.before,s=n.end,c=n.start,f=i.split("\n").shift(),u=l(f),a=o.split("\n").pop(),p=l(a);if(t.select(c-p,s+u),!e){var d=t.$(),h=d.end,v=d.start,w=d.value;if(r=/^(\s+)?[\s\S]*?(\s+)?$/.exec(w))return t.select(v+l(r[1]||""),h-l(r[2]||""))}return t}),!o(r.toggle)&&(r.toggle=function(e,r,t){var n=this,i=n.$(),o=i.after,s=i.before,c=i.value,f=l(r),u=l(e);return t&&r===c.slice(-f)&&e===c.slice(0,u)||r===o.slice(0,f)&&e===s.slice(-u)?n.peel(e,r,t):n.wrap(e,r,t)}),!o(r.toggleLine)&&(r.toggleLine=function(e,r,t,n){void 0===n&&(n=!1);var i=this.selectLine(n),o=i.$();o.after,o.before;var s=o.value,c=l(r),f=l(e);if(!t&&r===s.slice(-c)&&e===s.slice(0,f)){var u=i.$(),a=u.end,p=u.start;i.select(p+f,a-c)}return i.toggle(e,r,t)}),!o(r.wrapLine)&&(r.wrapLine=function(e,r,t,n){return void 0===n&&(n=!1),this.selectLine(n).wrap(e,r,t)}),e.on("key.down",b).on("put.down",y).record()},detach:function(){return this.off("key.down",b).off("put.down",y)},name:"TextEditor.Source"};return L}));
|
package/index.mjs
CHANGED
@@ -11,6 +11,14 @@ const ALT_PREFIX = 'Alt-';
|
|
11
11
|
const CTRL_PREFIX = 'Control-';
|
12
12
|
const SHIFT_PREFIX = 'Shift-';
|
13
13
|
|
14
|
+
const KEY_ARROW_DOWN = 'ArrowDown';
|
15
|
+
const KEY_ARROW_LEFT = 'ArrowLeft';
|
16
|
+
const KEY_ARROW_RIGHT = 'ArrowRight';
|
17
|
+
const KEY_ARROW_UP = 'ArrowUp';
|
18
|
+
const KEY_DELETE_LEFT = 'Backspace';
|
19
|
+
const KEY_DELETE_RIGHT = 'Delete';
|
20
|
+
const KEY_ENTER = 'Enter';
|
21
|
+
|
14
22
|
const bounce = debounce($ => $.record(), 10);
|
15
23
|
const name = 'TextEditor.Source';
|
16
24
|
|
@@ -35,7 +43,7 @@ function onKeyDown(e) {
|
|
35
43
|
lineBefore = before.split('\n').pop(),
|
36
44
|
lineMatch = /^\s+/.exec(lineBefore),
|
37
45
|
lineMatchIndent = lineMatch && lineMatch[0] || "";
|
38
|
-
if (CTRL_PREFIX + SHIFT_PREFIX +
|
46
|
+
if (CTRL_PREFIX + SHIFT_PREFIX + KEY_ENTER === keys) {
|
39
47
|
if (before || after) {
|
40
48
|
// Insert line above with `⎈⇧↵`
|
41
49
|
offEventDefault(e);
|
@@ -43,7 +51,7 @@ function onKeyDown(e) {
|
|
43
51
|
}
|
44
52
|
return;
|
45
53
|
}
|
46
|
-
if (CTRL_PREFIX +
|
54
|
+
if (CTRL_PREFIX + KEY_ENTER === keys) {
|
47
55
|
if (before || after) {
|
48
56
|
// Insert line below with `⎈↵`
|
49
57
|
offEventDefault(e);
|
@@ -63,7 +71,7 @@ function onKeyDown(e) {
|
|
63
71
|
}
|
64
72
|
return;
|
65
73
|
}
|
66
|
-
if (
|
74
|
+
if (KEY_DELETE_LEFT === keys || KEY_DELETE_RIGHT === keys) {
|
67
75
|
charAfter = charPairs[charBefore = before.slice(-1)];
|
68
76
|
// Do nothing on escape
|
69
77
|
if ('\\' === charBefore) {
|
@@ -88,7 +96,7 @@ function onKeyDown(e) {
|
|
88
96
|
}
|
89
97
|
}
|
90
98
|
// Outdent
|
91
|
-
if (
|
99
|
+
if (KEY_DELETE_RIGHT !== keys && lineBefore.endsWith(charIndent)) {
|
92
100
|
offEventDefault(e);
|
93
101
|
return $.pull(charIndent).record();
|
94
102
|
}
|
@@ -101,7 +109,7 @@ function onKeyDown(e) {
|
|
101
109
|
}
|
102
110
|
return;
|
103
111
|
}
|
104
|
-
if (
|
112
|
+
if (KEY_ENTER === keys || SHIFT_PREFIX + KEY_ENTER === keys) {
|
105
113
|
if (!value) {
|
106
114
|
if (after && before && (charAfter = charPairs[charBefore = before.slice(-1)]) && charAfter === after[0]) {
|
107
115
|
offEventDefault(e);
|
@@ -159,14 +167,14 @@ function onKeyDown(e) {
|
|
159
167
|
tokens.push('\\w+'); // Word(s)
|
160
168
|
tokens.push('\\s+'); // White-space(s)
|
161
169
|
tokens.push('[\\s\\S]'); // Last try!
|
162
|
-
if (CTRL_PREFIX +
|
170
|
+
if (CTRL_PREFIX + KEY_ARROW_LEFT === keys) {
|
163
171
|
offEventDefault(e);
|
164
172
|
if (m = toPattern('(' + tokens.join('|') + ')$', "").exec(before)) {
|
165
173
|
return $.insert("").select(start - toCount(m[0])).insert(value).record();
|
166
174
|
}
|
167
175
|
return $.select();
|
168
176
|
}
|
169
|
-
if (CTRL_PREFIX +
|
177
|
+
if (CTRL_PREFIX + KEY_ARROW_RIGHT === keys) {
|
170
178
|
offEventDefault(e);
|
171
179
|
if (m = after.match(toPattern('^(' + tokens.join('|') + ')', ""))) {
|
172
180
|
return $.insert("").select(end + toCount(m[0]) - toCount(value)).insert(value).record();
|
@@ -178,7 +186,7 @@ function onKeyDown(e) {
|
|
178
186
|
end += toCount(lineAfter);
|
179
187
|
start -= toCount(lineBefore);
|
180
188
|
value = lineBefore + value + lineAfter;
|
181
|
-
if (CTRL_PREFIX +
|
189
|
+
if (CTRL_PREFIX + KEY_ARROW_UP === keys) {
|
182
190
|
offEventDefault(e);
|
183
191
|
if (!hasValue('\n', before)) {
|
184
192
|
return $.select();
|
@@ -194,7 +202,7 @@ function onKeyDown(e) {
|
|
194
202
|
$.select(start, start + toCount(value));
|
195
203
|
return $.record();
|
196
204
|
}
|
197
|
-
if (CTRL_PREFIX +
|
205
|
+
if (CTRL_PREFIX + KEY_ARROW_DOWN === keys) {
|
198
206
|
offEventDefault(e);
|
199
207
|
if (!hasValue('\n', after)) {
|
200
208
|
return $.select();
|
@@ -214,9 +222,14 @@ function onKeyDown(e) {
|
|
214
222
|
return;
|
215
223
|
}
|
216
224
|
|
225
|
+
// Partial mobile support
|
226
|
+
function onPutDown(e) {
|
227
|
+
onKeyDown.call(this, e);
|
228
|
+
}
|
229
|
+
|
217
230
|
function attach() {
|
218
231
|
const $ = this;
|
219
|
-
const $$ = $.constructor.
|
232
|
+
const $$ = $.constructor._;
|
220
233
|
$.state = fromStates({
|
221
234
|
pairs: {
|
222
235
|
'`': '`',
|
@@ -235,9 +248,9 @@ function attach() {
|
|
235
248
|
!isFunction($$.confirm) && ($$.confirm = function (hint, then) {
|
236
249
|
return isFunction(then) && then.call(this, W.confirm && W.confirm(hint));
|
237
250
|
});
|
238
|
-
!isFunction($$.
|
239
|
-
let $ = this
|
240
|
-
|
251
|
+
!isFunction($$.insertLine) && ($$.insertLine = function (value, mode) {
|
252
|
+
let $ = this,
|
253
|
+
{after, before, end, start} = $.$(),
|
241
254
|
lineAfter = after.split('\n').shift(),
|
242
255
|
lineAfterCount = toCount(lineAfter),
|
243
256
|
lineBefore = before.split('\n').pop(),
|
@@ -252,58 +265,31 @@ function attach() {
|
|
252
265
|
}
|
253
266
|
return $.select(start - lineBeforeCount, end + lineAfterCount).insert(value, mode, true).wrap(lineMatchIndent, "");
|
254
267
|
});
|
255
|
-
!isFunction($$.
|
256
|
-
|
257
|
-
let {after, before, end, start, value} = $.$(),
|
258
|
-
closeCount = toCount(close),
|
259
|
-
lineAfter = after.split('\n').shift(),
|
260
|
-
lineAfterCount = toCount(lineAfter),
|
261
|
-
lineBefore = before.split('\n').pop(),
|
262
|
-
lineBeforeCount = toCount(lineBefore),
|
263
|
-
openCount = toCount(open);
|
264
|
-
if (
|
265
|
-
(wrap && close === value.slice(-closeCount) && open === value.slice(0, openCount)) ||
|
266
|
-
(close === lineAfter.slice(-closeCount) && open === lineBefore.slice(0, openCount))
|
267
|
-
) {
|
268
|
-
return $.select(start - lineBeforeCount + (wrap ? 0 : openCount), end + lineAfterCount - (wrap ? 0 : closeCount)).peel(open, close, wrap);
|
269
|
-
}
|
270
|
-
return $.select(start, end);
|
268
|
+
!isFunction($$.peelLine) && ($$.peelLine = function (open, close, wrap, withSpaces = false) {
|
269
|
+
return this.selectLine(withSpaces).peel(open, close, wrap);
|
271
270
|
});
|
272
271
|
!isFunction($$.prompt) && ($$.prompt = function (hint, value, then) {
|
273
272
|
return isFunction(then) && then.call(this, W.prompt ? W.prompt(hint, value) : false);
|
274
273
|
});
|
275
|
-
!isFunction($$.
|
276
|
-
let $ = this
|
277
|
-
|
274
|
+
!isFunction($$.selectLine) && ($$.selectLine = function (withSpaces = true) {
|
275
|
+
let $ = this, m,
|
276
|
+
{after, before, end, start} = $.$(),
|
278
277
|
lineAfter = after.split('\n').shift(),
|
279
278
|
lineAfterCount = toCount(lineAfter),
|
280
279
|
lineBefore = before.split('\n').pop(),
|
281
280
|
lineBeforeCount = toCount(lineBefore);
|
282
|
-
if (!withSpaces) {
|
283
|
-
let lineAfterSpaces = /\s+$/.exec(lineAfter),
|
284
|
-
lineBeforeSpaces = /^\s+/.exec(lineBefore);
|
285
|
-
if (lineAfterSpaces) {
|
286
|
-
lineAfterCount -= toCount(lineAfterSpaces[0]);
|
287
|
-
}
|
288
|
-
if (lineBeforeSpaces) {
|
289
|
-
lineBeforeCount -= toCount(lineBeforeSpaces[0]);
|
290
|
-
}
|
291
|
-
}
|
292
281
|
$.select(start - lineBeforeCount, end + lineAfterCount);
|
293
282
|
if (!withSpaces) {
|
294
|
-
let
|
295
|
-
|
296
|
-
start = s.start;
|
297
|
-
value = s.value;
|
298
|
-
if (m = /^(\s+)?[\s\S]+?(\s+)?$/.exec(value)) {
|
283
|
+
let {end, start, value} = $.$();
|
284
|
+
if (m = /^(\s+)?[\s\S]*?(\s+)?$/.exec(value)) {
|
299
285
|
return $.select(start + toCount(m[1] || ""), end - toCount(m[2] || ""));
|
300
286
|
}
|
301
287
|
}
|
302
288
|
return $;
|
303
289
|
});
|
304
290
|
!isFunction($$.toggle) && ($$.toggle = function (open, close, wrap) {
|
305
|
-
let $ = this
|
306
|
-
|
291
|
+
let $ = this,
|
292
|
+
{after, before, value} = $.$(),
|
307
293
|
closeCount = toCount(close),
|
308
294
|
openCount = toCount(open);
|
309
295
|
if (
|
@@ -314,35 +300,25 @@ function attach() {
|
|
314
300
|
}
|
315
301
|
return $.wrap(open, close, wrap);
|
316
302
|
});
|
317
|
-
!isFunction($$.
|
318
|
-
let $ = this
|
319
|
-
|
303
|
+
!isFunction($$.toggleLine) && ($$.toggleLine = function (open, close, wrap, withSpaces = false) {
|
304
|
+
let $ = this.selectLine(withSpaces),
|
305
|
+
{after, before, value} = $.$(),
|
320
306
|
closeCount = toCount(close),
|
321
|
-
lineAfter = after.split('\n').shift(),
|
322
|
-
lineBefore = before.split('\n').pop(),
|
323
307
|
openCount = toCount(open);
|
324
|
-
if (
|
325
|
-
|
326
|
-
(
|
327
|
-
) {
|
328
|
-
return $.peelBlock(open, close, wrap);
|
308
|
+
if (!wrap && close === value.slice(-closeCount) && open === value.slice(0, openCount)) {
|
309
|
+
let {end, start} = $.$();
|
310
|
+
$.select(start + openCount, end - closeCount);
|
329
311
|
}
|
330
|
-
return $.
|
312
|
+
return $.toggle(open, close, wrap);
|
331
313
|
});
|
332
|
-
!isFunction($$.
|
333
|
-
|
334
|
-
let {after, before, end, start} = $.$(),
|
335
|
-
lineAfter = after.split('\n').shift(),
|
336
|
-
lineAfterCount = toCount(lineAfter),
|
337
|
-
lineBefore = before.split('\n').pop(),
|
338
|
-
lineBeforeCount = toCount(lineBefore);
|
339
|
-
return $.select(start - lineBeforeCount, end + lineAfterCount).wrap(open, close, wrap);
|
314
|
+
!isFunction($$.wrapLine) && ($$.wrapLine = function (open, close, wrap, withSpaces = false) {
|
315
|
+
return this.selectLine(withSpaces).wrap(open, close, wrap);
|
340
316
|
});
|
341
|
-
return $.on('key.down', onKeyDown).record();
|
317
|
+
return $.on('key.down', onKeyDown).on('put.down', onPutDown).record();
|
342
318
|
}
|
343
319
|
|
344
320
|
function detach() {
|
345
|
-
return this.off('key.down', onKeyDown);
|
321
|
+
return this.off('key.down', onKeyDown).off('put.down', onPutDown);
|
346
322
|
}
|
347
323
|
|
348
324
|
export default {attach, detach, name};
|
package/package.json
CHANGED