activeadmin_quill_editor 0.1.2 → 0.2.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 62b302336cebcf361ba3a1ccb584cfd7b4d6236c
4
- data.tar.gz: 42811147a4164fa34ece06570d72f221ec20c7c7
2
+ SHA256:
3
+ metadata.gz: f42a9042c7220f4a77082d6f3dd2c9a33219f7d6d9d90a99394e166faeb8cc1e
4
+ data.tar.gz: f46e1e841a1cbe9b38d158a5b80e2776c21b77f5f675a552d9f9d9d76991a92a
5
5
  SHA512:
6
- metadata.gz: c2b171a855d2c339a79752eaba70059df2902187d3c186272050bd5c11e0895bfdb0701ba5574835d53f8d1729aae61c5a2892eefd4643f856c4c8c21f27ac86
7
- data.tar.gz: 2ded2a7e70cf00b817f9007279fed50408096282eb01c91523798cd85568b7391664990be8c8c6cb257ef6fb5b5033aa0da2816205bbd4963c0c0f1e1076f2e2
6
+ metadata.gz: a22cefc16231c2d08a3336f10579783de82daacdb7075120506ec557ee0548bcc74f1e750ac75208893a56bee119819a7671db0624b5e03403f8780bf17611ab
7
+ data.tar.gz: 8cc61172369187fdecaeddca938fddae91aacac933aafe02303122329aec91dc88d844544ba4ebe1f1ccbc802170e37b20a5c6b3123e210d793a8302fdc4505e
@@ -1,4 +1,4 @@
1
- Copyright (c) 2017 Mattia Roccoberton
1
+ Copyright (c) 2017-2020 Mattia Roccoberton
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,33 +1,36 @@
1
- # ActiveAdmin Quill Editor [![Gem Version](https://badge.fury.io/rb/activeadmin_quill_editor.svg)](https://badge.fury.io/rb/activeadmin_quill_editor)
1
+ # ActiveAdmin Quill Editor [![Gem Version](https://badge.fury.io/rb/activeadmin_quill_editor.svg)](https://badge.fury.io/rb/activeadmin_quill_editor) [![CircleCI](https://circleci.com/gh/blocknotes/activeadmin_quill_editor.svg?style=svg)](https://circleci.com/gh/blocknotes/activeadmin_quill_editor)
2
2
 
3
- An Active Admin plugin to use [Quill Rich Text Editor](https://github.com/quilljs/quill)
3
+ An Active Admin plugin to use [Quill Rich Text Editor](https://github.com/quilljs/quill) in form fields.
4
4
 
5
- ![screenshot](screenshot.jpg)
5
+ ![screenshot](screenshot.png)
6
6
 
7
7
  ## Install
8
-
9
- - Update your Gemfile: `gem 'activeadmin_quill_editor'` (and execute *bundle*)
10
- - Add at the end of your ActiveAdmin styles (_app/assets/stylesheets/active_admin.scss_):
11
- ```css
8
+ - After installing Active Admin, add to your Gemfile: `gem 'activeadmin_quill_editor'` (and execute *bundle*)
9
+ - Add at the end of your Active Admin styles (_app/assets/stylesheets/active_admin.scss_):
10
+ ```scss
11
+ @import 'activeadmin/quill_editor/quill.snow';
12
12
  @import 'activeadmin/quill_editor_input';
13
13
  ```
14
- - Add at the end of your ActiveAdmin javascripts (_app/assets/javascripts/active_admin.js_):
14
+ - Add at the end of your Active Admin javascripts (_app/assets/javascripts/active_admin.js_):
15
15
  ```js
16
16
  //= require activeadmin/quill_editor/quill
17
17
  //= require activeadmin/quill_editor_input
18
18
  ```
19
19
  - Use the input with `as: :quill_editor` in Active Admin model conf
20
20
 
21
- Why 2 separated scripts? In this way you can include a different version of *quill editor* if you like.
21
+ Why 2 separated scripts/styles? In this way you can include a different version of *quill editor* if you like.
22
22
 
23
- ## Options
23
+ > **UPDATE FROM VERSION <= 2.0**: please add to your _app/assets/stylesheets/active_admin.scss_ the line `@import 'activeadmin/quill_editor/quill.snow';`
24
24
 
25
- **data-options**: permits to set *quill editor* options directly - see [options list](https://quilljs.com/docs/quickstart/)
25
+ ## Options
26
+ **data-options**: permits to set *quill editor* options directly - see [options list](https://quilljs.com/docs/configuration/)
26
27
 
27
28
  ## Examples
28
29
 
30
+ ### Basic usage
31
+
29
32
  ```ruby
30
- # ActiveAdmin article form conf:
33
+ # Active Admin article form conf:
31
34
  form do |f|
32
35
  f.inputs 'Article' do
33
36
  f.input :title
@@ -38,26 +41,23 @@ Why 2 separated scripts? In this way you can include a different version of *qui
38
41
  end
39
42
  ```
40
43
 
41
- Toolbar buttons configuration:
44
+ ### Toolbar buttons configuration
42
45
 
43
46
  ```ruby
44
- f.input :description, as: :quill_editor, input_html: {data: {options: {modules: {toolbar: [['bold', 'italic', 'underline'], ['link']]}, placeholder: 'Type something...', theme: 'snow'}}}
47
+ f.input :description, as: :quill_editor, input_html: { data: { options: { modules: { toolbar: [['bold', 'italic', 'underline'], ['link']] }, placeholder: 'Type something...', theme: 'snow' } } }
45
48
  ```
46
49
 
47
50
  ## Notes
48
-
49
- - Upload functions (Images, Documents, Files, etc.) are not implemented yet
51
+ - Upload features (images/documents/files): not tested yet.
50
52
 
51
53
  ## Do you like it? Star it!
52
-
53
54
  If you use this component just star it. A developer is more motivated to improve a project when there is some interest.
54
55
 
55
- Take a look at [other ActiveAdmin components](https://github.com/blocknotes?utf8=✓&tab=repositories&q=activeadmin&type=source) that I made if you are curious.
56
+ Take a look at [other Active Admin components](https://github.com/blocknotes?utf8=✓&tab=repositories&q=activeadmin&type=source) that I made if you are curious.
56
57
 
57
58
  ## Contributors
58
-
59
- - [Mattia Roccoberton](http://blocknot.es) - creator, maintainer
59
+ - [Mattia Roccoberton](http://blocknot.es): author
60
+ - The good guys that opened issues and pull requests from time to time
60
61
 
61
62
  ## License
62
-
63
- [MIT](LICENSE.txt)
63
+ The gem is available as open-source under the terms of the [MIT](LICENSE.txt).
data/Rakefile CHANGED
@@ -1,3 +1,13 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
- require "bundler/gem_tasks"
3
+ require 'bundler/gem_tasks'
4
+
5
+ begin
6
+ require 'rspec/core/rake_task'
7
+
8
+ RSpec::Core::RakeTask.new(:spec)
9
+
10
+ task default: :spec
11
+ rescue LoadError
12
+ puts '! LoadError: no RSpec available'
13
+ end
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Quill Editor v1.3.3
2
+ * Quill Editor v1.3.7
3
3
  * https://quilljs.com/
4
4
  * Copyright (c) 2014, Jason Chen
5
5
  * Copyright (c) 2013, salesforce.com
@@ -13,7 +13,7 @@
13
13
  exports["Quill"] = factory();
14
14
  else
15
15
  root["Quill"] = factory();
16
- })(this, function() {
16
+ })(typeof self !== 'undefined' ? self : this, function() {
17
17
  return /******/ (function(modules) { // webpackBootstrap
18
18
  /******/ // The module cache
19
19
  /******/ var installedModules = {};
@@ -117,8 +117,8 @@ var Parchment = {
117
117
  Attribute: attributor_1.default,
118
118
  Class: class_1.default,
119
119
  Style: style_1.default,
120
- Store: store_1.default
121
- }
120
+ Store: store_1.default,
121
+ },
122
122
  };
123
123
  exports.default = Parchment;
124
124
 
@@ -172,16 +172,15 @@ var Scope;
172
172
  Scope[Scope["INLINE_ATTRIBUTE"] = 5] = "INLINE_ATTRIBUTE";
173
173
  Scope[Scope["ANY"] = 15] = "ANY";
174
174
  })(Scope = exports.Scope || (exports.Scope = {}));
175
- ;
176
175
  function create(input, value) {
177
176
  var match = query(input);
178
177
  if (match == null) {
179
178
  throw new ParchmentError("Unable to create " + input + " blot");
180
179
  }
181
180
  var BlotClass = match;
182
- var node = (input instanceof Node || input['nodeType'] === Node.TEXT_NODE) ?
183
- input :
184
- BlotClass.create(value);
181
+ var node =
182
+ // @ts-ignore
183
+ input instanceof Node || input['nodeType'] === Node.TEXT_NODE ? input : BlotClass.create(value);
185
184
  return new BlotClass(node, value);
186
185
  }
187
186
  exports.create = create;
@@ -189,6 +188,7 @@ function find(node, bubble) {
189
188
  if (bubble === void 0) { bubble = false; }
190
189
  if (node == null)
191
190
  return null;
191
+ // @ts-ignore
192
192
  if (node[exports.DATA_KEY] != null)
193
193
  return node[exports.DATA_KEY].blot;
194
194
  if (bubble)
@@ -201,6 +201,7 @@ function query(query, scope) {
201
201
  var match;
202
202
  if (typeof query === 'string') {
203
203
  match = types[query] || attributes[query];
204
+ // @ts-ignore
204
205
  }
205
206
  else if (query instanceof Text || query['nodeType'] === Node.TEXT_NODE) {
206
207
  match = types['text'];
@@ -224,7 +225,8 @@ function query(query, scope) {
224
225
  }
225
226
  if (match == null)
226
227
  return null;
227
- if ((scope & Scope.LEVEL & match.scope) && (scope & Scope.TYPE & match.scope))
228
+ // @ts-ignore
229
+ if (scope & Scope.LEVEL & match.scope && scope & Scope.TYPE & match.scope)
228
230
  return match;
229
231
  return null;
230
232
  }
@@ -437,7 +439,19 @@ Delta.prototype.slice = function (start, end) {
437
439
  Delta.prototype.compose = function (other) {
438
440
  var thisIter = op.iterator(this.ops);
439
441
  var otherIter = op.iterator(other.ops);
440
- var delta = new Delta();
442
+ var ops = [];
443
+ var firstOther = otherIter.peek();
444
+ if (firstOther != null && typeof firstOther.retain === 'number' && firstOther.attributes == null) {
445
+ var firstLeft = firstOther.retain;
446
+ while (thisIter.peekType() === 'insert' && thisIter.peekLength() <= firstLeft) {
447
+ firstLeft -= thisIter.peekLength();
448
+ ops.push(thisIter.next());
449
+ }
450
+ if (firstOther.retain - firstLeft > 0) {
451
+ otherIter.next(firstOther.retain - firstLeft);
452
+ }
453
+ }
454
+ var delta = new Delta(ops);
441
455
  while (thisIter.hasNext() || otherIter.hasNext()) {
442
456
  if (otherIter.peekType() === 'insert') {
443
457
  delta.push(otherIter.next());
@@ -458,6 +472,13 @@ Delta.prototype.compose = function (other) {
458
472
  var attributes = op.attributes.compose(thisOp.attributes, otherOp.attributes, typeof thisOp.retain === 'number');
459
473
  if (attributes) newOp.attributes = attributes;
460
474
  delta.push(newOp);
475
+
476
+ // Optimization if rest of other is just retain
477
+ if (!otherIter.hasNext() && equal(delta.ops[delta.ops.length - 1], newOp)) {
478
+ var rest = new Delta(thisIter.rest());
479
+ return delta.concat(rest).chop();
480
+ }
481
+
461
482
  // Other op should be delete, we could be an insert or retain
462
483
  // Insert + delete cancels out
463
484
  } else if (typeof otherOp['delete'] === 'number' && typeof thisOp.retain === 'number') {
@@ -615,6 +636,8 @@ module.exports = Delta;
615
636
 
616
637
  var hasOwn = Object.prototype.hasOwnProperty;
617
638
  var toStr = Object.prototype.toString;
639
+ var defineProperty = Object.defineProperty;
640
+ var gOPD = Object.getOwnPropertyDescriptor;
618
641
 
619
642
  var isArray = function isArray(arr) {
620
643
  if (typeof Array.isArray === 'function') {
@@ -644,6 +667,35 @@ var isPlainObject = function isPlainObject(obj) {
644
667
  return typeof key === 'undefined' || hasOwn.call(obj, key);
645
668
  };
646
669
 
670
+ // If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target
671
+ var setProperty = function setProperty(target, options) {
672
+ if (defineProperty && options.name === '__proto__') {
673
+ defineProperty(target, options.name, {
674
+ enumerable: true,
675
+ configurable: true,
676
+ value: options.newValue,
677
+ writable: true
678
+ });
679
+ } else {
680
+ target[options.name] = options.newValue;
681
+ }
682
+ };
683
+
684
+ // Return undefined instead of __proto__ if '__proto__' is not an own property
685
+ var getProperty = function getProperty(obj, name) {
686
+ if (name === '__proto__') {
687
+ if (!hasOwn.call(obj, name)) {
688
+ return void 0;
689
+ } else if (gOPD) {
690
+ // In early versions of node, obj['__proto__'] is buggy when obj has
691
+ // __proto__ as an own property. Object.getOwnPropertyDescriptor() works.
692
+ return gOPD(obj, name).value;
693
+ }
694
+ }
695
+
696
+ return obj[name];
697
+ };
698
+
647
699
  module.exports = function extend() {
648
700
  var options, name, src, copy, copyIsArray, clone;
649
701
  var target = arguments[0];
@@ -668,8 +720,8 @@ module.exports = function extend() {
668
720
  if (options != null) {
669
721
  // Extend the base object
670
722
  for (name in options) {
671
- src = target[name];
672
- copy = options[name];
723
+ src = getProperty(target, name);
724
+ copy = getProperty(options, name);
673
725
 
674
726
  // Prevent never-ending loop
675
727
  if (target !== copy) {
@@ -683,11 +735,11 @@ module.exports = function extend() {
683
735
  }
684
736
 
685
737
  // Never move original objects, clone them
686
- target[name] = extend(deep, clone, copy);
738
+ setProperty(target, { name: name, newValue: extend(deep, clone, copy) });
687
739
 
688
740
  // Don't bring in undefined values
689
741
  } else if (typeof copy !== 'undefined') {
690
- target[name] = copy;
742
+ setProperty(target, { name: name, newValue: copy });
691
743
  }
692
744
  }
693
745
  }
@@ -1531,7 +1583,7 @@ Quill.DEFAULTS = {
1531
1583
  Quill.events = _emitter4.default.events;
1532
1584
  Quill.sources = _emitter4.default.sources;
1533
1585
  // eslint-disable-next-line no-undef
1534
- Quill.version = false ? 'dev' : "1.3.3";
1586
+ Quill.version = false ? 'dev' : "1.3.7";
1535
1587
 
1536
1588
  Quill.imports = {
1537
1589
  'delta': _quillDelta2.default,
@@ -1852,7 +1904,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
1852
1904
 
1853
1905
  var debug = (0, _logger2.default)('quill:events');
1854
1906
 
1855
- var EVENTS = ['selectionchange', 'mousedown', 'mouseup'];
1907
+ var EVENTS = ['selectionchange', 'mousedown', 'mouseup', 'click'];
1856
1908
 
1857
1909
  EVENTS.forEach(function (eventName) {
1858
1910
  document.addEventListener(eventName, function () {
@@ -2136,17 +2188,26 @@ var Attributor = /** @class */ (function () {
2136
2188
  };
2137
2189
  Attributor.prototype.canAdd = function (node, value) {
2138
2190
  var match = Registry.query(node, Registry.Scope.BLOT & (this.scope | Registry.Scope.TYPE));
2139
- if (match != null && (this.whitelist == null || this.whitelist.indexOf(value) > -1)) {
2191
+ if (match == null)
2192
+ return false;
2193
+ if (this.whitelist == null)
2140
2194
  return true;
2195
+ if (typeof value === 'string') {
2196
+ return this.whitelist.indexOf(value.replace(/["']/g, '')) > -1;
2197
+ }
2198
+ else {
2199
+ return this.whitelist.indexOf(value) > -1;
2141
2200
  }
2142
- return false;
2143
2201
  };
2144
2202
  Attributor.prototype.remove = function (node) {
2145
2203
  node.removeAttribute(this.keyName);
2146
2204
  };
2147
2205
  Attributor.prototype.value = function (node) {
2148
2206
  var value = node.getAttribute(this.keyName);
2149
- return this.canAdd(node, value) ? value : '';
2207
+ if (this.canAdd(node, value) && value) {
2208
+ return value;
2209
+ }
2210
+ return '';
2150
2211
  };
2151
2212
  return Attributor;
2152
2213
  }());
@@ -2388,7 +2449,7 @@ var _code = __webpack_require__(13);
2388
2449
 
2389
2450
  var _code2 = _interopRequireDefault(_code);
2390
2451
 
2391
- var _cursor = __webpack_require__(23);
2452
+ var _cursor = __webpack_require__(24);
2392
2453
 
2393
2454
  var _cursor2 = _interopRequireDefault(_cursor);
2394
2455
 
@@ -3304,21 +3365,31 @@ var shadow_1 = __webpack_require__(30);
3304
3365
  var Registry = __webpack_require__(1);
3305
3366
  var ContainerBlot = /** @class */ (function (_super) {
3306
3367
  __extends(ContainerBlot, _super);
3307
- function ContainerBlot() {
3308
- return _super !== null && _super.apply(this, arguments) || this;
3368
+ function ContainerBlot(domNode) {
3369
+ var _this = _super.call(this, domNode) || this;
3370
+ _this.build();
3371
+ return _this;
3309
3372
  }
3310
3373
  ContainerBlot.prototype.appendChild = function (other) {
3311
3374
  this.insertBefore(other);
3312
3375
  };
3313
3376
  ContainerBlot.prototype.attach = function () {
3314
- var _this = this;
3315
3377
  _super.prototype.attach.call(this);
3378
+ this.children.forEach(function (child) {
3379
+ child.attach();
3380
+ });
3381
+ };
3382
+ ContainerBlot.prototype.build = function () {
3383
+ var _this = this;
3316
3384
  this.children = new linked_list_1.default();
3317
3385
  // Need to be reversed for if DOM nodes already in order
3318
- [].slice.call(this.domNode.childNodes).reverse().forEach(function (node) {
3386
+ [].slice
3387
+ .call(this.domNode.childNodes)
3388
+ .reverse()
3389
+ .forEach(function (node) {
3319
3390
  try {
3320
3391
  var child = makeBlot(node);
3321
- _this.insertBefore(child, _this.children.head);
3392
+ _this.insertBefore(child, _this.children.head || undefined);
3322
3393
  }
3323
3394
  catch (err) {
3324
3395
  if (err instanceof Registry.ParchmentError)
@@ -3352,7 +3423,8 @@ var ContainerBlot = /** @class */ (function (_super) {
3352
3423
  ContainerBlot.prototype.descendants = function (criteria, index, length) {
3353
3424
  if (index === void 0) { index = 0; }
3354
3425
  if (length === void 0) { length = Number.MAX_VALUE; }
3355
- var descendants = [], lengthLeft = length;
3426
+ var descendants = [];
3427
+ var lengthLeft = length;
3356
3428
  this.children.forEachAt(index, length, function (child, index, length) {
3357
3429
  if ((criteria.blotName == null && criteria(child)) ||
3358
3430
  (criteria.blotName != null && child instanceof criteria)) {
@@ -3382,14 +3454,15 @@ var ContainerBlot = /** @class */ (function (_super) {
3382
3454
  child.insertAt(offset, value, def);
3383
3455
  }
3384
3456
  else {
3385
- var blot = (def == null) ? Registry.create('text', value) : Registry.create(value, def);
3457
+ var blot = def == null ? Registry.create('text', value) : Registry.create(value, def);
3386
3458
  this.appendChild(blot);
3387
3459
  }
3388
3460
  };
3389
3461
  ContainerBlot.prototype.insertBefore = function (childBlot, refBlot) {
3390
- if (this.statics.allowedChildren != null && !this.statics.allowedChildren.some(function (child) {
3391
- return childBlot instanceof child;
3392
- })) {
3462
+ if (this.statics.allowedChildren != null &&
3463
+ !this.statics.allowedChildren.some(function (child) {
3464
+ return childBlot instanceof child;
3465
+ })) {
3393
3466
  throw new Registry.ParchmentError("Cannot insert " + childBlot.statics.blotName + " into " + this.statics.blotName);
3394
3467
  }
3395
3468
  childBlot.insertInto(this, refBlot);
@@ -3460,7 +3533,8 @@ var ContainerBlot = /** @class */ (function (_super) {
3460
3533
  };
3461
3534
  ContainerBlot.prototype.update = function (mutations, context) {
3462
3535
  var _this = this;
3463
- var addedNodes = [], removedNodes = [];
3536
+ var addedNodes = [];
3537
+ var removedNodes = [];
3464
3538
  mutations.forEach(function (mutation) {
3465
3539
  if (mutation.target === _this.domNode && mutation.type === 'childList') {
3466
3540
  addedNodes.push.apply(addedNodes, mutation.addedNodes);
@@ -3471,8 +3545,10 @@ var ContainerBlot = /** @class */ (function (_super) {
3471
3545
  // Check node has actually been removed
3472
3546
  // One exception is Chrome does not immediately remove IFRAMEs
3473
3547
  // from DOM but MutationRecord is correct in its reported removal
3474
- if (node.parentNode != null && node.tagName !== 'IFRAME' &&
3475
- (document.body.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY)) {
3548
+ if (node.parentNode != null &&
3549
+ // @ts-ignore
3550
+ node.tagName !== 'IFRAME' &&
3551
+ document.body.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY) {
3476
3552
  return;
3477
3553
  }
3478
3554
  var blot = Registry.find(node);
@@ -3482,16 +3558,19 @@ var ContainerBlot = /** @class */ (function (_super) {
3482
3558
  blot.detach();
3483
3559
  }
3484
3560
  });
3485
- addedNodes.filter(function (node) {
3561
+ addedNodes
3562
+ .filter(function (node) {
3486
3563
  return node.parentNode == _this.domNode;
3487
- }).sort(function (a, b) {
3564
+ })
3565
+ .sort(function (a, b) {
3488
3566
  if (a === b)
3489
3567
  return 0;
3490
3568
  if (a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING) {
3491
3569
  return 1;
3492
3570
  }
3493
3571
  return -1;
3494
- }).forEach(function (node) {
3572
+ })
3573
+ .forEach(function (node) {
3495
3574
  var refBlot = null;
3496
3575
  if (node.nextSibling != null) {
3497
3576
  refBlot = Registry.find(node.nextSibling);
@@ -3501,7 +3580,7 @@ var ContainerBlot = /** @class */ (function (_super) {
3501
3580
  if (blot.parent != null) {
3502
3581
  blot.parent.removeChild(_this);
3503
3582
  }
3504
- _this.insertBefore(blot, refBlot);
3583
+ _this.insertBefore(blot, refBlot || undefined);
3505
3584
  }
3506
3585
  });
3507
3586
  };
@@ -3516,9 +3595,12 @@ function makeBlot(node) {
3516
3595
  catch (e) {
3517
3596
  blot = Registry.create(Registry.Scope.INLINE);
3518
3597
  [].slice.call(node.childNodes).forEach(function (child) {
3598
+ // @ts-ignore
3519
3599
  blot.domNode.appendChild(child);
3520
3600
  });
3521
- node.parentNode.replaceChild(blot.domNode, node);
3601
+ if (node.parentNode) {
3602
+ node.parentNode.replaceChild(blot.domNode, node);
3603
+ }
3522
3604
  blot.attach();
3523
3605
  }
3524
3606
  }
@@ -3550,8 +3632,10 @@ var container_1 = __webpack_require__(17);
3550
3632
  var Registry = __webpack_require__(1);
3551
3633
  var FormatBlot = /** @class */ (function (_super) {
3552
3634
  __extends(FormatBlot, _super);
3553
- function FormatBlot() {
3554
- return _super !== null && _super.apply(this, arguments) || this;
3635
+ function FormatBlot(domNode) {
3636
+ var _this = _super.call(this, domNode) || this;
3637
+ _this.attributes = new store_1.default(_this.domNode);
3638
+ return _this;
3555
3639
  }
3556
3640
  FormatBlot.formats = function (domNode) {
3557
3641
  if (typeof this.tagName === 'string') {
@@ -3562,10 +3646,6 @@ var FormatBlot = /** @class */ (function (_super) {
3562
3646
  }
3563
3647
  return undefined;
3564
3648
  };
3565
- FormatBlot.prototype.attach = function () {
3566
- _super.prototype.attach.call(this);
3567
- this.attributes = new store_1.default(this.domNode);
3568
- };
3569
3649
  FormatBlot.prototype.format = function (name, value) {
3570
3650
  var format = Registry.query(name);
3571
3651
  if (format instanceof attributor_1.default) {
@@ -3652,8 +3732,8 @@ var LeafBlot = /** @class */ (function (_super) {
3652
3732
  return [this.parent.domNode, offset];
3653
3733
  };
3654
3734
  LeafBlot.prototype.value = function () {
3655
- return _a = {}, _a[this.statics.blotName] = this.statics.value(this.domNode) || true, _a;
3656
3735
  var _a;
3736
+ return _a = {}, _a[this.statics.blotName] = this.statics.value(this.domNode) || true, _a;
3657
3737
  };
3658
3738
  LeafBlot.scope = Registry.Scope.INLINE_BLOT;
3659
3739
  return LeafBlot;
@@ -3802,6 +3882,22 @@ Iterator.prototype.peekType = function () {
3802
3882
  return 'retain';
3803
3883
  };
3804
3884
 
3885
+ Iterator.prototype.rest = function () {
3886
+ if (!this.hasNext()) {
3887
+ return [];
3888
+ } else if (this.offset === 0) {
3889
+ return this.ops.slice(this.index);
3890
+ } else {
3891
+ var offset = this.offset;
3892
+ var index = this.index;
3893
+ var next = this.next();
3894
+ var rest = this.ops.slice(this.index);
3895
+ this.offset = offset;
3896
+ this.index = index;
3897
+ return [next].concat(rest);
3898
+ }
3899
+ };
3900
+
3805
3901
 
3806
3902
  module.exports = lib;
3807
3903
 
@@ -3916,7 +4012,13 @@ function clone(parent, circular, depth, prototype, includeNonEnumerable) {
3916
4012
  } else if (clone.__isDate(parent)) {
3917
4013
  child = new Date(parent.getTime());
3918
4014
  } else if (useBuffer && Buffer.isBuffer(parent)) {
3919
- child = new Buffer(parent.length);
4015
+ if (Buffer.allocUnsafe) {
4016
+ // Node.js >= 4.5.0
4017
+ child = Buffer.allocUnsafe(parent.length);
4018
+ } else {
4019
+ // Older Node.js versions
4020
+ child = new Buffer(parent.length);
4021
+ }
3920
4022
  parent.copy(child);
3921
4023
  return child;
3922
4024
  } else if (_instanceof(parent, Error)) {
@@ -4100,7 +4202,7 @@ var _code = __webpack_require__(13);
4100
4202
 
4101
4203
  var _code2 = _interopRequireDefault(_code);
4102
4204
 
4103
- var _container = __webpack_require__(24);
4205
+ var _container = __webpack_require__(25);
4104
4206
 
4105
4207
  var _container2 = _interopRequireDefault(_container);
4106
4208
 
@@ -4326,140 +4428,746 @@ exports.default = Scroll;
4326
4428
  Object.defineProperty(exports, "__esModule", {
4327
4429
  value: true
4328
4430
  });
4431
+ exports.SHORTKEY = exports.default = undefined;
4329
4432
 
4330
- var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
4433
+ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
4331
4434
 
4332
- var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
4435
+ var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
4333
4436
 
4334
4437
  var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
4335
4438
 
4439
+ var _clone = __webpack_require__(21);
4440
+
4441
+ var _clone2 = _interopRequireDefault(_clone);
4442
+
4443
+ var _deepEqual = __webpack_require__(11);
4444
+
4445
+ var _deepEqual2 = _interopRequireDefault(_deepEqual);
4446
+
4447
+ var _extend = __webpack_require__(3);
4448
+
4449
+ var _extend2 = _interopRequireDefault(_extend);
4450
+
4451
+ var _quillDelta = __webpack_require__(2);
4452
+
4453
+ var _quillDelta2 = _interopRequireDefault(_quillDelta);
4454
+
4455
+ var _op = __webpack_require__(20);
4456
+
4457
+ var _op2 = _interopRequireDefault(_op);
4458
+
4336
4459
  var _parchment = __webpack_require__(0);
4337
4460
 
4338
4461
  var _parchment2 = _interopRequireDefault(_parchment);
4339
4462
 
4340
- var _text = __webpack_require__(7);
4463
+ var _quill = __webpack_require__(5);
4341
4464
 
4342
- var _text2 = _interopRequireDefault(_text);
4465
+ var _quill2 = _interopRequireDefault(_quill);
4466
+
4467
+ var _logger = __webpack_require__(10);
4468
+
4469
+ var _logger2 = _interopRequireDefault(_logger);
4470
+
4471
+ var _module = __webpack_require__(9);
4472
+
4473
+ var _module2 = _interopRequireDefault(_module);
4343
4474
 
4344
4475
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
4345
4476
 
4477
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
4478
+
4346
4479
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
4347
4480
 
4348
4481
  function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
4349
4482
 
4350
4483
  function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
4351
4484
 
4352
- var Cursor = function (_Parchment$Embed) {
4353
- _inherits(Cursor, _Parchment$Embed);
4485
+ var debug = (0, _logger2.default)('quill:keyboard');
4354
4486
 
4355
- _createClass(Cursor, null, [{
4356
- key: 'value',
4357
- value: function value() {
4358
- return undefined;
4487
+ var SHORTKEY = /Mac/i.test(navigator.platform) ? 'metaKey' : 'ctrlKey';
4488
+
4489
+ var Keyboard = function (_Module) {
4490
+ _inherits(Keyboard, _Module);
4491
+
4492
+ _createClass(Keyboard, null, [{
4493
+ key: 'match',
4494
+ value: function match(evt, binding) {
4495
+ binding = normalize(binding);
4496
+ if (['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].some(function (key) {
4497
+ return !!binding[key] !== evt[key] && binding[key] !== null;
4498
+ })) {
4499
+ return false;
4500
+ }
4501
+ return binding.key === (evt.which || evt.keyCode);
4359
4502
  }
4360
4503
  }]);
4361
4504
 
4362
- function Cursor(domNode, selection) {
4363
- _classCallCheck(this, Cursor);
4505
+ function Keyboard(quill, options) {
4506
+ _classCallCheck(this, Keyboard);
4364
4507
 
4365
- var _this = _possibleConstructorReturn(this, (Cursor.__proto__ || Object.getPrototypeOf(Cursor)).call(this, domNode));
4508
+ var _this = _possibleConstructorReturn(this, (Keyboard.__proto__ || Object.getPrototypeOf(Keyboard)).call(this, quill, options));
4366
4509
 
4367
- _this.selection = selection;
4368
- _this.textNode = document.createTextNode(Cursor.CONTENTS);
4369
- _this.domNode.appendChild(_this.textNode);
4370
- _this._length = 0;
4510
+ _this.bindings = {};
4511
+ Object.keys(_this.options.bindings).forEach(function (name) {
4512
+ if (name === 'list autofill' && quill.scroll.whitelist != null && !quill.scroll.whitelist['list']) {
4513
+ return;
4514
+ }
4515
+ if (_this.options.bindings[name]) {
4516
+ _this.addBinding(_this.options.bindings[name]);
4517
+ }
4518
+ });
4519
+ _this.addBinding({ key: Keyboard.keys.ENTER, shiftKey: null }, handleEnter);
4520
+ _this.addBinding({ key: Keyboard.keys.ENTER, metaKey: null, ctrlKey: null, altKey: null }, function () {});
4521
+ if (/Firefox/i.test(navigator.userAgent)) {
4522
+ // Need to handle delete and backspace for Firefox in the general case #1171
4523
+ _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true }, handleBackspace);
4524
+ _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true }, handleDelete);
4525
+ } else {
4526
+ _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true, prefix: /^.?$/ }, handleBackspace);
4527
+ _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true, suffix: /^.?$/ }, handleDelete);
4528
+ }
4529
+ _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: false }, handleDeleteRange);
4530
+ _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: false }, handleDeleteRange);
4531
+ _this.addBinding({ key: Keyboard.keys.BACKSPACE, altKey: null, ctrlKey: null, metaKey: null, shiftKey: null }, { collapsed: true, offset: 0 }, handleBackspace);
4532
+ _this.listen();
4371
4533
  return _this;
4372
4534
  }
4373
4535
 
4374
- _createClass(Cursor, [{
4375
- key: 'detach',
4376
- value: function detach() {
4377
- // super.detach() will also clear domNode.__blot
4378
- if (this.parent != null) this.parent.removeChild(this);
4379
- }
4380
- }, {
4381
- key: 'format',
4382
- value: function format(name, value) {
4383
- if (this._length !== 0) {
4384
- return _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'format', this).call(this, name, value);
4536
+ _createClass(Keyboard, [{
4537
+ key: 'addBinding',
4538
+ value: function addBinding(key) {
4539
+ var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
4540
+ var handler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
4541
+
4542
+ var binding = normalize(key);
4543
+ if (binding == null || binding.key == null) {
4544
+ return debug.warn('Attempted to add invalid keyboard binding', binding);
4385
4545
  }
4386
- var target = this,
4387
- index = 0;
4388
- while (target != null && target.statics.scope !== _parchment2.default.Scope.BLOCK_BLOT) {
4389
- index += target.offset(target.parent);
4390
- target = target.parent;
4546
+ if (typeof context === 'function') {
4547
+ context = { handler: context };
4391
4548
  }
4392
- if (target != null) {
4393
- this._length = Cursor.CONTENTS.length;
4394
- target.optimize();
4395
- target.formatAt(index, Cursor.CONTENTS.length, name, value);
4396
- this._length = 0;
4549
+ if (typeof handler === 'function') {
4550
+ handler = { handler: handler };
4397
4551
  }
4552
+ binding = (0, _extend2.default)(binding, context, handler);
4553
+ this.bindings[binding.key] = this.bindings[binding.key] || [];
4554
+ this.bindings[binding.key].push(binding);
4398
4555
  }
4399
4556
  }, {
4400
- key: 'index',
4401
- value: function index(node, offset) {
4402
- if (node === this.textNode) return 0;
4403
- return _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'index', this).call(this, node, offset);
4404
- }
4405
- }, {
4406
- key: 'length',
4407
- value: function length() {
4408
- return this._length;
4409
- }
4410
- }, {
4411
- key: 'position',
4412
- value: function position() {
4413
- return [this.textNode, this.textNode.data.length];
4414
- }
4415
- }, {
4416
- key: 'remove',
4417
- value: function remove() {
4418
- _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'remove', this).call(this);
4419
- this.parent = null;
4420
- }
4421
- }, {
4422
- key: 'restore',
4423
- value: function restore() {
4424
- if (this.selection.composing || this.parent == null) return;
4425
- var textNode = this.textNode;
4426
- var range = this.selection.getNativeRange();
4427
- var restoreText = void 0,
4428
- start = void 0,
4429
- end = void 0;
4430
- if (range != null && range.start.node === textNode && range.end.node === textNode) {
4431
- var _ref = [textNode, range.start.offset, range.end.offset];
4432
- restoreText = _ref[0];
4433
- start = _ref[1];
4434
- end = _ref[2];
4435
- }
4436
- // Link format will insert text outside of anchor tag
4437
- while (this.domNode.lastChild != null && this.domNode.lastChild !== this.textNode) {
4438
- this.domNode.parentNode.insertBefore(this.domNode.lastChild, this.domNode);
4439
- }
4440
- if (this.textNode.data !== Cursor.CONTENTS) {
4441
- var text = this.textNode.data.split(Cursor.CONTENTS).join('');
4442
- if (this.next instanceof _text2.default) {
4443
- restoreText = this.next.domNode;
4444
- this.next.insertAt(0, text);
4445
- this.textNode.data = Cursor.CONTENTS;
4446
- } else {
4447
- this.textNode.data = text;
4448
- this.parent.insertBefore(_parchment2.default.create(this.textNode), this);
4449
- this.textNode = document.createTextNode(Cursor.CONTENTS);
4450
- this.domNode.appendChild(this.textNode);
4451
- }
4452
- }
4453
- this.remove();
4454
- if (start != null) {
4455
- var _map = [start, end].map(function (offset) {
4456
- return Math.max(0, Math.min(restoreText.data.length, offset - 1));
4457
- });
4557
+ key: 'listen',
4558
+ value: function listen() {
4559
+ var _this2 = this;
4458
4560
 
4459
- var _map2 = _slicedToArray(_map, 2);
4561
+ this.quill.root.addEventListener('keydown', function (evt) {
4562
+ if (evt.defaultPrevented) return;
4563
+ var which = evt.which || evt.keyCode;
4564
+ var bindings = (_this2.bindings[which] || []).filter(function (binding) {
4565
+ return Keyboard.match(evt, binding);
4566
+ });
4567
+ if (bindings.length === 0) return;
4568
+ var range = _this2.quill.getSelection();
4569
+ if (range == null || !_this2.quill.hasFocus()) return;
4460
4570
 
4461
- start = _map2[0];
4462
- end = _map2[1];
4571
+ var _quill$getLine = _this2.quill.getLine(range.index),
4572
+ _quill$getLine2 = _slicedToArray(_quill$getLine, 2),
4573
+ line = _quill$getLine2[0],
4574
+ offset = _quill$getLine2[1];
4575
+
4576
+ var _quill$getLeaf = _this2.quill.getLeaf(range.index),
4577
+ _quill$getLeaf2 = _slicedToArray(_quill$getLeaf, 2),
4578
+ leafStart = _quill$getLeaf2[0],
4579
+ offsetStart = _quill$getLeaf2[1];
4580
+
4581
+ var _ref = range.length === 0 ? [leafStart, offsetStart] : _this2.quill.getLeaf(range.index + range.length),
4582
+ _ref2 = _slicedToArray(_ref, 2),
4583
+ leafEnd = _ref2[0],
4584
+ offsetEnd = _ref2[1];
4585
+
4586
+ var prefixText = leafStart instanceof _parchment2.default.Text ? leafStart.value().slice(0, offsetStart) : '';
4587
+ var suffixText = leafEnd instanceof _parchment2.default.Text ? leafEnd.value().slice(offsetEnd) : '';
4588
+ var curContext = {
4589
+ collapsed: range.length === 0,
4590
+ empty: range.length === 0 && line.length() <= 1,
4591
+ format: _this2.quill.getFormat(range),
4592
+ offset: offset,
4593
+ prefix: prefixText,
4594
+ suffix: suffixText
4595
+ };
4596
+ var prevented = bindings.some(function (binding) {
4597
+ if (binding.collapsed != null && binding.collapsed !== curContext.collapsed) return false;
4598
+ if (binding.empty != null && binding.empty !== curContext.empty) return false;
4599
+ if (binding.offset != null && binding.offset !== curContext.offset) return false;
4600
+ if (Array.isArray(binding.format)) {
4601
+ // any format is present
4602
+ if (binding.format.every(function (name) {
4603
+ return curContext.format[name] == null;
4604
+ })) {
4605
+ return false;
4606
+ }
4607
+ } else if (_typeof(binding.format) === 'object') {
4608
+ // all formats must match
4609
+ if (!Object.keys(binding.format).every(function (name) {
4610
+ if (binding.format[name] === true) return curContext.format[name] != null;
4611
+ if (binding.format[name] === false) return curContext.format[name] == null;
4612
+ return (0, _deepEqual2.default)(binding.format[name], curContext.format[name]);
4613
+ })) {
4614
+ return false;
4615
+ }
4616
+ }
4617
+ if (binding.prefix != null && !binding.prefix.test(curContext.prefix)) return false;
4618
+ if (binding.suffix != null && !binding.suffix.test(curContext.suffix)) return false;
4619
+ return binding.handler.call(_this2, range, curContext) !== true;
4620
+ });
4621
+ if (prevented) {
4622
+ evt.preventDefault();
4623
+ }
4624
+ });
4625
+ }
4626
+ }]);
4627
+
4628
+ return Keyboard;
4629
+ }(_module2.default);
4630
+
4631
+ Keyboard.keys = {
4632
+ BACKSPACE: 8,
4633
+ TAB: 9,
4634
+ ENTER: 13,
4635
+ ESCAPE: 27,
4636
+ LEFT: 37,
4637
+ UP: 38,
4638
+ RIGHT: 39,
4639
+ DOWN: 40,
4640
+ DELETE: 46
4641
+ };
4642
+
4643
+ Keyboard.DEFAULTS = {
4644
+ bindings: {
4645
+ 'bold': makeFormatHandler('bold'),
4646
+ 'italic': makeFormatHandler('italic'),
4647
+ 'underline': makeFormatHandler('underline'),
4648
+ 'indent': {
4649
+ // highlight tab or tab at beginning of list, indent or blockquote
4650
+ key: Keyboard.keys.TAB,
4651
+ format: ['blockquote', 'indent', 'list'],
4652
+ handler: function handler(range, context) {
4653
+ if (context.collapsed && context.offset !== 0) return true;
4654
+ this.quill.format('indent', '+1', _quill2.default.sources.USER);
4655
+ }
4656
+ },
4657
+ 'outdent': {
4658
+ key: Keyboard.keys.TAB,
4659
+ shiftKey: true,
4660
+ format: ['blockquote', 'indent', 'list'],
4661
+ // highlight tab or tab at beginning of list, indent or blockquote
4662
+ handler: function handler(range, context) {
4663
+ if (context.collapsed && context.offset !== 0) return true;
4664
+ this.quill.format('indent', '-1', _quill2.default.sources.USER);
4665
+ }
4666
+ },
4667
+ 'outdent backspace': {
4668
+ key: Keyboard.keys.BACKSPACE,
4669
+ collapsed: true,
4670
+ shiftKey: null,
4671
+ metaKey: null,
4672
+ ctrlKey: null,
4673
+ altKey: null,
4674
+ format: ['indent', 'list'],
4675
+ offset: 0,
4676
+ handler: function handler(range, context) {
4677
+ if (context.format.indent != null) {
4678
+ this.quill.format('indent', '-1', _quill2.default.sources.USER);
4679
+ } else if (context.format.list != null) {
4680
+ this.quill.format('list', false, _quill2.default.sources.USER);
4681
+ }
4682
+ }
4683
+ },
4684
+ 'indent code-block': makeCodeBlockHandler(true),
4685
+ 'outdent code-block': makeCodeBlockHandler(false),
4686
+ 'remove tab': {
4687
+ key: Keyboard.keys.TAB,
4688
+ shiftKey: true,
4689
+ collapsed: true,
4690
+ prefix: /\t$/,
4691
+ handler: function handler(range) {
4692
+ this.quill.deleteText(range.index - 1, 1, _quill2.default.sources.USER);
4693
+ }
4694
+ },
4695
+ 'tab': {
4696
+ key: Keyboard.keys.TAB,
4697
+ handler: function handler(range) {
4698
+ this.quill.history.cutoff();
4699
+ var delta = new _quillDelta2.default().retain(range.index).delete(range.length).insert('\t');
4700
+ this.quill.updateContents(delta, _quill2.default.sources.USER);
4701
+ this.quill.history.cutoff();
4702
+ this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);
4703
+ }
4704
+ },
4705
+ 'list empty enter': {
4706
+ key: Keyboard.keys.ENTER,
4707
+ collapsed: true,
4708
+ format: ['list'],
4709
+ empty: true,
4710
+ handler: function handler(range, context) {
4711
+ this.quill.format('list', false, _quill2.default.sources.USER);
4712
+ if (context.format.indent) {
4713
+ this.quill.format('indent', false, _quill2.default.sources.USER);
4714
+ }
4715
+ }
4716
+ },
4717
+ 'checklist enter': {
4718
+ key: Keyboard.keys.ENTER,
4719
+ collapsed: true,
4720
+ format: { list: 'checked' },
4721
+ handler: function handler(range) {
4722
+ var _quill$getLine3 = this.quill.getLine(range.index),
4723
+ _quill$getLine4 = _slicedToArray(_quill$getLine3, 2),
4724
+ line = _quill$getLine4[0],
4725
+ offset = _quill$getLine4[1];
4726
+
4727
+ var formats = (0, _extend2.default)({}, line.formats(), { list: 'checked' });
4728
+ var delta = new _quillDelta2.default().retain(range.index).insert('\n', formats).retain(line.length() - offset - 1).retain(1, { list: 'unchecked' });
4729
+ this.quill.updateContents(delta, _quill2.default.sources.USER);
4730
+ this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);
4731
+ this.quill.scrollIntoView();
4732
+ }
4733
+ },
4734
+ 'header enter': {
4735
+ key: Keyboard.keys.ENTER,
4736
+ collapsed: true,
4737
+ format: ['header'],
4738
+ suffix: /^$/,
4739
+ handler: function handler(range, context) {
4740
+ var _quill$getLine5 = this.quill.getLine(range.index),
4741
+ _quill$getLine6 = _slicedToArray(_quill$getLine5, 2),
4742
+ line = _quill$getLine6[0],
4743
+ offset = _quill$getLine6[1];
4744
+
4745
+ var delta = new _quillDelta2.default().retain(range.index).insert('\n', context.format).retain(line.length() - offset - 1).retain(1, { header: null });
4746
+ this.quill.updateContents(delta, _quill2.default.sources.USER);
4747
+ this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);
4748
+ this.quill.scrollIntoView();
4749
+ }
4750
+ },
4751
+ 'list autofill': {
4752
+ key: ' ',
4753
+ collapsed: true,
4754
+ format: { list: false },
4755
+ prefix: /^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/,
4756
+ handler: function handler(range, context) {
4757
+ var length = context.prefix.length;
4758
+
4759
+ var _quill$getLine7 = this.quill.getLine(range.index),
4760
+ _quill$getLine8 = _slicedToArray(_quill$getLine7, 2),
4761
+ line = _quill$getLine8[0],
4762
+ offset = _quill$getLine8[1];
4763
+
4764
+ if (offset > length) return true;
4765
+ var value = void 0;
4766
+ switch (context.prefix.trim()) {
4767
+ case '[]':case '[ ]':
4768
+ value = 'unchecked';
4769
+ break;
4770
+ case '[x]':
4771
+ value = 'checked';
4772
+ break;
4773
+ case '-':case '*':
4774
+ value = 'bullet';
4775
+ break;
4776
+ default:
4777
+ value = 'ordered';
4778
+ }
4779
+ this.quill.insertText(range.index, ' ', _quill2.default.sources.USER);
4780
+ this.quill.history.cutoff();
4781
+ var delta = new _quillDelta2.default().retain(range.index - offset).delete(length + 1).retain(line.length() - 2 - offset).retain(1, { list: value });
4782
+ this.quill.updateContents(delta, _quill2.default.sources.USER);
4783
+ this.quill.history.cutoff();
4784
+ this.quill.setSelection(range.index - length, _quill2.default.sources.SILENT);
4785
+ }
4786
+ },
4787
+ 'code exit': {
4788
+ key: Keyboard.keys.ENTER,
4789
+ collapsed: true,
4790
+ format: ['code-block'],
4791
+ prefix: /\n\n$/,
4792
+ suffix: /^\s+$/,
4793
+ handler: function handler(range) {
4794
+ var _quill$getLine9 = this.quill.getLine(range.index),
4795
+ _quill$getLine10 = _slicedToArray(_quill$getLine9, 2),
4796
+ line = _quill$getLine10[0],
4797
+ offset = _quill$getLine10[1];
4798
+
4799
+ var delta = new _quillDelta2.default().retain(range.index + line.length() - offset - 2).retain(1, { 'code-block': null }).delete(1);
4800
+ this.quill.updateContents(delta, _quill2.default.sources.USER);
4801
+ }
4802
+ },
4803
+ 'embed left': makeEmbedArrowHandler(Keyboard.keys.LEFT, false),
4804
+ 'embed left shift': makeEmbedArrowHandler(Keyboard.keys.LEFT, true),
4805
+ 'embed right': makeEmbedArrowHandler(Keyboard.keys.RIGHT, false),
4806
+ 'embed right shift': makeEmbedArrowHandler(Keyboard.keys.RIGHT, true)
4807
+ }
4808
+ };
4809
+
4810
+ function makeEmbedArrowHandler(key, shiftKey) {
4811
+ var _ref3;
4812
+
4813
+ var where = key === Keyboard.keys.LEFT ? 'prefix' : 'suffix';
4814
+ return _ref3 = {
4815
+ key: key,
4816
+ shiftKey: shiftKey,
4817
+ altKey: null
4818
+ }, _defineProperty(_ref3, where, /^$/), _defineProperty(_ref3, 'handler', function handler(range) {
4819
+ var index = range.index;
4820
+ if (key === Keyboard.keys.RIGHT) {
4821
+ index += range.length + 1;
4822
+ }
4823
+
4824
+ var _quill$getLeaf3 = this.quill.getLeaf(index),
4825
+ _quill$getLeaf4 = _slicedToArray(_quill$getLeaf3, 1),
4826
+ leaf = _quill$getLeaf4[0];
4827
+
4828
+ if (!(leaf instanceof _parchment2.default.Embed)) return true;
4829
+ if (key === Keyboard.keys.LEFT) {
4830
+ if (shiftKey) {
4831
+ this.quill.setSelection(range.index - 1, range.length + 1, _quill2.default.sources.USER);
4832
+ } else {
4833
+ this.quill.setSelection(range.index - 1, _quill2.default.sources.USER);
4834
+ }
4835
+ } else {
4836
+ if (shiftKey) {
4837
+ this.quill.setSelection(range.index, range.length + 1, _quill2.default.sources.USER);
4838
+ } else {
4839
+ this.quill.setSelection(range.index + range.length + 1, _quill2.default.sources.USER);
4840
+ }
4841
+ }
4842
+ return false;
4843
+ }), _ref3;
4844
+ }
4845
+
4846
+ function handleBackspace(range, context) {
4847
+ if (range.index === 0 || this.quill.getLength() <= 1) return;
4848
+
4849
+ var _quill$getLine11 = this.quill.getLine(range.index),
4850
+ _quill$getLine12 = _slicedToArray(_quill$getLine11, 1),
4851
+ line = _quill$getLine12[0];
4852
+
4853
+ var formats = {};
4854
+ if (context.offset === 0) {
4855
+ var _quill$getLine13 = this.quill.getLine(range.index - 1),
4856
+ _quill$getLine14 = _slicedToArray(_quill$getLine13, 1),
4857
+ prev = _quill$getLine14[0];
4858
+
4859
+ if (prev != null && prev.length() > 1) {
4860
+ var curFormats = line.formats();
4861
+ var prevFormats = this.quill.getFormat(range.index - 1, 1);
4862
+ formats = _op2.default.attributes.diff(curFormats, prevFormats) || {};
4863
+ }
4864
+ }
4865
+ // Check for astral symbols
4866
+ var length = /[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(context.prefix) ? 2 : 1;
4867
+ this.quill.deleteText(range.index - length, length, _quill2.default.sources.USER);
4868
+ if (Object.keys(formats).length > 0) {
4869
+ this.quill.formatLine(range.index - length, length, formats, _quill2.default.sources.USER);
4870
+ }
4871
+ this.quill.focus();
4872
+ }
4873
+
4874
+ function handleDelete(range, context) {
4875
+ // Check for astral symbols
4876
+ var length = /^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(context.suffix) ? 2 : 1;
4877
+ if (range.index >= this.quill.getLength() - length) return;
4878
+ var formats = {},
4879
+ nextLength = 0;
4880
+
4881
+ var _quill$getLine15 = this.quill.getLine(range.index),
4882
+ _quill$getLine16 = _slicedToArray(_quill$getLine15, 1),
4883
+ line = _quill$getLine16[0];
4884
+
4885
+ if (context.offset >= line.length() - 1) {
4886
+ var _quill$getLine17 = this.quill.getLine(range.index + 1),
4887
+ _quill$getLine18 = _slicedToArray(_quill$getLine17, 1),
4888
+ next = _quill$getLine18[0];
4889
+
4890
+ if (next) {
4891
+ var curFormats = line.formats();
4892
+ var nextFormats = this.quill.getFormat(range.index, 1);
4893
+ formats = _op2.default.attributes.diff(curFormats, nextFormats) || {};
4894
+ nextLength = next.length();
4895
+ }
4896
+ }
4897
+ this.quill.deleteText(range.index, length, _quill2.default.sources.USER);
4898
+ if (Object.keys(formats).length > 0) {
4899
+ this.quill.formatLine(range.index + nextLength - 1, length, formats, _quill2.default.sources.USER);
4900
+ }
4901
+ }
4902
+
4903
+ function handleDeleteRange(range) {
4904
+ var lines = this.quill.getLines(range);
4905
+ var formats = {};
4906
+ if (lines.length > 1) {
4907
+ var firstFormats = lines[0].formats();
4908
+ var lastFormats = lines[lines.length - 1].formats();
4909
+ formats = _op2.default.attributes.diff(lastFormats, firstFormats) || {};
4910
+ }
4911
+ this.quill.deleteText(range, _quill2.default.sources.USER);
4912
+ if (Object.keys(formats).length > 0) {
4913
+ this.quill.formatLine(range.index, 1, formats, _quill2.default.sources.USER);
4914
+ }
4915
+ this.quill.setSelection(range.index, _quill2.default.sources.SILENT);
4916
+ this.quill.focus();
4917
+ }
4918
+
4919
+ function handleEnter(range, context) {
4920
+ var _this3 = this;
4921
+
4922
+ if (range.length > 0) {
4923
+ this.quill.scroll.deleteAt(range.index, range.length); // So we do not trigger text-change
4924
+ }
4925
+ var lineFormats = Object.keys(context.format).reduce(function (lineFormats, format) {
4926
+ if (_parchment2.default.query(format, _parchment2.default.Scope.BLOCK) && !Array.isArray(context.format[format])) {
4927
+ lineFormats[format] = context.format[format];
4928
+ }
4929
+ return lineFormats;
4930
+ }, {});
4931
+ this.quill.insertText(range.index, '\n', lineFormats, _quill2.default.sources.USER);
4932
+ // Earlier scroll.deleteAt might have messed up our selection,
4933
+ // so insertText's built in selection preservation is not reliable
4934
+ this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);
4935
+ this.quill.focus();
4936
+ Object.keys(context.format).forEach(function (name) {
4937
+ if (lineFormats[name] != null) return;
4938
+ if (Array.isArray(context.format[name])) return;
4939
+ if (name === 'link') return;
4940
+ _this3.quill.format(name, context.format[name], _quill2.default.sources.USER);
4941
+ });
4942
+ }
4943
+
4944
+ function makeCodeBlockHandler(indent) {
4945
+ return {
4946
+ key: Keyboard.keys.TAB,
4947
+ shiftKey: !indent,
4948
+ format: { 'code-block': true },
4949
+ handler: function handler(range) {
4950
+ var CodeBlock = _parchment2.default.query('code-block');
4951
+ var index = range.index,
4952
+ length = range.length;
4953
+
4954
+ var _quill$scroll$descend = this.quill.scroll.descendant(CodeBlock, index),
4955
+ _quill$scroll$descend2 = _slicedToArray(_quill$scroll$descend, 2),
4956
+ block = _quill$scroll$descend2[0],
4957
+ offset = _quill$scroll$descend2[1];
4958
+
4959
+ if (block == null) return;
4960
+ var scrollIndex = this.quill.getIndex(block);
4961
+ var start = block.newlineIndex(offset, true) + 1;
4962
+ var end = block.newlineIndex(scrollIndex + offset + length);
4963
+ var lines = block.domNode.textContent.slice(start, end).split('\n');
4964
+ offset = 0;
4965
+ lines.forEach(function (line, i) {
4966
+ if (indent) {
4967
+ block.insertAt(start + offset, CodeBlock.TAB);
4968
+ offset += CodeBlock.TAB.length;
4969
+ if (i === 0) {
4970
+ index += CodeBlock.TAB.length;
4971
+ } else {
4972
+ length += CodeBlock.TAB.length;
4973
+ }
4974
+ } else if (line.startsWith(CodeBlock.TAB)) {
4975
+ block.deleteAt(start + offset, CodeBlock.TAB.length);
4976
+ offset -= CodeBlock.TAB.length;
4977
+ if (i === 0) {
4978
+ index -= CodeBlock.TAB.length;
4979
+ } else {
4980
+ length -= CodeBlock.TAB.length;
4981
+ }
4982
+ }
4983
+ offset += line.length + 1;
4984
+ });
4985
+ this.quill.update(_quill2.default.sources.USER);
4986
+ this.quill.setSelection(index, length, _quill2.default.sources.SILENT);
4987
+ }
4988
+ };
4989
+ }
4990
+
4991
+ function makeFormatHandler(format) {
4992
+ return {
4993
+ key: format[0].toUpperCase(),
4994
+ shortKey: true,
4995
+ handler: function handler(range, context) {
4996
+ this.quill.format(format, !context.format[format], _quill2.default.sources.USER);
4997
+ }
4998
+ };
4999
+ }
5000
+
5001
+ function normalize(binding) {
5002
+ if (typeof binding === 'string' || typeof binding === 'number') {
5003
+ return normalize({ key: binding });
5004
+ }
5005
+ if ((typeof binding === 'undefined' ? 'undefined' : _typeof(binding)) === 'object') {
5006
+ binding = (0, _clone2.default)(binding, false);
5007
+ }
5008
+ if (typeof binding.key === 'string') {
5009
+ if (Keyboard.keys[binding.key.toUpperCase()] != null) {
5010
+ binding.key = Keyboard.keys[binding.key.toUpperCase()];
5011
+ } else if (binding.key.length === 1) {
5012
+ binding.key = binding.key.toUpperCase().charCodeAt(0);
5013
+ } else {
5014
+ return null;
5015
+ }
5016
+ }
5017
+ if (binding.shortKey) {
5018
+ binding[SHORTKEY] = binding.shortKey;
5019
+ delete binding.shortKey;
5020
+ }
5021
+ return binding;
5022
+ }
5023
+
5024
+ exports.default = Keyboard;
5025
+ exports.SHORTKEY = SHORTKEY;
5026
+
5027
+ /***/ }),
5028
+ /* 24 */
5029
+ /***/ (function(module, exports, __webpack_require__) {
5030
+
5031
+ "use strict";
5032
+
5033
+
5034
+ Object.defineProperty(exports, "__esModule", {
5035
+ value: true
5036
+ });
5037
+
5038
+ var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
5039
+
5040
+ var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
5041
+
5042
+ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
5043
+
5044
+ var _parchment = __webpack_require__(0);
5045
+
5046
+ var _parchment2 = _interopRequireDefault(_parchment);
5047
+
5048
+ var _text = __webpack_require__(7);
5049
+
5050
+ var _text2 = _interopRequireDefault(_text);
5051
+
5052
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
5053
+
5054
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
5055
+
5056
+ function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
5057
+
5058
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
5059
+
5060
+ var Cursor = function (_Parchment$Embed) {
5061
+ _inherits(Cursor, _Parchment$Embed);
5062
+
5063
+ _createClass(Cursor, null, [{
5064
+ key: 'value',
5065
+ value: function value() {
5066
+ return undefined;
5067
+ }
5068
+ }]);
5069
+
5070
+ function Cursor(domNode, selection) {
5071
+ _classCallCheck(this, Cursor);
5072
+
5073
+ var _this = _possibleConstructorReturn(this, (Cursor.__proto__ || Object.getPrototypeOf(Cursor)).call(this, domNode));
5074
+
5075
+ _this.selection = selection;
5076
+ _this.textNode = document.createTextNode(Cursor.CONTENTS);
5077
+ _this.domNode.appendChild(_this.textNode);
5078
+ _this._length = 0;
5079
+ return _this;
5080
+ }
5081
+
5082
+ _createClass(Cursor, [{
5083
+ key: 'detach',
5084
+ value: function detach() {
5085
+ // super.detach() will also clear domNode.__blot
5086
+ if (this.parent != null) this.parent.removeChild(this);
5087
+ }
5088
+ }, {
5089
+ key: 'format',
5090
+ value: function format(name, value) {
5091
+ if (this._length !== 0) {
5092
+ return _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'format', this).call(this, name, value);
5093
+ }
5094
+ var target = this,
5095
+ index = 0;
5096
+ while (target != null && target.statics.scope !== _parchment2.default.Scope.BLOCK_BLOT) {
5097
+ index += target.offset(target.parent);
5098
+ target = target.parent;
5099
+ }
5100
+ if (target != null) {
5101
+ this._length = Cursor.CONTENTS.length;
5102
+ target.optimize();
5103
+ target.formatAt(index, Cursor.CONTENTS.length, name, value);
5104
+ this._length = 0;
5105
+ }
5106
+ }
5107
+ }, {
5108
+ key: 'index',
5109
+ value: function index(node, offset) {
5110
+ if (node === this.textNode) return 0;
5111
+ return _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'index', this).call(this, node, offset);
5112
+ }
5113
+ }, {
5114
+ key: 'length',
5115
+ value: function length() {
5116
+ return this._length;
5117
+ }
5118
+ }, {
5119
+ key: 'position',
5120
+ value: function position() {
5121
+ return [this.textNode, this.textNode.data.length];
5122
+ }
5123
+ }, {
5124
+ key: 'remove',
5125
+ value: function remove() {
5126
+ _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'remove', this).call(this);
5127
+ this.parent = null;
5128
+ }
5129
+ }, {
5130
+ key: 'restore',
5131
+ value: function restore() {
5132
+ if (this.selection.composing || this.parent == null) return;
5133
+ var textNode = this.textNode;
5134
+ var range = this.selection.getNativeRange();
5135
+ var restoreText = void 0,
5136
+ start = void 0,
5137
+ end = void 0;
5138
+ if (range != null && range.start.node === textNode && range.end.node === textNode) {
5139
+ var _ref = [textNode, range.start.offset, range.end.offset];
5140
+ restoreText = _ref[0];
5141
+ start = _ref[1];
5142
+ end = _ref[2];
5143
+ }
5144
+ // Link format will insert text outside of anchor tag
5145
+ while (this.domNode.lastChild != null && this.domNode.lastChild !== this.textNode) {
5146
+ this.domNode.parentNode.insertBefore(this.domNode.lastChild, this.domNode);
5147
+ }
5148
+ if (this.textNode.data !== Cursor.CONTENTS) {
5149
+ var text = this.textNode.data.split(Cursor.CONTENTS).join('');
5150
+ if (this.next instanceof _text2.default) {
5151
+ restoreText = this.next.domNode;
5152
+ this.next.insertAt(0, text);
5153
+ this.textNode.data = Cursor.CONTENTS;
5154
+ } else {
5155
+ this.textNode.data = text;
5156
+ this.parent.insertBefore(_parchment2.default.create(this.textNode), this);
5157
+ this.textNode = document.createTextNode(Cursor.CONTENTS);
5158
+ this.domNode.appendChild(this.textNode);
5159
+ }
5160
+ }
5161
+ this.remove();
5162
+ if (start != null) {
5163
+ var _map = [start, end].map(function (offset) {
5164
+ return Math.max(0, Math.min(restoreText.data.length, offset - 1));
5165
+ });
5166
+
5167
+ var _map2 = _slicedToArray(_map, 2);
5168
+
5169
+ start = _map2[0];
5170
+ end = _map2[1];
4463
5171
 
4464
5172
  return {
4465
5173
  startNode: restoreText,
@@ -4500,7 +5208,7 @@ Cursor.CONTENTS = '\uFEFF'; // Zero width no break space
4500
5208
  exports.default = Cursor;
4501
5209
 
4502
5210
  /***/ }),
4503
- /* 24 */
5211
+ /* 25 */
4504
5212
  /***/ (function(module, exports, __webpack_require__) {
4505
5213
 
4506
5214
  "use strict";
@@ -4542,127 +5250,6 @@ Container.allowedChildren = [_block2.default, _block.BlockEmbed, Container];
4542
5250
 
4543
5251
  exports.default = Container;
4544
5252
 
4545
- /***/ }),
4546
- /* 25 */
4547
- /***/ (function(module, exports, __webpack_require__) {
4548
-
4549
- "use strict";
4550
-
4551
-
4552
- Object.defineProperty(exports, "__esModule", {
4553
- value: true
4554
- });
4555
-
4556
- var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
4557
-
4558
- var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
4559
-
4560
- var _parchment = __webpack_require__(0);
4561
-
4562
- var _parchment2 = _interopRequireDefault(_parchment);
4563
-
4564
- var _text = __webpack_require__(7);
4565
-
4566
- var _text2 = _interopRequireDefault(_text);
4567
-
4568
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
4569
-
4570
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
4571
-
4572
- function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
4573
-
4574
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
4575
-
4576
- var GUARD_TEXT = '\uFEFF';
4577
-
4578
- var Embed = function (_Parchment$Embed) {
4579
- _inherits(Embed, _Parchment$Embed);
4580
-
4581
- function Embed(node) {
4582
- _classCallCheck(this, Embed);
4583
-
4584
- var _this = _possibleConstructorReturn(this, (Embed.__proto__ || Object.getPrototypeOf(Embed)).call(this, node));
4585
-
4586
- _this.contentNode = document.createElement('span');
4587
- _this.contentNode.setAttribute('contenteditable', false);
4588
- [].slice.call(_this.domNode.childNodes).forEach(function (childNode) {
4589
- _this.contentNode.appendChild(childNode);
4590
- });
4591
- _this.leftGuard = document.createTextNode(GUARD_TEXT);
4592
- _this.rightGuard = document.createTextNode(GUARD_TEXT);
4593
- _this.domNode.appendChild(_this.leftGuard);
4594
- _this.domNode.appendChild(_this.contentNode);
4595
- _this.domNode.appendChild(_this.rightGuard);
4596
- return _this;
4597
- }
4598
-
4599
- _createClass(Embed, [{
4600
- key: 'index',
4601
- value: function index(node, offset) {
4602
- if (node === this.leftGuard) return 0;
4603
- if (node === this.rightGuard) return 1;
4604
- return _get(Embed.prototype.__proto__ || Object.getPrototypeOf(Embed.prototype), 'index', this).call(this, node, offset);
4605
- }
4606
- }, {
4607
- key: 'restore',
4608
- value: function restore(node) {
4609
- var range = void 0,
4610
- textNode = void 0;
4611
- var text = node.data.split(GUARD_TEXT).join('');
4612
- if (node === this.leftGuard) {
4613
- if (this.prev instanceof _text2.default) {
4614
- var prevLength = this.prev.length();
4615
- this.prev.insertAt(prevLength, text);
4616
- range = {
4617
- startNode: this.prev.domNode,
4618
- startOffset: prevLength + text.length
4619
- };
4620
- } else {
4621
- textNode = document.createTextNode(text);
4622
- this.parent.insertBefore(_parchment2.default.create(textNode), this);
4623
- range = {
4624
- startNode: textNode,
4625
- startOffset: text.length
4626
- };
4627
- }
4628
- } else if (node === this.rightGuard) {
4629
- if (this.next instanceof _text2.default) {
4630
- this.next.insertAt(0, text);
4631
- range = {
4632
- startNode: this.next.domNode,
4633
- startOffset: text.length
4634
- };
4635
- } else {
4636
- textNode = document.createTextNode(text);
4637
- this.parent.insertBefore(_parchment2.default.create(textNode), this.next);
4638
- range = {
4639
- startNode: textNode,
4640
- startOffset: text.length
4641
- };
4642
- }
4643
- }
4644
- node.data = GUARD_TEXT;
4645
- return range;
4646
- }
4647
- }, {
4648
- key: 'update',
4649
- value: function update(mutations, context) {
4650
- var _this2 = this;
4651
-
4652
- mutations.forEach(function (mutation) {
4653
- if (mutation.type === 'characterData' && (mutation.target === _this2.leftGuard || mutation.target === _this2.rightGuard)) {
4654
- var range = _this2.restore(mutation.target);
4655
- if (range) context.range = range;
4656
- }
4657
- });
4658
- }
4659
- }]);
4660
-
4661
- return Embed;
4662
- }(_parchment2.default.Embed);
4663
-
4664
- exports.default = Embed;
4665
-
4666
5253
  /***/ }),
4667
5254
  /* 26 */
4668
5255
  /***/ (function(module, exports, __webpack_require__) {
@@ -4735,6 +5322,10 @@ exports.ColorStyle = ColorStyle;
4735
5322
  "use strict";
4736
5323
 
4737
5324
 
5325
+ Object.defineProperty(exports, "__esModule", {
5326
+ value: true
5327
+ });
5328
+
4738
5329
  var _parchment = __webpack_require__(0);
4739
5330
 
4740
5331
  var _parchment2 = _interopRequireDefault(_parchment);
@@ -4751,15 +5342,15 @@ var _break = __webpack_require__(16);
4751
5342
 
4752
5343
  var _break2 = _interopRequireDefault(_break);
4753
5344
 
4754
- var _container = __webpack_require__(24);
5345
+ var _container = __webpack_require__(25);
4755
5346
 
4756
5347
  var _container2 = _interopRequireDefault(_container);
4757
5348
 
4758
- var _cursor = __webpack_require__(23);
5349
+ var _cursor = __webpack_require__(24);
4759
5350
 
4760
5351
  var _cursor2 = _interopRequireDefault(_cursor);
4761
5352
 
4762
- var _embed = __webpack_require__(25);
5353
+ var _embed = __webpack_require__(35);
4763
5354
 
4764
5355
  var _embed2 = _interopRequireDefault(_embed);
4765
5356
 
@@ -4783,7 +5374,7 @@ var _history = __webpack_require__(42);
4783
5374
 
4784
5375
  var _history2 = _interopRequireDefault(_history);
4785
5376
 
4786
- var _keyboard = __webpack_require__(35);
5377
+ var _keyboard = __webpack_require__(23);
4787
5378
 
4788
5379
  var _keyboard2 = _interopRequireDefault(_keyboard);
4789
5380
 
@@ -4807,7 +5398,7 @@ _quill2.default.register({
4807
5398
 
4808
5399
  _parchment2.default.register(_block2.default, _break2.default, _cursor2.default, _inline2.default, _scroll2.default, _text2.default);
4809
5400
 
4810
- module.exports = _quill2.default;
5401
+ exports.default = _quill2.default;
4811
5402
 
4812
5403
  /***/ }),
4813
5404
  /* 30 */
@@ -4820,7 +5411,8 @@ var Registry = __webpack_require__(1);
4820
5411
  var ShadowBlot = /** @class */ (function () {
4821
5412
  function ShadowBlot(domNode) {
4822
5413
  this.domNode = domNode;
4823
- this.attach();
5414
+ // @ts-ignore
5415
+ this.domNode[Registry.DATA_KEY] = { blot: this };
4824
5416
  }
4825
5417
  Object.defineProperty(ShadowBlot.prototype, "statics", {
4826
5418
  // Hack for accessing inherited static methods
@@ -4861,7 +5453,9 @@ var ShadowBlot = /** @class */ (function () {
4861
5453
  return node;
4862
5454
  };
4863
5455
  ShadowBlot.prototype.attach = function () {
4864
- this.domNode[Registry.DATA_KEY] = { blot: this };
5456
+ if (this.parent != null) {
5457
+ this.scroll = this.parent.scroll;
5458
+ }
4865
5459
  };
4866
5460
  ShadowBlot.prototype.clone = function () {
4867
5461
  var domNode = this.domNode.cloneNode(false);
@@ -4870,6 +5464,7 @@ var ShadowBlot = /** @class */ (function () {
4870
5464
  ShadowBlot.prototype.detach = function () {
4871
5465
  if (this.parent != null)
4872
5466
  this.parent.removeChild(this);
5467
+ // @ts-ignore
4873
5468
  delete this.domNode[Registry.DATA_KEY];
4874
5469
  };
4875
5470
  ShadowBlot.prototype.deleteAt = function (index, length) {
@@ -4888,22 +5483,26 @@ var ShadowBlot = /** @class */ (function () {
4888
5483
  }
4889
5484
  };
4890
5485
  ShadowBlot.prototype.insertAt = function (index, value, def) {
4891
- var blot = (def == null) ? Registry.create('text', value) : Registry.create(value, def);
5486
+ var blot = def == null ? Registry.create('text', value) : Registry.create(value, def);
4892
5487
  var ref = this.split(index);
4893
5488
  this.parent.insertBefore(blot, ref);
4894
5489
  };
4895
5490
  ShadowBlot.prototype.insertInto = function (parentBlot, refBlot) {
5491
+ if (refBlot === void 0) { refBlot = null; }
4896
5492
  if (this.parent != null) {
4897
5493
  this.parent.children.remove(this);
4898
5494
  }
5495
+ var refDomNode = null;
4899
5496
  parentBlot.children.insertBefore(this, refBlot);
4900
5497
  if (refBlot != null) {
4901
- var refDomNode = refBlot.domNode;
5498
+ refDomNode = refBlot.domNode;
4902
5499
  }
4903
- if (this.next == null || this.domNode.nextSibling != refDomNode) {
4904
- parentBlot.domNode.insertBefore(this.domNode, (typeof refDomNode !== 'undefined') ? refDomNode : null);
5500
+ if (this.domNode.parentNode != parentBlot.domNode ||
5501
+ this.domNode.nextSibling != refDomNode) {
5502
+ parentBlot.domNode.insertBefore(this.domNode, refDomNode);
4905
5503
  }
4906
5504
  this.parent = parentBlot;
5505
+ this.attach();
4907
5506
  };
4908
5507
  ShadowBlot.prototype.isolate = function (index, length) {
4909
5508
  var target = this.split(index);
@@ -4913,7 +5512,6 @@ var ShadowBlot = /** @class */ (function () {
4913
5512
  ShadowBlot.prototype.length = function () {
4914
5513
  return 1;
4915
5514
  };
4916
- ;
4917
5515
  ShadowBlot.prototype.offset = function (root) {
4918
5516
  if (root === void 0) { root = this.parent; }
4919
5517
  if (this.parent == null || this == root)
@@ -4922,7 +5520,9 @@ var ShadowBlot = /** @class */ (function () {
4922
5520
  };
4923
5521
  ShadowBlot.prototype.optimize = function (context) {
4924
5522
  // TODO clean up once we use WeakMap
5523
+ // @ts-ignore
4925
5524
  if (this.domNode[Registry.DATA_KEY] != null) {
5525
+ // @ts-ignore
4926
5526
  delete this.domNode[Registry.DATA_KEY].mutations;
4927
5527
  }
4928
5528
  };
@@ -4981,6 +5581,7 @@ var AttributorStore = /** @class */ (function () {
4981
5581
  this.build();
4982
5582
  }
4983
5583
  AttributorStore.prototype.attribute = function (attribute, value) {
5584
+ // verb
4984
5585
  if (value) {
4985
5586
  if (attribute.add(this.domNode, value)) {
4986
5587
  if (attribute.value(this.domNode) != null) {
@@ -5002,7 +5603,10 @@ var AttributorStore = /** @class */ (function () {
5002
5603
  var attributes = attributor_1.default.keys(this.domNode);
5003
5604
  var classes = class_1.default.keys(this.domNode);
5004
5605
  var styles = style_1.default.keys(this.domNode);
5005
- attributes.concat(classes).concat(styles).forEach(function (name) {
5606
+ attributes
5607
+ .concat(classes)
5608
+ .concat(styles)
5609
+ .forEach(function (name) {
5006
5610
  var attr = Registry.query(name, Registry.Scope.ATTRIBUTE);
5007
5611
  if (attr instanceof attributor_1.default) {
5008
5612
  _this.attributes[attr.attrName] = attr;
@@ -5067,7 +5671,10 @@ var ClassAttributor = /** @class */ (function (_super) {
5067
5671
  }
5068
5672
  ClassAttributor.keys = function (node) {
5069
5673
  return (node.getAttribute('class') || '').split(/\s+/).map(function (name) {
5070
- return name.split('-').slice(0, -1).join('-');
5674
+ return name
5675
+ .split('-')
5676
+ .slice(0, -1)
5677
+ .join('-');
5071
5678
  });
5072
5679
  };
5073
5680
  ClassAttributor.prototype.add = function (node, value) {
@@ -5116,9 +5723,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
5116
5723
  var attributor_1 = __webpack_require__(12);
5117
5724
  function camelize(name) {
5118
5725
  var parts = name.split('-');
5119
- var rest = parts.slice(1).map(function (part) {
5726
+ var rest = parts
5727
+ .slice(1)
5728
+ .map(function (part) {
5120
5729
  return part[0].toUpperCase() + part.slice(1);
5121
- }).join('');
5730
+ })
5731
+ .join('');
5122
5732
  return parts[0] + rest;
5123
5733
  }
5124
5734
  var StyleAttributor = /** @class */ (function (_super) {
@@ -5135,16 +5745,19 @@ var StyleAttributor = /** @class */ (function (_super) {
5135
5745
  StyleAttributor.prototype.add = function (node, value) {
5136
5746
  if (!this.canAdd(node, value))
5137
5747
  return false;
5748
+ // @ts-ignore
5138
5749
  node.style[camelize(this.keyName)] = value;
5139
5750
  return true;
5140
5751
  };
5141
5752
  StyleAttributor.prototype.remove = function (node) {
5753
+ // @ts-ignore
5142
5754
  node.style[camelize(this.keyName)] = '';
5143
5755
  if (!node.getAttribute('style')) {
5144
5756
  node.removeAttribute('style');
5145
5757
  }
5146
5758
  };
5147
5759
  StyleAttributor.prototype.value = function (node) {
5760
+ // @ts-ignore
5148
5761
  var value = node.style[camelize(this.keyName)];
5149
5762
  return this.canAdd(node, value) ? value : '';
5150
5763
  };
@@ -5166,656 +5779,169 @@ Object.defineProperty(exports, "__esModule", {
5166
5779
 
5167
5780
  var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
5168
5781
 
5169
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
5170
-
5171
- var Theme = function () {
5172
- function Theme(quill, options) {
5173
- _classCallCheck(this, Theme);
5174
-
5175
- this.quill = quill;
5176
- this.options = options;
5177
- this.modules = {};
5178
- }
5179
-
5180
- _createClass(Theme, [{
5181
- key: 'init',
5182
- value: function init() {
5183
- var _this = this;
5184
-
5185
- Object.keys(this.options.modules).forEach(function (name) {
5186
- if (_this.modules[name] == null) {
5187
- _this.addModule(name);
5188
- }
5189
- });
5190
- }
5191
- }, {
5192
- key: 'addModule',
5193
- value: function addModule(name) {
5194
- var moduleClass = this.quill.constructor.import('modules/' + name);
5195
- this.modules[name] = new moduleClass(this.quill, this.options.modules[name] || {});
5196
- return this.modules[name];
5197
- }
5198
- }]);
5199
-
5200
- return Theme;
5201
- }();
5202
-
5203
- Theme.DEFAULTS = {
5204
- modules: {}
5205
- };
5206
- Theme.themes = {
5207
- 'default': Theme
5208
- };
5209
-
5210
- exports.default = Theme;
5211
-
5212
- /***/ }),
5213
- /* 35 */
5214
- /***/ (function(module, exports, __webpack_require__) {
5215
-
5216
- "use strict";
5217
-
5218
-
5219
- Object.defineProperty(exports, "__esModule", {
5220
- value: true
5221
- });
5222
- exports.SHORTKEY = exports.default = undefined;
5223
-
5224
- var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
5225
-
5226
- var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
5227
-
5228
- var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
5229
-
5230
- var _clone = __webpack_require__(21);
5231
-
5232
- var _clone2 = _interopRequireDefault(_clone);
5233
-
5234
- var _deepEqual = __webpack_require__(11);
5235
-
5236
- var _deepEqual2 = _interopRequireDefault(_deepEqual);
5237
-
5238
- var _extend = __webpack_require__(3);
5239
-
5240
- var _extend2 = _interopRequireDefault(_extend);
5241
-
5242
- var _quillDelta = __webpack_require__(2);
5243
-
5244
- var _quillDelta2 = _interopRequireDefault(_quillDelta);
5245
-
5246
- var _op = __webpack_require__(20);
5247
-
5248
- var _op2 = _interopRequireDefault(_op);
5249
-
5250
- var _parchment = __webpack_require__(0);
5251
-
5252
- var _parchment2 = _interopRequireDefault(_parchment);
5253
-
5254
- var _embed = __webpack_require__(25);
5255
-
5256
- var _embed2 = _interopRequireDefault(_embed);
5257
-
5258
- var _quill = __webpack_require__(5);
5259
-
5260
- var _quill2 = _interopRequireDefault(_quill);
5261
-
5262
- var _logger = __webpack_require__(10);
5263
-
5264
- var _logger2 = _interopRequireDefault(_logger);
5265
-
5266
- var _module = __webpack_require__(9);
5267
-
5268
- var _module2 = _interopRequireDefault(_module);
5269
-
5270
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
5271
-
5272
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5273
-
5274
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
5275
-
5276
- function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
5277
-
5278
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
5279
-
5280
- var debug = (0, _logger2.default)('quill:keyboard');
5281
-
5282
- var SHORTKEY = /Mac/i.test(navigator.platform) ? 'metaKey' : 'ctrlKey';
5283
-
5284
- var Keyboard = function (_Module) {
5285
- _inherits(Keyboard, _Module);
5286
-
5287
- _createClass(Keyboard, null, [{
5288
- key: 'match',
5289
- value: function match(evt, binding) {
5290
- binding = normalize(binding);
5291
- if (['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].some(function (key) {
5292
- return !!binding[key] !== evt[key] && binding[key] !== null;
5293
- })) {
5294
- return false;
5295
- }
5296
- return binding.key === (evt.which || evt.keyCode);
5297
- }
5298
- }]);
5299
-
5300
- function Keyboard(quill, options) {
5301
- _classCallCheck(this, Keyboard);
5302
-
5303
- var _this = _possibleConstructorReturn(this, (Keyboard.__proto__ || Object.getPrototypeOf(Keyboard)).call(this, quill, options));
5304
-
5305
- _this.bindings = {};
5306
- Object.keys(_this.options.bindings).forEach(function (name) {
5307
- if (name === 'list autofill' && quill.scroll.whitelist != null && !quill.scroll.whitelist['list']) {
5308
- return;
5309
- }
5310
- if (_this.options.bindings[name]) {
5311
- _this.addBinding(_this.options.bindings[name]);
5312
- }
5313
- });
5314
- _this.addBinding({ key: Keyboard.keys.ENTER, shiftKey: null }, handleEnter);
5315
- _this.addBinding({ key: Keyboard.keys.ENTER, metaKey: null, ctrlKey: null, altKey: null }, function () {});
5316
- if (/Firefox/i.test(navigator.userAgent)) {
5317
- // Need to handle delete and backspace for Firefox in the general case #1171
5318
- _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true }, handleBackspace);
5319
- _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true }, handleDelete);
5320
- } else {
5321
- _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true, prefix: /^.?$/ }, handleBackspace);
5322
- _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true, suffix: /^.?$/ }, handleDelete);
5323
- }
5324
- _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: false }, handleDeleteRange);
5325
- _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: false }, handleDeleteRange);
5326
- _this.addBinding({ key: Keyboard.keys.BACKSPACE, altKey: null, ctrlKey: null, metaKey: null, shiftKey: null }, { collapsed: true, offset: 0 }, handleBackspace);
5327
- _this.listen();
5328
- return _this;
5329
- }
5330
-
5331
- _createClass(Keyboard, [{
5332
- key: 'addBinding',
5333
- value: function addBinding(key) {
5334
- var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
5335
- var handler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
5336
-
5337
- var binding = normalize(key);
5338
- if (binding == null || binding.key == null) {
5339
- return debug.warn('Attempted to add invalid keyboard binding', binding);
5340
- }
5341
- if (typeof context === 'function') {
5342
- context = { handler: context };
5343
- }
5344
- if (typeof handler === 'function') {
5345
- handler = { handler: handler };
5346
- }
5347
- binding = (0, _extend2.default)(binding, context, handler);
5348
- this.bindings[binding.key] = this.bindings[binding.key] || [];
5349
- this.bindings[binding.key].push(binding);
5350
- }
5351
- }, {
5352
- key: 'listen',
5353
- value: function listen() {
5354
- var _this2 = this;
5355
-
5356
- this.quill.root.addEventListener('keydown', function (evt) {
5357
- if (evt.defaultPrevented) return;
5358
- var which = evt.which || evt.keyCode;
5359
- var bindings = (_this2.bindings[which] || []).filter(function (binding) {
5360
- return Keyboard.match(evt, binding);
5361
- });
5362
- if (bindings.length === 0) return;
5363
- var range = _this2.quill.getSelection();
5364
- if (range == null || !_this2.quill.hasFocus()) return;
5365
-
5366
- var _quill$getLine = _this2.quill.getLine(range.index),
5367
- _quill$getLine2 = _slicedToArray(_quill$getLine, 2),
5368
- line = _quill$getLine2[0],
5369
- offset = _quill$getLine2[1];
5370
-
5371
- var _quill$getLeaf = _this2.quill.getLeaf(range.index),
5372
- _quill$getLeaf2 = _slicedToArray(_quill$getLeaf, 2),
5373
- leafStart = _quill$getLeaf2[0],
5374
- offsetStart = _quill$getLeaf2[1];
5375
-
5376
- var _ref = range.length === 0 ? [leafStart, offsetStart] : _this2.quill.getLeaf(range.index + range.length),
5377
- _ref2 = _slicedToArray(_ref, 2),
5378
- leafEnd = _ref2[0],
5379
- offsetEnd = _ref2[1];
5380
-
5381
- var prefixText = leafStart instanceof _parchment2.default.Text ? leafStart.value().slice(0, offsetStart) : '';
5382
- var suffixText = leafEnd instanceof _parchment2.default.Text ? leafEnd.value().slice(offsetEnd) : '';
5383
- var curContext = {
5384
- collapsed: range.length === 0,
5385
- empty: range.length === 0 && line.length() <= 1,
5386
- format: _this2.quill.getFormat(range),
5387
- offset: offset,
5388
- prefix: prefixText,
5389
- suffix: suffixText
5390
- };
5391
- var prevented = bindings.some(function (binding) {
5392
- if (binding.collapsed != null && binding.collapsed !== curContext.collapsed) return false;
5393
- if (binding.empty != null && binding.empty !== curContext.empty) return false;
5394
- if (binding.offset != null && binding.offset !== curContext.offset) return false;
5395
- if (Array.isArray(binding.format)) {
5396
- // any format is present
5397
- if (binding.format.every(function (name) {
5398
- return curContext.format[name] == null;
5399
- })) {
5400
- return false;
5401
- }
5402
- } else if (_typeof(binding.format) === 'object') {
5403
- // all formats must match
5404
- if (!Object.keys(binding.format).every(function (name) {
5405
- if (binding.format[name] === true) return curContext.format[name] != null;
5406
- if (binding.format[name] === false) return curContext.format[name] == null;
5407
- return (0, _deepEqual2.default)(binding.format[name], curContext.format[name]);
5408
- })) {
5409
- return false;
5410
- }
5411
- }
5412
- if (binding.prefix != null && !binding.prefix.test(curContext.prefix)) return false;
5413
- if (binding.suffix != null && !binding.suffix.test(curContext.suffix)) return false;
5414
- return binding.handler.call(_this2, range, curContext) !== true;
5415
- });
5416
- if (prevented) {
5417
- evt.preventDefault();
5782
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
5783
+
5784
+ var Theme = function () {
5785
+ function Theme(quill, options) {
5786
+ _classCallCheck(this, Theme);
5787
+
5788
+ this.quill = quill;
5789
+ this.options = options;
5790
+ this.modules = {};
5791
+ }
5792
+
5793
+ _createClass(Theme, [{
5794
+ key: 'init',
5795
+ value: function init() {
5796
+ var _this = this;
5797
+
5798
+ Object.keys(this.options.modules).forEach(function (name) {
5799
+ if (_this.modules[name] == null) {
5800
+ _this.addModule(name);
5418
5801
  }
5419
5802
  });
5420
5803
  }
5804
+ }, {
5805
+ key: 'addModule',
5806
+ value: function addModule(name) {
5807
+ var moduleClass = this.quill.constructor.import('modules/' + name);
5808
+ this.modules[name] = new moduleClass(this.quill, this.options.modules[name] || {});
5809
+ return this.modules[name];
5810
+ }
5421
5811
  }]);
5422
5812
 
5423
- return Keyboard;
5424
- }(_module2.default);
5813
+ return Theme;
5814
+ }();
5425
5815
 
5426
- Keyboard.keys = {
5427
- BACKSPACE: 8,
5428
- TAB: 9,
5429
- ENTER: 13,
5430
- ESCAPE: 27,
5431
- LEFT: 37,
5432
- UP: 38,
5433
- RIGHT: 39,
5434
- DOWN: 40,
5435
- DELETE: 46
5816
+ Theme.DEFAULTS = {
5817
+ modules: {}
5818
+ };
5819
+ Theme.themes = {
5820
+ 'default': Theme
5436
5821
  };
5437
5822
 
5438
- Keyboard.DEFAULTS = {
5439
- bindings: {
5440
- 'bold': makeFormatHandler('bold'),
5441
- 'italic': makeFormatHandler('italic'),
5442
- 'underline': makeFormatHandler('underline'),
5443
- 'indent': {
5444
- // highlight tab or tab at beginning of list, indent or blockquote
5445
- key: Keyboard.keys.TAB,
5446
- format: ['blockquote', 'indent', 'list'],
5447
- handler: function handler(range, context) {
5448
- if (context.collapsed && context.offset !== 0) return true;
5449
- this.quill.format('indent', '+1', _quill2.default.sources.USER);
5450
- }
5451
- },
5452
- 'outdent': {
5453
- key: Keyboard.keys.TAB,
5454
- shiftKey: true,
5455
- format: ['blockquote', 'indent', 'list'],
5456
- // highlight tab or tab at beginning of list, indent or blockquote
5457
- handler: function handler(range, context) {
5458
- if (context.collapsed && context.offset !== 0) return true;
5459
- this.quill.format('indent', '-1', _quill2.default.sources.USER);
5460
- }
5461
- },
5462
- 'outdent backspace': {
5463
- key: Keyboard.keys.BACKSPACE,
5464
- collapsed: true,
5465
- shiftKey: null,
5466
- metaKey: null,
5467
- ctrlKey: null,
5468
- altKey: null,
5469
- format: ['indent', 'list'],
5470
- offset: 0,
5471
- handler: function handler(range, context) {
5472
- if (context.format.indent != null) {
5473
- this.quill.format('indent', '-1', _quill2.default.sources.USER);
5474
- } else if (context.format.list != null) {
5475
- this.quill.format('list', false, _quill2.default.sources.USER);
5476
- }
5477
- }
5478
- },
5479
- 'indent code-block': makeCodeBlockHandler(true),
5480
- 'outdent code-block': makeCodeBlockHandler(false),
5481
- 'remove tab': {
5482
- key: Keyboard.keys.TAB,
5483
- shiftKey: true,
5484
- collapsed: true,
5485
- prefix: /\t$/,
5486
- handler: function handler(range) {
5487
- this.quill.deleteText(range.index - 1, 1, _quill2.default.sources.USER);
5488
- }
5489
- },
5490
- 'tab': {
5491
- key: Keyboard.keys.TAB,
5492
- handler: function handler(range) {
5493
- this.quill.history.cutoff();
5494
- var delta = new _quillDelta2.default().retain(range.index).delete(range.length).insert('\t');
5495
- this.quill.updateContents(delta, _quill2.default.sources.USER);
5496
- this.quill.history.cutoff();
5497
- this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);
5498
- }
5499
- },
5500
- 'list empty enter': {
5501
- key: Keyboard.keys.ENTER,
5502
- collapsed: true,
5503
- format: ['list'],
5504
- empty: true,
5505
- handler: function handler(range, context) {
5506
- this.quill.format('list', false, _quill2.default.sources.USER);
5507
- if (context.format.indent) {
5508
- this.quill.format('indent', false, _quill2.default.sources.USER);
5509
- }
5510
- }
5511
- },
5512
- 'checklist enter': {
5513
- key: Keyboard.keys.ENTER,
5514
- collapsed: true,
5515
- format: { list: 'checked' },
5516
- handler: function handler(range) {
5517
- var _quill$getLine3 = this.quill.getLine(range.index),
5518
- _quill$getLine4 = _slicedToArray(_quill$getLine3, 2),
5519
- line = _quill$getLine4[0],
5520
- offset = _quill$getLine4[1];
5521
-
5522
- var delta = new _quillDelta2.default().retain(range.index).insert('\n', { list: 'checked' }).retain(line.length() - offset - 1).retain(1, { list: 'unchecked' });
5523
- this.quill.updateContents(delta, _quill2.default.sources.USER);
5524
- this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);
5525
- this.quill.scrollIntoView();
5526
- }
5527
- },
5528
- 'header enter': {
5529
- key: Keyboard.keys.ENTER,
5530
- collapsed: true,
5531
- format: ['header'],
5532
- suffix: /^$/,
5533
- handler: function handler(range, context) {
5534
- var _quill$getLine5 = this.quill.getLine(range.index),
5535
- _quill$getLine6 = _slicedToArray(_quill$getLine5, 2),
5536
- line = _quill$getLine6[0],
5537
- offset = _quill$getLine6[1];
5538
-
5539
- var delta = new _quillDelta2.default().retain(range.index).insert('\n', context.format).retain(line.length() - offset - 1).retain(1, { header: null });
5540
- this.quill.updateContents(delta, _quill2.default.sources.USER);
5541
- this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);
5542
- this.quill.scrollIntoView();
5543
- }
5544
- },
5545
- 'list autofill': {
5546
- key: ' ',
5547
- collapsed: true,
5548
- format: { list: false },
5549
- prefix: /^\s*?(1\.|-|\[ ?\]|\[x\])$/,
5550
- handler: function handler(range, context) {
5551
- var length = context.prefix.length;
5552
-
5553
- var _quill$getLine7 = this.quill.getLine(range.index),
5554
- _quill$getLine8 = _slicedToArray(_quill$getLine7, 2),
5555
- line = _quill$getLine8[0],
5556
- offset = _quill$getLine8[1];
5823
+ exports.default = Theme;
5557
5824
 
5558
- if (offset > length) return true;
5559
- var value = void 0;
5560
- switch (context.prefix.trim()) {
5561
- case '[]':case '[ ]':
5562
- value = 'unchecked';
5563
- break;
5564
- case '[x]':
5565
- value = 'checked';
5566
- break;
5567
- case '-':
5568
- value = 'bullet';
5569
- break;
5570
- default:
5571
- value = 'ordered';
5572
- }
5573
- this.quill.insertText(range.index, ' ', _quill2.default.sources.USER);
5574
- this.quill.history.cutoff();
5575
- var delta = new _quillDelta2.default().retain(range.index - offset).delete(length + 1).retain(line.length() - 2 - offset).retain(1, { list: value });
5576
- this.quill.updateContents(delta, _quill2.default.sources.USER);
5577
- this.quill.history.cutoff();
5578
- this.quill.setSelection(range.index - length, _quill2.default.sources.SILENT);
5579
- }
5580
- },
5581
- 'code exit': {
5582
- key: Keyboard.keys.ENTER,
5583
- collapsed: true,
5584
- format: ['code-block'],
5585
- prefix: /\n\n$/,
5586
- suffix: /^\s+$/,
5587
- handler: function handler(range) {
5588
- var _quill$getLine9 = this.quill.getLine(range.index),
5589
- _quill$getLine10 = _slicedToArray(_quill$getLine9, 2),
5590
- line = _quill$getLine10[0],
5591
- offset = _quill$getLine10[1];
5825
+ /***/ }),
5826
+ /* 35 */
5827
+ /***/ (function(module, exports, __webpack_require__) {
5592
5828
 
5593
- var delta = new _quillDelta2.default().retain(range.index + line.length() - offset - 2).retain(1, { 'code-block': null }).delete(1);
5594
- this.quill.updateContents(delta, _quill2.default.sources.USER);
5595
- }
5596
- },
5597
- 'embed left': makeEmbedArrowHandler(Keyboard.keys.LEFT, false),
5598
- 'embed left shift': makeEmbedArrowHandler(Keyboard.keys.LEFT, true),
5599
- 'embed right': makeEmbedArrowHandler(Keyboard.keys.RIGHT, false),
5600
- 'embed right shift': makeEmbedArrowHandler(Keyboard.keys.RIGHT, true)
5601
- }
5602
- };
5829
+ "use strict";
5603
5830
 
5604
- function makeEmbedArrowHandler(key, shiftKey) {
5605
- var _ref3;
5606
5831
 
5607
- var where = key === Keyboard.keys.LEFT ? 'prefix' : 'suffix';
5608
- return _ref3 = {
5609
- key: key,
5610
- shiftKey: shiftKey
5611
- }, _defineProperty(_ref3, where, /^$/), _defineProperty(_ref3, 'handler', function handler(range) {
5612
- var index = range.index;
5613
- if (key === Keyboard.keys.RIGHT) {
5614
- index += range.length + 1;
5615
- }
5832
+ Object.defineProperty(exports, "__esModule", {
5833
+ value: true
5834
+ });
5616
5835
 
5617
- var _quill$getLeaf3 = this.quill.getLeaf(index),
5618
- _quill$getLeaf4 = _slicedToArray(_quill$getLeaf3, 1),
5619
- leaf = _quill$getLeaf4[0];
5836
+ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
5620
5837
 
5621
- if (!(leaf instanceof _embed2.default)) return true;
5622
- if (key === Keyboard.keys.LEFT) {
5623
- if (shiftKey) {
5624
- this.quill.setSelection(range.index - 1, range.length + 1, _quill2.default.sources.USER);
5625
- } else {
5626
- this.quill.setSelection(range.index - 1, _quill2.default.sources.USER);
5627
- }
5628
- } else {
5629
- if (shiftKey) {
5630
- this.quill.setSelection(range.index, range.length + 1, _quill2.default.sources.USER);
5631
- } else {
5632
- this.quill.setSelection(range.index + range.length + 1, _quill2.default.sources.USER);
5633
- }
5634
- }
5635
- return false;
5636
- }), _ref3;
5637
- }
5838
+ var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
5638
5839
 
5639
- function handleBackspace(range, context) {
5640
- if (range.index === 0 || this.quill.getLength() <= 1) return;
5840
+ var _parchment = __webpack_require__(0);
5641
5841
 
5642
- var _quill$getLine11 = this.quill.getLine(range.index),
5643
- _quill$getLine12 = _slicedToArray(_quill$getLine11, 1),
5644
- line = _quill$getLine12[0];
5842
+ var _parchment2 = _interopRequireDefault(_parchment);
5645
5843
 
5646
- var formats = {};
5647
- if (context.offset === 0) {
5648
- var _quill$getLine13 = this.quill.getLine(range.index - 1),
5649
- _quill$getLine14 = _slicedToArray(_quill$getLine13, 1),
5650
- prev = _quill$getLine14[0];
5844
+ var _text = __webpack_require__(7);
5651
5845
 
5652
- if (prev != null && prev.length() > 1) {
5653
- var curFormats = line.formats();
5654
- var prevFormats = this.quill.getFormat(range.index - 1, 1);
5655
- formats = _op2.default.attributes.diff(curFormats, prevFormats) || {};
5656
- }
5657
- }
5658
- // Check for astral symbols
5659
- var length = /[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(context.prefix) ? 2 : 1;
5660
- this.quill.deleteText(range.index - length, length, _quill2.default.sources.USER);
5661
- if (Object.keys(formats).length > 0) {
5662
- this.quill.formatLine(range.index - length, length, formats, _quill2.default.sources.USER);
5663
- }
5664
- this.quill.focus();
5665
- }
5846
+ var _text2 = _interopRequireDefault(_text);
5666
5847
 
5667
- function handleDelete(range, context) {
5668
- // Check for astral symbols
5669
- var length = /^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(context.suffix) ? 2 : 1;
5670
- if (range.index >= this.quill.getLength() - length) return;
5671
- var formats = {},
5672
- nextLength = 0;
5848
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
5673
5849
 
5674
- var _quill$getLine15 = this.quill.getLine(range.index),
5675
- _quill$getLine16 = _slicedToArray(_quill$getLine15, 1),
5676
- line = _quill$getLine16[0];
5850
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
5677
5851
 
5678
- if (context.offset >= line.length() - 1) {
5679
- var _quill$getLine17 = this.quill.getLine(range.index + 1),
5680
- _quill$getLine18 = _slicedToArray(_quill$getLine17, 1),
5681
- next = _quill$getLine18[0];
5852
+ function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
5682
5853
 
5683
- if (next) {
5684
- var curFormats = line.formats();
5685
- var nextFormats = this.quill.getFormat(range.index, 1);
5686
- formats = _op2.default.attributes.diff(curFormats, nextFormats) || {};
5687
- nextLength = next.length();
5688
- }
5689
- }
5690
- this.quill.deleteText(range.index, length, _quill2.default.sources.USER);
5691
- if (Object.keys(formats).length > 0) {
5692
- this.quill.formatLine(range.index + nextLength - 1, length, formats, _quill2.default.sources.USER);
5693
- }
5694
- }
5854
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
5695
5855
 
5696
- function handleDeleteRange(range) {
5697
- var lines = this.quill.getLines(range);
5698
- var formats = {};
5699
- if (lines.length > 1) {
5700
- var firstFormats = lines[0].formats();
5701
- var lastFormats = lines[lines.length - 1].formats();
5702
- formats = _op2.default.attributes.diff(lastFormats, firstFormats) || {};
5703
- }
5704
- this.quill.deleteText(range, _quill2.default.sources.USER);
5705
- if (Object.keys(formats).length > 0) {
5706
- this.quill.formatLine(range.index, 1, formats, _quill2.default.sources.USER);
5707
- }
5708
- this.quill.setSelection(range.index, _quill2.default.sources.SILENT);
5709
- this.quill.focus();
5710
- }
5856
+ var GUARD_TEXT = '\uFEFF';
5711
5857
 
5712
- function handleEnter(range, context) {
5713
- var _this3 = this;
5858
+ var Embed = function (_Parchment$Embed) {
5859
+ _inherits(Embed, _Parchment$Embed);
5714
5860
 
5715
- if (range.length > 0) {
5716
- this.quill.scroll.deleteAt(range.index, range.length); // So we do not trigger text-change
5717
- }
5718
- var lineFormats = Object.keys(context.format).reduce(function (lineFormats, format) {
5719
- if (_parchment2.default.query(format, _parchment2.default.Scope.BLOCK) && !Array.isArray(context.format[format])) {
5720
- lineFormats[format] = context.format[format];
5721
- }
5722
- return lineFormats;
5723
- }, {});
5724
- this.quill.insertText(range.index, '\n', lineFormats, _quill2.default.sources.USER);
5725
- // Earlier scroll.deleteAt might have messed up our selection,
5726
- // so insertText's built in selection preservation is not reliable
5727
- this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);
5728
- this.quill.focus();
5729
- Object.keys(context.format).forEach(function (name) {
5730
- if (lineFormats[name] != null) return;
5731
- if (Array.isArray(context.format[name])) return;
5732
- if (name === 'link') return;
5733
- _this3.quill.format(name, context.format[name], _quill2.default.sources.USER);
5734
- });
5735
- }
5861
+ function Embed(node) {
5862
+ _classCallCheck(this, Embed);
5736
5863
 
5737
- function makeCodeBlockHandler(indent) {
5738
- return {
5739
- key: Keyboard.keys.TAB,
5740
- shiftKey: !indent,
5741
- format: { 'code-block': true },
5742
- handler: function handler(range) {
5743
- var CodeBlock = _parchment2.default.query('code-block');
5744
- var index = range.index,
5745
- length = range.length;
5864
+ var _this = _possibleConstructorReturn(this, (Embed.__proto__ || Object.getPrototypeOf(Embed)).call(this, node));
5746
5865
 
5747
- var _quill$scroll$descend = this.quill.scroll.descendant(CodeBlock, index),
5748
- _quill$scroll$descend2 = _slicedToArray(_quill$scroll$descend, 2),
5749
- block = _quill$scroll$descend2[0],
5750
- offset = _quill$scroll$descend2[1];
5866
+ _this.contentNode = document.createElement('span');
5867
+ _this.contentNode.setAttribute('contenteditable', false);
5868
+ [].slice.call(_this.domNode.childNodes).forEach(function (childNode) {
5869
+ _this.contentNode.appendChild(childNode);
5870
+ });
5871
+ _this.leftGuard = document.createTextNode(GUARD_TEXT);
5872
+ _this.rightGuard = document.createTextNode(GUARD_TEXT);
5873
+ _this.domNode.appendChild(_this.leftGuard);
5874
+ _this.domNode.appendChild(_this.contentNode);
5875
+ _this.domNode.appendChild(_this.rightGuard);
5876
+ return _this;
5877
+ }
5751
5878
 
5752
- if (block == null) return;
5753
- var scrollIndex = this.quill.getIndex(block);
5754
- var start = block.newlineIndex(offset, true) + 1;
5755
- var end = block.newlineIndex(scrollIndex + offset + length);
5756
- var lines = block.domNode.textContent.slice(start, end).split('\n');
5757
- offset = 0;
5758
- lines.forEach(function (line, i) {
5759
- if (indent) {
5760
- block.insertAt(start + offset, CodeBlock.TAB);
5761
- offset += CodeBlock.TAB.length;
5762
- if (i === 0) {
5763
- index += CodeBlock.TAB.length;
5764
- } else {
5765
- length += CodeBlock.TAB.length;
5766
- }
5767
- } else if (line.startsWith(CodeBlock.TAB)) {
5768
- block.deleteAt(start + offset, CodeBlock.TAB.length);
5769
- offset -= CodeBlock.TAB.length;
5770
- if (i === 0) {
5771
- index -= CodeBlock.TAB.length;
5772
- } else {
5773
- length -= CodeBlock.TAB.length;
5774
- }
5879
+ _createClass(Embed, [{
5880
+ key: 'index',
5881
+ value: function index(node, offset) {
5882
+ if (node === this.leftGuard) return 0;
5883
+ if (node === this.rightGuard) return 1;
5884
+ return _get(Embed.prototype.__proto__ || Object.getPrototypeOf(Embed.prototype), 'index', this).call(this, node, offset);
5885
+ }
5886
+ }, {
5887
+ key: 'restore',
5888
+ value: function restore(node) {
5889
+ var range = void 0,
5890
+ textNode = void 0;
5891
+ var text = node.data.split(GUARD_TEXT).join('');
5892
+ if (node === this.leftGuard) {
5893
+ if (this.prev instanceof _text2.default) {
5894
+ var prevLength = this.prev.length();
5895
+ this.prev.insertAt(prevLength, text);
5896
+ range = {
5897
+ startNode: this.prev.domNode,
5898
+ startOffset: prevLength + text.length
5899
+ };
5900
+ } else {
5901
+ textNode = document.createTextNode(text);
5902
+ this.parent.insertBefore(_parchment2.default.create(textNode), this);
5903
+ range = {
5904
+ startNode: textNode,
5905
+ startOffset: text.length
5906
+ };
5775
5907
  }
5776
- offset += line.length + 1;
5777
- });
5778
- this.quill.update(_quill2.default.sources.USER);
5779
- this.quill.setSelection(index, length, _quill2.default.sources.SILENT);
5908
+ } else if (node === this.rightGuard) {
5909
+ if (this.next instanceof _text2.default) {
5910
+ this.next.insertAt(0, text);
5911
+ range = {
5912
+ startNode: this.next.domNode,
5913
+ startOffset: text.length
5914
+ };
5915
+ } else {
5916
+ textNode = document.createTextNode(text);
5917
+ this.parent.insertBefore(_parchment2.default.create(textNode), this.next);
5918
+ range = {
5919
+ startNode: textNode,
5920
+ startOffset: text.length
5921
+ };
5922
+ }
5923
+ }
5924
+ node.data = GUARD_TEXT;
5925
+ return range;
5780
5926
  }
5781
- };
5782
- }
5927
+ }, {
5928
+ key: 'update',
5929
+ value: function update(mutations, context) {
5930
+ var _this2 = this;
5783
5931
 
5784
- function makeFormatHandler(format) {
5785
- return {
5786
- key: format[0].toUpperCase(),
5787
- shortKey: true,
5788
- handler: function handler(range, context) {
5789
- this.quill.format(format, !context.format[format], _quill2.default.sources.USER);
5932
+ mutations.forEach(function (mutation) {
5933
+ if (mutation.type === 'characterData' && (mutation.target === _this2.leftGuard || mutation.target === _this2.rightGuard)) {
5934
+ var range = _this2.restore(mutation.target);
5935
+ if (range) context.range = range;
5936
+ }
5937
+ });
5790
5938
  }
5791
- };
5792
- }
5939
+ }]);
5793
5940
 
5794
- function normalize(binding) {
5795
- if (typeof binding === 'string' || typeof binding === 'number') {
5796
- return normalize({ key: binding });
5797
- }
5798
- if ((typeof binding === 'undefined' ? 'undefined' : _typeof(binding)) === 'object') {
5799
- binding = (0, _clone2.default)(binding, false);
5800
- }
5801
- if (typeof binding.key === 'string') {
5802
- if (Keyboard.keys[binding.key.toUpperCase()] != null) {
5803
- binding.key = Keyboard.keys[binding.key.toUpperCase()];
5804
- } else if (binding.key.length === 1) {
5805
- binding.key = binding.key.toUpperCase().charCodeAt(0);
5806
- } else {
5807
- return null;
5808
- }
5809
- }
5810
- if (binding.shortKey) {
5811
- binding[SHORTKEY] = binding.shortKey;
5812
- delete binding.shortKey;
5813
- }
5814
- return binding;
5815
- }
5941
+ return Embed;
5942
+ }(_parchment2.default.Embed);
5816
5943
 
5817
- exports.default = Keyboard;
5818
- exports.SHORTKEY = SHORTKEY;
5944
+ exports.default = Embed;
5819
5945
 
5820
5946
  /***/ }),
5821
5947
  /* 36 */
@@ -6065,13 +6191,13 @@ var History = function (_Module) {
6065
6191
  value: function change(source, dest) {
6066
6192
  if (this.stack[source].length === 0) return;
6067
6193
  var delta = this.stack[source].pop();
6194
+ this.stack[dest].push(delta);
6068
6195
  this.lastRecorded = 0;
6069
6196
  this.ignoreChange = true;
6070
6197
  this.quill.updateContents(delta[source], _quill2.default.sources.USER);
6071
6198
  this.ignoreChange = false;
6072
6199
  var index = getLastChangeIndex(delta[source]);
6073
6200
  this.quill.setSelection(index);
6074
- this.stack[dest].push(delta);
6075
6201
  }
6076
6202
  }, {
6077
6203
  key: 'clear',
@@ -6177,7 +6303,7 @@ exports.getLastChangeIndex = getLastChangeIndex;
6177
6303
  Object.defineProperty(exports, "__esModule", { value: true });
6178
6304
  var LinkedList = /** @class */ (function () {
6179
6305
  function LinkedList() {
6180
- this.head = this.tail = undefined;
6306
+ this.head = this.tail = null;
6181
6307
  this.length = 0;
6182
6308
  }
6183
6309
  LinkedList.prototype.append = function () {
@@ -6185,20 +6311,22 @@ var LinkedList = /** @class */ (function () {
6185
6311
  for (var _i = 0; _i < arguments.length; _i++) {
6186
6312
  nodes[_i] = arguments[_i];
6187
6313
  }
6188
- this.insertBefore(nodes[0], undefined);
6314
+ this.insertBefore(nodes[0], null);
6189
6315
  if (nodes.length > 1) {
6190
6316
  this.append.apply(this, nodes.slice(1));
6191
6317
  }
6192
6318
  };
6193
6319
  LinkedList.prototype.contains = function (node) {
6194
6320
  var cur, next = this.iterator();
6195
- while (cur = next()) {
6321
+ while ((cur = next())) {
6196
6322
  if (cur === node)
6197
6323
  return true;
6198
6324
  }
6199
6325
  return false;
6200
6326
  };
6201
6327
  LinkedList.prototype.insertBefore = function (node, refNode) {
6328
+ if (!node)
6329
+ return;
6202
6330
  node.next = refNode;
6203
6331
  if (refNode != null) {
6204
6332
  node.prev = refNode.prev;
@@ -6216,7 +6344,7 @@ var LinkedList = /** @class */ (function () {
6216
6344
  this.tail = node;
6217
6345
  }
6218
6346
  else {
6219
- node.prev = undefined;
6347
+ node.prev = null;
6220
6348
  this.head = this.tail = node;
6221
6349
  }
6222
6350
  this.length += 1;
@@ -6257,9 +6385,10 @@ var LinkedList = /** @class */ (function () {
6257
6385
  LinkedList.prototype.find = function (index, inclusive) {
6258
6386
  if (inclusive === void 0) { inclusive = false; }
6259
6387
  var cur, next = this.iterator();
6260
- while (cur = next()) {
6388
+ while ((cur = next())) {
6261
6389
  var length = cur.length();
6262
- if (index < length || (inclusive && index === length && (cur.next == null || cur.next.length() !== 0))) {
6390
+ if (index < length ||
6391
+ (inclusive && index === length && (cur.next == null || cur.next.length() !== 0))) {
6263
6392
  return [cur, index];
6264
6393
  }
6265
6394
  index -= length;
@@ -6268,7 +6397,7 @@ var LinkedList = /** @class */ (function () {
6268
6397
  };
6269
6398
  LinkedList.prototype.forEach = function (callback) {
6270
6399
  var cur, next = this.iterator();
6271
- while (cur = next()) {
6400
+ while ((cur = next())) {
6272
6401
  callback(cur);
6273
6402
  }
6274
6403
  };
@@ -6296,7 +6425,7 @@ var LinkedList = /** @class */ (function () {
6296
6425
  };
6297
6426
  LinkedList.prototype.reduce = function (callback, memo) {
6298
6427
  var cur, next = this.iterator();
6299
- while (cur = next()) {
6428
+ while ((cur = next())) {
6300
6429
  memo = callback(memo, cur);
6301
6430
  }
6302
6431
  return memo;
@@ -6330,18 +6459,19 @@ var OBSERVER_CONFIG = {
6330
6459
  characterData: true,
6331
6460
  characterDataOldValue: true,
6332
6461
  childList: true,
6333
- subtree: true
6462
+ subtree: true,
6334
6463
  };
6335
6464
  var MAX_OPTIMIZE_ITERATIONS = 100;
6336
6465
  var ScrollBlot = /** @class */ (function (_super) {
6337
6466
  __extends(ScrollBlot, _super);
6338
6467
  function ScrollBlot(node) {
6339
6468
  var _this = _super.call(this, node) || this;
6340
- _this.parent = null;
6469
+ _this.scroll = _this;
6341
6470
  _this.observer = new MutationObserver(function (mutations) {
6342
6471
  _this.update(mutations);
6343
6472
  });
6344
6473
  _this.observer.observe(_this.domNode, OBSERVER_CONFIG);
6474
+ _this.attach();
6345
6475
  return _this;
6346
6476
  }
6347
6477
  ScrollBlot.prototype.detach = function () {
@@ -6385,14 +6515,21 @@ var ScrollBlot = /** @class */ (function (_super) {
6385
6515
  return;
6386
6516
  if (blot.domNode.parentNode == null)
6387
6517
  return;
6518
+ // @ts-ignore
6388
6519
  if (blot.domNode[Registry.DATA_KEY].mutations == null) {
6520
+ // @ts-ignore
6389
6521
  blot.domNode[Registry.DATA_KEY].mutations = [];
6390
6522
  }
6391
6523
  if (markParent)
6392
6524
  mark(blot.parent);
6393
6525
  };
6394
6526
  var optimize = function (blot) {
6395
- if (blot.domNode[Registry.DATA_KEY] == null || blot.domNode[Registry.DATA_KEY].mutations == null) {
6527
+ // Post-order traversal
6528
+ if (
6529
+ // @ts-ignore
6530
+ blot.domNode[Registry.DATA_KEY] == null ||
6531
+ // @ts-ignore
6532
+ blot.domNode[Registry.DATA_KEY].mutations == null) {
6396
6533
  return;
6397
6534
  }
6398
6535
  if (blot instanceof container_1.default) {
@@ -6440,24 +6577,35 @@ var ScrollBlot = /** @class */ (function (_super) {
6440
6577
  if (context === void 0) { context = {}; }
6441
6578
  mutations = mutations || this.observer.takeRecords();
6442
6579
  // TODO use WeakMap
6443
- mutations.map(function (mutation) {
6580
+ mutations
6581
+ .map(function (mutation) {
6444
6582
  var blot = Registry.find(mutation.target, true);
6445
6583
  if (blot == null)
6446
- return;
6584
+ return null;
6585
+ // @ts-ignore
6447
6586
  if (blot.domNode[Registry.DATA_KEY].mutations == null) {
6587
+ // @ts-ignore
6448
6588
  blot.domNode[Registry.DATA_KEY].mutations = [mutation];
6449
6589
  return blot;
6450
6590
  }
6451
6591
  else {
6592
+ // @ts-ignore
6452
6593
  blot.domNode[Registry.DATA_KEY].mutations.push(mutation);
6453
6594
  return null;
6454
6595
  }
6455
- }).forEach(function (blot) {
6456
- if (blot == null || blot === _this || blot.domNode[Registry.DATA_KEY] == null)
6596
+ })
6597
+ .forEach(function (blot) {
6598
+ if (blot == null ||
6599
+ blot === _this ||
6600
+ //@ts-ignore
6601
+ blot.domNode[Registry.DATA_KEY] == null)
6457
6602
  return;
6603
+ // @ts-ignore
6458
6604
  blot.update(blot.domNode[Registry.DATA_KEY].mutations || [], context);
6459
6605
  });
6606
+ // @ts-ignore
6460
6607
  if (this.domNode[Registry.DATA_KEY].mutations != null) {
6608
+ // @ts-ignore
6461
6609
  _super.prototype.update.call(this, this.domNode[Registry.DATA_KEY].mutations, context);
6462
6610
  }
6463
6611
  this.optimize(mutations, context);
@@ -6494,7 +6642,9 @@ var Registry = __webpack_require__(1);
6494
6642
  function isEqual(obj1, obj2) {
6495
6643
  if (Object.keys(obj1).length !== Object.keys(obj2).length)
6496
6644
  return false;
6645
+ // @ts-ignore
6497
6646
  for (var prop in obj1) {
6647
+ // @ts-ignore
6498
6648
  if (obj1[prop] !== obj2[prop])
6499
6649
  return false;
6500
6650
  }
@@ -6616,7 +6766,7 @@ var BlockBlot = /** @class */ (function (_super) {
6616
6766
  };
6617
6767
  BlockBlot.prototype.update = function (mutations, context) {
6618
6768
  if (navigator.userAgent.match(/Trident/)) {
6619
- this.attach();
6769
+ this.build();
6620
6770
  }
6621
6771
  else {
6622
6772
  _super.prototype.update.call(this, mutations, context);
@@ -6709,8 +6859,9 @@ var TextBlot = /** @class */ (function (_super) {
6709
6859
  };
6710
6860
  TextBlot.value = function (domNode) {
6711
6861
  var text = domNode.data;
6712
- if (text["normalize"])
6713
- text = text["normalize"]();
6862
+ // @ts-ignore
6863
+ if (text['normalize'])
6864
+ text = text['normalize']();
6714
6865
  return text;
6715
6866
  };
6716
6867
  TextBlot.prototype.deleteAt = function (index, length) {
@@ -6939,6 +7090,7 @@ function diff_main(text1, text2, cursor_pos) {
6939
7090
  if (cursor_pos != null) {
6940
7091
  diffs = fix_cursor(diffs, cursor_pos);
6941
7092
  }
7093
+ diffs = fix_emoji(diffs);
6942
7094
  return diffs;
6943
7095
  };
6944
7096
 
@@ -7528,7 +7680,46 @@ function fix_cursor (diffs, cursor_pos) {
7528
7680
  return diffs;
7529
7681
  }
7530
7682
  }
7683
+ }
7684
+
7685
+ /*
7686
+ * Check diff did not split surrogate pairs.
7687
+ * Ex. [0, '\uD83D'], [-1, '\uDC36'], [1, '\uDC2F'] -> [-1, '\uD83D\uDC36'], [1, '\uD83D\uDC2F']
7688
+ * '\uD83D\uDC36' === '🐶', '\uD83D\uDC2F' === '🐯'
7689
+ *
7690
+ * @param {Array} diffs Array of diff tuples
7691
+ * @return {Array} Array of diff tuples
7692
+ */
7693
+ function fix_emoji (diffs) {
7694
+ var compact = false;
7695
+ var starts_with_pair_end = function(str) {
7696
+ return str.charCodeAt(0) >= 0xDC00 && str.charCodeAt(0) <= 0xDFFF;
7697
+ }
7698
+ var ends_with_pair_start = function(str) {
7699
+ return str.charCodeAt(str.length-1) >= 0xD800 && str.charCodeAt(str.length-1) <= 0xDBFF;
7700
+ }
7701
+ for (var i = 2; i < diffs.length; i += 1) {
7702
+ if (diffs[i-2][0] === DIFF_EQUAL && ends_with_pair_start(diffs[i-2][1]) &&
7703
+ diffs[i-1][0] === DIFF_DELETE && starts_with_pair_end(diffs[i-1][1]) &&
7704
+ diffs[i][0] === DIFF_INSERT && starts_with_pair_end(diffs[i][1])) {
7705
+ compact = true;
7706
+
7707
+ diffs[i-1][1] = diffs[i-2][1].slice(-1) + diffs[i-1][1];
7708
+ diffs[i][1] = diffs[i-2][1].slice(-1) + diffs[i][1];
7531
7709
 
7710
+ diffs[i-2][1] = diffs[i-2][1].slice(0, -1);
7711
+ }
7712
+ }
7713
+ if (!compact) {
7714
+ return diffs;
7715
+ }
7716
+ var fixed_diffs = [];
7717
+ for (var i = 0; i < diffs.length; i += 1) {
7718
+ if (diffs[i][1].length > 0) {
7719
+ fixed_diffs.push(diffs[i]);
7720
+ }
7721
+ }
7722
+ return fixed_diffs;
7532
7723
  }
7533
7724
 
7534
7725
  /*
@@ -8060,10 +8251,12 @@ var Clipboard = function (_Module) {
8060
8251
  var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _quill2.default.sources.API;
8061
8252
 
8062
8253
  if (typeof index === 'string') {
8063
- return this.quill.setContents(this.convert(index), html);
8254
+ this.quill.setContents(this.convert(index), html);
8255
+ this.quill.setSelection(0, _quill2.default.sources.SILENT);
8064
8256
  } else {
8065
8257
  var paste = this.convert(html);
8066
- return this.quill.updateContents(new _quillDelta2.default().retain(index).concat(paste), source);
8258
+ this.quill.updateContents(new _quillDelta2.default().retain(index).concat(paste), source);
8259
+ this.quill.setSelection(index + paste.length(), _quill2.default.sources.SILENT);
8067
8260
  }
8068
8261
  }
8069
8262
  }, {
@@ -8204,11 +8397,11 @@ function matchAttributor(node, delta) {
8204
8397
  if (formats[attr.attrName]) return;
8205
8398
  }
8206
8399
  attr = ATTRIBUTE_ATTRIBUTORS[name];
8207
- if (attr != null && attr.attrName === name) {
8400
+ if (attr != null && (attr.attrName === name || attr.keyName === name)) {
8208
8401
  formats[attr.attrName] = attr.value(node) || undefined;
8209
8402
  }
8210
8403
  attr = STYLE_ATTRIBUTORS[name];
8211
- if (attr != null && attr.attrName === name) {
8404
+ if (attr != null && (attr.attrName === name || attr.keyName === name)) {
8212
8405
  attr = STYLE_ATTRIBUTORS[name];
8213
8406
  formats[attr.attrName] = attr.value(node) || undefined;
8214
8407
  }
@@ -8397,5 +8590,5 @@ module.exports = __webpack_require__(29);
8397
8590
 
8398
8591
 
8399
8592
  /***/ })
8400
- /******/ ]);
8593
+ /******/ ])["default"];
8401
8594
  });