@toast-ui/editor 3.1.2 → 3.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/esm/i18n/ar.js +2 -2
  2. package/dist/esm/i18n/cs-cz.js +2 -2
  3. package/dist/esm/i18n/de-de.js +4 -4
  4. package/dist/esm/i18n/en-us.js +3 -3
  5. package/dist/esm/i18n/es-es.js +2 -2
  6. package/dist/esm/i18n/fi-fi.js +2 -2
  7. package/dist/esm/i18n/fr-fr.js +2 -2
  8. package/dist/esm/i18n/gl-es.js +2 -2
  9. package/dist/esm/i18n/hr-hr.js +2 -2
  10. package/dist/esm/i18n/i18n.js +4 -5
  11. package/dist/esm/i18n/it-it.js +2 -2
  12. package/dist/esm/i18n/ja-jp.js +3 -3
  13. package/dist/esm/i18n/ko-kr.js +3 -3
  14. package/dist/esm/i18n/nb-no.js +2 -2
  15. package/dist/esm/i18n/nl-nl.js +3 -3
  16. package/dist/esm/i18n/pl-pl.js +2 -2
  17. package/dist/esm/i18n/pt-br.js +2 -2
  18. package/dist/esm/i18n/ru-ru.js +2 -2
  19. package/dist/esm/i18n/sv-se.js +2 -2
  20. package/dist/esm/i18n/tr-tr.js +2 -2
  21. package/dist/esm/i18n/uk-ua.js +2 -2
  22. package/dist/esm/i18n/zh-cn.js +3 -3
  23. package/dist/esm/i18n/zh-tw.js +2 -2
  24. package/dist/esm/index.js +943 -722
  25. package/dist/esm/indexViewer.js +22 -16
  26. package/dist/i18n/ar.js +6 -6
  27. package/dist/i18n/cs-cz.js +6 -6
  28. package/dist/i18n/de-de.js +8 -8
  29. package/dist/i18n/es-es.js +6 -6
  30. package/dist/i18n/fi-fi.js +6 -6
  31. package/dist/i18n/fr-fr.js +6 -6
  32. package/dist/i18n/gl-es.js +6 -6
  33. package/dist/i18n/hr-hr.js +6 -6
  34. package/dist/i18n/it-it.js +6 -6
  35. package/dist/i18n/ja-jp.js +7 -7
  36. package/dist/i18n/ko-kr.js +7 -7
  37. package/dist/i18n/nb-no.js +6 -6
  38. package/dist/i18n/nl-nl.js +7 -7
  39. package/dist/i18n/pl-pl.js +6 -6
  40. package/dist/i18n/pt-br.js +6 -6
  41. package/dist/i18n/ru-ru.js +6 -6
  42. package/dist/i18n/sv-se.js +6 -6
  43. package/dist/i18n/tr-tr.js +6 -6
  44. package/dist/i18n/uk-ua.js +6 -6
  45. package/dist/i18n/zh-cn.js +7 -7
  46. package/dist/i18n/zh-tw.js +6 -6
  47. package/dist/toastui-editor-only.css +2 -2
  48. package/dist/toastui-editor-viewer.css +7 -7
  49. package/dist/toastui-editor-viewer.js +64 -41
  50. package/dist/toastui-editor.css +7 -7
  51. package/dist/toastui-editor.js +773 -547
  52. package/package.json +4 -3
  53. package/types/editor.d.ts +9 -1
  54. package/types/event.d.ts +1 -0
  55. package/types/index.d.ts +1 -1
  56. package/types/spec.d.ts +1 -1
  57. package/types/ui.d.ts +22 -20
  58. package/types/wysiwyg.d.ts +2 -1
package/dist/esm/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @toast-ui/editor
3
- * @version 3.1.2 | Mon Dec 27 2021
4
- * @author NHN FE Development Lab <dl_javascript@nhn.com>
3
+ * @version 3.1.5 | Sat Apr 23 2022
4
+ * @author NHN Cloud FE Development Lab <dl_javascript@nhn.com>
5
5
  * @license MIT
6
6
  */
7
7
 
@@ -11,7 +11,7 @@ import { ReplaceAroundStep, liftTarget, canSplit, StepMap } from 'prosemirror-tr
11
11
  import { TextSelection, Plugin, PluginKey, EditorState, AllSelection, Selection, SelectionRange, NodeSelection } from 'prosemirror-state';
12
12
  import { keymap } from 'prosemirror-keymap';
13
13
  import { deleteSelection, selectAll, baseKeymap, chainCommands, joinForward, newlineInCode, setBlockType, wrapIn, toggleMark as toggleMark$1, exitCode } from 'prosemirror-commands';
14
- import { InputRule, inputRules } from 'prosemirror-inputrules';
14
+ import { InputRule, inputRules, undoInputRule } from 'prosemirror-inputrules';
15
15
  import { undo, redo, history, undoDepth } from 'prosemirror-history';
16
16
 
17
17
  /*! *****************************************************************************
@@ -700,9 +700,11 @@ var sendHostname_1 = sendHostname;
700
700
  /Mac/.test(navigator.platform);
701
701
  var reSpaceMoreThanOne = /[\u0020]+/g;
702
702
  var reEscapeChars$1 = /[>(){}[\]+-.!#|]/g;
703
- var reEscapeHTML = /<([a-zA-Z_][a-zA-Z0-9\-._]*)(\s|[^\\/>])*\/?>|<(\/)([a-zA-Z_][a-zA-Z0-9\-._]*)\s*\/?>|<!--[^-]+-->|<([a-zA-Z_][a-zA-Z0-9\-.:/]*)>/g;
703
+ var reEscapeHTML = /<([a-zA-Z_][a-zA-Z0-9\-._]*)(\s|[^\\>])*\/?>|<(\/)([a-zA-Z_][a-zA-Z0-9\-._]*)\s*\/?>|<!--[^-]+-->|<([a-zA-Z_][a-zA-Z0-9\-.:/]*)>/g;
704
704
  var reEscapeBackSlash = /\\[!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~\\]/g;
705
705
  var reEscapePairedChars = /[*_~`]/g;
706
+ var reMdImageSyntax = /!\[.*\]\(.*\)/g;
707
+ var reEscapedCharInLinkSyntax = /[[\]]/g; //
706
708
  var XMLSPECIAL$1 = '[&<>"]';
707
709
  var reXmlSpecial$1 = new RegExp(XMLSPECIAL$1, 'g');
708
710
  function replaceUnsafeChar$1(char) {
@@ -774,6 +776,18 @@ function isNeedEscapeText(text) {
774
776
  });
775
777
  return needEscape;
776
778
  }
779
+ function escapeTextForLink(text) {
780
+ var imageSyntaxRanges = [];
781
+ var result = reMdImageSyntax.exec(text);
782
+ while (result) {
783
+ imageSyntaxRanges.push([result.index, result.index + result[0].length]);
784
+ result = reMdImageSyntax.exec(text);
785
+ }
786
+ return text.replace(reEscapedCharInLinkSyntax, function (matched, offset) {
787
+ var isDelimiter = imageSyntaxRanges.some(function (range) { return offset > range[0] && offset < range[1]; });
788
+ return isDelimiter ? matched : "\\" + matched;
789
+ });
790
+ }
777
791
  function escape$1(text) {
778
792
  var replacer = function (matched) { return "\\" + matched; };
779
793
  var escapedText = text.replace(reSpaceMoreThanOne, ' ');
@@ -896,6 +910,54 @@ function getSortedNumPair(valueA, valueB) {
896
910
  return valueA > valueB ? [valueB, valueA] : [valueA, valueB];
897
911
  }
898
912
 
913
+ /**
914
+ * @fileoverview Transform the Array-like object to Array.
915
+ * @author NHN FE Development Lab <dl_javascript@nhn.com>
916
+ */
917
+
918
+ var forEachArray = forEachArray_1;
919
+
920
+ /**
921
+ * Transform the Array-like object to Array.
922
+ * In low IE (below 8), Array.prototype.slice.call is not perfect. So, try-catch statement is used.
923
+ * @param {*} arrayLike Array-like object
924
+ * @returns {Array} Array
925
+ * @memberof module:collection
926
+ * @example
927
+ * // ES6
928
+ * import toArray from 'tui-code-snippet/collection/toArray';
929
+ *
930
+ * // CommonJS
931
+ * const toArray = require('tui-code-snippet/collection/toArray');
932
+ *
933
+ * const arrayLike = {
934
+ * 0: 'one',
935
+ * 1: 'two',
936
+ * 2: 'three',
937
+ * 3: 'four',
938
+ * length: 4
939
+ * };
940
+ * const result = toArray(arrayLike);
941
+ *
942
+ * alert(result instanceof Array); // true
943
+ * alert(result); // one,two,three,four
944
+ */
945
+ function toArray$1(arrayLike) {
946
+ var arr;
947
+ try {
948
+ arr = Array.prototype.slice.call(arrayLike);
949
+ } catch (e) {
950
+ arr = [];
951
+ forEachArray(arrayLike, function(value) {
952
+ arr.push(value);
953
+ });
954
+ }
955
+
956
+ return arr;
957
+ }
958
+
959
+ var toArray_1 = toArray$1;
960
+
899
961
  function createParagraph(schema, content) {
900
962
  var paragraph = schema.nodes.paragraph;
901
963
  if (!content) {
@@ -1219,192 +1281,393 @@ function placeholder(options) {
1219
1281
  });
1220
1282
  }
1221
1283
 
1222
- var pluginKey$1 = new PluginKey('widget');
1223
- var PopupWidget = /** @class */ (function () {
1224
- function PopupWidget(eventEmitter) {
1225
- var _this = this;
1226
- this.popup = null;
1227
- this.removeWidget = function () {
1228
- if (_this.popup) {
1229
- document.body.removeChild(_this.popup);
1230
- _this.popup = null;
1231
- }
1232
- };
1233
- this.eventEmitter = eventEmitter;
1234
- this.eventEmitter.listen('blur', this.removeWidget);
1235
- this.eventEmitter.listen('removePopupWidget', this.removeWidget);
1236
- }
1237
- PopupWidget.prototype.update = function (view) {
1238
- var widget = pluginKey$1.getState(view.state);
1239
- this.removeWidget();
1240
- if (widget) {
1241
- var node = widget.node, style = widget.style;
1242
- var _a = view.coordsAtPos(widget.pos), top_1 = _a.top, left = _a.left, bottom = _a.bottom;
1243
- var height = bottom - top_1;
1244
- css_1(node, { position: 'absolute', left: left + "px", opacity: '0' });
1245
- document.body.appendChild(node);
1246
- css_1(node, {
1247
- top: (style === 'bottom' ? top_1 + height : top_1 - node.clientHeight - height) + "px",
1248
- opacity: '1',
1249
- });
1250
- this.popup = node;
1251
- view.focus();
1252
- }
1253
- };
1254
- PopupWidget.prototype.destroy = function () {
1255
- this.eventEmitter.removeEventHandler('blur', this.removeWidget);
1256
- };
1257
- return PopupWidget;
1258
- }());
1259
- function addWidget(eventEmitter) {
1260
- return new Plugin({
1261
- key: pluginKey$1,
1262
- state: {
1263
- init: function () {
1264
- return null;
1265
- },
1266
- apply: function (tr) {
1267
- return tr.getMeta('widget');
1268
- },
1269
- },
1270
- view: function () {
1271
- return new PopupWidget(eventEmitter);
1272
- },
1273
- });
1274
- }
1275
-
1276
1284
  /**
1277
- * @fileoverview Transform the Array-like object to Array.
1285
+ * @fileoverview Check element has specific css class
1278
1286
  * @author NHN FE Development Lab <dl_javascript@nhn.com>
1279
1287
  */
1280
1288
 
1281
- var forEachArray = forEachArray_1;
1289
+ var inArray$1 = inArray_1;
1290
+ var getClass = getClass_1;
1282
1291
 
1283
1292
  /**
1284
- * Transform the Array-like object to Array.
1285
- * In low IE (below 8), Array.prototype.slice.call is not perfect. So, try-catch statement is used.
1286
- * @param {*} arrayLike Array-like object
1287
- * @returns {Array} Array
1288
- * @memberof module:collection
1289
- * @example
1290
- * // ES6
1291
- * import toArray from 'tui-code-snippet/collection/toArray';
1292
- *
1293
- * // CommonJS
1294
- * const toArray = require('tui-code-snippet/collection/toArray');
1295
- *
1296
- * const arrayLike = {
1297
- * 0: 'one',
1298
- * 1: 'two',
1299
- * 2: 'three',
1300
- * 3: 'four',
1301
- * length: 4
1302
- * };
1303
- * const result = toArray(arrayLike);
1304
- *
1305
- * alert(result instanceof Array); // true
1306
- * alert(result); // one,two,three,four
1293
+ * Check element has specific css class
1294
+ * @param {(HTMLElement|SVGElement)} element - target element
1295
+ * @param {string} cssClass - css class
1296
+ * @returns {boolean}
1297
+ * @memberof module:domUtil
1307
1298
  */
1308
- function toArray$1(arrayLike) {
1309
- var arr;
1310
- try {
1311
- arr = Array.prototype.slice.call(arrayLike);
1312
- } catch (e) {
1313
- arr = [];
1314
- forEachArray(arrayLike, function(value) {
1315
- arr.push(value);
1316
- });
1299
+ function hasClass(element, cssClass) {
1300
+ var origin;
1301
+
1302
+ if (element.classList) {
1303
+ return element.classList.contains(cssClass);
1317
1304
  }
1318
1305
 
1319
- return arr;
1306
+ origin = getClass(element).split(/\s+/);
1307
+
1308
+ return inArray$1(cssClass, origin) > -1;
1320
1309
  }
1321
1310
 
1322
- var toArray_1 = toArray$1;
1311
+ var hasClass_1 = hasClass;
1323
1312
 
1324
- function addDefaultImageBlobHook(eventEmitter) {
1325
- eventEmitter.listen('addImageBlobHook', function (blob, callback) {
1326
- var reader = new FileReader();
1327
- reader.onload = function (_a) {
1328
- var target = _a.target;
1329
- return callback(target.result);
1330
- };
1331
- reader.readAsDataURL(blob);
1332
- });
1333
- }
1334
- function emitImageBlobHook(eventEmitter, blob, type) {
1335
- var hook = function (imageUrl, altText) {
1336
- eventEmitter.emit('command', 'addImage', {
1337
- imageUrl: imageUrl,
1338
- altText: altText || blob.name || 'image',
1339
- });
1340
- };
1341
- eventEmitter.emit('addImageBlobHook', blob, hook, type);
1342
- }
1343
- function pasteImageOnly(items) {
1344
- var images = toArray_1(items).filter(function (_a) {
1345
- var type = _a.type;
1346
- return type.indexOf('image') !== -1;
1347
- });
1348
- if (images.length === 1) {
1349
- var item = images[0];
1350
- if (item) {
1351
- return item.getAsFile();
1352
- }
1353
- }
1354
- return null;
1355
- }
1313
+ /**
1314
+ * @fileoverview Check element match selector
1315
+ * @author NHN FE Development Lab <dl_javascript@nhn.com>
1316
+ */
1356
1317
 
1357
- function dropImage(_a) {
1358
- var eventEmitter = _a.eventEmitter;
1359
- return new Plugin({
1360
- props: {
1361
- handleDOMEvents: {
1362
- drop: function (_, ev) {
1363
- var _a;
1364
- var items = (_a = ev.dataTransfer) === null || _a === void 0 ? void 0 : _a.files;
1365
- if (items) {
1366
- forEachArray_1(items, function (item) {
1367
- if (item.type.indexOf('image') !== -1) {
1368
- ev.preventDefault();
1369
- ev.stopPropagation();
1370
- emitImageBlobHook(eventEmitter, item, ev.type);
1371
- return false;
1372
- }
1373
- return true;
1374
- });
1375
- }
1376
- return true;
1377
- },
1378
- },
1379
- },
1380
- });
1381
- }
1318
+ var inArray = inArray_1;
1319
+ var toArray = toArray_1;
1382
1320
 
1383
- var Node$2 = /** @class */ (function () {
1384
- function Node() {
1385
- }
1386
- Object.defineProperty(Node.prototype, "type", {
1387
- get: function () {
1388
- return 'node';
1389
- },
1390
- enumerable: false,
1391
- configurable: true
1392
- });
1393
- Node.prototype.setContext = function (context) {
1394
- this.context = context;
1321
+ var elProto = Element.prototype;
1322
+ var matchSelector = elProto.matches ||
1323
+ elProto.webkitMatchesSelector ||
1324
+ elProto.mozMatchesSelector ||
1325
+ elProto.msMatchesSelector ||
1326
+ function(selector) {
1327
+ var doc = this.document || this.ownerDocument;
1328
+
1329
+ return inArray(this, toArray(doc.querySelectorAll(selector))) > -1;
1395
1330
  };
1396
- return Node;
1397
- }());
1398
1331
 
1399
- function widgetNodeView(pmNode) {
1400
- var dom = document.createElement('span');
1401
- var node = widgetToDOM(pmNode.attrs.info, pmNode.textContent);
1402
- dom.className = 'tui-widget';
1403
- dom.appendChild(node);
1404
- return { dom: dom };
1332
+ /**
1333
+ * Check element match selector
1334
+ * @param {HTMLElement} element - element to check
1335
+ * @param {string} selector - selector to check
1336
+ * @returns {boolean} is selector matched to element?
1337
+ * @memberof module:domUtil
1338
+ */
1339
+ function matches(element, selector) {
1340
+ return matchSelector.call(element, selector);
1405
1341
  }
1406
- function isWidgetNode(pmNode) {
1407
- return pmNode.type.name === 'widget';
1342
+
1343
+ var matches_1 = matches;
1344
+
1345
+ var TAG_NAME = '[A-Za-z][A-Za-z0-9-]*';
1346
+ var ATTRIBUTE_NAME = '[a-zA-Z_:][a-zA-Z0-9:._-]*';
1347
+ var UNQUOTED_VALUE = '[^"\'=<>`\\x00-\\x20]+';
1348
+ var SINGLE_QUOTED_VALUE = "'[^']*'";
1349
+ var DOUBLE_QUOTED_VALUE = '"[^"]*"';
1350
+ var ATTRIBUTE_VALUE = "(?:" + UNQUOTED_VALUE + "|" + SINGLE_QUOTED_VALUE + "|" + DOUBLE_QUOTED_VALUE + ")";
1351
+ var ATTRIBUTE_VALUE_SPEC = "" + '(?:\\s*=\\s*' + ATTRIBUTE_VALUE + ")";
1352
+ var ATTRIBUTE$1 = "" + '(?:\\s+' + ATTRIBUTE_NAME + ATTRIBUTE_VALUE_SPEC + "?)";
1353
+ var OPEN_TAG = "<(" + TAG_NAME + ")(" + ATTRIBUTE$1 + ")*\\s*/?>";
1354
+ var CLOSE_TAG = "</(" + TAG_NAME + ")\\s*[>]";
1355
+ var HTML_TAG = "(?:" + OPEN_TAG + "|" + CLOSE_TAG + ")";
1356
+ var reHTMLTag = new RegExp("^" + HTML_TAG, 'i');
1357
+ var reBR = /<br\s*\/*>/i;
1358
+ var reHTMLComment = /<! ---->|<!--(?:-?[^>-])(?:-?[^-])*-->/;
1359
+ var ALTERNATIVE_TAG_FOR_BR = '</p><p>';
1360
+
1361
+ function isPositionInBox(style, offsetX, offsetY) {
1362
+ var left = parseInt(style.left, 10);
1363
+ var top = parseInt(style.top, 10);
1364
+ var width = parseInt(style.width, 10) + parseInt(style.paddingLeft, 10) + parseInt(style.paddingRight, 10);
1365
+ var height = parseInt(style.height, 10) + parseInt(style.paddingTop, 10) + parseInt(style.paddingBottom, 10);
1366
+ return offsetX >= left && offsetX <= left + width && offsetY >= top && offsetY <= top + height;
1367
+ }
1368
+ var CLS_PREFIX = 'toastui-editor-';
1369
+ function cls() {
1370
+ var names = [];
1371
+ for (var _i = 0; _i < arguments.length; _i++) {
1372
+ names[_i] = arguments[_i];
1373
+ }
1374
+ var result = [];
1375
+ for (var _a = 0, names_1 = names; _a < names_1.length; _a++) {
1376
+ var name_1 = names_1[_a];
1377
+ var className = void 0;
1378
+ if (Array.isArray(name_1)) {
1379
+ className = name_1[0] ? name_1[1] : null;
1380
+ }
1381
+ else {
1382
+ className = name_1;
1383
+ }
1384
+ if (className) {
1385
+ result.push("" + CLS_PREFIX + className);
1386
+ }
1387
+ }
1388
+ return result.join(' ');
1389
+ }
1390
+ function clsWithMdPrefix() {
1391
+ var names = [];
1392
+ for (var _i = 0; _i < arguments.length; _i++) {
1393
+ names[_i] = arguments[_i];
1394
+ }
1395
+ return names.map(function (className) { return CLS_PREFIX + "md-" + className; }).join(' ');
1396
+ }
1397
+ function isTextNode(node) {
1398
+ return (node === null || node === void 0 ? void 0 : node.nodeType) === Node.TEXT_NODE;
1399
+ }
1400
+ function isElemNode(node) {
1401
+ return node && node.nodeType === Node.ELEMENT_NODE;
1402
+ }
1403
+ function findNodes(element, selector) {
1404
+ var nodeList = toArray_1(element.querySelectorAll(selector));
1405
+ if (nodeList.length) {
1406
+ return nodeList;
1407
+ }
1408
+ return [];
1409
+ }
1410
+ function appendNodes(node, nodesToAppend) {
1411
+ nodesToAppend = isArray_1(nodesToAppend) ? toArray_1(nodesToAppend) : [nodesToAppend];
1412
+ nodesToAppend.forEach(function (nodeToAppend) {
1413
+ node.appendChild(nodeToAppend);
1414
+ });
1415
+ }
1416
+ function insertBeforeNode(insertedNode, node) {
1417
+ if (node.parentNode) {
1418
+ node.parentNode.insertBefore(insertedNode, node);
1419
+ }
1420
+ }
1421
+ function removeNode$1(node) {
1422
+ if (node.parentNode) {
1423
+ node.parentNode.removeChild(node);
1424
+ }
1425
+ }
1426
+ function unwrapNode(node) {
1427
+ var result = [];
1428
+ while (node.firstChild) {
1429
+ result.push(node.firstChild);
1430
+ if (node.parentNode) {
1431
+ node.parentNode.insertBefore(node.firstChild, node);
1432
+ }
1433
+ }
1434
+ removeNode$1(node);
1435
+ return result;
1436
+ }
1437
+ function toggleClass(element, className, state) {
1438
+ if (isUndefined_1(state)) {
1439
+ state = !hasClass_1(element, className);
1440
+ }
1441
+ var toggleFn = state ? addClass_1 : removeClass_1;
1442
+ toggleFn(element, className);
1443
+ }
1444
+ function createElementWith(contents, target) {
1445
+ var container = document.createElement('div');
1446
+ if (isString_1(contents)) {
1447
+ container.innerHTML = contents;
1448
+ }
1449
+ else {
1450
+ container.appendChild(contents);
1451
+ }
1452
+ var firstChild = container.firstChild;
1453
+ if (target) {
1454
+ target.appendChild(firstChild);
1455
+ }
1456
+ return firstChild;
1457
+ }
1458
+ function getOuterWidth(el) {
1459
+ var computed = window.getComputedStyle(el);
1460
+ return (['margin-left', 'margin-right'].reduce(function (acc, type) { return acc + parseInt(computed.getPropertyValue(type), 10); }, 0) + el.offsetWidth);
1461
+ }
1462
+ function closest(node, found) {
1463
+ var condition;
1464
+ if (isString_1(found)) {
1465
+ condition = function (target) { return matches_1(target, found); };
1466
+ }
1467
+ else {
1468
+ condition = function (target) { return target === found; };
1469
+ }
1470
+ while (node && node !== document) {
1471
+ if (isElemNode(node) && condition(node)) {
1472
+ return node;
1473
+ }
1474
+ node = node.parentNode;
1475
+ }
1476
+ return null;
1477
+ }
1478
+ function getTotalOffset(el, root) {
1479
+ var offsetTop = 0;
1480
+ var offsetLeft = 0;
1481
+ while (el && el !== root) {
1482
+ var top_1 = el.offsetTop, left = el.offsetLeft, offsetParent = el.offsetParent;
1483
+ offsetTop += top_1;
1484
+ offsetLeft += left;
1485
+ if (offsetParent === root.offsetParent) {
1486
+ break;
1487
+ }
1488
+ el = el.offsetParent;
1489
+ }
1490
+ return { offsetTop: offsetTop, offsetLeft: offsetLeft };
1491
+ }
1492
+ function setAttributes(attributes, element) {
1493
+ Object.keys(attributes).forEach(function (attrName) {
1494
+ if (isNil(attributes[attrName])) {
1495
+ element.removeAttribute(attrName);
1496
+ }
1497
+ else {
1498
+ element.setAttribute(attrName, attributes[attrName]);
1499
+ }
1500
+ });
1501
+ }
1502
+ function replaceBRWithEmptyBlock(html) {
1503
+ // remove br in paragraph to compatible with markdown
1504
+ var replacedHTML = html.replace(/<p><br\s*\/*><\/p>/gi, '<p></p>');
1505
+ var reHTMLTag = new RegExp(HTML_TAG, 'ig');
1506
+ var htmlTagMatched = replacedHTML.match(reHTMLTag);
1507
+ htmlTagMatched === null || htmlTagMatched === void 0 ? void 0 : htmlTagMatched.forEach(function (htmlTag, index) {
1508
+ if (reBR.test(htmlTag)) {
1509
+ var alternativeTag = ALTERNATIVE_TAG_FOR_BR;
1510
+ if (index) {
1511
+ var prevTag = htmlTagMatched[index - 1];
1512
+ var openTagMatched = prevTag.match(OPEN_TAG);
1513
+ if (openTagMatched && !/br/i.test(openTagMatched[1])) {
1514
+ var tagName = openTagMatched[1];
1515
+ alternativeTag = "</" + tagName + "><" + tagName + ">";
1516
+ }
1517
+ }
1518
+ replacedHTML = replacedHTML.replace(reBR, alternativeTag);
1519
+ }
1520
+ });
1521
+ return replacedHTML;
1522
+ }
1523
+
1524
+ var pluginKey$1 = new PluginKey('widget');
1525
+ var MARGIN = 5;
1526
+ var PopupWidget = /** @class */ (function () {
1527
+ function PopupWidget(view, eventEmitter) {
1528
+ var _this = this;
1529
+ this.popup = null;
1530
+ this.removeWidget = function () {
1531
+ if (_this.popup) {
1532
+ _this.rootEl.removeChild(_this.popup);
1533
+ _this.popup = null;
1534
+ }
1535
+ };
1536
+ this.rootEl = view.dom.parentElement;
1537
+ this.eventEmitter = eventEmitter;
1538
+ this.eventEmitter.listen('blur', this.removeWidget);
1539
+ this.eventEmitter.listen('loadUI', function () {
1540
+ _this.rootEl = closest(view.dom.parentElement, "." + cls('defaultUI'));
1541
+ });
1542
+ this.eventEmitter.listen('removePopupWidget', this.removeWidget);
1543
+ }
1544
+ PopupWidget.prototype.update = function (view) {
1545
+ var widget = pluginKey$1.getState(view.state);
1546
+ this.removeWidget();
1547
+ if (widget) {
1548
+ var node = widget.node, style = widget.style;
1549
+ var _a = view.coordsAtPos(widget.pos), top_1 = _a.top, left = _a.left, bottom = _a.bottom;
1550
+ var height = bottom - top_1;
1551
+ var rect = this.rootEl.getBoundingClientRect();
1552
+ var relTopPos = top_1 - rect.top;
1553
+ css_1(node, { opacity: '0' });
1554
+ this.rootEl.appendChild(node);
1555
+ css_1(node, {
1556
+ position: 'absolute',
1557
+ left: left - rect.left + MARGIN + "px",
1558
+ top: (style === 'bottom' ? relTopPos + height - MARGIN : relTopPos - height) + "px",
1559
+ opacity: '1',
1560
+ });
1561
+ this.popup = node;
1562
+ view.focus();
1563
+ }
1564
+ };
1565
+ PopupWidget.prototype.destroy = function () {
1566
+ this.eventEmitter.removeEventHandler('blur', this.removeWidget);
1567
+ };
1568
+ return PopupWidget;
1569
+ }());
1570
+ function addWidget(eventEmitter) {
1571
+ return new Plugin({
1572
+ key: pluginKey$1,
1573
+ state: {
1574
+ init: function () {
1575
+ return null;
1576
+ },
1577
+ apply: function (tr) {
1578
+ return tr.getMeta('widget');
1579
+ },
1580
+ },
1581
+ view: function (editorView) {
1582
+ return new PopupWidget(editorView, eventEmitter);
1583
+ },
1584
+ });
1585
+ }
1586
+
1587
+ function addDefaultImageBlobHook(eventEmitter) {
1588
+ eventEmitter.listen('addImageBlobHook', function (blob, callback) {
1589
+ var reader = new FileReader();
1590
+ reader.onload = function (_a) {
1591
+ var target = _a.target;
1592
+ return callback(target.result);
1593
+ };
1594
+ reader.readAsDataURL(blob);
1595
+ });
1596
+ }
1597
+ function emitImageBlobHook(eventEmitter, blob, type) {
1598
+ var hook = function (imageUrl, altText) {
1599
+ eventEmitter.emit('command', 'addImage', {
1600
+ imageUrl: imageUrl,
1601
+ altText: altText || blob.name || 'image',
1602
+ });
1603
+ };
1604
+ eventEmitter.emit('addImageBlobHook', blob, hook, type);
1605
+ }
1606
+ function pasteImageOnly(items) {
1607
+ var images = toArray_1(items).filter(function (_a) {
1608
+ var type = _a.type;
1609
+ return type.indexOf('image') !== -1;
1610
+ });
1611
+ if (images.length === 1) {
1612
+ var item = images[0];
1613
+ if (item) {
1614
+ return item.getAsFile();
1615
+ }
1616
+ }
1617
+ return null;
1618
+ }
1619
+
1620
+ function dropImage(_a) {
1621
+ var eventEmitter = _a.eventEmitter;
1622
+ return new Plugin({
1623
+ props: {
1624
+ handleDOMEvents: {
1625
+ drop: function (_, ev) {
1626
+ var _a;
1627
+ var items = (_a = ev.dataTransfer) === null || _a === void 0 ? void 0 : _a.files;
1628
+ if (items) {
1629
+ forEachArray_1(items, function (item) {
1630
+ if (item.type.indexOf('image') !== -1) {
1631
+ ev.preventDefault();
1632
+ ev.stopPropagation();
1633
+ emitImageBlobHook(eventEmitter, item, ev.type);
1634
+ return false;
1635
+ }
1636
+ return true;
1637
+ });
1638
+ }
1639
+ return true;
1640
+ },
1641
+ },
1642
+ },
1643
+ });
1644
+ }
1645
+
1646
+ var Node$2 = /** @class */ (function () {
1647
+ function Node() {
1648
+ }
1649
+ Object.defineProperty(Node.prototype, "type", {
1650
+ get: function () {
1651
+ return 'node';
1652
+ },
1653
+ enumerable: false,
1654
+ configurable: true
1655
+ });
1656
+ Node.prototype.setContext = function (context) {
1657
+ this.context = context;
1658
+ };
1659
+ return Node;
1660
+ }());
1661
+
1662
+ function widgetNodeView(pmNode) {
1663
+ var dom = document.createElement('span');
1664
+ var node = widgetToDOM(pmNode.attrs.info, pmNode.textContent);
1665
+ dom.className = 'tui-widget';
1666
+ dom.appendChild(node);
1667
+ return { dom: dom };
1668
+ }
1669
+ function isWidgetNode(pmNode) {
1670
+ return pmNode.type.name === 'widget';
1408
1671
  }
1409
1672
  var Widget = /** @class */ (function (_super) {
1410
1673
  __extends$1(Widget, _super);
@@ -1452,6 +1715,7 @@ var Widget = /** @class */ (function (_super) {
1452
1715
 
1453
1716
  var EditorBase = /** @class */ (function () {
1454
1717
  function EditorBase(eventEmitter) {
1718
+ this.timer = null;
1455
1719
  this.el = document.createElement('div');
1456
1720
  this.el.className = 'toastui-editor';
1457
1721
  this.eventEmitter = eventEmitter;
@@ -1476,10 +1740,9 @@ var EditorBase = /** @class */ (function () {
1476
1740
  };
1477
1741
  Object.defineProperty(EditorBase.prototype, "defaultPlugins", {
1478
1742
  get: function () {
1479
- var _a = getDefaultCommands(), undo = _a.undo, redo = _a.redo;
1480
1743
  var rules = this.createInputRules();
1481
1744
  var plugins = __spreadArray$1(__spreadArray$1([], this.keymaps), [
1482
- keymap(__assign$1({ 'Mod-z': undo(), 'Shift-Mod-z': redo(), 'Shift-Enter': baseKeymap.Enter }, baseKeymap)),
1745
+ keymap(__assign$1({ 'Shift-Enter': baseKeymap.Enter }, baseKeymap)),
1483
1746
  history(),
1484
1747
  placeholder(this.placeholder),
1485
1748
  addWidget(this.eventEmitter),
@@ -1516,6 +1779,12 @@ var EditorBase = /** @class */ (function () {
1516
1779
  });
1517
1780
  return rules.length ? inputRules({ rules: rules }) : null;
1518
1781
  };
1782
+ EditorBase.prototype.clearTimer = function () {
1783
+ if (this.timer) {
1784
+ clearTimeout(this.timer);
1785
+ this.timer = null;
1786
+ }
1787
+ };
1519
1788
  EditorBase.prototype.createSchema = function () {
1520
1789
  return new Schema({
1521
1790
  nodes: this.specs.nodes,
@@ -1523,7 +1792,13 @@ var EditorBase = /** @class */ (function () {
1523
1792
  });
1524
1793
  };
1525
1794
  EditorBase.prototype.createKeymaps = function (useCommandShortcut) {
1526
- return useCommandShortcut ? this.specs.keymaps() : [];
1795
+ var _a = getDefaultCommands(), undo = _a.undo, redo = _a.redo;
1796
+ var allKeymaps = this.specs.keymaps(useCommandShortcut);
1797
+ var historyKeymap = {
1798
+ 'Mod-z': undo(),
1799
+ 'Shift-Mod-z': redo(),
1800
+ };
1801
+ return useCommandShortcut ? allKeymaps.concat(keymap(historyKeymap)) : allKeymaps;
1527
1802
  };
1528
1803
  EditorBase.prototype.createCommands = function () {
1529
1804
  return this.specs.commands(this.view);
@@ -1534,8 +1809,9 @@ var EditorBase = /** @class */ (function () {
1534
1809
  };
1535
1810
  EditorBase.prototype.focus = function () {
1536
1811
  var _this = this;
1812
+ this.clearTimer();
1537
1813
  // prevent the error for IE11
1538
- setTimeout(function () {
1814
+ this.timer = setTimeout(function () {
1539
1815
  _this.view.focus();
1540
1816
  _this.view.dispatch(_this.view.state.tr.scrollIntoView());
1541
1817
  });
@@ -1544,380 +1820,170 @@ var EditorBase = /** @class */ (function () {
1544
1820
  this.view.dom.blur();
1545
1821
  };
1546
1822
  EditorBase.prototype.destroy = function () {
1547
- var _this = this;
1548
- this.view.destroy();
1549
- Object.keys(this).forEach(function (prop) {
1550
- delete _this[prop];
1551
- });
1552
- };
1553
- EditorBase.prototype.moveCursorToStart = function (focus) {
1554
- var tr = this.view.state.tr;
1555
- this.view.dispatch(tr.setSelection(createTextSelection(tr, 1)).scrollIntoView());
1556
- if (focus) {
1557
- this.focus();
1558
- }
1559
- };
1560
- EditorBase.prototype.moveCursorToEnd = function (focus) {
1561
- var tr = this.view.state.tr;
1562
- this.view.dispatch(tr.setSelection(createTextSelection(tr, tr.doc.content.size - 1)).scrollIntoView());
1563
- if (focus) {
1564
- this.focus();
1565
- }
1566
- };
1567
- EditorBase.prototype.setScrollTop = function (top) {
1568
- this.view.dom.scrollTop = top;
1569
- };
1570
- EditorBase.prototype.getScrollTop = function () {
1571
- return this.view.dom.scrollTop;
1572
- };
1573
- EditorBase.prototype.setPlaceholder = function (text) {
1574
- this.placeholder.text = text;
1575
- this.view.dispatch(this.view.state.tr.scrollIntoView());
1576
- };
1577
- EditorBase.prototype.setHeight = function (height) {
1578
- css_1(this.el, { height: height + "px" });
1579
- };
1580
- EditorBase.prototype.setMinHeight = function (minHeight) {
1581
- css_1(this.el, { minHeight: minHeight + "px" });
1582
- };
1583
- EditorBase.prototype.getElement = function () {
1584
- return this.el;
1585
- };
1586
- return EditorBase;
1587
- }());
1588
-
1589
- /**
1590
- * @fileoverview Check whether the given variable is a function or not.
1591
- * @author NHN FE Development Lab <dl_javascript@nhn.com>
1592
- */
1593
-
1594
- /**
1595
- * Check whether the given variable is a function or not.
1596
- * If the given variable is a function, return true.
1597
- * @param {*} obj - Target for checking
1598
- * @returns {boolean} Is function?
1599
- * @memberof module:type
1600
- */
1601
- function isFunction(obj) {
1602
- return obj instanceof Function;
1603
- }
1604
-
1605
- var isFunction_1 = isFunction;
1606
-
1607
- function execCommand(view, command, payload) {
1608
- view.focus();
1609
- return command(payload)(view.state, view.dispatch, view);
1610
- }
1611
- var SpecManager = /** @class */ (function () {
1612
- function SpecManager(specs) {
1613
- this.specs = specs;
1614
- }
1615
- Object.defineProperty(SpecManager.prototype, "nodes", {
1616
- get: function () {
1617
- return this.specs
1618
- .filter(function (spec) { return spec.type === 'node'; })
1619
- .reduce(function (nodes, _a) {
1620
- var _b;
1621
- var name = _a.name, schema = _a.schema;
1622
- return __assign$1(__assign$1({}, nodes), (_b = {}, _b[name] = schema, _b));
1623
- }, {});
1624
- },
1625
- enumerable: false,
1626
- configurable: true
1627
- });
1628
- Object.defineProperty(SpecManager.prototype, "marks", {
1629
- get: function () {
1630
- return this.specs
1631
- .filter(function (spec) { return spec.type === 'mark'; })
1632
- .reduce(function (marks, _a) {
1633
- var _b;
1634
- var name = _a.name, schema = _a.schema;
1635
- return __assign$1(__assign$1({}, marks), (_b = {}, _b[name] = schema, _b));
1636
- }, {});
1637
- },
1638
- enumerable: false,
1639
- configurable: true
1640
- });
1641
- SpecManager.prototype.commands = function (view, addedCommands) {
1642
- var specCommands = this.specs
1643
- .filter(function (_a) {
1644
- var commands = _a.commands;
1645
- return commands;
1646
- })
1647
- .reduce(function (allCommands, spec) {
1648
- var commands = {};
1649
- var specCommand = spec.commands();
1650
- if (isFunction_1(specCommand)) {
1651
- commands[spec.name] = function (payload) { return execCommand(view, specCommand, payload); };
1652
- }
1653
- else {
1654
- Object.keys(specCommand).forEach(function (name) {
1655
- commands[name] = function (payload) { return execCommand(view, specCommand[name], payload); };
1656
- });
1657
- }
1658
- return __assign$1(__assign$1({}, allCommands), commands);
1659
- }, {});
1660
- var defaultCommands = getDefaultCommands();
1661
- Object.keys(defaultCommands).forEach(function (name) {
1662
- specCommands[name] = function (payload) { return execCommand(view, defaultCommands[name], payload); };
1823
+ var _this = this;
1824
+ this.clearTimer();
1825
+ this.view.destroy();
1826
+ Object.keys(this).forEach(function (prop) {
1827
+ delete _this[prop];
1663
1828
  });
1664
- if (addedCommands) {
1665
- Object.keys(addedCommands).forEach(function (name) {
1666
- specCommands[name] = function (payload) { return execCommand(view, addedCommands[name], payload); };
1667
- });
1829
+ };
1830
+ EditorBase.prototype.moveCursorToStart = function (focus) {
1831
+ var tr = this.view.state.tr;
1832
+ this.view.dispatch(tr.setSelection(createTextSelection(tr, 1)).scrollIntoView());
1833
+ if (focus) {
1834
+ this.focus();
1668
1835
  }
1669
- return specCommands;
1670
1836
  };
1671
- SpecManager.prototype.keymaps = function () {
1672
- var specKeymaps = this.specs.filter(function (spec) { return spec.keymaps; }).map(function (spec) { return spec.keymaps(); });
1673
- return specKeymaps.map(function (keys) { return keymap(keys); });
1837
+ EditorBase.prototype.moveCursorToEnd = function (focus) {
1838
+ var tr = this.view.state.tr;
1839
+ this.view.dispatch(tr.setSelection(createTextSelection(tr, tr.doc.content.size - 1)).scrollIntoView());
1840
+ if (focus) {
1841
+ this.focus();
1842
+ }
1674
1843
  };
1675
- SpecManager.prototype.setContext = function (context) {
1676
- this.specs.forEach(function (spec) {
1677
- spec.setContext(context);
1678
- });
1844
+ EditorBase.prototype.setScrollTop = function (top) {
1845
+ this.view.dom.scrollTop = top;
1679
1846
  };
1680
- return SpecManager;
1847
+ EditorBase.prototype.getScrollTop = function () {
1848
+ return this.view.dom.scrollTop;
1849
+ };
1850
+ EditorBase.prototype.setPlaceholder = function (text) {
1851
+ this.placeholder.text = text;
1852
+ this.view.dispatch(this.view.state.tr.scrollIntoView());
1853
+ };
1854
+ EditorBase.prototype.setHeight = function (height) {
1855
+ css_1(this.el, { height: height + "px" });
1856
+ };
1857
+ EditorBase.prototype.setMinHeight = function (minHeight) {
1858
+ css_1(this.el, { minHeight: minHeight + "px" });
1859
+ };
1860
+ EditorBase.prototype.getElement = function () {
1861
+ return this.el;
1862
+ };
1863
+ return EditorBase;
1681
1864
  }());
1682
1865
 
1683
1866
  /**
1684
- * @fileoverview Check element has specific css class
1685
- * @author NHN FE Development Lab <dl_javascript@nhn.com>
1686
- */
1687
-
1688
- var inArray$1 = inArray_1;
1689
- var getClass = getClass_1;
1690
-
1691
- /**
1692
- * Check element has specific css class
1693
- * @param {(HTMLElement|SVGElement)} element - target element
1694
- * @param {string} cssClass - css class
1695
- * @returns {boolean}
1696
- * @memberof module:domUtil
1697
- */
1698
- function hasClass(element, cssClass) {
1699
- var origin;
1700
-
1701
- if (element.classList) {
1702
- return element.classList.contains(cssClass);
1703
- }
1704
-
1705
- origin = getClass(element).split(/\s+/);
1706
-
1707
- return inArray$1(cssClass, origin) > -1;
1708
- }
1709
-
1710
- var hasClass_1 = hasClass;
1711
-
1712
- /**
1713
- * @fileoverview Check element match selector
1867
+ * @fileoverview Check whether the given variable is a function or not.
1714
1868
  * @author NHN FE Development Lab <dl_javascript@nhn.com>
1715
1869
  */
1716
1870
 
1717
- var inArray = inArray_1;
1718
- var toArray = toArray_1;
1719
-
1720
- var elProto = Element.prototype;
1721
- var matchSelector = elProto.matches ||
1722
- elProto.webkitMatchesSelector ||
1723
- elProto.mozMatchesSelector ||
1724
- elProto.msMatchesSelector ||
1725
- function(selector) {
1726
- var doc = this.document || this.ownerDocument;
1727
-
1728
- return inArray(this, toArray(doc.querySelectorAll(selector))) > -1;
1729
- };
1730
-
1731
1871
  /**
1732
- * Check element match selector
1733
- * @param {HTMLElement} element - element to check
1734
- * @param {string} selector - selector to check
1735
- * @returns {boolean} is selector matched to element?
1736
- * @memberof module:domUtil
1872
+ * Check whether the given variable is a function or not.
1873
+ * If the given variable is a function, return true.
1874
+ * @param {*} obj - Target for checking
1875
+ * @returns {boolean} Is function?
1876
+ * @memberof module:type
1737
1877
  */
1738
- function matches(element, selector) {
1739
- return matchSelector.call(element, selector);
1878
+ function isFunction(obj) {
1879
+ return obj instanceof Function;
1740
1880
  }
1741
1881
 
1742
- var matches_1 = matches;
1743
-
1744
- var TAG_NAME = '[A-Za-z][A-Za-z0-9-]*';
1745
- var ATTRIBUTE_NAME = '[a-zA-Z_:][a-zA-Z0-9:._-]*';
1746
- var UNQUOTED_VALUE = '[^"\'=<>`\\x00-\\x20]+';
1747
- var SINGLE_QUOTED_VALUE = "'[^']*'";
1748
- var DOUBLE_QUOTED_VALUE = '"[^"]*"';
1749
- var ATTRIBUTE_VALUE = "(?:" + UNQUOTED_VALUE + "|" + SINGLE_QUOTED_VALUE + "|" + DOUBLE_QUOTED_VALUE + ")";
1750
- var ATTRIBUTE_VALUE_SPEC = "" + '(?:\\s*=\\s*' + ATTRIBUTE_VALUE + ")";
1751
- var ATTRIBUTE$1 = "" + '(?:\\s+' + ATTRIBUTE_NAME + ATTRIBUTE_VALUE_SPEC + "?)";
1752
- var OPEN_TAG = "<(" + TAG_NAME + ")(" + ATTRIBUTE$1 + ")*\\s*/?>";
1753
- var CLOSE_TAG = "</(" + TAG_NAME + ")\\s*[>]";
1754
- var HTML_TAG = "(?:" + OPEN_TAG + "|" + CLOSE_TAG + ")";
1755
- var reHTMLTag = new RegExp("^" + HTML_TAG, 'i');
1756
- var reBR = /<br\s*\/*>/i;
1757
- var ALTERNATIVE_TAG_FOR_BR = '</p><p>';
1882
+ var isFunction_1 = isFunction;
1758
1883
 
1759
- function isPositionInBox(style, offsetX, offsetY) {
1760
- var left = parseInt(style.left, 10);
1761
- var top = parseInt(style.top, 10);
1762
- var width = parseInt(style.width, 10) + parseInt(style.paddingLeft, 10) + parseInt(style.paddingRight, 10);
1763
- var height = parseInt(style.height, 10) + parseInt(style.paddingTop, 10) + parseInt(style.paddingBottom, 10);
1764
- return offsetX >= left && offsetX <= left + width && offsetY >= top && offsetY <= top + height;
1765
- }
1766
- var CLS_PREFIX = 'toastui-editor-';
1767
- function cls() {
1768
- var names = [];
1769
- for (var _i = 0; _i < arguments.length; _i++) {
1770
- names[_i] = arguments[_i];
1771
- }
1772
- var result = [];
1773
- for (var _a = 0, names_1 = names; _a < names_1.length; _a++) {
1774
- var name_1 = names_1[_a];
1775
- var className = void 0;
1776
- if (Array.isArray(name_1)) {
1777
- className = name_1[0] ? name_1[1] : null;
1778
- }
1779
- else {
1780
- className = name_1;
1781
- }
1782
- if (className) {
1783
- result.push("" + CLS_PREFIX + className);
1784
- }
1785
- }
1786
- return result.join(' ');
1787
- }
1788
- function clsWithMdPrefix() {
1789
- var names = [];
1790
- for (var _i = 0; _i < arguments.length; _i++) {
1791
- names[_i] = arguments[_i];
1792
- }
1793
- return names.map(function (className) { return CLS_PREFIX + "md-" + className; }).join(' ');
1794
- }
1795
- function isTextNode(node) {
1796
- return (node === null || node === void 0 ? void 0 : node.nodeType) === Node.TEXT_NODE;
1797
- }
1798
- function isElemNode(node) {
1799
- return node && node.nodeType === Node.ELEMENT_NODE;
1800
- }
1801
- function findNodes(element, selector) {
1802
- var nodeList = toArray_1(element.querySelectorAll(selector));
1803
- if (nodeList.length) {
1804
- return nodeList;
1805
- }
1806
- return [];
1807
- }
1808
- function appendNodes(node, nodesToAppend) {
1809
- nodesToAppend = isArray_1(nodesToAppend) ? toArray_1(nodesToAppend) : [nodesToAppend];
1810
- nodesToAppend.forEach(function (nodeToAppend) {
1811
- node.appendChild(nodeToAppend);
1812
- });
1813
- }
1814
- function insertBeforeNode(insertedNode, node) {
1815
- if (node.parentNode) {
1816
- node.parentNode.insertBefore(insertedNode, node);
1817
- }
1818
- }
1819
- function removeNode$1(node) {
1820
- if (node.parentNode) {
1821
- node.parentNode.removeChild(node);
1822
- }
1823
- }
1824
- function unwrapNode(node) {
1825
- var result = [];
1826
- while (node.firstChild) {
1827
- result.push(node.firstChild);
1828
- if (node.parentNode) {
1829
- node.parentNode.insertBefore(node.firstChild, node);
1830
- }
1831
- }
1832
- removeNode$1(node);
1833
- return result;
1834
- }
1835
- function toggleClass(element, className, state) {
1836
- if (isUndefined_1(state)) {
1837
- state = !hasClass_1(element, className);
1838
- }
1839
- var toggleFn = state ? addClass_1 : removeClass_1;
1840
- toggleFn(element, className);
1841
- }
1842
- function createElementWith(contents, target) {
1843
- var container = document.createElement('div');
1844
- if (isString_1(contents)) {
1845
- container.innerHTML = contents;
1846
- }
1847
- else {
1848
- container.appendChild(contents);
1849
- }
1850
- var firstChild = container.firstChild;
1851
- if (target) {
1852
- target.appendChild(firstChild);
1853
- }
1854
- return firstChild;
1855
- }
1856
- function getOuterWidth(el) {
1857
- var computed = window.getComputedStyle(el);
1858
- return (['margin-left', 'margin-right'].reduce(function (acc, type) { return acc + parseInt(computed.getPropertyValue(type), 10); }, 0) + el.offsetWidth);
1859
- }
1860
- function closest(node, found) {
1861
- var condition;
1862
- if (isString_1(found)) {
1863
- condition = function (target) { return matches_1(target, found); };
1864
- }
1865
- else {
1866
- condition = function (target) { return target === found; };
1867
- }
1868
- while (node && node !== document) {
1869
- if (isElemNode(node) && condition(node)) {
1870
- return node;
1871
- }
1872
- node = node.parentNode;
1873
- }
1874
- return null;
1884
+ var defaultCommandShortcuts = [
1885
+ 'Enter',
1886
+ 'Shift-Enter',
1887
+ 'Mod-Enter',
1888
+ 'Tab',
1889
+ 'Shift-Tab',
1890
+ 'Delete',
1891
+ 'Backspace',
1892
+ 'Mod-Delete',
1893
+ 'Mod-Backspace',
1894
+ 'ArrowUp',
1895
+ 'ArrowDown',
1896
+ 'ArrowLeft',
1897
+ 'ArrowRight',
1898
+ 'Mod-d',
1899
+ 'Mod-D',
1900
+ 'Alt-ArrowUp',
1901
+ 'Alt-ArrowDown',
1902
+ ];
1903
+ function execCommand(view, command, payload) {
1904
+ view.focus();
1905
+ return command(payload)(view.state, view.dispatch, view);
1875
1906
  }
1876
- function getTotalOffset(el, root) {
1877
- var offsetTop = 0;
1878
- var offsetLeft = 0;
1879
- while (el && el !== root) {
1880
- var top_1 = el.offsetTop, left = el.offsetLeft, offsetParent = el.offsetParent;
1881
- offsetTop += top_1;
1882
- offsetLeft += left;
1883
- if (offsetParent === root.offsetParent) {
1884
- break;
1885
- }
1886
- el = el.offsetParent;
1907
+ var SpecManager = /** @class */ (function () {
1908
+ function SpecManager(specs) {
1909
+ this.specs = specs;
1887
1910
  }
1888
- return { offsetTop: offsetTop, offsetLeft: offsetLeft };
1889
- }
1890
- function setAttributes(attributes, element) {
1891
- Object.keys(attributes).forEach(function (attrName) {
1892
- if (isNil(attributes[attrName])) {
1893
- element.removeAttribute(attrName);
1894
- }
1895
- else {
1896
- element.setAttribute(attrName, attributes[attrName]);
1897
- }
1911
+ Object.defineProperty(SpecManager.prototype, "nodes", {
1912
+ get: function () {
1913
+ return this.specs
1914
+ .filter(function (spec) { return spec.type === 'node'; })
1915
+ .reduce(function (nodes, _a) {
1916
+ var _b;
1917
+ var name = _a.name, schema = _a.schema;
1918
+ return __assign$1(__assign$1({}, nodes), (_b = {}, _b[name] = schema, _b));
1919
+ }, {});
1920
+ },
1921
+ enumerable: false,
1922
+ configurable: true
1898
1923
  });
1899
- }
1900
- function replaceBRWithEmptyBlock(html) {
1901
- // remove br in paragraph to compatible with markdown
1902
- var replacedHTML = html.replace(/<p><br\s*\/*><\/p>/gi, '<p></p>');
1903
- var reHTMLTag = new RegExp(HTML_TAG, 'ig');
1904
- var htmlTagMatched = replacedHTML.match(reHTMLTag);
1905
- htmlTagMatched === null || htmlTagMatched === void 0 ? void 0 : htmlTagMatched.forEach(function (htmlTag, index) {
1906
- if (reBR.test(htmlTag)) {
1907
- var alternativeTag = ALTERNATIVE_TAG_FOR_BR;
1908
- if (index) {
1909
- var prevTag = htmlTagMatched[index - 1];
1910
- var openTagMatched = prevTag.match(OPEN_TAG);
1911
- if (openTagMatched && !/br/i.test(openTagMatched[1])) {
1912
- var tagName = openTagMatched[1];
1913
- alternativeTag = "</" + tagName + "><" + tagName + ">";
1914
- }
1924
+ Object.defineProperty(SpecManager.prototype, "marks", {
1925
+ get: function () {
1926
+ return this.specs
1927
+ .filter(function (spec) { return spec.type === 'mark'; })
1928
+ .reduce(function (marks, _a) {
1929
+ var _b;
1930
+ var name = _a.name, schema = _a.schema;
1931
+ return __assign$1(__assign$1({}, marks), (_b = {}, _b[name] = schema, _b));
1932
+ }, {});
1933
+ },
1934
+ enumerable: false,
1935
+ configurable: true
1936
+ });
1937
+ SpecManager.prototype.commands = function (view, addedCommands) {
1938
+ var specCommands = this.specs
1939
+ .filter(function (_a) {
1940
+ var commands = _a.commands;
1941
+ return commands;
1942
+ })
1943
+ .reduce(function (allCommands, spec) {
1944
+ var commands = {};
1945
+ var specCommand = spec.commands();
1946
+ if (isFunction_1(specCommand)) {
1947
+ commands[spec.name] = function (payload) { return execCommand(view, specCommand, payload); };
1915
1948
  }
1916
- replacedHTML = replacedHTML.replace(reBR, alternativeTag);
1949
+ else {
1950
+ Object.keys(specCommand).forEach(function (name) {
1951
+ commands[name] = function (payload) { return execCommand(view, specCommand[name], payload); };
1952
+ });
1953
+ }
1954
+ return __assign$1(__assign$1({}, allCommands), commands);
1955
+ }, {});
1956
+ var defaultCommands = getDefaultCommands();
1957
+ Object.keys(defaultCommands).forEach(function (name) {
1958
+ specCommands[name] = function (payload) { return execCommand(view, defaultCommands[name], payload); };
1959
+ });
1960
+ if (addedCommands) {
1961
+ Object.keys(addedCommands).forEach(function (name) {
1962
+ specCommands[name] = function (payload) { return execCommand(view, addedCommands[name], payload); };
1963
+ });
1917
1964
  }
1918
- });
1919
- return replacedHTML;
1920
- }
1965
+ return specCommands;
1966
+ };
1967
+ SpecManager.prototype.keymaps = function (useCommandShortcut) {
1968
+ var specKeymaps = this.specs.filter(function (spec) { return spec.keymaps; }).map(function (spec) { return spec.keymaps(); });
1969
+ return specKeymaps.map(function (keys) {
1970
+ if (!useCommandShortcut) {
1971
+ Object.keys(keys).forEach(function (key) {
1972
+ if (!includes(defaultCommandShortcuts, key)) {
1973
+ delete keys[key];
1974
+ }
1975
+ });
1976
+ }
1977
+ return keymap(keys);
1978
+ });
1979
+ };
1980
+ SpecManager.prototype.setContext = function (context) {
1981
+ this.specs.forEach(function (spec) {
1982
+ spec.setContext(context);
1983
+ });
1984
+ };
1985
+ return SpecManager;
1986
+ }());
1921
1987
 
1922
1988
  function resolveSelectionPos(selection) {
1923
1989
  var from = selection.from, to = selection.to;
@@ -2378,34 +2444,60 @@ function getMarkForAdding(node, toastMark) {
2378
2444
  return markInfo !== null && markInfo !== void 0 ? markInfo : [];
2379
2445
  }
2380
2446
 
2447
+ var defaultToolbarStateKeys = [
2448
+ 'taskList',
2449
+ 'orderedList',
2450
+ 'bulletList',
2451
+ 'table',
2452
+ 'strong',
2453
+ 'emph',
2454
+ 'strike',
2455
+ 'heading',
2456
+ 'thematicBreak',
2457
+ 'blockQuote',
2458
+ 'code',
2459
+ 'codeBlock',
2460
+ 'indent',
2461
+ 'outdent',
2462
+ ];
2381
2463
  function getToolbarStateType$1(mdNode) {
2464
+ var type = mdNode.type;
2382
2465
  if (isListNode$1(mdNode)) {
2383
2466
  if (mdNode.listData.task) {
2384
2467
  return 'taskList';
2385
2468
  }
2386
2469
  return mdNode.listData.type === 'ordered' ? 'orderedList' : 'bulletList';
2387
2470
  }
2388
- if (mdNode.type.indexOf('table') !== -1) {
2471
+ if (type.indexOf('table') !== -1) {
2389
2472
  return 'table';
2390
2473
  }
2391
- return mdNode.type;
2474
+ if (!includes(defaultToolbarStateKeys, type)) {
2475
+ return null;
2476
+ }
2477
+ return type;
2392
2478
  }
2393
2479
  function getToolbarState$1(targetNode) {
2394
- var toolbarState = {};
2480
+ var toolbarState = {
2481
+ indent: { active: false, disabled: true },
2482
+ outdent: { active: false, disabled: true },
2483
+ };
2395
2484
  var listEnabled = true;
2396
2485
  traverseParentNodes(targetNode, function (mdNode) {
2397
2486
  var type = getToolbarStateType$1(mdNode);
2398
- if (type === 'customBlock' || type === 'image' || type === 'link') {
2487
+ if (!type) {
2399
2488
  return;
2400
2489
  }
2401
2490
  if (type === 'bulletList' || type === 'orderedList') {
2491
+ // to apply the nearlist list state in the nested list
2402
2492
  if (listEnabled) {
2403
- toolbarState[type] = true;
2493
+ toolbarState[type] = { active: true };
2494
+ toolbarState.indent.disabled = false;
2495
+ toolbarState.outdent.disabled = false;
2404
2496
  listEnabled = false;
2405
2497
  }
2406
2498
  }
2407
2499
  else {
2408
- toolbarState[type] = true;
2500
+ toolbarState[type] = { active: true };
2409
2501
  }
2410
2502
  });
2411
2503
  return toolbarState;
@@ -3766,56 +3858,6 @@ var Code$1 = /** @class */ (function (_super) {
3766
3858
  return Code;
3767
3859
  }(Mark));
3768
3860
 
3769
- var encoderList = [
3770
- {
3771
- regExp: /\(/g,
3772
- encoded: '%28',
3773
- escaped: '\\(',
3774
- },
3775
- {
3776
- regExp: /\)/g,
3777
- encoded: '%29',
3778
- escaped: '\\)',
3779
- },
3780
- {
3781
- regExp: /\[/g,
3782
- encoded: '%5B',
3783
- escaped: '\\[',
3784
- },
3785
- {
3786
- regExp: /\]/g,
3787
- encoded: '%5D',
3788
- escaped: '\\]',
3789
- },
3790
- {
3791
- regExp: /</g,
3792
- encoded: '%3C',
3793
- escaped: '\\<',
3794
- },
3795
- {
3796
- regExp: />/g,
3797
- encoded: '%3E',
3798
- escaped: '\\>',
3799
- },
3800
- {
3801
- regExp: / /g,
3802
- encoded: '%20',
3803
- escaped: ' ',
3804
- },
3805
- ];
3806
- function escapeMarkdownText(text) {
3807
- return encoderList.reduce(function (result, _a) {
3808
- var regExp = _a.regExp, escaped = _a.escaped;
3809
- return result.replace(regExp, escaped);
3810
- }, text);
3811
- }
3812
- function encodeMarkdownText(text) {
3813
- return encoderList.reduce(function (result, _a) {
3814
- var regExp = _a.regExp, encoded = _a.encoded;
3815
- return result.replace(regExp, encoded);
3816
- }, text);
3817
- }
3818
-
3819
3861
  var Link$1 = /** @class */ (function (_super) {
3820
3862
  __extends$1(Link, _super);
3821
3863
  function Link() {
@@ -3865,8 +3907,7 @@ var Link$1 = /** @class */ (function (_super) {
3865
3907
  url = imageUrl;
3866
3908
  syntax = '!';
3867
3909
  }
3868
- text = escapeMarkdownText(text);
3869
- url = encodeMarkdownText(url);
3910
+ text = escapeTextForLink(text);
3870
3911
  syntax += "[" + text + "](" + url + ")";
3871
3912
  dispatch(tr.replaceWith(from, to, createTextNode$1(schema, syntax)));
3872
3913
  return true;
@@ -4033,6 +4074,7 @@ var Html = /** @class */ (function (_super) {
4033
4074
  return Html;
4034
4075
  }(Mark));
4035
4076
 
4077
+ var customBlockSyntax = '$$';
4036
4078
  var CustomBlock$1 = /** @class */ (function (_super) {
4037
4079
  __extends$1(CustomBlock, _super);
4038
4080
  function CustomBlock() {
@@ -4056,6 +4098,22 @@ var CustomBlock$1 = /** @class */ (function (_super) {
4056
4098
  enumerable: false,
4057
4099
  configurable: true
4058
4100
  });
4101
+ CustomBlock.prototype.commands = function () {
4102
+ return function (payload) { return function (state, dispatch) {
4103
+ var selection = state.selection, schema = state.schema, tr = state.tr;
4104
+ var _a = getRangeInfo(selection), startFromOffset = _a.startFromOffset, endToOffset = _a.endToOffset;
4105
+ if (!(payload === null || payload === void 0 ? void 0 : payload.info)) {
4106
+ return false;
4107
+ }
4108
+ var customBlock = "" + customBlockSyntax + payload.info;
4109
+ var startNode = createTextNode$1(schema, customBlock);
4110
+ var endNode = createTextNode$1(schema, customBlockSyntax);
4111
+ tr.insert(startFromOffset, startNode).split(startFromOffset + customBlock.length);
4112
+ tr.split(tr.mapping.map(endToOffset)).insert(tr.mapping.map(endToOffset), endNode);
4113
+ dispatch(tr.setSelection(createTextSelection(tr, tr.mapping.map(endToOffset) - (customBlockSyntax.length + 2))));
4114
+ return true;
4115
+ }; };
4116
+ };
4059
4117
  return CustomBlock;
4060
4118
  }(Mark));
4061
4119
 
@@ -4150,10 +4208,14 @@ var MdEditor = /** @class */ (function (_super) {
4150
4208
  var clipboardData = ev.clipboardData || window.clipboardData;
4151
4209
  var items = clipboardData && clipboardData.items;
4152
4210
  if (items) {
4153
- var imageBlob = pasteImageOnly(items);
4154
- if (imageBlob) {
4155
- ev.preventDefault();
4156
- emitImageBlobHook(_this.eventEmitter, imageBlob, ev.type);
4211
+ var containRtfItem = toArray_1(items).some(function (item) { return item.kind === 'string' && item.type === 'text/rtf'; });
4212
+ // if it contains rtf, it's most likely copy paste from office -> no image
4213
+ if (!containRtfItem) {
4214
+ var imageBlob = pasteImageOnly(items);
4215
+ if (imageBlob) {
4216
+ ev.preventDefault();
4217
+ emitImageBlobHook(_this.eventEmitter, imageBlob, ev.type);
4218
+ }
4157
4219
  }
4158
4220
  }
4159
4221
  });
@@ -4200,11 +4262,11 @@ var MdEditor = /** @class */ (function (_super) {
4200
4262
  ]);
4201
4263
  };
4202
4264
  MdEditor.prototype.createPlugins = function () {
4203
- return this.defaultPlugins.concat(__spreadArray$1([
4265
+ return __spreadArray$1([
4204
4266
  syntaxHighlight(this.context),
4205
4267
  previewHighlight(this.context),
4206
4268
  smartTask(this.context)
4207
- ], this.createPluginProps()));
4269
+ ], this.createPluginProps()).concat(this.defaultPlugins);
4208
4270
  };
4209
4271
  MdEditor.prototype.createView = function () {
4210
4272
  var _this = this;
@@ -10674,7 +10736,7 @@ var InlineParser = /** @class */ (function () {
10674
10736
  var literal = textNode.literal || '';
10675
10737
  var info = literal.split(/\s/)[0];
10676
10738
  newNode.info = info;
10677
- if (literal.length === info.length + 1) {
10739
+ if (literal.length <= info.length) {
10678
10740
  textNode.unlink();
10679
10741
  }
10680
10742
  else {
@@ -13118,7 +13180,6 @@ function filterDisallowedTags(str) {
13118
13180
  return str;
13119
13181
  }
13120
13182
 
13121
- var CUSTOM_SYNTAX_LENGTH = 4;
13122
13183
  var baseConvertors$1 = {
13123
13184
  heading: function (node, _a) {
13124
13185
  var entering = _a.entering;
@@ -13309,7 +13370,7 @@ var baseConvertors$1 = {
13309
13370
  ];
13310
13371
  },
13311
13372
  customInline: function (node, context, convertors) {
13312
- var _a = node, sourcepos = _a.sourcepos, info = _a.info;
13373
+ var _a = node, info = _a.info, firstChild = _a.firstChild;
13313
13374
  var nomalizedInfo = info.trim().toLowerCase();
13314
13375
  var customConvertor = convertors[nomalizedInfo];
13315
13376
  var entering = context.entering;
@@ -13321,13 +13382,10 @@ var baseConvertors$1 = {
13321
13382
  console.warn("[@toast-ui/editor] - The error occurred when " + nomalizedInfo + " inline node was parsed in markdown renderer: " + e);
13322
13383
  }
13323
13384
  }
13324
- var text = sourcepos[1][1] - sourcepos[0][1] + 1 === info.length + CUSTOM_SYNTAX_LENGTH
13325
- ? ''
13326
- : info + " ";
13327
13385
  return entering
13328
13386
  ? [
13329
13387
  { type: 'openTag', tagName: 'span' },
13330
- { type: 'text', content: "$$" + text },
13388
+ { type: 'text', content: "$$" + info + (firstChild ? ' ' : '') },
13331
13389
  ]
13332
13390
  : [
13333
13391
  { type: 'text', content: '$$' },
@@ -15057,7 +15115,7 @@ function sanitizeHTML(html, options) {
15057
15115
 
15058
15116
  function getChildrenHTML(node, typeName) {
15059
15117
  return node
15060
- .literal.replace(new RegExp("(<\\s*" + typeName + "[^>]+?>)|(</" + typeName + "\\s*[>])", 'ig'), '')
15118
+ .literal.replace(new RegExp("(<\\s*" + typeName + "[^>]*>)|(</" + typeName + "\\s*[>])", 'ig'), '')
15061
15119
  .trim();
15062
15120
  }
15063
15121
  function getHTMLAttrsByHTMLString(html) {
@@ -15372,11 +15430,11 @@ function getAdditionalPos(scrollTop, offsetTop, height, targetNodeHeight) {
15372
15430
  var ratio = Math.min((scrollTop - offsetTop) / height, 1);
15373
15431
  return ratio * targetNodeHeight;
15374
15432
  }
15375
- function getParentNodeObj(mdNode) {
15376
- var el = document.querySelector("[data-nodeid=\"" + mdNode.id + "\"]");
15433
+ function getParentNodeObj(previewContent, mdNode) {
15434
+ var el = previewContent.querySelector("[data-nodeid=\"" + mdNode.id + "\"]");
15377
15435
  while (!el || isStyledInlineNode(mdNode)) {
15378
15436
  mdNode = mdNode.parent;
15379
- el = document.querySelector("[data-nodeid=\"" + mdNode.id + "\"]");
15437
+ el = previewContent.querySelector("[data-nodeid=\"" + mdNode.id + "\"]");
15380
15438
  }
15381
15439
  return getNonNestableNodeObj({ mdNode: mdNode, el: el });
15382
15440
  }
@@ -16076,7 +16134,10 @@ var TableOffsetMap = /** @class */ (function () {
16076
16134
  };
16077
16135
  TableOffsetMap.prototype.getNodeAndPos = function (rowIdx, colIdx) {
16078
16136
  var cellInfo = this.rowInfo[rowIdx][colIdx];
16079
- return { node: this.table.nodeAt(cellInfo.offset - 1), pos: cellInfo.offset };
16137
+ return {
16138
+ node: this.table.nodeAt(cellInfo.offset - this.tableStartOffset),
16139
+ pos: cellInfo.offset,
16140
+ };
16080
16141
  };
16081
16142
  TableOffsetMap.prototype.extendedRowspan = function (rowIdx, colIdx) {
16082
16143
  return false;
@@ -16556,7 +16617,7 @@ var Map$1 = /** @class */ (function () {
16556
16617
 
16557
16618
  /**
16558
16619
  * @fileoverview Implements i18n
16559
- * @author NHN FE Development Lab <dl_javascript@nhn.com>
16620
+ * @author NHN Cloud FE Development Lab <dl_javascript@nhn.com>
16560
16621
  */
16561
16622
  var DEFAULT_CODE = 'en-US';
16562
16623
  /**
@@ -16737,47 +16798,49 @@ function getToolbarStateType(node, parentNode) {
16737
16798
  return type;
16738
16799
  }
16739
16800
  function setListNodeToolbarState(type, nodeTypeState) {
16740
- nodeTypeState[type] = true;
16801
+ nodeTypeState[type] = { active: true };
16741
16802
  LIST_TYPES.filter(function (listName) { return listName !== type; }).forEach(function (listType) {
16742
16803
  if (nodeTypeState[listType]) {
16743
16804
  delete nodeTypeState[listType];
16744
16805
  }
16745
16806
  });
16746
16807
  }
16747
- function getMarkTypeStates(from, to, schema) {
16748
- var markTypeState = {};
16808
+ function setMarkTypeStates(from, to, schema, toolbarState) {
16749
16809
  MARK_TYPES.forEach(function (type) {
16750
16810
  var mark = schema.marks[type];
16751
16811
  var marksAtPos = from.marksAcross(to) || [];
16752
16812
  var foundMark = !!mark.isInSet(marksAtPos);
16753
16813
  if (foundMark) {
16754
- markTypeState[type] = true;
16814
+ toolbarState[type] = { active: true };
16755
16815
  }
16756
16816
  });
16757
- return markTypeState;
16758
16817
  }
16759
16818
  function getToolbarState(selection, doc, schema) {
16760
16819
  var $from = selection.$from, $to = selection.$to, from = selection.from, to = selection.to;
16761
- var nodeTypeState = {};
16762
- var markTypeState = {};
16820
+ var toolbarState = {
16821
+ indent: { active: false, disabled: true },
16822
+ outdent: { active: false, disabled: true },
16823
+ };
16763
16824
  doc.nodesBetween(from, to, function (node, _, parentNode) {
16764
16825
  var type = getToolbarStateType(node, parentNode);
16765
16826
  if (includes(EXCEPT_TYPES, type)) {
16766
16827
  return;
16767
16828
  }
16768
16829
  if (includes(LIST_TYPES, type)) {
16769
- setListNodeToolbarState(type, nodeTypeState);
16830
+ setListNodeToolbarState(type, toolbarState);
16831
+ toolbarState.indent.disabled = false;
16832
+ toolbarState.outdent.disabled = false;
16770
16833
  }
16771
16834
  else if (type === 'paragraph' || type === 'text') {
16772
- markTypeState = getMarkTypeStates($from, $to, schema);
16835
+ setMarkTypeStates($from, $to, schema, toolbarState);
16773
16836
  }
16774
16837
  else {
16775
- nodeTypeState[type] = true;
16838
+ toolbarState[type] = { active: true };
16776
16839
  }
16777
16840
  });
16778
- return __assign$1(__assign$1({}, nodeTypeState), markTypeState);
16841
+ return toolbarState;
16779
16842
  }
16780
- function toolbarState(eventEmitter) {
16843
+ function toolbarStateHighlight(eventEmitter) {
16781
16844
  return new Plugin({
16782
16845
  view: function () {
16783
16846
  return {
@@ -17041,6 +17104,7 @@ var CodeBlockView = /** @class */ (function () {
17041
17104
  this.dom = null;
17042
17105
  this.contentDOM = null;
17043
17106
  this.input = null;
17107
+ this.timer = null;
17044
17108
  this.handleMousedown = function (ev) {
17045
17109
  var target = ev.target;
17046
17110
  var style = getComputedStyle(target, ':after');
@@ -17096,7 +17160,7 @@ var CodeBlockView = /** @class */ (function () {
17096
17160
  input.type = 'text';
17097
17161
  input.value = this.node.attrs.language;
17098
17162
  wrapper.appendChild(input);
17099
- document.querySelector('.toastui-editor.ww-mode').appendChild(wrapper);
17163
+ this.view.dom.parentElement.appendChild(wrapper);
17100
17164
  var wrpperWidth = wrapper.clientWidth;
17101
17165
  css_1(wrapper, {
17102
17166
  top: top + 10 + "px",
@@ -17106,7 +17170,10 @@ var CodeBlockView = /** @class */ (function () {
17106
17170
  this.input = input;
17107
17171
  this.input.addEventListener('blur', function () { return _this.changeLanguage(); });
17108
17172
  this.input.addEventListener('keydown', this.handleKeydown);
17109
- setTimeout(function () { return _this.input.focus(); });
17173
+ this.clearTimer();
17174
+ this.timer = setTimeout(function () {
17175
+ _this.input.focus();
17176
+ });
17110
17177
  };
17111
17178
  CodeBlockView.prototype.bindDOMEvent = function () {
17112
17179
  if (this.dom) {
@@ -17139,6 +17206,12 @@ var CodeBlockView = /** @class */ (function () {
17139
17206
  removeNode$1(parent_1);
17140
17207
  }
17141
17208
  };
17209
+ CodeBlockView.prototype.clearTimer = function () {
17210
+ if (this.timer) {
17211
+ clearTimeout(this.timer);
17212
+ this.timer = null;
17213
+ }
17214
+ };
17142
17215
  CodeBlockView.prototype.stopEvent = function () {
17143
17216
  return true;
17144
17217
  };
@@ -17151,6 +17224,7 @@ var CodeBlockView = /** @class */ (function () {
17151
17224
  };
17152
17225
  CodeBlockView.prototype.destroy = function () {
17153
17226
  this.reset();
17227
+ this.clearTimer();
17154
17228
  if (this.dom) {
17155
17229
  this.dom.removeEventListener('click', this.handleMousedown);
17156
17230
  }
@@ -18183,9 +18257,10 @@ function addParagraphBeforeTable(tr, map, schema) {
18183
18257
  }
18184
18258
  return tr.setSelection(Selection.near(tableStartPos, -1));
18185
18259
  }
18186
- function addParagraphAfterTable(tr, map, schema) {
18260
+ function addParagraphAfterTable(tr, map, schema, forcedAddtion) {
18261
+ if (forcedAddtion === void 0) { forcedAddtion = false; }
18187
18262
  var tableEndPos = tr.doc.resolve(map.tableEndOffset);
18188
- if (!tableEndPos.nodeAfter) {
18263
+ if (forcedAddtion || !tableEndPos.nodeAfter) {
18189
18264
  return addParagraph(tr, tableEndPos, schema);
18190
18265
  }
18191
18266
  return tr.setSelection(Selection.near(tableEndPos, 1));
@@ -18590,6 +18665,29 @@ var Table = /** @class */ (function (_super) {
18590
18665
  return false;
18591
18666
  };
18592
18667
  };
18668
+ Table.prototype.exitTable = function () {
18669
+ return function (state, dispatch) {
18670
+ var selection = state.selection, tr = state.tr, schema = state.schema;
18671
+ var $from = selection.$from;
18672
+ var cell = findNodeBy($from, function (_a) {
18673
+ var type = _a.type;
18674
+ return type.name === 'tableHeadCell' || type.name === 'tableBodyCell';
18675
+ });
18676
+ if (cell) {
18677
+ var para = findNodeBy($from, function (_a) {
18678
+ var type = _a.type;
18679
+ return type.name === 'paragraph';
18680
+ });
18681
+ if (para) {
18682
+ var anchor = getResolvedSelection(selection).anchor;
18683
+ var map = TableOffsetMap.create(anchor);
18684
+ dispatch(addParagraphAfterTable(tr, map, schema, true));
18685
+ return true;
18686
+ }
18687
+ }
18688
+ return false;
18689
+ };
18690
+ };
18593
18691
  Table.prototype.commands = function () {
18594
18692
  return {
18595
18693
  addTable: this.addTable(),
@@ -18616,6 +18714,7 @@ var Table = /** @class */ (function (_super) {
18616
18714
  'Mod-Backspace': deleteCellContent,
18617
18715
  Delete: deleteCellContent,
18618
18716
  'Mod-Delete': deleteCellContent,
18717
+ 'Mod-Enter': this.exitTable(),
18619
18718
  };
18620
18719
  };
18621
18720
  return Table;
@@ -18844,7 +18943,7 @@ var Image = /** @class */ (function (_super) {
18844
18943
  var attrs = _a.attrs;
18845
18944
  return [
18846
18945
  attrs.rawHTML || 'img',
18847
- __assign$1(__assign$1({ src: attrs.imageUrl }, (attrs.altText && { alt: attrs.altText })), getCustomAttrs(attrs)),
18946
+ __assign$1(__assign$1({ src: escapeXml$1(attrs.imageUrl) }, (attrs.altText && { alt: attrs.altText })), getCustomAttrs(attrs)),
18848
18947
  ];
18849
18948
  },
18850
18949
  };
@@ -18859,7 +18958,7 @@ var Image = /** @class */ (function (_super) {
18859
18958
  if (!imageUrl) {
18860
18959
  return false;
18861
18960
  }
18862
- var node = schema.nodes.image.createAndFill(__assign$1({ imageUrl: escapeXml$1(imageUrl) }, (altText && { altText: altText })));
18961
+ var node = schema.nodes.image.createAndFill(__assign$1({ imageUrl: imageUrl }, (altText && { altText: altText })));
18863
18962
  dispatch(tr.replaceSelectionWith(node).scrollIntoView());
18864
18963
  return true;
18865
18964
  }; };
@@ -19104,7 +19203,7 @@ var Link = /** @class */ (function (_super) {
19104
19203
  get: function () {
19105
19204
  var _this = this;
19106
19205
  return {
19107
- attrs: __assign$1({ linkUrl: { default: '' }, linkText: { default: null }, rawHTML: { default: null } }, getDefaultCustomAttrs()),
19206
+ attrs: __assign$1({ linkUrl: { default: '' }, title: { default: null }, rawHTML: { default: null } }, getDefaultCustomAttrs()),
19108
19207
  inclusive: false,
19109
19208
  parseDOM: [
19110
19209
  {
@@ -19113,8 +19212,9 @@ var Link = /** @class */ (function (_super) {
19113
19212
  var sanitizedDOM = sanitizeHTML(dom, { RETURN_DOM_FRAGMENT: true })
19114
19213
  .firstChild;
19115
19214
  var href = sanitizedDOM.getAttribute('href') || '';
19215
+ var title = sanitizedDOM.getAttribute('title') || '';
19116
19216
  var rawHTML = sanitizedDOM.getAttribute('data-raw-html');
19117
- return __assign$1({ linkUrl: href, linkText: sanitizedDOM.textContent }, (rawHTML && { rawHTML: rawHTML }));
19217
+ return __assign$1({ linkUrl: href, title: title }, (rawHTML && { rawHTML: rawHTML }));
19118
19218
  },
19119
19219
  },
19120
19220
  ],
@@ -19122,7 +19222,7 @@ var Link = /** @class */ (function (_super) {
19122
19222
  var attrs = _a.attrs;
19123
19223
  return [
19124
19224
  attrs.rawHTML || 'a',
19125
- __assign$1(__assign$1({ href: attrs.linkUrl }, _this.linkAttributes), getCustomAttrs(attrs)),
19225
+ __assign$1(__assign$1({ href: escapeXml$1(attrs.linkUrl) }, _this.linkAttributes), getCustomAttrs(attrs)),
19126
19226
  ];
19127
19227
  },
19128
19228
  };
@@ -19136,10 +19236,7 @@ var Link = /** @class */ (function (_super) {
19136
19236
  var schema = state.schema, tr = state.tr, selection = state.selection;
19137
19237
  var empty = selection.empty, from = selection.from, to = selection.to;
19138
19238
  if (from && to && linkUrl) {
19139
- var attrs = {
19140
- linkUrl: escapeXml$1(linkUrl),
19141
- linkText: escapeMarkdownText(linkText),
19142
- };
19239
+ var attrs = { linkUrl: linkUrl };
19143
19240
  var mark = schema.mark('link', attrs);
19144
19241
  if (empty && linkText) {
19145
19242
  var node = createTextNode$1(schema, linkText, mark);
@@ -19256,6 +19353,13 @@ var CustomBlock = /** @class */ (function (_super) {
19256
19353
  enumerable: false,
19257
19354
  configurable: true
19258
19355
  });
19356
+ CustomBlock.prototype.commands = function () {
19357
+ return function (payload) { return function (state, dispatch) {
19358
+ return (payload === null || payload === void 0 ? void 0 : payload.info)
19359
+ ? setBlockType(state.schema.nodes.customBlock, payload)(state, dispatch)
19360
+ : false;
19361
+ }; };
19362
+ };
19259
19363
  return CustomBlock;
19260
19364
  }(Node$2));
19261
19365
 
@@ -19277,8 +19381,10 @@ var FrontMatter = /** @class */ (function (_super) {
19277
19381
  content: 'text*',
19278
19382
  group: 'block',
19279
19383
  code: true,
19384
+ defining: true,
19280
19385
  parseDOM: [
19281
19386
  {
19387
+ preserveWhitespace: 'full',
19282
19388
  tag: 'div[data-front-matter]',
19283
19389
  },
19284
19390
  ],
@@ -19307,6 +19413,51 @@ var FrontMatter = /** @class */ (function (_super) {
19307
19413
  return FrontMatter;
19308
19414
  }(Node$2));
19309
19415
 
19416
+ var HTMLComment = /** @class */ (function (_super) {
19417
+ __extends$1(HTMLComment, _super);
19418
+ function HTMLComment() {
19419
+ return _super !== null && _super.apply(this, arguments) || this;
19420
+ }
19421
+ Object.defineProperty(HTMLComment.prototype, "name", {
19422
+ get: function () {
19423
+ return 'htmlComment';
19424
+ },
19425
+ enumerable: false,
19426
+ configurable: true
19427
+ });
19428
+ Object.defineProperty(HTMLComment.prototype, "schema", {
19429
+ get: function () {
19430
+ return {
19431
+ content: 'text*',
19432
+ group: 'block',
19433
+ code: true,
19434
+ defining: true,
19435
+ parseDOM: [{ preserveWhitespace: 'full', tag: 'div[data-html-comment]' }],
19436
+ toDOM: function () {
19437
+ return ['div', { 'data-html-comment': 'true' }, 0];
19438
+ },
19439
+ };
19440
+ },
19441
+ enumerable: false,
19442
+ configurable: true
19443
+ });
19444
+ HTMLComment.prototype.commands = function () {
19445
+ return function () { return function (state, dispatch, view) {
19446
+ var $from = state.selection.$from;
19447
+ if (view.endOfTextblock('down') && $from.node().type.name === 'htmlComment') {
19448
+ return exitCode(state, dispatch);
19449
+ }
19450
+ return false;
19451
+ }; };
19452
+ };
19453
+ HTMLComment.prototype.keymaps = function () {
19454
+ return {
19455
+ Enter: this.commands()(),
19456
+ };
19457
+ };
19458
+ return HTMLComment;
19459
+ }(Node$2));
19460
+
19310
19461
  function createSpecs(linkAttributes) {
19311
19462
  return new SpecManager([
19312
19463
  new Doc(),
@@ -19334,6 +19485,7 @@ function createSpecs(linkAttributes) {
19334
19485
  new CustomBlock(),
19335
19486
  new FrontMatter(),
19336
19487
  new Widget(),
19488
+ new HTMLComment(),
19337
19489
  ]);
19338
19490
  }
19339
19491
 
@@ -19375,12 +19527,12 @@ var WysiwygEditor = /** @class */ (function (_super) {
19375
19527
  });
19376
19528
  };
19377
19529
  WysiwygEditor.prototype.createPlugins = function () {
19378
- return this.defaultPlugins.concat(__spreadArray$1([
19530
+ return __spreadArray$1([
19379
19531
  tableSelection(),
19380
19532
  tableContextMenu(this.eventEmitter),
19381
19533
  task(),
19382
- toolbarState(this.eventEmitter)
19383
- ], this.createPluginProps()));
19534
+ toolbarStateHighlight(this.eventEmitter)
19535
+ ], this.createPluginProps()).concat(this.defaultPlugins);
19384
19536
  };
19385
19537
  WysiwygEditor.prototype.createPluginNodeViews = function () {
19386
19538
  var _a = this, eventEmitter = _a.eventEmitter, pluginNodeViews = _a.pluginNodeViews;
@@ -19430,11 +19582,15 @@ var WysiwygEditor = /** @class */ (function (_super) {
19430
19582
  paste: function (_, ev) {
19431
19583
  var clipboardData = ev.clipboardData || window.clipboardData;
19432
19584
  var items = clipboardData === null || clipboardData === void 0 ? void 0 : clipboardData.items;
19433
- if ((items === null || items === void 0 ? void 0 : items.length) === 1) {
19434
- var imageBlob = pasteImageOnly(items);
19435
- if (imageBlob) {
19436
- ev.preventDefault();
19437
- emitImageBlobHook(_this.eventEmitter, imageBlob, ev.type);
19585
+ if (items) {
19586
+ var containRtfItem = toArray_1(items).some(function (item) { return item.kind === 'string' && item.type === 'text/rtf'; });
19587
+ // if it contains rtf, it's most likely copy paste from office -> no image
19588
+ if (!containRtfItem) {
19589
+ var imageBlob = pasteImageOnly(items);
19590
+ if (imageBlob) {
19591
+ ev.preventDefault();
19592
+ emitImageBlobHook(_this.eventEmitter, imageBlob, ev.type);
19593
+ }
19438
19594
  }
19439
19595
  }
19440
19596
  return false;
@@ -19649,6 +19805,7 @@ var eventTypeList = [
19649
19805
  'beforePreviewRender',
19650
19806
  'beforeConvertWysiwygToMarkdown',
19651
19807
  'load',
19808
+ 'loadUI',
19652
19809
  'change',
19653
19810
  'caretChange',
19654
19811
  'destroy',
@@ -20211,7 +20368,7 @@ var toWwConvertors = {
20211
20368
  var link = state.schema.marks.link;
20212
20369
  var _b = node, destination = _b.destination, title = _b.title;
20213
20370
  if (entering) {
20214
- var attrs = __assign$1(__assign$1({ linkUrl: destination }, (title && { linkText: title })), customAttrs);
20371
+ var attrs = __assign$1({ linkUrl: destination, title: title }, customAttrs);
20215
20372
  state.openMark(link.create(attrs));
20216
20373
  }
20217
20374
  else {
@@ -20267,37 +20424,32 @@ var toWwConvertors = {
20267
20424
  }
20268
20425
  },
20269
20426
  tableCell: function (state, node, _a) {
20270
- var _b;
20271
20427
  var entering = _a.entering;
20272
- var _c = state.schema.nodes, tableHeadCell = _c.tableHeadCell, tableBodyCell = _c.tableBodyCell, paragraph = _c.paragraph;
20273
- var tablePart = node.parent.parent;
20274
- var cell = tablePart.type === 'tableHead' ? tableHeadCell : tableBodyCell;
20275
- var hasParaNode = function (childNode) {
20276
- return childNode && (isInlineNode(childNode) || isCustomHTMLInlineNode(state, childNode));
20277
- };
20278
- if (entering) {
20279
- var attrs = null;
20280
- if (!node.ignored) {
20428
+ if (!node.ignored) {
20429
+ var hasParaNode = function (childNode) {
20430
+ return childNode && (isInlineNode(childNode) || isCustomHTMLInlineNode(state, childNode));
20431
+ };
20432
+ if (entering) {
20433
+ var _b = state.schema.nodes, tableHeadCell = _b.tableHeadCell, tableBodyCell = _b.tableBodyCell, paragraph = _b.paragraph;
20434
+ var tablePart = node.parent.parent;
20435
+ var cell = tablePart.type === 'tableHead' ? tableHeadCell : tableBodyCell;
20281
20436
  var table = tablePart.parent;
20282
- var startIdx = node.startIdx;
20283
- if (table.columns.length > startIdx) {
20284
- var align = table.columns[startIdx].align;
20285
- attrs = (_b = node.attrs) !== null && _b !== void 0 ? _b : {};
20286
- if (align) {
20287
- attrs.align = align;
20288
- }
20437
+ var align = (table.columns[node.startIdx] || {}).align;
20438
+ var attrs = __assign$1({}, node.attrs);
20439
+ if (align) {
20440
+ attrs.align = align;
20441
+ }
20442
+ state.openNode(cell, attrs);
20443
+ if (hasParaNode(node.firstChild)) {
20444
+ state.openNode(paragraph);
20289
20445
  }
20290
20446
  }
20291
- state.openNode(cell, attrs);
20292
- if (hasParaNode(node.firstChild)) {
20293
- state.openNode(paragraph);
20294
- }
20295
- }
20296
- else {
20297
- if (hasParaNode(node.lastChild)) {
20447
+ else {
20448
+ if (hasParaNode(node.lastChild)) {
20449
+ state.closeNode();
20450
+ }
20298
20451
  state.closeNode();
20299
20452
  }
20300
- state.closeNode();
20301
20453
  }
20302
20454
  },
20303
20455
  strike: function (state, _, _a, customAttrs) {
@@ -20360,26 +20512,34 @@ var toWwConvertors = {
20360
20512
  htmlBlock: function (state, node) {
20361
20513
  var html = node.literal;
20362
20514
  var container = document.createElement('div');
20363
- var matched = html.match(reHTMLTag);
20364
- var openTagName = matched[1], closeTagName = matched[3];
20365
- var typeName = (openTagName || closeTagName).toLowerCase();
20366
- var nodeType = state.schema.nodes[typeName];
20367
- var sanitizedHTML = sanitizeHTML(html);
20368
- // for user defined html schema
20369
- if (nodeType === null || nodeType === void 0 ? void 0 : nodeType.spec.attrs.htmlBlock) {
20370
- var htmlAttrs = getHTMLAttrsByHTMLString(sanitizedHTML);
20371
- var childrenHTML = getChildrenHTML(node, typeName);
20372
- state.addNode(nodeType, { htmlAttrs: htmlAttrs, childrenHTML: childrenHTML });
20515
+ var isHTMLComment = reHTMLComment.test(html);
20516
+ if (isHTMLComment) {
20517
+ state.openNode(state.schema.nodes.htmlComment);
20518
+ state.addText(node.literal);
20519
+ state.closeNode();
20373
20520
  }
20374
20521
  else {
20375
- container.innerHTML = sanitizedHTML;
20376
- addRawHTMLAttributeToDOM(container);
20377
- state.convertByDOMParser(container);
20522
+ var matched = html.match(reHTMLTag);
20523
+ var openTagName = matched[1], closeTagName = matched[3];
20524
+ var typeName = (openTagName || closeTagName).toLowerCase();
20525
+ var nodeType = state.schema.nodes[typeName];
20526
+ var sanitizedHTML = sanitizeHTML(html);
20527
+ // for user defined html schema
20528
+ if (nodeType === null || nodeType === void 0 ? void 0 : nodeType.spec.attrs.htmlBlock) {
20529
+ var htmlAttrs = getHTMLAttrsByHTMLString(sanitizedHTML);
20530
+ var childrenHTML = getChildrenHTML(node, typeName);
20531
+ state.addNode(nodeType, { htmlAttrs: htmlAttrs, childrenHTML: childrenHTML });
20532
+ }
20533
+ else {
20534
+ container.innerHTML = sanitizedHTML;
20535
+ addRawHTMLAttributeToDOM(container);
20536
+ state.convertByDOMParser(container);
20537
+ }
20378
20538
  }
20379
20539
  },
20380
20540
  customInline: function (state, node, _a) {
20381
20541
  var entering = _a.entering, skipChildren = _a.skipChildren;
20382
- var info = node.info;
20542
+ var _b = node, info = _b.info, firstChild = _b.firstChild;
20383
20543
  var schema = state.schema;
20384
20544
  if (info.indexOf('widget') !== -1 && entering) {
20385
20545
  var content = getWidgetContent(node);
@@ -20388,6 +20548,13 @@ var toWwConvertors = {
20388
20548
  schema.text(createWidgetContent(info, content)),
20389
20549
  ]);
20390
20550
  }
20551
+ else {
20552
+ var text = '$$';
20553
+ if (entering) {
20554
+ text += firstChild ? info + " " : info;
20555
+ }
20556
+ state.addText(text);
20557
+ }
20391
20558
  },
20392
20559
  };
20393
20560
  function createWwConvertors(customConvertors) {
@@ -20403,7 +20570,7 @@ function createWwConvertors(customConvertors) {
20403
20570
  var wwConvertor = toWwConvertors[type];
20404
20571
  if (wwConvertor && !includes(['htmlBlock', 'htmlInline'], type)) {
20405
20572
  convertors[type] = function (state, node, context) {
20406
- context.origin = function () { return orgConvertors[type](node, context); };
20573
+ context.origin = function () { return orgConvertors[type](node, context, orgConvertors); };
20407
20574
  var tokens = customConvertors[type](node, context);
20408
20575
  var attrs;
20409
20576
  if (tokens) {
@@ -20593,7 +20760,13 @@ var nodeTypeWriters = {
20593
20760
  text: function (state, _a) {
20594
20761
  var _b;
20595
20762
  var node = _a.node;
20596
- state.text((_b = node.text) !== null && _b !== void 0 ? _b : '');
20763
+ var text = (_b = node.text) !== null && _b !== void 0 ? _b : '';
20764
+ if ((node.marks || []).some(function (mark) { return mark.type.name === 'link'; })) {
20765
+ state.text(escapeTextForLink(text), false);
20766
+ }
20767
+ else {
20768
+ state.text(text);
20769
+ }
20597
20770
  },
20598
20771
  paragraph: function (state, _a) {
20599
20772
  var node = _a.node, parent = _a.parent, _b = _a.index, index = _b === void 0 ? 0 : _b;
@@ -20758,9 +20931,19 @@ var nodeTypeWriters = {
20758
20931
  var text = _a.text;
20759
20932
  state.write(text);
20760
20933
  },
20761
- html: function (state, _, _a) {
20762
- var text = _a.text;
20934
+ html: function (state, _a, _b) {
20935
+ var node = _a.node;
20936
+ var text = _b.text;
20763
20937
  state.write(text);
20938
+ if (node.attrs.htmlBlock) {
20939
+ state.closeBlock(node);
20940
+ }
20941
+ },
20942
+ htmlComment: function (state, _a, _b) {
20943
+ var node = _a.node;
20944
+ var text = _b.text;
20945
+ state.write(text);
20946
+ state.closeBlock(node);
20764
20947
  },
20765
20948
  };
20766
20949
  function write(type, _a) {
@@ -20917,13 +21100,13 @@ var toMdConvertors = {
20917
21100
  image: function (_a) {
20918
21101
  var node = _a.node;
20919
21102
  var attrs = node.attrs;
20920
- var altText = escape$1(attrs.altText || '');
20921
- var imageUrl = escapeXml$1(attrs.imageUrl);
20922
- var altAttr = altText ? " alt=\"" + altText + "\"" : '';
21103
+ var rawHTML = attrs.rawHTML, altText = attrs.altText;
21104
+ var imageUrl = attrs.imageUrl.replace(/&amp;/g, '&');
21105
+ var altAttr = altText ? " alt=\"" + escapeXml$1(altText) + "\"" : '';
20923
21106
  return {
20924
- rawHTML: attrs.rawHTML ? "<" + attrs.rawHTML + " src=\"" + imageUrl + "\"" + altAttr + ">" : null,
21107
+ rawHTML: rawHTML ? "<" + rawHTML + " src=\"" + escapeXml$1(imageUrl) + "\"" + altAttr + ">" : null,
20925
21108
  attrs: {
20926
- altText: altText,
21109
+ altText: escapeTextForLink(altText || ''),
20927
21110
  imageUrl: imageUrl,
20928
21111
  },
20929
21112
  };
@@ -20986,17 +21169,17 @@ var toMdConvertors = {
20986
21169
  var node = _a.node;
20987
21170
  var entering = _b.entering;
20988
21171
  var attrs = node.attrs;
20989
- var linkUrl = escapeXml$1(attrs.linkUrl);
20990
- var rawHTML = attrs.rawHTML;
21172
+ var title = attrs.title, rawHTML = attrs.rawHTML;
21173
+ var linkUrl = attrs.linkUrl.replace(/&amp;/g, '&');
21174
+ var titleAttr = title ? " title=\"" + escapeXml$1(title) + "\"" : '';
20991
21175
  if (entering) {
20992
21176
  return {
20993
21177
  delim: '[',
20994
- rawHTML: rawHTML ? "<" + rawHTML + " href=\"" + linkUrl + "\">" : null,
21178
+ rawHTML: rawHTML ? "<" + rawHTML + " href=\"" + escapeXml$1(linkUrl) + "\"" + titleAttr + ">" : null,
20995
21179
  };
20996
21180
  }
20997
- var linkText = attrs.title ? " " + quote(attrs.linkText) : '';
20998
21181
  return {
20999
- delim: "](" + linkText + linkUrl + ")",
21182
+ delim: "](" + linkUrl + (title ? " " + quote(escapeTextForLink(title)) : '') + ")",
21000
21183
  rawHTML: getCloseRawHTML(rawHTML),
21001
21184
  };
21002
21185
  },
@@ -21014,6 +21197,12 @@ var toMdConvertors = {
21014
21197
  rawHTML: rawHTML,
21015
21198
  };
21016
21199
  },
21200
+ htmlComment: function (_a) {
21201
+ var node = _a.node;
21202
+ return {
21203
+ text: node.textContent,
21204
+ };
21205
+ },
21017
21206
  // html inline node, html block node
21018
21207
  html: function (_a, _b) {
21019
21208
  var node = _a.node;
@@ -21426,10 +21615,11 @@ var Convertor = /** @class */ (function () {
21426
21615
  }());
21427
21616
 
21428
21617
  function execPlugin(plugin, eventEmitter, usageStatistics) {
21429
- var pmState = { Plugin: Plugin, Selection: Selection, TextSelection: TextSelection };
21618
+ var pmState = { Plugin: Plugin, PluginKey: PluginKey, Selection: Selection, TextSelection: TextSelection };
21430
21619
  var pmView = { Decoration: Decoration, DecorationSet: DecorationSet };
21431
21620
  var pmModel = { Fragment: Fragment };
21432
- var context = { eventEmitter: eventEmitter, usageStatistics: usageStatistics, pmState: pmState, pmView: pmView, pmModel: pmModel, i18n: i18n };
21621
+ var pmRules = { InputRule: InputRule, inputRules: inputRules, undoInputRule: undoInputRule };
21622
+ var context = { eventEmitter: eventEmitter, usageStatistics: usageStatistics, pmState: pmState, pmView: pmView, pmModel: pmModel, pmRules: pmRules, i18n: i18n };
21433
21623
  if (isArray_1(plugin)) {
21434
21624
  var pluginFn = plugin[0], _a = plugin[1], options = _a === void 0 ? {} : _a;
21435
21625
  return pluginFn(context, options);
@@ -21584,6 +21774,10 @@ var ToastUIEditorViewer = /** @class */ (function () {
21584
21774
  element.hasAttribute(TASK_ATTR_NAME) &&
21585
21775
  isPositionInBox(style, ev.offsetX, ev.offsetY)) {
21586
21776
  toggleClass(element, TASK_CHECKED_CLASS_NAME);
21777
+ this.eventEmitter.emit('change', {
21778
+ source: 'viewer',
21779
+ date: ev,
21780
+ });
21587
21781
  }
21588
21782
  };
21589
21783
  /**
@@ -21690,7 +21884,7 @@ function createMdLikeNode(node) {
21690
21884
  };
21691
21885
  var nodeTypeMap = {
21692
21886
  heading: { level: attrs.level },
21693
- link: { destination: attrs.linkUrl, title: attrs.linkText },
21887
+ link: { destination: attrs.linkUrl, title: attrs.title },
21694
21888
  image: { destination: attrs.imageUrl },
21695
21889
  codeBlock: { info: attrs.language },
21696
21890
  bulletList: { type: 'list', listData: { type: 'bullet' } },
@@ -21828,6 +22022,7 @@ var ScrollSync = /** @class */ (function () {
21828
22022
  this.latestPreviewScrollTop = null;
21829
22023
  this.blockedScroll = null;
21830
22024
  this.active = true;
22025
+ this.timer = null;
21831
22026
  var previewRoot = preview.previewContent, previewEl = preview.el;
21832
22027
  this.previewRoot = previewRoot;
21833
22028
  this.previewEl = previewEl;
@@ -21840,10 +22035,11 @@ var ScrollSync = /** @class */ (function () {
21840
22035
  ScrollSync.prototype.addScrollSyncEvent = function () {
21841
22036
  var _this = this;
21842
22037
  this.eventEmitter.listen('afterPreviewRender', function () {
22038
+ _this.clearTimer();
21843
22039
  // Immediately after the 'afterPreviewRender' event has occurred,
21844
22040
  // browser rendering is not yet complete.
21845
22041
  // So the size of elements can not be accurately measured.
21846
- setTimeout(function () {
22042
+ _this.timer = setTimeout(function () {
21847
22043
  _this.syncPreviewScrollTop(true);
21848
22044
  }, 200);
21849
22045
  });
@@ -21870,7 +22066,7 @@ var ScrollSync = /** @class */ (function () {
21870
22066
  var pos = this.mdEditor.getSelection();
21871
22067
  var firstMdNode = this.toastMark.findFirstNodeAtLine(pos[0][0]);
21872
22068
  var previewHeight = this.previewEl.clientHeight;
21873
- var el = getParentNodeObj(firstMdNode).el;
22069
+ var el = getParentNodeObj(this.previewRoot, firstMdNode).el;
21874
22070
  var totalOffsetTop = getTotalOffsetTop(el, this.previewRoot) || el.offsetTop;
21875
22071
  var nodeHeight = el.clientHeight;
21876
22072
  // multiply 0.5 for calculating the position in the middle of preview area
@@ -21902,7 +22098,7 @@ var ScrollSync = /** @class */ (function () {
21902
22098
  targetScrollTop = scrollTopByEditing;
21903
22099
  }
21904
22100
  else {
21905
- var _d = getParentNodeObj(firstMdNode), el = _d.el, mdNode = _d.mdNode;
22101
+ var _d = getParentNodeObj(this.previewRoot, firstMdNode), el = _d.el, mdNode = _d.mdNode;
21906
22102
  var _e = getEditorRangeHeightInfo(doc, mdNode, children), height = _e.height, rect = _e.rect;
21907
22103
  var totalOffsetTop = getTotalOffsetTop(el, previewRoot) || el.offsetTop;
21908
22104
  var nodeHeight = el.clientHeight;
@@ -21930,7 +22126,7 @@ var ScrollSync = /** @class */ (function () {
21930
22126
  }
21931
22127
  var children = dom.children;
21932
22128
  var mdNodeId = Number(targetNode.getAttribute('data-nodeid'));
21933
- var _b = getParentNodeObj(toastMark.findNodeById(mdNodeId)), mdNode = _b.mdNode, el = _b.el;
22129
+ var _b = getParentNodeObj(this.previewRoot, toastMark.findNodeById(mdNodeId)), mdNode = _b.mdNode, el = _b.el;
21934
22130
  var mdNodeStartLine = getMdStartLine(mdNode);
21935
22131
  targetScrollTop = children[mdNodeStartLine - 1].offsetTop;
21936
22132
  var height = getEditorRangeHeightInfo(state.doc, mdNode, children).height;
@@ -21969,7 +22165,14 @@ var ScrollSync = /** @class */ (function () {
21969
22165
  };
21970
22166
  animate(curScrollTop, targetScrollTop, syncCallbacks);
21971
22167
  };
22168
+ ScrollSync.prototype.clearTimer = function () {
22169
+ if (this.timer) {
22170
+ clearTimeout(this.timer);
22171
+ this.timer = null;
22172
+ }
22173
+ };
21972
22174
  ScrollSync.prototype.destroy = function () {
22175
+ this.clearTimer();
21973
22176
  this.eventEmitter.removeEventHandler('scroll');
21974
22177
  this.eventEmitter.removeEventHandler('afterPreviewRender');
21975
22178
  };
@@ -22133,7 +22336,15 @@ var ToastUIEditorCore = /** @class */ (function () {
22133
22336
  this.moveCursorToStart(this.options.autofocus);
22134
22337
  }
22135
22338
  ToastUIEditorCore.prototype.addInitEvent = function () {
22339
+ var _this = this;
22136
22340
  this.on('needChangeMode', this.changeMode.bind(this));
22341
+ this.on('loadUI', function () {
22342
+ if (_this.height !== 'auto') {
22343
+ // 75px equals default editor ui height - the editing area height
22344
+ var minHeight = Math.min(parseInt(_this.minHeight, 10), parseInt(_this.height, 10) - 75) + "px";
22345
+ _this.setMinHeight(minHeight);
22346
+ }
22347
+ });
22137
22348
  addDefaultImageBlobHook(this.eventEmitter);
22138
22349
  };
22139
22350
  ToastUIEditorCore.prototype.addInitCommand = function (mdCommands, wwCommands) {
@@ -22317,7 +22528,12 @@ var ToastUIEditorCore = /** @class */ (function () {
22317
22528
  _this.wwEditor.setModel(wwNode);
22318
22529
  }
22319
22530
  });
22320
- return this.wwEditor.view.dom.innerHTML;
22531
+ var html = this.wwEditor.view.dom.innerHTML;
22532
+ if (this.placeholder) {
22533
+ var rePlaceholder = new RegExp("<span class=\"placeholder[^>]+>" + this.placeholder + "</span>", 'i');
22534
+ return html.replace(rePlaceholder, '');
22535
+ }
22536
+ return html;
22321
22537
  };
22322
22538
  /**
22323
22539
  * Insert text
@@ -22405,12 +22621,11 @@ var ToastUIEditorCore = /** @class */ (function () {
22405
22621
  if (isString_1(height)) {
22406
22622
  if (height === 'auto') {
22407
22623
  addClass_1(el, 'auto-height');
22408
- this.setMinHeight(this.getMinHeight());
22409
22624
  }
22410
22625
  else {
22411
22626
  removeClass_1(el, 'auto-height');
22412
- this.setMinHeight(height);
22413
22627
  }
22628
+ this.setMinHeight(this.getMinHeight());
22414
22629
  }
22415
22630
  css_1(el, { height: height });
22416
22631
  this.height = height;
@@ -22427,16 +22642,18 @@ var ToastUIEditorCore = /** @class */ (function () {
22427
22642
  * @param {string} minHeight - min content height in pixel
22428
22643
  */
22429
22644
  ToastUIEditorCore.prototype.setMinHeight = function (minHeight) {
22430
- var _a;
22431
- this.minHeight = minHeight;
22432
- var editorHeight = this.options.el.clientHeight;
22433
- var editorSectionHeight = ((_a = document.querySelector("." + cls('main'))) === null || _a === void 0 ? void 0 : _a.clientHeight) || 0;
22434
- var diffHeight = editorHeight - editorSectionHeight;
22435
- var minHeightNum = parseInt(minHeight, 10);
22436
- minHeightNum = Math.max(minHeightNum - diffHeight, 0);
22437
- this.wwEditor.setMinHeight(minHeightNum);
22438
- this.mdEditor.setMinHeight(minHeightNum);
22439
- this.preview.setMinHeight(minHeightNum);
22645
+ if (minHeight !== this.minHeight) {
22646
+ var height = this.height || this.options.height;
22647
+ if (height !== 'auto' && this.options.el.querySelector("." + cls('main'))) {
22648
+ // 75px equals default editor ui height - the editing area height
22649
+ minHeight = Math.min(parseInt(minHeight, 10), parseInt(height, 10) - 75) + "px";
22650
+ }
22651
+ var minHeightNum = parseInt(minHeight, 10);
22652
+ this.minHeight = minHeight;
22653
+ this.wwEditor.setMinHeight(minHeightNum);
22654
+ this.mdEditor.setMinHeight(minHeightNum);
22655
+ this.preview.setMinHeight(minHeightNum);
22656
+ }
22440
22657
  };
22441
22658
  /**
22442
22659
  * Get minimum height of editor content
@@ -22572,6 +22789,7 @@ var ToastUIEditorCore = /** @class */ (function () {
22572
22789
  * @param {string} placeholder - placeholder to set
22573
22790
  */
22574
22791
  ToastUIEditorCore.prototype.setPlaceholder = function (placeholder) {
22792
+ this.placeholder = placeholder;
22575
22793
  this.mdEditor.setPlaceholder(placeholder);
22576
22794
  this.wwEditor.setPlaceholder(placeholder);
22577
22795
  };
@@ -24657,6 +24875,7 @@ function createDefaultToolbarItemInfo(type) {
24657
24875
  className: 'indent',
24658
24876
  command: 'indent',
24659
24877
  tooltip: i18n.get('Indent'),
24878
+ state: 'indent',
24660
24879
  };
24661
24880
  break;
24662
24881
  case 'outdent':
@@ -24665,6 +24884,7 @@ function createDefaultToolbarItemInfo(type) {
24665
24884
  className: 'outdent',
24666
24885
  command: 'outdent',
24667
24886
  tooltip: i18n.get('Outdent'),
24887
+ state: 'outdent',
24668
24888
  };
24669
24889
  break;
24670
24890
  case 'scrollSync':
@@ -24815,7 +25035,7 @@ function connectHOC(WrappedComponent) {
24815
25035
  _this.hideTooltip = function () {
24816
25036
  css_1(_this.props.tooltipRef.current, 'display', 'none');
24817
25037
  };
24818
- _this.state = { active: false };
25038
+ _this.state = { active: false, disabled: props.disabled };
24819
25039
  _this.addEvent();
24820
25040
  return _this;
24821
25041
  }
@@ -24824,9 +25044,10 @@ function connectHOC(WrappedComponent) {
24824
25044
  var _a = this.props, item = _a.item, eventEmitter = _a.eventEmitter;
24825
25045
  if (item.state) {
24826
25046
  eventEmitter.listen('changeToolbarState', function (_a) {
25047
+ var _b;
24827
25048
  var toolbarState = _a.toolbarState;
24828
- var active = !!toolbarState[item.state];
24829
- _this.setState({ active: active });
25049
+ var _c = (_b = toolbarState[item.state]) !== null && _b !== void 0 ? _b : {}, active = _c.active, disabled = _c.disabled;
25050
+ _this.setState({ active: !!active, disabled: disabled !== null && disabled !== void 0 ? disabled : _this.props.disabled });
24830
25051
  });
24831
25052
  }
24832
25053
  };
@@ -24835,7 +25056,7 @@ function connectHOC(WrappedComponent) {
24835
25056
  return { left: offsetLeft, top: el.offsetHeight + offsetTop };
24836
25057
  };
24837
25058
  ButtonHOC.prototype.render = function () {
24838
- return html(templateObject_1$8 || (templateObject_1$8 = __makeTemplateObject(["\n <", "\n ...", "\n active=", "\n showTooltip=", "\n hideTooltip=", "\n getBound=", "\n />\n "], ["\n <", "\n ...", "\n active=", "\n showTooltip=", "\n hideTooltip=", "\n getBound=", "\n />\n "])), WrappedComponent, this.props, this.state.active, this.showTooltip, this.hideTooltip, this.getBound);
25059
+ return html(templateObject_1$8 || (templateObject_1$8 = __makeTemplateObject(["\n <", "\n ...", "\n active=", "\n showTooltip=", "\n hideTooltip=", "\n getBound=", "\n disabled=", "\n />\n "], ["\n <", "\n ...", "\n active=", "\n showTooltip=", "\n hideTooltip=", "\n getBound=", "\n disabled=", "\n />\n "])), WrappedComponent, this.props, this.state.active, this.showTooltip, this.hideTooltip, this.getBound, this.state.disabled || this.props.disabled);
24839
25060
  };
24840
25061
  return ButtonHOC;
24841
25062
  }(Component));
@@ -25046,7 +25267,7 @@ var Toolbar = /** @class */ (function (_super) {
25046
25267
  };
25047
25268
  _this.openPopup = function (popupName, initialValues) {
25048
25269
  if (initialValues === void 0) { initialValues = {}; }
25049
- var el = document.querySelector("." + cls('toolbar-group') + " ." + popupName);
25270
+ var el = _this.refs.el.querySelector("." + cls('toolbar-group') + " ." + popupName);
25050
25271
  if (el) {
25051
25272
  var _a = getTotalOffset(el, closest(el, "." + cls('toolbar'))), offsetLeft = _a.offsetLeft, offsetTop = _a.offsetTop;
25052
25273
  var info = createPopupInfo(popupName, {
@@ -25389,6 +25610,7 @@ var ToastUIEditor = /** @class */ (function (_super) {
25389
25610
  var groupIndex = toolbarItem.groupIndex, itemIndex = toolbarItem.itemIndex, item = toolbarItem.item;
25390
25611
  _this.defaultUI.insertToolbarItem({ groupIndex: groupIndex, itemIndex: itemIndex }, item);
25391
25612
  });
25613
+ _this.eventEmitter.emit('loadUI', _this);
25392
25614
  return _this;
25393
25615
  }
25394
25616
  /**
@@ -25427,7 +25649,7 @@ var templateObject_1;
25427
25649
 
25428
25650
  /**
25429
25651
  * @fileoverview I18N for English
25430
- * @author NHN FE Development Lab <dl_javascript@nhn.com>
25652
+ * @author NHN Cloud FE Development Lab <dl_javascript@nhn.com>
25431
25653
  */
25432
25654
  ToastUIEditorCore.setLanguage(['en', 'en-US'], {
25433
25655
  Markdown: 'Markdown',
@@ -25480,5 +25702,4 @@ ToastUIEditorCore.setLanguage(['en', 'en-US'], {
25480
25702
  'Choose language': 'Choose language',
25481
25703
  });
25482
25704
 
25483
- export default ToastUIEditor;
25484
- export { ToastUIEditor as Editor, ToastUIEditorCore as EditorCore };
25705
+ export { ToastUIEditor as Editor, ToastUIEditorCore as EditorCore, ToastUIEditor as default };