PageSourceSearch

https://pawtul.com/static/vendor/summernote/summernote-lite.js

js pawtul.com collected 2026-10-02 01:39:16 UTC 355,299 bytes, 10,782 lines download raw bytes

vendor: 4,336 bytes, lines 1-111
1/*!
2 * 
3 * Super simple wysiwyg editor v0.8.18
4 * https://summernote.org
5 * 
6 * 
7 * Copyright 2013- Alan Hong. and other contributors
8 * summernote may be freely distributed under the MIT license.
9 * 
10 * Date: 2020-05-20T18:09Z
11 * 
12 */
13(function webpackUniversalModuleDefinition(root, factory) {
14	if(typeof exports === 'object' && typeof module === 'object')
15		module.exports = factory(require("jquery"));
16	else if(typeof define === 'function' && define.amd)
17		define(["jquery"], factory);
18	else {
19		var a = typeof exports === 'object' ? factory(require("jquery")) : factory(root["jQuery"]);
20		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
21	}
22})(window, function(__WEBPACK_EXTERNAL_MODULE__0__) {
23return /******/ (function(modules) { // webpackBootstrap
24/******/ 	// The module cache
25/******/ 	var installedModules = {};
26/******/
27/******/ 	// The require function
28/******/ 	function __webpack_require__(moduleId) {
29/******/
30/******/ 		// Check if module is in cache
31/******/ 		if(installedModules[moduleId]) {
32/******/ 			return installedModules[moduleId].exports;
33/******/ 		}
34/******/ 		// Create a new module (and put it into the cache)
35/******/ 		var module = installedModules[moduleId] = {
36/******/ 			i: moduleId,
37/******/ 			l: false,
38/******/ 			exports: {}
39/******/ 		};
40/******/
41/******/ 		// Execute the module function
42/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
43/******/
44/******/ 		// Flag the module as loaded
45/******/ 		module.l = true;
46/******/
47/******/ 		// Return the exports of the module
48/******/ 		return module.exports;
49/******/ 	}
50/******/
51/******/
52/******/ 	// expose the modules object (__webpack_modules__)
53/******/ 	__webpack_require__.m = modules;
54/******/
55/******/ 	// expose the module cache
56/******/ 	__webpack_require__.c = installedModules;
57/******/
58/******/ 	// define getter function for harmony exports
59/******/ 	__webpack_require__.d = function(exports, name, getter) {
60/******/ 		if(!__webpack_require__.o(exports, name)) {
61/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
62/******/ 		}
63/******/ 	};
64/******/
65/******/ 	// define __esModule on exports
66/******/ 	__webpack_require__.r = function(exports) {
67/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
68/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
69/******/ 		}
70/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
71/******/ 	};
72/******/
73/******/ 	// create a fake namespace object
74/******/ 	// mode & 1: value is a module id, require it
75/******/ 	// mode & 2: merge all properties of value into the ns
76/******/ 	// mode & 4: return value when already ns object
77/******/ 	// mode & 8|1: behave like require
78/******/ 	__webpack_require__.t = function(value, mode) {
79/******/ 		if(mode & 1) value = __webpack_require__(value);
80/******/ 		if(mode & 8) return value;
81/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
82/******/ 		var ns = Object.create(null);
83/******/ 		__webpack_require__.r(ns);
84/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
85/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
86/******/ 		return ns;
87/******/ 	};
88/******/
89/******/ 	// getDefaultExport function for compatibility with non-harmony modules
90/******/ 	__webpack_require__.n = function(module) {
91/******/ 		var getter = module && module.__esModule ?
92/******/ 			function getDefault() { return module['default']; } :
93/******/ 			function getModuleExports() { return module; };
94/******/ 		__webpack_require__.d(getter, 'a', getter);
95/******/ 		return getter;
96/******/ 	};
97/******/
98/******/ 	// Object.prototype.hasOwnProperty.call
99/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
100/******/
101/******/ 	// __webpack_public_path__
102/******/ 	__webpack_require__.p = "";
103/******/
104/******/
105/******/ 	// Load entry module and return exports
106/******/ 	return __webpack_require__(__webpack_require__.s = 51);
107/******/ })
108/************************************************************************/
109/******/ ({
110
111/***/ 0:
112/***/ (function(module, exports) {
113
114module.exports = __WEBPACK_EXTERNAL_MODULE__0__;
115
116/***/ }),
117
118/***/ 1:
119/***/ (function(module, __webpack_exports__, __webpack_require__) {
120
121"use strict";
122/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
123/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);
124function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
125
126function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
127
128function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
129
130function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
131
132
133
134var Renderer = /*#__PURE__*/function () {
135  function Renderer(markup, children, options, callback) {
136    _classCallCheck(this, Renderer);
137
138    this.markup = markup;
139    this.children = children;
140    this.options = options;
141    this.callback = callback;
142  }
143
144  _createClass(Renderer, [{
145    key: "render",
146    value: function render($parent) {
147      var $node = jquery__WEBPACK_IMPORTED_MODULE_0___default()(this.markup);
148
149      if (this.options && this.options.contents) {
150        $node.html(this.options.contents);
151      }
152
153      if (this.options && this.options.className) {
154        $node.addClass(this.options.className);
155      }
156
157      if (this.options && this.options.data) {
158        jquery__WEBPACK_IMPORTED_MODULE_0___default.a.each(this.options.data, function (k, v) {
159          $node.attr('data-' + k, v);
160        });
161      }
162
163      if (this.options && this.options.click) {
164        $node.on('click', this.options.click);
165      }
166
167      if (this.children) {
168        var $container = $node.find('.note-children-container');
169        this.children.forEach(function (child) {
170          child.render($container.length ? $container : $node);
171        });
172      }
173
174      if (this.callback) {
175        this.callback($node, this.options);
176      }
177
178      if (this.options && this.options.callback) {
179        this.options.callback($node);
180      }
181
182      if ($parent) {
183        $parent.append($node);
184      }
185
186      return $node;
187    }
188  }]);
189
190  return Renderer;
191}();
192
193/* harmony default export */ __webpack_exports__["a"] = ({
194  create: function create(markup, callback) {
195    return function () {
196      var options = _typeof(arguments[1]) === 'object' ? arguments[1] : arguments[0];
197      var children = Array.isArray(arguments[0]) ? arguments[0] : [];
198
199      if (options && options.children) {
200        children = options.children;
201      }
202
203      return new Renderer(markup, children, options, callback);
204    };
205  }
206});
207
208/***/ }),
209
210/***/ 2:
211/***/ (function(module, exports) {
212
213/* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {/* globals __webpack_amd_options__ */
214module.exports = __webpack_amd_options__;
215
216/* WEBPACK VAR INJECTION */}.call(this, {}))
217
218/***/ }),
219
220/***/ 3:
221/***/ (function(module, __webpack_exports__, __webpack_require__) {
222
223"use strict";
224
225// EXTERNAL MODULE: external {"root":"jQuery","commonjs2":"jquery","commonjs":"jquery","amd":"jquery"}
226var external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_ = __webpack_require__(0);
227var external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default = /*#__PURE__*/__webpack_require__.n(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_);
228
229// CONCATENATED MODULE: ./src/js/base/summernote-en-US.js
230
231external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote || {
232  lang: {}
233};
234external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.extend(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.lang, {
235  'en-US': {
236    font: {
237      bold: 'Bold',
238      italic: 'Italic',
239      underline: 'Underline',
240      clear: 'Remove Font Style',
241      height: 'Line Height',
242      name: 'Font Family',
243      strikethrough: 'Strikethrough',
244      subscript: 'Subscript',
245      superscript: 'Superscript',
246      size: 'Font Size',
247      sizeunit: 'Font Size Unit'
248    },
249    image: {
250      image: 'Picture',
251      insert: 'Insert Image',
252      resizeFull: 'Resize full',
253      resizeHalf: 'Resize half',
254      resizeQuarter: 'Resize quarter',
255      resizeNone: 'Original size',
256      floatLeft: 'Float Left',
257      floatRight: 'Float Right',
258      floatNone: 'Remove float',
259      shapeRounded: 'Shape: Rounded',
260      shapeCircle: 'Shape: Circle',
261      shapeThumbnail: 'Shape: Thumbnail',
262      shapeNone: 'Shape: None',
263      dragImageHere: 'Drag image or text here',
264      dropImage: 'Drop image or Text',
265      selectFromFiles: 'Select from files',
266      maximumFileSize: 'Maximum file size',
267      maximumFileSizeError: 'Maximum file size exceeded.',
268      url: 'Image URL',
269      remove: 'Remove Image',
270      original: 'Original'
271    },
272    video: {
273      video: 'Video',
274      videoLink: 'Video Link',
275      insert: 'Insert Video',
276      url: 'Video URL',
277      providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)'
278    },
279    link: {
280      link: 'Link',
281      insert: 'Insert Link',
282      unlink: 'Unlink',
283      edit: 'Edit',
284      textToDisplay: 'Text to display',
285      url: 'To what URL should this link go?',
286      openInNewWindow: 'Open in new window',
287      useProtocol: 'Use default protocol'
288    },
289    table: {
290      table: 'Table',
291      addRowAbove: 'Add row above',
292      addRowBelow: 'Add row below',
293      addColLeft: 'Add column left',
294      addColRight: 'Add column right',
295      delRow: 'Delete row',
296      delCol: 'Delete column',
297      delTable: 'Delete table'
298    },
299    hr: {
300      insert: 'Insert Horizontal Rule'
301    },
302    style: {
303      style: 'Style',
304      p: 'Normal',
305      blockquote: 'Quote',
306      pre: 'Code',
307      h1: 'Header 1',
308      h2: 'Header 2',
309      h3: 'Header 3',
310      h4: 'Header 4',
311      h5: 'Header 5',
312      h6: 'Header 6'
313    },
314    lists: {
315      unordered: 'Unordered list',
316      ordered: 'Ordered list'
317    },
318    options: {
319      help: 'Help',
320      fullscreen: 'Full Screen',
321      codeview: 'Code View'
322    },
323    paragraph: {
324      paragraph: 'Paragraph',
vendor: 4,851 bytes, lines 325-468
325      outdent: 'Outdent',
326      indent: 'Indent',
327      left: 'Align left',
328      center: 'Align center',
329      right: 'Align right',
330      justify: 'Justify full'
331    },
332    color: {
333      recent: 'Recent Color',
334      more: 'More Color',
335      background: 'Background Color',
336      foreground: 'Text Color',
337      transparent: 'Transparent',
338      setTransparent: 'Set transparent',
339      reset: 'Reset',
340      resetToDefault: 'Reset to default',
341      cpSelect: 'Select'
342    },
343    shortcut: {
344      shortcuts: 'Keyboard shortcuts',
345      close: 'Close',
346      textFormatting: 'Text formatting',
347      action: 'Action',
348      paragraphFormatting: 'Paragraph formatting',
349      documentStyle: 'Document Style',
350      extraKeys: 'Extra keys'
351    },
352    help: {
353      'escape': 'Escape',
354      'insertParagraph': 'Insert Paragraph',
355      'undo': 'Undo the last command',
356      'redo': 'Redo the last command',
357      'tab': 'Tab',
358      'untab': 'Untab',
359      'bold': 'Set a bold style',
360      'italic': 'Set a italic style',
361      'underline': 'Set a underline style',
362      'strikethrough': 'Set a strikethrough style',
363      'removeFormat': 'Clean a style',
364      'justifyLeft': 'Set left align',
365      'justifyCenter': 'Set center align',
366      'justifyRight': 'Set right align',
367      'justifyFull': 'Set full align',
368      'insertUnorderedList': 'Toggle unordered list',
369      'insertOrderedList': 'Toggle ordered list',
370      'outdent': 'Outdent on current paragraph',
371      'indent': 'Indent on current paragraph',
372      'formatPara': 'Change current block\'s format as a paragraph(P tag)',
373      'formatH1': 'Change current block\'s format as H1',
374      'formatH2': 'Change current block\'s format as H2',
375      'formatH3': 'Change current block\'s format as H3',
376      'formatH4': 'Change current block\'s format as H4',
377      'formatH5': 'Change current block\'s format as H5',
378      'formatH6': 'Change current block\'s format as H6',
379      'insertHorizontalRule': 'Insert horizontal rule',
380      'linkDialog.show': 'Show Link Dialog'
381    },
382    history: {
383      undo: 'Undo',
384      redo: 'Redo'
385    },
386    specialChar: {
387      specialChar: 'SPECIAL CHARACTERS',
388      select: 'Select Special characters'
389    },
390    output: {
391      noSelection: 'No Selection Made!'
392    }
393  }
394});
395// CONCATENATED MODULE: ./src/js/base/core/env.js
396
397var isSupportAmd = typeof define === 'function' && __webpack_require__(2); // eslint-disable-line
398
399/**
400 * returns whether font is installed or not.
401 *
402 * @param {String} fontName
403 * @return {Boolean}
404 */
405
406var genericFontFamilies = ['sans-serif', 'serif', 'monospace', 'cursive', 'fantasy'];
407
408function validFontName(fontName) {
409  return external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.inArray(fontName.toLowerCase(), genericFontFamilies) === -1 ? "'".concat(fontName, "'") : fontName;
410}
411
412function env_isFontInstalled(fontName) {
413  var testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS';
414  var testText = 'mmmmmmmmmmwwwww';
415  var testSize = '200px';
416  var canvas = document.createElement('canvas');
417  var context = canvas.getContext('2d');
418  context.font = testSize + " '" + testFontName + "'";
419  var originalWidth = context.measureText(testText).width;
420  context.font = testSize + ' ' + validFontName(fontName) + ', "' + testFontName + '"';
421  var width = context.measureText(testText).width;
422  return originalWidth !== width;
423}
424
425var userAgent = navigator.userAgent;
426var isMSIE = /MSIE|Trident/i.test(userAgent);
427var browserVersion;
428
429if (isMSIE) {
430  var matches = /MSIE (\d+[.]\d+)/.exec(userAgent);
431
432  if (matches) {
433    browserVersion = parseFloat(matches[1]);
434  }
435
436  matches = /Trident\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(userAgent);
437
438  if (matches) {
439    browserVersion = parseFloat(matches[1]);
440  }
441}
442
443var isEdge = /Edge\/\d+/.test(userAgent);
444var isSupportTouch = 'ontouchstart' in window || navigator.MaxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; // [workaround] IE doesn't have input events for contentEditable
445// - see: https://goo.gl/4bfIvA
446
447var inputEventName = isMSIE ? 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted' : 'input';
448/**
449 * @class core.env
450 *
451 * Object which check platform and agent
452 *
453 * @singleton
454 * @alternateClassName env
455 */
456
457/* harmony default export */ var env = ({
458  isMac: navigator.appVersion.indexOf('Mac') > -1,
459  isMSIE: isMSIE,
460  isEdge: isEdge,
461  isFF: !isEdge && /firefox/i.test(userAgent),
462  isPhantom: /PhantomJS/i.test(userAgent),
463  isWebkit: !isEdge && /webkit/i.test(userAgent),
464  isChrome: !isEdge && /chrome/i.test(userAgent),
465  isSafari: !isEdge && /safari/i.test(userAgent) && !/chrome/i.test(userAgent),
466  browserVersion: browserVersion,
467  jqueryVersion: parseFloat(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.fn.jquery),
468  isSupportAmd: isSupportAmd,
vendor: 20,065 bytes, lines 469-1527
469  isSupportTouch: isSupportTouch,
470  isFontInstalled: env_isFontInstalled,
471  isW3CRangeSupport: !!document.createRange,
472  inputEventName: inputEventName,
473  genericFontFamilies: genericFontFamilies,
474  validFontName: validFontName
475});
476// CONCATENATED MODULE: ./src/js/base/core/func.js
477
478/**
479 * @class core.func
480 *
481 * func utils (for high-order func's arg)
482 *
483 * @singleton
484 * @alternateClassName func
485 */
486
487function eq(itemA) {
488  return function (itemB) {
489    return itemA === itemB;
490  };
491}
492
493function eq2(itemA, itemB) {
494  return itemA === itemB;
495}
496
497function peq2(propName) {
498  return function (itemA, itemB) {
499    return itemA[propName] === itemB[propName];
500  };
501}
502
503function ok() {
504  return true;
505}
506
507function fail() {
508  return false;
509}
510
511function not(f) {
512  return function () {
513    return !f.apply(f, arguments);
514  };
515}
516
517function and(fA, fB) {
518  return function (item) {
519    return fA(item) && fB(item);
520  };
521}
522
523function func_self(a) {
524  return a;
525}
526
527function func_invoke(obj, method) {
528  return function () {
529    return obj[method].apply(obj, arguments);
530  };
531}
532
533var idCounter = 0;
534/**
535 * reset globally-unique id
536 *
537 */
538
539function resetUniqueId() {
540  idCounter = 0;
541}
542/**
543 * generate a globally-unique id
544 *
545 * @param {String} [prefix]
546 */
547
548
549function uniqueId(prefix) {
550  var id = ++idCounter + '';
551  return prefix ? prefix + id : id;
552}
553/**
554 * returns bnd (bounds) from rect
555 *
556 * - IE Compatibility Issue: http://goo.gl/sRLOAo
557 * - Scroll Issue: http://goo.gl/sNjUc
558 *
559 * @param {Rect} rect
560 * @return {Object} bounds
561 * @return {Number} bounds.top
562 * @return {Number} bounds.left
563 * @return {Number} bounds.width
564 * @return {Number} bounds.height
565 */
566
567
568function rect2bnd(rect) {
569  var $document = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(document);
570  return {
571    top: rect.top + $document.scrollTop(),
572    left: rect.left + $document.scrollLeft(),
573    width: rect.right - rect.left,
574    height: rect.bottom - rect.top
575  };
576}
577/**
578 * returns a copy of the object where the keys have become the values and the values the keys.
579 * @param {Object} obj
580 * @return {Object}
581 */
582
583
584function invertObject(obj) {
585  var inverted = {};
586
587  for (var key in obj) {
588    if (Object.prototype.hasOwnProperty.call(obj, key)) {
589      inverted[obj[key]] = key;
590    }
591  }
592
593  return inverted;
594}
595/**
596 * @param {String} namespace
597 * @param {String} [prefix]
598 * @return {String}
599 */
600
601
602function namespaceToCamel(namespace, prefix) {
603  prefix = prefix || '';
604  return prefix + namespace.split('.').map(function (name) {
605    return name.substring(0, 1).toUpperCase() + name.substring(1);
606  }).join('');
607}
608/**
609 * Returns a function, that, as long as it continues to be invoked, will not
610 * be triggered. The function will be called after it stops being called for
611 * N milliseconds. If `immediate` is passed, trigger the function on the
612 * leading edge, instead of the trailing.
613 * @param {Function} func
614 * @param {Number} wait
615 * @param {Boolean} immediate
616 * @return {Function}
617 */
618
619
620function debounce(func, wait, immediate) {
621  var timeout;
622  return function () {
623    var context = this;
624    var args = arguments;
625
626    var later = function later() {
627      timeout = null;
628
629      if (!immediate) {
630        func.apply(context, args);
631      }
632    };
633
634    var callNow = immediate && !timeout;
635    clearTimeout(timeout);
636    timeout = setTimeout(later, wait);
637
638    if (callNow) {
639      func.apply(context, args);
640    }
641  };
642}
643/**
644 *
645 * @param {String} url
646 * @return {Boolean}
647 */
648
649
650function isValidUrl(url) {
651  var expression = /[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi;
652  return expression.test(url);
653}
654
655/* harmony default export */ var func = ({
656  eq: eq,
657  eq2: eq2,
658  peq2: peq2,
659  ok: ok,
660  fail: fail,
661  self: func_self,
662  not: not,
663  and: and,
664  invoke: func_invoke,
665  resetUniqueId: resetUniqueId,
666  uniqueId: uniqueId,
667  rect2bnd: rect2bnd,
668  invertObject: invertObject,
669  namespaceToCamel: namespaceToCamel,
670  debounce: debounce,
671  isValidUrl: isValidUrl
672});
673// CONCATENATED MODULE: ./src/js/base/core/lists.js
674
675/**
676 * returns the first item of an array.
677 *
678 * @param {Array} array
679 */
680
681function lists_head(array) {
682  return array[0];
683}
684/**
685 * returns the last item of an array.
686 *
687 * @param {Array} array
688 */
689
690
691function lists_last(array) {
692  return array[array.length - 1];
693}
694/**
695 * returns everything but the last entry of the array.
696 *
697 * @param {Array} array
698 */
699
700
701function initial(array) {
702  return array.slice(0, array.length - 1);
703}
704/**
705 * returns the rest of the items in an array.
706 *
707 * @param {Array} array
708 */
709
710
711function tail(array) {
712  return array.slice(1);
713}
714/**
715 * returns item of array
716 */
717
718
719function find(array, pred) {
720  for (var idx = 0, len = array.length; idx < len; idx++) {
721    var item = array[idx];
722
723    if (pred(item)) {
724      return item;
725    }
726  }
727}
728/**
729 * returns true if all of the values in the array pass the predicate truth test.
730 */
731
732
733function lists_all(array, pred) {
734  for (var idx = 0, len = array.length; idx < len; idx++) {
735    if (!pred(array[idx])) {
736      return false;
737    }
738  }
739
740  return true;
741}
742/**
743 * returns true if the value is present in the list.
744 */
745
746
747function contains(array, item) {
748  if (array && array.length && item) {
749    if (array.indexOf) {
750      return array.indexOf(item) !== -1;
751    } else if (array.contains) {
752      // `DOMTokenList` doesn't implement `.indexOf`, but it implements `.contains`
753      return array.contains(item);
754    }
755  }
756
757  return false;
758}
759/**
760 * get sum from a list
761 *
762 * @param {Array} array - array
763 * @param {Function} fn - iterator
764 */
765
766
767function sum(array, fn) {
768  fn = fn || func.self;
769  return array.reduce(function (memo, v) {
770    return memo + fn(v);
771  }, 0);
772}
773/**
774 * returns a copy of the collection with array type.
775 * @param {Collection} collection - collection eg) node.childNodes, ...
776 */
777
778
779function from(collection) {
780  var result = [];
781  var length = collection.length;
782  var idx = -1;
783
784  while (++idx < length) {
785    result[idx] = collection[idx];
786  }
787
788  return result;
789}
790/**
791 * returns whether list is empty or not
792 */
793
794
795function lists_isEmpty(array) {
796  return !array || !array.length;
797}
798/**
799 * cluster elements by predicate function.
800 *
801 * @param {Array} array - array
802 * @param {Function} fn - predicate function for cluster rule
803 * @param {Array[]}
804 */
805
806
807function clusterBy(array, fn) {
808  if (!array.length) {
809    return [];
810  }
811
812  var aTail = tail(array);
813  return aTail.reduce(function (memo, v) {
814    var aLast = lists_last(memo);
815
816    if (fn(lists_last(aLast), v)) {
817      aLast[aLast.length] = v;
818    } else {
819      memo[memo.length] = [v];
820    }
821
822    return memo;
823  }, [[lists_head(array)]]);
824}
825/**
826 * returns a copy of the array with all false values removed
827 *
828 * @param {Array} array - array
829 * @param {Function} fn - predicate function for cluster rule
830 */
831
832
833function compact(array) {
834  var aResult = [];
835
836  for (var idx = 0, len = array.length; idx < len; idx++) {
837    if (array[idx]) {
838      aResult.push(array[idx]);
839    }
840  }
841
842  return aResult;
843}
844/**
845 * produces a duplicate-free version of the array
846 *
847 * @param {Array} array
848 */
849
850
851function unique(array) {
852  var results = [];
853
854  for (var idx = 0, len = array.length; idx < len; idx++) {
855    if (!contains(results, array[idx])) {
856      results.push(array[idx]);
857    }
858  }
859
860  return results;
861}
862/**
863 * returns next item.
864 * @param {Array} array
865 */
866
867
868function lists_next(array, item) {
869  if (array && array.length && item) {
870    var idx = array.indexOf(item);
871    return idx === -1 ? null : array[idx + 1];
872  }
873
874  return null;
875}
876/**
877 * returns prev item.
878 * @param {Array} array
879 */
880
881
882function prev(array, item) {
883  if (array && array.length && item) {
884    var idx = array.indexOf(item);
885    return idx === -1 ? null : array[idx - 1];
886  }
887
888  return null;
889}
890/**
891 * @class core.list
892 *
893 * list utils
894 *
895 * @singleton
896 * @alternateClassName list
897 */
898
899
900/* harmony default export */ var lists = ({
901  head: lists_head,
902  last: lists_last,
903  initial: initial,
904  tail: tail,
905  prev: prev,
906  next: lists_next,
907  find: find,
908  contains: contains,
909  all: lists_all,
910  sum: sum,
911  from: from,
912  isEmpty: lists_isEmpty,
913  clusterBy: clusterBy,
914  compact: compact,
915  unique: unique
916});
917// CONCATENATED MODULE: ./src/js/base/core/dom.js
918
919
920
921
922var NBSP_CHAR = String.fromCharCode(160);
923var ZERO_WIDTH_NBSP_CHAR = "\uFEFF";
924/**
925 * @method isEditable
926 *
927 * returns whether node is `note-editable` or not.
928 *
929 * @param {Node} node
930 * @return {Boolean}
931 */
932
933function isEditable(node) {
934  return node && external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(node).hasClass('note-editable');
935}
936/**
937 * @method isControlSizing
938 *
939 * returns whether node is `note-control-sizing` or not.
940 *
941 * @param {Node} node
942 * @return {Boolean}
943 */
944
945
946function isControlSizing(node) {
947  return node && external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(node).hasClass('note-control-sizing');
948}
949/**
950 * @method makePredByNodeName
951 *
952 * returns predicate which judge whether nodeName is same
953 *
954 * @param {String} nodeName
955 * @return {Function}
956 */
957
958
959function makePredByNodeName(nodeName) {
960  nodeName = nodeName.toUpperCase();
961  return function (node) {
962    return node && node.nodeName.toUpperCase() === nodeName;
963  };
964}
965/**
966 * @method isText
967 *
968 *
969 *
970 * @param {Node} node
971 * @return {Boolean} true if node's type is text(3)
972 */
973
974
975function isText(node) {
976  return node && node.nodeType === 3;
977}
978/**
979 * @method isElement
980 *
981 *
982 *
983 * @param {Node} node
984 * @return {Boolean} true if node's type is element(1)
985 */
986
987
988function isElement(node) {
989  return node && node.nodeType === 1;
990}
991/**
992 * ex) br, col, embed, hr, img, input, ...
993 * @see http://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements
994 */
995
996
997function isVoid(node) {
998  return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(node.nodeName.toUpperCase());
999}
1000
1001function isPara(node) {
1002  if (isEditable(node)) {
1003    return false;
1004  } // Chrome(v31.0), FF(v25.0.1) use DIV for paragraph
1005
1006
1007  return node && /^DIV|^P|^LI|^H[1-7]/.test(node.nodeName.toUpperCase());
1008}
1009
1010function isHeading(node) {
1011  return node && /^H[1-7]/.test(node.nodeName.toUpperCase());
1012}
1013
1014var isPre = makePredByNodeName('PRE');
1015var isLi = makePredByNodeName('LI');
1016
1017function isPurePara(node) {
1018  return isPara(node) && !isLi(node);
1019}
1020
1021var isTable = makePredByNodeName('TABLE');
1022var isData = makePredByNodeName('DATA');
1023
1024function dom_isInline(node) {
1025  return !isBodyContainer(node) && !isList(node) && !isHr(node) && !isPara(node) && !isTable(node) && !isBlockquote(node) && !isData(node);
1026}
1027
1028function isList(node) {
1029  return node && /^UL|^OL/.test(node.nodeName.toUpperCase());
1030}
1031
1032var isHr = makePredByNodeName('HR');
1033
1034function dom_isCell(node) {
1035  return node && /^TD|^TH/.test(node.nodeName.toUpperCase());
1036}
1037
1038var isBlockquote = makePredByNodeName('BLOCKQUOTE');
1039
1040function isBodyContainer(node) {
1041  return dom_isCell(node) || isBlockquote(node) || isEditable(node);
1042}
1043
1044var isAnchor = makePredByNodeName('A');
1045
1046function isParaInline(node) {
1047  return dom_isInline(node) && !!dom_ancestor(node, isPara);
1048}
1049
1050function isBodyInline(node) {
1051  return dom_isInline(node) && !dom_ancestor(node, isPara);
1052}
1053
1054var isBody = makePredByNodeName('BODY');
1055/**
1056 * returns whether nodeB is closest sibling of nodeA
1057 *
1058 * @param {Node} nodeA
1059 * @param {Node} nodeB
1060 * @return {Boolean}
1061 */
1062
1063function isClosestSibling(nodeA, nodeB) {
1064  return nodeA.nextSibling === nodeB || nodeA.previousSibling === nodeB;
1065}
1066/**
1067 * returns array of closest siblings with node
1068 *
1069 * @param {Node} node
1070 * @param {function} [pred] - predicate function
1071 * @return {Node[]}
1072 */
1073
1074
1075function withClosestSiblings(node, pred) {
1076  pred = pred || func.ok;
1077  var siblings = [];
1078
1079  if (node.previousSibling && pred(node.previousSibling)) {
1080    siblings.push(node.previousSibling);
1081  }
1082
1083  siblings.push(node);
1084
1085  if (node.nextSibling && pred(node.nextSibling)) {
1086    siblings.push(node.nextSibling);
1087  }
1088
1089  return siblings;
1090}
1091/**
1092 * blank HTML for cursor position
1093 * - [workaround] old IE only works with &nbsp;
1094 * - [workaround] IE11 and other browser works with bogus br
1095 */
1096
1097
1098var blankHTML = env.isMSIE && env.browserVersion < 11 ? '&nbsp;' : '<br>';
1099/**
1100 * @method nodeLength
1101 *
1102 * returns #text's text size or element's childNodes size
1103 *
1104 * @param {Node} node
1105 */
1106
1107function nodeLength(node) {
1108  if (isText(node)) {
1109    return node.nodeValue.length;
1110  }
1111
1112  if (node) {
1113    return node.childNodes.length;
1114  }
1115
1116  return 0;
1117}
1118/**
1119 * returns whether deepest child node is empty or not.
1120 *
1121 * @param {Node} node
1122 * @return {Boolean}
1123 */
1124
1125
1126function deepestChildIsEmpty(node) {
1127  do {
1128    if (node.firstElementChild === null || node.firstElementChild.innerHTML === '') break;
1129  } while (node = node.firstElementChild);
1130
1131  return dom_isEmpty(node);
1132}
1133/**
1134 * returns whether node is empty or not.
1135 *
1136 * @param {Node} node
1137 * @return {Boolean}
1138 */
1139
1140
1141function dom_isEmpty(node) {
1142  var len = nodeLength(node);
1143
1144  if (len === 0) {
1145    return true;
1146  } else if (!isText(node) && len === 1 && node.innerHTML === blankHTML) {
1147    // ex) <p><br></p>, <span><br></span>
1148    return true;
1149  } else if (lists.all(node.childNodes, isText) && node.innerHTML === '') {
1150    // ex) <p></p>, <span></span>
1151    return true;
1152  }
1153
1154  return false;
1155}
1156/**
1157 * padding blankHTML if node is empty (for cursor position)
1158 */
1159
1160
1161function paddingBlankHTML(node) {
1162  if (!isVoid(node) && !nodeLength(node)) {
1163    node.innerHTML = blankHTML;
1164  }
1165}
1166/**
1167 * find nearest ancestor predicate hit
1168 *
1169 * @param {Node} node
1170 * @param {Function} pred - predicate function
1171 */
1172
1173
1174function dom_ancestor(node, pred) {
1175  while (node) {
1176    if (pred(node)) {
1177      return node;
1178    }
1179
1180    if (isEditable(node)) {
1181      break;
1182    }
1183
1184    node = node.parentNode;
1185  }
1186
1187  return null;
1188}
1189/**
1190 * find nearest ancestor only single child blood line and predicate hit
1191 *
1192 * @param {Node} node
1193 * @param {Function} pred - predicate function
1194 */
1195
1196
1197function singleChildAncestor(node, pred) {
1198  node = node.parentNode;
1199
1200  while (node) {
1201    if (nodeLength(node) !== 1) {
1202      break;
1203    }
1204
1205    if (pred(node)) {
1206      return node;
1207    }
1208
1209    if (isEditable(node)) {
1210      break;
1211    }
1212
1213    node = node.parentNode;
1214  }
1215
1216  return null;
1217}
1218/**
1219 * returns new array of ancestor nodes (until predicate hit).
1220 *
1221 * @param {Node} node
1222 * @param {Function} [optional] pred - predicate function
1223 */
1224
1225
1226function listAncestor(node, pred) {
1227  pred = pred || func.fail;
1228  var ancestors = [];
1229  dom_ancestor(node, function (el) {
1230    if (!isEditable(el)) {
1231      ancestors.push(el);
1232    }
1233
1234    return pred(el);
1235  });
1236  return ancestors;
1237}
1238/**
1239 * find farthest ancestor predicate hit
1240 */
1241
1242
1243function lastAncestor(node, pred) {
1244  var ancestors = listAncestor(node);
1245  return lists.last(ancestors.filter(pred));
1246}
1247/**
1248 * returns common ancestor node between two nodes.
1249 *
1250 * @param {Node} nodeA
1251 * @param {Node} nodeB
1252 */
1253
1254
1255function dom_commonAncestor(nodeA, nodeB) {
1256  var ancestors = listAncestor(nodeA);
1257
1258  for (var n = nodeB; n; n = n.parentNode) {
1259    if (ancestors.indexOf(n) > -1) return n;
1260  }
1261
1262  return null; // difference document area
1263}
1264/**
1265 * listing all previous siblings (until predicate hit).
1266 *
1267 * @param {Node} node
1268 * @param {Function} [optional] pred - predicate function
1269 */
1270
1271
1272function listPrev(node, pred) {
1273  pred = pred || func.fail;
1274  var nodes = [];
1275
1276  while (node) {
1277    if (pred(node)) {
1278      break;
1279    }
1280
1281    nodes.push(node);
1282    node = node.previousSibling;
1283  }
1284
1285  return nodes;
1286}
1287/**
1288 * listing next siblings (until predicate hit).
1289 *
1290 * @param {Node} node
1291 * @param {Function} [pred] - predicate function
1292 */
1293
1294
1295function listNext(node, pred) {
1296  pred = pred || func.fail;
1297  var nodes = [];
1298
1299  while (node) {
1300    if (pred(node)) {
1301      break;
1302    }
1303
1304    nodes.push(node);
1305    node = node.nextSibling;
1306  }
1307
1308  return nodes;
1309}
1310/**
1311 * listing descendant nodes
1312 *
1313 * @param {Node} node
1314 * @param {Function} [pred] - predicate function
1315 */
1316
1317
1318function listDescendant(node, pred) {
1319  var descendants = [];
1320  pred = pred || func.ok; // start DFS(depth first search) with node
1321
1322  (function fnWalk(current) {
1323    if (node !== current && pred(current)) {
1324      descendants.push(current);
1325    }
1326
1327    for (var idx = 0, len = current.childNodes.length; idx < len; idx++) {
1328      fnWalk(current.childNodes[idx]);
1329    }
1330  })(node);
1331
1332  return descendants;
1333}
1334/**
1335 * wrap node with new tag.
1336 *
1337 * @param {Node} node
1338 * @param {Node} tagName of wrapper
1339 * @return {Node} - wrapper
1340 */
1341
1342
1343function wrap(node, wrapperName) {
1344  var parent = node.parentNode;
1345  var wrapper = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<' + wrapperName + '>')[0];
1346  parent.insertBefore(wrapper, node);
1347  wrapper.appendChild(node);
1348  return wrapper;
1349}
1350/**
1351 * insert node after preceding
1352 *
1353 * @param {Node} node
1354 * @param {Node} preceding - predicate function
1355 */
1356
1357
1358function insertAfter(node, preceding) {
1359  var next = preceding.nextSibling;
1360  var parent = preceding.parentNode;
1361
1362  if (next) {
1363    parent.insertBefore(node, next);
1364  } else {
1365    parent.appendChild(node);
1366  }
1367
1368  return node;
1369}
1370/**
1371 * append elements.
1372 *
1373 * @param {Node} node
1374 * @param {Collection} aChild
1375 */
1376
1377
1378function appendChildNodes(node, aChild) {
1379  external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(aChild, function (idx, child) {
1380    node.appendChild(child);
1381  });
1382  return node;
1383}
1384/**
1385 * returns whether boundaryPoint is left edge or not.
1386 *
1387 * @param {BoundaryPoint} point
1388 * @return {Boolean}
1389 */
1390
1391
1392function isLeftEdgePoint(point) {
1393  return point.offset === 0;
1394}
1395/**
1396 * returns whether boundaryPoint is right edge or not.
1397 *
1398 * @param {BoundaryPoint} point
1399 * @return {Boolean}
1400 */
1401
1402
1403function isRightEdgePoint(point) {
1404  return point.offset === nodeLength(point.node);
1405}
1406/**
1407 * returns whether boundaryPoint is edge or not.
1408 *
1409 * @param {BoundaryPoint} point
1410 * @return {Boolean}
1411 */
1412
1413
1414function isEdgePoint(point) {
1415  return isLeftEdgePoint(point) || isRightEdgePoint(point);
1416}
1417/**
1418 * returns whether node is left edge of ancestor or not.
1419 *
1420 * @param {Node} node
1421 * @param {Node} ancestor
1422 * @return {Boolean}
1423 */
1424
1425
1426function dom_isLeftEdgeOf(node, ancestor) {
1427  while (node && node !== ancestor) {
1428    if (dom_position(node) !== 0) {
1429      return false;
1430    }
1431
1432    node = node.parentNode;
1433  }
1434
1435  return true;
1436}
1437/**
1438 * returns whether node is right edge of ancestor or not.
1439 *
1440 * @param {Node} node
1441 * @param {Node} ancestor
1442 * @return {Boolean}
1443 */
1444
1445
1446function isRightEdgeOf(node, ancestor) {
1447  if (!ancestor) {
1448    return false;
1449  }
1450
1451  while (node && node !== ancestor) {
1452    if (dom_position(node) !== nodeLength(node.parentNode) - 1) {
1453      return false;
1454    }
1455
1456    node = node.parentNode;
1457  }
1458
1459  return true;
1460}
1461/**
1462 * returns whether point is left edge of ancestor or not.
1463 * @param {BoundaryPoint} point
1464 * @param {Node} ancestor
1465 * @return {Boolean}
1466 */
1467
1468
1469function isLeftEdgePointOf(point, ancestor) {
1470  return isLeftEdgePoint(point) && dom_isLeftEdgeOf(point.node, ancestor);
1471}
1472/**
1473 * returns whether point is right edge of ancestor or not.
1474 * @param {BoundaryPoint} point
1475 * @param {Node} ancestor
1476 * @return {Boolean}
1477 */
1478
1479
1480function isRightEdgePointOf(point, ancestor) {
1481  return isRightEdgePoint(point) && isRightEdgeOf(point.node, ancestor);
1482}
1483/**
1484 * returns offset from parent.
1485 *
1486 * @param {Node} node
1487 */
1488
1489
1490function dom_position(node) {
1491  var offset = 0;
1492
1493  while (node = node.previousSibling) {
1494    offset += 1;
1495  }
1496
1497  return offset;
1498}
1499
1500function hasChildren(node) {
1501  return !!(node && node.childNodes && node.childNodes.length);
1502}
1503/**
1504 * returns previous boundaryPoint
1505 *
1506 * @param {BoundaryPoint} point
1507 * @param {Boolean} isSkipInnerOffset
1508 * @return {BoundaryPoint}
1509 */
1510
1511
1512function dom_prevPoint(point, isSkipInnerOffset) {
1513  var node;
1514  var offset;
1515
1516  if (point.offset === 0) {
1517    if (isEditable(point.node)) {
1518      return null;
1519    }
1520
1521    node = point.node.parentNode;
1522    offset = dom_position(point.node);
1523  } else if (hasChildren(point.node)) {
1524    node = point.node.childNodes[point.offset - 1];
1525    offset = nodeLength(node);
1526  } else {
1527    node = point.node;
vendor: 4,960 bytes, lines 1528-1774
1528    offset = isSkipInnerOffset ? 0 : point.offset - 1;
1529  }
1530
1531  return {
1532    node: node,
1533    offset: offset
1534  };
1535}
1536/**
1537 * returns next boundaryPoint
1538 *
1539 * @param {BoundaryPoint} point
1540 * @param {Boolean} isSkipInnerOffset
1541 * @return {BoundaryPoint}
1542 */
1543
1544
1545function dom_nextPoint(point, isSkipInnerOffset) {
1546  var node, offset;
1547
1548  if (nodeLength(point.node) === point.offset) {
1549    if (isEditable(point.node)) {
1550      return null;
1551    }
1552
1553    var nextTextNode = getNextTextNode(point.node);
1554
1555    if (nextTextNode) {
1556      node = nextTextNode;
1557      offset = 0;
1558    } else {
1559      node = point.node.parentNode;
1560      offset = dom_position(point.node) + 1;
1561    }
1562  } else if (hasChildren(point.node)) {
1563    node = point.node.childNodes[point.offset];
1564    offset = 0;
1565  } else {
1566    node = point.node;
1567    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;
1568  }
1569
1570  return {
1571    node: node,
1572    offset: offset
1573  };
1574}
1575/**
1576 * returns next boundaryPoint with empty node
1577 *
1578 * @param {BoundaryPoint} point
1579 * @param {Boolean} isSkipInnerOffset
1580 * @return {BoundaryPoint}
1581 */
1582
1583
1584function nextPointWithEmptyNode(point, isSkipInnerOffset) {
1585  var node, offset; // if node is empty string node, return current node's sibling.
1586
1587  if (dom_isEmpty(point.node)) {
1588    node = point.node.nextSibling;
1589    offset = 0;
1590    return {
1591      node: node,
1592      offset: offset
1593    };
1594  }
1595
1596  if (nodeLength(point.node) === point.offset) {
1597    if (isEditable(point.node)) {
1598      return null;
1599    }
1600
1601    var nextTextNode = getNextTextNode(point.node);
1602
1603    if (nextTextNode) {
1604      node = nextTextNode;
1605      offset = 0;
1606    } else {
1607      node = point.node.parentNode;
1608      offset = dom_position(point.node) + 1;
1609    } // if next node is editable, return current node's sibling node.
1610
1611
1612    if (isEditable(node)) {
1613      node = point.node.nextSibling;
1614      offset = 0;
1615    }
1616  } else if (hasChildren(point.node)) {
1617    node = point.node.childNodes[point.offset];
1618    offset = 0;
1619
1620    if (dom_isEmpty(node)) {
1621      return null;
1622    }
1623  } else {
1624    node = point.node;
1625    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;
1626
1627    if (dom_isEmpty(node)) {
1628      return null;
1629    }
1630  }
1631
1632  return {
1633    node: node,
1634    offset: offset
1635  };
1636}
1637/*
1638* returns the next Text node index or 0 if not found.
1639*/
1640
1641
1642function getNextTextNode(actual) {
1643  if (!actual.nextSibling) return undefined;
1644  if (actual.parent !== actual.nextSibling.parent) return undefined;
1645  if (isText(actual.nextSibling)) return actual.nextSibling;
1646  return getNextTextNode(actual.nextSibling);
1647}
1648/**
1649 * returns whether pointA and pointB is same or not.
1650 *
1651 * @param {BoundaryPoint} pointA
1652 * @param {BoundaryPoint} pointB
1653 * @return {Boolean}
1654 */
1655
1656
1657function isSamePoint(pointA, pointB) {
1658  return pointA.node === pointB.node && pointA.offset === pointB.offset;
1659}
1660/**
1661 * returns whether point is visible (can set cursor) or not.
1662 *
1663 * @param {BoundaryPoint} point
1664 * @return {Boolean}
1665 */
1666
1667
1668function isVisiblePoint(point) {
1669  if (isText(point.node) || !hasChildren(point.node) || dom_isEmpty(point.node)) {
1670    return true;
1671  }
1672
1673  var leftNode = point.node.childNodes[point.offset - 1];
1674  var rightNode = point.node.childNodes[point.offset];
1675
1676  if ((!leftNode || isVoid(leftNode)) && (!rightNode || isVoid(rightNode))) {
1677    return true;
1678  }
1679
1680  return false;
1681}
1682/**
1683 * @method prevPointUtil
1684 *
1685 * @param {BoundaryPoint} point
1686 * @param {Function} pred
1687 * @return {BoundaryPoint}
1688 */
1689
1690
1691function prevPointUntil(point, pred) {
1692  while (point) {
1693    if (pred(point)) {
1694      return point;
1695    }
1696
1697    point = dom_prevPoint(point);
1698  }
1699
1700  return null;
1701}
1702/**
1703 * @method nextPointUntil
1704 *
1705 * @param {BoundaryPoint} point
1706 * @param {Function} pred
1707 * @return {BoundaryPoint}
1708 */
1709
1710
1711function nextPointUntil(point, pred) {
1712  while (point) {
1713    if (pred(point)) {
1714      return point;
1715    }
1716
1717    point = dom_nextPoint(point);
1718  }
1719
1720  return null;
1721}
1722/**
1723 * returns whether point has character or not.
1724 *
1725 * @param {Point} point
1726 * @return {Boolean}
1727 */
1728
1729
1730function isCharPoint(point) {
1731  if (!isText(point.node)) {
1732    return false;
1733  }
1734
1735  var ch = point.node.nodeValue.charAt(point.offset - 1);
1736  return ch && ch !== ' ' && ch !== NBSP_CHAR;
1737}
1738/**
1739 * returns whether point has space or not.
1740 *
1741 * @param {Point} point
1742 * @return {Boolean}
1743 */
1744
1745
1746function isSpacePoint(point) {
1747  if (!isText(point.node)) {
1748    return false;
1749  }
1750
1751  var ch = point.node.nodeValue.charAt(point.offset - 1);
1752  return ch === ' ' || ch === NBSP_CHAR;
1753}
1754/**
1755 * @method walkPoint
1756 *
1757 * @param {BoundaryPoint} startPoint
1758 * @param {BoundaryPoint} endPoint
1759 * @param {Function} handler
1760 * @param {Boolean} isSkipInnerOffset
1761 */
1762
1763
1764function walkPoint(startPoint, endPoint, handler, isSkipInnerOffset) {
1765  var point = startPoint;
1766
1767  while (point) {
1768    handler(point);
1769
1770    if (isSamePoint(point, endPoint)) {
1771      break;
1772    }
1773
1774    var isSkipOffset = isSkipInnerOffset && startPoint.node !== point.node && endPoint.node !== point.node;
vendor: 1,725 bytes, lines 1775-1841
1775    point = nextPointWithEmptyNode(point, isSkipOffset);
1776  }
1777}
1778/**
1779 * @method makeOffsetPath
1780 *
1781 * return offsetPath(array of offset) from ancestor
1782 *
1783 * @param {Node} ancestor - ancestor node
1784 * @param {Node} node
1785 */
1786
1787
1788function makeOffsetPath(ancestor, node) {
1789  var ancestors = listAncestor(node, func.eq(ancestor));
1790  return ancestors.map(dom_position).reverse();
1791}
1792/**
1793 * @method fromOffsetPath
1794 *
1795 * return element from offsetPath(array of offset)
1796 *
1797 * @param {Node} ancestor - ancestor node
1798 * @param {array} offsets - offsetPath
1799 */
1800
1801
1802function fromOffsetPath(ancestor, offsets) {
1803  var current = ancestor;
1804
1805  for (var i = 0, len = offsets.length; i < len; i++) {
1806    if (current.childNodes.length <= offsets[i]) {
1807      current = current.childNodes[current.childNodes.length - 1];
1808    } else {
1809      current = current.childNodes[offsets[i]];
1810    }
1811  }
1812
1813  return current;
1814}
1815/**
1816 * @method splitNode
1817 *
1818 * split element or #text
1819 *
1820 * @param {BoundaryPoint} point
1821 * @param {Object} [options]
1822 * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false
1823 * @param {Boolean} [options.isNotSplitEdgePoint] - default: false
1824 * @param {Boolean} [options.isDiscardEmptySplits] - default: false
1825 * @return {Node} right node of boundaryPoint
1826 */
1827
1828
1829function splitNode(point, options) {
1830  var isSkipPaddingBlankHTML = options && options.isSkipPaddingBlankHTML;
1831  var isNotSplitEdgePoint = options && options.isNotSplitEdgePoint;
1832  var isDiscardEmptySplits = options && options.isDiscardEmptySplits;
1833
1834  if (isDiscardEmptySplits) {
1835    isSkipPaddingBlankHTML = true;
1836  } // edge case
1837
1838
1839  if (isEdgePoint(point) && (isText(point.node) || isNotSplitEdgePoint)) {
1840    if (isLeftEdgePoint(point)) {
1841      return point.node;
vendor: 5,617 bytes, lines 1842-2093
1842    } else if (isRightEdgePoint(point)) {
1843      return point.node.nextSibling;
1844    }
1845  } // split #text
1846
1847
1848  if (isText(point.node)) {
1849    return point.node.splitText(point.offset);
1850  } else {
1851    var childNode = point.node.childNodes[point.offset];
1852    var clone = insertAfter(point.node.cloneNode(false), point.node);
1853    appendChildNodes(clone, listNext(childNode));
1854
1855    if (!isSkipPaddingBlankHTML) {
1856      paddingBlankHTML(point.node);
1857      paddingBlankHTML(clone);
1858    }
1859
1860    if (isDiscardEmptySplits) {
1861      if (dom_isEmpty(point.node)) {
1862        remove(point.node);
1863      }
1864
1865      if (dom_isEmpty(clone)) {
1866        remove(clone);
1867        return point.node.nextSibling;
1868      }
1869    }
1870
1871    return clone;
1872  }
1873}
1874/**
1875 * @method splitTree
1876 *
1877 * split tree by point
1878 *
1879 * @param {Node} root - split root
1880 * @param {BoundaryPoint} point
1881 * @param {Object} [options]
1882 * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false
1883 * @param {Boolean} [options.isNotSplitEdgePoint] - default: false
1884 * @return {Node} right node of boundaryPoint
1885 */
1886
1887
1888function splitTree(root, point, options) {
1889  // ex) [#text, <span>, <p>]
1890  var ancestors = listAncestor(point.node, func.eq(root));
1891
1892  if (!ancestors.length) {
1893    return null;
1894  } else if (ancestors.length === 1) {
1895    return splitNode(point, options);
1896  }
1897
1898  return ancestors.reduce(function (node, parent) {
1899    if (node === point.node) {
1900      node = splitNode(point, options);
1901    }
1902
1903    return splitNode({
1904      node: parent,
1905      offset: node ? dom_position(node) : nodeLength(parent)
1906    }, options);
1907  });
1908}
1909/**
1910 * split point
1911 *
1912 * @param {Point} point
1913 * @param {Boolean} isInline
1914 * @return {Object}
1915 */
1916
1917
1918function splitPoint(point, isInline) {
1919  // find splitRoot, container
1920  //  - inline: splitRoot is a child of paragraph
1921  //  - block: splitRoot is a child of bodyContainer
1922  var pred = isInline ? isPara : isBodyContainer;
1923  var ancestors = listAncestor(point.node, pred);
1924  var topAncestor = lists.last(ancestors) || point.node;
1925  var splitRoot, container;
1926
1927  if (pred(topAncestor)) {
1928    splitRoot = ancestors[ancestors.length - 2];
1929    container = topAncestor;
1930  } else {
1931    splitRoot = topAncestor;
1932    container = splitRoot.parentNode;
1933  } // if splitRoot is exists, split with splitTree
1934
1935
1936  var pivot = splitRoot && splitTree(splitRoot, point, {
1937    isSkipPaddingBlankHTML: isInline,
1938    isNotSplitEdgePoint: isInline
1939  }); // if container is point.node, find pivot with point.offset
1940
1941  if (!pivot && container === point.node) {
1942    pivot = point.node.childNodes[point.offset];
1943  }
1944
1945  return {
1946    rightNode: pivot,
1947    container: container
1948  };
1949}
1950
1951function dom_create(nodeName) {
1952  return document.createElement(nodeName);
1953}
1954
1955function createText(text) {
1956  return document.createTextNode(text);
1957}
1958/**
1959 * @method remove
1960 *
1961 * remove node, (isRemoveChild: remove child or not)
1962 *
1963 * @param {Node} node
1964 * @param {Boolean} isRemoveChild
1965 */
1966
1967
1968function remove(node, isRemoveChild) {
1969  if (!node || !node.parentNode) {
1970    return;
1971  }
1972
1973  if (node.removeNode) {
1974    return node.removeNode(isRemoveChild);
1975  }
1976
1977  var parent = node.parentNode;
1978
1979  if (!isRemoveChild) {
1980    var nodes = [];
1981
1982    for (var i = 0, len = node.childNodes.length; i < len; i++) {
1983      nodes.push(node.childNodes[i]);
1984    }
1985
1986    for (var _i = 0, _len = nodes.length; _i < _len; _i++) {
1987      parent.insertBefore(nodes[_i], node);
1988    }
1989  }
1990
1991  parent.removeChild(node);
1992}
1993/**
1994 * @method removeWhile
1995 *
1996 * @param {Node} node
1997 * @param {Function} pred
1998 */
1999
2000
2001function removeWhile(node, pred) {
2002  while (node) {
2003    if (isEditable(node) || !pred(node)) {
2004      break;
2005    }
2006
2007    var parent = node.parentNode;
2008    remove(node);
2009    node = parent;
2010  }
2011}
2012/**
2013 * @method replace
2014 *
2015 * replace node with provided nodeName
2016 *
2017 * @param {Node} node
2018 * @param {String} nodeName
2019 * @return {Node} - new node
2020 */
2021
2022
2023function dom_replace(node, nodeName) {
2024  if (node.nodeName.toUpperCase() === nodeName.toUpperCase()) {
2025    return node;
2026  }
2027
2028  var newNode = dom_create(nodeName);
2029
2030  if (node.style.cssText) {
2031    newNode.style.cssText = node.style.cssText;
2032  }
2033
2034  appendChildNodes(newNode, lists.from(node.childNodes));
2035  insertAfter(newNode, node);
2036  remove(node);
2037  return newNode;
2038}
2039
2040var isTextarea = makePredByNodeName('TEXTAREA');
2041/**
2042 * @param {jQuery} $node
2043 * @param {Boolean} [stripLinebreaks] - default: false
2044 */
2045
2046function dom_value($node, stripLinebreaks) {
2047  var val = isTextarea($node[0]) ? $node.val() : $node.html();
2048
2049  if (stripLinebreaks) {
2050    return val.replace(/[\n\r]/g, '');
2051  }
2052
2053  return val;
2054}
2055/**
2056 * @method html
2057 *
2058 * get the HTML contents of node
2059 *
2060 * @param {jQuery} $node
2061 * @param {Boolean} [isNewlineOnBlock]
2062 */
2063
2064
2065function dom_html($node, isNewlineOnBlock) {
2066  var markup = dom_value($node);
2067
2068  if (isNewlineOnBlock) {
2069    var regexTag = /<(\/?)(\b(?!!)[^>\s]*)(.*?)(\s*\/?>)/g;
2070    markup = markup.replace(regexTag, function (match, endSlash, name) {
2071      name = name.toUpperCase();
2072      var isEndOfInlineContainer = /^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(name) && !!endSlash;
2073      var isBlockNode = /^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(name);
2074      return match + (isEndOfInlineContainer || isBlockNode ? '\n' : '');
2075    });
2076    markup = markup.trim();
2077  }
2078
2079  return markup;
2080}
2081
2082function posFromPlaceholder(placeholder) {
2083  var $placeholder = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(placeholder);
2084  var pos = $placeholder.offset();
2085  var height = $placeholder.outerHeight(true); // include margin
2086
2087  return {
2088    left: pos.left,
2089    top: pos.top + height
2090  };
2091}
2092
2093function attachEvents($node, events) {
2094  Object.keys(events).forEach(function (key) {
2095    $node.on(key, events[key]);
2096  });
2097}
2098
2099function detachEvents($node, events) {
2100  Object.keys(events).forEach(function (key) {
2101    $node.off(key, events[key]);
2102  });
2103}
2104/**
2105 * @method isCustomStyleTag
2106 *
2107 * assert if a node contains a "note-styletag" class,
2108 * which implies that's a custom-made style tag node
2109 *
2110 * @param {Node} an HTML DOM node
2111 */
2112
2113
2114function isCustomStyleTag(node) {
2115  return node && !isText(node) && lists.contains(node.classList, 'note-styletag');
2116}
2117
2118/* harmony default export */ var dom = ({
2119  /** @property {String} NBSP_CHAR */
2120  NBSP_CHAR: NBSP_CHAR,
2121
2122  /** @property {String} ZERO_WIDTH_NBSP_CHAR */
2123  ZERO_WIDTH_NBSP_CHAR: ZERO_WIDTH_NBSP_CHAR,
2124
2125  /** @property {String} blank */
2126  blank: blankHTML,
2127
2128  /** @property {String} emptyPara */
2129  emptyPara: "<p>".concat(blankHTML, "</p>"),
2130  makePredByNodeName: makePredByNodeName,
2131  isEditable: isEditable,
2132  isControlSizing: isControlSizing,
2133  isText: isText,
2134  isElement: isElement,
2135  isVoid: isVoid,
2136  isPara: isPara,
2137  isPurePara: isPurePara,
2138  isHeading: isHeading,
2139  isInline: dom_isInline,
2140  isBlock: func.not(dom_isInline),
2141  isBodyInline: isBodyInline,
2142  isBody: isBody,
2143  isParaInline: isParaInline,
2144  isPre: isPre,
2145  isList: isList,
2146  isTable: isTable,
2147  isData: isData,
2148  isCell: dom_isCell,
2149  isBlockquote: isBlockquote,
2150  isBodyContainer: isBodyContainer,
2151  isAnchor: isAnchor,
2152  isDiv: makePredByNodeName('DIV'),
2153  isLi: isLi,
2154  isBR: makePredByNodeName('BR'),
2155  isSpan: makePredByNodeName('SPAN'),
2156  isB: makePredByNodeName('B'),
2157  isU: makePredByNodeName('U'),
2158  isS: makePredByNodeName('S'),
2159  isI: makePredByNodeName('I'),
2160  isImg: makePredByNodeName('IMG'),
2161  isTextarea: isTextarea,
2162  deepestChildIsEmpty: deepestChildIsEmpty,
2163  isEmpty: dom_isEmpty,
2164  isEmptyAnchor: func.and(isAnchor, dom_isEmpty),
2165  isClosestSibling: isClosestSibling,
2166  withClosestSiblings: withClosestSiblings,
2167  nodeLength: nodeLength,
2168  isLeftEdgePoint: isLeftEdgePoint,
2169  isRightEdgePoint: isRightEdgePoint,
2170  isEdgePoint: isEdgePoint,
2171  isLeftEdgeOf: dom_isLeftEdgeOf,
2172  isRightEdgeOf: isRightEdgeOf,
2173  isLeftEdgePointOf: isLeftEdgePointOf,
2174  isRightEdgePointOf: isRightEdgePointOf,
2175  prevPoint: dom_prevPoint,
2176  nextPoint: dom_nextPoint,
2177  nextPointWithEmptyNode: nextPointWithEmptyNode,
2178  isSamePoint: isSamePoint,
2179  isVisiblePoint: isVisiblePoint,
2180  prevPointUntil: prevPointUntil,
2181  nextPointUntil: nextPointUntil,
2182  isCharPoint: isCharPoint,
2183  isSpacePoint: isSpacePoint,
2184  walkPoint: walkPoint,
2185  ancestor: dom_ancestor,
2186  singleChildAncestor: singleChildAncestor,
2187  listAncestor: listAncestor,
2188  lastAncestor: lastAncestor,
2189  listNext: listNext,
2190  listPrev: listPrev,
2191  listDescendant: listDescendant,
2192  commonAncestor: dom_commonAncestor,
2193  wrap: wrap,
2194  insertAfter: insertAfter,
2195  appendChildNodes: appendChildNodes,
2196  position: dom_position,
2197  hasChildren: hasChildren,
2198  makeOffsetPath: makeOffsetPath,
2199  fromOffsetPath: fromOffsetPath,
2200  splitTree: splitTree,
2201  splitPoint: splitPoint,
2202  create: dom_create,
2203  createText: createText,
2204  remove: remove,
2205  removeWhile: removeWhile,
2206  replace: dom_replace,
2207  html: dom_html,
2208  value: dom_value,
2209  posFromPlaceholder: posFromPlaceholder,
2210  attachEvents: attachEvents,
2211  detachEvents: detachEvents,
2212  isCustomStyleTag: isCustomStyleTag
2213});
2214// CONCATENATED MODULE: ./src/js/base/Context.js
2215function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
2216
2217function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
2218
2219function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
2220
2221
2222
2223
2224
2225
2226var Context_Context = /*#__PURE__*/function () {
2227  /**
2228   * @param {jQuery} $note
2229   * @param {Object} options
2230   */
2231  function Context($note, options) {
2232    _classCallCheck(this, Context);
2233
2234    this.$note = $note;
2235    this.memos = {};
2236    this.modules = {};
2237    this.layoutInfo = {};
2238    this.options = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.extend(true, {}, options); // init ui with options
2239
2240    external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.ui = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.ui_template(this.options);
2241    this.ui = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.ui;
2242    this.initialize();
2243  }
2244  /**
2245   * create layout and initialize modules and other resources
2246   */
2247
2248
2249  _createClass(Context, [{
2250    key: "initialize",
2251    value: function initialize() {
2252      this.layoutInfo = this.ui.createLayout(this.$note);
2253
2254      this._initialize();
2255
2256      this.$note.hide();
2257      return this;
2258    }
2259    /**
2260     * destroy modules and other resources and remove layout
2261     */
2262
2263  }, {
2264    key: "destroy",
2265    value: function destroy() {
2266      this._destroy();
2267
2268      this.$note.removeData('summernote');
2269      this.ui.removeLayout(this.$note, this.layoutInfo);
2270    }
2271    /**
2272     * destory modules and other resources and initialize it again
2273     */
2274
2275  }, {
2276    key: "reset",
2277    value: function reset() {
2278      var disabled = this.isDisabled();
2279      this.code(dom.emptyPara);
2280
2281      this._destroy();
2282
2283      this._initialize();
2284
2285      if (disabled) {
2286        this.disable();
2287      }
2288    }
2289  }, {
2290    key: "_initialize",
2291    value: function _initialize() {
2292      var _this = this;
2293
2294      // set own id
2295      this.options.id = func.uniqueId(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.now()); // set default container for tooltips, popovers, and dialogs
2296
2297      this.options.container = this.options.container || this.layoutInfo.editor; // add optional buttons
2298
2299      var buttons = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.extend({}, this.options.buttons);
2300      Object.keys(buttons).forEach(function (key) {
2301        _this.memo('button.' + key, buttons[key]);
2302      });
2303      var modules = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.extend({}, this.options.modules, external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a
vendor: 4,583 bytes, lines 2303-2475
2303.summernote.plugins || {}); // add and initialize modules
2304
2305      Object.keys(modules).forEach(function (key) {
2306        _this.module(key, modules[key], true);
2307      });
2308      Object.keys(this.modules).forEach(function (key) {
2309        _this.initializeModule(key);
2310      });
2311    }
2312  }, {
2313    key: "_destroy",
2314    value: function _destroy() {
2315      var _this2 = this;
2316
2317      // destroy modules with reversed order
2318      Object.keys(this.modules).reverse().forEach(function (key) {
2319        _this2.removeModule(key);
2320      });
2321      Object.keys(this.memos).forEach(function (key) {
2322        _this2.removeMemo(key);
2323      }); // trigger custom onDestroy callback
2324
2325      this.triggerEvent('destroy', this);
2326    }
2327  }, {
2328    key: "code",
2329    value: function code(html) {
2330      var isActivated = this.invoke('codeview.isActivated');
2331
2332      if (html === undefined) {
2333        this.invoke('codeview.sync');
2334        return isActivated ? this.layoutInfo.codable.val() : this.layoutInfo.editable.html();
2335      } else {
2336        if (isActivated) {
2337          this.invoke('codeview.sync', html);
2338        } else {
2339          this.layoutInfo.editable.html(html);
2340        }
2341
2342        this.$note.val(html);
2343        this.triggerEvent('change', html, this.layoutInfo.editable);
2344      }
2345    }
2346  }, {
2347    key: "isDisabled",
2348    value: function isDisabled() {
2349      return this.layoutInfo.editable.attr('contenteditable') === 'false';
2350    }
2351  }, {
2352    key: "enable",
2353    value: function enable() {
2354      this.layoutInfo.editable.attr('contenteditable', true);
2355      this.invoke('toolbar.activate', true);
2356      this.triggerEvent('disable', false);
2357      this.options.editing = true;
2358    }
2359  }, {
2360    key: "disable",
2361    value: function disable() {
2362      // close codeview if codeview is opend
2363      if (this.invoke('codeview.isActivated')) {
2364        this.invoke('codeview.deactivate');
2365      }
2366
2367      this.layoutInfo.editable.attr('contenteditable', false);
2368      this.options.editing = false;
2369      this.invoke('toolbar.deactivate', true);
2370      this.triggerEvent('disable', true);
2371    }
2372  }, {
2373    key: "triggerEvent",
2374    value: function triggerEvent() {
2375      var namespace = lists.head(arguments);
2376      var args = lists.tail(lists.from(arguments));
2377      var callback = this.options.callbacks[func.namespaceToCamel(namespace, 'on')];
2378
2379      if (callback) {
2380        callback.apply(this.$note[0], args);
2381      }
2382
2383      this.$note.trigger('summernote.' + namespace, args);
2384    }
2385  }, {
2386    key: "initializeModule",
2387    value: function initializeModule(key) {
2388      var module = this.modules[key];
2389      module.shouldInitialize = module.shouldInitialize || func.ok;
2390
2391      if (!module.shouldInitialize()) {
2392        return;
2393      } // initialize module
2394
2395
2396      if (module.initialize) {
2397        module.initialize();
2398      } // attach events
2399
2400
2401      if (module.events) {
2402        dom.attachEvents(this.$note, module.events);
2403      }
2404    }
2405  }, {
2406    key: "module",
2407    value: function module(key, ModuleClass, withoutIntialize) {
2408      if (arguments.length === 1) {
2409        return this.modules[key];
2410      }
2411
2412      this.modules[key] = new ModuleClass(this);
2413
2414      if (!withoutIntialize) {
2415        this.initializeModule(key);
2416      }
2417    }
2418  }, {
2419    key: "removeModule",
2420    value: function removeModule(key) {
2421      var module = this.modules[key];
2422
2423      if (module.shouldInitialize()) {
2424        if (module.events) {
2425          dom.detachEvents(this.$note, module.events);
2426        }
2427
2428        if (module.destroy) {
2429          module.destroy();
2430        }
2431      }
2432
2433      delete this.modules[key];
2434    }
2435  }, {
2436    key: "memo",
2437    value: function memo(key, obj) {
2438      if (arguments.length === 1) {
2439        return this.memos[key];
2440      }
2441
2442      this.memos[key] = obj;
2443    }
2444  }, {
2445    key: "removeMemo",
2446    value: function removeMemo(key) {
2447      if (this.memos[key] && this.memos[key].destroy) {
2448        this.memos[key].destroy();
2449      }
2450
2451      delete this.memos[key];
2452    }
2453    /**
2454     * Some buttons need to change their visual style immediately once they get pressed
2455     */
2456
2457  }, {
2458    key: "createInvokeHandlerAndUpdateState",
2459    value: function createInvokeHandlerAndUpdateState(namespace, value) {
2460      var _this3 = this;
2461
2462      return function (event) {
2463        _this3.createInvokeHandler(namespace, value)(event);
2464
2465        _this3.invoke('buttons.updateCurrentStyle');
2466      };
2467    }
2468  }, {
2469    key: "createInvokeHandler",
2470    value: function createInvokeHandler(namespace, value) {
2471      var _this4 = this;
2472
2473      return function (event) {
2474        event.preventDefault();
2475        var $target = external_
2475root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(event.target);
2476
2477        _this4.invoke(namespace, value || $target.closest('[data-value]').data('value'), $target);
2478      };
2479    }
2480  }, {
2481    key: "invoke",
2482    value: function invoke() {
2483      var namespace = lists.head(arguments);
2484      var args = lists.tail(lists.from(arguments));
2485      var splits = namespace.split('.');
2486      var hasSeparator = splits.length > 1;
2487      var moduleName = hasSeparator && lists.head(splits);
2488      var methodName = hasSeparator ? lists.last(splits) : lists.head(splits);
2489      var module = this.modules[moduleName || 'editor'];
2490
2491      if (!moduleName && this[methodName]) {
2492        return this[methodName].apply(this, args);
2493      } else if (module && module[methodName] && module.shouldInitialize()) {
2494        return module[methodName].apply(module, args);
2495      }
2496    }
2497  }]);
2498
2499  return Context;
2500}();
2501
2502
2503// CONCATENATED MODULE: ./src/js/summernote.js
2504
2505
2506
2507
2508external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.fn.extend({
2509  /**
2510   * Summernote API
2511   *
2512   * @param {Object|String}
2513   * @return {this}
2514   */
2515  summernote: function summernote() {
2516    var type = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.type(lists.head(arguments));
2517    var isExternalAPICalled = type === 'string';
2518    var hasInitOptions = type === 'object';
2519    var options = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.extend({}, external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.options, hasInitOptions ? lists.head(arguments) : {}); // Update options
2520
2521    options.langInfo = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.extend(true, {}, external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.lang['en-US'], external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.lang[options.lang]);
2522    options.icons = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.extend(true, {}, external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.options.icons, options.icons);
2523    options.tooltip = options.tooltip === 'auto' ? !env.isSupportTouch : options.tooltip;
2524    this.each(function (idx, note) {
2525      var $note = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(note);
2526
2527      if (!$note.data('summernote')) {
2528        var context = new Context_Context($note, options);
2529        $note.data('summernote', context);
2530        $note.data('summernote').triggerEvent('init', context.layoutInfo);
2531      }
2532    });
2533    var $note = this.first();
2534
2535    if ($note.length) {
2536      var context = $note.data('summernote');
2537
2538      if (isExternalAPICalled) {
vendor: 6,897 bytes, lines 2539-2775
2539        return context.invoke.apply(context, lists.from(arguments));
2540      } else if (options.focus) {
2541        context.invoke('editor.focus');
2542      }
2543    }
2544
2545    return this;
2546  }
2547});
2548// CONCATENATED MODULE: ./src/js/base/core/range.js
2549function range_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
2550
2551function range_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
2552
2553function range_createClass(Constructor, protoProps, staticProps) { if (protoProps) range_defineProperties(Constructor.prototype, protoProps); if (staticProps) range_defineProperties(Constructor, staticProps); return Constructor; }
2554
2555
2556
2557
2558
2559
2560/**
2561 * return boundaryPoint from TextRange, inspired by Andy Na's HuskyRange.js
2562 *
2563 * @param {TextRange} textRange
2564 * @param {Boolean} isStart
2565 * @return {BoundaryPoint}
2566 *
2567 * @see http://msdn.microsoft.com/en-us/library/ie/ms535872(v=vs.85).aspx
2568 */
2569
2570function textRangeToPoint(textRange, isStart) {
2571  var container = textRange.parentElement();
2572  var offset;
2573  var tester = document.body.createTextRange();
2574  var prevContainer;
2575  var childNodes = lists.from(container.childNodes);
2576
2577  for (offset = 0; offset < childNodes.length; offset++) {
2578    if (dom.isText(childNodes[offset])) {
2579      continue;
2580    }
2581
2582    tester.moveToElementText(childNodes[offset]);
2583
2584    if (tester.compareEndPoints('StartToStart', textRange) >= 0) {
2585      break;
2586    }
2587
2588    prevContainer = childNodes[offset];
2589  }
2590
2591  if (offset !== 0 && dom.isText(childNodes[offset - 1])) {
2592    var textRangeStart = document.body.createTextRange();
2593    var curTextNode = null;
2594    textRangeStart.moveToElementText(prevContainer || container);
2595    textRangeStart.collapse(!prevContainer);
2596    curTextNode = prevContainer ? prevContainer.nextSibling : container.firstChild;
2597    var pointTester = textRange.duplicate();
2598    pointTester.setEndPoint('StartToStart', textRangeStart);
2599    var textCount = pointTester.text.replace(/[\r\n]/g, '').length;
2600
2601    while (textCount > curTextNode.nodeValue.length && curTextNode.nextSibling) {
2602      textCount -= curTextNode.nodeValue.length;
2603      curTextNode = curTextNode.nextSibling;
2604    } // [workaround] enforce IE to re-reference curTextNode, hack
2605
2606
2607    var dummy = curTextNode.nodeValue; // eslint-disable-line
2608
2609    if (isStart && curTextNode.nextSibling && dom.isText(curTextNode.nextSibling) && textCount === curTextNode.nodeValue.length) {
2610      textCount -= curTextNode.nodeValue.length;
2611      curTextNode = curTextNode.nextSibling;
2612    }
2613
2614    container = curTextNode;
2615    offset = textCount;
2616  }
2617
2618  return {
2619    cont: container,
2620    offset: offset
2621  };
2622}
2623/**
2624 * return TextRange from boundary point (inspired by google closure-library)
2625 * @param {BoundaryPoint} point
2626 * @return {TextRange}
2627 */
2628
2629
2630function pointToTextRange(point) {
2631  var textRangeInfo = function textRangeInfo(container, offset) {
2632    var node, isCollapseToStart;
2633
2634    if (dom.isText(container)) {
2635      var prevTextNodes = dom.listPrev(container, func.not(dom.isText));
2636      var prevContainer = lists.last(prevTextNodes).previousSibling;
2637      node = prevContainer || container.parentNode;
2638      offset += lists.sum(lists.tail(prevTextNodes), dom.nodeLength);
2639      isCollapseToStart = !prevContainer;
2640    } else {
2641      node = container.childNodes[offset] || container;
2642
2643      if (dom.isText(node)) {
2644        return textRangeInfo(node, 0);
2645      }
2646
2647      offset = 0;
2648      isCollapseToStart = false;
2649    }
2650
2651    return {
2652      node: node,
2653      collapseToStart: isCollapseToStart,
2654      offset: offset
2655    };
2656  };
2657
2658  var textRange = document.body.createTextRange();
2659  var info = textRangeInfo(point.node, point.offset);
2660  textRange.moveToElementText(info.node);
2661  textRange.collapse(info.collapseToStart);
2662  textRange.moveStart('character', info.offset);
2663  return textRange;
2664}
2665/**
2666   * Wrapped Range
2667   *
2668   * @constructor
2669   * @param {Node} sc - start container
2670   * @param {Number} so - start offset
2671   * @param {Node} ec - end container
2672   * @param {Number} eo - end offset
2673   */
2674
2675
2676var range_WrappedRange = /*#__PURE__*/function () {
2677  function WrappedRange(sc, so, ec, eo) {
2678    range_classCallCheck(this, WrappedRange);
2679
2680    this.sc = sc;
2681    this.so = so;
2682    this.ec = ec;
2683    this.eo = eo; // isOnEditable: judge whether range is on editable or not
2684
2685    this.isOnEditable = this.makeIsOn(dom.isEditable); // isOnList: judge whether range is on list node or not
2686
2687    this.isOnList = this.makeIsOn(dom.isList); // isOnAnchor: judge whether range is on anchor node or not
2688
2689    this.isOnAnchor = this.makeIsOn(dom.isAnchor); // isOnCell: judge whether range is on cell node or not
2690
2691    this.isOnCell = this.makeIsOn(dom.isCell); // isOnData: judge whether range is on data node or not
2692
2693    this.isOnData = this.makeIsOn(dom.isData);
2694  } // nativeRange: get nativeRange from sc, so, ec, eo
2695
2696
2697  range_createClass(WrappedRange, [{
2698    key: "nativeRange",
2699    value: function nativeRange() {
2700      if (env.isW3CRangeSupport) {
2701        var w3cRange = document.createRange();
2702        w3cRange.setStart(this.sc, this.so);
2703        w3cRange.setEnd(this.ec, this.eo);
2704        return w3cRange;
2705      } else {
2706        var textRange = pointToTextRange({
2707          node: this.sc,
2708          offset: this.so
2709        });
2710        textRange.setEndPoint('EndToEnd', pointToTextRange({
2711          node: this.ec,
2712          offset: this.eo
2713        }));
2714        return textRange;
2715      }
2716    }
2717  }, {
2718    key: "getPoints",
2719    value: function getPoints() {
2720      return {
2721        sc: this.sc,
2722        so: this.so,
2723        ec: this.ec,
2724        eo: this.eo
2725      };
2726    }
2727  }, {
2728    key: "getStartPoint",
2729    value: function getStartPoint() {
2730      return {
2731        node: this.sc,
2732        offset: this.so
2733      };
2734    }
2735  }, {
2736    key: "getEndPoint",
2737    value: function getEndPoint() {
2738      return {
2739        node: this.ec,
2740        offset: this.eo
2741      };
2742    }
2743    /**
2744     * select update visible range
2745     */
2746
2747  }, {
2748    key: "select",
2749    value: function select() {
2750      var nativeRng = this.nativeRange();
2751
2752      if (env.isW3CRangeSupport) {
2753        var selection = document.getSelection();
2754
2755        if (selection.rangeCount > 0) {
2756          selection.removeAllRanges();
2757        }
2758
2759        selection.addRange(nativeRng);
2760      } else {
2761        nativeRng.select();
2762      }
2763
2764      return this;
2765    }
2766    /**
2767     * Moves the scrollbar to start container(sc) of current range
2768     *
2769     * @return {WrappedRange}
2770     */
2771
2772  }, {
2773    key: "scrollIntoView",
2774    value: function scrollIntoView(container) {
2775      var height = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jq
vendor: 7,168 bytes, lines 2775-3003
2775uery_default()(container).height();
2776
2777      if (container.scrollTop + height < this.sc.offsetTop) {
2778        container.scrollTop += Math.abs(container.scrollTop + height - this.sc.offsetTop);
2779      }
2780
2781      return this;
2782    }
2783    /**
2784     * @return {WrappedRange}
2785     */
2786
2787  }, {
2788    key: "normalize",
2789    value: function normalize() {
2790      /**
2791       * @param {BoundaryPoint} point
2792       * @param {Boolean} isLeftToRight - true: prefer to choose right node
2793       *                                - false: prefer to choose left node
2794       * @return {BoundaryPoint}
2795       */
2796      var getVisiblePoint = function getVisiblePoint(point, isLeftToRight) {
2797        if (!point) {
2798          return point;
2799        } // Just use the given point [XXX:Adhoc]
2800        //  - case 01. if the point is on the middle of the node
2801        //  - case 02. if the point is on the right edge and prefer to choose left node
2802        //  - case 03. if the point is on the left edge and prefer to choose right node
2803        //  - case 04. if the point is on the right edge and prefer to choose right node but the node is void
2804        //  - case 05. if the point is on the left edge and prefer to choose left node but the node is void
2805        //  - case 06. if the point is on the block node and there is no children
2806
2807
2808        if (dom.isVisiblePoint(point)) {
2809          if (!dom.isEdgePoint(point) || dom.isRightEdgePoint(point) && !isLeftToRight || dom.isLeftEdgePoint(point) && isLeftToRight || dom.isRightEdgePoint(point) && isLeftToRight && dom.isVoid(point.node.nextSibling) || dom.isLeftEdgePoint(point) && !isLeftToRight && dom.isVoid(point.node.previousSibling) || dom.isBlock(point.node) && dom.isEmpty(point.node)) {
2810            return point;
2811          }
2812        } // point on block's edge
2813
2814
2815        var block = dom.ancestor(point.node, dom.isBlock);
2816        var hasRightNode = false;
2817
2818        if (!hasRightNode) {
2819          var prevPoint = dom.prevPoint(point) || {
2820            node: null
2821          };
2822          hasRightNode = (dom.isLeftEdgePointOf(point, block) || dom.isVoid(prevPoint.node)) && !isLeftToRight;
2823        }
2824
2825        var hasLeftNode = false;
2826
2827        if (!hasLeftNode) {
2828          var _nextPoint = dom.nextPoint(point) || {
2829            node: null
2830          };
2831
2832          hasLeftNode = (dom.isRightEdgePointOf(point, block) || dom.isVoid(_nextPoint.node)) && isLeftToRight;
2833        }
2834
2835        if (hasRightNode || hasLeftNode) {
2836          // returns point already on visible point
2837          if (dom.isVisiblePoint(point)) {
2838            return point;
2839          } // reverse direction
2840
2841
2842          isLeftToRight = !isLeftToRight;
2843        }
2844
2845        var nextPoint = isLeftToRight ? dom.nextPointUntil(dom.nextPoint(point), dom.isVisiblePoint) : dom.prevPointUntil(dom.prevPoint(point), dom.isVisiblePoint);
2846        return nextPoint || point;
2847      };
2848
2849      var endPoint = getVisiblePoint(this.getEndPoint(), false);
2850      var startPoint = this.isCollapsed() ? endPoint : getVisiblePoint(this.getStartPoint(), true);
2851      return new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
2852    }
2853    /**
2854     * returns matched nodes on range
2855     *
2856     * @param {Function} [pred] - predicate function
2857     * @param {Object} [options]
2858     * @param {Boolean} [options.includeAncestor]
2859     * @param {Boolean} [options.fullyContains]
2860     * @return {Node[]}
2861     */
2862
2863  }, {
2864    key: "nodes",
2865    value: function nodes(pred, options) {
2866      pred = pred || func.ok;
2867      var includeAncestor = options && options.includeAncestor;
2868      var fullyContains = options && options.fullyContains; // TODO compare points and sort
2869
2870      var startPoint = this.getStartPoint();
2871      var endPoint = this.getEndPoint();
2872      var nodes = [];
2873      var leftEdgeNodes = [];
2874      dom.walkPoint(startPoint, endPoint, function (point) {
2875        if (dom.isEditable(point.node)) {
2876          return;
2877        }
2878
2879        var node;
2880
2881        if (fullyContains) {
2882          if (dom.isLeftEdgePoint(point)) {
2883            leftEdgeNodes.push(point.node);
2884          }
2885
2886          if (dom.isRightEdgePoint(point) && lists.contains(leftEdgeNodes, point.node)) {
2887            node = point.node;
2888          }
2889        } else if (includeAncestor) {
2890          node = dom.ancestor(point.node, pred);
2891        } else {
2892          node = point.node;
2893        }
2894
2895        if (node && pred(node)) {
2896          nodes.push(node);
2897        }
2898      }, true);
2899      return lists.unique(nodes);
2900    }
2901    /**
2902     * returns commonAncestor of range
2903     * @return {Element} - commonAncestor
2904     */
2905
2906  }, {
2907    key: "commonAncestor",
2908    value: function commonAncestor() {
2909      return dom.commonAncestor(this.sc, this.ec);
2910    }
2911    /**
2912     * returns expanded range by pred
2913     *
2914     * @param {Function} pred - predicate function
2915     * @return {WrappedRange}
2916     */
2917
2918  }, {
2919    key: "expand",
2920    value: function expand(pred) {
2921      var startAncestor = dom.ancestor(this.sc, pred);
2922      var endAncestor = dom.ancestor(this.ec, pred);
2923
2924      if (!startAncestor && !endAncestor) {
2925        return new WrappedRange(this.sc, this.so, this.ec, this.eo);
2926      }
2927
2928      var boundaryPoints = this.getPoints();
2929
2930      if (startAncestor) {
2931        boundaryPoints.sc = startAncestor;
2932        boundaryPoints.so = 0;
2933      }
2934
2935      if (endAncestor) {
2936        boundaryPoints.ec = endAncestor;
2937        boundaryPoints.eo = dom.nodeLength(endAncestor);
2938      }
2939
2940      return new WrappedRange(boundaryPoints.sc, boundaryPoints.so, boundaryPoints.ec, boundaryPoints.eo);
2941    }
2942    /**
2943     * @param {Boolean} isCollapseToStart
2944     * @return {WrappedRange}
2945     */
2946
2947  }, {
2948    key: "collapse",
2949    value: function collapse(isCollapseToStart) {
2950      if (isCollapseToStart) {
2951        return new WrappedRange(this.sc, this.so, this.sc, this.so);
2952      } else {
2953        return new WrappedRange(this.ec, this.eo, this.ec, this.eo);
2954      }
2955    }
2956    /**
2957     * splitText on range
2958     */
2959
2960  }, {
2961    key: "splitText",
2962    value: function splitText() {
2963      var isSameContainer = this.sc === this.ec;
2964      var boundaryPoints = this.getPoints();
2965
2966      if (dom.isText(this.ec) && !dom.isEdgePoint(this.getEndPoint())) {
2967        this.ec.splitText(this.eo);
2968      }
2969
2970      if (dom.isText(this.sc) && !dom.isEdgePoint(this.getStartPoint())) {
2971        boundaryPoints.sc = this.sc.splitText(this.so);
2972        boundaryPoints.so = 0;
2973
2974        if (isSameContainer) {
2975          boundaryPoints.ec = boundaryPoints.sc;
2976          boundaryPoints.eo = this.eo - this.so;
2977        }
2978      }
2979
2980      return new WrappedRange(boundaryPoints.sc, boundaryPoints.so, boundaryPoints.ec, boundaryPoints.eo);
2981    }
2982    /**
2983     * delete contents on range
2984     * @return {WrappedRange}
2985     */
2986
2987  }, {
2988    key: "deleteContents",
2989    value: function deleteContents() {
2990      if (this.isCollapsed()) {
2991        return this;
2992      }
2993
2994      var rng = this.splitText();
2995      var nodes = rng.nodes(null, {
2996        fullyContains: true
2997      }); // find new cursor point
2998
2999      var point = dom.prevPointUntil(rng.getStartPoint(), function (point) {
3000        return !lists.contains(nodes, point.node);
3001      });
3002      var emptyParents = [];
3003      external_
vendor: 1,136 bytes, lines 3003-3040
3003root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(nodes, function (idx, node) {
3004        // find empty parents
3005        var parent = node.parentNode;
3006
3007        if (point.node !== parent && dom.nodeLength(parent) === 1) {
3008          emptyParents.push(parent);
3009        }
3010
3011        dom.remove(node, false);
3012      }); // remove empty parents
3013
3014      external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(emptyParents, function (idx, node) {
3015        dom.remove(node, false);
3016      });
3017      return new WrappedRange(point.node, point.offset, point.node, point.offset).normalize();
3018    }
3019    /**
3020     * makeIsOn: return isOn(pred) function
3021     */
3022
3023  }, {
3024    key: "makeIsOn",
3025    value: function makeIsOn(pred) {
3026      return function () {
3027        var ancestor = dom.ancestor(this.sc, pred);
3028        return !!ancestor && ancestor === dom.ancestor(this.ec, pred);
3029      };
3030    }
3031    /**
3032     * @param {Function} pred
3033     * @return {Boolean}
3034     */
3035
3036  }, {
3037    key: "isLeftEdgeOf",
3038    value: function isLeftEdgeOf(pred) {
3039      if (!dom.isLeftEdgePoint(this.getStartPoint())) {
3040        return false;
vendor: 8,927 bytes, lines 3041-3369
3041      }
3042
3043      var node = dom.ancestor(this.sc, pred);
3044      return node && dom.isLeftEdgeOf(this.sc, node);
3045    }
3046    /**
3047     * returns whether range was collapsed or not
3048     */
3049
3050  }, {
3051    key: "isCollapsed",
3052    value: function isCollapsed() {
3053      return this.sc === this.ec && this.so === this.eo;
3054    }
3055    /**
3056     * wrap inline nodes which children of body with paragraph
3057     *
3058     * @return {WrappedRange}
3059     */
3060
3061  }, {
3062    key: "wrapBodyInlineWithPara",
3063    value: function wrapBodyInlineWithPara() {
3064      if (dom.isBodyContainer(this.sc) && dom.isEmpty(this.sc)) {
3065        this.sc.innerHTML = dom.emptyPara;
3066        return new WrappedRange(this.sc.firstChild, 0, this.sc.firstChild, 0);
3067      }
3068      /**
3069       * [workaround] firefox often create range on not visible point. so normalize here.
3070       *  - firefox: |<p>text</p>|
3071       *  - chrome: <p>|text|</p>
3072       */
3073
3074
3075      var rng = this.normalize();
3076
3077      if (dom.isParaInline(this.sc) || dom.isPara(this.sc)) {
3078        return rng;
3079      } // find inline top ancestor
3080
3081
3082      var topAncestor;
3083
3084      if (dom.isInline(rng.sc)) {
3085        var ancestors = dom.listAncestor(rng.sc, func.not(dom.isInline));
3086        topAncestor = lists.last(ancestors);
3087
3088        if (!dom.isInline(topAncestor)) {
3089          topAncestor = ancestors[ancestors.length - 2] || rng.sc.childNodes[rng.so];
3090        }
3091      } else {
3092        topAncestor = rng.sc.childNodes[rng.so > 0 ? rng.so - 1 : 0];
3093      }
3094
3095      if (topAncestor) {
3096        // siblings not in paragraph
3097        var inlineSiblings = dom.listPrev(topAncestor, dom.isParaInline).reverse();
3098        inlineSiblings = inlineSiblings.concat(dom.listNext(topAncestor.nextSibling, dom.isParaInline)); // wrap with paragraph
3099
3100        if (inlineSiblings.length) {
3101          var para = dom.wrap(lists.head(inlineSiblings), 'p');
3102          dom.appendChildNodes(para, lists.tail(inlineSiblings));
3103        }
3104      }
3105
3106      return this.normalize();
3107    }
3108    /**
3109     * insert node at current cursor
3110     *
3111     * @param {Node} node
3112     * @return {Node}
3113     */
3114
3115  }, {
3116    key: "insertNode",
3117    value: function insertNode(node) {
3118      var rng = this;
3119
3120      if (dom.isText(node) || dom.isInline(node)) {
3121        rng = this.wrapBodyInlineWithPara().deleteContents();
3122      }
3123
3124      var info = dom.splitPoint(rng.getStartPoint(), dom.isInline(node));
3125
3126      if (info.rightNode) {
3127        info.rightNode.parentNode.insertBefore(node, info.rightNode);
3128
3129        if (dom.isEmpty(info.rightNode) && dom.isPara(node)) {
3130          info.rightNode.parentNode.removeChild(info.rightNode);
3131        }
3132      } else {
3133        info.container.appendChild(node);
3134      }
3135
3136      return node;
3137    }
3138    /**
3139     * insert html at current cursor
3140     */
3141
3142  }, {
3143    key: "pasteHTML",
3144    value: function pasteHTML(markup) {
3145      markup = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.trim(markup);
3146      var contentsContainer = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<div></div>').html(markup)[0];
3147      var childNodes = lists.from(contentsContainer.childNodes); // const rng = this.wrapBodyInlineWithPara().deleteContents();
3148
3149      var rng = this;
3150      var reversed = false;
3151
3152      if (rng.so >= 0) {
3153        childNodes = childNodes.reverse();
3154        reversed = true;
3155      }
3156
3157      childNodes = childNodes.map(function (childNode) {
3158        return rng.insertNode(childNode);
3159      });
3160
3161      if (reversed) {
3162        childNodes = childNodes.reverse();
3163      }
3164
3165      return childNodes;
3166    }
3167    /**
3168     * returns text in range
3169     *
3170     * @return {String}
3171     */
3172
3173  }, {
3174    key: "toString",
3175    value: function toString() {
3176      var nativeRng = this.nativeRange();
3177      return env.isW3CRangeSupport ? nativeRng.toString() : nativeRng.text;
3178    }
3179    /**
3180     * returns range for word before cursor
3181     *
3182     * @param {Boolean} [findAfter] - find after cursor, default: false
3183     * @return {WrappedRange}
3184     */
3185
3186  }, {
3187    key: "getWordRange",
3188    value: function getWordRange(findAfter) {
3189      var endPoint = this.getEndPoint();
3190
3191      if (!dom.isCharPoint(endPoint)) {
3192        return this;
3193      }
3194
3195      var startPoint = dom.prevPointUntil(endPoint, function (point) {
3196        return !dom.isCharPoint(point);
3197      });
3198
3199      if (findAfter) {
3200        endPoint = dom.nextPointUntil(endPoint, function (point) {
3201          return !dom.isCharPoint(point);
3202        });
3203      }
3204
3205      return new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
3206    }
3207    /**
3208     * returns range for words before cursor
3209     *
3210     * @param {Boolean} [findAfter] - find after cursor, default: false
3211     * @return {WrappedRange}
3212     */
3213
3214  }, {
3215    key: "getWordsRange",
3216    value: function getWordsRange(findAfter) {
3217      var endPoint = this.getEndPoint();
3218
3219      var isNotTextPoint = function isNotTextPoint(point) {
3220        return !dom.isCharPoint(point) && !dom.isSpacePoint(point);
3221      };
3222
3223      if (isNotTextPoint(endPoint)) {
3224        return this;
3225      }
3226
3227      var startPoint = dom.prevPointUntil(endPoint, isNotTextPoint);
3228
3229      if (findAfter) {
3230        endPoint = dom.nextPointUntil(endPoint, isNotTextPoint);
3231      }
3232
3233      return new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
3234    }
3235    /**
3236     * returns range for words before cursor that match with a Regex
3237     *
3238     * example:
3239     *  range: 'hi @Peter Pan'
3240     *  regex: '/@[a-z ]+/i'
3241     *  return range: '@Peter Pan'
3242     *
3243     * @param {RegExp} [regex]
3244     * @return {WrappedRange|null}
3245     */
3246
3247  }, {
3248    key: "getWordsMatchRange",
3249    value: function getWordsMatchRange(regex) {
3250      var endPoint = this.getEndPoint();
3251      var startPoint = dom.prevPointUntil(endPoint, function (point) {
3252        if (!dom.isCharPoint(point) && !dom.isSpacePoint(point)) {
3253          return true;
3254        }
3255
3256        var rng = new WrappedRange(point.node, point.offset, endPoint.node, endPoint.offset);
3257        var result = regex.exec(rng.toString());
3258        return result && result.index === 0;
3259      });
3260      var rng = new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
3261      var text = rng.toString();
3262      var result = regex.exec(text);
3263
3264      if (result && result[0].length === text.length) {
3265        return rng;
3266      } else {
3267        return null;
3268      }
3269    }
3270    /**
3271     * create offsetPath bookmark
3272     *
3273     * @param {Node} editable
3274     */
3275
3276  }, {
3277    key: "bookmark",
3278    value: function bookmark(editable) {
3279      return {
3280        s: {
3281          path: dom.makeOffsetPath(editable, this.sc),
3282          offset: this.so
3283        },
3284        e: {
3285          path: dom.makeOffsetPath(editable, this.ec),
3286          offset: this.eo
3287        }
3288      };
3289    }
3290    /**
3291     * create offsetPath bookmark base on paragraph
3292     *
3293     * @param {Node[]} paras
3294     */
3295
3296  }, {
3297    key: "paraBookmark",
3298    value: function paraBookmark(paras) {
3299      return {
3300        s: {
3301          path: lists.tail(dom.makeOffsetPath(lists.head(paras), this.sc)),
3302          offset: this.so
3303        },
3304        e: {
3305          path: lists.tail(dom.makeOffsetPath(lists.last(paras), this.ec)),
3306          offset: this.eo
3307        }
3308      };
3309    }
3310    /**
3311     * getClientRects
3312     * @return {Rect[]}
3313     */
3314
3315  }, {
3316    key: "getClientRects",
3317    value: function getClientRects() {
3318      var nativeRng = this.nativeRange();
3319      return nativeRng.getClientRects();
3320    }
3321  }]);
3322
3323  return WrappedRange;
3324}();
3325/**
3326 * Data structure
3327 *  * BoundaryPoint: a point of dom tree
3328 *  * BoundaryPoints: two boundaryPoints corresponding to the start and the end of the Range
3329 *
3330 * See to http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Position
3331 */
3332
3333
3334/* harmony default export */ var range = ({
3335  /**
3336   * create Range Object From arguments or Browser Selection
3337   *
3338   * @param {Node} sc - start container
3339   * @param {Number} so - start offset
3340   * @param {Node} ec - end container
3341   * @param {Number} eo - end offset
3342   * @return {WrappedRange}
3343   */
3344  create: function create(sc, so, ec, eo) {
3345    if (arguments.length === 4) {
3346      return new range_WrappedRange(sc, so, ec, eo);
3347    } else if (arguments.length === 2) {
3348      // collapsed
3349      ec = sc;
3350      eo = so;
3351      return new range_WrappedRange(sc, so, ec, eo);
3352    } else {
3353      var wrappedRange = this.createFromSelection();
3354
3355      if (!wrappedRange && arguments.length === 1) {
3356        var bodyElement = arguments[0];
3357
3358        if (dom.isEditable(bodyElement)) {
3359          bodyElement = bodyElement.lastChild;
3360        }
3361
3362        return this.createFromBodyElement(bodyElement, dom.emptyPara === arguments[0].innerHTML);
3363      }
3364
3365      return wrappedRange;
3366    }
3367  },
3368  createFromBodyElement: function createFromBodyElement(bodyElement) {
3369    var isCollapseToStart = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
vendor: 3,793 bytes, lines 3370-3507
3370    var wrappedRange = this.createFromNode(bodyElement);
3371    return wrappedRange.collapse(isCollapseToStart);
3372  },
3373  createFromSelection: function createFromSelection() {
3374    var sc, so, ec, eo;
3375
3376    if (env.isW3CRangeSupport) {
3377      var selection = document.getSelection();
3378
3379      if (!selection || selection.rangeCount === 0) {
3380        return null;
3381      } else if (dom.isBody(selection.anchorNode)) {
3382        // Firefox: returns entire body as range on initialization.
3383        // We won't never need it.
3384        return null;
3385      }
3386
3387      var nativeRng = selection.getRangeAt(0);
3388      sc = nativeRng.startContainer;
3389      so = nativeRng.startOffset;
3390      ec = nativeRng.endContainer;
3391      eo = nativeRng.endOffset;
3392    } else {
3393      // IE8: TextRange
3394      var textRange = document.selection.createRange();
3395      var textRangeEnd = textRange.duplicate();
3396      textRangeEnd.collapse(false);
3397      var textRangeStart = textRange;
3398      textRangeStart.collapse(true);
3399      var startPoint = textRangeToPoint(textRangeStart, true);
3400      var endPoint = textRangeToPoint(textRangeEnd, false); // same visible point case: range was collapsed.
3401
3402      if (dom.isText(startPoint.node) && dom.isLeftEdgePoint(startPoint) && dom.isTextNode(endPoint.node) && dom.isRightEdgePoint(endPoint) && endPoint.node.nextSibling === startPoint.node) {
3403        startPoint = endPoint;
3404      }
3405
3406      sc = startPoint.cont;
3407      so = startPoint.offset;
3408      ec = endPoint.cont;
3409      eo = endPoint.offset;
3410    }
3411
3412    return new range_WrappedRange(sc, so, ec, eo);
3413  },
3414
3415  /**
3416   * @method
3417   *
3418   * create WrappedRange from node
3419   *
3420   * @param {Node} node
3421   * @return {WrappedRange}
3422   */
3423  createFromNode: function createFromNode(node) {
3424    var sc = node;
3425    var so = 0;
3426    var ec = node;
3427    var eo = dom.nodeLength(ec); // browsers can't target a picture or void node
3428
3429    if (dom.isVoid(sc)) {
3430      so = dom.listPrev(sc).length - 1;
3431      sc = sc.parentNode;
3432    }
3433
3434    if (dom.isBR(ec)) {
3435      eo = dom.listPrev(ec).length - 1;
3436      ec = ec.parentNode;
3437    } else if (dom.isVoid(ec)) {
3438      eo = dom.listPrev(ec).length;
3439      ec = ec.parentNode;
3440    }
3441
3442    return this.create(sc, so, ec, eo);
3443  },
3444
3445  /**
3446   * create WrappedRange from node after position
3447   *
3448   * @param {Node} node
3449   * @return {WrappedRange}
3450   */
3451  createFromNodeBefore: function createFromNodeBefore(node) {
3452    return this.createFromNode(node).collapse(true);
3453  },
3454
3455  /**
3456   * create WrappedRange from node after position
3457   *
3458   * @param {Node} node
3459   * @return {WrappedRange}
3460   */
3461  createFromNodeAfter: function createFromNodeAfter(node) {
3462    return this.createFromNode(node).collapse();
3463  },
3464
3465  /**
3466   * @method
3467   *
3468   * create WrappedRange from bookmark
3469   *
3470   * @param {Node} editable
3471   * @param {Object} bookmark
3472   * @return {WrappedRange}
3473   */
3474  createFromBookmark: function createFromBookmark(editable, bookmark) {
3475    var sc = dom.fromOffsetPath(editable, bookmark.s.path);
3476    var so = bookmark.s.offset;
3477    var ec = dom.fromOffsetPath(editable, bookmark.e.path);
3478    var eo = bookmark.e.offset;
3479    return new range_WrappedRange(sc, so, ec, eo);
3480  },
3481
3482  /**
3483   * @method
3484   *
3485   * create WrappedRange from paraBookmark
3486   *
3487   * @param {Object} bookmark
3488   * @param {Node[]} paras
3489   * @return {WrappedRange}
3490   */
3491  createFromParaBookmark: function createFromParaBookmark(bookmark, paras) {
3492    var so = bookmark.s.offset;
3493    var eo = bookmark.e.offset;
3494    var sc = dom.fromOffsetPath(lists.head(paras), bookmark.s.path);
3495    var ec = dom.fromOffsetPath(lists.last(paras), bookmark.e.path);
3496    return new range_WrappedRange(sc, so, ec, eo);
3497  }
3498});
3499// CONCATENATED MODULE: ./src/js/base/core/key.js
3500
3501
3502var KEY_MAP = {
3503  'BACKSPACE': 8,
3504  'TAB': 9,
3505  'ENTER': 13,
3506  'ESCAPE': 27,
3507  'SPACE': 32,
vendor: 9,914 bytes, lines 3508-3870
3508  'DELETE': 46,
3509  // Arrow
3510  'LEFT': 37,
3511  'UP': 38,
3512  'RIGHT': 39,
3513  'DOWN': 40,
3514  // Number: 0-9
3515  'NUM0': 48,
3516  'NUM1': 49,
3517  'NUM2': 50,
3518  'NUM3': 51,
3519  'NUM4': 52,
3520  'NUM5': 53,
3521  'NUM6': 54,
3522  'NUM7': 55,
3523  'NUM8': 56,
3524  // Alphabet: a-z
3525  'B': 66,
3526  'E': 69,
3527  'I': 73,
3528  'J': 74,
3529  'K': 75,
3530  'L': 76,
3531  'R': 82,
3532  'S': 83,
3533  'U': 85,
3534  'V': 86,
3535  'Y': 89,
3536  'Z': 90,
3537  'SLASH': 191,
3538  'LEFTBRACKET': 219,
3539  'BACKSLASH': 220,
3540  'RIGHTBRACKET': 221,
3541  // Navigation
3542  'HOME': 36,
3543  'END': 35,
3544  'PAGEUP': 33,
3545  'PAGEDOWN': 34
3546};
3547/**
3548 * @class core.key
3549 *
3550 * Object for keycodes.
3551 *
3552 * @singleton
3553 * @alternateClassName key
3554 */
3555
3556/* harmony default export */ var core_key = ({
3557  /**
3558   * @method isEdit
3559   *
3560   * @param {Number} keyCode
3561   * @return {Boolean}
3562   */
3563  isEdit: function isEdit(keyCode) {
3564    return lists.contains([KEY_MAP.BACKSPACE, KEY_MAP.TAB, KEY_MAP.ENTER, KEY_MAP.SPACE, KEY_MAP.DELETE], keyCode);
3565  },
3566
3567  /**
3568   * @method isMove
3569   *
3570   * @param {Number} keyCode
3571   * @return {Boolean}
3572   */
3573  isMove: function isMove(keyCode) {
3574    return lists.contains([KEY_MAP.LEFT, KEY_MAP.UP, KEY_MAP.RIGHT, KEY_MAP.DOWN], keyCode);
3575  },
3576
3577  /**
3578   * @method isNavigation
3579   *
3580   * @param {Number} keyCode
3581   * @return {Boolean}
3582   */
3583  isNavigation: function isNavigation(keyCode) {
3584    return lists.contains([KEY_MAP.HOME, KEY_MAP.END, KEY_MAP.PAGEUP, KEY_MAP.PAGEDOWN], keyCode);
3585  },
3586
3587  /**
3588   * @property {Object} nameFromCode
3589   * @property {String} nameFromCode.8 "BACKSPACE"
3590   */
3591  nameFromCode: func.invertObject(KEY_MAP),
3592  code: KEY_MAP
3593});
3594// CONCATENATED MODULE: ./src/js/base/core/async.js
3595
3596/**
3597 * @method readFileAsDataURL
3598 *
3599 * read contents of file as representing URL
3600 *
3601 * @param {File} file
3602 * @return {Promise} - then: dataUrl
3603 */
3604
3605function readFileAsDataURL(file) {
3606  return external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.Deferred(function (deferred) {
3607    external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.extend(new FileReader(), {
3608      onload: function onload(e) {
3609        var dataURL = e.target.result;
3610        deferred.resolve(dataURL);
3611      },
3612      onerror: function onerror(err) {
3613        deferred.reject(err);
3614      }
3615    }).readAsDataURL(file);
3616  }).promise();
3617}
3618/**
3619 * @method createImage
3620 *
3621 * create `<image>` from url string
3622 *
3623 * @param {String} url
3624 * @return {Promise} - then: $image
3625 */
3626
3627function createImage(url) {
3628  return external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.Deferred(function (deferred) {
3629    var $img = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<img>');
3630    $img.one('load', function () {
3631      $img.off('error abort');
3632      deferred.resolve($img);
3633    }).one('error abort', function () {
3634      $img.off('load').detach();
3635      deferred.reject($img);
3636    }).css({
3637      display: 'none'
3638    }).appendTo(document.body).attr('src', url);
3639  }).promise();
3640}
3641// CONCATENATED MODULE: ./src/js/base/editing/History.js
3642function History_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3643
3644function History_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
3645
3646function History_createClass(Constructor, protoProps, staticProps) { if (protoProps) History_defineProperties(Constructor.prototype, protoProps); if (staticProps) History_defineProperties(Constructor, staticProps); return Constructor; }
3647
3648
3649
3650var History_History = /*#__PURE__*/function () {
3651  function History(context) {
3652    History_classCallCheck(this, History);
3653
3654    this.stack = [];
3655    this.stackOffset = -1;
3656    this.context = context;
3657    this.$editable = context.layoutInfo.editable;
3658    this.editable = this.$editable[0];
3659  }
3660
3661  History_createClass(History, [{
3662    key: "makeSnapshot",
3663    value: function makeSnapshot() {
3664      var rng = range.create(this.editable);
3665      var emptyBookmark = {
3666        s: {
3667          path: [],
3668          offset: 0
3669        },
3670        e: {
3671          path: [],
3672          offset: 0
3673        }
3674      };
3675      return {
3676        contents: this.$editable.html(),
3677        bookmark: rng && rng.isOnEditable() ? rng.bookmark(this.editable) : emptyBookmark
3678      };
3679    }
3680  }, {
3681    key: "applySnapshot",
3682    value: function applySnapshot(snapshot) {
3683      if (snapshot.contents !== null) {
3684        this.$editable.html(snapshot.contents);
3685      }
3686
3687      if (snapshot.bookmark !== null) {
3688        range.createFromBookmark(this.editable, snapshot.bookmark).select();
3689      }
3690    }
3691    /**
3692    * @method rewind
3693    * Rewinds the history stack back to the first snapshot taken.
3694    * Leaves the stack intact, so that "Redo" can still be used.
3695    */
3696
3697  }, {
3698    key: "rewind",
3699    value: function rewind() {
3700      // Create snap shot if not yet recorded
3701      if (this.$editable.html() !== this.stack[this.stackOffset].contents) {
3702        this.recordUndo();
3703      } // Return to the first available snapshot.
3704
3705
3706      this.stackOffset = 0; // Apply that snapshot.
3707
3708      this.applySnapshot(this.stack[this.stackOffset]);
3709    }
3710    /**
3711    *  @method commit
3712    *  Resets history stack, but keeps current editor's content.
3713    */
3714
3715  }, {
3716    key: "commit",
3717    value: function commit() {
3718      // Clear the stack.
3719      this.stack = []; // Restore stackOffset to its original value.
3720
3721      this.stackOffset = -1; // Record our first snapshot (of nothing).
3722
3723      this.recordUndo();
3724    }
3725    /**
3726    * @method reset
3727    * Resets the history stack completely; reverting to an empty editor.
3728    */
3729
3730  }, {
3731    key: "reset",
3732    value: function reset() {
3733      // Clear the stack.
3734      this.stack = []; // Restore stackOffset to its original value.
3735
3736      this.stackOffset = -1; // Clear the editable area.
3737
3738      this.$editable.html(''); // Record our first snapshot (of nothing).
3739
3740      this.recordUndo();
3741    }
3742    /**
3743     * undo
3744     */
3745
3746  }, {
3747    key: "undo",
3748    value: function undo() {
3749      // Create snap shot if not yet recorded
3750      if (this.$editable.html() !== this.stack[this.stackOffset].contents) {
3751        this.recordUndo();
3752      }
3753
3754      if (this.stackOffset > 0) {
3755        this.stackOffset--;
3756        this.applySnapshot(this.stack[this.stackOffset]);
3757      }
3758    }
3759    /**
3760     * redo
3761     */
3762
3763  }, {
3764    key: "redo",
3765    value: function redo() {
3766      if (this.stack.length - 1 > this.stackOffset) {
3767        this.stackOffset++;
3768        this.applySnapshot(this.stack[this.stackOffset]);
3769      }
3770    }
3771    /**
3772     * recorded undo
3773     */
3774
3775  }, {
3776    key: "recordUndo",
3777    value: function recordUndo() {
3778      this.stackOffset++; // Wash out stack after stackOffset
3779
3780      if (this.stack.length > this.stackOffset) {
3781        this.stack = this.stack.slice(0, this.stackOffset);
3782      } // Create new snapshot and push it to the end
3783
3784
3785      this.stack.push(this.makeSnapshot()); // If the stack size reachs to the limit, then slice it
3786
3787      if (this.stack.length > this.context.options.historyLimit) {
3788        this.stack.shift();
3789        this.stackOffset -= 1;
3790      }
3791    }
3792  }]);
3793
3794  return History;
3795}();
3796
3797
3798// CONCATENATED MODULE: ./src/js/base/editing/Style.js
3799function Style_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3800
3801function Style_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
3802
3803function Style_createClass(Constructor, protoProps, staticProps) { if (protoProps) Style_defineProperties(Constructor.prototype, protoProps); if (staticProps) Style_defineProperties(Constructor, staticProps); return Constructor; }
3804
3805
3806
3807
3808
3809
3810
3811var Style_Style = /*#__PURE__*/function () {
3812  function Style() {
3813    Style_classCallCheck(this, Style);
3814  }
3815
3816  Style_createClass(Style, [{
3817    key: "jQueryCSS",
3818
3819    /**
3820     * @method jQueryCSS
3821     *
3822     * [workaround] for old jQuery
3823     * passing an array of style properties to .css()
3824     * will result in an object of property-value pairs.
3825     * (compability with version < 1.9)
3826     *
3827     * @private
3828     * @param  {jQuery} $obj
3829     * @param  {Array} propertyNames - An array of one or more CSS properties.
3830     * @return {Object}
3831     */
3832    value: function jQueryCSS($obj, propertyNames) {
3833      if (env.jqueryVersion < 1.9) {
3834        var result = {};
3835        external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(propertyNames, function (idx, propertyName) {
3836          result[propertyName] = $obj.css(propertyName);
3837        });
3838        return result;
3839      }
3840
3841      return $obj.css(propertyNames);
3842    }
3843    /**
3844     * returns style object from node
3845     *
3846     * @param {jQuery} $node
3847     * @return {Object}
3848     */
3849
3850  }, {
3851    key: "fromNode",
3852    value: function fromNode($node) {
3853      var properties = ['font-family', 'font-size', 'text-align', 'list-style-type', 'line-height'];
3854      var styleInfo = this.jQueryCSS($node, properties) || {};
3855      var fontSize = $node[0].style.fontSize || styleInfo['font-size'];
3856      styleInfo['font-size'] = parseInt(fontSize, 10);
3857      styleInfo['font-size-unit'] = fontSize.match(/[a-z%]+$/);
3858      return styleInfo;
3859    }
3860    /**
3861     * paragraph level style
3862     *
3863     * @param {WrappedRange} rng
3864     * @param {Object} styleInfo
3865     */
3866
3867  }, {
3868    key: "stylePara",
3869    value: function stylePara(rng, styleInfo) {
3870      external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(rng.no
vendor: 4,160 bytes, lines 3870-3973
3870des(dom.isPara, {
3871        includeAncestor: true
3872      }), function (idx, para) {
3873        external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(para).css(styleInfo);
3874      });
3875    }
3876    /**
3877     * insert and returns styleNodes on range.
3878     *
3879     * @param {WrappedRange} rng
3880     * @param {Object} [options] - options for styleNodes
3881     * @param {String} [options.nodeName] - default: `SPAN`
3882     * @param {Boolean} [options.expandClosestSibling] - default: `false`
3883     * @param {Boolean} [options.onlyPartialContains] - default: `false`
3884     * @return {Node[]}
3885     */
3886
3887  }, {
3888    key: "styleNodes",
3889    value: function styleNodes(rng, options) {
3890      rng = rng.splitText();
3891      var nodeName = options && options.nodeName || 'SPAN';
3892      var expandClosestSibling = !!(options && options.expandClosestSibling);
3893      var onlyPartialContains = !!(options && options.onlyPartialContains);
3894
3895      if (rng.isCollapsed()) {
3896        return [rng.insertNode(dom.create(nodeName))];
3897      }
3898
3899      var pred = dom.makePredByNodeName(nodeName);
3900      var nodes = rng.nodes(dom.isText, {
3901        fullyContains: true
3902      }).map(function (text) {
3903        return dom.singleChildAncestor(text, pred) || dom.wrap(text, nodeName);
3904      });
3905
3906      if (expandClosestSibling) {
3907        if (onlyPartialContains) {
3908          var nodesInRange = rng.nodes(); // compose with partial contains predication
3909
3910          pred = func.and(pred, function (node) {
3911            return lists.contains(nodesInRange, node);
3912          });
3913        }
3914
3915        return nodes.map(function (node) {
3916          var siblings = dom.withClosestSiblings(node, pred);
3917          var head = lists.head(siblings);
3918          var tails = lists.tail(siblings);
3919          external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(tails, function (idx, elem) {
3920            dom.appendChildNodes(head, elem.childNodes);
3921            dom.remove(elem);
3922          });
3923          return lists.head(siblings);
3924        });
3925      } else {
3926        return nodes;
3927      }
3928    }
3929    /**
3930     * get current style on cursor
3931     *
3932     * @param {WrappedRange} rng
3933     * @return {Object} - object contains style properties.
3934     */
3935
3936  }, {
3937    key: "current",
3938    value: function current(rng) {
3939      var $cont = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(!dom.isElement(rng.sc) ? rng.sc.parentNode : rng.sc);
3940      var styleInfo = this.fromNode($cont); // document.queryCommandState for toggle state
3941      // [workaround] prevent Firefox nsresult: "0x80004005 (NS_ERROR_FAILURE)"
3942
3943      try {
3944        styleInfo = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.extend(styleInfo, {
3945          'font-bold': document.queryCommandState('bold') ? 'bold' : 'normal',
3946          'font-italic': document.queryCommandState('italic') ? 'italic' : 'normal',
3947          'font-underline': document.queryCommandState('underline') ? 'underline' : 'normal',
3948          'font-subscript': document.queryCommandState('subscript') ? 'subscript' : 'normal',
3949          'font-superscript': document.queryCommandState('superscript') ? 'superscript' : 'normal',
3950          'font-strikethrough': document.queryCommandState('strikethrough') ? 'strikethrough' : 'normal',
3951          'font-family': document.queryCommandValue('fontname') || styleInfo['font-family']
3952        });
3953      } catch (e) {} // eslint-disable-next-line
3954      // list-style-type to list-style(unordered, ordered)
3955
3956
3957      if (!rng.isOnList()) {
3958        styleInfo['list-style'] = 'none';
3959      } else {
3960        var orderedTypes = ['circle', 'disc', 'disc-leading-zero', 'square'];
3961        var isUnordered = orderedTypes.indexOf(styleInfo['list-style-type']) > -1;
3962        styleInfo['list-style'] = isUnordered ? 'unordered' : 'ordered';
3963      }
3964
3965      var para = dom.ancestor(rng.sc, dom.isPara);
3966
3967      if (para && para.style['line-height']) {
3968        styleInfo['line-height'] = para.style.lineHeight;
3969      } else {
3970        var lineHeight = parseInt(styleInfo['line-height'], 10) / parseInt(styleInfo['font-size'], 10);
3971        styleInfo['line-height'] = lineHeight.toFixed(1);
3972      }
3973
vendor: 15,322 bytes, lines 3974-4419
3974      styleInfo.anchor = rng.isOnAnchor() && dom.ancestor(rng.sc, dom.isAnchor);
3975      styleInfo.ancestors = dom.listAncestor(rng.sc, dom.isEditable);
3976      styleInfo.range = rng;
3977      return styleInfo;
3978    }
3979  }]);
3980
3981  return Style;
3982}();
3983
3984
3985// CONCATENATED MODULE: ./src/js/base/editing/Bullet.js
3986function Bullet_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
3987
3988function Bullet_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
3989
3990function Bullet_createClass(Constructor, protoProps, staticProps) { if (protoProps) Bullet_defineProperties(Constructor.prototype, protoProps); if (staticProps) Bullet_defineProperties(Constructor, staticProps); return Constructor; }
3991
3992
3993
3994
3995
3996
3997
3998var Bullet_Bullet = /*#__PURE__*/function () {
3999  function Bullet() {
4000    Bullet_classCallCheck(this, Bullet);
4001  }
4002
4003  Bullet_createClass(Bullet, [{
4004    key: "insertOrderedList",
4005
4006    /**
4007     * toggle ordered list
4008     */
4009    value: function insertOrderedList(editable) {
4010      this.toggleList('OL', editable);
4011    }
4012    /**
4013     * toggle unordered list
4014     */
4015
4016  }, {
4017    key: "insertUnorderedList",
4018    value: function insertUnorderedList(editable) {
4019      this.toggleList('UL', editable);
4020    }
4021    /**
4022     * indent
4023     */
4024
4025  }, {
4026    key: "indent",
4027    value: function indent(editable) {
4028      var _this = this;
4029
4030      var rng = range.create(editable).wrapBodyInlineWithPara();
4031      var paras = rng.nodes(dom.isPara, {
4032        includeAncestor: true
4033      });
4034      var clustereds = lists.clusterBy(paras, func.peq2('parentNode'));
4035      external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(clustereds, function (idx, paras) {
4036        var head = lists.head(paras);
4037
4038        if (dom.isLi(head)) {
4039          var previousList = _this.findList(head.previousSibling);
4040
4041          if (previousList) {
4042            paras.map(function (para) {
4043              return previousList.appendChild(para);
4044            });
4045          } else {
4046            _this.wrapList(paras, head.parentNode.nodeName);
4047
4048            paras.map(function (para) {
4049              return para.parentNode;
4050            }).map(function (para) {
4051              return _this.appendToPrevious(para);
4052            });
4053          }
4054        } else {
4055          external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(paras, function (idx, para) {
4056            external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(para).css('marginLeft', function (idx, val) {
4057              return (parseInt(val, 10) || 0) + 25;
4058            });
4059          });
4060        }
4061      });
4062      rng.select();
4063    }
4064    /**
4065     * outdent
4066     */
4067
4068  }, {
4069    key: "outdent",
4070    value: function outdent(editable) {
4071      var _this2 = this;
4072
4073      var rng = range.create(editable).wrapBodyInlineWithPara();
4074      var paras = rng.nodes(dom.isPara, {
4075        includeAncestor: true
4076      });
4077      var clustereds = lists.clusterBy(paras, func.peq2('parentNode'));
4078      external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(clustereds, function (idx, paras) {
4079        var head = lists.head(paras);
4080
4081        if (dom.isLi(head)) {
4082          _this2.releaseList([paras]);
4083        } else {
4084          external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(paras, function (idx, para) {
4085            external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(para).css('marginLeft', function (idx, val) {
4086              val = parseInt(val, 10) || 0;
4087              return val > 25 ? val - 25 : '';
4088            });
4089          });
4090        }
4091      });
4092      rng.select();
4093    }
4094    /**
4095     * toggle list
4096     *
4097     * @param {String} listName - OL or UL
4098     */
4099
4100  }, {
4101    key: "toggleList",
4102    value: function toggleList(listName, editable) {
4103      var _this3 = this;
4104
4105      var rng = range.create(editable).wrapBodyInlineWithPara();
4106      var paras = rng.nodes(dom.isPara, {
4107        includeAncestor: true
4108      });
4109      var bookmark = rng.paraBookmark(paras);
4110      var clustereds = lists.clusterBy(paras, func.peq2('parentNode')); // paragraph to list
4111
4112      if (lists.find(paras, dom.isPurePara)) {
4113        var wrappedParas = [];
4114        external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(clustereds, function (idx, paras) {
4115          wrappedParas = wrappedParas.concat(_this3.wrapList(paras, listName));
4116        });
4117        paras = wrappedParas; // list to paragraph or change list style
4118      } else {
4119        var diffLists = rng.nodes(dom.isList, {
4120          includeAncestor: true
4121        }).filter(function (listNode) {
4122          return !external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.nodeName(listNode, listName);
4123        });
4124
4125        if (diffLists.length) {
4126          external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(diffLists, function (idx, listNode) {
4127            dom.replace(listNode, listName);
4128          });
4129        } else {
4130          paras = this.releaseList(clustereds, true);
4131        }
4132      }
4133
4134      range.createFromParaBookmark(bookmark, paras).select();
4135    }
4136    /**
4137     * @param {Node[]} paras
4138     * @param {String} listName
4139     * @return {Node[]}
4140     */
4141
4142  }, {
4143    key: "wrapList",
4144    value: function wrapList(paras, listName) {
4145      var head = lists.head(paras);
4146      var last = lists.last(paras);
4147      var prevList = dom.isList(head.previousSibling) && head.previousSibling;
4148      var nextList = dom.isList(last.nextSibling) && last.nextSibling;
4149      var listNode = prevList || dom.insertAfter(dom.create(listName || 'UL'), last); // P to LI
4150
4151      paras = paras.map(function (para) {
4152        return dom.isPurePara(para) ? dom.replace(para, 'LI') : para;
4153      }); // append to list(<ul>, <ol>)
4154
4155      dom.appendChildNodes(listNode, paras);
4156
4157      if (nextList) {
4158        dom.appendChildNodes(listNode, lists.from(nextList.childNodes));
4159        dom.remove(nextList);
4160      }
4161
4162      return paras;
4163    }
4164    /**
4165     * @method releaseList
4166     *
4167     * @param {Array[]} clustereds
4168     * @param {Boolean} isEscapseToBody
4169     * @return {Node[]}
4170     */
4171
4172  }, {
4173    key: "releaseList",
4174    value: function releaseList(clustereds, isEscapseToBody) {
4175      var _this4 = this;
4176
4177      var releasedParas = [];
4178      external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(clustereds, function (idx, paras) {
4179        var head = lists.head(paras);
4180        var last = lists.last(paras);
4181        var headList = isEscapseToBody ? dom.lastAncestor(head, dom.isList) : head.parentNode;
4182        var parentItem = headList.parentNode;
4183
4184        if (headList.parentNode.nodeName === 'LI') {
4185          paras.map(function (para) {
4186            var newList = _this4.findNextSiblings(para);
4187
4188            if (parentItem.nextSibling) {
4189              parentItem.parentNode.insertBefore(para, parentItem.nextSibling);
4190            } else {
4191              parentItem.parentNode.appendChild(para);
4192            }
4193
4194            if (newList.length) {
4195              _this4.wrapList(newList, headList.nodeName);
4196
4197              para.appendChild(newList[0].parentNode);
4198            }
4199          });
4200
4201          if (headList.children.length === 0) {
4202            parentItem.removeChild(headList);
4203          }
4204
4205          if (parentItem.childNodes.length === 0) {
4206            parentItem.parentNode.removeChild(parentItem);
4207          }
4208        } else {
4209          var lastList = headList.childNodes.length > 1 ? dom.splitTree(headList, {
4210            node: last.parentNode,
4211            offset: dom.position(last) + 1
4212          }, {
4213            isSkipPaddingBlankHTML: true
4214          }) : null;
4215          var middleList = dom.splitTree(headList, {
4216            node: head.parentNode,
4217            offset: dom.position(head)
4218          }, {
4219            isSkipPaddingBlankHTML: true
4220          });
4221          paras = isEscapseToBody ? dom.listDescendant(middleList, dom.isLi) : lists.from(middleList.childNodes).filter(dom.isLi); // LI to P
4222
4223          if (isEscapseToBody || !dom.isList(headList.parentNode)) {
4224            paras = paras.map(function (para) {
4225              return dom.replace(para, 'P');
4226            });
4227          }
4228
4229          external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(lists.from(paras).reverse(), function (idx, para) {
4230            dom.insertAfter(para, headList);
4231          }); // remove empty lists
4232
4233          var rootLists = lists.compact([headList, middleList, lastList]);
4234          external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(rootLists, function (idx, rootList) {
4235            var listNodes = [rootList].concat(dom.listDescendant(rootList, dom.isList));
4236            external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(listNodes.reverse(), function (idx, listNode) {
4237              if (!dom.nodeLength(listNode)) {
4238                dom.remove(listNode, true);
4239              }
4240            });
4241          });
4242        }
4243
4244        releasedParas = releasedParas.concat(paras);
4245      });
4246      return releasedParas;
4247    }
4248    /**
4249     * @method appendToPrevious
4250     *
4251     * Appends list to previous list item, if
4252     * none exist it wraps the list in a new list item.
4253     *
4254     * @param {HTMLNode} ListItem
4255     * @return {HTMLNode}
4256     */
4257
4258  }, {
4259    key: "appendToPrevious",
4260    value: function appendToPrevious(node) {
4261      return node.previousSibling ? dom.appendChildNodes(node.previousSibling, [node]) : this.wrapList([node], 'LI');
4262    }
4263    /**
4264     * @method findList
4265     *
4266     * Finds an existing list in list item
4267     *
4268     * @param {HTMLNode} ListItem
4269     * @return {Array[]}
4270     */
4271
4272  }, {
4273    key: "findList",
4274    value: function findList(node) {
4275      return node ? lists.find(node.children, function (child) {
4276        return ['OL', 'UL'].indexOf(child.nodeName) > -1;
4277      }) : null;
4278    }
4279    /**
4280     * @method findNextSiblings
4281     *
4282     * Finds all list item siblings that follow it
4283     *
4284     * @param {HTMLNode} ListItem
4285     * @return {HTMLNode}
4286     */
4287
4288  }, {
4289    key: "findNextSiblings",
4290    value: function findNextSiblings(node) {
4291      var siblings = [];
4292
4293      while (node.nextSibling) {
4294        siblings.push(node.nextSibling);
4295        node = node.nextSibling;
4296      }
4297
4298      return siblings;
4299    }
4300  }]);
4301
4302  return Bullet;
4303}();
4304
4305
4306// CONCATENATED MODULE: ./src/js/base/editing/Typing.js
4307function Typing_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
4308
4309function Typing_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
4310
4311function Typing_createClass(Constructor, protoProps, staticProps) { if (protoProps) Typing_defineProperties(Constructor.prototype, protoProps); if (staticProps) Typing_defineProperties(Constructor, staticProps); return Constructor; }
4312
4313
4314
4315
4316
4317/**
4318 * @class editing.Typing
4319 *
4320 * Typing
4321 *
4322 */
4323
4324var Typing_Typing = /*#__PURE__*/function () {
4325  function Typing(context) {
4326    Typing_classCallCheck(this, Typing);
4327
4328    // a Bullet instance to toggle lists off
4329    this.bullet = new Bullet_Bullet();
4330    this.options = context.options;
4331  }
4332  /**
4333   * insert tab
4334   *
4335   * @param {WrappedRange} rng
4336   * @param {Number} tabsize
4337   */
4338
4339
4340  Typing_createClass(Typing, [{
4341    key: "insertTab",
4342    value: function insertTab(rng, tabsize) {
4343      var tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));
4344      rng = rng.deleteContents();
4345      rng.insertNode(tab, true);
4346      rng = range.create(tab, tabsize);
4347      rng.select();
4348    }
4349    /**
4350     * insert paragraph
4351     *
4352     * @param {jQuery} $editable
4353     * @param {WrappedRange} rng Can be used in unit tests to "mock" the range
4354     *
4355     * blockquoteBreakingLevel
4356     *   0 - No break, the new paragraph remains inside the quote
4357     *   1 - Break the first blockquote in the ancestors list
4358     *   2 - Break all blockquotes, so that the new paragraph is not quoted (this is the default)
4359     */
4360
4361  }, {
4362    key: "insertParagraph",
4363    value: function insertParagraph(editable, rng) {
4364      rng = rng || range.create(editable); // deleteContents on range.
4365
4366      rng = rng.deleteContents(); // Wrap range if it needs to be wrapped by paragraph
4367
4368      rng = rng.wrapBodyInlineWithPara(); // finding paragraph
4369
4370      var splitRoot = dom.ancestor(rng.sc, dom.isPara);
4371      var nextPara; // on paragraph: split paragraph
4372
4373      if (splitRoot) {
4374        // if it is an empty line with li
4375        if (dom.isLi(splitRoot) && (dom.isEmpty(splitRoot) || dom.deepestChildIsEmpty(splitRoot))) {
4376          // toggle UL/OL and escape
4377          this.bullet.toggleList(splitRoot.parentNode.nodeName);
4378          return;
4379        } else {
4380          var blockquote = null;
4381
4382          if (this.options.blockquoteBreakingLevel === 1) {
4383            blockquote = dom.ancestor(splitRoot, dom.isBlockquote);
4384          } else if (this.options.blockquoteBreakingLevel === 2) {
4385            blockquote = dom.lastAncestor(splitRoot, dom.isBlockquote);
4386          }
4387
4388          if (blockquote) {
4389            // We're inside a blockquote and options ask us to break it
4390            nextPara = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(dom.emptyPara)[0]; // If the split is right before a <br>, remove it so that there's no "empty line"
4391            // after the split in the new blockquote created
4392
4393            if (dom.isRightEdgePoint(rng.getStartPoint()) && dom.isBR(rng.sc.nextSibling)) {
4394              external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(rng.sc.nextSibling).remove();
4395            }
4396
4397            var split = dom.splitTree(blockquote, rng.getStartPoint(), {
4398              isDiscardEmptySplits: true
4399            });
4400
4401            if (split) {
4402              split.parentNode.insertBefore(nextPara, split);
4403            } else {
4404              dom.insertAfter(nextPara, blockquote); // There's no split if we were at the end of the blockquote
4405            }
4406          } else {
4407            nextPara = dom.splitTree(splitRoot, rng.getStartPoint()); // not a blockquote, just insert the paragraph
4408
4409            var emptyAnchors = dom.listDescendant(splitRoot, dom.isEmptyAnchor);
4410            emptyAnchors = emptyAnchors.concat(dom.listDescendant(nextPara, dom.isEmptyAnchor));
4411            external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(emptyAnchors, function (idx, anchor) {
4412              dom.remove(anchor);
4413            }); // replace empty heading, pre or custom-made styleTag with P tag
4414
4415            if ((dom.isHeading(nextPara) || dom.isPre(nextPara) || dom.isCustomStyleTag(nextPara)) && dom.isEmpty(nextPara)) {
4416              nextPara = dom.replace(nextPara, 'p');
4417            }
4418          }
4419        }
4419 // no paragraph: insert empty paragraph
4420
4421      } else {
4422        var next = rng.sc.childNodes[rng.so];
4423        nextPara = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(dom.emptyPara)[0];
4424
4425        if (next) {
4426          rng.sc.insertBefore(nextPara, next);
4427        } else {
4428          rng.sc.appendChild(nextPara);
4429        }
4430      }
4431
4432      range.create(nextPara, 0).normalize().select().scrollIntoView(editable);
4433    }
4434  }]);
4435
4436  return Typing;
4437}();
4438
4439
4440// CONCATENATED MODULE: ./src/js/base
vendor: 9,839 bytes, lines 4440-4782
4440/editing/Table.js
4441function Table_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
4442
4443function Table_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
4444
4445function Table_createClass(Constructor, protoProps, staticProps) { if (protoProps) Table_defineProperties(Constructor.prototype, protoProps); if (staticProps) Table_defineProperties(Constructor, staticProps); return Constructor; }
4446
4447
4448
4449
4450
4451/**
4452 * @class Create a virtual table to create what actions to do in change.
4453 * @param {object} startPoint Cell selected to apply change.
4454 * @param {enum} where  Where change will be applied Row or Col. Use enum: TableResultAction.where
4455 * @param {enum} action Action to be applied. Use enum: TableResultAction.requestAction
4456 * @param {object} domTable Dom element of table to make changes.
4457 */
4458
4459var TableResultAction = function TableResultAction(startPoint, where, action, domTable) {
4460  var _startPoint = {
4461    'colPos': 0,
4462    'rowPos': 0
4463  };
4464  var _virtualTable = [];
4465  var _actionCellList = []; /// ///////////////////////////////////////////
4466  // Private functions
4467  /// ///////////////////////////////////////////
4468
4469  /**
4470   * Set the startPoint of action.
4471   */
4472
4473  function setStartPoint() {
4474    if (!startPoint || !startPoint.tagName || startPoint.tagName.toLowerCase() !== 'td' && startPoint.tagName.toLowerCase() !== 'th') {
4475      // Impossible to identify start Cell point
4476      return;
4477    }
4478
4479    _startPoint.colPos = startPoint.cellIndex;
4480
4481    if (!startPoint.parentElement || !startPoint.parentElement.tagName || startPoint.parentElement.tagName.toLowerCase() !== 'tr') {
4482      // Impossible to identify start Row point
4483      return;
4484    }
4485
4486    _startPoint.rowPos = startPoint.parentElement.rowIndex;
4487  }
4488  /**
4489   * Define virtual table position info object.
4490   *
4491   * @param {int} rowIndex Index position in line of virtual table.
4492   * @param {int} cellIndex Index position in column of virtual table.
4493   * @param {object} baseRow Row affected by this position.
4494   * @param {object} baseCell Cell affected by this position.
4495   * @param {bool} isSpan Inform if it is an span cell/row.
4496   */
4497
4498
4499  function setVirtualTablePosition(rowIndex, cellIndex, baseRow, baseCell, isRowSpan, isColSpan, isVirtualCell) {
4500    var objPosition = {
4501      'baseRow': baseRow,
4502      'baseCell': baseCell,
4503      'isRowSpan': isRowSpan,
4504      'isColSpan': isColSpan,
4505      'isVirtual': isVirtualCell
4506    };
4507
4508    if (!_virtualTable[rowIndex]) {
4509      _virtualTable[rowIndex] = [];
4510    }
4511
4512    _virtualTable[rowIndex][cellIndex] = objPosition;
4513  }
4514  /**
4515   * Create action cell object.
4516   *
4517   * @param {object} virtualTableCellObj Object of specific position on virtual table.
4518   * @param {enum} resultAction Action to be applied in that item.
4519   */
4520
4521
4522  function getActionCell(virtualTableCellObj, resultAction, virtualRowPosition, virtualColPosition) {
4523    return {
4524      'baseCell': virtualTableCellObj.baseCell,
4525      'action': resultAction,
4526      'virtualTable': {
4527        'rowIndex': virtualRowPosition,
4528        'cellIndex': virtualColPosition
4529      }
4530    };
4531  }
4532  /**
4533   * Recover free index of row to append Cell.
4534   *
4535   * @param {int} rowIndex Index of row to find free space.
4536   * @param {int} cellIndex Index of cell to find free space in table.
4537   */
4538
4539
4540  function recoverCellIndex(rowIndex, cellIndex) {
4541    if (!_virtualTable[rowIndex]) {
4542      return cellIndex;
4543    }
4544
4545    if (!_virtualTable[rowIndex][cellIndex]) {
4546      return cellIndex;
4547    }
4548
4549    var newCellIndex = cellIndex;
4550
4551    while (_virtualTable[rowIndex][newCellIndex]) {
4552      newCellIndex++;
4553
4554      if (!_virtualTable[rowIndex][newCellIndex]) {
4555        return newCellIndex;
4556      }
4557    }
4558  }
4559  /**
4560   * Recover info about row and cell and add information to virtual table.
4561   *
4562   * @param {object} row Row to recover information.
4563   * @param {object} cell Cell to recover information.
4564   */
4565
4566
4567  function addCellInfoToVirtual(row, cell) {
4568    var cellIndex = recoverCellIndex(row.rowIndex, cell.cellIndex);
4569    var cellHasColspan = cell.colSpan > 1;
4570    var cellHasRowspan = cell.rowSpan > 1;
4571    var isThisSelectedCell = row.rowIndex === _startPoint.rowPos && cell.cellIndex === _startPoint.colPos;
4572    setVirtualTablePosition(row.rowIndex, cellIndex, row, cell, cellHasRowspan, cellHasColspan, false); // Add span rows to virtual Table.
4573
4574    var rowspanNumber = cell.attributes.rowSpan ? parseInt(cell.attributes.rowSpan.value, 10) : 0;
4575
4576    if (rowspanNumber > 1) {
4577      for (var rp = 1; rp < rowspanNumber; rp++) {
4578        var rowspanIndex = row.rowIndex + rp;
4579        adjustStartPoint(rowspanIndex, cellIndex, cell, isThisSelectedCell);
4580        setVirtualTablePosition(rowspanIndex, cellIndex, row, cell, true, cellHasColspan, true);
4581      }
4582    } // Add span cols to virtual table.
4583
4584
4585    var colspanNumber = cell.attributes.colSpan ? parseInt(cell.attributes.colSpan.value, 10) : 0;
4586
4587    if (colspanNumber > 1) {
4588      for (var cp = 1; cp < colspanNumber; cp++) {
4589        var cellspanIndex = recoverCellIndex(row.rowIndex, cellIndex + cp);
4590        adjustStartPoint(row.rowIndex, cellspanIndex, cell, isThisSelectedCell);
4591        setVirtualTablePosition(row.rowIndex, cellspanIndex, row, cell, cellHasRowspan, true, true);
4592      }
4593    }
4594  }
4595  /**
4596   * Process validation and adjust of start point if needed
4597   *
4598   * @param {int} rowIndex
4599   * @param {int} cellIndex
4600   * @param {object} cell
4601   * @param {bool} isSelectedCell
4602   */
4603
4604
4605  function adjustStartPoint(rowIndex, cellIndex, cell, isSelectedCell) {
4606    if (rowIndex === _startPoint.rowPos && _startPoint.colPos >= cell.cellIndex && cell.cellIndex <= cellIndex && !isSelectedCell) {
4607      _startPoint.colPos++;
4608    }
4609  }
4610  /**
4611   * Create virtual table of cells with all cells, including span cells.
4612   */
4613
4614
4615  function createVirtualTable() {
4616    var rows = domTable.rows;
4617
4618    for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {
4619      var cells = rows[rowIndex].cells;
4620
4621      for (var cellIndex = 0; cellIndex < cells.length; cellIndex++) {
4622        addCellInfoToVirtual(rows[rowIndex], cells[cellIndex]);
4623      }
4624    }
4625  }
4626  /**
4627   * Get action to be applied on the cell.
4628   *
4629   * @param {object} cell virtual table cell to apply action
4630   */
4631
4632
4633  function getDeleteResultActionToCell(cell) {
4634    switch (where) {
4635      case TableResultAction.where.Column:
4636        if (cell.isColSpan) {
4637          return TableResultAction.resultAction.SubtractSpanCount;
4638        }
4639
4640        break;
4641
4642      case TableResultAction.where.Row:
4643        if (!cell.isVirtual && cell.isRowSpan) {
4644          return TableResultAction.resultAction.AddCell;
4645        } else if (cell.isRowSpan) {
4646          return TableResultAction.resultAction.SubtractSpanCount;
4647        }
4648
4649        break;
4650    }
4651
4652    return TableResultAction.resultAction.RemoveCell;
4653  }
4654  /**
4655   * Get action to be applied on the cell.
4656   *
4657   * @param {object} cell virtual table cell to apply action
4658   */
4659
4660
4661  function getAddResultActionToCell(cell) {
4662    switch (where) {
4663      case TableResultAction.where.Column:
4664        if (cell.isColSpan) {
4665          return TableResultAction.resultAction.SumSpanCount;
4666        } else if (cell.isRowSpan && cell.isVirtual) {
4667          return TableResultAction.resultAction.Ignore;
4668        }
4669
4670        break;
4671
4672      case TableResultAction.where.Row:
4673        if (cell.isRowSpan) {
4674          return TableResultAction.resultAction.SumSpanCount;
4675        } else if (cell.isColSpan && cell.isVirtual) {
4676          return TableResultAction.resultAction.Ignore;
4677        }
4678
4679        break;
4680    }
4681
4682    return TableResultAction.resultAction.AddCell;
4683  }
4684
4685  function init() {
4686    setStartPoint();
4687    createVirtualTable();
4688  } /// ///////////////////////////////////////////
4689  // Public functions
4690  /// ///////////////////////////////////////////
4691
4692  /**
4693   * Recover array os what to do in table.
4694   */
4695
4696
4697  this.getActionList = function () {
4698    var fixedRow = where === TableResultAction.where.Row ? _startPoint.rowPos : -1;
4699    var fixedCol = where === TableResultAction.where.Column ? _startPoint.colPos : -1;
4700    var actualPosition = 0;
4701    var canContinue = true;
4702
4703    while (canContinue) {
4704      var rowPosition = fixedRow >= 0 ? fixedRow : actualPosition;
4705      var colPosition = fixedCol >= 0 ? fixedCol : actualPosition;
4706      var row = _virtualTable[rowPosition];
4707
4708      if (!row) {
4709        canContinue = false;
4710        return _actionCellList;
4711      }
4712
4713      var cell = row[colPosition];
4714
4715      if (!cell) {
4716        canContinue = false;
4717        return _actionCellList;
4718      } // Define action to be applied in this cell
4719
4720
4721      var resultAction = TableResultAction.resultAction.Ignore;
4722
4723      switch (action) {
4724        case TableResultAction.requestAction.Add:
4725          resultAction = getAddResultActionToCell(cell);
4726          break;
4727
4728        case TableResultAction.requestAction.Delete:
4729          resultAction = getDeleteResultActionToCell(cell);
4730          break;
4731      }
4732
4733      _actionCellList.push(getActionCell(cell, resultAction, rowPosition, colPosition));
4734
4735      actualPosition++;
4736    }
4737
4738    return _actionCellList;
4739  };
4740
4741  init();
4742};
4743/**
4744*
4745* Where action occours enum.
4746*/
4747
4748
4749TableResultAction.where = {
4750  'Row': 0,
4751  'Column': 1
4752};
4753/**
4754*
4755* Requested action to apply enum.
4756*/
4757
4758TableResultAction.requestAction = {
4759  'Add': 0,
4760  'Delete': 1
4761};
4762/**
4763*
4764* Result action to be executed enum.
4765*/
4766
4767TableResultAction.resultAction = {
4768  'Ignore': 0,
4769  'SubtractSpanCount': 1,
4770  'RemoveCell': 2,
4771  'AddCell': 3,
4772  'SumSpanCount': 4
4773};
4774/**
4775 *
4776 * @class editing.Table
4777 *
4778 * Table
4779 *
4780 */
4781
4782var Table
vendor: 16,973 bytes, lines 4782-5252
4782_Table = /*#__PURE__*/function () {
4783  function Table() {
4784    Table_classCallCheck(this, Table);
4785  }
4786
4787  Table_createClass(Table, [{
4788    key: "tab",
4789
4790    /**
4791     * handle tab key
4792     *
4793     * @param {WrappedRange} rng
4794     * @param {Boolean} isShift
4795     */
4796    value: function tab(rng, isShift) {
4797      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
4798      var table = dom.ancestor(cell, dom.isTable);
4799      var cells = dom.listDescendant(table, dom.isCell);
4800      var nextCell = lists[isShift ? 'prev' : 'next'](cells, cell);
4801
4802      if (nextCell) {
4803        range.create(nextCell, 0).select();
4804      }
4805    }
4806    /**
4807     * Add a new row
4808     *
4809     * @param {WrappedRange} rng
4810     * @param {String} position (top/bottom)
4811     * @return {Node}
4812     */
4813
4814  }, {
4815    key: "addRow",
4816    value: function addRow(rng, position) {
4817      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
4818      var currentTr = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(cell).closest('tr');
4819      var trAttributes = this.recoverAttributes(currentTr);
4820      var html = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<tr' + trAttributes + '></tr>');
4821      var vTable = new TableResultAction(cell, TableResultAction.where.Row, TableResultAction.requestAction.Add, external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(currentTr).closest('table')[0]);
4822      var actions = vTable.getActionList();
4823
4824      for (var idCell = 0; idCell < actions.length; idCell++) {
4825        var currentCell = actions[idCell];
4826        var tdAttributes = this.recoverAttributes(currentCell.baseCell);
4827
4828        switch (currentCell.action) {
4829          case TableResultAction.resultAction.AddCell:
4830            html.append('<td' + tdAttributes + '>' + dom.blank + '</td>');
4831            break;
4832
4833          case TableResultAction.resultAction.SumSpanCount:
4834            {
4835              if (position === 'top') {
4836                var baseCellTr = currentCell.baseCell.parent;
4837                var isTopFromRowSpan = (!baseCellTr ? 0 : currentCell.baseCell.closest('tr').rowIndex) <= currentTr[0].rowIndex;
4838
4839                if (isTopFromRowSpan) {
4840                  var newTd = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<div></div>').append(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<td' + tdAttributes + '>' + dom.blank + '</td>').removeAttr('rowspan')).html();
4841                  html.append(newTd);
4842                  break;
4843                }
4844              }
4845
4846              var rowspanNumber = parseInt(currentCell.baseCell.rowSpan, 10);
4847              rowspanNumber++;
4848              currentCell.baseCell.setAttribute('rowSpan', rowspanNumber);
4849            }
4850            break;
4851        }
4852      }
4853
4854      if (position === 'top') {
4855        currentTr.before(html);
4856      } else {
4857        var cellHasRowspan = cell.rowSpan > 1;
4858
4859        if (cellHasRowspan) {
4860          var lastTrIndex = currentTr[0].rowIndex + (cell.rowSpan - 2);
4861          external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(currentTr).parent().find('tr')[lastTrIndex]).after(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(html));
4862          return;
4863        }
4864
4865        currentTr.after(html);
4866      }
4867    }
4868    /**
4869     * Add a new col
4870     *
4871     * @param {WrappedRange} rng
4872     * @param {String} position (left/right)
4873     * @return {Node}
4874     */
4875
4876  }, {
4877    key: "addCol",
4878    value: function addCol(rng, position) {
4879      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
4880      var row = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(cell).closest('tr');
4881      var rowsGroup = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(row).siblings();
4882      rowsGroup.push(row);
4883      var vTable = new TableResultAction(cell, TableResultAction.where.Column, TableResultAction.requestAction.Add, external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(row).closest('table')[0]);
4884      var actions = vTable.getActionList();
4885
4886      for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
4887        var currentCell = actions[actionIndex];
4888        var tdAttributes = this.recoverAttributes(currentCell.baseCell);
4889
4890        switch (currentCell.action) {
4891          case TableResultAction.resultAction.AddCell:
4892            if (position === 'right') {
4893              external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(currentCell.baseCell).after('<td' + tdAttributes + '>' + dom.blank + '</td>');
4894            } else {
4895              external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');
4896            }
4897
4898            break;
4899
4900          case TableResultAction.resultAction.SumSpanCount:
4901            if (position === 'right') {
4902              var colspanNumber = parseInt(currentCell.baseCell.colSpan, 10);
4903              colspanNumber++;
4904              currentCell.baseCell.setAttribute('colSpan', colspanNumber);
4905            } else {
4906              external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');
4907            }
4908
4909            break;
4910        }
4911      }
4912    }
4913    /*
4914    * Copy attributes from element.
4915    *
4916    * @param {object} Element to recover attributes.
4917    * @return {string} Copied string elements.
4918    */
4919
4920  }, {
4921    key: "recoverAttributes",
4922    value: function recoverAttributes(el) {
4923      var resultStr = '';
4924
4925      if (!el) {
4926        return resultStr;
4927      }
4928
4929      var attrList = el.attributes || [];
4930
4931      for (var i = 0; i < attrList.length; i++) {
4932        if (attrList[i].name.toLowerCase() === 'id') {
4933          continue;
4934        }
4935
4936        if (attrList[i].specified) {
4937          resultStr += ' ' + attrList[i].name + '=\'' + attrList[i].value + '\'';
4938        }
4939      }
4940
4941      return resultStr;
4942    }
4943    /**
4944     * Delete current row
4945     *
4946     * @param {WrappedRange} rng
4947     * @return {Node}
4948     */
4949
4950  }, {
4951    key: "deleteRow",
4952    value: function deleteRow(rng) {
4953      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
4954      var row = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(cell).closest('tr');
4955      var cellPos = row.children('td, th').index(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(cell));
4956      var rowPos = row[0].rowIndex;
4957      var vTable = new TableResultAction(cell, TableResultAction.where.Row, TableResultAction.requestAction.Delete, external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(row).closest('table')[0]);
4958      var actions = vTable.getActionList();
4959
4960      for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
4961        if (!actions[actionIndex]) {
4962          continue;
4963        }
4964
4965        var baseCell = actions[actionIndex].baseCell;
4966        var virtualPosition = actions[actionIndex].virtualTable;
4967        var hasRowspan = baseCell.rowSpan && baseCell.rowSpan > 1;
4968        var rowspanNumber = hasRowspan ? parseInt(baseCell.rowSpan, 10) : 0;
4969
4970        switch (actions[actionIndex].action) {
4971          case TableResultAction.resultAction.Ignore:
4972            continue;
4973
4974          case TableResultAction.resultAction.AddCell:
4975            {
4976              var nextRow = row.next('tr')[0];
4977
4978              if (!nextRow) {
4979                continue;
4980              }
4981
4982              var cloneRow = row[0].cells[cellPos];
4983
4984              if (hasRowspan) {
4985                if (rowspanNumber > 2) {
4986                  rowspanNumber--;
4987                  nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);
4988                  nextRow.cells[cellPos].setAttribute('rowSpan', rowspanNumber);
4989                  nextRow.cells[cellPos].innerHTML = '';
4990                } else if (rowspanNumber === 2) {
4991                  nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);
4992                  nextRow.cells[cellPos].removeAttribute('rowSpan');
4993                  nextRow.cells[cellPos].innerHTML = '';
4994                }
4995              }
4996            }
4997            continue;
4998
4999          case TableResultAction.resultAction.SubtractSpanCount:
5000            if (hasRowspan) {
5001              if (rowspanNumber > 2) {
5002                rowspanNumber--;
5003                baseCell.setAttribute('rowSpan', rowspanNumber);
5004
5005                if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) {
5006                  baseCell.innerHTML = '';
5007                }
5008              } else if (rowspanNumber === 2) {
5009                baseCell.removeAttribute('rowSpan');
5010
5011                if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) {
5012                  baseCell.innerHTML = '';
5013                }
5014              }
5015            }
5016
5017            continue;
5018
5019          case TableResultAction.resultAction.RemoveCell:
5020            // Do not need remove cell because row will be deleted.
5021            continue;
5022        }
5023      }
5024
5025      row.remove();
5026    }
5027    /**
5028     * Delete current col
5029     *
5030     * @param {WrappedRange} rng
5031     * @return {Node}
5032     */
5033
5034  }, {
5035    key: "deleteCol",
5036    value: function deleteCol(rng) {
5037      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
5038      var row = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(cell).closest('tr');
5039      var cellPos = row.children('td, th').index(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(cell));
5040      var vTable = new TableResultAction(cell, TableResultAction.where.Column, TableResultAction.requestAction.Delete, external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(row).closest('table')[0]);
5041      var actions = vTable.getActionList();
5042
5043      for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
5044        if (!actions[actionIndex]) {
5045          continue;
5046        }
5047
5048        switch (actions[actionIndex].action) {
5049          case TableResultAction.resultAction.Ignore:
5050            continue;
5051
5052          case TableResultAction.resultAction.SubtractSpanCount:
5053            {
5054              var baseCell = actions[actionIndex].baseCell;
5055              var hasColspan = baseCell.colSpan && baseCell.colSpan > 1;
5056
5057              if (hasColspan) {
5058                var colspanNumber = baseCell.colSpan ? parseInt(baseCell.colSpan, 10) : 0;
5059
5060                if (colspanNumber > 2) {
5061                  colspanNumber--;
5062                  baseCell.setAttribute('colSpan', colspanNumber);
5063
5064                  if (baseCell.cellIndex === cellPos) {
5065                    baseCell.innerHTML = '';
5066                  }
5067                } else if (colspanNumber === 2) {
5068                  baseCell.removeAttribute('colSpan');
5069
5070                  if (baseCell.cellIndex === cellPos) {
5071                    baseCell.innerHTML = '';
5072                  }
5073                }
5074              }
5075            }
5076            continue;
5077
5078          case TableResultAction.resultAction.RemoveCell:
5079            dom.remove(actions[actionIndex].baseCell, true);
5080            continue;
5081        }
5082      }
5083    }
5084    /**
5085     * create empty table element
5086     *
5087     * @param {Number} rowCount
5088     * @param {Number} colCount
5089     * @return {Node}
5090     */
5091
5092  }, {
5093    key: "createTable",
5094    value: function createTable(colCount, rowCount, options) {
5095      var tds = [];
5096      var tdHTML;
5097
5098      for (var idxCol = 0; idxCol < colCount; idxCol++) {
5099        tds.push('<td>' + dom.blank + '</td>');
5100      }
5101
5102      tdHTML = tds.join('');
5103      var trs = [];
5104      var trHTML;
5105
5106      for (var idxRow = 0; idxRow < rowCount; idxRow++) {
5107        trs.push('<tr>' + tdHTML + '</tr>');
5108      }
5109
5110      trHTML = trs.join('');
5111      var $table = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<table>' + trHTML + '</table>');
5112
5113      if (options && options.tableClassName) {
5114        $table.addClass(options.tableClassName);
5115      }
5116
5117      return $table[0];
5118    }
5119    /**
5120     * Delete current table
5121     *
5122     * @param {WrappedRange} rng
5123     * @return {Node}
5124     */
5125
5126  }, {
5127    key: "deleteTable",
5128    value: function deleteTable(rng) {
5129      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
5130      external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(cell).closest('table').remove();
5131    }
5132  }]);
5133
5134  return Table;
5135}();
5136
5137
5138// CONCATENATED MODULE: ./src/js/base/module/Editor.js
5139function Editor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
5140
5141function Editor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
5142
5143function Editor_createClass(Constructor, protoProps, staticProps) { if (protoProps) Editor_defineProperties(Constructor.prototype, protoProps); if (staticProps) Editor_defineProperties(Constructor, staticProps); return Constructor; }
5144
5145
5146
5147
5148
5149
5150
5151
5152
5153
5154
5155
5156
5157
5158var KEY_BOGUS = 'bogus';
5159/**
5160 * @class Editor
5161 */
5162
5163var Editor_Editor = /*#__PURE__*/function () {
5164  function Editor(context) {
5165    var _this = this;
5166
5167    Editor_classCallCheck(this, Editor);
5168
5169    this.context = context;
5170    this.$note = context.layoutInfo.note;
5171    this.$editor = context.layoutInfo.editor;
5172    this.$editable = context.layoutInfo.editable;
5173    this.options = context.options;
5174    this.lang = this.options.langInfo;
5175    this.editable = this.$editable[0];
5176    this.lastRange = null;
5177    this.snapshot = null;
5178    this.style = new Style_Style();
5179    this.table = new Table_Table();
5180    this.typing = new Typing_Typing(context);
5181    this.bullet = new Bullet_Bullet();
5182    this.history = new History_History(context);
5183    this.context.memo('help.escape', this.lang.help.escape);
5184    this.context.memo('help.undo', this.lang.help.undo);
5185    this.context.memo('help.redo', this.lang.help.redo);
5186    this.context.memo('help.tab', this.lang.help.tab);
5187    this.context.memo('help.untab', this.lang.help.untab);
5188    this.context.memo('help.insertParagraph', this.lang.help.insertParagraph);
5189    this.context.memo('help.insertOrderedList', this.lang.help.insertOrderedList);
5190    this.context.memo('help.insertUnorderedList', this.lang.help.insertUnorderedList);
5191    this.context.memo('help.indent', this.lang.help.indent);
5192    this.context.memo('help.outdent', this.lang.help.outdent);
5193    this.context.memo('help.formatPara', this.lang.help.formatPara);
5194    this.context.memo('help.insertHorizontalRule', this.lang.help.insertHorizontalRule);
5195    this.context.memo('help.fontName', this.lang.help.fontName); // native commands(with execCommand), generate function for execCommand
5196
5197    var commands = ['bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull', 'formatBlock', 'removeFormat', 'backColor'];
5198
5199    for (var idx = 0, len = commands.length; idx < len; idx++) {
5200      this[commands[idx]] = function (sCmd) {
5201        return function (value) {
5202          _this.beforeCommand();
5203
5204          document.execCommand(sCmd, false, value);
5205
5206          _this.afterCommand(true);
5207        };
5208      }(commands[idx]);
5209
5210      this.context.memo('help.' + commands[idx], this.lang.help[commands[idx]]);
5211    }
5212
5213    this.fontName = this.wrapCommand(function (value) {
5214      return _this.fontStyling('font-family', env.validFontName(value));
5215    });
5216    this.fontSize = this.wrapCommand(function (value) {
5217      var unit = _this.currentStyle()['font-size-unit'];
5218
5219      return _this.fontStyling('font-size', value + unit);
5220    });
5221    this.fontSizeUnit = this.wrapCommand(function (value) {
5222      var size = _this.currentStyle()['font-size'];
5223
5224      return _this.fontStyling('font-size', size + value);
5225    });
5226
5227    for (var _idx = 1; _idx <= 6; _idx++) {
5228      this['formatH' + _idx] = function (idx) {
5229        return function () {
5230          _this.formatBlock('H' + idx);
5231        };
5232      }(_idx);
5233
5234      this.context.memo('help.formatH' + _idx, this.lang.help['formatH' + _idx]);
5235    }
5236
5237    this.insertParagraph = this.wrapCommand(function () {
5238      _this.typing.insertParagraph(_this.editable);
5239    });
5240    this.insertOrderedList = this.wrapCommand(function () {
5241      _this.bullet.insertOrderedList(_this.editable);
5242    });
5243    this.insertUnorderedList = this.wrapCommand(function () {
5244      _this.bullet.insertUnorderedList(_this.editable);
5245    });
5246    this.indent = this.wrapCommand(function () {
5247      _this.bullet.indent(_this.editable);
5248    });
5249    this.outdent = this.wrapCommand(function () {
5250      _this.bullet.outdent(_this.editable);
5251    });
5252    /**
vendor: 3,013 bytes, lines 5253-5365
5253     * insertNode
5254     * insert node
5255     * @param {Node} node
5256     */
5257
5258    this.insertNode = this.wrapCommand(function (node) {
5259      if (_this.isLimited(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(node).text().length)) {
5260        return;
5261      }
5262
5263      var rng = _this.getLastRange();
5264
5265      rng.insertNode(node);
5266
5267      _this.setLastRange(range.createFromNodeAfter(node).select());
5268    });
5269    /**
5270     * insert text
5271     * @param {String} text
5272     */
5273
5274    this.insertText = this.wrapCommand(function (text) {
5275      if (_this.isLimited(text.length)) {
5276        return;
5277      }
5278
5279      var rng = _this.getLastRange();
5280
5281      var textNode = rng.insertNode(dom.createText(text));
5282
5283      _this.setLastRange(range.create(textNode, dom.nodeLength(textNode)).select());
5284    });
5285    /**
5286     * paste HTML
5287     * @param {String} markup
5288     */
5289
5290    this.pasteHTML = this.wrapCommand(function (markup) {
5291      if (_this.isLimited(markup.length)) {
5292        return;
5293      }
5294
5295      markup = _this.context.invoke('codeview.purify', markup);
5296
5297      var contents = _this.getLastRange().pasteHTML(markup);
5298
5299      _this.setLastRange(range.createFromNodeAfter(lists.last(contents)).select());
5300    });
5301    /**
5302     * formatBlock
5303     *
5304     * @param {String} tagName
5305     */
5306
5307    this.formatBlock = this.wrapCommand(function (tagName, $target) {
5308      var onApplyCustomStyle = _this.options.callbacks.onApplyCustomStyle;
5309
5310      if (onApplyCustomStyle) {
5311        onApplyCustomStyle.call(_this, $target, _this.context, _this.onFormatBlock);
5312      } else {
5313        _this.onFormatBlock(tagName, $target);
5314      }
5315    });
5316    /**
5317     * insert horizontal rule
5318     */
5319
5320    this.insertHorizontalRule = this.wrapCommand(function () {
5321      var hrNode = _this.getLastRange().insertNode(dom.create('HR'));
5322
5323      if (hrNode.nextSibling) {
5324        _this.setLastRange(range.create(hrNode.nextSibling, 0).normalize().select());
5325      }
5326    });
5327    /**
5328     * lineHeight
5329     * @param {String} value
5330     */
5331
5332    this.lineHeight = this.wrapCommand(function (value) {
5333      _this.style.stylePara(_this.getLastRange(), {
5334        lineHeight: value
5335      });
5336    });
5337    /**
5338     * create link (command)
5339     *
5340     * @param {Object} linkInfo
5341     */
5342
5343    this.createLink = this.wrapCommand(function (linkInfo) {
5344      var linkUrl = linkInfo.url;
5345      var linkText = linkInfo.text;
5346      var isNewWindow = linkInfo.isNewWindow;
5347      var checkProtocol = linkInfo.checkProtocol;
5348
5349      var rng = linkInfo.range || _this.getLastRange();
5350
5351      var additionalTextLength = linkText.length - rng.toString().length;
5352
5353      if (additionalTextLength > 0 && _this.isLimited(additionalTextLength)) {
5354        return;
5355      }
5356
5357      var isTextChanged = rng.toString() !== linkText; // handle spaced urls from input
5358
5359      if (typeof linkUrl === 'string') {
5360        linkUrl = linkUrl.trim();
5361      }
5362
5363      if (_this.options.onCreateLink) {
5364        linkUrl = _this.options.onCreateLink(linkUrl);
5365      } else if (checkProtocol) {
vendor: 8,716 bytes, lines 5366-5646
5366        // if url doesn't have any protocol and not even a relative or a label, use http:// as default
5367        linkUrl = /^([A-Za-z][A-Za-z0-9+-.]*\:|#|\/)/.test(linkUrl) ? linkUrl : _this.options.defaultProtocol + linkUrl;
5368      }
5369
5370      var anchors = [];
5371
5372      if (isTextChanged) {
5373        rng = rng.deleteContents();
5374        var anchor = rng.insertNode(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<A>' + linkText + '</A>')[0]);
5375        anchors.push(anchor);
5376      } else {
5377        anchors = _this.style.styleNodes(rng, {
5378          nodeName: 'A',
5379          expandClosestSibling: true,
5380          onlyPartialContains: true
5381        });
5382      }
5383
5384      external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(anchors, function (idx, anchor) {
5385        external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(anchor).attr('href', linkUrl);
5386
5387        if (isNewWindow) {
5388          external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(anchor).attr('target', '_blank');
5389        } else {
5390          external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(anchor).removeAttr('target');
5391        }
5392      });
5393
5394      _this.setLastRange(_this.createRangeFromList(anchors).select());
5395    });
5396    /**
5397     * setting color
5398     *
5399     * @param {Object} sObjColor  color code
5400     * @param {String} sObjColor.foreColor foreground color
5401     * @param {String} sObjColor.backColor background color
5402     */
5403
5404    this.color = this.wrapCommand(function (colorInfo) {
5405      var foreColor = colorInfo.foreColor;
5406      var backColor = colorInfo.backColor;
5407
5408      if (foreColor) {
5409        document.execCommand('foreColor', false, foreColor);
5410      }
5411
5412      if (backColor) {
5413        document.execCommand('backColor', false, backColor);
5414      }
5415    });
5416    /**
5417     * Set foreground color
5418     *
5419     * @param {String} colorCode foreground color code
5420     */
5421
5422    this.foreColor = this.wrapCommand(function (colorInfo) {
5423      document.execCommand('foreColor', false, colorInfo);
5424    });
5425    /**
5426     * insert Table
5427     *
5428     * @param {String} dimension of table (ex : "5x5")
5429     */
5430
5431    this.insertTable = this.wrapCommand(function (dim) {
5432      var dimension = dim.split('x');
5433
5434      var rng = _this.getLastRange().deleteContents();
5435
5436      rng.insertNode(_this.table.createTable(dimension[0], dimension[1], _this.options));
5437    });
5438    /**
5439     * remove media object and Figure Elements if media object is img with Figure.
5440     */
5441
5442    this.removeMedia = this.wrapCommand(function () {
5443      var $target = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(_this.restoreTarget()).parent();
5444
5445      if ($target.closest('figure').length) {
5446        $target.closest('figure').remove();
5447      } else {
5448        $target = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(_this.restoreTarget()).detach();
5449      }
5450
5451      _this.context.triggerEvent('media.delete', $target, _this.$editable);
5452    });
5453    /**
5454     * float me
5455     *
5456     * @param {String} value
5457     */
5458
5459    this.floatMe = this.wrapCommand(function (value) {
5460      var $target = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(_this.restoreTarget());
5461      $target.toggleClass('note-float-left', value === 'left');
5462      $target.toggleClass('note-float-right', value === 'right');
5463      $target.css('float', value === 'none' ? '' : value);
5464    });
5465    /**
5466     * resize overlay element
5467     * @param {String} value
5468     */
5469
5470    this.resize = this.wrapCommand(function (value) {
5471      var $target = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(_this.restoreTarget());
5472      value = parseFloat(value);
5473
5474      if (value === 0) {
5475        $target.css('width', '');
5476      } else {
5477        $target.css({
5478          width: value * 100 + '%',
5479          height: ''
5480        });
5481      }
5482    });
5483  }
5484
5485  Editor_createClass(Editor, [{
5486    key: "initialize",
5487    value: function initialize() {
5488      var _this2 = this;
5489
5490      // bind custom events
5491      this.$editable.on('keydown', function (event) {
5492        if (event.keyCode === core_key.code.ENTER) {
5493          _this2.context.triggerEvent('enter', event);
5494        }
5495
5496        _this2.context.triggerEvent('keydown', event); // keep a snapshot to limit text on input event
5497
5498
5499        _this2.snapshot = _this2.history.makeSnapshot();
5500        _this2.hasKeyShortCut = false;
5501
5502        if (!event.isDefaultPrevented()) {
5503          if (_this2.options.shortcuts) {
5504            _this2.hasKeyShortCut = _this2.handleKeyMap(event);
5505          } else {
5506            _this2.preventDefaultEditableShortCuts(event);
5507          }
5508        }
5509
5510        if (_this2.isLimited(1, event)) {
5511          var lastRange = _this2.getLastRange();
5512
5513          if (lastRange.eo - lastRange.so === 0) {
5514            return false;
5515          }
5516        }
5517
5518        _this2.setLastRange(); // record undo in the key event except keyMap.
5519
5520
5521        if (_this2.options.recordEveryKeystroke) {
5522          if (_this2.hasKeyShortCut === false) {
5523            _this2.history.recordUndo();
5524          }
5525        }
5526      }).on('keyup', function (event) {
5527        _this2.setLastRange();
5528
5529        _this2.context.triggerEvent('keyup', event);
5530      }).on('focus', function (event) {
5531        _this2.setLastRange();
5532
5533        _this2.context.triggerEvent('focus', event);
5534      }).on('blur', function (event) {
5535        _this2.context.triggerEvent('blur', event);
5536      }).on('mousedown', function (event) {
5537        _this2.context.triggerEvent('mousedown', event);
5538      }).on('mouseup', function (event) {
5539        _this2.setLastRange();
5540
5541        _this2.history.recordUndo();
5542
5543        _this2.context.triggerEvent('mouseup', event);
5544      }).on('scroll', function (event) {
5545        _this2.context.triggerEvent('scroll', event);
5546      }).on('paste', function (event) {
5547        _this2.setLastRange();
5548
5549        _this2.context.triggerEvent('paste', event);
5550      }).on('input', function () {
5551        // To limit composition characters (e.g. Korean)
5552        if (_this2.isLimited(0) && _this2.snapshot) {
5553          _this2.history.applySnapshot(_this2.snapshot);
5554        }
5555      });
5556      this.$editable.attr('spellcheck', this.options.spellCheck);
5557      this.$editable.attr('autocorrect', this.options.spellCheck);
5558
5559      if (this.options.disableGrammar) {
5560        this.$editable.attr('data-gramm', false);
5561      } // init content before set event
5562
5563
5564      this.$editable.html(dom.html(this.$note) || dom.emptyPara);
5565      this.$editable.on(env.inputEventName, func.debounce(function () {
5566        _this2.context.triggerEvent('change', _this2.$editable.html(), _this2.$editable);
5567      }, 10));
5568      this.$editable.on('focusin', function (event) {
5569        _this2.context.triggerEvent('focusin', event);
5570      }).on('focusout', function (event) {
5571        _this2.context.triggerEvent('focusout', event);
5572      });
5573
5574      if (this.options.airMode) {
5575        if (this.options.overrideContextMenu) {
5576          this.$editor.on('contextmenu', function (event) {
5577            _this2.context.triggerEvent('contextmenu', event);
5578
5579            return false;
5580          });
5581        }
5582      } else {
5583        if (this.options.width) {
5584          this.$editor.outerWidth(this.options.width);
5585        }
5586
5587        if (this.options.height) {
5588          this.$editable.outerHeight(this.options.height);
5589        }
5590
5591        if (this.options.maxHeight) {
5592          this.$editable.css('max-height', this.options.maxHeight);
5593        }
5594
5595        if (this.options.minHeight) {
5596          this.$editable.css('min-height', this.options.minHeight);
5597        }
5598      }
5599
5600      this.history.recordUndo();
5601      this.setLastRange();
5602    }
5603  }, {
5604    key: "destroy",
5605    value: function destroy() {
5606      this.$editable.off();
5607    }
5608  }, {
5609    key: "handleKeyMap",
5610    value: function handleKeyMap(event) {
5611      var keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];
5612      var keys = [];
5613
5614      if (event.metaKey) {
5615        keys.push('CMD');
5616      }
5617
5618      if (event.ctrlKey && !event.altKey) {
5619        keys.push('CTRL');
5620      }
5621
5622      if (event.shiftKey) {
5623        keys.push('SHIFT');
5624      }
5625
5626      var keyName = core_key.nameFromCode[event.keyCode];
5627
5628      if (keyName) {
5629        keys.push(keyName);
5630      }
5631
5632      var eventName = keyMap[keys.join('+')];
5633
5634      if (keyName === 'TAB' && !this.options.tabDisable) {
5635        this.afterCommand();
5636      } else if (eventName) {
5637        if (this.context.invoke(eventName) !== false) {
5638          event.preventDefault(); // if keyMap action was invoked
5639
5640          return true;
5641        }
5642      } else if (core_key.isEdit(event.keyCode)) {
5643        this.afterCommand();
5644      }
5645
5646      return false;
vendor: 5,948 bytes, lines 5647-5891
5647    }
5648  }, {
5649    key: "preventDefaultEditableShortCuts",
5650    value: function preventDefaultEditableShortCuts(event) {
5651      // B(Bold, 66) / I(Italic, 73) / U(Underline, 85)
5652      if ((event.ctrlKey || event.metaKey) && lists.contains([66, 73, 85], event.keyCode)) {
5653        event.preventDefault();
5654      }
5655    }
5656  }, {
5657    key: "isLimited",
5658    value: function isLimited(pad, event) {
5659      pad = pad || 0;
5660
5661      if (typeof event !== 'undefined') {
5662        if (core_key.isMove(event.keyCode) || core_key.isNavigation(event.keyCode) || event.ctrlKey || event.metaKey || lists.contains([core_key.code.BACKSPACE, core_key.code.DELETE], event.keyCode)) {
5663          return false;
5664        }
5665      }
5666
5667      if (this.options.maxTextLength > 0) {
5668        if (this.$editable.text().length + pad > this.options.maxTextLength) {
5669          return true;
5670        }
5671      }
5672
5673      return false;
5674    }
5675    /**
5676     * create range
5677     * @return {WrappedRange}
5678     */
5679
5680  }, {
5681    key: "createRange",
5682    value: function createRange() {
5683      this.focus();
5684      this.setLastRange();
5685      return this.getLastRange();
5686    }
5687    /**
5688     * create a new range from the list of elements
5689     *
5690     * @param {list} dom element list
5691     * @return {WrappedRange}
5692     */
5693
5694  }, {
5695    key: "createRangeFromList",
5696    value: function createRangeFromList(lst) {
5697      var startRange = range.createFromNodeBefore(lists.head(lst));
5698      var startPoint = startRange.getStartPoint();
5699      var endRange = range.createFromNodeAfter(lists.last(lst));
5700      var endPoint = endRange.getEndPoint();
5701      return range.create(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
5702    }
5703    /**
5704     * set the last range
5705     *
5706     * if given rng is exist, set rng as the last range
5707     * or create a new range at the end of the document
5708     *
5709     * @param {WrappedRange} rng
5710     */
5711
5712  }, {
5713    key: "setLastRange",
5714    value: function setLastRange(rng) {
5715      if (rng) {
5716        this.lastRange = rng;
5717      } else {
5718        this.lastRange = range.create(this.editable);
5719
5720        if (external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(this.lastRange.sc).closest('.note-editable').length === 0) {
5721          this.lastRange = range.createFromBodyElement(this.editable);
5722        }
5723      }
5724    }
5725    /**
5726     * get the last range
5727     *
5728     * if there is a saved last range, return it
5729     * or create a new range and return it
5730     *
5731     * @return {WrappedRange}
5732     */
5733
5734  }, {
5735    key: "getLastRange",
5736    value: function getLastRange() {
5737      if (!this.lastRange) {
5738        this.setLastRange();
5739      }
5740
5741      return this.lastRange;
5742    }
5743    /**
5744     * saveRange
5745     *
5746     * save current range
5747     *
5748     * @param {Boolean} [thenCollapse=false]
5749     */
5750
5751  }, {
5752    key: "saveRange",
5753    value: function saveRange(thenCollapse) {
5754      if (thenCollapse) {
5755        this.getLastRange().collapse().select();
5756      }
5757    }
5758    /**
5759     * restoreRange
5760     *
5761     * restore lately range
5762     */
5763
5764  }, {
5765    key: "restoreRange",
5766    value: function restoreRange() {
5767      if (this.lastRange) {
5768        this.lastRange.select();
5769        this.focus();
5770      }
5771    }
5772  }, {
5773    key: "saveTarget",
5774    value: function saveTarget(node) {
5775      this.$editable.data('target', node);
5776    }
5777  }, {
5778    key: "clearTarget",
5779    value: function clearTarget() {
5780      this.$editable.removeData('target');
5781    }
5782  }, {
5783    key: "restoreTarget",
5784    value: function restoreTarget() {
5785      return this.$editable.data('target');
5786    }
5787    /**
5788     * currentStyle
5789     *
5790     * current style
5791     * @return {Object|Boolean} unfocus
5792     */
5793
5794  }, {
5795    key: "currentStyle",
5796    value: function currentStyle() {
5797      var rng = range.create();
5798
5799      if (rng) {
5800        rng = rng.normalize();
5801      }
5802
5803      return rng ? this.style.current(rng) : this.style.fromNode(this.$editable);
5804    }
5805    /**
5806     * style from node
5807     *
5808     * @param {jQuery} $node
5809     * @return {Object}
5810     */
5811
5812  }, {
5813    key: "styleFromNode",
5814    value: function styleFromNode($node) {
5815      return this.style.fromNode($node);
5816    }
5817    /**
5818     * undo
5819     */
5820
5821  }, {
5822    key: "undo",
5823    value: function undo() {
5824      this.context.triggerEvent('before.command', this.$editable.html());
5825      this.history.undo();
5826      this.context.triggerEvent('change', this.$editable.html(), this.$editable);
5827    }
5828    /*
5829    * commit
5830    */
5831
5832  }, {
5833    key: "commit",
5834    value: function commit() {
5835      this.context.triggerEvent('before.command', this.$editable.html());
5836      this.history.commit();
5837      this.context.triggerEvent('change', this.$editable.html(), this.$editable);
5838    }
5839    /**
5840     * redo
5841     */
5842
5843  }, {
5844    key: "redo",
5845    value: function redo() {
5846      this.context.triggerEvent('before.command', this.$editable.html());
5847      this.history.redo();
5848      this.context.triggerEvent('change', this.$editable.html(), this.$editable);
5849    }
5850    /**
5851     * before command
5852     */
5853
5854  }, {
5855    key: "beforeCommand",
5856    value: function beforeCommand() {
5857      this.context.triggerEvent('before.command', this.$editable.html()); // Set styleWithCSS before run a command
5858
5859      document.execCommand('styleWithCSS', false, this.options.styleWithCSS); // keep focus on editable before command execution
5860
5861      this.focus();
5862    }
5863    /**
5864     * after command
5865     * @param {Boolean} isPreventTrigger
5866     */
5867
5868  }, {
5869    key: "afterCommand",
5870    value: function afterCommand(isPreventTrigger) {
5871      this.normalizeContent();
5872      this.history.recordUndo();
5873
5874      if (!isPreventTrigger) {
5875        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
5876      }
5877    }
5878    /**
5879     * handle tab key
5880     */
5881
5882  }, {
5883    key: "tab",
5884    value: function tab() {
5885      var rng = this.getLastRange();
5886
5887      if (rng.isCollapsed() && rng.isOnCell()) {
5888        this.table.tab(rng);
5889      } else {
5890        if (this.options.tabSize === 0) {
5891          return false;
vendor: 57,560 bytes, lines 5892-7473
5892        }
5893
5894        if (!this.isLimited(this.options.tabSize)) {
5895          this.beforeCommand();
5896          this.typing.insertTab(rng, this.options.tabSize);
5897          this.afterCommand();
5898        }
5899      }
5900    }
5901    /**
5902     * handle shift+tab key
5903     */
5904
5905  }, {
5906    key: "untab",
5907    value: function untab() {
5908      var rng = this.getLastRange();
5909
5910      if (rng.isCollapsed() && rng.isOnCell()) {
5911        this.table.tab(rng, true);
5912      } else {
5913        if (this.options.tabSize === 0) {
5914          return false;
5915        }
5916      }
5917    }
5918    /**
5919     * run given function between beforeCommand and afterCommand
5920     */
5921
5922  }, {
5923    key: "wrapCommand",
5924    value: function wrapCommand(fn) {
5925      return function () {
5926        this.beforeCommand();
5927        fn.apply(this, arguments);
5928        this.afterCommand();
5929      };
5930    }
5931    /**
5932     * insert image
5933     *
5934     * @param {String} src
5935     * @param {String|Function} param
5936     * @return {Promise}
5937     */
5938
5939  }, {
5940    key: "insertImage",
5941    value: function insertImage(src, param) {
5942      var _this3 = this;
5943
5944      return createImage(src, param).then(function ($image) {
5945        _this3.beforeCommand();
5946
5947        if (typeof param === 'function') {
5948          param($image);
5949        } else {
5950          if (typeof param === 'string') {
5951            $image.attr('data-filename', param);
5952          }
5953
5954          $image.css('width', Math.min(_this3.$editable.width(), $image.width()));
5955        }
5956
5957        $image.show();
5958
5959        _this3.getLastRange().insertNode($image[0]);
5960
5961        _this3.setLastRange(range.createFromNodeAfter($image[0]).select());
5962
5963        _this3.afterCommand();
5964      }).fail(function (e) {
5965        _this3.context.triggerEvent('image.upload.error', e);
5966      });
5967    }
5968    /**
5969     * insertImages
5970     * @param {File[]} files
5971     */
5972
5973  }, {
5974    key: "insertImagesAsDataURL",
5975    value: function insertImagesAsDataURL(files) {
5976      var _this4 = this;
5977
5978      external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(files, function (idx, file) {
5979        var filename = file.name;
5980
5981        if (_this4.options.maximumImageFileSize && _this4.options.maximumImageFileSize < file.size) {
5982          _this4.context.triggerEvent('image.upload.error', _this4.lang.image.maximumFileSizeError);
5983        } else {
5984          readFileAsDataURL(file).then(function (dataURL) {
5985            return _this4.insertImage(dataURL, filename);
5986          }).fail(function () {
5987            _this4.context.triggerEvent('image.upload.error');
5988          });
5989        }
5990      });
5991    }
5992    /**
5993     * insertImagesOrCallback
5994     * @param {File[]} files
5995     */
5996
5997  }, {
5998    key: "insertImagesOrCallback",
5999    value: function insertImagesOrCallback(files) {
6000      var callbacks = this.options.callbacks; // If onImageUpload set,
6001
6002      if (callbacks.onImageUpload) {
6003        this.context.triggerEvent('image.upload', files); // else insert Image as dataURL
6004      } else {
6005        this.insertImagesAsDataURL(files);
6006      }
6007    }
6008    /**
6009     * return selected plain text
6010     * @return {String} text
6011     */
6012
6013  }, {
6014    key: "getSelectedText",
6015    value: function getSelectedText() {
6016      var rng = this.getLastRange(); // if range on anchor, expand range with anchor
6017
6018      if (rng.isOnAnchor()) {
6019        rng = range.createFromNode(dom.ancestor(rng.sc, dom.isAnchor));
6020      }
6021
6022      return rng.toString();
6023    }
6024  }, {
6025    key: "onFormatBlock",
6026    value: function onFormatBlock(tagName, $target) {
6027      // [workaround] for MSIE, IE need `<`
6028      document.execCommand('FormatBlock', false, env.isMSIE ? '<' + tagName + '>' : tagName); // support custom class
6029
6030      if ($target && $target.length) {
6031        // find the exact element has given tagName
6032        if ($target[0].tagName.toUpperCase() !== tagName.toUpperCase()) {
6033          $target = $target.find(tagName);
6034        }
6035
6036        if ($target && $target.length) {
6037          var className = $target[0].className || '';
6038
6039          if (className) {
6040            var currentRange = this.createRange();
6041            var $parent = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()([currentRange.sc, currentRange.ec]).closest(tagName);
6042            $parent.addClass(className);
6043          }
6044        }
6045      }
6046    }
6047  }, {
6048    key: "formatPara",
6049    value: function formatPara() {
6050      this.formatBlock('P');
6051    }
6052  }, {
6053    key: "fontStyling",
6054    value: function fontStyling(target, value) {
6055      var rng = this.getLastRange();
6056
6057      if (rng !== '') {
6058        var spans = this.style.styleNodes(rng);
6059        this.$editor.find('.note-status-output').html('');
6060        external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(spans).css(target, value); // [workaround] added styled bogus span for style
6061        //  - also bogus character needed for cursor position
6062
6063        if (rng.isCollapsed()) {
6064          var firstSpan = lists.head(spans);
6065
6066          if (firstSpan && !dom.nodeLength(firstSpan)) {
6067            firstSpan.innerHTML = dom.ZERO_WIDTH_NBSP_CHAR;
6068            range.createFromNode(firstSpan.firstChild).select();
6069            this.setLastRange();
6070            this.$editable.data(KEY_BOGUS, firstSpan);
6071          }
6072        } else {
6073          this.setLastRange(this.createRangeFromList(spans).select());
6074        }
6075      } else {
6076        var noteStatusOutput = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.now();
6077        this.$editor.find('.note-status-output').html('<div id="note-status-output-' + noteStatusOutput + '" class="alert alert-info">' + this.lang.output.noSelection + '</div>');
6078        setTimeout(function () {
6079          external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('#note-status-output-' + noteStatusOutput).remove();
6080        }, 5000);
6081      }
6082    }
6083    /**
6084     * unlink
6085     *
6086     * @type command
6087     */
6088
6089  }, {
6090    key: "unlink",
6091    value: function unlink() {
6092      var rng = this.getLastRange();
6093
6094      if (rng.isOnAnchor()) {
6095        var anchor = dom.ancestor(rng.sc, dom.isAnchor);
6096        rng = range.createFromNode(anchor);
6097        rng.select();
6098        this.setLastRange();
6099        this.beforeCommand();
6100        document.execCommand('unlink');
6101        this.afterCommand();
6102      }
6103    }
6104    /**
6105     * returns link info
6106     *
6107     * @return {Object}
6108     * @return {WrappedRange} return.range
6109     * @return {String} return.text
6110     * @return {Boolean} [return.isNewWindow=true]
6111     * @return {String} [return.url=""]
6112     */
6113
6114  }, {
6115    key: "getLinkInfo",
6116    value: function getLinkInfo() {
6117      var rng = this.getLastRange().expand(dom.isAnchor); // Get the first anchor on range(for edit).
6118
6119      var $anchor = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(lists.head(rng.nodes(dom.isAnchor)));
6120      var linkInfo = {
6121        range: rng,
6122        text: rng.toString(),
6123        url: $anchor.length ? $anchor.attr('href') : ''
6124      }; // When anchor exists,
6125
6126      if ($anchor.length) {
6127        // Set isNewWindow by checking its target.
6128        linkInfo.isNewWindow = $anchor.attr('target') === '_blank';
6129      }
6130
6131      return linkInfo;
6132    }
6133  }, {
6134    key: "addRow",
6135    value: function addRow(position) {
6136      var rng = this.getLastRange(this.$editable);
6137
6138      if (rng.isCollapsed() && rng.isOnCell()) {
6139        this.beforeCommand();
6140        this.table.addRow(rng, position);
6141        this.afterCommand();
6142      }
6143    }
6144  }, {
6145    key: "addCol",
6146    value: function addCol(position) {
6147      var rng = this.getLastRange(this.$editable);
6148
6149      if (rng.isCollapsed() && rng.isOnCell()) {
6150        this.beforeCommand();
6151        this.table.addCol(rng, position);
6152        this.afterCommand();
6153      }
6154    }
6155  }, {
6156    key: "deleteRow",
6157    value: function deleteRow() {
6158      var rng = this.getLastRange(this.$editable);
6159
6160      if (rng.isCollapsed() && rng.isOnCell()) {
6161        this.beforeCommand();
6162        this.table.deleteRow(rng);
6163        this.afterCommand();
6164      }
6165    }
6166  }, {
6167    key: "deleteCol",
6168    value: function deleteCol() {
6169      var rng = this.getLastRange(this.$editable);
6170
6171      if (rng.isCollapsed() && rng.isOnCell()) {
6172        this.beforeCommand();
6173        this.table.deleteCol(rng);
6174        this.afterCommand();
6175      }
6176    }
6177  }, {
6178    key: "deleteTable",
6179    value: function deleteTable() {
6180      var rng = this.getLastRange(this.$editable);
6181
6182      if (rng.isCollapsed() && rng.isOnCell()) {
6183        this.beforeCommand();
6184        this.table.deleteTable(rng);
6185        this.afterCommand();
6186      }
6187    }
6188    /**
6189     * @param {Position} pos
6190     * @param {jQuery} $target - target element
6191     * @param {Boolean} [bKeepRatio] - keep ratio
6192     */
6193
6194  }, {
6195    key: "resizeTo",
6196    value: function resizeTo(pos, $target, bKeepRatio) {
6197      var imageSize;
6198
6199      if (bKeepRatio) {
6200        var newRatio = pos.y / pos.x;
6201        var ratio = $target.data('ratio');
6202        imageSize = {
6203          width: ratio > newRatio ? pos.x : pos.y / ratio,
6204          height: ratio > newRatio ? pos.x * ratio : pos.y
6205        };
6206      } else {
6207        imageSize = {
6208          width: pos.x,
6209          height: pos.y
6210        };
6211      }
6212
6213      $target.css(imageSize);
6214    }
6215    /**
6216     * returns whether editable area has focus or not.
6217     */
6218
6219  }, {
6220    key: "hasFocus",
6221    value: function hasFocus() {
6222      return this.$editable.is(':focus');
6223    }
6224    /**
6225     * set focus
6226     */
6227
6228  }, {
6229    key: "focus",
6230    value: function focus() {
6231      // [workaround] Screen will move when page is scolled in IE.
6232      //  - do focus when not focused
6233      if (!this.hasFocus()) {
6234        this.$editable.focus();
6235      }
6236    }
6237    /**
6238     * returns whether contents is empty or not.
6239     * @return {Boolean}
6240     */
6241
6242  }, {
6243    key: "isEmpty",
6244    value: function isEmpty() {
6245      return dom.isEmpty(this.$editable[0]) || dom.emptyPara === this.$editable.html();
6246    }
6247    /**
6248     * Removes all contents and restores the editable instance to an _emptyPara_.
6249     */
6250
6251  }, {
6252    key: "empty",
6253    value: function empty() {
6254      this.context.invoke('code', dom.emptyPara);
6255    }
6256    /**
6257     * normalize content
6258     */
6259
6260  }, {
6261    key: "normalizeContent",
6262    value: function normalizeContent() {
6263      this.$editable[0].normalize();
6264    }
6265  }]);
6266
6267  return Editor;
6268}();
6269
6270
6271// CONCATENATED MODULE: ./src/js/base/module/Clipboard.js
6272function Clipboard_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
6273
6274function Clipboard_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
6275
6276function Clipboard_createClass(Constructor, protoProps, staticProps) { if (protoProps) Clipboard_defineProperties(Constructor.prototype, protoProps); if (staticProps) Clipboard_defineProperties(Constructor, staticProps); return Constructor; }
6277
6278
6279
6280var Clipboard_Clipboard = /*#__PURE__*/function () {
6281  function Clipboard(context) {
6282    Clipboard_classCallCheck(this, Clipboard);
6283
6284    this.context = context;
6285    this.$editable = context.layoutInfo.editable;
6286  }
6287
6288  Clipboard_createClass(Clipboard, [{
6289    key: "initialize",
6290    value: function initialize() {
6291      this.$editable.on('paste', this.pasteByEvent.bind(this));
6292    }
6293    /**
6294     * paste by clipboard event
6295     *
6296     * @param {Event} event
6297     */
6298
6299  }, {
6300    key: "pasteByEvent",
6301    value: function pasteByEvent(event) {
6302      var _this = this;
6303
6304      var clipboardData = event.originalEvent.clipboardData;
6305
6306      if (clipboardData && clipboardData.items && clipboardData.items.length) {
6307        var item = clipboardData.items.length > 1 ? clipboardData.items[1] : lists.head(clipboardData.items);
6308
6309        if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {
6310          // paste img file
6311          this.context.invoke('editor.insertImagesOrCallback', [item.getAsFile()]);
6312          event.preventDefault();
6313        } else if (item.kind === 'string') {
6314          // paste text with maxTextLength check
6315          if (this.context.invoke('editor.isLimited', clipboardData.getData('Text').length)) {
6316            event.preventDefault();
6317          }
6318        }
6319      } else if (window.clipboardData) {
6320        // for IE
6321        var text = window.clipboardData.getData('text');
6322
6323        if (this.context.invoke('editor.isLimited', text.length)) {
6324          event.preventDefault();
6325        }
6326      } // Call editor.afterCommand after proceeding default event handler
6327
6328
6329      setTimeout(function () {
6330        _this.context.invoke('editor.afterCommand');
6331      }, 10);
6332    }
6333  }]);
6334
6335  return Clipboard;
6336}();
6337
6338
6339// CONCATENATED MODULE: ./src/js/base/module/Dropzone.js
6340function Dropzone_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
6341
6342function Dropzone_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
6343
6344function Dropzone_createClass(Constructor, protoProps, staticProps) { if (protoProps) Dropzone_defineProperties(Constructor.prototype, protoProps); if (staticProps) Dropzone_defineProperties(Constructor, staticProps); return Constructor; }
6345
6346
6347
6348var Dropzone_Dropzone = /*#__PURE__*/function () {
6349  function Dropzone(context) {
6350    Dropzone_classCallCheck(this, Dropzone);
6351
6352    this.context = context;
6353    this.$eventListener = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(document);
6354    this.$editor = context.layoutInfo.editor;
6355    this.$editable = context.layoutInfo.editable;
6356    this.options = context.options;
6357    this.lang = this.options.langInfo;
6358    this.documentEventHandlers = {};
6359    this.$dropzone = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(['<div class="note-dropzone">', '<div class="note-dropzone-message"></div>', '</div>'].join('')).prependTo(this.$editor);
6360  }
6361  /**
6362   * attach Drag and Drop Events
6363   */
6364
6365
6366  Dropzone_createClass(Dropzone, [{
6367    key: "initialize",
6368    value: function initialize() {
6369      if (this.options.disableDragAndDrop) {
6370        // prevent default drop event
6371        this.documentEventHandlers.onDrop = function (e) {
6372          e.preventDefault();
6373        }; // do not consider outside of dropzone
6374
6375
6376        this.$eventListener = this.$dropzone;
6377        this.$eventListener.on('drop', this.documentEventHandlers.onDrop);
6378      } else {
6379        this.attachDragAndDropEvent();
6380      }
6381    }
6382    /**
6383     * attach Drag and Drop Events
6384     */
6385
6386  }, {
6387    key: "attachDragAndDropEvent",
6388    value: function attachDragAndDropEvent() {
6389      var _this = this;
6390
6391      var collection = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()();
6392      var $dropzoneMessage = this.$dropzone.find('.note-dropzone-message');
6393
6394      this.documentEventHandlers.onDragenter = function (e) {
6395        var isCodeview = _this.context.invoke('codeview.isActivated');
6396
6397        var hasEditorSize = _this.$editor.width() > 0 && _this.$editor.height() > 0;
6398
6399        if (!isCodeview && !collection.length && hasEditorSize) {
6400          _this.$editor.addClass('dragover');
6401
6402          _this.$dropzone.width(_this.$editor.width());
6403
6404          _this.$dropzone.height(_this.$editor.height());
6405
6406          $dropzoneMessage.text(_this.lang.image.dragImageHere);
6407        }
6408
6409        collection = collection.add(e.target);
6410      };
6411
6412      this.documentEventHandlers.onDragleave = function (e) {
6413        collection = collection.not(e.target); // If nodeName is BODY, then just make it over (fix for IE)
6414
6415        if (!collection.length || e.target.nodeName === 'BODY') {
6416          collection = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()();
6417
6418          _this.$editor.removeClass('dragover');
6419        }
6420      };
6421
6422      this.documentEventHandlers.onDrop = function () {
6423        collection = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()();
6424
6425        _this.$editor.removeClass('dragover');
6426      }; // show dropzone on dragenter when dragging a object to document
6427      // -but only if the editor is visible, i.e. has a positive width and height
6428
6429
6430      this.$eventListener.on('dragenter', this.documentEventHandlers.onDragenter).on('dragleave', this.documentEventHandlers.onDragleave).on('drop', this.documentEventHandlers.onDrop); // change dropzone's message on hover.
6431
6432      this.$dropzone.on('dragenter', function () {
6433        _this.$dropzone.addClass('hover');
6434
6435        $dropzoneMessage.text(_this.lang.image.dropImage);
6436      }).on('dragleave', function () {
6437        _this.$dropzone.removeClass('hover');
6438
6439        $dropzoneMessage.text(_this.lang.image.dragImageHere);
6440      }); // attach dropImage
6441
6442      this.$dropzone.on('drop', function (event) {
6443        var dataTransfer = event.originalEvent.dataTransfer; // stop the browser from opening the dropped content
6444
6445        event.preventDefault();
6446
6447        if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
6448          _this.$editable.focus();
6449
6450          _this.context.invoke('editor.insertImagesOrCallback', dataTransfer.files);
6451        } else {
6452          external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(dataTransfer.types, function (idx, type) {
6453            // skip moz-specific types
6454            if (type.toLowerCase().indexOf('_moz_') > -1) {
6455              return;
6456            }
6457
6458            var content = dataTransfer.getData(type);
6459
6460            if (type.toLowerCase().indexOf('text') > -1) {
6461              _this.context.invoke('editor.pasteHTML', content);
6462            } else {
6463              external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(content).each(function (idx, item) {
6464                _this.context.invoke('editor.insertNode', item);
6465              });
6466            }
6467          });
6468        }
6469      }).on('dragover', false); // prevent default dragover event
6470    }
6471  }, {
6472    key: "destroy",
6473    value: function destroy() {
6474      var _this2 = this;
6475
6476      Object.keys(this.documentEventHandlers).forEach(function (key) {
6477        _this2.$eventListener.off(key.substr(2).toLowerCase(), _this2.documentEventHandlers[key]);
6478      });
6479      this.documentEventHandlers = {};
6480    }
6481  }]);
6482
6483  return Dropzone;
6484}();
6485
6486
6487// CONCATENATED MODULE: ./src/js/base/module/Codeview.js
6488function _createForOfIteratorHelper(o) { if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
6489
6490function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
6491
6492function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
6493
6494function Codeview_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
6495
6496function Codeview_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
6497
6498function Codeview_createClass(Constructor, protoProps, staticProps) { if (protoProps) Codeview_defineProperties(Constructor.prototype, protoProps); if (staticProps) Codeview_defineProperties(Constructor, staticProps); return Constructor; }
6499
6500
6501
6502/**
6503 * @class Codeview
6504 */
6505
6506var Codeview_CodeView = /*#__PURE__*/function () {
6507  function CodeView(context) {
6508    Codeview_classCallCheck(this, CodeView);
6509
6510    this.context = context;
6511    this.$editor = context.layoutInfo.editor;
6512    this.$editable = context.layoutInfo.editable;
6513    this.$codable = context.layoutInfo.codable;
6514    this.options = context.options;
6515    this.CodeMirrorConstructor = window.CodeMirror;
6516
6517    if (this.options.codemirror.CodeMirrorConstructor) {
6518      this.CodeMirrorConstructor = this.options.codemirror.CodeMirrorConstructor;
6519    }
6520  }
6521
6522  Codeview_createClass(CodeView, [{
6523    key: "sync",
6524    value: function sync(html) {
6525      var isCodeview = this.isActivated();
6526      var CodeMirror = this.CodeMirrorConstructor;
6527
6528      if (isCodeview) {
6529        if (html) {
6530          if (CodeMirror) {
6531            this.$codable.data('cmEditor').getDoc().setValue(html);
6532          } else {
6533            this.$codable.val(html);
6534          }
6535        } else {
6536          if (CodeMirror) {
6537            this.$codable.data('cmEditor').save();
6538          }
6539        }
6540      }
6541    }
6542  }, {
6543    key: "initialize",
6544    value: function initialize() {
6545      var _this = this;
6546
6547      this.$codable.on('keyup', function (event) {
6548        if (event.keyCode === core_key.code.ESCAPE) {
6549          _this.deactivate();
6550        }
6551      });
6552    }
6553    /**
6554     * @return {Boolean}
6555     */
6556
6557  }, {
6558    key: "isActivated",
6559    value: function isActivated() {
6560      return this.$editor.hasClass('codeview');
6561    }
6562    /**
6563     * toggle codeview
6564     */
6565
6566  }, {
6567    key: "toggle",
6568    value: function toggle() {
6569      if (this.isActivated()) {
6570        this.deactivate();
6571      } else {
6572        this.activate();
6573      }
6574
6575      this.context.triggerEvent('codeview.toggled');
6576    }
6577    /**
6578     * purify input value
6579     * @param value
6580     * @returns {*}
6581     */
6582
6583  }, {
6584    key: "purify",
6585    value: function purify(value) {
6586      if (this.options.codeviewFilter) {
6587        // filter code view regex
6588        value = value.replace(this.options.codeviewFilterRegex, ''); // allow specific iframe tag
6589
6590        if (this.options.codeviewIframeFilter) {
6591          var whitelist = this.options.codeviewIframeWhitelistSrc.concat(this.options.codeviewIframeWhitelistSrcBase);
6592          value = value.replace(/(<iframe.*?>.*?(?:<\/iframe>)?)/gi, function (tag) {
6593            // remove if src attribute is duplicated
6594            if (/<.+src(?==?('|"|\s)?)[\s\S]+src(?=('|"|\s)?)[^>]*?>/i.test(tag)) {
6595              return '';
6596            }
6597
6598            var _iterator = _createForOfIteratorHelper(whitelist),
6599                _step;
6600
6601            try {
6602              for (_iterator.s(); !(_step = _iterator.n()).done;) {
6603                var src = _step.value;
6604
6605                // pass if src is trusted
6606                if (new RegExp('src="(https?:)?\/\/' + src.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '\/(.+)"').test(tag)) {
6607                  return tag;
6608                }
6609              }
6610            } catch (err) {
6611              _iterator.e(err);
6612            } finally {
6613              _iterator.f();
6614            }
6615
6616            return '';
6617          });
6618        }
6619      }
6620
6621      return value;
6622    }
6623    /**
6624     * activate code view
6625     */
6626
6627  }, {
6628    key: "activate",
6629    value: function activate() {
6630      var _this2 = this;
6631
6632      var CodeMirror = this.CodeMirrorConstructor;
6633      this.$codable.val(dom.html(this.$editable, this.options.prettifyHtml));
6634      this.$codable.height(this.$editable.height());
6635      this.context.invoke('toolbar.updateCodeview', true);
6636      this.context.invoke('airPopover.updateCodeview', true);
6637      this.$editor.addClass('codeview');
6638      this.$codable.focus(); // activate CodeMirror as codable
6639
6640      if (CodeMirror) {
6641        var cmEditor = CodeMirror.fromTextArea(this.$codable[0], this.options.codemirror); // CodeMirror TernServer
6642
6643        if (this.options.codemirror.tern) {
6644          var server = new CodeMirror.TernServer(this.options.codemirror.tern);
6645          cmEditor.ternServer = server;
6646          cmEditor.on('cursorActivity', function (cm) {
6647            server.updateArgHints(cm);
6648          });
6649        }
6650
6651        cmEditor.on('blur', function (event) {
6652          _this2.context.triggerEvent('blur.codeview', cmEditor.getValue(), event);
6653        });
6654        cmEditor.on('change', function () {
6655          _this2.context.triggerEvent('change.codeview', cmEditor.getValue(), cmEditor);
6656        }); // CodeMirror hasn't Padding.
6657
6658        cmEditor.setSize(null, this.$editable.outerHeight());
6659        this.$codable.data('cmEditor', cmEditor);
6660      } else {
6661        this.$codable.on('blur', function (event) {
6662          _this2.context.triggerEvent('blur.codeview', _this2.$codable.val(), event);
6663        });
6664        this.$codable.on('input', function () {
6665          _this2.context.triggerEvent('change.codeview', _this2.$codable.val(), _this2.$codable);
6666        });
6667      }
6668    }
6669    /**
6670     * deactivate code view
6671     */
6672
6673  }, {
6674    key: "deactivate",
6675    value: function deactivate() {
6676      var CodeMirror = this.CodeMirrorConstructor; // deactivate CodeMirror as codable
6677
6678      if (CodeMirror) {
6679        var cmEditor = this.$codable.data('cmEditor');
6680        this.$codable.val(cmEditor.getValue());
6681        cmEditor.toTextArea();
6682      }
6683
6684      var value = this.purify(dom.value(this.$codable, this.options.prettifyHtml) || dom.emptyPara);
6685      var isChange = this.$editable.html() !== value;
6686      this.$editable.html(value);
6687      this.$editable.height(this.options.height ? this.$codable.height() : 'auto');
6688      this.$editor.removeClass('codeview');
6689
6690      if (isChange) {
6691        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
6692      }
6693
6694      this.$editable.focus();
6695      this.context.invoke('toolbar.updateCodeview', false);
6696      this.context.invoke('airPopover.updateCodeview', false);
6697    }
6698  }, {
6699    key: "destroy",
6700    value: function destroy() {
6701      if (this.isActivated()) {
6702        this.deactivate();
6703      }
6704    }
6705  }]);
6706
6707  return CodeView;
6708}();
6709
6710
6711// CONCATENATED MODULE: ./src/js/base/module/Statusbar.js
6712function Statusbar_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
6713
6714function Statusbar_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
6715
6716function Statusbar_createClass(Constructor, protoProps, staticProps) { if (protoProps) Statusbar_defineProperties(Constructor.prototype, protoProps); if (staticProps) Statusbar_defineProperties(Constructor, staticProps); return Constructor; }
6717
6718
6719var EDITABLE_PADDING = 24;
6720
6721var Statusbar_Statusbar = /*#__PURE__*/function () {
6722  function Statusbar(context) {
6723    Statusbar_classCallCheck(this, Statusbar);
6724
6725    this.$document = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(document);
6726    this.$statusbar = context.layoutInfo.statusbar;
6727    this.$editable = context.layoutInfo.editable;
6728    this.options = context.options;
6729  }
6730
6731  Statusbar_createClass(Statusbar, [{
6732    key: "initialize",
6733    value: function initialize() {
6734      var _this = this;
6735
6736      if (this.options.airMode || this.options.disableResizeEditor) {
6737        this.destroy();
6738        return;
6739      }
6740
6741      this.$statusbar.on('mousedown', function (event) {
6742        event.preventDefault();
6743        event.stopPropagation();
6744
6745        var editableTop = _this.$editable.offset().top - _this.$document.scrollTop();
6746
6747        var onMouseMove = function onMouseMove(event) {
6748          var height = event.clientY - (editableTop + EDITABLE_PADDING);
6749          height = _this.options.minheight > 0 ? Math.max(height, _this.options.minheight) : height;
6750          height = _this.options.maxHeight > 0 ? Math.min(height, _this.options.maxHeight) : height;
6751
6752          _this.$editable.height(height);
6753        };
6754
6755        _this.$document.on('mousemove', onMouseMove).one('mouseup', function () {
6756          _this.$document.off('mousemove', onMouseMove);
6757        });
6758      });
6759    }
6760  }, {
6761    key: "destroy",
6762    value: function destroy() {
6763      this.$statusbar.off();
6764      this.$statusbar.addClass('locked');
6765    }
6766  }]);
6767
6768  return Statusbar;
6769}();
6770
6771
6772// CONCATENATED MODULE: ./src/js/base/module/Fullscreen.js
6773function Fullscreen_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
6774
6775function Fullscreen_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
6776
6777function Fullscreen_createClass(Constructor, protoProps, staticProps) { if (protoProps) Fullscreen_defineProperties(Constructor.prototype, protoProps); if (staticProps) Fullscreen_defineProperties(Constructor, staticProps); return Constructor; }
6778
6779
6780
6781var Fullscreen_Fullscreen = /*#__PURE__*/function () {
6782  function Fullscreen(context) {
6783    var _this = this;
6784
6785    Fullscreen_classCallCheck(this, Fullscreen);
6786
6787    this.context = context;
6788    this.$editor = context.layoutInfo.editor;
6789    this.$toolbar = context.layoutInfo.toolbar;
6790    this.$editable = context.layoutInfo.editable;
6791    this.$codable = context.layoutInfo.codable;
6792    this.$window = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(window);
6793    this.$scrollbar = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('html, body');
6794
6795    this.onResize = function () {
6796      _this.resizeTo({
6797        h: _this.$window.height() - _this.$toolbar.outerHeight()
6798      });
6799    };
6800  }
6801
6802  Fullscreen_createClass(Fullscreen, [{
6803    key: "resizeTo",
6804    value: function resizeTo(size) {
6805      this.$editable.css('height', size.h);
6806      this.$codable.css('height', size.h);
6807
6808      if (this.$codable.data('cmeditor')) {
6809        this.$codable.data('cmeditor').setsize(null, size.h);
6810      }
6811    }
6812    /**
6813     * toggle fullscreen
6814     */
6815
6816  }, {
6817    key: "toggle",
6818    value: function toggle() {
6819      this.$editor.toggleClass('fullscreen');
6820
6821      if (this.isFullscreen()) {
6822        this.$editable.data('orgHeight', this.$editable.css('height'));
6823        this.$editable.data('orgMaxHeight', this.$editable.css('maxHeight'));
6824        this.$editable.css('maxHeight', '');
6825        this.$window.on('resize', this.onResize).trigger('resize');
6826        this.$scrollbar.css('overflow', 'hidden');
6827      } else {
6828        this.$window.off('resize', this.onResize);
6829        this.resizeTo({
6830          h: this.$editable.data('orgHeight')
6831        });
6832        this.$editable.css('maxHeight', this.$editable.css('orgMaxHeight'));
6833        this.$scrollbar.css('overflow', 'visible');
6834      }
6835
6836      this.context.invoke('toolbar.updateFullscreen', this.isFullscreen());
6837    }
6838  }, {
6839    key: "isFullscreen",
6840    value: function isFullscreen() {
6841      return this.$editor.hasClass('fullscreen');
6842    }
6843  }]);
6844
6845  return Fullscreen;
6846}();
6847
6848
6849// CONCATENATED MODULE: ./src/js/base/module/Handle.js
6850function Handle_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
6851
6852function Handle_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
6853
6854function Handle_createClass(Constructor, protoProps, staticProps) { if (protoProps) Handle_defineProperties(Constructor.prototype, protoProps); if (staticProps) Handle_defineProperties(Constructor, staticProps); return Constructor; }
6855
6856
6857
6858
6859var Handle_Handle = /*#__PURE__*/function () {
6860  function Handle(context) {
6861    var _this = this;
6862
6863    Handle_classCallCheck(this, Handle);
6864
6865    this.context = context;
6866    this.$document = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(document);
6867    this.$editingArea = context.layoutInfo.editingArea;
6868    this.options = context.options;
6869    this.lang = this.options.langInfo;
6870    this.events = {
6871      'summernote.mousedown': function summernoteMousedown(we, e) {
6872        if (_this.update(e.target, e)) {
6873          e.preventDefault();
6874        }
6875      },
6876      'summernote.keyup summernote.scroll summernote.change summernote.dialog.shown': function summernoteKeyupSummernoteScrollSummernoteChangeSummernoteDialogShown() {
6877        _this.update();
6878      },
6879      'summernote.disable summernote.blur': function summernoteDisableSummernoteBlur() {
6880        _this.hide();
6881      },
6882      'summernote.codeview.toggled': function summernoteCodeviewToggled() {
6883        _this.update();
6884      }
6885    };
6886  }
6887
6888  Handle_createClass(Handle, [{
6889    key: "initialize",
6890    value: function initialize() {
6891      var _this2 = this;
6892
6893      this.$handle = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(['<div class="note-handle">', '<div class="note-control-selection">', '<div class="note-control-selection-bg"></div>', '<div class="note-control-holder note-control-nw"></div>', '<div class="note-control-holder note-control-ne"></div>', '<div class="note-control-holder note-control-sw"></div>', '<div class="', this.options.disableResizeImage ? 'note-control-holder' : 'note-control-sizing', ' note-control-se"></div>', this.options.disableResizeImage ? '' : '<div class="note-control-selection-info"></div>', '</div>', '</div>'].join('')).prependTo(this.$editingArea);
6894      this.$handle.on('mousedown', function (event) {
6895        if (dom.isControlSizing(event.target)) {
6896          event.preventDefault();
6897          event.stopPropagation();
6898
6899          var $target = _this2.$handle.find('.note-control-selection').data('target');
6900
6901          var posStart = $target.offset();
6902
6903          var scrollTop = _this2.$document.scrollTop();
6904
6905          var onMouseMove = function onMouseMove(event) {
6906            _this2.context.invoke('editor.resizeTo', {
6907              x: event.clientX - posStart.left,
6908              y: event.clientY - (posStart.top - scrollTop)
6909            }, $target, !event.shiftKey);
6910
6911            _this2.update($target[0], event);
6912          };
6913
6914          _this2.$document.on('mousemove', onMouseMove).one('mouseup', function (e) {
6915            e.preventDefault();
6916
6917            _this2.$document.off('mousemove', onMouseMove);
6918
6919            _this2.context.invoke('editor.afterCommand');
6920          });
6921
6922          if (!$target.data('ratio')) {
6923            // original ratio.
6924            $target.data('ratio', $target.height() / $target.width());
6925          }
6926        }
6927      }); // Listen for scrolling on the handle overlay.
6928
6929      this.$handle.on('wheel', function (e) {
6930        e.preventDefault();
6931
6932        _this2.update();
6933      });
6934    }
6935  }, {
6936    key: "destroy",
6937    value: function destroy() {
6938      this.$handle.remove();
6939    }
6940  }, {
6941    key: "update",
6942    value: function update(target, event) {
6943      if (this.context.isDisabled()) {
6944        return false;
6945      }
6946
6947      var isImage = dom.isImg(target);
6948      var $selection = this.$handle.find('.note-control-selection');
6949      this.context.invoke('imagePopover.update', target, event);
6950
6951      if (isImage) {
6952        var $image = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(target);
6953        var position = $image.position();
6954        var pos = {
6955          left: position.left + parseInt($image.css('marginLeft'), 10),
6956          top: position.top + parseInt($image.css('marginTop'), 10)
6957        }; // exclude margin
6958
6959        var imageSize = {
6960          w: $image.outerWidth(false),
6961          h: $image.outerHeight(false)
6962        };
6963        $selection.css({
6964          display: 'block',
6965          left: pos.left,
6966          top: pos.top,
6967          width: imageSize.w,
6968          height: imageSize.h
6969        }).data('target', $image); // save current image element.
6970
6971        var origImageObj = new Image();
6972        origImageObj.src = $image.attr('src');
6973        var sizingText = imageSize.w + 'x' + imageSize.h + ' (' + this.lang.image.original + ': ' + origImageObj.width + 'x' + origImageObj.height + ')';
6974        $selection.find('.note-control-selection-info').text(sizingText);
6975        this.context.invoke('editor.saveTarget', target);
6976      } else {
6977        this.hide();
6978      }
6979
6980      return isImage;
6981    }
6982    /**
6983     * hide
6984     *
6985     * @param {jQuery} $handle
6986     */
6987
6988  }, {
6989    key: "hide",
6990    value: function hide() {
6991      this.context.invoke('editor.clearTarget');
6992      this.$handle.children().hide();
6993    }
6994  }]);
6995
6996  return Handle;
6997}();
6998
6999
7000// CONCATENATED MODULE: ./src/js/base/module/AutoLink.js
7001function AutoLink_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
7002
7003function AutoLink_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
7004
7005function AutoLink_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoLink_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoLink_defineProperties(Constructor, staticProps); return Constructor; }
7006
7007
7008
7009
7010var defaultScheme = 'http://';
7011var linkPattern = /^([A-Za-z][A-Za-z0-9+-.]*\:[\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@)?(www\.)?(.+)$/i;
7012
7013var AutoLink_AutoLink = /*#__PURE__*/function () {
7014  function AutoLink(context) {
7015    var _this = this;
7016
7017    AutoLink_classCallCheck(this, AutoLink);
7018
7019    this.context = context;
7020    this.options = context.options;
7021    this.events = {
7022      'summernote.keyup': function summernoteKeyup(we, e) {
7023        if (!e.isDefaultPrevented()) {
7024          _this.handleKeyup(e);
7025        }
7026      },
7027      'summernote.keydown': function summernoteKeydown(we, e) {
7028        _this.handleKeydown(e);
7029      }
7030    };
7031  }
7032
7033  AutoLink_createClass(AutoLink, [{
7034    key: "initialize",
7035    value: function initialize() {
7036      this.lastWordRange = null;
7037    }
7038  }, {
7039    key: "destroy",
7040    value: function destroy() {
7041      this.lastWordRange = null;
7042    }
7043  }, {
7044    key: "replace",
7045    value: function replace() {
7046      if (!this.lastWordRange) {
7047        return;
7048      }
7049
7050      var keyword = this.lastWordRange.toString();
7051      var match = keyword.match(linkPattern);
7052
7053      if (match && (match[1] || match[2])) {
7054        var link = match[1] ? keyword : defaultScheme + keyword;
7055        var urlText = this.options.showDomainOnlyForAutolink ? keyword.replace(/^(?:https?:\/\/)?(?:tel?:?)?(?:mailto?:?)?(?:www\.)?/i, '').split('/')[0] : keyword;
7056        var node = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<a />').html(urlText).attr('href', link)[0];
7057
7058        if (this.context.options.linkTargetBlank) {
7059          external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(node).attr('target', '_blank');
7060        }
7061
7062        this.lastWordRange.insertNode(node);
7063        this.lastWordRange = null;
7064        this.context.invoke('editor.focus');
7065      }
7066    }
7067  }, {
7068    key: "handleKeydown",
7069    value: function handleKeydown(e) {
7070      if (lists.contains([core_key.code.ENTER, core_key.code.SPACE], e.keyCode)) {
7071        var wordRange = this.context.invoke('editor.createRange').getWordRange();
7072        this.lastWordRange = wordRange;
7073      }
7074    }
7075  }, {
7076    key: "handleKeyup",
7077    value: function handleKeyup(e) {
7078      if (lists.contains([core_key.code.ENTER, core_key.code.SPACE], e.keyCode)) {
7079        this.replace();
7080      }
7081    }
7082  }]);
7083
7084  return AutoLink;
7085}();
7086
7087
7088// CONCATENATED MODULE: ./src/js/base/module/AutoSync.js
7089function AutoSync_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
7090
7091function AutoSync_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
7092
7093function AutoSync_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoSync_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoSync_defineProperties(Constructor, staticProps); return Constructor; }
7094
7095
7096/**
7097 * textarea auto sync.
7098 */
7099
7100var AutoSync_AutoSync = /*#__PURE__*/function () {
7101  function AutoSync(context) {
7102    var _this = this;
7103
7104    AutoSync_classCallCheck(this, AutoSync);
7105
7106    this.$note = context.layoutInfo.note;
7107    this.events = {
7108      'summernote.change': function summernoteChange() {
7109        _this.$note.val(context.invoke('code'));
7110      }
7111    };
7112  }
7113
7114  AutoSync_createClass(AutoSync, [{
7115    key: "shouldInitialize",
7116    value: function shouldInitialize() {
7117      return dom.isTextarea(this.$note[0]);
7118    }
7119  }]);
7120
7121  return AutoSync;
7122}();
7123
7124
7125// CONCATENATED MODULE: ./src/js/base/module/AutoReplace.js
7126function AutoReplace_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
7127
7128function AutoReplace_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
7129
7130function AutoReplace_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoReplace_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoReplace_defineProperties(Constructor, staticProps); return Constructor; }
7131
7132
7133
7134
7135
7136var AutoReplace_AutoReplace = /*#__PURE__*/function () {
7137  function AutoReplace(context) {
7138    var _this = this;
7139
7140    AutoReplace_classCallCheck(this, AutoReplace);
7141
7142    this.context = context;
7143    this.options = context.options.replace || {};
7144    this.keys = [core_key.code.ENTER, core_key.code.SPACE, core_key.code.PERIOD, core_key.code.COMMA, core_key.code.SEMICOLON, core_key.code.SLASH];
7145    this.previousKeydownCode = null;
7146    this.events = {
7147      'summernote.keyup': function summernoteKeyup(we, e) {
7148        if (!e.isDefaultPrevented()) {
7149          _this.handleKeyup(e);
7150        }
7151      },
7152      'summernote.keydown': function summernoteKeydown(we, e) {
7153        _this.handleKeydown(e);
7154      }
7155    };
7156  }
7157
7158  AutoReplace_createClass(AutoReplace, [{
7159    key: "shouldInitialize",
7160    value: function shouldInitialize() {
7161      return !!this.options.match;
7162    }
7163  }, {
7164    key: "initialize",
7165    value: function initialize() {
7166      this.lastWord = null;
7167    }
7168  }, {
7169    key: "destroy",
7170    value: function destroy() {
7171      this.lastWord = null;
7172    }
7173  }, {
7174    key: "replace",
7175    value: function replace() {
7176      if (!this.lastWord) {
7177        return;
7178      }
7179
7180      var self = this;
7181      var keyword = this.lastWord.toString();
7182      this.options.match(keyword, function (match) {
7183        if (match) {
7184          var node = '';
7185
7186          if (typeof match === 'string') {
7187            node = dom.createText(match);
7188          } else if (match instanceof jQuery) {
7189            node = match[0];
7190          } else if (match instanceof Node) {
7191            node = match;
7192          }
7193
7194          if (!node) return;
7195          self.lastWord.insertNode(node);
7196          self.lastWord = null;
7197          self.context.invoke('editor.focus');
7198        }
7199      });
7200    }
7201  }, {
7202    key: "handleKeydown",
7203    value: function handleKeydown(e) {
7204      // this forces it to remember the last whole word, even if multiple termination keys are pressed
7205      // before the previous key is let go.
7206      if (this.previousKeydownCode && lists.contains(this.keys, this.previousKeydownCode)) {
7207        this.previousKeydownCode = e.keyCode;
7208        return;
7209      }
7210
7211      if (lists.contains(this.keys, e.keyCode)) {
7212        var wordRange = this.context.invoke('editor.createRange').getWordRange();
7213        this.lastWord = wordRange;
7214      }
7215
7216      this.previousKeydownCode = e.keyCode;
7217    }
7218  }, {
7219    key: "handleKeyup",
7220    value: function handleKeyup(e) {
7221      if (lists.contains(this.keys, e.keyCode)) {
7222        this.replace();
7223      }
7224    }
7225  }]);
7226
7227  return AutoReplace;
7228}();
7229
7230
7231// CONCATENATED MODULE: ./src/js/base/module/Placeholder.js
7232function Placeholder_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
7233
7234function Placeholder_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
7235
7236function Placeholder_createClass(Constructor, protoProps, staticProps) { if (protoProps) Placeholder_defineProperties(Constructor.prototype, protoProps); if (staticProps) Placeholder_defineProperties(Constructor, staticProps); return Constructor; }
7237
7238
7239
7240var Placeholder_Placeholder = /*#__PURE__*/function () {
7241  function Placeholder(context) {
7242    var _this = this;
7243
7244    Placeholder_classCallCheck(this, Placeholder);
7245
7246    this.context = context;
7247    this.$editingArea = context.layoutInfo.editingArea;
7248    this.options = context.options;
7249
7250    if (this.options.inheritPlaceholder === true) {
7251      // get placeholder value from the original element
7252      this.options.placeholder = this.context.$note.attr('placeholder') || this.options.placeholder;
7253    }
7254
7255    this.events = {
7256      'summernote.init summernote.change': function summernoteInitSummernoteChange() {
7257        _this.update();
7258      },
7259      'summernote.codeview.toggled': function summernoteCodeviewToggled() {
7260        _this.update();
7261      }
7262    };
7263  }
7264
7265  Placeholder_createClass(Placeholder, [{
7266    key: "shouldInitialize",
7267    value: function shouldInitialize() {
7268      return !!this.options.placeholder;
7269    }
7270  }, {
7271    key: "initialize",
7272    value: function initialize() {
7273      var _this2 = this;
7274
7275      this.$placeholder = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<div class="note-placeholder">');
7276      this.$placeholder.on('click', function () {
7277        _this2.context.invoke('focus');
7278      }).html(this.options.placeholder).prependTo(this.$editingArea);
7279      this.update();
7280    }
7281  }, {
7282    key: "destroy",
7283    value: function destroy() {
7284      this.$placeholder.remove();
7285    }
7286  }, {
7287    key: "update",
7288    value: function update() {
7289      var isShow = !this.context.invoke('codeview.isActivated') && this.context.invoke('editor.isEmpty');
7290      this.$placeholder.toggle(isShow);
7291    }
7292  }]);
7293
7294  return Placeholder;
7295}();
7296
7297
7298// CONCATENATED MODULE: ./src/js/base/module/Buttons.js
7299function Buttons_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
7300
7301function Buttons_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
7302
7303function Buttons_createClass(Constructor, protoProps, staticProps) { if (protoProps) Buttons_defineProperties(Constructor.prototype, protoProps); if (staticProps) Buttons_defineProperties(Constructor, staticProps); return Constructor; }
7304
7305
7306
7307
7308
7309
7310var Buttons_Buttons = /*#__PURE__*/function () {
7311  function Buttons(context) {
7312    Buttons_classCallCheck(this, Buttons);
7313
7314    this.ui = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.ui;
7315    this.context = context;
7316    this.$toolbar = context.layoutInfo.toolbar;
7317    this.options = context.options;
7318    this.lang = this.options.langInfo;
7319    this.invertedKeyMap = func.invertObject(this.options.keyMap[env.isMac ? 'mac' : 'pc']);
7320  }
7321
7322  Buttons_createClass(Buttons, [{
7323    key: "representShortcut",
7324    value: function representShortcut(editorMethod) {
7325      var shortcut = this.invertedKeyMap[editorMethod];
7326
7327      if (!this.options.shortcuts || !shortcut) {
7328        return '';
7329      }
7330
7331      if (env.isMac) {
7332        shortcut = shortcut.replace('CMD', '⌘').replace('SHIFT', '⇧');
7333      }
7334
7335      shortcut = shortcut.replace('BACKSLASH', '\\').replace('SLASH', '/').replace('LEFTBRACKET', '[').replace('RIGHTBRACKET', ']');
7336      return ' (' + shortcut + ')';
7337    }
7338  }, {
7339    key: "button",
7340    value: function button(o) {
7341      if (!this.options.tooltip && o.tooltip) {
7342        delete o.tooltip;
7343      }
7344
7345      o.container = this.options.container;
7346      return this.ui.button(o);
7347    }
7348  }, {
7349    key: "initialize",
7350    value: function initialize() {
7351      this.addToolbarButtons();
7352      this.addImagePopoverButtons();
7353      this.addLinkPopoverButtons();
7354      this.addTablePopoverButtons();
7355      this.fontInstalledMap = {};
7356    }
7357  }, {
7358    key: "destroy",
7359    value: function destroy() {
7360      delete this.fontInstalledMap;
7361    }
7362  }, {
7363    key: "isFontInstalled",
7364    value: function isFontInstalled(name) {
7365      if (!Object.prototype.hasOwnProperty.call(this.fontInstalledMap, name)) {
7366        this.fontInstalledMap[name] = env.isFontInstalled(name) || lists.contains(this.options.fontNamesIgnoreCheck, name);
7367      }
7368
7369      return this.fontInstalledMap[name];
7370    }
7371  }, {
7372    key: "isFontDeservedToAdd",
7373    value: function isFontDeservedToAdd(name) {
7374      name = name.toLowerCase();
7375      return name !== '' && this.isFontInstalled(name) && env.genericFontFamilies.indexOf(name) === -1;
7376    }
7377  }, {
7378    key: "colorPalette",
7379    value: function colorPalette(className, tooltip, backColor, foreColor) {
7380      var _this = this;
7381
7382      return this.ui.buttonGroup({
7383        className: 'note-color ' + className,
7384        children: [this.button({
7385          className: 'note-current-color-button',
7386          contents: this.ui.icon(this.options.icons.font + ' note-recent-color'),
7387          tooltip: tooltip,
7388          click: function click(e) {
7389            var $button = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(e.currentTarget);
7390
7391            if (backColor && foreColor) {
7392              _this.context.invoke('editor.color', {
7393                backColor: $button.attr('data-backColor'),
7394                foreColor: $button.attr('data-foreColor')
7395              });
7396            } else if (backColor) {
7397              _this.context.invoke('editor.color', {
7398                backColor: $button.attr('data-backColor')
7399              });
7400            } else if (foreColor) {
7401              _this.context.invoke('editor.color', {
7402                foreColor: $button.attr('data-foreColor')
7403              });
7404            }
7405          },
7406          callback: function callback($button) {
7407            var $recentColor = $button.find('.note-recent-color');
7408
7409            if (backColor) {
7410              $recentColor.css('background-color', _this.options.colorButton.backColor);
7411              $button.attr('data-backColor', _this.options.colorButton.backColor);
7412            }
7413
7414            if (foreColor) {
7415              $recentColor.css('color', _this.options.colorButton.foreColor);
7416              $button.attr('data-foreColor', _this.options.colorButton.foreColor);
7417            } else {
7418              $recentColor.css('color', 'transparent');
7419            }
7420          }
7421        }), this.button({
7422          className: 'dropdown-toggle',
7423          contents: this.ui.dropdownButtonContents('', this.options),
7424          tooltip: this.lang.color.more,
7425          data: {
7426            toggle: 'dropdown'
7427          }
7428        }), this.ui.dropdown({
7429          items: (backColor ? ['<div class="note-palette">', '<div class="note-palette-title">' + this.lang.color.background + '</div>', '<div>', '<button type="button" class="note-color-reset btn btn-light btn-default" data-event="backColor" data-value="transparent">', this.lang.color.transparent, '</button>', '</div>', '<div class="note-holder" data-event="backColor"><!-- back colors --></div>', '<div>', '<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="backColorPicker">', this.lang.color.cpSelect, '</button>', '<input type="color" id="backColorPicker" class="note-btn note-color-select-btn" value="' + this.options.colorButton.backColor + '" data-event="backColorPalette">', '</div>', '<div class="note-holder-custom" id="backColorPalette" data-event="backColor"></div>', '</div>'].join('') : '') + (foreColor ? ['<div class="note-palette">', '<div class="note-palette-title">' + this.lang.color.foreground + '</div>', '<div>', '<button type="button" class="note-color-reset btn btn-light btn-default" data-event="removeFormat" data-value="foreColor">', this.lang.color.resetToDefault, '</button>', '</div>', '<div class="note-holder" data-event="foreColor"><!-- fore colors --></div>', '<div>', '<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="foreColorPicker">', this.lang.color.cpSelect, '</button>', '<input type="color" id="foreColorPicker" class="note-btn note-color-select-btn" value="' + this.options.colorButton.foreColor + '" data-event="foreColorPalette">', '</div>', // Fix missing Div, Commented to find easily if it's wrong
7430          '<div class="note-holder-custom" id="foreColorPalette" data-event="foreColor"></div>', '</div>'].join('') : ''),
7431          callback: function callback($dropdown) {
7432            $dropdown.find('.note-holder').each(function (idx, item) {
7433              var $holder = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(item);
7434              $holder.append(_this.ui.palette({
7435                colors: _this.options.colors,
7436                colorsName: _this.options.colorsName,
7437                eventName: $holder.data('event'),
7438                container: _this.options.container,
7439                tooltip: _this.options.tooltip
7440              }).render());
7441            });
7442            /* TODO: do we have to record recent custom colors within cookies? */
7443
7444            var customColors = [['#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF']];
7445            $dropdown.find('.note-holder-custom').each(function (idx, item) {
7446              var $holder = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(item);
7447              $holder.append(_this.ui.palette({
7448                colors: customColors,
7449                colorsName: customColors,
7450                eventName: $holder.data('event'),
7451                container: _this.options.container,
7452                tooltip: _this.options.tooltip
7453              }).render());
7454            });
7455            $dropdown.find('input[type=color]').each(function (idx, item) {
7456              external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(item).change(function () {
7457                var $chip = $dropdown.find('#' + external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(this).data('event')).find('.note-color-btn').first();
7458                var color = this.value.toUpperCase();
7459                $chip.css('background-color', color).attr('aria-label', color).attr('data-value', color).attr('data-original-title', color);
7460                $chip.click();
7461              });
7462            });
7463          },
7464          click: function click(event) {
7465            event.stopPropagation();
7466            var $parent = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('.' + className).find('.note-dropdown-menu');
7467            var $button = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(event.target);
7468            var eventName = $button.data('event');
7469            var value = $button.attr('data-value');
7470
7471            if (eventName === 'openPalette') {
7472              var $picker = $parent.find('#' + value);
7473              var $palette = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jq
vendor: 6,076 bytes, lines 7473-7609
7473uery_default()($parent.find('#' + $picker.data('event')).find('.note-color-row')[0]); // Shift palette chips
7474
7475              var $chip = $palette.find('.note-color-btn').last().detach(); // Set chip attributes
7476
7477              var color = $picker.val();
7478              $chip.css('background-color', color).attr('aria-label', color).attr('data-value', color).attr('data-original-title', color);
7479              $palette.prepend($chip);
7480              $picker.click();
7481            } else {
7482              if (lists.contains(['backColor', 'foreColor'], eventName)) {
7483                var key = eventName === 'backColor' ? 'background-color' : 'color';
7484                var $color = $button.closest('.note-color').find('.note-recent-color');
7485                var $currentButton = $button.closest('.note-color').find('.note-current-color-button');
7486                $color.css(key, value);
7487                $currentButton.attr('data-' + eventName, value);
7488              }
7489
7490              _this.context.invoke('editor.' + eventName, value);
7491            }
7492          }
7493        })]
7494      }).render();
7495    }
7496  }, {
7497    key: "addToolbarButtons",
7498    value: function addToolbarButtons() {
7499      var _this2 = this;
7500
7501      this.context.memo('button.style', function () {
7502        return _this2.ui.buttonGroup([_this2.button({
7503          className: 'dropdown-toggle',
7504          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.magic), _this2.options),
7505          tooltip: _this2.lang.style.style,
7506          data: {
7507            toggle: 'dropdown'
7508          }
7509        }), _this2.ui.dropdown({
7510          className: 'dropdown-style',
7511          items: _this2.options.styleTags,
7512          title: _this2.lang.style.style,
7513          template: function template(item) {
7514            // TBD: need to be simplified
7515            if (typeof item === 'string') {
7516              item = {
7517                tag: item,
7518                title: Object.prototype.hasOwnProperty.call(_this2.lang.style, item) ? _this2.lang.style[item] : item
7519              };
7520            }
7521
7522            var tag = item.tag;
7523            var title = item.title;
7524            var style = item.style ? ' style="' + item.style + '" ' : '';
7525            var className = item.className ? ' class="' + item.className + '"' : '';
7526            return '<' + tag + style + className + '>' + title + '</' + tag + '>';
7527          },
7528          click: _this2.context.createInvokeHandler('editor.formatBlock')
7529        })]).render();
7530      });
7531
7532      var _loop = function _loop(styleIdx, styleLen) {
7533        var item = _this2.options.styleTags[styleIdx];
7534
7535        _this2.context.memo('button.style.' + item, function () {
7536          return _this2.button({
7537            className: 'note-btn-style-' + item,
7538            contents: '<div data-value="' + item + '">' + item.toUpperCase() + '</div>',
7539            tooltip: _this2.lang.style[item],
7540            click: _this2.context.createInvokeHandler('editor.formatBlock')
7541          }).render();
7542        });
7543      };
7544
7545      for (var styleIdx = 0, styleLen = this.options.styleTags.length; styleIdx < styleLen; styleIdx++) {
7546        _loop(styleIdx, styleLen);
7547      }
7548
7549      this.context.memo('button.bold', function () {
7550        return _this2.button({
7551          className: 'note-btn-bold',
7552          contents: _this2.ui.icon(_this2.options.icons.bold),
7553          tooltip: _this2.lang.font.bold + _this2.representShortcut('bold'),
7554          click: _this2.context.createInvokeHandlerAndUpdateState('editor.bold')
7555        }).render();
7556      });
7557      this.context.memo('button.italic', function () {
7558        return _this2.button({
7559          className: 'note-btn-italic',
7560          contents: _this2.ui.icon(_this2.options.icons.italic),
7561          tooltip: _this2.lang.font.italic + _this2.representShortcut('italic'),
7562          click: _this2.context.createInvokeHandlerAndUpdateState('editor.italic')
7563        }).render();
7564      });
7565      this.context.memo('button.underline', function () {
7566        return _this2.button({
7567          className: 'note-btn-underline',
7568          contents: _this2.ui.icon(_this2.options.icons.underline),
7569          tooltip: _this2.lang.font.underline + _this2.representShortcut('underline'),
7570          click: _this2.context.createInvokeHandlerAndUpdateState('editor.underline')
7571        }).render();
7572      });
7573      this.context.memo('button.clear', function () {
7574        return _this2.button({
7575          contents: _this2.ui.icon(_this2.options.icons.eraser),
7576          tooltip: _this2.lang.font.clear + _this2.representShortcut('removeFormat'),
7577          click: _this2.context.createInvokeHandler('editor.removeFormat')
7578        }).render();
7579      });
7580      this.context.memo('button.strikethrough', function () {
7581        return _this2.button({
7582          className: 'note-btn-strikethrough',
7583          contents: _this2.ui.icon(_this2.options.icons.strikethrough),
7584          tooltip: _this2.lang.font.strikethrough + _this2.representShortcut('strikethrough'),
7585          click: _this2.context.createInvokeHandlerAndUpdateState('editor.strikethrough')
7586        }).render();
7587      });
7588      this.context.memo('button.superscript', function () {
7589        return _this2.button({
7590          className: 'note-btn-superscript',
7591          contents: _this2.ui.icon(_this2.options.icons.superscript),
7592          tooltip: _this2.lang.font.superscript,
7593          click: _this2.context.createInvokeHandlerAndUpdateState('editor.superscript')
7594        }).render();
7595      });
7596      this.context.memo('button.subscript', function () {
7597        return _this2.button({
7598          className: 'note-btn-subscript',
7599          contents: _this2.ui.icon(_this2.options.icons.subscript),
7600          tooltip: _this2.lang.font.subscript,
7601          click: _this2.context.createInvokeHandlerAndUpdateState('editor.subscript')
7602        }).render();
7603      });
7604      this.context.memo('button.fontname', function () {
7605        var styleInfo = _this2.context.invoke('editor.currentStyle');
7606
7607        if (_this2.options.addDefaultFonts) {
7608          // Add 'default' fonts into the fontnames array if not exist
7609          external_
vendor: 9,202 bytes, lines 7609-7792
7609root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(styleInfo['font-family'].split(','), function (idx, fontname) {
7610            fontname = fontname.trim().replace(/['"]+/g, '');
7611
7612            if (_this2.isFontDeservedToAdd(fontname)) {
7613              if (_this2.options.fontNames.indexOf(fontname) === -1) {
7614                _this2.options.fontNames.push(fontname);
7615              }
7616            }
7617          });
7618        }
7619
7620        return _this2.ui.buttonGroup([_this2.button({
7621          className: 'dropdown-toggle',
7622          contents: _this2.ui.dropdownButtonContents('<span class="note-current-fontname"></span>', _this2.options),
7623          tooltip: _this2.lang.font.name,
7624          data: {
7625            toggle: 'dropdown'
7626          }
7627        }), _this2.ui.dropdownCheck({
7628          className: 'dropdown-fontname',
7629          checkClassName: _this2.options.icons.menuCheck,
7630          items: _this2.options.fontNames.filter(_this2.isFontInstalled.bind(_this2)),
7631          title: _this2.lang.font.name,
7632          template: function template(item) {
7633            return '<span style="font-family: ' + env.validFontName(item) + '">' + item + '</span>';
7634          },
7635          click: _this2.context.createInvokeHandlerAndUpdateState('editor.fontName')
7636        })]).render();
7637      });
7638      this.context.memo('button.fontsize', function () {
7639        return _this2.ui.buttonGroup([_this2.button({
7640          className: 'dropdown-toggle',
7641          contents: _this2.ui.dropdownButtonContents('<span class="note-current-fontsize"></span>', _this2.options),
7642          tooltip: _this2.lang.font.size,
7643          data: {
7644            toggle: 'dropdown'
7645          }
7646        }), _this2.ui.dropdownCheck({
7647          className: 'dropdown-fontsize',
7648          checkClassName: _this2.options.icons.menuCheck,
7649          items: _this2.options.fontSizes,
7650          title: _this2.lang.font.size,
7651          click: _this2.context.createInvokeHandlerAndUpdateState('editor.fontSize')
7652        })]).render();
7653      });
7654      this.context.memo('button.fontsizeunit', function () {
7655        return _this2.ui.buttonGroup([_this2.button({
7656          className: 'dropdown-toggle',
7657          contents: _this2.ui.dropdownButtonContents('<span class="note-current-fontsizeunit"></span>', _this2.options),
7658          tooltip: _this2.lang.font.sizeunit,
7659          data: {
7660            toggle: 'dropdown'
7661          }
7662        }), _this2.ui.dropdownCheck({
7663          className: 'dropdown-fontsizeunit',
7664          checkClassName: _this2.options.icons.menuCheck,
7665          items: _this2.options.fontSizeUnits,
7666          title: _this2.lang.font.sizeunit,
7667          click: _this2.context.createInvokeHandlerAndUpdateState('editor.fontSizeUnit')
7668        })]).render();
7669      });
7670      this.context.memo('button.color', function () {
7671        return _this2.colorPalette('note-color-all', _this2.lang.color.recent, true, true);
7672      });
7673      this.context.memo('button.forecolor', function () {
7674        return _this2.colorPalette('note-color-fore', _this2.lang.color.foreground, false, true);
7675      });
7676      this.context.memo('button.backcolor', function () {
7677        return _this2.colorPalette('note-color-back', _this2.lang.color.background, true, false);
7678      });
7679      this.context.memo('button.ul', function () {
7680        return _this2.button({
7681          contents: _this2.ui.icon(_this2.options.icons.unorderedlist),
7682          tooltip: _this2.lang.lists.unordered + _this2.representShortcut('insertUnorderedList'),
7683          click: _this2.context.createInvokeHandler('editor.insertUnorderedList')
7684        }).render();
7685      });
7686      this.context.memo('button.ol', function () {
7687        return _this2.button({
7688          contents: _this2.ui.icon(_this2.options.icons.orderedlist),
7689          tooltip: _this2.lang.lists.ordered + _this2.representShortcut('insertOrderedList'),
7690          click: _this2.context.createInvokeHandler('editor.insertOrderedList')
7691        }).render();
7692      });
7693      var justifyLeft = this.button({
7694        contents: this.ui.icon(this.options.icons.alignLeft),
7695        tooltip: this.lang.paragraph.left + this.representShortcut('justifyLeft'),
7696        click: this.context.createInvokeHandler('editor.justifyLeft')
7697      });
7698      var justifyCenter = this.button({
7699        contents: this.ui.icon(this.options.icons.alignCenter),
7700        tooltip: this.lang.paragraph.center + this.representShortcut('justifyCenter'),
7701        click: this.context.createInvokeHandler('editor.justifyCenter')
7702      });
7703      var justifyRight = this.button({
7704        contents: this.ui.icon(this.options.icons.alignRight),
7705        tooltip: this.lang.paragraph.right + this.representShortcut('justifyRight'),
7706        click: this.context.createInvokeHandler('editor.justifyRight')
7707      });
7708      var justifyFull = this.button({
7709        contents: this.ui.icon(this.options.icons.alignJustify),
7710        tooltip: this.lang.paragraph.justify + this.representShortcut('justifyFull'),
7711        click: this.context.createInvokeHandler('editor.justifyFull')
7712      });
7713      var outdent = this.button({
7714        contents: this.ui.icon(this.options.icons.outdent),
7715        tooltip: this.lang.paragraph.outdent + this.representShortcut('outdent'),
7716        click: this.context.createInvokeHandler('editor.outdent')
7717      });
7718      var indent = this.button({
7719        contents: this.ui.icon(this.options.icons.indent),
7720        tooltip: this.lang.paragraph.indent + this.representShortcut('indent'),
7721        click: this.context.createInvokeHandler('editor.indent')
7722      });
7723      this.context.memo('button.justifyLeft', func.invoke(justifyLeft, 'render'));
7724      this.context.memo('button.justifyCenter', func.invoke(justifyCenter, 'render'));
7725      this.context.memo('button.justifyRight', func.invoke(justifyRight, 'render'));
7726      this.context.memo('button.justifyFull', func.invoke(justifyFull, 'render'));
7727      this.context.memo('button.outdent', func.invoke(outdent, 'render'));
7728      this.context.memo('button.indent', func.invoke(indent, 'render'));
7729      this.context.memo('button.paragraph', function () {
7730        return _this2.ui.buttonGroup([_this2.button({
7731          className: 'dropdown-toggle',
7732          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.alignLeft), _this2.options),
7733          tooltip: _this2.lang.paragraph.paragraph,
7734          data: {
7735            toggle: 'dropdown'
7736          }
7737        }), _this2.ui.dropdown([_this2.ui.buttonGroup({
7738          className: 'note-align',
7739          children: [justifyLeft, justifyCenter, justifyRight, justifyFull]
7740        }), _this2.ui.buttonGroup({
7741          className: 'note-list',
7742          children: [outdent, indent]
7743        })])]).render();
7744      });
7745      this.context.memo('button.height', function () {
7746        return _this2.ui.buttonGroup([_this2.button({
7747          className: 'dropdown-toggle',
7748          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.textHeight), _this2.options),
7749          tooltip: _this2.lang.font.height,
7750          data: {
7751            toggle: 'dropdown'
7752          }
7753        }), _this2.ui.dropdownCheck({
7754          items: _this2.options.lineHeights,
7755          checkClassName: _this2.options.icons.menuCheck,
7756          className: 'dropdown-line-height',
7757          title: _this2.lang.font.height,
7758          click: _this2.context.createInvokeHandler('editor.lineHeight')
7759        })]).render();
7760      });
7761      this.context.memo('button.table', function () {
7762        return _this2.ui.buttonGroup([_this2.button({
7763          className: 'dropdown-toggle',
7764          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.table), _this2.options),
7765          tooltip: _this2.lang.table.table,
7766          data: {
7767            toggle: 'dropdown'
7768          }
7769        }), _this2.ui.dropdown({
7770          title: _this2.lang.table.table,
7771          className: 'note-table',
7772          items: ['<div class="note-dimension-picker">', '<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>', '<div class="note-dimension-picker-highlighted"></div>', '<div class="note-dimension-picker-unhighlighted"></div>', '</div>', '<div class="note-dimension-display">1 x 1</div>'].join('')
7773        })], {
7774          callback: function callback($node) {
7775            var $catcher = $node.find('.note-dimension-picker-mousecatcher');
7776            $catcher.css({
7777              width: _this2.options.insertTableMaxSize.col + 'em',
7778              height: _this2.options.insertTableMaxSize.row + 'em'
7779            }).mousedown(_this2.context.createInvokeHandler('editor.insertTable')).on('mousemove', _this2.tableMoveHandler.bind(_this2));
7780          }
7781        }).render();
7782      });
7783      this.context.memo('button.link', function () {
7784        return _this2.button({
7785          contents: _this2.ui.icon(_this2.options.icons.link),
7786          tooltip: _this2.lang.link.link + _this2.representShortcut('linkDialog.show'),
7787          click: _this2.context.createInvokeHandler('linkDialog.show')
7788        }).render();
7789      });
7790      this.context.memo('button.picture', function () {
7791        return _this2.button({
7792          contents: _this2.ui.icon(_this2.options.icons.picture),
vendor: 14,258 bytes, lines 7793-8140
7793          tooltip: _this2.lang.image.image,
7794          click: _this2.context.createInvokeHandler('imageDialog.show')
7795        }).render();
7796      });
7797      this.context.memo('button.video', function () {
7798        return _this2.button({
7799          contents: _this2.ui.icon(_this2.options.icons.video),
7800          tooltip: _this2.lang.video.video,
7801          click: _this2.context.createInvokeHandler('videoDialog.show')
7802        }).render();
7803      });
7804      this.context.memo('button.hr', function () {
7805        return _this2.button({
7806          contents: _this2.ui.icon(_this2.options.icons.minus),
7807          tooltip: _this2.lang.hr.insert + _this2.representShortcut('insertHorizontalRule'),
7808          click: _this2.context.createInvokeHandler('editor.insertHorizontalRule')
7809        }).render();
7810      });
7811      this.context.memo('button.fullscreen', function () {
7812        return _this2.button({
7813          className: 'btn-fullscreen note-codeview-keep',
7814          contents: _this2.ui.icon(_this2.options.icons.arrowsAlt),
7815          tooltip: _this2.lang.options.fullscreen,
7816          click: _this2.context.createInvokeHandler('fullscreen.toggle')
7817        }).render();
7818      });
7819      this.context.memo('button.codeview', function () {
7820        return _this2.button({
7821          className: 'btn-codeview note-codeview-keep',
7822          contents: _this2.ui.icon(_this2.options.icons.code),
7823          tooltip: _this2.lang.options.codeview,
7824          click: _this2.context.createInvokeHandler('codeview.toggle')
7825        }).render();
7826      });
7827      this.context.memo('button.redo', function () {
7828        return _this2.button({
7829          contents: _this2.ui.icon(_this2.options.icons.redo),
7830          tooltip: _this2.lang.history.redo + _this2.representShortcut('redo'),
7831          click: _this2.context.createInvokeHandler('editor.redo')
7832        }).render();
7833      });
7834      this.context.memo('button.undo', function () {
7835        return _this2.button({
7836          contents: _this2.ui.icon(_this2.options.icons.undo),
7837          tooltip: _this2.lang.history.undo + _this2.representShortcut('undo'),
7838          click: _this2.context.createInvokeHandler('editor.undo')
7839        }).render();
7840      });
7841      this.context.memo('button.help', function () {
7842        return _this2.button({
7843          contents: _this2.ui.icon(_this2.options.icons.question),
7844          tooltip: _this2.lang.options.help,
7845          click: _this2.context.createInvokeHandler('helpDialog.show')
7846        }).render();
7847      });
7848    }
7849    /**
7850     * image: [
7851     *   ['imageResize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],
7852     *   ['float', ['floatLeft', 'floatRight', 'floatNone']],
7853     *   ['remove', ['removeMedia']],
7854     * ],
7855     */
7856
7857  }, {
7858    key: "addImagePopoverButtons",
7859    value: function addImagePopoverButtons() {
7860      var _this3 = this;
7861
7862      // Image Size Buttons
7863      this.context.memo('button.resizeFull', function () {
7864        return _this3.button({
7865          contents: '<span class="note-fontsize-10">100%</span>',
7866          tooltip: _this3.lang.image.resizeFull,
7867          click: _this3.context.createInvokeHandler('editor.resize', '1')
7868        }).render();
7869      });
7870      this.context.memo('button.resizeHalf', function () {
7871        return _this3.button({
7872          contents: '<span class="note-fontsize-10">50%</span>',
7873          tooltip: _this3.lang.image.resizeHalf,
7874          click: _this3.context.createInvokeHandler('editor.resize', '0.5')
7875        }).render();
7876      });
7877      this.context.memo('button.resizeQuarter', function () {
7878        return _this3.button({
7879          contents: '<span class="note-fontsize-10">25%</span>',
7880          tooltip: _this3.lang.image.resizeQuarter,
7881          click: _this3.context.createInvokeHandler('editor.resize', '0.25')
7882        }).render();
7883      });
7884      this.context.memo('button.resizeNone', function () {
7885        return _this3.button({
7886          contents: _this3.ui.icon(_this3.options.icons.rollback),
7887          tooltip: _this3.lang.image.resizeNone,
7888          click: _this3.context.createInvokeHandler('editor.resize', '0')
7889        }).render();
7890      }); // Float Buttons
7891
7892      this.context.memo('button.floatLeft', function () {
7893        return _this3.button({
7894          contents: _this3.ui.icon(_this3.options.icons.floatLeft),
7895          tooltip: _this3.lang.image.floatLeft,
7896          click: _this3.context.createInvokeHandler('editor.floatMe', 'left')
7897        }).render();
7898      });
7899      this.context.memo('button.floatRight', function () {
7900        return _this3.button({
7901          contents: _this3.ui.icon(_this3.options.icons.floatRight),
7902          tooltip: _this3.lang.image.floatRight,
7903          click: _this3.context.createInvokeHandler('editor.floatMe', 'right')
7904        }).render();
7905      });
7906      this.context.memo('button.floatNone', function () {
7907        return _this3.button({
7908          contents: _this3.ui.icon(_this3.options.icons.rollback),
7909          tooltip: _this3.lang.image.floatNone,
7910          click: _this3.context.createInvokeHandler('editor.floatMe', 'none')
7911        }).render();
7912      }); // Remove Buttons
7913
7914      this.context.memo('button.removeMedia', function () {
7915        return _this3.button({
7916          contents: _this3.ui.icon(_this3.options.icons.trash),
7917          tooltip: _this3.lang.image.remove,
7918          click: _this3.context.createInvokeHandler('editor.removeMedia')
7919        }).render();
7920      });
7921    }
7922  }, {
7923    key: "addLinkPopoverButtons",
7924    value: function addLinkPopoverButtons() {
7925      var _this4 = this;
7926
7927      this.context.memo('button.linkDialogShow', function () {
7928        return _this4.button({
7929          contents: _this4.ui.icon(_this4.options.icons.link),
7930          tooltip: _this4.lang.link.edit,
7931          click: _this4.context.createInvokeHandler('linkDialog.show')
7932        }).render();
7933      });
7934      this.context.memo('button.unlink', function () {
7935        return _this4.button({
7936          contents: _this4.ui.icon(_this4.options.icons.unlink),
7937          tooltip: _this4.lang.link.unlink,
7938          click: _this4.context.createInvokeHandler('editor.unlink')
7939        }).render();
7940      });
7941    }
7942    /**
7943     * table : [
7944     *  ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],
7945     *  ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]
7946     * ],
7947     */
7948
7949  }, {
7950    key: "addTablePopoverButtons",
7951    value: function addTablePopoverButtons() {
7952      var _this5 = this;
7953
7954      this.context.memo('button.addRowUp', function () {
7955        return _this5.button({
7956          className: 'btn-md',
7957          contents: _this5.ui.icon(_this5.options.icons.rowAbove),
7958          tooltip: _this5.lang.table.addRowAbove,
7959          click: _this5.context.createInvokeHandler('editor.addRow', 'top')
7960        }).render();
7961      });
7962      this.context.memo('button.addRowDown', function () {
7963        return _this5.button({
7964          className: 'btn-md',
7965          contents: _this5.ui.icon(_this5.options.icons.rowBelow),
7966          tooltip: _this5.lang.table.addRowBelow,
7967          click: _this5.context.createInvokeHandler('editor.addRow', 'bottom')
7968        }).render();
7969      });
7970      this.context.memo('button.addColLeft', function () {
7971        return _this5.button({
7972          className: 'btn-md',
7973          contents: _this5.ui.icon(_this5.options.icons.colBefore),
7974          tooltip: _this5.lang.table.addColLeft,
7975          click: _this5.context.createInvokeHandler('editor.addCol', 'left')
7976        }).render();
7977      });
7978      this.context.memo('button.addColRight', function () {
7979        return _this5.button({
7980          className: 'btn-md',
7981          contents: _this5.ui.icon(_this5.options.icons.colAfter),
7982          tooltip: _this5.lang.table.addColRight,
7983          click: _this5.context.createInvokeHandler('editor.addCol', 'right')
7984        }).render();
7985      });
7986      this.context.memo('button.deleteRow', function () {
7987        return _this5.button({
7988          className: 'btn-md',
7989          contents: _this5.ui.icon(_this5.options.icons.rowRemove),
7990          tooltip: _this5.lang.table.delRow,
7991          click: _this5.context.createInvokeHandler('editor.deleteRow')
7992        }).render();
7993      });
7994      this.context.memo('button.deleteCol', function () {
7995        return _this5.button({
7996          className: 'btn-md',
7997          contents: _this5.ui.icon(_this5.options.icons.colRemove),
7998          tooltip: _this5.lang.table.delCol,
7999          click: _this5.context.createInvokeHandler('editor.deleteCol')
8000        }).render();
8001      });
8002      this.context.memo('button.deleteTable', function () {
8003        return _this5.button({
8004          className: 'btn-md',
8005          contents: _this5.ui.icon(_this5.options.icons.trash),
8006          tooltip: _this5.lang.table.delTable,
8007          click: _this5.context.createInvokeHandler('editor.deleteTable')
8008        }).render();
8009      });
8010    }
8011  }, {
8012    key: "build",
8013    value: function build($container, groups) {
8014      for (var groupIdx = 0, groupLen = groups.length; groupIdx < groupLen; groupIdx++) {
8015        var group = groups[groupIdx];
8016        var groupName = Array.isArray(group) ? group[0] : group;
8017        var buttons = Array.isArray(group) ? group.length === 1 ? [group[0]] : group[1] : [group];
8018        var $group = this.ui.buttonGroup({
8019          className: 'note-' + groupName
8020        }).render();
8021
8022        for (var idx = 0, len = buttons.length; idx < len; idx++) {
8023          var btn = this.context.memo('button.' + buttons[idx]);
8024
8025          if (btn) {
8026            $group.append(typeof btn === 'function' ? btn(this.context) : btn);
8027          }
8028        }
8029
8030        $group.appendTo($container);
8031      }
8032    }
8033    /**
8034     * @param {jQuery} [$container]
8035     */
8036
8037  }, {
8038    key: "updateCurrentStyle",
8039    value: function updateCurrentStyle($container) {
8040      var _this6 = this;
8041
8042      var $cont = $container || this.$toolbar;
8043      var styleInfo = this.context.invoke('editor.currentStyle');
8044      this.updateBtnStates($cont, {
8045        '.note-btn-bold': function noteBtnBold() {
8046          return styleInfo['font-bold'] === 'bold';
8047        },
8048        '.note-btn-italic': function noteBtnItalic() {
8049          return styleInfo['font-italic'] === 'italic';
8050        },
8051        '.note-btn-underline': function noteBtnUnderline() {
8052          return styleInfo['font-underline'] === 'underline';
8053        },
8054        '.note-btn-subscript': function noteBtnSubscript() {
8055          return styleInfo['font-subscript'] === 'subscript';
8056        },
8057        '.note-btn-superscript': function noteBtnSuperscript() {
8058          return styleInfo['font-superscript'] === 'superscript';
8059        },
8060        '.note-btn-strikethrough': function noteBtnStrikethrough() {
8061          return styleInfo['font-strikethrough'] === 'strikethrough';
8062        }
8063      });
8064
8065      if (styleInfo['font-family']) {
8066        var fontNames = styleInfo['font-family'].split(',').map(function (name) {
8067          return name.replace(/[\'\"]/g, '').replace(/\s+$/, '').replace(/^\s+/, '');
8068        });
8069        var fontName = lists.find(fontNames, this.isFontInstalled.bind(this));
8070        $cont.find('.dropdown-fontname a').each(function (idx, item) {
8071          var $item = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(item); // always compare string to avoid creating another func.
8072
8073          var isChecked = $item.data('value') + '' === fontName + '';
8074          $item.toggleClass('checked', isChecked);
8075        });
8076        $cont.find('.note-current-fontname').text(fontName).css('font-family', fontName);
8077      }
8078
8079      if (styleInfo['font-size']) {
8080        var fontSize = styleInfo['font-size'];
8081        $cont.find('.dropdown-fontsize a').each(function (idx, item) {
8082          var $item = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(item); // always compare with string to avoid creating another func.
8083
8084          var isChecked = $item.data('value') + '' === fontSize + '';
8085          $item.toggleClass('checked', isChecked);
8086        });
8087        $cont.find('.note-current-fontsize').text(fontSize);
8088        var fontSizeUnit = styleInfo['font-size-unit'];
8089        $cont.find('.dropdown-fontsizeunit a').each(function (idx, item) {
8090          var $item = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(item);
8091          var isChecked = $item.data('value') + '' === fontSizeUnit + '';
8092          $item.toggleClass('checked', isChecked);
8093        });
8094        $cont.find('.note-current-fontsizeunit').text(fontSizeUnit);
8095      }
8096
8097      if (styleInfo['line-height']) {
8098        var lineHeight = styleInfo['line-height'];
8099        $cont.find('.dropdown-line-height li a').each(function (idx, item) {
8100          // always compare with string to avoid creating another func.
8101          var isChecked = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(item).data('value') + '' === lineHeight + '';
8102          _this6.className = isChecked ? 'checked' : '';
8103        });
8104      }
8105    }
8106  }, {
8107    key: "updateBtnStates",
8108    value: function updateBtnStates($container, infos) {
8109      var _this7 = this;
8110
8111      external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.each(infos, function (selector, pred) {
8112        _this7.ui.toggleBtnActive($container.find(selector), pred());
8113      });
8114    }
8115  }, {
8116    key: "tableMoveHandler",
8117    value: function tableMoveHandler(event) {
8118      var PX_PER_EM = 18;
8119      var $picker = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(event.target.parentNode); // target is mousecatcher
8120
8121      var $dimensionDisplay = $picker.next();
8122      var $catcher = $picker.find('.note-dimension-picker-mousecatcher');
8123      var $highlighted = $picker.find('.note-dimension-picker-highlighted');
8124      var $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');
8125      var posOffset; // HTML5 with jQuery - e.offsetX is undefined in Firefox
8126
8127      if (event.offsetX === undefined) {
8128        var posCatcher = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(event.target).offset();
8129        posOffset = {
8130          x: event.pageX - posCatcher.left,
8131          y: event.pageY - posCatcher.top
8132        };
8133      } else {
8134        posOffset = {
8135          x: event.offsetX,
8136          y: event.offsetY
8137        };
8138      }
8139
8140      var dim = {
vendor: 42,572 bytes, lines 8141-9204
8141        c: Math.ceil(posOffset.x / PX_PER_EM) || 1,
8142        r: Math.ceil(posOffset.y / PX_PER_EM) || 1
8143      };
8144      $highlighted.css({
8145        width: dim.c + 'em',
8146        height: dim.r + 'em'
8147      });
8148      $catcher.data('value', dim.c + 'x' + dim.r);
8149
8150      if (dim.c > 3 && dim.c < this.options.insertTableMaxSize.col) {
8151        $unhighlighted.css({
8152          width: dim.c + 1 + 'em'
8153        });
8154      }
8155
8156      if (dim.r > 3 && dim.r < this.options.insertTableMaxSize.row) {
8157        $unhighlighted.css({
8158          height: dim.r + 1 + 'em'
8159        });
8160      }
8161
8162      $dimensionDisplay.html(dim.c + ' x ' + dim.r);
8163    }
8164  }]);
8165
8166  return Buttons;
8167}();
8168
8169
8170// CONCATENATED MODULE: ./src/js/base/module/Toolbar.js
8171function Toolbar_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
8172
8173function Toolbar_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
8174
8175function Toolbar_createClass(Constructor, protoProps, staticProps) { if (protoProps) Toolbar_defineProperties(Constructor.prototype, protoProps); if (staticProps) Toolbar_defineProperties(Constructor, staticProps); return Constructor; }
8176
8177
8178
8179var Toolbar_Toolbar = /*#__PURE__*/function () {
8180  function Toolbar(context) {
8181    Toolbar_classCallCheck(this, Toolbar);
8182
8183    this.context = context;
8184    this.$window = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(window);
8185    this.$document = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(document);
8186    this.ui = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.ui;
8187    this.$note = context.layoutInfo.note;
8188    this.$editor = context.layoutInfo.editor;
8189    this.$toolbar = context.layoutInfo.toolbar;
8190    this.$editable = context.layoutInfo.editable;
8191    this.$statusbar = context.layoutInfo.statusbar;
8192    this.options = context.options;
8193    this.isFollowing = false;
8194    this.followScroll = this.followScroll.bind(this);
8195  }
8196
8197  Toolbar_createClass(Toolbar, [{
8198    key: "shouldInitialize",
8199    value: function shouldInitialize() {
8200      return !this.options.airMode;
8201    }
8202  }, {
8203    key: "initialize",
8204    value: function initialize() {
8205      var _this = this;
8206
8207      this.options.toolbar = this.options.toolbar || [];
8208
8209      if (!this.options.toolbar.length) {
8210        this.$toolbar.hide();
8211      } else {
8212        this.context.invoke('buttons.build', this.$toolbar, this.options.toolbar);
8213      }
8214
8215      if (this.options.toolbarContainer) {
8216        this.$toolbar.appendTo(this.options.toolbarContainer);
8217      }
8218
8219      this.changeContainer(false);
8220      this.$note.on('summernote.keyup summernote.mouseup summernote.change', function () {
8221        _this.context.invoke('buttons.updateCurrentStyle');
8222      });
8223      this.context.invoke('buttons.updateCurrentStyle');
8224
8225      if (this.options.followingToolbar) {
8226        this.$window.on('scroll resize', this.followScroll);
8227      }
8228    }
8229  }, {
8230    key: "destroy",
8231    value: function destroy() {
8232      this.$toolbar.children().remove();
8233
8234      if (this.options.followingToolbar) {
8235        this.$window.off('scroll resize', this.followScroll);
8236      }
8237    }
8238  }, {
8239    key: "followScroll",
8240    value: function followScroll() {
8241      if (this.$editor.hasClass('fullscreen')) {
8242        return false;
8243      }
8244
8245      var editorHeight = this.$editor.outerHeight();
8246      var editorWidth = this.$editor.width();
8247      var toolbarHeight = this.$toolbar.height();
8248      var statusbarHeight = this.$statusbar.height(); // check if the web app is currently using another static bar
8249
8250      var otherBarHeight = 0;
8251
8252      if (this.options.otherStaticBar) {
8253        otherBarHeight = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(this.options.otherStaticBar).outerHeight();
8254      }
8255
8256      var currentOffset = this.$document.scrollTop();
8257      var editorOffsetTop = this.$editor.offset().top;
8258      var editorOffsetBottom = editorOffsetTop + editorHeight;
8259      var activateOffset = editorOffsetTop - otherBarHeight;
8260      var deactivateOffsetBottom = editorOffsetBottom - otherBarHeight - toolbarHeight - statusbarHeight;
8261
8262      if (!this.isFollowing && currentOffset > activateOffset && currentOffset < deactivateOffsetBottom - toolbarHeight) {
8263        this.isFollowing = true;
8264        this.$editable.css({
8265          marginTop: this.$toolbar.outerHeight()
8266        });
8267        this.$toolbar.css({
8268          position: 'fixed',
8269          top: otherBarHeight,
8270          width: editorWidth,
8271          zIndex: 1000
8272        });
8273      } else if (this.isFollowing && (currentOffset < activateOffset || currentOffset > deactivateOffsetBottom)) {
8274        this.isFollowing = false;
8275        this.$toolbar.css({
8276          position: 'relative',
8277          top: 0,
8278          width: '100%',
8279          zIndex: 'auto'
8280        });
8281        this.$editable.css({
8282          marginTop: ''
8283        });
8284      }
8285    }
8286  }, {
8287    key: "changeContainer",
8288    value: function changeContainer(isFullscreen) {
8289      if (isFullscreen) {
8290        this.$toolbar.prependTo(this.$editor);
8291      } else {
8292        if (this.options.toolbarContainer) {
8293          this.$toolbar.appendTo(this.options.toolbarContainer);
8294        }
8295      }
8296
8297      if (this.options.followingToolbar) {
8298        this.followScroll();
8299      }
8300    }
8301  }, {
8302    key: "updateFullscreen",
8303    value: function updateFullscreen(isFullscreen) {
8304      this.ui.toggleBtnActive(this.$toolbar.find('.btn-fullscreen'), isFullscreen);
8305      this.changeContainer(isFullscreen);
8306    }
8307  }, {
8308    key: "updateCodeview",
8309    value: function updateCodeview(isCodeview) {
8310      this.ui.toggleBtnActive(this.$toolbar.find('.btn-codeview'), isCodeview);
8311
8312      if (isCodeview) {
8313        this.deactivate();
8314      } else {
8315        this.activate();
8316      }
8317    }
8318  }, {
8319    key: "activate",
8320    value: function activate(isIncludeCodeview) {
8321      var $btn = this.$toolbar.find('button');
8322
8323      if (!isIncludeCodeview) {
8324        $btn = $btn.not('.note-codeview-keep');
8325      }
8326
8327      this.ui.toggleBtn($btn, true);
8328    }
8329  }, {
8330    key: "deactivate",
8331    value: function deactivate(isIncludeCodeview) {
8332      var $btn = this.$toolbar.find('button');
8333
8334      if (!isIncludeCodeview) {
8335        $btn = $btn.not('.note-codeview-keep');
8336      }
8337
8338      this.ui.toggleBtn($btn, false);
8339    }
8340  }]);
8341
8342  return Toolbar;
8343}();
8344
8345
8346// CONCATENATED MODULE: ./src/js/base/module/LinkDialog.js
8347function LinkDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
8348
8349function LinkDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
8350
8351function LinkDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) LinkDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) LinkDialog_defineProperties(Constructor, staticProps); return Constructor; }
8352
8353
8354
8355
8356
8357
8358var LinkDialog_LinkDialog = /*#__PURE__*/function () {
8359  function LinkDialog(context) {
8360    LinkDialog_classCallCheck(this, LinkDialog);
8361
8362    this.context = context;
8363    this.ui = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.ui;
8364    this.$body = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(document.body);
8365    this.$editor = context.layoutInfo.editor;
8366    this.options = context.options;
8367    this.lang = this.options.langInfo;
8368    context.memo('help.linkDialog.show', this.options.langInfo.help['linkDialog.show']);
8369  }
8370
8371  LinkDialog_createClass(LinkDialog, [{
8372    key: "initialize",
8373    value: function initialize() {
8374      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
8375      var body = ['<div class="form-group note-form-group">', "<label for=\"note-dialog-link-txt-".concat(this.options.id, "\" class=\"note-form-label\">").concat(this.lang.link.textToDisplay, "</label>"), "<input id=\"note-dialog-link-txt-".concat(this.options.id, "\" class=\"note-link-text form-control note-form-control note-input\" type=\"text\"/>"), '</div>', '<div class="form-group note-form-group">', "<label for=\"note-dialog-link-url-".concat(this.options.id, "\" class=\"note-form-label\">").concat(this.lang.link.url, "</label>"), "<input id=\"note-dialog-link-url-".concat(this.options.id, "\" class=\"note-link-url form-control note-form-control note-input\" type=\"text\" value=\"http://\"/>"), '</div>', !this.options.disableLinkTarget ? external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<div/>').append(this.ui.checkbox({
8376        className: 'sn-checkbox-open-in-new-window',
8377        text: this.lang.link.openInNewWindow,
8378        checked: true
8379      }).render()).html() : '', external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<div/>').append(this.ui.checkbox({
8380        className: 'sn-checkbox-use-protocol',
8381        text: this.lang.link.useProtocol,
8382        checked: true
8383      }).render()).html()].join('');
8384      var buttonClass = 'btn btn-primary note-btn note-btn-primary note-link-btn';
8385      var footer = "<input type=\"button\" href=\"#\" class=\"".concat(buttonClass, "\" value=\"").concat(this.lang.link.insert, "\" disabled>");
8386      this.$dialog = this.ui.dialog({
8387        className: 'link-dialog',
8388        title: this.lang.link.insert,
8389        fade: this.options.dialogsFade,
8390        body: body,
8391        footer: footer
8392      }).render().appendTo($container);
8393    }
8394  }, {
8395    key: "destroy",
8396    value: function destroy() {
8397      this.ui.hideDialog(this.$dialog);
8398      this.$dialog.remove();
8399    }
8400  }, {
8401    key: "bindEnterKey",
8402    value: function bindEnterKey($input, $btn) {
8403      $input.on('keypress', function (event) {
8404        if (event.keyCode === core_key.code.ENTER) {
8405          event.preventDefault();
8406          $btn.trigger('click');
8407        }
8408      });
8409    }
8410    /**
8411     * toggle update button
8412     */
8413
8414  }, {
8415    key: "toggleLinkBtn",
8416    value: function toggleLinkBtn($linkBtn, $linkText, $linkUrl) {
8417      this.ui.toggleBtn($linkBtn, $linkText.val() && $linkUrl.val());
8418    }
8419    /**
8420     * Show link dialog and set event handlers on dialog controls.
8421     *
8422     * @param {Object} linkInfo
8423     * @return {Promise}
8424     */
8425
8426  }, {
8427    key: "showLinkDialog",
8428    value: function showLinkDialog(linkInfo) {
8429      var _this = this;
8430
8431      return external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.Deferred(function (deferred) {
8432        var $linkText = _this.$dialog.find('.note-link-text');
8433
8434        var $linkUrl = _this.$dialog.find('.note-link-url');
8435
8436        var $linkBtn = _this.$dialog.find('.note-link-btn');
8437
8438        var $openInNewWindow = _this.$dialog.find('.sn-checkbox-open-in-new-window input[type=checkbox]');
8439
8440        var $useProtocol = _this.$dialog.find('.sn-checkbox-use-protocol input[type=checkbox]');
8441
8442        _this.ui.onDialogShown(_this.$dialog, function () {
8443          _this.context.triggerEvent('dialog.shown'); // If no url was given and given text is valid URL then copy that into URL Field
8444
8445
8446          if (!linkInfo.url && func.isValidUrl(linkInfo.text)) {
8447            linkInfo.url = linkInfo.text;
8448          }
8449
8450          $linkText.on('input paste propertychange', function () {
8451            // If linktext was modified by input events,
8452            // cloning text from linkUrl will be stopped.
8453            linkInfo.text = $linkText.val();
8454
8455            _this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);
8456          }).val(linkInfo.text);
8457          $linkUrl.on('input paste propertychange', function () {
8458            // Display same text on `Text to display` as default
8459            // when linktext has no text
8460            if (!linkInfo.text) {
8461              $linkText.val($linkUrl.val());
8462            }
8463
8464            _this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);
8465          }).val(linkInfo.url);
8466
8467          if (!env.isSupportTouch) {
8468            $linkUrl.trigger('focus');
8469          }
8470
8471          _this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);
8472
8473          _this.bindEnterKey($linkUrl, $linkBtn);
8474
8475          _this.bindEnterKey($linkText, $linkBtn);
8476
8477          var isNewWindowChecked = linkInfo.isNewWindow !== undefined ? linkInfo.isNewWindow : _this.context.options.linkTargetBlank;
8478          $openInNewWindow.prop('checked', isNewWindowChecked);
8479          var useProtocolChecked = linkInfo.url ? false : _this.context.options.useProtocol;
8480          $useProtocol.prop('checked', useProtocolChecked);
8481          $linkBtn.one('click', function (event) {
8482            event.preventDefault();
8483            deferred.resolve({
8484              range: linkInfo.range,
8485              url: $linkUrl.val(),
8486              text: $linkText.val(),
8487              isNewWindow: $openInNewWindow.is(':checked'),
8488              checkProtocol: $useProtocol.is(':checked')
8489            });
8490
8491            _this.ui.hideDialog(_this.$dialog);
8492          });
8493        });
8494
8495        _this.ui.onDialogHidden(_this.$dialog, function () {
8496          // detach events
8497          $linkText.off();
8498          $linkUrl.off();
8499          $linkBtn.off();
8500
8501          if (deferred.state() === 'pending') {
8502            deferred.reject();
8503          }
8504        });
8505
8506        _this.ui.showDialog(_this.$dialog);
8507      }).promise();
8508    }
8509    /**
8510     * @param {Object} layoutInfo
8511     */
8512
8513  }, {
8514    key: "show",
8515    value: function show() {
8516      var _this2 = this;
8517
8518      var linkInfo = this.context.invoke('editor.getLinkInfo');
8519      this.context.invoke('editor.saveRange');
8520      this.showLinkDialog(linkInfo).then(function (linkInfo) {
8521        _this2.context.invoke('editor.restoreRange');
8522
8523        _this2.context.invoke('editor.createLink', linkInfo);
8524      }).fail(function () {
8525        _this2.context.invoke('editor.restoreRange');
8526      });
8527    }
8528  }]);
8529
8530  return LinkDialog;
8531}();
8532
8533
8534// CONCATENATED MODULE: ./src/js/base/module/LinkPopover.js
8535function LinkPopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
8536
8537function LinkPopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
8538
8539function LinkPopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) LinkPopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) LinkPopover_defineProperties(Constructor, staticProps); return Constructor; }
8540
8541
8542
8543
8544
8545var LinkPopover_LinkPopover = /*#__PURE__*/function () {
8546  function LinkPopover(context) {
8547    var _this = this;
8548
8549    LinkPopover_classCallCheck(this, LinkPopover);
8550
8551    this.context = context;
8552    this.ui = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.ui;
8553    this.options = context.options;
8554    this.events = {
8555      'summernote.keyup summernote.mouseup summernote.change summernote.scroll': function summernoteKeyupSummernoteMouseupSummernoteChangeSummernoteScroll() {
8556        _this.update();
8557      },
8558      'summernote.disable summernote.dialog.shown summernote.blur': function summernoteDisableSummernoteDialogShownSummernoteBlur() {
8559        _this.hide();
8560      }
8561    };
8562  }
8563
8564  LinkPopover_createClass(LinkPopover, [{
8565    key: "shouldInitialize",
8566    value: function shouldInitialize() {
8567      return !lists.isEmpty(this.options.popover.link);
8568    }
8569  }, {
8570    key: "initialize",
8571    value: function initialize() {
8572      this.$popover = this.ui.popover({
8573        className: 'note-link-popover',
8574        callback: function callback($node) {
8575          var $content = $node.find('.popover-content,.note-popover-content');
8576          $content.prepend('<span><a target="_blank"></a>&nbsp;</span>');
8577        }
8578      }).render().appendTo(this.options.container);
8579      var $content = this.$popover.find('.popover-content,.note-popover-content');
8580      this.context.invoke('buttons.build', $content, this.options.popover.link);
8581      this.$popover.on('mousedown', function (e) {
8582        e.preventDefault();
8583      });
8584    }
8585  }, {
8586    key: "destroy",
8587    value: function destroy() {
8588      this.$popover.remove();
8589    }
8590  }, {
8591    key: "update",
8592    value: function update() {
8593      // Prevent focusing on editable when invoke('code') is executed
8594      if (!this.context.invoke('editor.hasFocus')) {
8595        this.hide();
8596        return;
8597      }
8598
8599      var rng = this.context.invoke('editor.getLastRange');
8600
8601      if (rng.isCollapsed() && rng.isOnAnchor()) {
8602        var anchor = dom.ancestor(rng.sc, dom.isAnchor);
8603        var href = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(anchor).attr('href');
8604        this.$popover.find('a').attr('href', href).text(href);
8605        var pos = dom.posFromPlaceholder(anchor);
8606        var containerOffset = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(this.options.container).offset();
8607        pos.top -= containerOffset.top;
8608        pos.left -= containerOffset.left;
8609        this.$popover.css({
8610          display: 'block',
8611          left: pos.left,
8612          top: pos.top
8613        });
8614      } else {
8615        this.hide();
8616      }
8617    }
8618  }, {
8619    key: "hide",
8620    value: function hide() {
8621      this.$popover.hide();
8622    }
8623  }]);
8624
8625  return LinkPopover;
8626}();
8627
8628
8629// CONCATENATED MODULE: ./src/js/base/module/ImageDialog.js
8630function ImageDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
8631
8632function ImageDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
8633
8634function ImageDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageDialog_defineProperties(Constructor, staticProps); return Constructor; }
8635
8636
8637
8638
8639
8640var ImageDialog_ImageDialog = /*#__PURE__*/function () {
8641  function ImageDialog(context) {
8642    ImageDialog_classCallCheck(this, ImageDialog);
8643
8644    this.context = context;
8645    this.ui = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.ui;
8646    this.$body = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(document.body);
8647    this.$editor = context.layoutInfo.editor;
8648    this.options = context.options;
8649    this.lang = this.options.langInfo;
8650  }
8651
8652  ImageDialog_createClass(ImageDialog, [{
8653    key: "initialize",
8654    value: function initialize() {
8655      var imageLimitation = '';
8656
8657      if (this.options.maximumImageFileSize) {
8658        var unit = Math.floor(Math.log(this.options.maximumImageFileSize) / Math.log(1024));
8659        var readableSize = (this.options.maximumImageFileSize / Math.pow(1024, unit)).toFixed(2) * 1 + ' ' + ' KMGTP'[unit] + 'B';
8660        imageLimitation = "<small>".concat(this.lang.image.maximumFileSize + ' : ' + readableSize, "</small>");
8661      }
8662
8663      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
8664      var body = ['<div class="form-group note-form-group note-group-select-from-files">', '<label for="note-dialog-image-file-' + this.options.id + '" class="note-form-label">' + this.lang.image.selectFromFiles + '</label>', '<input id="note-dialog-image-file-' + this.options.id + '" class="note-image-input form-control-file note-form-control note-input" ', ' type="file" name="files" accept="image/*" multiple="multiple"/>', imageLimitation, '</div>', '<div class="form-group note-group-image-url">', '<label for="note-dialog-image-url-' + this.options.id + '" class="note-form-label">' + this.lang.image.url + '</label>', '<input id="note-dialog-image-url-' + this.options.id + '" class="note-image-url form-control note-form-control note-input" type="text"/>', '</div>'].join('');
8665      var buttonClass = 'btn btn-primary note-btn note-btn-primary note-image-btn';
8666      var footer = "<input type=\"button\" href=\"#\" class=\"".concat(buttonClass, "\" value=\"").concat(this.lang.image.insert, "\" disabled>");
8667      this.$dialog = this.ui.dialog({
8668        title: this.lang.image.insert,
8669        fade: this.options.dialogsFade,
8670        body: body,
8671        footer: footer
8672      }).render().appendTo($container);
8673    }
8674  }, {
8675    key: "destroy",
8676    value: function destroy() {
8677      this.ui.hideDialog(this.$dialog);
8678      this.$dialog.remove();
8679    }
8680  }, {
8681    key: "bindEnterKey",
8682    value: function bindEnterKey($input, $btn) {
8683      $input.on('keypress', function (event) {
8684        if (event.keyCode === core_key.code.ENTER) {
8685          event.preventDefault();
8686          $btn.trigger('click');
8687        }
8688      });
8689    }
8690  }, {
8691    key: "show",
8692    value: function show() {
8693      var _this = this;
8694
8695      this.context.invoke('editor.saveRange');
8696      this.showImageDialog().then(function (data) {
8697        // [workaround] hide dialog before restore range for IE range focus
8698        _this.ui.hideDialog(_this.$dialog);
8699
8700        _this.context.invoke('editor.restoreRange');
8701
8702        if (typeof data === 'string') {
8703          // image url
8704          // If onImageLinkInsert set,
8705          if (_this.options.callbacks.onImageLinkInsert) {
8706            _this.context.triggerEvent('image.link.insert', data);
8707          } else {
8708            _this.context.invoke('editor.insertImage', data);
8709          }
8710        } else {
8711          // array of files
8712          _this.context.invoke('editor.insertImagesOrCallback', data);
8713        }
8714      }).fail(function () {
8715        _this.context.invoke('editor.restoreRange');
8716      });
8717    }
8718    /**
8719     * show image dialog
8720     *
8721     * @param {jQuery} $dialog
8722     * @return {Promise}
8723     */
8724
8725  }, {
8726    key: "showImageDialog",
8727    value: function showImageDialog() {
8728      var _this2 = this;
8729
8730      return external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.Deferred(function (deferred) {
8731        var $imageInput = _this2.$dialog.find('.note-image-input');
8732
8733        var $imageUrl = _this2.$dialog.find('.note-image-url');
8734
8735        var $imageBtn = _this2.$dialog.find('.note-image-btn');
8736
8737        _this2.ui.onDialogShown(_this2.$dialog, function () {
8738          _this2.context.triggerEvent('dialog.shown'); // Cloning imageInput to clear element.
8739
8740
8741          $imageInput.replaceWith($imageInput.clone().on('change', function (event) {
8742            deferred.resolve(event.target.files || event.target.value);
8743          }).val(''));
8744          $imageUrl.on('input paste propertychange', function () {
8745            _this2.ui.toggleBtn($imageBtn, $imageUrl.val());
8746          }).val('');
8747
8748          if (!env.isSupportTouch) {
8749            $imageUrl.trigger('focus');
8750          }
8751
8752          $imageBtn.click(function (event) {
8753            event.preventDefault();
8754            deferred.resolve($imageUrl.val());
8755          });
8756
8757          _this2.bindEnterKey($imageUrl, $imageBtn);
8758        });
8759
8760        _this2.ui.onDialogHidden(_this2.$dialog, function () {
8761          $imageInput.off();
8762          $imageUrl.off();
8763          $imageBtn.off();
8764
8765          if (deferred.state() === 'pending') {
8766            deferred.reject();
8767          }
8768        });
8769
8770        _this2.ui.showDialog(_this2.$dialog);
8771      });
8772    }
8773  }]);
8774
8775  return ImageDialog;
8776}();
8777
8778
8779// CONCATENATED MODULE: ./src/js/base/module/ImagePopover.js
8780function ImagePopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
8781
8782function ImagePopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
8783
8784function ImagePopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImagePopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImagePopover_defineProperties(Constructor, staticProps); return Constructor; }
8785
8786
8787
8788
8789/**
8790 * Image popover module
8791 *  mouse events that show/hide popover will be handled by Handle.js.
8792 *  Handle.js will receive the events and invoke 'imagePopover.update'.
8793 */
8794
8795var ImagePopover_ImagePopover = /*#__PURE__*/function () {
8796  function ImagePopover(context) {
8797    var _this = this;
8798
8799    ImagePopover_classCallCheck(this, ImagePopover);
8800
8801    this.context = context;
8802    this.ui = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.ui;
8803    this.editable = context.layoutInfo.editable[0];
8804    this.options = context.options;
8805    this.events = {
8806      'summernote.disable summernote.blur': function summernoteDisableSummernoteBlur() {
8807        _this.hide();
8808      }
8809    };
8810  }
8811
8812  ImagePopover_createClass(ImagePopover, [{
8813    key: "shouldInitialize",
8814    value: function shouldInitialize() {
8815      return !lists.isEmpty(this.options.popover.image);
8816    }
8817  }, {
8818    key: "initialize",
8819    value: function initialize() {
8820      this.$popover = this.ui.popover({
8821        className: 'note-image-popover'
8822      }).render().appendTo(this.options.container);
8823      var $content = this.$popover.find('.popover-content,.note-popover-content');
8824      this.context.invoke('buttons.build', $content, this.options.popover.image);
8825      this.$popover.on('mousedown', function (e) {
8826        e.preventDefault();
8827      });
8828    }
8829  }, {
8830    key: "destroy",
8831    value: function destroy() {
8832      this.$popover.remove();
8833    }
8834  }, {
8835    key: "update",
8836    value: function update(target, event) {
8837      if (dom.isImg(target)) {
8838        var position = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(target).offset();
8839        var containerOffset = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(this.options.container).offset();
8840        var pos = {};
8841
8842        if (this.options.popatmouse) {
8843          pos.left = event.pageX - 20;
8844          pos.top = event.pageY;
8845        } else {
8846          pos = position;
8847        }
8848
8849        pos.top -= containerOffset.top;
8850        pos.left -= containerOffset.left;
8851        this.$popover.css({
8852          display: 'block',
8853          left: pos.left,
8854          top: pos.top
8855        });
8856      } else {
8857        this.hide();
8858      }
8859    }
8860  }, {
8861    key: "hide",
8862    value: function hide() {
8863      this.$popover.hide();
8864    }
8865  }]);
8866
8867  return ImagePopover;
8868}();
8869
8870
8871// CONCATENATED MODULE: ./src/js/base/module/TablePopover.js
8872function TablePopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
8873
8874function TablePopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
8875
8876function TablePopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) TablePopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) TablePopover_defineProperties(Constructor, staticProps); return Constructor; }
8877
8878
8879
8880
8881
8882
8883var TablePopover_TablePopover = /*#__PURE__*/function () {
8884  function TablePopover(context) {
8885    var _this = this;
8886
8887    TablePopover_classCallCheck(this, TablePopover);
8888
8889    this.context = context;
8890    this.ui = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.ui;
8891    this.options = context.options;
8892    this.events = {
8893      'summernote.mousedown': function summernoteMousedown(we, e) {
8894        _this.update(e.target);
8895      },
8896      'summernote.keyup summernote.scroll summernote.change': function summernoteKeyupSummernoteScrollSummernoteChange() {
8897        _this.update();
8898      },
8899      'summernote.disable summernote.blur': function summernoteDisableSummernoteBlur() {
8900        _this.hide();
8901      }
8902    };
8903  }
8904
8905  TablePopover_createClass(TablePopover, [{
8906    key: "shouldInitialize",
8907    value: function shouldInitialize() {
8908      return !lists.isEmpty(this.options.popover.table);
8909    }
8910  }, {
8911    key: "initialize",
8912    value: function initialize() {
8913      this.$popover = this.ui.popover({
8914        className: 'note-table-popover'
8915      }).render().appendTo(this.options.container);
8916      var $content = this.$popover.find('.popover-content,.note-popover-content');
8917      this.context.invoke('buttons.build', $content, this.options.popover.table); // [workaround] Disable Firefox's default table editor
8918
8919      if (env.isFF) {
8920        document.execCommand('enableInlineTableEditing', false, false);
8921      }
8922
8923      this.$popover.on('mousedown', function (e) {
8924        e.preventDefault();
8925      });
8926    }
8927  }, {
8928    key: "destroy",
8929    value: function destroy() {
8930      this.$popover.remove();
8931    }
8932  }, {
8933    key: "update",
8934    value: function update(target) {
8935      if (this.context.isDisabled()) {
8936        return false;
8937      }
8938
8939      var isCell = dom.isCell(target);
8940
8941      if (isCell) {
8942        var pos = dom.posFromPlaceholder(target);
8943        var containerOffset = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(this.options.container).offset();
8944        pos.top -= containerOffset.top;
8945        pos.left -= containerOffset.left;
8946        this.$popover.css({
8947          display: 'block',
8948          left: pos.left,
8949          top: pos.top
8950        });
8951      } else {
8952        this.hide();
8953      }
8954
8955      return isCell;
8956    }
8957  }, {
8958    key: "hide",
8959    value: function hide() {
8960      this.$popover.hide();
8961    }
8962  }]);
8963
8964  return TablePopover;
8965}();
8966
8967
8968// CONCATENATED MODULE: ./src/js/base/module/VideoDialog.js
8969function VideoDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
8970
8971function VideoDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
8972
8973function VideoDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) VideoDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) VideoDialog_defineProperties(Constructor, staticProps); return Constructor; }
8974
8975
8976
8977
8978
8979var VideoDialog_VideoDialog = /*#__PURE__*/function () {
8980  function VideoDialog(context) {
8981    VideoDialog_classCallCheck(this, VideoDialog);
8982
8983    this.context = context;
8984    this.ui = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.ui;
8985    this.$body = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(document.body);
8986    this.$editor = context.layoutInfo.editor;
8987    this.options = context.options;
8988    this.lang = this.options.langInfo;
8989  }
8990
8991  VideoDialog_createClass(VideoDialog, [{
8992    key: "initialize",
8993    value: function initialize() {
8994      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
8995      var body = ['<div class="form-group note-form-group row-fluid">', "<label for=\"note-dialog-video-url-".concat(this.options.id, "\" class=\"note-form-label\">").concat(this.lang.video.url, " <small class=\"text-muted\">").concat(this.lang.video.providers, "</small></label>"), "<input id=\"note-dialog-video-url-".concat(this.options.id, "\" class=\"note-video-url form-control note-form-control note-input\" type=\"text\"/>"), '</div>'].join('');
8996      var buttonClass = 'btn btn-primary note-btn note-btn-primary note-video-btn';
8997      var footer = "<input type=\"button\" href=\"#\" class=\"".concat(buttonClass, "\" value=\"").concat(this.lang.video.insert, "\" disabled>");
8998      this.$dialog = this.ui.dialog({
8999        title: this.lang.video.insert,
9000        fade: this.options.dialogsFade,
9001        body: body,
9002        footer: footer
9003      }).render().appendTo($container);
9004    }
9005  }, {
9006    key: "destroy",
9007    value: function destroy() {
9008      this.ui.hideDialog(this.$dialog);
9009      this.$dialog.remove();
9010    }
9011  }, {
9012    key: "bindEnterKey",
9013    value: function bindEnterKey($input, $btn) {
9014      $input.on('keypress', function (event) {
9015        if (event.keyCode === core_key.code.ENTER) {
9016          event.preventDefault();
9017          $btn.trigger('click');
9018        }
9019      });
9020    }
9021  }, {
9022    key: "createVideoNode",
9023    value: function createVideoNode(url) {
9024      // video url patterns(youtube, instagram, vimeo, dailymotion, youku, mp4, ogg, webm)
9025      var ytRegExp = /\/\/(?:(?:www|m)\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))([\w|-]{11})(?:(?:[\?&]t=)(\S+))?$/;
9026      var ytRegExpForStart = /^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/;
9027      var ytMatch = url.match(ytRegExp);
9028      var igRegExp = /(?:www\.|\/\/)instagram\.com\/p\/(.[a-zA-Z0-9_-]*)/;
9029      var igMatch = url.match(igRegExp);
9030      var vRegExp = /\/\/vine\.co\/v\/([a-zA-Z0-9]+)/;
9031      var vMatch = url.match(vRegExp);
9032      var vimRegExp = /\/\/(player\.)?vimeo\.com\/([a-z]*\/)*(\d+)[?]?.*/;
9033      var vimMatch = url.match(vimRegExp);
9034      var dmRegExp = /.+dailymotion.com\/(video|hub)\/([^_]+)[^#]*(#video=([^_&]+))?/;
9035      var dmMatch = url.match(dmRegExp);
9036      var youkuRegExp = /\/\/v\.youku\.com\/v_show\/id_(\w+)=*\.html/;
9037      var youkuMatch = url.match(youkuRegExp);
9038      var qqRegExp = /\/\/v\.qq\.com.*?vid=(.+)/;
9039      var qqMatch = url.match(qqRegExp);
9040      var qqRegExp2 = /\/\/v\.qq\.com\/x?\/?(page|cover).*?\/([^\/]+)\.html\??.*/;
9041      var qqMatch2 = url.match(qqRegExp2);
9042      var mp4RegExp = /^.+.(mp4|m4v)$/;
9043      var mp4Match = url.match(mp4RegExp);
9044      var oggRegExp = /^.+.(ogg|ogv)$/;
9045      var oggMatch = url.match(oggRegExp);
9046      var webmRegExp = /^.+.(webm)$/;
9047      var webmMatch = url.match(webmRegExp);
9048      var fbRegExp = /(?:www\.|\/\/)facebook\.com\/([^\/]+)\/videos\/([0-9]+)/;
9049      var fbMatch = url.match(fbRegExp);
9050      var $video;
9051
9052      if (ytMatch && ytMatch[1].length === 11) {
9053        var youtubeId = ytMatch[1];
9054        var start = 0;
9055
9056        if (typeof ytMatch[2] !== 'undefined') {
9057          var ytMatchForStart = ytMatch[2].match(ytRegExpForStart);
9058
9059          if (ytMatchForStart) {
9060            for (var n = [3600, 60, 1], i = 0, r = n.length; i < r; i++) {
9061              start += typeof ytMatchForStart[i + 1] !== 'undefined' ? n[i] * parseInt(ytMatchForStart[i + 1], 10) : 0;
9062            }
9063          }
9064        }
9065
9066        $video = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<iframe>').attr('frameborder', 0).attr('src', '//www.youtube.com/embed/' + youtubeId + (start > 0 ? '?start=' + start : '')).attr('width', '640').attr('height', '360');
9067      } else if (igMatch && igMatch[0].length) {
9068        $video = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<iframe>').attr('frameborder', 0).attr('src', 'https://instagram.com/p/' + igMatch[1] + '/embed/').attr('width', '612').attr('height', '710').attr('scrolling', 'no').attr('allowtransparency', 'true');
9069      } else if (vMatch && vMatch[0].length) {
9070        $video = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<iframe>').attr('frameborder', 0).attr('src', vMatch[0] + '/embed/simple').attr('width', '600').attr('height', '600').attr('class', 'vine-embed');
9071      } else if (vimMatch && vimMatch[3].length) {
9072        $video = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>').attr('frameborder', 0).attr('src', '//player.vimeo.com/video/' + vimMatch[3]).attr('width', '640').attr('height', '360');
9073      } else if (dmMatch && dmMatch[2].length) {
9074        $video = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<iframe>').attr('frameborder', 0).attr('src', '//www.dailymotion.com/embed/video/' + dmMatch[2]).attr('width', '640').attr('height', '360');
9075      } else if (youkuMatch && youkuMatch[1].length) {
9076        $video = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>').attr('frameborder', 0).attr('height', '498').attr('width', '510').attr('src', '//player.youku.com/embed/' + youkuMatch[1]);
9077      } else if (qqMatch && qqMatch[1].length || qqMatch2 && qqMatch2[2].length) {
9078        var vid = qqMatch && qqMatch[1].length ? qqMatch[1] : qqMatch2[2];
9079        $video = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>').attr('frameborder', 0).attr('height', '310').attr('width', '500').attr('src', 'https://v.qq.com/txp/iframe/player.html?vid=' + vid + '&amp;auto=0');
9080      } else if (mp4Match || oggMatch || webmMatch) {
9081        $video = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<video controls>').attr('src', url).attr('width', '640').attr('height', '360');
9082      } else if (fbMatch && fbMatch[0].length) {
9083        $video = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<iframe>').attr('frameborder', 0).attr('src', 'https://www.facebook.com/plugins/video.php?href=' + encodeURIComponent(fbMatch[0]) + '&show_text=0&width=560').attr('width', '560').attr('height', '301').attr('scrolling', 'no').attr('allowtransparency', 'true');
9084      } else {
9085        // this is not a known video link. Now what, Cat? Now what?
9086        return false;
9087      }
9088
9089      $video.addClass('note-video-clip');
9090      return $video[0];
9091    }
9092  }, {
9093    key: "show",
9094    value: function show() {
9095      var _this = this;
9096
9097      var text = this.context.invoke('editor.getSelectedText');
9098      this.context.invoke('editor.saveRange');
9099      this.showVideoDialog(text).then(function (url) {
9100        // [workaround] hide dialog before restore range for IE range focus
9101        _this.ui.hideDialog(_this.$dialog);
9102
9103        _this.context.invoke('editor.restoreRange'); // build node
9104
9105
9106        var $node = _this.createVideoNode(url);
9107
9108        if ($node) {
9109          // insert video node
9110          _this.context.invoke('editor.insertNode', $node);
9111        }
9112      }).fail(function () {
9113        _this.context.invoke('editor.restoreRange');
9114      });
9115    }
9116    /**
9117     * show video dialog
9118     *
9119     * @param {jQuery} $dialog
9120     * @return {Promise}
9121     */
9122
9123  }, {
9124    key: "showVideoDialog",
9125    value: function showVideoDialog()
9126    /* text */
9127    {
9128      var _this2 = this;
9129
9130      return external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.Deferred(function (deferred) {
9131        var $videoUrl = _this2.$dialog.find('.note-video-url');
9132
9133        var $videoBtn = _this2.$dialog.find('.note-video-btn');
9134
9135        _this2.ui.onDialogShown(_this2.$dialog, function () {
9136          _this2.context.triggerEvent('dialog.shown');
9137
9138          $videoUrl.on('input paste propertychange', function () {
9139            _this2.ui.toggleBtn($videoBtn, $videoUrl.val());
9140          });
9141
9142          if (!env.isSupportTouch) {
9143            $videoUrl.trigger('focus');
9144          }
9145
9146          $videoBtn.click(function (event) {
9147            event.preventDefault();
9148            deferred.resolve($videoUrl.val());
9149          });
9150
9151          _this2.bindEnterKey($videoUrl, $videoBtn);
9152        });
9153
9154        _this2.ui.onDialogHidden(_this2.$dialog, function () {
9155          $videoUrl.off();
9156          $videoBtn.off();
9157
9158          if (deferred.state() === 'pending') {
9159            deferred.reject();
9160          }
9161        });
9162
9163        _this2.ui.showDialog(_this2.$dialog);
9164      });
9165    }
9166  }]);
9167
9168  return VideoDialog;
9169}();
9170
9171
9172// CONCATENATED MODULE: ./src/js/base/module/HelpDialog.js
9173function HelpDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
9174
9175function HelpDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
9176
9177function HelpDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) HelpDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) HelpDialog_defineProperties(Constructor, staticProps); return Constructor; }
9178
9179
9180
9181
9182var HelpDialog_HelpDialog = /*#__PURE__*/function () {
9183  function HelpDialog(context) {
9184    HelpDialog_classCallCheck(this, HelpDialog);
9185
9186    this.context = context;
9187    this.ui = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.ui;
9188    this.$body = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(document.body);
9189    this.$editor = context.layoutInfo.editor;
9190    this.options = context.options;
9191    this.lang = this.options.langInfo;
9192  }
9193
9194  HelpDialog_createClass(HelpDialog, [{
9195    key: "initialize",
9196    value: function initialize() {
9197      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
9198      var body = ['<p class="text-center">', '<a href="http://summernote.org/" target="_blank">Summernote 0.8.18</a> · ', '<a href="https://github.com/summernote/summernote" target="_blank">Project</a> · ', '<a href="https://github.com/summernote/summernote/issues" target="_blank">Issues</a>', '</p>'].join('');
9199      this.$dialog = this.ui.dialog({
9200        title: this.lang.options.help,
9201        fade: this.options.dialogsFade,
9202        body: this.createShortcutList(),
9203        footer: body,
9204        callback: function callback($node) {
vendor: 1,839 bytes, lines 9205-9261
9205          $node.find('.modal-body,.note-modal-body').css({
9206            'max-height': 300,
9207            'overflow': 'scroll'
9208          });
9209        }
9210      }).render().appendTo($container);
9211    }
9212  }, {
9213    key: "destroy",
9214    value: function destroy() {
9215      this.ui.hideDialog(this.$dialog);
9216      this.$dialog.remove();
9217    }
9218  }, {
9219    key: "createShortcutList",
9220    value: function createShortcutList() {
9221      var _this = this;
9222
9223      var keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];
9224      return Object.keys(keyMap).map(function (key) {
9225        var command = keyMap[key];
9226        var $row = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<div><div class="help-list-item"></div></div>');
9227        $row.append(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<label><kbd>' + key + '</kdb></label>').css({
9228          'width': 180,
9229          'margin-right': 10
9230        })).append(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<span/>').html(_this.context.memo('help.' + command) || command));
9231        return $row.html();
9232      }).join('');
9233    }
9234    /**
9235     * show help dialog
9236     *
9237     * @return {Promise}
9238     */
9239
9240  }, {
9241    key: "showHelpDialog",
9242    value: function showHelpDialog() {
9243      var _this2 = this;
9244
9245      return external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.Deferred(function (deferred) {
9246        _this2.ui.onDialogShown(_this2.$dialog, function () {
9247          _this2.context.triggerEvent('dialog.shown');
9248
9249          deferred.resolve();
9250        });
9251
9252        _this2.ui.showDialog(_this2.$dialog);
9253      }).promise();
9254    }
9255  }, {
9256    key: "show",
9257    value: function show() {
9258      var _this3 = this;
9259
9260      this.context.invoke('editor.saveRange');
9261      this.showHelpDialog().then(function () {
vendor: 18,414 bytes, lines 9262-9830
9262        _this3.context.invoke('editor.restoreRange');
9263      });
9264    }
9265  }]);
9266
9267  return HelpDialog;
9268}();
9269
9270
9271// CONCATENATED MODULE: ./src/js/base/module/AirPopover.js
9272function AirPopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
9273
9274function AirPopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
9275
9276function AirPopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) AirPopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) AirPopover_defineProperties(Constructor, staticProps); return Constructor; }
9277
9278
9279
9280var AIRMODE_POPOVER_X_OFFSET = -5;
9281var AIRMODE_POPOVER_Y_OFFSET = 5;
9282
9283var AirPopover_AirPopover = /*#__PURE__*/function () {
9284  function AirPopover(context) {
9285    var _this = this;
9286
9287    AirPopover_classCallCheck(this, AirPopover);
9288
9289    this.context = context;
9290    this.ui = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.ui;
9291    this.options = context.options;
9292    this.hidable = true;
9293    this.onContextmenu = false;
9294    this.pageX = null;
9295    this.pageY = null;
9296    this.events = {
9297      'summernote.contextmenu': function summernoteContextmenu(e) {
9298        if (_this.options.editing) {
9299          e.preventDefault();
9300          e.stopPropagation();
9301          _this.onContextmenu = true;
9302
9303          _this.update(true);
9304        }
9305      },
9306      'summernote.mousedown': function summernoteMousedown(we, e) {
9307        _this.pageX = e.pageX;
9308        _this.pageY = e.pageY;
9309      },
9310      'summernote.keyup summernote.mouseup summernote.scroll': function summernoteKeyupSummernoteMouseupSummernoteScroll(we, e) {
9311        if (_this.options.editing && !_this.onContextmenu) {
9312          _this.pageX = e.pageX;
9313          _this.pageY = e.pageY;
9314
9315          _this.update();
9316        }
9317
9318        _this.onContextmenu = false;
9319      },
9320      'summernote.disable summernote.change summernote.dialog.shown summernote.blur': function summernoteDisableSummernoteChangeSummernoteDialogShownSummernoteBlur() {
9321        _this.hide();
9322      },
9323      'summernote.focusout': function summernoteFocusout() {
9324        if (!_this.$popover.is(':active,:focus')) {
9325          _this.hide();
9326        }
9327      }
9328    };
9329  }
9330
9331  AirPopover_createClass(AirPopover, [{
9332    key: "shouldInitialize",
9333    value: function shouldInitialize() {
9334      return this.options.airMode && !lists.isEmpty(this.options.popover.air);
9335    }
9336  }, {
9337    key: "initialize",
9338    value: function initialize() {
9339      var _this2 = this;
9340
9341      this.$popover = this.ui.popover({
9342        className: 'note-air-popover'
9343      }).render().appendTo(this.options.container);
9344      var $content = this.$popover.find('.popover-content');
9345      this.context.invoke('buttons.build', $content, this.options.popover.air); // disable hiding this popover preemptively by 'summernote.blur' event.
9346
9347      this.$popover.on('mousedown', function () {
9348        _this2.hidable = false;
9349      }); // (re-)enable hiding after 'summernote.blur' has been handled (aka. ignored).
9350
9351      this.$popover.on('mouseup', function () {
9352        _this2.hidable = true;
9353      });
9354    }
9355  }, {
9356    key: "destroy",
9357    value: function destroy() {
9358      this.$popover.remove();
9359    }
9360  }, {
9361    key: "update",
9362    value: function update(forcelyOpen) {
9363      var styleInfo = this.context.invoke('editor.currentStyle');
9364
9365      if (styleInfo.range && (!styleInfo.range.isCollapsed() || forcelyOpen)) {
9366        var rect = {
9367          left: this.pageX,
9368          top: this.pageY
9369        };
9370        var containerOffset = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(this.options.container).offset();
9371        rect.top -= containerOffset.top;
9372        rect.left -= containerOffset.left;
9373        this.$popover.css({
9374          display: 'block',
9375          left: Math.max(rect.left, 0) + AIRMODE_POPOVER_X_OFFSET,
9376          top: rect.top + AIRMODE_POPOVER_Y_OFFSET
9377        });
9378        this.context.invoke('buttons.updateCurrentStyle', this.$popover);
9379      } else {
9380        this.hide();
9381      }
9382    }
9383  }, {
9384    key: "updateCodeview",
9385    value: function updateCodeview(isCodeview) {
9386      this.ui.toggleBtnActive(this.$popover.find('.btn-codeview'), isCodeview);
9387
9388      if (isCodeview) {
9389        this.hide();
9390      }
9391    }
9392  }, {
9393    key: "hide",
9394    value: function hide() {
9395      if (this.hidable) {
9396        this.$popover.hide();
9397      }
9398    }
9399  }]);
9400
9401  return AirPopover;
9402}();
9403
9404
9405// CONCATENATED MODULE: ./src/js/base/module/HintPopover.js
9406function HintPopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
9407
9408function HintPopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
9409
9410function HintPopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) HintPopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) HintPopover_defineProperties(Constructor, staticProps); return Constructor; }
9411
9412
9413
9414
9415
9416
9417
9418var POPOVER_DIST = 5;
9419
9420var HintPopover_HintPopover = /*#__PURE__*/function () {
9421  function HintPopover(context) {
9422    var _this = this;
9423
9424    HintPopover_classCallCheck(this, HintPopover);
9425
9426    this.context = context;
9427    this.ui = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.ui;
9428    this.$editable = context.layoutInfo.editable;
9429    this.options = context.options;
9430    this.hint = this.options.hint || [];
9431    this.direction = this.options.hintDirection || 'bottom';
9432    this.hints = Array.isArray(this.hint) ? this.hint : [this.hint];
9433    this.events = {
9434      'summernote.keyup': function summernoteKeyup(we, e) {
9435        if (!e.isDefaultPrevented()) {
9436          _this.handleKeyup(e);
9437        }
9438      },
9439      'summernote.keydown': function summernoteKeydown(we, e) {
9440        _this.handleKeydown(e);
9441      },
9442      'summernote.disable summernote.dialog.shown summernote.blur': function summernoteDisableSummernoteDialogShownSummernoteBlur() {
9443        _this.hide();
9444      }
9445    };
9446  }
9447
9448  HintPopover_createClass(HintPopover, [{
9449    key: "shouldInitialize",
9450    value: function shouldInitialize() {
9451      return this.hints.length > 0;
9452    }
9453  }, {
9454    key: "initialize",
9455    value: function initialize() {
9456      var _this2 = this;
9457
9458      this.lastWordRange = null;
9459      this.matchingWord = null;
9460      this.$popover = this.ui.popover({
9461        className: 'note-hint-popover',
9462        hideArrow: true,
9463        direction: ''
9464      }).render().appendTo(this.options.container);
9465      this.$popover.hide();
9466      this.$content = this.$popover.find('.popover-content,.note-popover-content');
9467      this.$content.on('click', '.note-hint-item', function (e) {
9468        _this2.$content.find('.active').removeClass('active');
9469
9470        external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(e.currentTarget).addClass('active');
9471
9472        _this2.replace();
9473      });
9474      this.$popover.on('mousedown', function (e) {
9475        e.preventDefault();
9476      });
9477    }
9478  }, {
9479    key: "destroy",
9480    value: function destroy() {
9481      this.$popover.remove();
9482    }
9483  }, {
9484    key: "selectItem",
9485    value: function selectItem($item) {
9486      this.$content.find('.active').removeClass('active');
9487      $item.addClass('active');
9488      this.$content[0].scrollTop = $item[0].offsetTop - this.$content.innerHeight() / 2;
9489    }
9490  }, {
9491    key: "moveDown",
9492    value: function moveDown() {
9493      var $current = this.$content.find('.note-hint-item.active');
9494      var $next = $current.next();
9495
9496      if ($next.length) {
9497        this.selectItem($next);
9498      } else {
9499        var $nextGroup = $current.parent().next();
9500
9501        if (!$nextGroup.length) {
9502          $nextGroup = this.$content.find('.note-hint-group').first();
9503        }
9504
9505        this.selectItem($nextGroup.find('.note-hint-item').first());
9506      }
9507    }
9508  }, {
9509    key: "moveUp",
9510    value: function moveUp() {
9511      var $current = this.$content.find('.note-hint-item.active');
9512      var $prev = $current.prev();
9513
9514      if ($prev.length) {
9515        this.selectItem($prev);
9516      } else {
9517        var $prevGroup = $current.parent().prev();
9518
9519        if (!$prevGroup.length) {
9520          $prevGroup = this.$content.find('.note-hint-group').last();
9521        }
9522
9523        this.selectItem($prevGroup.find('.note-hint-item').last());
9524      }
9525    }
9526  }, {
9527    key: "replace",
9528    value: function replace() {
9529      var $item = this.$content.find('.note-hint-item.active');
9530
9531      if ($item.length) {
9532        var node = this.nodeFromItem($item); // If matchingWord length = 0 -> capture OK / open hint / but as mention capture "" (\w*)
9533
9534        if (this.matchingWord !== null && this.matchingWord.length === 0) {
9535          this.lastWordRange.so = this.lastWordRange.eo; // Else si > 0 and normal case -> adjust range "before" for correct position of insertion
9536        } else if (this.matchingWord !== null && this.matchingWord.length > 0 && !this.lastWordRange.isCollapsed()) {
9537          var rangeCompute = this.lastWordRange.eo - this.lastWordRange.so - this.matchingWord.length;
9538
9539          if (rangeCompute > 0) {
9540            this.lastWordRange.so += rangeCompute;
9541          }
9542        }
9543
9544        this.lastWordRange.insertNode(node);
9545
9546        if (this.options.hintSelect === 'next') {
9547          var blank = document.createTextNode('');
9548          external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(node).after(blank);
9549          range.createFromNodeBefore(blank).select();
9550        } else {
9551          range.createFromNodeAfter(node).select();
9552        }
9553
9554        this.lastWordRange = null;
9555        this.hide();
9556        this.context.invoke('editor.focus');
9557      }
9558    }
9559  }, {
9560    key: "nodeFromItem",
9561    value: function nodeFromItem($item) {
9562      var hint = this.hints[$item.data('index')];
9563      var item = $item.data('item');
9564      var node = hint.content ? hint.content(item) : item;
9565
9566      if (typeof node === 'string') {
9567        node = dom.createText(node);
9568      }
9569
9570      return node;
9571    }
9572  }, {
9573    key: "createItemTemplates",
9574    value: function createItemTemplates(hintIdx, items) {
9575      var hint = this.hints[hintIdx];
9576      return items.map(function (item
9577      /*, idx */
9578      ) {
9579        var $item = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<div class="note-hint-item"/>');
9580        $item.append(hint.template ? hint.template(item) : item + '');
9581        $item.data({
9582          'index': hintIdx,
9583          'item': item
9584        });
9585        return $item;
9586      });
9587    }
9588  }, {
9589    key: "handleKeydown",
9590    value: function handleKeydown(e) {
9591      if (!this.$popover.is(':visible')) {
9592        return;
9593      }
9594
9595      if (e.keyCode === core_key.code.ENTER) {
9596        e.preventDefault();
9597        this.replace();
9598      } else if (e.keyCode === core_key.code.UP) {
9599        e.preventDefault();
9600        this.moveUp();
9601      } else if (e.keyCode === core_key.code.DOWN) {
9602        e.preventDefault();
9603        this.moveDown();
9604      }
9605    }
9606  }, {
9607    key: "searchKeyword",
9608    value: function searchKeyword(index, keyword, callback) {
9609      var hint = this.hints[index];
9610
9611      if (hint && hint.match.test(keyword) && hint.search) {
9612        var matches = hint.match.exec(keyword);
9613        this.matchingWord = matches[0];
9614        hint.search(matches[1], callback);
9615      } else {
9616        callback();
9617      }
9618    }
9619  }, {
9620    key: "createGroup",
9621    value: function createGroup(idx, keyword) {
9622      var _this3 = this;
9623
9624      var $group = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<div class="note-hint-group note-hint-group-' + idx + '"></div>');
9625      this.searchKeyword(idx, keyword, function (items) {
9626        items = items || [];
9627
9628        if (items.length) {
9629          $group.html(_this3.createItemTemplates(idx, items));
9630
9631          _this3.show();
9632        }
9633      });
9634      return $group;
9635    }
9636  }, {
9637    key: "handleKeyup",
9638    value: function handleKeyup(e) {
9639      var _this4 = this;
9640
9641      if (!lists.contains([core_key.code.ENTER, core_key.code.UP, core_key.code.DOWN], e.keyCode)) {
9642        var _range = this.context.invoke('editor.getLastRange');
9643
9644        var wordRange, keyword;
9645
9646        if (this.options.hintMode === 'words') {
9647          wordRange = _range.getWordsRange(_range);
9648          keyword = wordRange.toString();
9649          this.hints.forEach(function (hint) {
9650            if (hint.match.test(keyword)) {
9651              wordRange = _range.getWordsMatchRange(hint.match);
9652              return false;
9653            }
9654          });
9655
9656          if (!wordRange) {
9657            this.hide();
9658            return;
9659          }
9660
9661          keyword = wordRange.toString();
9662        } else {
9663          wordRange = _range.getWordRange();
9664          keyword = wordRange.toString();
9665        }
9666
9667        if (this.hints.length && keyword) {
9668          this.$content.empty();
9669          var bnd = func.rect2bnd(lists.last(wordRange.getClientRects()));
9670          var containerOffset = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(this.options.container).offset();
9671
9672          if (bnd) {
9673            bnd.top -= containerOffset.top;
9674            bnd.left -= containerOffset.left;
9675            this.$popover.hide();
9676            this.lastWordRange = wordRange;
9677            this.hints.forEach(function (hint, idx) {
9678              if (hint.match.test(keyword)) {
9679                _this4.createGroup(idx, keyword).appendTo(_this4.$content);
9680              }
9681            }); // select first .note-hint-item
9682
9683            this.$content.find('.note-hint-item:first').addClass('active'); // set position for popover after group is created
9684
9685            if (this.direction === 'top') {
9686              this.$popover.css({
9687                left: bnd.left,
9688                top: bnd.top - this.$popover.outerHeight() - POPOVER_DIST
9689              });
9690            } else {
9691              this.$popover.css({
9692                left: bnd.left,
9693                top: bnd.top + bnd.height + POPOVER_DIST
9694              });
9695            }
9696          }
9697        } else {
9698          this.hide();
9699        }
9700      }
9701    }
9702  }, {
9703    key: "show",
9704    value: function show() {
9705      this.$popover.show();
9706    }
9707  }, {
9708    key: "hide",
9709    value: function hide() {
9710      this.$popover.hide();
9711    }
9712  }]);
9713
9714  return HintPopover;
9715}();
9716
9717
9718// CONCATENATED MODULE: ./src/js/base/settings.js
9719
9720
9721
9722
9723
9724
9725
9726
9727
9728
9729
9730
9731
9732
9733
9734
9735
9736
9737
9738
9739
9740
9741
9742
9743
9744
9745
9746
9747external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.extend(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote, {
9748  version: '0.8.18',
9749  plugins: {},
9750  dom: dom,
9751  range: range,
9752  lists: lists,
9753  options: {
9754    langInfo: external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote.lang['en-US'],
9755    editing: true,
9756    modules: {
9757      'editor': Editor_Editor,
9758      'clipboard': Clipboard_Clipboard,
9759      'dropzone': Dropzone_Dropzone,
9760      'codeview': Codeview_CodeView,
9761      'statusbar': Statusbar_Statusbar,
9762      'fullscreen': Fullscreen_Fullscreen,
9763      'handle': Handle_Handle,
9764      // FIXME: HintPopover must be front of autolink
9765      //  - Script error about range when Enter key is pressed on hint popover
9766      'hintPopover': HintPopover_HintPopover,
9767      'autoLink': AutoLink_AutoLink,
9768      'autoSync': AutoSync_AutoSync,
9769      'autoReplace': AutoReplace_AutoReplace,
9770      'placeholder': Placeholder_Placeholder,
9771      'buttons': Buttons_Buttons,
9772      'toolbar': Toolbar_Toolbar,
9773      'linkDialog': LinkDialog_LinkDialog,
9774      'linkPopover': LinkPopover_LinkPopover,
9775      'imageDialog': ImageDialog_ImageDialog,
9776      'imagePopover': ImagePopover_ImagePopover,
9777      'tablePopover': TablePopover_TablePopover,
9778      'videoDialog': VideoDialog_VideoDialog,
9779      'helpDialog': HelpDialog_HelpDialog,
9780      'airPopover': AirPopover_AirPopover
9781    },
9782    buttons: {},
9783    lang: 'en-US',
9784    followingToolbar: false,
9785    toolbarPosition: 'top',
9786    otherStaticBar: '',
9787    // toolbar
9788    codeviewKeepButton: false,
9789    toolbar: [['style', ['style']], ['font', ['bold', 'underline', 'clear']], ['fontname', ['fontname']], ['color', ['color']], ['para', ['ul', 'ol', 'paragraph']], ['table', ['table']], ['insert', ['link', 'picture', 'video']], ['view', ['fullscreen', 'codeview', 'help']]],
9790    // popover
9791    popatmouse: true,
9792    popover: {
9793      image: [['resize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']], ['float', ['floatLeft', 'floatRight', 'floatNone']], ['remove', ['removeMedia']]],
9794      link: [['link', ['linkDialogShow', 'unlink']]],
9795      table: [['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']], ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]],
9796      air: [['color', ['color']], ['font', ['bold', 'underline', 'clear']], ['para', ['ul', 'paragraph']], ['table', ['table']], ['insert', ['link', 'picture']], ['view', ['fullscreen', 'codeview']]]
9797    },
9798    // air mode: inline editor
9799    airMode: false,
9800    overrideContextMenu: false,
9801    // TBD
9802    width: null,
9803    height: null,
9804    linkTargetBlank: true,
9805    useProtocol: true,
9806    defaultProtocol: 'http://',
9807    focus: false,
9808    tabDisabled: false,
9809    tabSize: 4,
9810    styleWithCSS: false,
9811    shortcuts: true,
9812    textareaAutoSync: true,
9813    tooltip: 'auto',
9814    container: null,
9815    maxTextLength: 0,
9816    blockquoteBreakingLevel: 2,
9817    spellCheck: true,
9818    disableGrammar: false,
9819    placeholder: null,
9820    inheritPlaceholder: false,
9821    // TODO: need to be documented
9822    recordEveryKeystroke: false,
9823    historyLimit: 200,
9824    // TODO: need to be documented
9825    showDomainOnlyForAutolink: false,
9826    // TODO: need to be documented
9827    hintMode: 'word',
9828    hintSelect: 'after',
9829    hintDirection: 'bottom',
9830    styleTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],
vendor: 5,720 bytes, lines 9831-9953
9831    fontNames: ['Arial', 'Arial Black', 'Comic Sans MS', 'Courier New', 'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande', 'Tahoma', 'Times New Roman', 'Verdana'],
9832    fontNamesIgnoreCheck: [],
9833    addDefaultFonts: true,
9834    fontSizes: ['8', '9', '10', '11', '12', '14', '18', '24', '36'],
9835    fontSizeUnits: ['px', 'pt'],
9836    // pallete colors(n x n)
9837    colors: [['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'], ['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'], ['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'], ['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'], ['#E76363', '#F7AD6B', '#FFD663', '#94BD7B', '#73A5AD', '#6BADDE', '#8C7BC6', '#C67BA5'], ['#CE0000', '#E79439', '#EFC631', '#6BA54A', '#4A7B8C', '#3984C6', '#634AA5', '#A54A7B'], ['#9C0000', '#B56308', '#BD9400', '#397B21', '#104A5A', '#085294', '#311873', '#731842'], ['#630000', '#7B3900', '#846300', '#295218', '#083139', '#003163', '#21104A', '#4A1031']],
9838    // http://chir.ag/projects/name-that-color/
9839    colorsName: [['Black', 'Tundora', 'Dove Gray', 'Star Dust', 'Pale Slate', 'Gallery', 'Alabaster', 'White'], ['Red', 'Orange Peel', 'Yellow', 'Green', 'Cyan', 'Blue', 'Electric Violet', 'Magenta'], ['Azalea', 'Karry', 'Egg White', 'Zanah', 'Botticelli', 'Tropical Blue', 'Mischka', 'Twilight'], ['Tonys Pink', 'Peach Orange', 'Cream Brulee', 'Sprout', 'Casper', 'Perano', 'Cold Purple', 'Careys Pink'], ['Mandy', 'Rajah', 'Dandelion', 'Olivine', 'Gulf Stream', 'Viking', 'Blue Marguerite', 'Puce'], ['Guardsman Red', 'Fire Bush', 'Golden Dream', 'Chelsea Cucumber', 'Smalt Blue', 'Boston Blue', 'Butterfly Bush', 'Cadillac'], ['Sangria', 'Mai Tai', 'Buddha Gold', 'Forest Green', 'Eden', 'Venice Blue', 'Meteorite', 'Claret'], ['Rosewood', 'Cinnamon', 'Olive', 'Parsley', 'Tiber', 'Midnight Blue', 'Valentino', 'Loulou']],
9840    colorButton: {
9841      foreColor: '#000000',
9842      backColor: '#FFFF00'
9843    },
9844    lineHeights: ['1.0', '1.2', '1.4', '1.5', '1.6', '1.8', '2.0', '3.0'],
9845    tableClassName: 'table table-bordered',
9846    insertTableMaxSize: {
9847      col: 10,
9848      row: 10
9849    },
9850    // By default, dialogs are attached in container.
9851    dialogsInBody: false,
9852    dialogsFade: false,
9853    maximumImageFileSize: null,
9854    callbacks: {
9855      onBeforeCommand: null,
9856      onBlur: null,
9857      onBlurCodeview: null,
9858      onChange: null,
9859      onChangeCodeview: null,
9860      onDialogShown: null,
9861      onEnter: null,
9862      onFocus: null,
9863      onImageLinkInsert: null,
9864      onImageUpload: null,
9865      onImageUploadError: null,
9866      onInit: null,
9867      onKeydown: null,
9868      onKeyup: null,
9869      onMousedown: null,
9870      onMouseup: null,
9871      onPaste: null,
9872      onScroll: null
9873    },
9874    codemirror: {
9875      mode: 'text/html',
9876      htmlMode: true,
9877      lineNumbers: true
9878    },
9879    codeviewFilter: false,
9880    codeviewFilterRegex: /<\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi,
9881    codeviewIframeFilter: true,
9882    codeviewIframeWhitelistSrc: [],
9883    codeviewIframeWhitelistSrcBase: ['www.youtube.com', 'www.youtube-nocookie.com', 'www.facebook.com', 'vine.co', 'instagram.com', 'player.vimeo.com', 'www.dailymotion.com', 'player.youku.com', 'v.qq.com'],
9884    keyMap: {
9885      pc: {
9886        'ESC': 'escape',
9887        'ENTER': 'insertParagraph',
9888        'CTRL+Z': 'undo',
9889        'CTRL+Y': 'redo',
9890        'TAB': 'tab',
9891        'SHIFT+TAB': 'untab',
9892        'CTRL+B': 'bold',
9893        'CTRL+I': 'italic',
9894        'CTRL+U': 'underline',
9895        'CTRL+SHIFT+S': 'strikethrough',
9896        'CTRL+BACKSLASH': 'removeFormat',
9897        'CTRL+SHIFT+L': 'justifyLeft',
9898        'CTRL+SHIFT+E': 'justifyCenter',
9899        'CTRL+SHIFT+R': 'justifyRight',
9900        'CTRL+SHIFT+J': 'justifyFull',
9901        'CTRL+SHIFT+NUM7': 'insertUnorderedList',
9902        'CTRL+SHIFT+NUM8': 'insertOrderedList',
9903        'CTRL+LEFTBRACKET': 'outdent',
9904        'CTRL+RIGHTBRACKET': 'indent',
9905        'CTRL+NUM0': 'formatPara',
9906        'CTRL+NUM1': 'formatH1',
9907        'CTRL+NUM2': 'formatH2',
9908        'CTRL+NUM3': 'formatH3',
9909        'CTRL+NUM4': 'formatH4',
9910        'CTRL+NUM5': 'formatH5',
9911        'CTRL+NUM6': 'formatH6',
9912        'CTRL+ENTER': 'insertHorizontalRule',
9913        'CTRL+K': 'linkDialog.show'
9914      },
9915      mac: {
9916        'ESC': 'escape',
9917        'ENTER': 'insertParagraph',
9918        'CMD+Z': 'undo',
9919        'CMD+SHIFT+Z': 'redo',
9920        'TAB': 'tab',
9921        'SHIFT+TAB': 'untab',
9922        'CMD+B': 'bold',
9923        'CMD+I': 'italic',
9924        'CMD+U': 'underline',
9925        'CMD+SHIFT+S': 'strikethrough',
9926        'CMD+BACKSLASH': 'removeFormat',
9927        'CMD+SHIFT+L': 'justifyLeft',
9928        'CMD+SHIFT+E': 'justifyCenter',
9929        'CMD+SHIFT+R': 'justifyRight',
9930        'CMD+SHIFT+J': 'justifyFull',
9931        'CMD+SHIFT+NUM7': 'insertUnorderedList',
9932        'CMD+SHIFT+NUM8': 'insertOrderedList',
9933        'CMD+LEFTBRACKET': 'outdent',
9934        'CMD+RIGHTBRACKET': 'indent',
9935        'CMD+NUM0': 'formatPara',
9936        'CMD+NUM1': 'formatH1',
9937        'CMD+NUM2': 'formatH2',
9938        'CMD+NUM3': 'formatH3',
9939        'CMD+NUM4': 'formatH4',
9940        'CMD+NUM5': 'formatH5',
9941        'CMD+NUM6': 'formatH6',
9942        'CMD+ENTER': 'insertHorizontalRule',
9943        'CMD+K': 'linkDialog.show'
9944      }
9945    },
9946    icons: {
9947      'align': 'note-icon-align',
9948      'alignCenter': 'note-icon-align-center',
9949      'alignJustify': 'note-icon-align-justify',
9950      'alignLeft': 'note-icon-align-left',
9951      'alignRight': 'note-icon-align-right',
9952      'rowBelow': 'note-icon-row-below',
9953      'colBefore': 'note-icon-col-before',
9954      'colAfter': 'note-icon-col-after',
9955      'rowAbove': 'note-icon-row-above',
9956      'rowRemove': 'note-icon-row-remove',
9957      'colRemove': 'note-icon-col-remove',
9958      'indent': 'note-icon-align-indent',
9959      'outdent': 'note-icon-align-outdent',
9960      'arrowsAlt': 'note-icon-arrows-alt',
9961      'bold': 'note-icon-bold',
9962      'caret': 'note-icon-caret',
9963      'circle': 'note-icon-circle',
9964      'close': 'note-icon-close',
9965      'code': 'note-icon-code',
9966      'eraser': 'note-icon-eraser',
9967      'floatLeft': 'note-icon-float-left',
9968      'floatRight': 'note-icon-float-right',
9969      'font': 'note-icon-font',
9970      'frame': 'note-icon-frame',
9971      'italic': 'note-icon-italic',
9972      'link': 'note-icon-link',
9973      'unlink': 'note-icon-chain-broken',
9974      'magic': 'note-icon-magic',
9975      'menuCheck': 'note-icon-menu-check',
9976      'minus': 'note-icon-minus',
9977      'orderedlist': 'note-icon-orderedlist',
9978      'pencil': 'note-icon-pencil',
9979      'picture': 'note-icon-picture',
9980      'question': 'note-icon-question',
9981      'redo': 'note-icon-redo',
9982      'rollback': 'note-icon-rollback',
9983      'square': 'note-icon-square',
9984      'strikethrough': 'note-icon-strikethrough',
9985      'subscript': 'note-icon-subscript',
9986      'superscript': 'note-icon-superscript',
9987      'table': 'note-icon-table',
9988      'textHeight': 'note-icon-text-height',
9989      'trash': 'note-icon-trash',
9990      'underline': 'note-icon-underline',
9991      'undo': 'note-icon-undo',
9992      'unorderedlist': 'note-icon-unorderedlist',
9993      'video': 'note-icon-video'
9994    }
9995  }
9996});
9997
9998/***/ }),
9999
10000/***/ 51:
10001/***/ (function(module, __webpack_exports__, __webpack_require__) {
10002
10003"use strict";
vendor: 13,484 bytes, lines 10004-10314
10004// ESM COMPAT FLAG
10005__webpack_require__.r(__webpack_exports__);
10006
10007// EXTERNAL MODULE: external {"root":"jQuery","commonjs2":"jquery","commonjs":"jquery","amd":"jquery"}
10008var external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_ = __webpack_require__(0);
10009var external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default = /*#__PURE__*/__webpack_require__.n(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_);
10010
10011// EXTERNAL MODULE: ./src/js/base/renderer.js
10012var renderer = __webpack_require__(1);
10013
10014// CONCATENATED MODULE: ./src/js/lite/ui/TooltipUI.js
10015function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
10016
10017function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
10018
10019function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
10020
10021
10022
10023var TooltipUI_TooltipUI = /*#__PURE__*/function () {
10024  function TooltipUI($node, options) {
10025    _classCallCheck(this, TooltipUI);
10026
10027    this.$node = $node;
10028    this.options = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.extend({}, {
10029      title: '',
10030      target: options.container,
10031      trigger: 'hover focus',
10032      placement: 'bottom'
10033    }, options); // create tooltip node
10034
10035    this.$tooltip = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(['<div class="note-tooltip">', '<div class="note-tooltip-arrow"></div>', '<div class="note-tooltip-content"></div>', '</div>'].join('')); // define event
10036
10037    if (this.options.trigger !== 'manual') {
10038      var showCallback = this.show.bind(this);
10039      var hideCallback = this.hide.bind(this);
10040      var toggleCallback = this.toggle.bind(this);
10041      this.options.trigger.split(' ').forEach(function (eventName) {
10042        if (eventName === 'hover') {
10043          $node.off('mouseenter mouseleave');
10044          $node.on('mouseenter', showCallback).on('mouseleave', hideCallback);
10045        } else if (eventName === 'click') {
10046          $node.on('click', toggleCallback);
10047        } else if (eventName === 'focus') {
10048          $node.on('focus', showCallback).on('blur', hideCallback);
10049        }
10050      });
10051    }
10052  }
10053
10054  _createClass(TooltipUI, [{
10055    key: "show",
10056    value: function show() {
10057      var $node = this.$node;
10058      var offset = $node.offset();
10059      var targetOffset = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(this.options.target).offset();
10060      offset.top -= targetOffset.top;
10061      offset.left -= targetOffset.left;
10062      var $tooltip = this.$tooltip;
10063      var title = this.options.title || $node.attr('title') || $node.data('title');
10064      var placement = this.options.placement || $node.data('placement');
10065      $tooltip.addClass(placement);
10066      $tooltip.find('.note-tooltip-content').text(title);
10067      $tooltip.appendTo(this.options.target);
10068      var nodeWidth = $node.outerWidth();
10069      var nodeHeight = $node.outerHeight();
10070      var tooltipWidth = $tooltip.outerWidth();
10071      var tooltipHeight = $tooltip.outerHeight();
10072
10073      if (placement === 'bottom') {
10074        $tooltip.css({
10075          top: offset.top + nodeHeight,
10076          left: offset.left + (nodeWidth / 2 - tooltipWidth / 2)
10077        });
10078      } else if (placement === 'top') {
10079        $tooltip.css({
10080          top: offset.top - tooltipHeight,
10081          left: offset.left + (nodeWidth / 2 - tooltipWidth / 2)
10082        });
10083      } else if (placement === 'left') {
10084        $tooltip.css({
10085          top: offset.top + (nodeHeight / 2 - tooltipHeight / 2),
10086          left: offset.left - tooltipWidth
10087        });
10088      } else if (placement === 'right') {
10089        $tooltip.css({
10090          top: offset.top + (nodeHeight / 2 - tooltipHeight / 2),
10091          left: offset.left + nodeWidth
10092        });
10093      }
10094
10095      $tooltip.addClass('in');
10096    }
10097  }, {
10098    key: "hide",
10099    value: function hide() {
10100      var _this = this;
10101
10102      this.$tooltip.removeClass('in');
10103      setTimeout(function () {
10104        _this.$tooltip.remove();
10105      }, 200);
10106    }
10107  }, {
10108    key: "toggle",
10109    value: function toggle() {
10110      if (this.$tooltip.hasClass('in')) {
10111        this.hide();
10112      } else {
10113        this.show();
10114      }
10115    }
10116  }]);
10117
10118  return TooltipUI;
10119}();
10120
10121/* harmony default export */ var ui_TooltipUI = (TooltipUI_TooltipUI);
10122// CONCATENATED MODULE: ./src/js/lite/ui/DropdownUI.js
10123function DropdownUI_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
10124
10125function DropdownUI_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
10126
10127function DropdownUI_createClass(Constructor, protoProps, staticProps) { if (protoProps) DropdownUI_defineProperties(Constructor.prototype, protoProps); if (staticProps) DropdownUI_defineProperties(Constructor, staticProps); return Constructor; }
10128
10129
10130
10131var DropdownUI_DropdownUI = /*#__PURE__*/function () {
10132  function DropdownUI($node, options) {
10133    DropdownUI_classCallCheck(this, DropdownUI);
10134
10135    this.$button = $node;
10136    this.options = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.extend({}, {
10137      target: options.container
10138    }, options);
10139    this.setEvent();
10140  }
10141
10142  DropdownUI_createClass(DropdownUI, [{
10143    key: "setEvent",
10144    value: function setEvent() {
10145      var _this = this;
10146
10147      this.$button.on('click', function (e) {
10148        _this.toggle();
10149
10150        e.stopImmediatePropagation();
10151      });
10152    }
10153  }, {
10154    key: "clear",
10155    value: function clear() {
10156      var $parent = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('.note-btn-group.open');
10157      $parent.find('.note-btn.active').removeClass('active');
10158      $parent.removeClass('open');
10159    }
10160  }, {
10161    key: "show",
10162    value: function show() {
10163      this.$button.addClass('active');
10164      this.$button.parent().addClass('open');
10165      var $dropdown = this.$button.next();
10166      var offset = $dropdown.offset();
10167      var width = $dropdown.outerWidth();
10168      var windowWidth = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(window).width();
10169      var targetMarginRight = parseFloat(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(this.options.target).css('margin-right'));
10170
10171      if (offset.left + width > windowWidth - targetMarginRight) {
10172        $dropdown.css('margin-left', windowWidth - targetMarginRight - (offset.left + width));
10173      } else {
10174        $dropdown.css('margin-left', '');
10175      }
10176    }
10177  }, {
10178    key: "hide",
10179    value: function hide() {
10180      this.$button.removeClass('active');
10181      this.$button.parent().removeClass('open');
10182    }
10183  }, {
10184    key: "toggle",
10185    value: function toggle() {
10186      var isOpened = this.$button.parent().hasClass('open');
10187      this.clear();
10188
10189      if (isOpened) {
10190        this.hide();
10191      } else {
10192        this.show();
10193      }
10194    }
10195  }]);
10196
10197  return DropdownUI;
10198}();
10199
10200external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(document).on('click', function (e) {
10201  if (!external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(e.target).closest('.note-btn-group').length) {
10202    external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('.note-btn-group.open').removeClass('open');
10203    external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('.note-btn-group .note-btn.active').removeClass('active');
10204  }
10205});
10206external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(document).on('click.note-dropdown-menu', function (e) {
10207  external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(e.target).closest('.note-dropdown-menu').parent().removeClass('open');
10208  external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(e.target).closest('.note-dropdown-menu').parent().find('.note-btn.active').removeClass('active');
10209});
10210/* harmony default export */ var ui_DropdownUI = (DropdownUI_DropdownUI);
10211// CONCATENATED MODULE: ./src/js/lite/ui/ModalUI.js
10212function ModalUI_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
10213
10214function ModalUI_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
10215
10216function ModalUI_createClass(Constructor, protoProps, staticProps) { if (protoProps) ModalUI_defineProperties(Constructor.prototype, protoProps); if (staticProps) ModalUI_defineProperties(Constructor, staticProps); return Constructor; }
10217
10218
10219
10220var ModalUI_ModalUI = /*#__PURE__*/function () {
10221  function ModalUI($node
10222  /*, options */
10223  ) {
10224    ModalUI_classCallCheck(this, ModalUI);
10225
10226    this.$modal = $node;
10227    this.$backdrop = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<div class="note-modal-backdrop"/>');
10228  }
10229
10230  ModalUI_createClass(ModalUI, [{
10231    key: "show",
10232    value: function show() {
10233      var _this = this;
10234
10235      this.$backdrop.appendTo(document.body).show();
10236      this.$modal.addClass('open').show();
10237      this.$modal.trigger('note.modal.show');
10238      this.$modal.off('click', '.close').on('click', '.close', this.hide.bind(this));
10239      this.$modal.on('keydown', function (event) {
10240        if (event.which === 27) {
10241          event.preventDefault();
10242
10243          _this.hide();
10244        }
10245      });
10246    }
10247  }, {
10248    key: "hide",
10249    value: function hide() {
10250      this.$modal.removeClass('open').hide();
10251      this.$backdrop.hide();
10252      this.$modal.trigger('note.modal.hide');
10253      this.$modal.off('keydown');
10254    }
10255  }]);
10256
10257  return ModalUI;
10258}();
10259
10260/* harmony default export */ var ui_ModalUI = (ModalUI_ModalUI);
10261// CONCATENATED MODULE: ./src/js/lite/ui.js
10262
10263
10264
10265
10266
10267var editor = renderer["a" /* default */].create('<div class="note-editor note-frame"/>');
10268var toolbar = renderer["a" /* default */].create('<div class="note-toolbar" role="toolbar"/>');
10269var editingArea = renderer["a" /* default */].create('<div class="note-editing-area"/>');
10270var codable = renderer["a" /* default */].create('<textarea class="note-codable" aria-multiline="true"/>');
10271var editable = renderer["a" /* default */].create('<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"/>');
10272var statusbar = renderer["a" /* default */].create(['<output class="note-status-output" role="status" aria-live="polite"></output>', '<div class="note-statusbar" role="status">', '<div class="note-resizebar" aria-label="resize">', '<div class="note-icon-bar"></div>', '<div class="note-icon-bar"></div>', '<div class="note-icon-bar"></div>', '</div>', '</div>'].join(''));
10273var airEditor = renderer["a" /* default */].create('<div class="note-editor note-airframe"/>');
10274var airEditable = renderer["a" /* default */].create(['<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"></div>', '<output class="note-status-output" role="status" aria-live="polite"></output>'].join(''));
10275var buttonGroup = renderer["a" /* default */].create('<div class="note-btn-group">');
10276var ui_button = renderer["a" /* default */].create('<button type="button" class="note-btn" tabindex="-1">', function ($node, options) {
10277  // set button type
10278  if (options && options.tooltip) {
10279    $node.attr({
10280      'aria-label': options.tooltip
10281    });
10282    $node.data('_lite_tooltip', new ui_TooltipUI($node, {
10283      title: options.tooltip,
10284      container: options.container
10285    })).on('click', function (e) {
10286      external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(e.currentTarget).data('_lite_tooltip').hide();
10287    });
10288  }
10289
10290  if (options.contents) {
10291    $node.html(options.contents);
10292  }
10293
10294  if (options && options.data && options.data.toggle === 'dropdown') {
10295    $node.data('_lite_dropdown', new ui_DropdownUI($node, {
10296      container: options.container
10297    }));
10298  }
10299
10300  if (options && options.codeviewKeepButton) {
10301    $node.addClass('note-codeview-keep');
10302  }
10303});
10304var dropdown = renderer["a" /* default */].create('<div class="note-dropdown-menu" role="list">', function ($node, options) {
10305  var markup = Array.isArray(options.items) ? options.items.map(function (item) {
10306    var value = typeof item === 'string' ? item : item.value || '';
10307    var content = options.template ? options.template(item) : item;
10308    var $temp = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<a class="note-dropdown-item" href="#" data-value="' + value + '" role="listitem" aria-label="' + value + '"></a>');
10309    $temp.html(content).data('item', item);
10310    return $temp;
10311  }) : options.items;
10312  $node.html(markup).attr({
10313    'aria-label': options.title
10314  });
vendor: 4,114 bytes, lines 10315-10440
10315  $node.on('click', '> .note-dropdown-item', function (e) {
10316    var $a = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(this);
10317    var item = $a.data('item');
10318    var value = $a.data('value');
10319
10320    if (item.click) {
10321      item.click($a);
10322    } else if (options.itemClick) {
10323      options.itemClick(e, item, value);
10324    }
10325  });
10326
10327  if (options && options.codeviewKeepButton) {
10328    $node.addClass('note-codeview-keep');
10329  }
10330});
10331var dropdownCheck = renderer["a" /* default */].create('<div class="note-dropdown-menu note-check" role="list">', function ($node, options) {
10332  var markup = Array.isArray(options.items) ? options.items.map(function (item) {
10333    var value = typeof item === 'string' ? item : item.value || '';
10334    var content = options.template ? options.template(item) : item;
10335    var $temp = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()('<a class="note-dropdown-item" href="#" data-value="' + value + '" role="listitem" aria-label="' + item + '"></a>');
10336    $temp.html([icon(options.checkClassName), ' ', content]).data('item', item);
10337    return $temp;
10338  }) : options.items;
10339  $node.html(markup).attr({
10340    'aria-label': options.title
10341  });
10342  $node.on('click', '> .note-dropdown-item', function (e) {
10343    var $a = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(this);
10344    var item = $a.data('item');
10345    var value = $a.data('value');
10346
10347    if (item.click) {
10348      item.click($a);
10349    } else if (options.itemClick) {
10350      options.itemClick(e, item, value);
10351    }
10352  });
10353
10354  if (options && options.codeviewKeepButton) {
10355    $node.addClass('note-codeview-keep');
10356  }
10357});
10358
10359var dropdownButtonContents = function dropdownButtonContents(contents, options) {
10360  return contents + ' ' + icon(options.icons.caret, 'span');
10361};
10362
10363var dropdownButton = function dropdownButton(opt, callback) {
10364  return buttonGroup([ui_button({
10365    className: 'dropdown-toggle',
10366    contents: opt.title + ' ' + icon('note-icon-caret'),
10367    tooltip: opt.tooltip,
10368    data: {
10369      toggle: 'dropdown'
10370    }
10371  }), dropdown({
10372    className: opt.className,
10373    items: opt.items,
10374    template: opt.template,
10375    itemClick: opt.itemClick
10376  })], {
10377    callback: callback
10378  }).render();
10379};
10380
10381var dropdownCheckButton = function dropdownCheckButton(opt, callback) {
10382  return buttonGroup([ui_button({
10383    className: 'dropdown-toggle',
10384    contents: opt.title + ' ' + icon('note-icon-caret'),
10385    tooltip: opt.tooltip,
10386    data: {
10387      toggle: 'dropdown'
10388    }
10389  }), dropdownCheck({
10390    className: opt.className,
10391    checkClassName: opt.checkClassName,
10392    items: opt.items,
10393    template: opt.template,
10394    itemClick: opt.itemClick
10395  })], {
10396    callback: callback
10397  }).render();
10398};
10399
10400var paragraphDropdownButton = function paragraphDropdownButton(opt) {
10401  return buttonGroup([ui_button({
10402    className: 'dropdown-toggle',
10403    contents: opt.title + ' ' + icon('note-icon-caret'),
10404    tooltip: opt.tooltip,
10405    data: {
10406      toggle: 'dropdown'
10407    }
10408  }), dropdown([buttonGroup({
10409    className: 'note-align',
10410    children: opt.items[0]
10411  }), buttonGroup({
10412    className: 'note-list',
10413    children: opt.items[1]
10414  })])]).render();
10415};
10416
10417var ui_tableMoveHandler = function tableMoveHandler(event, col, row) {
10418  var PX_PER_EM = 18;
10419  var $picker = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(event.target.parentNode); // target is mousecatcher
10420
10421  var $dimensionDisplay = $picker.next();
10422  var $catcher = $picker.find('.note-dimension-picker-mousecatcher');
10423  var $highlighted = $picker.find('.note-dimension-picker-highlighted');
10424  var $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');
10425  var posOffset; // HTML5 with jQuery - e.offsetX is undefined in Firefox
10426
10427  if (event.offsetX === undefined) {
10428    var posCatcher = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(event.target).offset();
10429    posOffset = {
10430      x: event.pageX - posCatcher.left,
10431      y: event.pageY - posCatcher.top
10432    };
10433  } else {
10434    posOffset = {
10435      x: event.offsetX,
10436      y: event.offsetY
10437    };
10438  }
10439
10440  var dim = {
vendor: 15,580 bytes, lines 10441-10782
10441    c: Math.ceil(posOffset.x / PX_PER_EM) || 1,
10442    r: Math.ceil(posOffset.y / PX_PER_EM) || 1
10443  };
10444  $highlighted.css({
10445    width: dim.c + 'em',
10446    height: dim.r + 'em'
10447  });
10448  $catcher.data('value', dim.c + 'x' + dim.r);
10449
10450  if (dim.c > 3 && dim.c < col) {
10451    $unhighlighted.css({
10452      width: dim.c + 1 + 'em'
10453    });
10454  }
10455
10456  if (dim.r > 3 && dim.r < row) {
10457    $unhighlighted.css({
10458      height: dim.r + 1 + 'em'
10459    });
10460  }
10461
10462  $dimensionDisplay.html(dim.c + ' x ' + dim.r);
10463};
10464
10465var tableDropdownButton = function tableDropdownButton(opt) {
10466  return buttonGroup([ui_button({
10467    className: 'dropdown-toggle',
10468    contents: opt.title + ' ' + icon('note-icon-caret'),
10469    tooltip: opt.tooltip,
10470    data: {
10471      toggle: 'dropdown'
10472    }
10473  }), dropdown({
10474    className: 'note-table',
10475    items: ['<div class="note-dimension-picker">', '<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>', '<div class="note-dimension-picker-highlighted"></div>', '<div class="note-dimension-picker-unhighlighted"></div>', '</div>', '<div class="note-dimension-display">1 x 1</div>'].join('')
10476  })], {
10477    callback: function callback($node) {
10478      var $catcher = $node.find('.note-dimension-picker-mousecatcher');
10479      $catcher.css({
10480        width: opt.col + 'em',
10481        height: opt.row + 'em'
10482      }).mousedown(opt.itemClick).mousemove(function (e) {
10483        ui_tableMoveHandler(e, opt.col, opt.row);
10484      });
10485    }
10486  }).render();
10487};
10488
10489var palette = renderer["a" /* default */].create('<div class="note-color-palette"/>', function ($node, options) {
10490  var contents = [];
10491
10492  for (var row = 0, rowSize = options.colors.length; row < rowSize; row++) {
10493    var eventName = options.eventName;
10494    var colors = options.colors[row];
10495    var colorsName = options.colorsName[row];
10496    var buttons = [];
10497
10498    for (var col = 0, colSize = colors.length; col < colSize; col++) {
10499      var color = colors[col];
10500      var colorName = colorsName[col];
10501      buttons.push(['<button type="button" class="note-btn note-color-btn"', 'style="background-color:', color, '" ', 'data-event="', eventName, '" ', 'data-value="', color, '" ', 'data-title="', colorName, '" ', 'aria-label="', colorName, '" ', 'data-toggle="button" tabindex="-1"></button>'].join(''));
10502    }
10503
10504    contents.push('<div class="note-color-row">' + buttons.join('') + '</div>');
10505  }
10506
10507  $node.html(contents.join(''));
10508  $node.find('.note-color-btn').each(function () {
10509    external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(this).data('_lite_tooltip', new ui_TooltipUI(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(this), {
10510      container: options.container
10511    }));
10512  });
10513});
10514
10515var ui_colorDropdownButton = function colorDropdownButton(opt, type) {
10516  return buttonGroup({
10517    className: 'note-color',
10518    children: [ui_button({
10519      className: 'note-current-color-button',
10520      contents: opt.title,
10521      tooltip: opt.lang.color.recent,
10522      click: opt.currentClick,
10523      callback: function callback($button) {
10524        var $recentColor = $button.find('.note-recent-color');
10525
10526        if (type !== 'foreColor') {
10527          $recentColor.css('background-color', '#FFFF00');
10528          $button.attr('data-backColor', '#FFFF00');
10529        }
10530      }
10531    }), ui_button({
10532      className: 'dropdown-toggle',
10533      contents: icon('note-icon-caret'),
10534      tooltip: opt.lang.color.more,
10535      data: {
10536        toggle: 'dropdown'
10537      }
10538    }), dropdown({
10539      items: ['<div>', '<div class="note-btn-group btn-background-color">', '<div class="note-palette-title">' + opt.lang.color.background + '</div>', '<div>', '<button type="button" class="note-color-reset note-btn note-btn-block" data-event="backColor" data-value="transparent">', opt.lang.color.transparent, '</button>', '</div>', '<div class="note-holder" data-event="backColor"></div>', '<div class="btn-sm">', '<input type="color" id="html5bcp" class="note-btn btn-default" value="#21104A" style="width:100%;" data-value="cp">', '<button type="button" class="note-color-reset btn" data-event="backColor" data-value="cpbackColor">', opt.lang.color.cpSelect, '</button>', '</div>', '</div>', '<div class="note-btn-group btn-foreground-color">', '<div class="note-palette-title">' + opt.lang.color.foreground + '</div>', '<div>', '<button type="button" class="note-color-reset note-btn note-btn-block" data-event="removeFormat" data-value="foreColor">', opt.lang.color.resetToDefault, '</button>', '</div>', '<div class="note-holder" data-event="foreColor"></div>', '<div class="btn-sm">', '<input type="color" id="html5fcp" class="note-btn btn-default" value="#21104A" style="width:100%;" data-value="cp">', '<button type="button" class="note-color-reset btn" data-event="foreColor" data-value="cpforeColor">', opt.lang.color.cpSelect, '</button>', '</div>', '</div>', '</div>'].join(''),
10540      callback: function callback($dropdown) {
10541        $dropdown.find('.note-holder').each(function () {
10542          var $holder = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(this);
10543          $holder.append(palette({
10544            colors: opt.colors,
10545            eventName: $holder.data('event')
10546          }).render());
10547        });
10548
10549        if (type === 'fore') {
10550          $dropdown.find('.btn-background-color').hide();
10551          $dropdown.css({
10552            'min-width': '210px'
10553          });
10554        } else if (type === 'back') {
10555          $dropdown.find('.btn-foreground-color').hide();
10556          $dropdown.css({
10557            'min-width': '210px'
10558          });
10559        }
10560      },
10561      click: function click(event) {
10562        var $button = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default()(event.target);
10563        var eventName = $button.data('event');
10564        var value = $button.data('value');
10565        var foreinput = document.getElementById('html5fcp').value;
10566        var backinput = document.getElementById('html5bcp').value;
10567
10568        if (value === 'cp') {
10569          event.stopPropagation();
10570        } else if (value === 'cpbackColor') {
10571          value = backinput;
10572        } else if (value === 'cpforeColor') {
10573          value = foreinput;
10574        }
10575
10576        if (eventName && value) {
10577          var key = eventName === 'backColor' ? 'background-color' : 'color';
10578          var $color = $button.closest('.note-color').find('.note-recent-color');
10579          var $currentButton = $button.closest('.note-color').find('.note-current-color-button');
10580          $color.css(key, value);
10581          $currentButton.attr('data-' + eventName, value);
10582
10583          if (type === 'fore') {
10584            opt.itemClick('foreColor', value);
10585          } else if (type === 'back') {
10586            opt.itemClick('backColor', value);
10587          } else {
10588            opt.itemClick(eventName, value);
10589          }
10590        }
10591      }
10592    })]
10593  }).render();
10594};
10595
10596var dialog = renderer["a" /* default */].create('<div class="note-modal" aria-hidden="false" tabindex="-1" role="dialog"/>', function ($node, options) {
10597  if (options.fade) {
10598    $node.addClass('fade');
10599  }
10600
10601  $node.attr({
10602    'aria-label': options.title
10603  });
10604  $node.html(['<div class="note-modal-content">', options.title ? '<div class="note-modal-header"><button type="button" class="close" aria-label="Close" aria-hidden="true"><i class="note-icon-close"></i></button><h4 class="note-modal-title">' + options.title + '</h4></div>' : '', '<div class="note-modal-body">' + options.body + '</div>', options.footer ? '<div class="note-modal-footer">' + options.footer + '</div>' : '', '</div>'].join(''));
10605  $node.data('modal', new ui_ModalUI($node, options));
10606});
10607
10608var videoDialog = function videoDialog(opt) {
10609  var body = '<div class="note-form-group">' + '<label for="note-dialog-video-url-' + opt.id + '" class="note-form-label">' + opt.lang.video.url + ' <small class="text-muted">' + opt.lang.video.providers + '</small></label>' + '<input id="note-dialog-video-url-' + opt.id + '" class="note-video-url note-input" type="text"/>' + '</div>';
10610  var footer = ['<button type="button" href="#" class="note-btn note-btn-primary note-video-btn disabled" disabled>', opt.lang.video.insert, '</button>'].join('');
10611  return dialog({
10612    title: opt.lang.video.insert,
10613    fade: opt.fade,
10614    body: body,
10615    footer: footer
10616  }).render();
10617};
10618
10619var imageDialog = function imageDialog(opt) {
10620  var body = '<div class="note-form-group note-group-select-from-files">' + '<label for="note-dialog-image-file-' + opt.id + '" class="note-form-label">' + opt.lang.image.selectFromFiles + '</label>' + '<input id="note-dialog-image-file-' + opt.id + '" class="note-note-image-input note-input" type="file" name="files" accept="image/*" multiple="multiple"/>' + opt.imageLimitation + '</div>' + '<div class="note-form-group">' + '<label for="note-dialog-image-url-' + opt.id + '" class="note-form-label">' + opt.lang.image.url + '</label>' + '<input id="note-dialog-image-url-' + opt.id + '" class="note-image-url note-input" type="text"/>' + '</div>';
10621  var footer = ['<button href="#" type="button" class="note-btn note-btn-primary note-btn-large note-image-btn disabled" disabled>', opt.lang.image.insert, '</button>'].join('');
10622  return dialog({
10623    title: opt.lang.image.insert,
10624    fade: opt.fade,
10625    body: body,
10626    footer: footer
10627  }).render();
10628};
10629
10630var linkDialog = function linkDialog(opt) {
10631  var body = '<div class="note-form-group">' + '<label for="note-dialog-link-txt-' + opt.id + '" class="note-form-label">' + opt.lang.link.textToDisplay + '</label>' + '<input id="note-dialog-link-txt-' + opt.id + '" class="note-link-text note-input" type="text"/>' + '</div>' + '<div class="note-form-group">' + '<label for="note-dialog-link-url-' + opt.id + '" class="note-form-label">' + opt.lang.link.url + '</label>' + '<input id="note-dialog-link-url-' + opt.id + '" class="note-link-url note-input" type="text" value="http://"/>' + '</div>' + (!opt.disableLinkTarget ? '<div class="checkbox"><label for="note-dialog-link-nw-' + opt.id + '"><input id="note-dialog-link-nw-' + opt.id + '" type="checkbox" checked> ' + opt.lang.link.openInNewWindow + '</label></div>' : '') + '<div class="checkbox"><label for="note-dialog-link-up-' + opt.id + '"><input id="note-dialog-link-up-' + opt.id + '" type="checkbox" checked> ' + opt.lang.link.useProtocol + '</label></div>';
10632  var footer = ['<button href="#" type="button" class="note-btn note-btn-primary note-link-btn disabled" disabled>', opt.lang.link.insert, '</button>'].join('');
10633  return dialog({
10634    className: 'link-dialog',
10635    title: opt.lang.link.insert,
10636    fade: opt.fade,
10637    body: body,
10638    footer: footer
10639  }).render();
10640};
10641
10642var popover = renderer["a" /* default */].create(['<div class="note-popover bottom">', '<div class="note-popover-arrow"></div>', '<div class="popover-content note-children-container"></div>', '</div>'].join(''), function ($node, options) {
10643  var direction = typeof options.direction !== 'undefined' ? options.direction : 'bottom';
10644  $node.addClass(direction).hide();
10645
10646  if (options.hideArrow) {
10647    $node.find('.note-popover-arrow').hide();
10648  }
10649});
10650var ui_checkbox = renderer["a" /* default */].create('<div class="checkbox"></div>', function ($node, options) {
10651  $node.html(['<label' + (options.id ? ' for="note-' + options.id + '"' : '') + '>', '<input role="checkbox" type="checkbox"' + (options.id ? ' id="note-' + options.id + '"' : ''), options.checked ? ' checked' : '', ' aria-checked="' + (options.checked ? 'true' : 'false') + '"/>', options.text ? options.text : '', '</label>'].join(''));
10652});
10653
10654var icon = function icon(iconClassName, tagName) {
10655  tagName = tagName || 'i';
10656  return '<' + tagName + ' class="' + iconClassName + '"/>';
10657};
10658
10659var ui = function ui(editorOptions) {
10660  return {
10661    editor: editor,
10662    toolbar: toolbar,
10663    editingArea: editingArea,
10664    codable: codable,
10665    editable: editable,
10666    statusbar: statusbar,
10667    airEditor: airEditor,
10668    airEditable: airEditable,
10669    buttonGroup: buttonGroup,
10670    button: ui_button,
10671    dropdown: dropdown,
10672    dropdownCheck: dropdownCheck,
10673    dropdownButton: dropdownButton,
10674    dropdownButtonContents: dropdownButtonContents,
10675    dropdownCheckButton: dropdownCheckButton,
10676    paragraphDropdownButton: paragraphDropdownButton,
10677    tableDropdownButton: tableDropdownButton,
10678    colorDropdownButton: ui_colorDropdownButton,
10679    palette: palette,
10680    dialog: dialog,
10681    videoDialog: videoDialog,
10682    imageDialog: imageDialog,
10683    linkDialog: linkDialog,
10684    popover: popover,
10685    checkbox: ui_checkbox,
10686    icon: icon,
10687    options: editorOptions,
10688    toggleBtn: function toggleBtn($btn, isEnable) {
10689      $btn.toggleClass('disabled', !isEnable);
10690      $btn.attr('disabled', !isEnable);
10691    },
10692    toggleBtnActive: function toggleBtnActive($btn, isActive) {
10693      $btn.toggleClass('active', isActive);
10694    },
10695    check: function check($dom, value) {
10696      $dom.find('.checked').removeClass('checked');
10697      $dom.find('[data-value="' + value + '"]').addClass('checked');
10698    },
10699    onDialogShown: function onDialogShown($dialog, handler) {
10700      $dialog.one('note.modal.show', handler);
10701    },
10702    onDialogHidden: function onDialogHidden($dialog, handler) {
10703      $dialog.one('note.modal.hide', handler);
10704    },
10705    showDialog: function showDialog($dialog) {
10706      $dialog.data('modal').show();
10707    },
10708    hideDialog: function hideDialog($dialog) {
10709      $dialog.data('modal').hide();
10710    },
10711
10712    /**
10713     * get popover content area
10714     *
10715     * @param $popover
10716     * @returns {*}
10717     */
10718    getPopoverContent: function getPopoverContent($popover) {
10719      return $popover.find('.note-popover-content');
10720    },
10721
10722    /**
10723     * get dialog's body area
10724     *
10725     * @param $dialog
10726     * @returns {*}
10727     */
10728    getDialogBody: function getDialogBody($dialog) {
10729      return $dialog.find('.note-modal-body');
10730    },
10731    createLayout: function createLayout($note) {
10732      var $editor = (editorOptions.airMode ? airEditor([editingArea([codable(), airEditable()])]) : editorOptions.toolbarPosition === 'bottom' ? editor([editingArea([codable(), editable()]), toolbar(), statusbar()]) : editor([toolbar(), editingArea([codable(), editable()]), statusbar()])).render();
10733      $editor.insertAfter($note);
10734      return {
10735        note: $note,
10736        editor: $editor,
10737        toolbar: $editor.find('.note-toolbar'),
10738        editingArea: $editor.find('.note-editing-area'),
10739        editable: $editor.find('.note-editable'),
10740        codable: $editor.find('.note-codable'),
10741        statusbar: $editor.find('.note-statusbar')
10742      };
10743    },
10744    removeLayout: function removeLayout($note, layoutInfo) {
10745      $note.html(layoutInfo.editable.html());
10746      layoutInfo.editor.remove();
10747      $note.off('summernote'); // remove summernote custom event
10748
10749      $note.show();
10750    }
10751  };
10752};
10753
10754/* harmony default export */ var lite_ui = (ui);
10755// EXTERNAL MODULE: ./src/js/base/settings.js + 37 modules
10756var settings = __webpack_require__(3);
10757
10758// EXTERNAL MODULE: ./src/styles/summernote-lite.scss
10759var summernote_lite = __webpack_require__(6);
10760
10761// CONCATENATED MODULE: ./src/js/lite/settings.js
10762
10763
10764
10765
10766external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote = external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.extend(external_root_jQuery_commonjs2_jquery_commonjs_jquery_amd_jquery_default.a.summernote, {
10767  ui_template: lite_ui,
10768  "interface": 'lite'
10769});
10770
10771/***/ }),
10772
10773/***/ 6:
10774/***/ (function(module, exports, __webpack_require__) {
10775
10776// extracted by mini-css-extract-plugin
10777
10778/***/ })
10779
10780/******/ });
10781});
10782//# sourceMappingURL=summernote-lite.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.