@taufik-nurrohman/text-editor.source 3.0.3 → 3.0.4

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 CHANGED
@@ -1,8 +1,7 @@
1
1
  [Text Editor](https://github.com/taufik-nurrohman/text-editor) » Source
2
2
  =============================================================================
3
3
 
4
- Source extension for [Text Editor](https://github.com/taufik-nurrohman/text-editor). This extension provides a set of
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
  ![index.js](https://img.shields.io/github/size/taufik-nurrohman/text-editor.source/index.js?branch=main&color=%23f1e05a&label=index.js&labelColor=%231f2328&style=flat-square)
8
7
  ![index.min.js](https://img.shields.io/github/size/taufik-nurrohman/text-editor.source/index.min.js?branch=main&color=%23f1e05a&label=index.min.js&labelColor=%231f2328&style=flat-square)
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$1 = function isDefined(x) {
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$1 = function isInstance(x, of) {
43
- return x && isSet$1(of) && x instanceof of ;
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$1 = function isNull(x) {
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$1(x, Object) : true;
67
+ return isPlain ? isInstance(x, Object, 1) : true;
62
68
  };
63
- var isSet$1 = function isSet(x) {
64
- return isDefined$1(x) && !isNull$1(x);
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$1(out[k])) {
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 + 'Enter' === keys) {
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 + 'Enter' === keys) {
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 ('Backspace' === keys || 'Delete' === keys) {
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 ('Delete' !== keys && lineBefore.endsWith(charIndent)) {
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 ('Enter' === keys || SHIFT_PREFIX + 'Enter' === keys) {
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 + 'ArrowLeft' === keys) {
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 + 'ArrowRight' === keys) {
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 + 'ArrowUp' === keys) {
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 + 'ArrowDown' === keys) {
333
+ if (CTRL_PREFIX + KEY_ARROW_DOWN === keys) {
333
334
  offEventDefault(e);
334
335
  if (!hasValue('\n', after)) {
335
336
  return $.select();
@@ -351,7 +352,7 @@
351
352
 
352
353
  function attach() {
353
354
  var $ = this;
354
- var $$ = $.constructor.prototype;
355
+ var $$ = $.constructor._;
355
356
  $.state = fromStates({
356
357
  pairs: {
357
358
  '`': '`',
@@ -370,9 +371,9 @@
370
371
  !isFunction($$.confirm) && ($$.confirm = function (hint, then) {
371
372
  return isFunction(then) && then.call(this, W.confirm && W.confirm(hint));
372
373
  });
373
- !isFunction($$.insertBlock) && ($$.insertBlock = function (value, mode) {
374
- var $ = this;
375
- var _$$$2 = $.$(),
374
+ !isFunction($$.insertLine) && ($$.insertLine = function (value, mode) {
375
+ var $ = this,
376
+ _$$$2 = $.$(),
376
377
  after = _$$$2.after,
377
378
  before = _$$$2.before,
378
379
  end = _$$$2.end,
@@ -391,69 +392,45 @@
391
392
  }
392
393
  return $.select(start - lineBeforeCount, end + lineAfterCount).insert(value, mode, true).wrap(lineMatchIndent, "");
393
394
  });
394
- !isFunction($$.peelBlock) && ($$.peelBlock = function (open, close, wrap) {
395
- var $ = this;
396
- var _$$$3 = $.$(),
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);
395
+ !isFunction($$.peelLine) && ($$.peelLine = function (open, close, wrap, withSpaces) {
396
+ if (withSpaces === void 0) {
397
+ withSpaces = false;
410
398
  }
411
- return $.select(start, end);
399
+ return this.selectLine(withSpaces).peel(open, close, wrap);
412
400
  });
413
401
  !isFunction($$.prompt) && ($$.prompt = function (hint, value, then) {
414
402
  return isFunction(then) && then.call(this, W.prompt ? W.prompt(hint, value) : false);
415
403
  });
416
- !isFunction($$.selectBlock) && ($$.selectBlock = function (withSpaces) {
404
+ !isFunction($$.selectLine) && ($$.selectLine = function (withSpaces) {
417
405
  if (withSpaces === void 0) {
418
406
  withSpaces = true;
419
407
  }
420
- var $ = this;
421
- var _$$$4 = $.$(),
422
- after = _$$$4.after,
423
- before = _$$$4.before,
424
- end = _$$$4.end,
425
- start = _$$$4.start,
426
- value = _$$$4.value,
408
+ var $ = this,
409
+ m,
410
+ _$$$3 = $.$(),
411
+ after = _$$$3.after,
412
+ before = _$$$3.before,
413
+ end = _$$$3.end,
414
+ start = _$$$3.start,
427
415
  lineAfter = after.split('\n').shift(),
428
416
  lineAfterCount = toCount(lineAfter),
429
417
  lineBefore = before.split('\n').pop(),
430
418
  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
419
  $.select(start - lineBeforeCount, end + lineAfterCount);
442
420
  if (!withSpaces) {
443
- var s = $.$(),
444
- m;
445
- end = s.end;
446
- start = s.start;
447
- value = s.value;
448
- if (m = /^(\s+)?[\s\S]+?(\s+)?$/.exec(value)) {
449
- return $.select(start + toCount(m[1] || ""), end - toCount(m[2] || ""));
421
+ var _$$$4 = $.$(),
422
+ _end = _$$$4.end,
423
+ _start = _$$$4.start,
424
+ value = _$$$4.value;
425
+ if (m = /^(\s+)?[\s\S]*?(\s+)?$/.exec(value)) {
426
+ return $.select(_start + toCount(m[1] || ""), _end - toCount(m[2] || ""));
450
427
  }
451
428
  }
452
429
  return $;
453
430
  });
454
431
  !isFunction($$.toggle) && ($$.toggle = function (open, close, wrap) {
455
- var $ = this;
456
- var _$$$5 = $.$(),
432
+ var $ = this,
433
+ _$$$5 = $.$(),
457
434
  after = _$$$5.after,
458
435
  before = _$$$5.before,
459
436
  value = _$$$5.value,
@@ -464,33 +441,30 @@
464
441
  }
465
442
  return $.wrap(open, close, wrap);
466
443
  });
467
- !isFunction($$.toggleBlock) && ($$.toggleBlock = function (open, close, wrap) {
468
- var $ = this;
469
- var _$$$6 = $.$(),
470
- after = _$$$6.after,
471
- before = _$$$6.before,
472
- value = _$$$6.value,
444
+ !isFunction($$.toggleLine) && ($$.toggleLine = function (open, close, wrap, withSpaces) {
445
+ if (withSpaces === void 0) {
446
+ withSpaces = false;
447
+ }
448
+ var $ = this.selectLine(withSpaces),
449
+ _$$$6 = $.$();
450
+ _$$$6.after;
451
+ _$$$6.before;
452
+ var value = _$$$6.value,
473
453
  closeCount = toCount(close),
474
- lineAfter = after.split('\n').shift(),
475
- lineBefore = before.split('\n').pop(),
476
454
  openCount = toCount(open);
477
- if (wrap && close === value.slice(-closeCount) && open === value.slice(0, openCount) || close === lineAfter.slice(-closeCount) && open === lineBefore.slice(0, openCount)) {
478
- return $.peelBlock(open, close, wrap);
455
+ if (!wrap && close === value.slice(-closeCount) && open === value.slice(0, openCount)) {
456
+ var _$$$7 = $.$(),
457
+ end = _$$$7.end,
458
+ start = _$$$7.start;
459
+ $.select(start + openCount, end - closeCount);
479
460
  }
480
- return $.wrapBlock(open, close, wrap);
461
+ return $.toggle(open, close, wrap);
481
462
  });
482
- !isFunction($$.wrapBlock) && ($$.wrapBlock = function (open, close, wrap) {
483
- var $ = this;
484
- var _$$$7 = $.$(),
485
- after = _$$$7.after,
486
- before = _$$$7.before,
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);
463
+ !isFunction($$.wrapLine) && ($$.wrapLine = function (open, close, wrap, withSpaces) {
464
+ if (withSpaces === void 0) {
465
+ withSpaces = false;
466
+ }
467
+ return this.selectLine(withSpaces).wrap(open, close, wrap);
494
468
  });
495
469
  return $.on('key.down', onKeyDown).record();
496
470
  }
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},c=function(e,r){return void 0===r&&(r=!0),"object"==typeof e&&(!r||function(e,r){return e&&l(r)&&e instanceof r}(e,Object))},l=function(e){return function(e){return void 0!==e}(e)&&!function(e){return null===e}(e)},f=function(e){return e.length},u=function e(){for(var r=arguments.length,t=Array(r),o=0;o<r;o++)t[o]=arguments[o];for(var s=t.shift(),u=0,a=f(t);u<a;++u)for(var p in t[u])if(l(s[p]))if(i(s[p])&&i(t[u][p])){s[p]=[].concat(s[p]);for(var d=0,h=f(t[u][p]);d<h;++d)n(t[u][p][d],s[p])||s[p].push(t[u][p][d])}else c(s[p])&&c(t[u][p])?s[p]=e({},s[p],t[u][p]):s[p]=t[u][p];else s[p]=t[u][p];return s},a=window,p=function(e){return e&&e.preventDefault()},d=function(e){return function(e){return void 0!==e}(e)&&!function(e){return null===e}(e)},h=function(e){return t=RegExp,(r=e)&&d(t)&&r instanceof t;var r,t},v=function(e,r){return h(e)?e:RegExp(e,d(r)?r:"g")},w="Control-",k="Shift-",$=(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 m(e){var r=this,t=r.k(!1).pop(),i=r.k();if($(r),!e.defaultPrevented&&!r.keys[i]){var o,c,l=r.state.tab||"\t",u=r.state.pairs||{},a=Object.values(u);(function(e){return s(e)&&0==e%1})(l)&&(l=" ".repeat(l));var d=r.$(),h=d.after,m=d.before,b=d.end,g=d.start,x=d.value,y=h.split("\n").shift(),B=m.split("\n").pop(),E=/^\s+/.exec(B),A=E&&E[0]||"";if(w+k+"Enter"===i)return m||h?(p(e),r.select(g-f(B)).wrap(A,"\n").insert(x).record(),!1):void 0;if(w+"Enter"===i&&(m||h))return p(e),r.select(b+f(y)).wrap("\n"+A,"").insert(x).record(),!1;if("Alt-"!=i+"-"&&w!==i+"-"){if(" "===i)return o=u[c=m.slice(-1)],!x&&o&&c&&o===h[0]?(p(e),r.wrap(" "," ")):void 0;if("Backspace"===i||"Delete"===i){if(o=u[c=m.slice(-1)],"\\"===c)return;return x?h&&m&&o&&o===h[0]&&!m.endsWith("\\"+c)?(p(e),r.record().peel(c,o).record()):void 0:(o=u[c=m.trim().slice(-1)])&&c&&(h.startsWith(" "+o)&&m.endsWith(c+" ")||h.startsWith("\n"+A+o)&&m.endsWith(c+"\n"+A))?(p(e),r.trim("","").record()):"Delete"!==i&&B.endsWith(l)?(p(e),r.pull(l).record()):h&&m&&!m.endsWith("\\"+c)&&o===h[0]&&c===m.slice(-1)?(p(e),r.peel(c,o).record()):void 0}if("Enter"!==i&&k+"Enter"!==i){if("\\"!==(c=m.slice(-1))){if(o=n(h[0],a)?h[0]:u[c],!x&&h&&m&&o&&t===o)return p(e),r.select(g+1).record();for(c in u){if(o=u[c],t===c&&o)return p(e),r.wrap(c,o).record();if(t===o){if(x)return p(e),r.record().wrap(c,o).record();break}}var T,W,j,S=[];if(x){for(T in u)(W=u[T])&&S.push("(?:\\"+T+"(?:\\\\.|[^\\"+T+(W!==T?"\\"+W:"")+"])*\\"+W+")");if(S.push("\\w+"),S.push("\\s+"),S.push("[\\s\\S]"),w+"ArrowLeft"===i)return p(e),(j=v("("+S.join("|")+")$","").exec(m))?r.insert("").select(g-f(j[0])).insert(x).record():r.select();if(w+"ArrowRight"===i)return p(e),(j=h.match(v("^("+S.join("|")+")","")))?r.insert("").select(b+f(j[0])-f(x)).insert(x).record():r.select()}if(b+=f(y),g-=f(B),x=B+x+y,w+"ArrowUp"===i){if(p(e),!n("\n",m))return r.select();r.insert(""),r.replace(/^([^\n]*?)(\n|$)/,"$2",1),r.replace(/(^|\n)([^\n]*?)$/,"",-1);var D=r.$();return m=D.before,g=D.start,B=m.split("\n").pop(),r.select(g-=f(B)).wrap(x,"\n"),r.select(g,g+f(x)),r.record()}if(w+"ArrowDown"===i){if(p(e),!n("\n",h))return r.select();r.insert(""),r.replace(/^([^\n]*?)(\n|$)/,"",1),r.replace(/(^|\n)([^\n]*?)$/,"$1",-1);var O=r.$();return h=O.after,b=O.end,y=h.split("\n").shift(),r.select(b+=f(y)).wrap("\n",x),b+=1,r.select(b,b+f(x)),r.record()}}}else if(!x){if(h&&m&&(o=u[c=m.slice(-1)])&&o===h[0])return p(e),r.wrap("\n"+A+(c!==o?l:""),"\n"+A).record();if(A)return p(e),r.insert("\n"+A,-1).record()}}else p(e)}}var b={attach:function(){var e=this,r=e.constructor.prototype;return e.state=u({pairs:{"`":"`","(":")","{":"}","[":"]",'"':'"',"'":"'","<":">"}},e.state),!o(r.alert)&&(r.alert=function(e,r){return a.alert&&a.alert(e),o(r)&&r.call(this,!0)}),!o(r.confirm)&&(r.confirm=function(e,r){return o(r)&&r.call(this,a.confirm&&a.confirm(e))}),!o(r.insertBlock)&&(r.insertBlock=function(e,r){var t=this,n=t.$(),i=n.after,o=n.before,s=n.end,c=n.start,l=i.split("\n").shift(),u=f(l),a=o.split("\n").pop(),p=f(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.peelBlock)&&(r.peelBlock=function(e,r,t){var n=this,i=n.$(),o=i.after,s=i.before,c=i.end,l=i.start,u=i.value,a=f(r),p=o.split("\n").shift(),d=f(p),h=s.split("\n").pop(),v=f(h),w=f(e);return t&&r===u.slice(-a)&&e===u.slice(0,w)||r===p.slice(-a)&&e===h.slice(0,w)?n.select(l-v+(t?0:w),c+d-(t?0:a)).peel(e,r,t):n.select(l,c)}),!o(r.prompt)&&(r.prompt=function(e,r,t){return o(t)&&t.call(this,!!a.prompt&&a.prompt(e,r))}),!o(r.selectBlock)&&(r.selectBlock=function(e){void 0===e&&(e=!0);var r=this,t=r.$(),n=t.after,i=t.before,o=t.end,s=t.start,c=t.value,l=n.split("\n").shift(),u=f(l),a=i.split("\n").pop(),p=f(a);if(!e){var d=/\s+$/.exec(l),h=/^\s+/.exec(a);d&&(u-=f(d[0])),h&&(p-=f(h[0]))}if(r.select(s-p,o+u),!e){var v,w=r.$();if(o=w.end,s=w.start,c=w.value,v=/^(\s+)?[\s\S]+?(\s+)?$/.exec(c))return r.select(s+f(v[1]||""),o-f(v[2]||""))}return r}),!o(r.toggle)&&(r.toggle=function(e,r,t){var n=this,i=n.$(),o=i.after,s=i.before,c=i.value,l=f(r),u=f(e);return t&&r===c.slice(-l)&&e===c.slice(0,u)||r===o.slice(0,l)&&e===s.slice(-u)?n.peel(e,r,t):n.wrap(e,r,t)}),!o(r.toggleBlock)&&(r.toggleBlock=function(e,r,t){var n=this,i=n.$(),o=i.after,s=i.before,c=i.value,l=f(r),u=o.split("\n").shift(),a=s.split("\n").pop(),p=f(e);return t&&r===c.slice(-l)&&e===c.slice(0,p)||r===u.slice(-l)&&e===a.slice(0,p)?n.peelBlock(e,r,t):n.wrapBlock(e,r,t)}),!o(r.wrapBlock)&&(r.wrapBlock=function(e,r,t){var n=this.$(),i=n.after,o=n.before,s=n.end,c=n.start,l=i.split("\n").shift(),u=f(l),a=o.split("\n").pop(),p=f(a);return this.select(c-p,s+u).wrap(e,r,t)}),e.on("key.down",m).record()},detach:function(){return this.off("key.down",m)},name:"TextEditor.Source"};return b}));
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)}}var y={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).record()},detach:function(){return this.off("key.down",b)},name:"TextEditor.Source"};return y}));
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 + 'Enter' === keys) {
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 + 'Enter' === keys) {
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 ('Backspace' === keys || 'Delete' === keys) {
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 ('Delete' !== keys && lineBefore.endsWith(charIndent)) {
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 ('Enter' === keys || SHIFT_PREFIX + 'Enter' === keys) {
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 + 'ArrowLeft' === keys) {
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 + 'ArrowRight' === keys) {
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 + 'ArrowUp' === keys) {
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 + 'ArrowDown' === keys) {
205
+ if (CTRL_PREFIX + KEY_ARROW_DOWN === keys) {
198
206
  offEventDefault(e);
199
207
  if (!hasValue('\n', after)) {
200
208
  return $.select();
@@ -216,7 +224,7 @@ function onKeyDown(e) {
216
224
 
217
225
  function attach() {
218
226
  const $ = this;
219
- const $$ = $.constructor.prototype;
227
+ const $$ = $.constructor._;
220
228
  $.state = fromStates({
221
229
  pairs: {
222
230
  '`': '`',
@@ -235,9 +243,9 @@ function attach() {
235
243
  !isFunction($$.confirm) && ($$.confirm = function (hint, then) {
236
244
  return isFunction(then) && then.call(this, W.confirm && W.confirm(hint));
237
245
  });
238
- !isFunction($$.insertBlock) && ($$.insertBlock = function (value, mode) {
239
- let $ = this;
240
- let {after, before, end, start} = $.$(),
246
+ !isFunction($$.insertLine) && ($$.insertLine = function (value, mode) {
247
+ let $ = this,
248
+ {after, before, end, start} = $.$(),
241
249
  lineAfter = after.split('\n').shift(),
242
250
  lineAfterCount = toCount(lineAfter),
243
251
  lineBefore = before.split('\n').pop(),
@@ -252,58 +260,31 @@ function attach() {
252
260
  }
253
261
  return $.select(start - lineBeforeCount, end + lineAfterCount).insert(value, mode, true).wrap(lineMatchIndent, "");
254
262
  });
255
- !isFunction($$.peelBlock) && ($$.peelBlock = function (open, close, wrap) {
256
- let $ = this;
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);
263
+ !isFunction($$.peelLine) && ($$.peelLine = function (open, close, wrap, withSpaces = false) {
264
+ return this.selectLine(withSpaces).peel(open, close, wrap);
271
265
  });
272
266
  !isFunction($$.prompt) && ($$.prompt = function (hint, value, then) {
273
267
  return isFunction(then) && then.call(this, W.prompt ? W.prompt(hint, value) : false);
274
268
  });
275
- !isFunction($$.selectBlock) && ($$.selectBlock = function (withSpaces = true) {
276
- let $ = this;
277
- let {after, before, end, start, value} = $.$(),
269
+ !isFunction($$.selectLine) && ($$.selectLine = function (withSpaces = true) {
270
+ let $ = this, m,
271
+ {after, before, end, start} = $.$(),
278
272
  lineAfter = after.split('\n').shift(),
279
273
  lineAfterCount = toCount(lineAfter),
280
274
  lineBefore = before.split('\n').pop(),
281
275
  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
276
  $.select(start - lineBeforeCount, end + lineAfterCount);
293
277
  if (!withSpaces) {
294
- let s = $.$(), m;
295
- end = s.end;
296
- start = s.start;
297
- value = s.value;
298
- if (m = /^(\s+)?[\s\S]+?(\s+)?$/.exec(value)) {
278
+ let {end, start, value} = $.$();
279
+ if (m = /^(\s+)?[\s\S]*?(\s+)?$/.exec(value)) {
299
280
  return $.select(start + toCount(m[1] || ""), end - toCount(m[2] || ""));
300
281
  }
301
282
  }
302
283
  return $;
303
284
  });
304
285
  !isFunction($$.toggle) && ($$.toggle = function (open, close, wrap) {
305
- let $ = this;
306
- let {after, before, value} = $.$(),
286
+ let $ = this,
287
+ {after, before, value} = $.$(),
307
288
  closeCount = toCount(close),
308
289
  openCount = toCount(open);
309
290
  if (
@@ -314,29 +295,19 @@ function attach() {
314
295
  }
315
296
  return $.wrap(open, close, wrap);
316
297
  });
317
- !isFunction($$.toggleBlock) && ($$.toggleBlock = function (open, close, wrap) {
318
- let $ = this;
319
- let {after, before, value} = $.$(),
298
+ !isFunction($$.toggleLine) && ($$.toggleLine = function (open, close, wrap, withSpaces = false) {
299
+ let $ = this.selectLine(withSpaces),
300
+ {after, before, value} = $.$(),
320
301
  closeCount = toCount(close),
321
- lineAfter = after.split('\n').shift(),
322
- lineBefore = before.split('\n').pop(),
323
302
  openCount = toCount(open);
324
- if (
325
- (wrap && close === value.slice(-closeCount) && open === value.slice(0, openCount)) ||
326
- (close === lineAfter.slice(-closeCount) && open === lineBefore.slice(0, openCount))
327
- ) {
328
- return $.peelBlock(open, close, wrap);
303
+ if (!wrap && close === value.slice(-closeCount) && open === value.slice(0, openCount)) {
304
+ let {end, start} = $.$();
305
+ $.select(start + openCount, end - closeCount);
329
306
  }
330
- return $.wrapBlock(open, close, wrap);
307
+ return $.toggle(open, close, wrap);
331
308
  });
332
- !isFunction($$.wrapBlock) && ($$.wrapBlock = function (open, close, wrap) {
333
- let $ = this;
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);
309
+ !isFunction($$.wrapLine) && ($$.wrapLine = function (open, close, wrap, withSpaces = false) {
310
+ return this.selectLine(withSpaces).wrap(open, close, wrap);
340
311
  });
341
312
  return $.on('key.down', onKeyDown).record();
342
313
  }
package/package.json CHANGED
@@ -53,5 +53,5 @@
53
53
  "scripts": {
54
54
  "pack": "pack --clean=false --from=.factory --js-format=umd --js-name=TextEditor.Source --js-top='%(js.license)' --mjs=true --to=."
55
55
  },
56
- "version": "3.0.3"
56
+ "version": "3.0.4"
57
57
  }