@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