+```
+
+The p tag represents the entire Short Answer component to be rendered.
+(more info about the use)
+
+
+Option spec:
+
+
+
data-component="shortanswer" Identifies this as a Short Answer component
+
id Must be unique in the document
+
data-optional Makes this component optional for the student to answer--it isn't required.
+
diff --git a/runestone/hparsons/__init__.py b/runestone/hparsons/__init__.py
new file mode 100755
index 000000000..401a75358
--- /dev/null
+++ b/runestone/hparsons/__init__.py
@@ -0,0 +1 @@
+from .hparsons import *
diff --git a/runestone/hparsons/css/hparsons.css b/runestone/hparsons/css/hparsons.css
new file mode 100755
index 000000000..72ae40591
--- /dev/null
+++ b/runestone/hparsons/css/hparsons.css
@@ -0,0 +1,59 @@
+.hparsons_section {
+ position: relative;
+ margin-right: auto;
+ margin-left: auto;
+ max-width: 800px;
+ clear: both;
+}
+
+.hparsons_section > *:not(.hparsons_section) {
+ max-width: 500pt;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.hp_question {
+ padding-left: 10px;
+ padding-top: 10px;
+ margin: 5px;
+}
+
+.hp_actions {
+ text-align: center;
+}
+
+.hp_output {
+ display: none;
+ max-width: 450px;
+ background-color: inherit;
+}
+.hp_output pre {
+ background-color: lightgray;
+}
+
+.hp_sql_result {
+ background-color: lightgrey;
+ padding: 10px;
+ border-radius: 6px;
+ margin-bottom: 10px;
+}
+
+.hp_sql_result_success {
+ background-color: transparent;
+ color: green;
+ border: 0px;
+ padding: 0px;
+ margin-top: 10px;
+ margin-bottom: 10px;
+ min-height: 0px !important;
+}
+
+.hp_sql_result_failure {
+ background-color: transparent;
+ color: red;
+ border: 0px;
+ padding: 0px;
+ margin-top: 10px;
+ margin-bottom: 10px;
+ min-height: 0px !important;
+}
diff --git a/runestone/hparsons/hparsons.py b/runestone/hparsons/hparsons.py
new file mode 100755
index 000000000..4aec7fc3e
--- /dev/null
+++ b/runestone/hparsons/hparsons.py
@@ -0,0 +1,226 @@
+# *********
+# |docname|
+# *********
+# Copyright (C) 2011 Bradley N. Miller
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+__author__ = "bmiller"
+
+from docutils import nodes
+from docutils.parsers.rst import directives
+from sqlalchemy import Table
+from runestone.server.componentdb import (
+ addQuestionToDB,
+ addHTMLToDB,
+ get_engine_meta,
+ maybeAddToAssignment,
+)
+from runestone.common.runestonedirective import (
+ RunestoneIdDirective,
+ RunestoneIdNode,
+)
+
+def setup(app):
+ app.add_directive("hparsons", HParsonsDirective)
+ app.add_node(HParsonsNode, html=(visit_hp_html, depart_hp_html))
+
+
+TEMPLATE_START = """
+
+
+
+"""
+
+TEMPLATE_END = """
+
+
+
+
+
+"""
+
+
+class HParsonsNode(nodes.General, nodes.Element, RunestoneIdNode):
+ pass
+
+
+# self for these functions is an instance of the writer class. For example
+# in html, self is sphinx.writers.html.SmartyPantsHTMLTranslator
+# The node that is passed as a parameter is an instance of our node class.
+def visit_hp_html(self, node):
+
+ node["delimiter"] = "_start__{}_".format(node["runestone_options"]["divid"])
+
+ self.body.append(node["delimiter"])
+
+ res = TEMPLATE_START % node["runestone_options"]
+ self.body.append(res)
+
+
+def depart_hp_html(self, node):
+ res = TEMPLATE_END % node["runestone_options"]
+ self.body.append(res)
+
+ addHTMLToDB(
+ node["runestone_options"]["divid"],
+ node["runestone_options"]["basecourse"],
+ "".join(self.body[self.body.index(node["delimiter"]) + 1 :]),
+ )
+
+ self.body.remove(node["delimiter"])
+
+
+class HParsonsDirective(RunestoneIdDirective):
+ # only keep: language, autograde, dburl
+ """
+ .. hparsons:: uniqueid
+ :language: sql, regex
+ :dburl: only for sql -- url to load database
+ :randomize: randomize the order of horizontal parsons
+ TODO: fix textentry
+ :reuse: only for parsons -- make the blocks reusable
+ :textentry: if you will use text entry instead of horizontal parsons
+
+ Here is the problem description. It must ends with the tildes.
+ Make sure you use the correct delimitier for each section below.
+ ~~~~
+ --blocks--
+ block 1
+ block 2
+ --explanations--
+ explanations for block 1
+ explanations for block 2
+ --unittest--
+ assert 1,1 == world
+ assert 0,1 == hello
+ assert 2,1 == 42
+ """
+
+ required_arguments = 1
+ optional_arguments = 1
+ has_content = True
+ option_spec = RunestoneIdDirective.option_spec.copy()
+ option_spec.update(
+ {
+ "dburl": directives.unchanged,
+ "language": directives.unchanged,
+ "textentry": directives.flag,
+ "reuse": directives.flag,
+ "randomize": directives.flag,
+ }
+ )
+
+ def run(self):
+ super(HParsonsDirective, self).run()
+
+ env = self.state.document.settings.env
+
+ if "textentry" in self.options:
+ self.options['textentry'] = ' data-textentry="true"'
+ else:
+ self.options['textentry'] = ''
+
+ if "reuse" in self.options:
+ self.options['reuse'] = ' data-reuse="true"'
+ else:
+ self.options['reuse'] = ''
+
+ if "randomize" in self.options:
+ self.options['randomize'] = ' data-randomize="true"'
+ else:
+ self.options['randomize'] = ''
+
+ explain_text = None
+ if self.content:
+ if "~~~~" in self.content:
+ idx = self.content.index("~~~~")
+ explain_text = self.content[:idx]
+ self.content = self.content[idx + 1 :]
+ source = "\n".join(self.content)
+ else:
+ source = "\n"
+
+ self.explain_text = explain_text or ["Not an Exercise"]
+ addQuestionToDB(self)
+
+ self.options["initialsetting"] = source
+
+ # TODO: change this
+ if "language" not in self.options:
+ self.options["language"] = "python"
+
+ # SQL Options
+ if "dburl" in self.options:
+ self.options["dburl"] = "data-dburl='{}'".format(self.options["dburl"])
+ else:
+ self.options["dburl"] = ""
+
+ course_name = env.config.html_context["course_id"]
+ divid = self.options["divid"]
+
+ engine, meta, sess = get_engine_meta()
+
+ if engine:
+ Source_code = Table(
+ "source_code", meta, autoload=True, autoload_with=engine
+ )
+ engine.execute(
+ Source_code.delete()
+ .where(Source_code.c.acid == divid)
+ .where(Source_code.c.course_id == course_name)
+ )
+ engine.execute(
+ Source_code.insert().values(
+ acid=divid,
+ course_id=course_name,
+ main_code=source,
+ suffix_code=suffix,
+ )
+ )
+ else:
+ if (
+ not hasattr(env, "dberr_activecode_reported")
+ or not env.dberr_activecode_reported
+ ):
+ env.dberr_activecode_reported = True
+ print(
+ "Unable to save to source_code table in activecode.py. Possible problems:"
+ )
+ print(" 1. dburl or course_id are not set in conf.py for your book")
+ print(" 2. unable to connect to the database using dburl")
+ print("")
+ print(
+ "This should only affect the grading interface. Everything else should be fine."
+ )
+
+ hpnode = HParsonsNode()
+ hpnode["runestone_options"] = self.options
+ hpnode["source"], hpnode["line"] = self.state_machine.get_source_and_line(self.lineno)
+ self.add_name(hpnode) # make this divid available as a target for :ref:
+
+ maybeAddToAssignment(self)
+ if explain_text:
+ self.updateContent()
+ self.state.nested_parse(explain_text, self.content_offset, hpnode)
+
+ return [hpnode]
diff --git a/runestone/hparsons/js/horizontal-parsons.js b/runestone/hparsons/js/horizontal-parsons.js
new file mode 100644
index 000000000..fa4d703a7
--- /dev/null
+++ b/runestone/hparsons/js/horizontal-parsons.js
@@ -0,0 +1,15632 @@
+/**!
+ * Sortable 1.14.0
+ * @author RubaXa
+ * @author owenm
+ * @license MIT
+ */
+function ownKeys(object, enumerableOnly) {
+ var keys = Object.keys(object);
+
+ if (Object.getOwnPropertySymbols) {
+ var symbols = Object.getOwnPropertySymbols(object);
+
+ if (enumerableOnly) {
+ symbols = symbols.filter(function (sym) {
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
+ });
+ }
+
+ keys.push.apply(keys, symbols);
+ }
+
+ return keys;
+}
+
+function _objectSpread2(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i] != null ? arguments[i] : {};
+
+ if (i % 2) {
+ ownKeys(Object(source), true).forEach(function (key) {
+ _defineProperty(target, key, source[key]);
+ });
+ } else if (Object.getOwnPropertyDescriptors) {
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
+ } else {
+ ownKeys(Object(source)).forEach(function (key) {
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
+ });
+ }
+ }
+
+ return target;
+}
+
+function _typeof(obj) {
+ "@babel/helpers - typeof";
+
+ if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
+ _typeof = function (obj) {
+ return typeof obj;
+ };
+ } else {
+ _typeof = function (obj) {
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+ }
+
+ return _typeof(obj);
+}
+
+function _defineProperty(obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+}
+
+function _extends() {
+ _extends = Object.assign || function (target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i];
+
+ for (var key in source) {
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ }
+
+ return target;
+ };
+
+ return _extends.apply(this, arguments);
+}
+
+function _objectWithoutPropertiesLoose(source, excluded) {
+ if (source == null) return {};
+ var target = {};
+ var sourceKeys = Object.keys(source);
+ var key, i;
+
+ for (i = 0; i < sourceKeys.length; i++) {
+ key = sourceKeys[i];
+ if (excluded.indexOf(key) >= 0) continue;
+ target[key] = source[key];
+ }
+
+ return target;
+}
+
+function _objectWithoutProperties(source, excluded) {
+ if (source == null) return {};
+
+ var target = _objectWithoutPropertiesLoose(source, excluded);
+
+ var key, i;
+
+ if (Object.getOwnPropertySymbols) {
+ var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
+
+ for (i = 0; i < sourceSymbolKeys.length; i++) {
+ key = sourceSymbolKeys[i];
+ if (excluded.indexOf(key) >= 0) continue;
+ if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
+ target[key] = source[key];
+ }
+ }
+
+ return target;
+}
+
+var version = "1.14.0";
+
+function userAgent(pattern) {
+ if (typeof window !== 'undefined' && window.navigator) {
+ return !! /*@__PURE__*/navigator.userAgent.match(pattern);
+ }
+}
+
+var IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i);
+var Edge = userAgent(/Edge/i);
+var FireFox = userAgent(/firefox/i);
+var Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);
+var IOS = userAgent(/iP(ad|od|hone)/i);
+var ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);
+
+var captureMode = {
+ capture: false,
+ passive: false
+};
+
+function on(el, event, fn) {
+ el.addEventListener(event, fn, !IE11OrLess && captureMode);
+}
+
+function off(el, event, fn) {
+ el.removeEventListener(event, fn, !IE11OrLess && captureMode);
+}
+
+function matches(
+/**HTMLElement*/
+el,
+/**String*/
+selector) {
+ if (!selector) return;
+ selector[0] === '>' && (selector = selector.substring(1));
+
+ if (el) {
+ try {
+ if (el.matches) {
+ return el.matches(selector);
+ } else if (el.msMatchesSelector) {
+ return el.msMatchesSelector(selector);
+ } else if (el.webkitMatchesSelector) {
+ return el.webkitMatchesSelector(selector);
+ }
+ } catch (_) {
+ return false;
+ }
+ }
+
+ return false;
+}
+
+function getParentOrHost(el) {
+ return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;
+}
+
+function closest(
+/**HTMLElement*/
+el,
+/**String*/
+selector,
+/**HTMLElement*/
+ctx, includeCTX) {
+ if (el) {
+ ctx = ctx || document;
+
+ do {
+ if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {
+ return el;
+ }
+
+ if (el === ctx) break;
+ /* jshint boss:true */
+ } while (el = getParentOrHost(el));
+ }
+
+ return null;
+}
+
+var R_SPACE = /\s+/g;
+
+function toggleClass(el, name, state) {
+ if (el && name) {
+ if (el.classList) {
+ el.classList[state ? 'add' : 'remove'](name);
+ } else {
+ var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');
+ el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');
+ }
+ }
+}
+
+function css(el, prop, val) {
+ var style = el && el.style;
+
+ if (style) {
+ if (val === void 0) {
+ if (document.defaultView && document.defaultView.getComputedStyle) {
+ val = document.defaultView.getComputedStyle(el, '');
+ } else if (el.currentStyle) {
+ val = el.currentStyle;
+ }
+
+ return prop === void 0 ? val : val[prop];
+ } else {
+ if (!(prop in style) && prop.indexOf('webkit') === -1) {
+ prop = '-webkit-' + prop;
+ }
+
+ style[prop] = val + (typeof val === 'string' ? '' : 'px');
+ }
+ }
+}
+
+function matrix(el, selfOnly) {
+ var appliedTransforms = '';
+
+ if (typeof el === 'string') {
+ appliedTransforms = el;
+ } else {
+ do {
+ var transform = css(el, 'transform');
+
+ if (transform && transform !== 'none') {
+ appliedTransforms = transform + ' ' + appliedTransforms;
+ }
+ /* jshint boss:true */
+
+ } while (!selfOnly && (el = el.parentNode));
+ }
+
+ var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;
+ /*jshint -W056 */
+
+ return matrixFn && new matrixFn(appliedTransforms);
+}
+
+function find(ctx, tagName, iterator) {
+ if (ctx) {
+ var list = ctx.getElementsByTagName(tagName),
+ i = 0,
+ n = list.length;
+
+ if (iterator) {
+ for (; i < n; i++) {
+ iterator(list[i], i);
+ }
+ }
+
+ return list;
+ }
+
+ return [];
+}
+
+function getWindowScrollingElement() {
+ var scrollingElement = document.scrollingElement;
+
+ if (scrollingElement) {
+ return scrollingElement;
+ } else {
+ return document.documentElement;
+ }
+}
+/**
+ * Returns the "bounding client rect" of given element
+ * @param {HTMLElement} el The element whose boundingClientRect is wanted
+ * @param {[Boolean]} relativeToContainingBlock Whether the rect should be relative to the containing block of (including) the container
+ * @param {[Boolean]} relativeToNonStaticParent Whether the rect should be relative to the relative parent of (including) the contaienr
+ * @param {[Boolean]} undoScale Whether the container's scale() should be undone
+ * @param {[HTMLElement]} container The parent the element will be placed in
+ * @return {Object} The boundingClientRect of el, with specified adjustments
+ */
+
+
+function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {
+ if (!el.getBoundingClientRect && el !== window) return;
+ var elRect, top, left, bottom, right, height, width;
+
+ if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {
+ elRect = el.getBoundingClientRect();
+ top = elRect.top;
+ left = elRect.left;
+ bottom = elRect.bottom;
+ right = elRect.right;
+ height = elRect.height;
+ width = elRect.width;
+ } else {
+ top = 0;
+ left = 0;
+ bottom = window.innerHeight;
+ right = window.innerWidth;
+ height = window.innerHeight;
+ width = window.innerWidth;
+ }
+
+ if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {
+ // Adjust for translate()
+ container = container || el.parentNode; // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)
+ // Not needed on <= IE11
+
+ if (!IE11OrLess) {
+ do {
+ if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {
+ var containerRect = container.getBoundingClientRect(); // Set relative to edges of padding box of container
+
+ top -= containerRect.top + parseInt(css(container, 'border-top-width'));
+ left -= containerRect.left + parseInt(css(container, 'border-left-width'));
+ bottom = top + elRect.height;
+ right = left + elRect.width;
+ break;
+ }
+ /* jshint boss:true */
+
+ } while (container = container.parentNode);
+ }
+ }
+
+ if (undoScale && el !== window) {
+ // Adjust for scale()
+ var elMatrix = matrix(container || el),
+ scaleX = elMatrix && elMatrix.a,
+ scaleY = elMatrix && elMatrix.d;
+
+ if (elMatrix) {
+ top /= scaleY;
+ left /= scaleX;
+ width /= scaleX;
+ height /= scaleY;
+ bottom = top + height;
+ right = left + width;
+ }
+ }
+
+ return {
+ top: top,
+ left: left,
+ bottom: bottom,
+ right: right,
+ width: width,
+ height: height
+ };
+}
+/**
+ * Checks if a side of an element is scrolled past a side of its parents
+ * @param {HTMLElement} el The element who's side being scrolled out of view is in question
+ * @param {String} elSide Side of the element in question ('top', 'left', 'right', 'bottom')
+ * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom')
+ * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element
+ */
+
+
+function isScrolledPast(el, elSide, parentSide) {
+ var parent = getParentAutoScrollElement(el, true),
+ elSideVal = getRect(el)[elSide];
+ /* jshint boss:true */
+
+ while (parent) {
+ var parentSideVal = getRect(parent)[parentSide],
+ visible = void 0;
+
+ if (parentSide === 'top' || parentSide === 'left') {
+ visible = elSideVal >= parentSideVal;
+ } else {
+ visible = elSideVal <= parentSideVal;
+ }
+
+ if (!visible) return parent;
+ if (parent === getWindowScrollingElement()) break;
+ parent = getParentAutoScrollElement(parent, false);
+ }
+
+ return false;
+}
+/**
+ * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)
+ * and non-draggable elements
+ * @param {HTMLElement} el The parent element
+ * @param {Number} childNum The index of the child
+ * @param {Object} options Parent Sortable's options
+ * @return {HTMLElement} The child at index childNum, or null if not found
+ */
+
+
+function getChild(el, childNum, options, includeDragEl) {
+ var currentChild = 0,
+ i = 0,
+ children = el.children;
+
+ while (i < children.length) {
+ if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {
+ if (currentChild === childNum) {
+ return children[i];
+ }
+
+ currentChild++;
+ }
+
+ i++;
+ }
+
+ return null;
+}
+/**
+ * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)
+ * @param {HTMLElement} el Parent element
+ * @param {selector} selector Any other elements that should be ignored
+ * @return {HTMLElement} The last child, ignoring ghostEl
+ */
+
+
+function lastChild(el, selector) {
+ var last = el.lastElementChild;
+
+ while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {
+ last = last.previousElementSibling;
+ }
+
+ return last || null;
+}
+/**
+ * Returns the index of an element within its parent for a selected set of
+ * elements
+ * @param {HTMLElement} el
+ * @param {selector} selector
+ * @return {number}
+ */
+
+
+function index(el, selector) {
+ var index = 0;
+
+ if (!el || !el.parentNode) {
+ return -1;
+ }
+ /* jshint boss:true */
+
+
+ while (el = el.previousElementSibling) {
+ if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {
+ index++;
+ }
+ }
+
+ return index;
+}
+/**
+ * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.
+ * The value is returned in real pixels.
+ * @param {HTMLElement} el
+ * @return {Array} Offsets in the format of [left, top]
+ */
+
+
+function getRelativeScrollOffset(el) {
+ var offsetLeft = 0,
+ offsetTop = 0,
+ winScroller = getWindowScrollingElement();
+
+ if (el) {
+ do {
+ var elMatrix = matrix(el),
+ scaleX = elMatrix.a,
+ scaleY = elMatrix.d;
+ offsetLeft += el.scrollLeft * scaleX;
+ offsetTop += el.scrollTop * scaleY;
+ } while (el !== winScroller && (el = el.parentNode));
+ }
+
+ return [offsetLeft, offsetTop];
+}
+/**
+ * Returns the index of the object within the given array
+ * @param {Array} arr Array that may or may not hold the object
+ * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find
+ * @return {Number} The index of the object in the array, or -1
+ */
+
+
+function indexOfObject(arr, obj) {
+ for (var i in arr) {
+ if (!arr.hasOwnProperty(i)) continue;
+
+ for (var key in obj) {
+ if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);
+ }
+ }
+
+ return -1;
+}
+
+function getParentAutoScrollElement(el, includeSelf) {
+ // skip to window
+ if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();
+ var elem = el;
+ var gotSelf = false;
+
+ do {
+ // we don't need to get elem css if it isn't even overflowing in the first place (performance)
+ if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {
+ var elemCSS = css(elem);
+
+ if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {
+ if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();
+ if (gotSelf || includeSelf) return elem;
+ gotSelf = true;
+ }
+ }
+ /* jshint boss:true */
+
+ } while (elem = elem.parentNode);
+
+ return getWindowScrollingElement();
+}
+
+function extend(dst, src) {
+ if (dst && src) {
+ for (var key in src) {
+ if (src.hasOwnProperty(key)) {
+ dst[key] = src[key];
+ }
+ }
+ }
+
+ return dst;
+}
+
+function isRectEqual(rect1, rect2) {
+ return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);
+}
+
+var _throttleTimeout;
+
+function throttle(callback, ms) {
+ return function () {
+ if (!_throttleTimeout) {
+ var args = arguments,
+ _this = this;
+
+ if (args.length === 1) {
+ callback.call(_this, args[0]);
+ } else {
+ callback.apply(_this, args);
+ }
+
+ _throttleTimeout = setTimeout(function () {
+ _throttleTimeout = void 0;
+ }, ms);
+ }
+ };
+}
+
+function cancelThrottle() {
+ clearTimeout(_throttleTimeout);
+ _throttleTimeout = void 0;
+}
+
+function scrollBy(el, x, y) {
+ el.scrollLeft += x;
+ el.scrollTop += y;
+}
+
+function clone(el) {
+ var Polymer = window.Polymer;
+ var $ = window.jQuery || window.Zepto;
+
+ if (Polymer && Polymer.dom) {
+ return Polymer.dom(el).cloneNode(true);
+ } else if ($) {
+ return $(el).clone(true)[0];
+ } else {
+ return el.cloneNode(true);
+ }
+}
+
+var expando = 'Sortable' + new Date().getTime();
+
+function AnimationStateManager() {
+ var animationStates = [],
+ animationCallbackId;
+ return {
+ captureAnimationState: function captureAnimationState() {
+ animationStates = [];
+ if (!this.options.animation) return;
+ var children = [].slice.call(this.el.children);
+ children.forEach(function (child) {
+ if (css(child, 'display') === 'none' || child === Sortable.ghost) return;
+ animationStates.push({
+ target: child,
+ rect: getRect(child)
+ });
+
+ var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation
+
+
+ if (child.thisAnimationDuration) {
+ var childMatrix = matrix(child, true);
+
+ if (childMatrix) {
+ fromRect.top -= childMatrix.f;
+ fromRect.left -= childMatrix.e;
+ }
+ }
+
+ child.fromRect = fromRect;
+ });
+ },
+ addAnimationState: function addAnimationState(state) {
+ animationStates.push(state);
+ },
+ removeAnimationState: function removeAnimationState(target) {
+ animationStates.splice(indexOfObject(animationStates, {
+ target: target
+ }), 1);
+ },
+ animateAll: function animateAll(callback) {
+ var _this = this;
+
+ if (!this.options.animation) {
+ clearTimeout(animationCallbackId);
+ if (typeof callback === 'function') callback();
+ return;
+ }
+
+ var animating = false,
+ animationTime = 0;
+ animationStates.forEach(function (state) {
+ var time = 0,
+ target = state.target,
+ fromRect = target.fromRect,
+ toRect = getRect(target),
+ prevFromRect = target.prevFromRect,
+ prevToRect = target.prevToRect,
+ animatingRect = state.rect,
+ targetMatrix = matrix(target, true);
+
+ if (targetMatrix) {
+ // Compensate for current animation
+ toRect.top -= targetMatrix.f;
+ toRect.left -= targetMatrix.e;
+ }
+
+ target.toRect = toRect;
+
+ if (target.thisAnimationDuration) {
+ // Could also check if animatingRect is between fromRect and toRect
+ if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect
+ (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {
+ // If returning to same place as started from animation and on same axis
+ time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);
+ }
+ } // if fromRect != toRect: animate
+
+
+ if (!isRectEqual(toRect, fromRect)) {
+ target.prevFromRect = fromRect;
+ target.prevToRect = toRect;
+
+ if (!time) {
+ time = _this.options.animation;
+ }
+
+ _this.animate(target, animatingRect, toRect, time);
+ }
+
+ if (time) {
+ animating = true;
+ animationTime = Math.max(animationTime, time);
+ clearTimeout(target.animationResetTimer);
+ target.animationResetTimer = setTimeout(function () {
+ target.animationTime = 0;
+ target.prevFromRect = null;
+ target.fromRect = null;
+ target.prevToRect = null;
+ target.thisAnimationDuration = null;
+ }, time);
+ target.thisAnimationDuration = time;
+ }
+ });
+ clearTimeout(animationCallbackId);
+
+ if (!animating) {
+ if (typeof callback === 'function') callback();
+ } else {
+ animationCallbackId = setTimeout(function () {
+ if (typeof callback === 'function') callback();
+ }, animationTime);
+ }
+
+ animationStates = [];
+ },
+ animate: function animate(target, currentRect, toRect, duration) {
+ if (duration) {
+ css(target, 'transition', '');
+ css(target, 'transform', '');
+ var elMatrix = matrix(this.el),
+ scaleX = elMatrix && elMatrix.a,
+ scaleY = elMatrix && elMatrix.d,
+ translateX = (currentRect.left - toRect.left) / (scaleX || 1),
+ translateY = (currentRect.top - toRect.top) / (scaleY || 1);
+ target.animatingX = !!translateX;
+ target.animatingY = !!translateY;
+ css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');
+ this.forRepaintDummy = repaint(target); // repaint
+
+ css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));
+ css(target, 'transform', 'translate3d(0,0,0)');
+ typeof target.animated === 'number' && clearTimeout(target.animated);
+ target.animated = setTimeout(function () {
+ css(target, 'transition', '');
+ css(target, 'transform', '');
+ target.animated = false;
+ target.animatingX = false;
+ target.animatingY = false;
+ }, duration);
+ }
+ }
+ };
+}
+
+function repaint(target) {
+ return target.offsetWidth;
+}
+
+function calculateRealTime(animatingRect, fromRect, toRect, options) {
+ return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;
+}
+
+var plugins = [];
+var defaults = {
+ initializeByDefault: true
+};
+var PluginManager = {
+ mount: function mount(plugin) {
+ // Set default static properties
+ for (var option in defaults) {
+ if (defaults.hasOwnProperty(option) && !(option in plugin)) {
+ plugin[option] = defaults[option];
+ }
+ }
+
+ plugins.forEach(function (p) {
+ if (p.pluginName === plugin.pluginName) {
+ throw "Sortable: Cannot mount plugin ".concat(plugin.pluginName, " more than once");
+ }
+ });
+ plugins.push(plugin);
+ },
+ pluginEvent: function pluginEvent(eventName, sortable, evt) {
+ var _this = this;
+
+ this.eventCanceled = false;
+
+ evt.cancel = function () {
+ _this.eventCanceled = true;
+ };
+
+ var eventNameGlobal = eventName + 'Global';
+ plugins.forEach(function (plugin) {
+ if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable
+
+ if (sortable[plugin.pluginName][eventNameGlobal]) {
+ sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({
+ sortable: sortable
+ }, evt));
+ } // Only fire plugin event if plugin is enabled in this sortable,
+ // and plugin has event defined
+
+
+ if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {
+ sortable[plugin.pluginName][eventName](_objectSpread2({
+ sortable: sortable
+ }, evt));
+ }
+ });
+ },
+ initializePlugins: function initializePlugins(sortable, el, defaults, options) {
+ plugins.forEach(function (plugin) {
+ var pluginName = plugin.pluginName;
+ if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;
+ var initialized = new plugin(sortable, el, sortable.options);
+ initialized.sortable = sortable;
+ initialized.options = sortable.options;
+ sortable[pluginName] = initialized; // Add default options from plugin
+
+ _extends(defaults, initialized.defaults);
+ });
+
+ for (var option in sortable.options) {
+ if (!sortable.options.hasOwnProperty(option)) continue;
+ var modified = this.modifyOption(sortable, option, sortable.options[option]);
+
+ if (typeof modified !== 'undefined') {
+ sortable.options[option] = modified;
+ }
+ }
+ },
+ getEventProperties: function getEventProperties(name, sortable) {
+ var eventProperties = {};
+ plugins.forEach(function (plugin) {
+ if (typeof plugin.eventProperties !== 'function') return;
+
+ _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));
+ });
+ return eventProperties;
+ },
+ modifyOption: function modifyOption(sortable, name, value) {
+ var modifiedValue;
+ plugins.forEach(function (plugin) {
+ // Plugin must exist on the Sortable
+ if (!sortable[plugin.pluginName]) return; // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin
+
+ if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {
+ modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);
+ }
+ });
+ return modifiedValue;
+ }
+};
+
+function dispatchEvent(_ref) {
+ var sortable = _ref.sortable,
+ rootEl = _ref.rootEl,
+ name = _ref.name,
+ targetEl = _ref.targetEl,
+ cloneEl = _ref.cloneEl,
+ toEl = _ref.toEl,
+ fromEl = _ref.fromEl,
+ oldIndex = _ref.oldIndex,
+ newIndex = _ref.newIndex,
+ oldDraggableIndex = _ref.oldDraggableIndex,
+ newDraggableIndex = _ref.newDraggableIndex,
+ originalEvent = _ref.originalEvent,
+ putSortable = _ref.putSortable,
+ extraEventProperties = _ref.extraEventProperties;
+ sortable = sortable || rootEl && rootEl[expando];
+ if (!sortable) return;
+ var evt,
+ options = sortable.options,
+ onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); // Support for new CustomEvent feature
+
+ if (window.CustomEvent && !IE11OrLess && !Edge) {
+ evt = new CustomEvent(name, {
+ bubbles: true,
+ cancelable: true
+ });
+ } else {
+ evt = document.createEvent('Event');
+ evt.initEvent(name, true, true);
+ }
+
+ evt.to = toEl || rootEl;
+ evt.from = fromEl || rootEl;
+ evt.item = targetEl || rootEl;
+ evt.clone = cloneEl;
+ evt.oldIndex = oldIndex;
+ evt.newIndex = newIndex;
+ evt.oldDraggableIndex = oldDraggableIndex;
+ evt.newDraggableIndex = newDraggableIndex;
+ evt.originalEvent = originalEvent;
+ evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
+
+ var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));
+
+ for (var option in allEventProperties) {
+ evt[option] = allEventProperties[option];
+ }
+
+ if (rootEl) {
+ rootEl.dispatchEvent(evt);
+ }
+
+ if (options[onName]) {
+ options[onName].call(sortable, evt);
+ }
+}
+
+var _excluded = ["evt"];
+
+var pluginEvent = function pluginEvent(eventName, sortable) {
+ var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
+ originalEvent = _ref.evt,
+ data = _objectWithoutProperties(_ref, _excluded);
+
+ PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({
+ dragEl: dragEl,
+ parentEl: parentEl,
+ ghostEl: ghostEl,
+ rootEl: rootEl,
+ nextEl: nextEl,
+ lastDownEl: lastDownEl,
+ cloneEl: cloneEl,
+ cloneHidden: cloneHidden,
+ dragStarted: moved,
+ putSortable: putSortable,
+ activeSortable: Sortable.active,
+ originalEvent: originalEvent,
+ oldIndex: oldIndex,
+ oldDraggableIndex: oldDraggableIndex,
+ newIndex: newIndex,
+ newDraggableIndex: newDraggableIndex,
+ hideGhostForTarget: _hideGhostForTarget,
+ unhideGhostForTarget: _unhideGhostForTarget,
+ cloneNowHidden: function cloneNowHidden() {
+ cloneHidden = true;
+ },
+ cloneNowShown: function cloneNowShown() {
+ cloneHidden = false;
+ },
+ dispatchSortableEvent: function dispatchSortableEvent(name) {
+ _dispatchEvent({
+ sortable: sortable,
+ name: name,
+ originalEvent: originalEvent
+ });
+ }
+ }, data));
+};
+
+function _dispatchEvent(info) {
+ dispatchEvent(_objectSpread2({
+ putSortable: putSortable,
+ cloneEl: cloneEl,
+ targetEl: dragEl,
+ rootEl: rootEl,
+ oldIndex: oldIndex,
+ oldDraggableIndex: oldDraggableIndex,
+ newIndex: newIndex,
+ newDraggableIndex: newDraggableIndex
+ }, info));
+}
+
+var dragEl,
+ parentEl,
+ ghostEl,
+ rootEl,
+ nextEl,
+ lastDownEl,
+ cloneEl,
+ cloneHidden,
+ oldIndex,
+ newIndex,
+ oldDraggableIndex,
+ newDraggableIndex,
+ activeGroup,
+ putSortable,
+ awaitingDragStarted = false,
+ ignoreNextClick = false,
+ sortables = [],
+ tapEvt,
+ touchEvt,
+ lastDx,
+ lastDy,
+ tapDistanceLeft,
+ tapDistanceTop,
+ moved,
+ lastTarget,
+ lastDirection,
+ pastFirstInvertThresh = false,
+ isCircumstantialInvert = false,
+ targetMoveDistance,
+ // For positioning ghost absolutely
+ghostRelativeParent,
+ ghostRelativeParentInitialScroll = [],
+ // (left, top)
+_silent = false,
+ savedInputChecked = [];
+/** @const */
+
+var documentExists = typeof document !== 'undefined',
+ PositionGhostAbsolutely = IOS,
+ CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',
+ // This will not pass for IE9, because IE9 DnD only works on anchors
+supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),
+ supportCssPointerEvents = function () {
+ if (!documentExists) return; // false when <= IE11
+
+ if (IE11OrLess) {
+ return false;
+ }
+
+ var el = document.createElement('x');
+ el.style.cssText = 'pointer-events:auto';
+ return el.style.pointerEvents === 'auto';
+}(),
+ _detectDirection = function _detectDirection(el, options) {
+ var elCSS = css(el),
+ elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),
+ child1 = getChild(el, 0, options),
+ child2 = getChild(el, 1, options),
+ firstChildCSS = child1 && css(child1),
+ secondChildCSS = child2 && css(child2),
+ firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,
+ secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;
+
+ if (elCSS.display === 'flex') {
+ return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';
+ }
+
+ if (elCSS.display === 'grid') {
+ return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';
+ }
+
+ if (child1 && firstChildCSS["float"] && firstChildCSS["float"] !== 'none') {
+ var touchingSideChild2 = firstChildCSS["float"] === 'left' ? 'left' : 'right';
+ return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';
+ }
+
+ return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';
+},
+ _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {
+ var dragElS1Opp = vertical ? dragRect.left : dragRect.top,
+ dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,
+ dragElOppLength = vertical ? dragRect.width : dragRect.height,
+ targetS1Opp = vertical ? targetRect.left : targetRect.top,
+ targetS2Opp = vertical ? targetRect.right : targetRect.bottom,
+ targetOppLength = vertical ? targetRect.width : targetRect.height;
+ return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;
+},
+
+/**
+ * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.
+ * @param {Number} x X position
+ * @param {Number} y Y position
+ * @return {HTMLElement} Element of the first found nearest Sortable
+ */
+_detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {
+ var ret;
+ sortables.some(function (sortable) {
+ var threshold = sortable[expando].options.emptyInsertThreshold;
+ if (!threshold || lastChild(sortable)) return;
+ var rect = getRect(sortable),
+ insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,
+ insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;
+
+ if (insideHorizontally && insideVertically) {
+ return ret = sortable;
+ }
+ });
+ return ret;
+},
+ _prepareGroup = function _prepareGroup(options) {
+ function toFn(value, pull) {
+ return function (to, from, dragEl, evt) {
+ var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;
+
+ if (value == null && (pull || sameGroup)) {
+ // Default pull value
+ // Default pull and put value if same group
+ return true;
+ } else if (value == null || value === false) {
+ return false;
+ } else if (pull && value === 'clone') {
+ return value;
+ } else if (typeof value === 'function') {
+ return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);
+ } else {
+ var otherGroup = (pull ? to : from).options.group.name;
+ return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;
+ }
+ };
+ }
+
+ var group = {};
+ var originalGroup = options.group;
+
+ if (!originalGroup || _typeof(originalGroup) != 'object') {
+ originalGroup = {
+ name: originalGroup
+ };
+ }
+
+ group.name = originalGroup.name;
+ group.checkPull = toFn(originalGroup.pull, true);
+ group.checkPut = toFn(originalGroup.put);
+ group.revertClone = originalGroup.revertClone;
+ options.group = group;
+},
+ _hideGhostForTarget = function _hideGhostForTarget() {
+ if (!supportCssPointerEvents && ghostEl) {
+ css(ghostEl, 'display', 'none');
+ }
+},
+ _unhideGhostForTarget = function _unhideGhostForTarget() {
+ if (!supportCssPointerEvents && ghostEl) {
+ css(ghostEl, 'display', '');
+ }
+}; // #1184 fix - Prevent click event on fallback if dragged but item not changed position
+
+
+if (documentExists) {
+ document.addEventListener('click', function (evt) {
+ if (ignoreNextClick) {
+ evt.preventDefault();
+ evt.stopPropagation && evt.stopPropagation();
+ evt.stopImmediatePropagation && evt.stopImmediatePropagation();
+ ignoreNextClick = false;
+ return false;
+ }
+ }, true);
+}
+
+var nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {
+ if (dragEl) {
+ evt = evt.touches ? evt.touches[0] : evt;
+
+ var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);
+
+ if (nearest) {
+ // Create imitation event
+ var event = {};
+
+ for (var i in evt) {
+ if (evt.hasOwnProperty(i)) {
+ event[i] = evt[i];
+ }
+ }
+
+ event.target = event.rootEl = nearest;
+ event.preventDefault = void 0;
+ event.stopPropagation = void 0;
+
+ nearest[expando]._onDragOver(event);
+ }
+ }
+};
+
+var _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {
+ if (dragEl) {
+ dragEl.parentNode[expando]._isOutsideThisEl(evt.target);
+ }
+};
+/**
+ * @class Sortable
+ * @param {HTMLElement} el
+ * @param {Object} [options]
+ */
+
+
+function Sortable(el, options) {
+ if (!(el && el.nodeType && el.nodeType === 1)) {
+ throw "Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(el));
+ }
+
+ this.el = el; // root element
+
+ this.options = options = _extends({}, options); // Export instance
+
+ el[expando] = this;
+ var defaults = {
+ group: null,
+ sort: true,
+ disabled: false,
+ store: null,
+ handle: null,
+ draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',
+ swapThreshold: 1,
+ // percentage; 0 <= x <= 1
+ invertSwap: false,
+ // invert always
+ invertedSwapThreshold: null,
+ // will be set to same as swapThreshold if default
+ removeCloneOnHide: true,
+ direction: function direction() {
+ return _detectDirection(el, this.options);
+ },
+ ghostClass: 'sortable-ghost',
+ chosenClass: 'sortable-chosen',
+ dragClass: 'sortable-drag',
+ ignore: 'a, img',
+ filter: null,
+ preventOnFilter: true,
+ animation: 0,
+ easing: null,
+ setData: function setData(dataTransfer, dragEl) {
+ dataTransfer.setData('Text', dragEl.textContent);
+ },
+ dropBubble: false,
+ dragoverBubble: false,
+ dataIdAttr: 'data-id',
+ delay: 0,
+ delayOnTouchOnly: false,
+ touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,
+ forceFallback: false,
+ fallbackClass: 'sortable-fallback',
+ fallbackOnBody: false,
+ fallbackTolerance: 0,
+ fallbackOffset: {
+ x: 0,
+ y: 0
+ },
+ supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari,
+ emptyInsertThreshold: 5
+ };
+ PluginManager.initializePlugins(this, el, defaults); // Set default options
+
+ for (var name in defaults) {
+ !(name in options) && (options[name] = defaults[name]);
+ }
+
+ _prepareGroup(options); // Bind all private methods
+
+
+ for (var fn in this) {
+ if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {
+ this[fn] = this[fn].bind(this);
+ }
+ } // Setup drag mode
+
+
+ this.nativeDraggable = options.forceFallback ? false : supportDraggable;
+
+ if (this.nativeDraggable) {
+ // Touch start threshold cannot be greater than the native dragstart threshold
+ this.options.touchStartThreshold = 1;
+ } // Bind events
+
+
+ if (options.supportPointer) {
+ on(el, 'pointerdown', this._onTapStart);
+ } else {
+ on(el, 'mousedown', this._onTapStart);
+ on(el, 'touchstart', this._onTapStart);
+ }
+
+ if (this.nativeDraggable) {
+ on(el, 'dragover', this);
+ on(el, 'dragenter', this);
+ }
+
+ sortables.push(this.el); // Restore sorting
+
+ options.store && options.store.get && this.sort(options.store.get(this) || []); // Add animation state manager
+
+ _extends(this, AnimationStateManager());
+}
+
+Sortable.prototype =
+/** @lends Sortable.prototype */
+{
+ constructor: Sortable,
+ _isOutsideThisEl: function _isOutsideThisEl(target) {
+ if (!this.el.contains(target) && target !== this.el) {
+ lastTarget = null;
+ }
+ },
+ _getDirection: function _getDirection(evt, target) {
+ return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;
+ },
+ _onTapStart: function _onTapStart(
+ /** Event|TouchEvent */
+ evt) {
+ if (!evt.cancelable) return;
+
+ var _this = this,
+ el = this.el,
+ options = this.options,
+ preventOnFilter = options.preventOnFilter,
+ type = evt.type,
+ touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,
+ target = (touch || evt).target,
+ originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,
+ filter = options.filter;
+
+ _saveInputCheckedState(el); // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.
+
+
+ if (dragEl) {
+ return;
+ }
+
+ if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {
+ return; // only left button and enabled
+ } // cancel dnd if original target is content editable
+
+
+ if (originalTarget.isContentEditable) {
+ return;
+ } // Safari ignores further event handling after mousedown
+
+
+ if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {
+ return;
+ }
+
+ target = closest(target, options.draggable, el, false);
+
+ if (target && target.animated) {
+ return;
+ }
+
+ if (lastDownEl === target) {
+ // Ignoring duplicate `down`
+ return;
+ } // Get the index of the dragged element within its parent
+
+
+ oldIndex = index(target);
+ oldDraggableIndex = index(target, options.draggable); // Check filter
+
+ if (typeof filter === 'function') {
+ if (filter.call(this, evt, target, this)) {
+ _dispatchEvent({
+ sortable: _this,
+ rootEl: originalTarget,
+ name: 'filter',
+ targetEl: target,
+ toEl: el,
+ fromEl: el
+ });
+
+ pluginEvent('filter', _this, {
+ evt: evt
+ });
+ preventOnFilter && evt.cancelable && evt.preventDefault();
+ return; // cancel dnd
+ }
+ } else if (filter) {
+ filter = filter.split(',').some(function (criteria) {
+ criteria = closest(originalTarget, criteria.trim(), el, false);
+
+ if (criteria) {
+ _dispatchEvent({
+ sortable: _this,
+ rootEl: criteria,
+ name: 'filter',
+ targetEl: target,
+ fromEl: el,
+ toEl: el
+ });
+
+ pluginEvent('filter', _this, {
+ evt: evt
+ });
+ return true;
+ }
+ });
+
+ if (filter) {
+ preventOnFilter && evt.cancelable && evt.preventDefault();
+ return; // cancel dnd
+ }
+ }
+
+ if (options.handle && !closest(originalTarget, options.handle, el, false)) {
+ return;
+ } // Prepare `dragstart`
+
+
+ this._prepareDragStart(evt, touch, target);
+ },
+ _prepareDragStart: function _prepareDragStart(
+ /** Event */
+ evt,
+ /** Touch */
+ touch,
+ /** HTMLElement */
+ target) {
+ var _this = this,
+ el = _this.el,
+ options = _this.options,
+ ownerDocument = el.ownerDocument,
+ dragStartFn;
+
+ if (target && !dragEl && target.parentNode === el) {
+ var dragRect = getRect(target);
+ rootEl = el;
+ dragEl = target;
+ parentEl = dragEl.parentNode;
+ nextEl = dragEl.nextSibling;
+ lastDownEl = target;
+ activeGroup = options.group;
+ Sortable.dragged = dragEl;
+ tapEvt = {
+ target: dragEl,
+ clientX: (touch || evt).clientX,
+ clientY: (touch || evt).clientY
+ };
+ tapDistanceLeft = tapEvt.clientX - dragRect.left;
+ tapDistanceTop = tapEvt.clientY - dragRect.top;
+ this._lastX = (touch || evt).clientX;
+ this._lastY = (touch || evt).clientY;
+ dragEl.style['will-change'] = 'all';
+
+ dragStartFn = function dragStartFn() {
+ pluginEvent('delayEnded', _this, {
+ evt: evt
+ });
+
+ if (Sortable.eventCanceled) {
+ _this._onDrop();
+
+ return;
+ } // Delayed drag has been triggered
+ // we can re-enable the events: touchmove/mousemove
+
+
+ _this._disableDelayedDragEvents();
+
+ if (!FireFox && _this.nativeDraggable) {
+ dragEl.draggable = true;
+ } // Bind the events: dragstart/dragend
+
+
+ _this._triggerDragStart(evt, touch); // Drag start event
+
+
+ _dispatchEvent({
+ sortable: _this,
+ name: 'choose',
+ originalEvent: evt
+ }); // Chosen item
+
+
+ toggleClass(dragEl, options.chosenClass, true);
+ }; // Disable "draggable"
+
+
+ options.ignore.split(',').forEach(function (criteria) {
+ find(dragEl, criteria.trim(), _disableDraggable);
+ });
+ on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);
+ on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);
+ on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);
+ on(ownerDocument, 'mouseup', _this._onDrop);
+ on(ownerDocument, 'touchend', _this._onDrop);
+ on(ownerDocument, 'touchcancel', _this._onDrop); // Make dragEl draggable (must be before delay for FireFox)
+
+ if (FireFox && this.nativeDraggable) {
+ this.options.touchStartThreshold = 4;
+ dragEl.draggable = true;
+ }
+
+ pluginEvent('delayStart', this, {
+ evt: evt
+ }); // Delay is impossible for native DnD in Edge or IE
+
+ if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {
+ if (Sortable.eventCanceled) {
+ this._onDrop();
+
+ return;
+ } // If the user moves the pointer or let go the click or touch
+ // before the delay has been reached:
+ // disable the delayed drag
+
+
+ on(ownerDocument, 'mouseup', _this._disableDelayedDrag);
+ on(ownerDocument, 'touchend', _this._disableDelayedDrag);
+ on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);
+ on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);
+ on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);
+ options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);
+ _this._dragStartTimer = setTimeout(dragStartFn, options.delay);
+ } else {
+ dragStartFn();
+ }
+ }
+ },
+ _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler(
+ /** TouchEvent|PointerEvent **/
+ e) {
+ var touch = e.touches ? e.touches[0] : e;
+
+ if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {
+ this._disableDelayedDrag();
+ }
+ },
+ _disableDelayedDrag: function _disableDelayedDrag() {
+ dragEl && _disableDraggable(dragEl);
+ clearTimeout(this._dragStartTimer);
+
+ this._disableDelayedDragEvents();
+ },
+ _disableDelayedDragEvents: function _disableDelayedDragEvents() {
+ var ownerDocument = this.el.ownerDocument;
+ off(ownerDocument, 'mouseup', this._disableDelayedDrag);
+ off(ownerDocument, 'touchend', this._disableDelayedDrag);
+ off(ownerDocument, 'touchcancel', this._disableDelayedDrag);
+ off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);
+ off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);
+ off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);
+ },
+ _triggerDragStart: function _triggerDragStart(
+ /** Event */
+ evt,
+ /** Touch */
+ touch) {
+ touch = touch || evt.pointerType == 'touch' && evt;
+
+ if (!this.nativeDraggable || touch) {
+ if (this.options.supportPointer) {
+ on(document, 'pointermove', this._onTouchMove);
+ } else if (touch) {
+ on(document, 'touchmove', this._onTouchMove);
+ } else {
+ on(document, 'mousemove', this._onTouchMove);
+ }
+ } else {
+ on(dragEl, 'dragend', this);
+ on(rootEl, 'dragstart', this._onDragStart);
+ }
+
+ try {
+ if (document.selection) {
+ // Timeout neccessary for IE9
+ _nextTick(function () {
+ document.selection.empty();
+ });
+ } else {
+ window.getSelection().removeAllRanges();
+ }
+ } catch (err) {}
+ },
+ _dragStarted: function _dragStarted(fallback, evt) {
+
+ awaitingDragStarted = false;
+
+ if (rootEl && dragEl) {
+ pluginEvent('dragStarted', this, {
+ evt: evt
+ });
+
+ if (this.nativeDraggable) {
+ on(document, 'dragover', _checkOutsideTargetEl);
+ }
+
+ var options = this.options; // Apply effect
+
+ !fallback && toggleClass(dragEl, options.dragClass, false);
+ toggleClass(dragEl, options.ghostClass, true);
+ Sortable.active = this;
+ fallback && this._appendGhost(); // Drag start event
+
+ _dispatchEvent({
+ sortable: this,
+ name: 'start',
+ originalEvent: evt
+ });
+ } else {
+ this._nulling();
+ }
+ },
+ _emulateDragOver: function _emulateDragOver() {
+ if (touchEvt) {
+ this._lastX = touchEvt.clientX;
+ this._lastY = touchEvt.clientY;
+
+ _hideGhostForTarget();
+
+ var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);
+ var parent = target;
+
+ while (target && target.shadowRoot) {
+ target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);
+ if (target === parent) break;
+ parent = target;
+ }
+
+ dragEl.parentNode[expando]._isOutsideThisEl(target);
+
+ if (parent) {
+ do {
+ if (parent[expando]) {
+ var inserted = void 0;
+ inserted = parent[expando]._onDragOver({
+ clientX: touchEvt.clientX,
+ clientY: touchEvt.clientY,
+ target: target,
+ rootEl: parent
+ });
+
+ if (inserted && !this.options.dragoverBubble) {
+ break;
+ }
+ }
+
+ target = parent; // store last element
+ }
+ /* jshint boss:true */
+ while (parent = parent.parentNode);
+ }
+
+ _unhideGhostForTarget();
+ }
+ },
+ _onTouchMove: function _onTouchMove(
+ /**TouchEvent*/
+ evt) {
+ if (tapEvt) {
+ var options = this.options,
+ fallbackTolerance = options.fallbackTolerance,
+ fallbackOffset = options.fallbackOffset,
+ touch = evt.touches ? evt.touches[0] : evt,
+ ghostMatrix = ghostEl && matrix(ghostEl, true),
+ scaleX = ghostEl && ghostMatrix && ghostMatrix.a,
+ scaleY = ghostEl && ghostMatrix && ghostMatrix.d,
+ relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),
+ dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),
+ dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); // only set the status to dragging, when we are actually dragging
+
+ if (!Sortable.active && !awaitingDragStarted) {
+ if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {
+ return;
+ }
+
+ this._onDragStart(evt, true);
+ }
+
+ if (ghostEl) {
+ if (ghostMatrix) {
+ ghostMatrix.e += dx - (lastDx || 0);
+ ghostMatrix.f += dy - (lastDy || 0);
+ } else {
+ ghostMatrix = {
+ a: 1,
+ b: 0,
+ c: 0,
+ d: 1,
+ e: dx,
+ f: dy
+ };
+ }
+
+ var cssMatrix = "matrix(".concat(ghostMatrix.a, ",").concat(ghostMatrix.b, ",").concat(ghostMatrix.c, ",").concat(ghostMatrix.d, ",").concat(ghostMatrix.e, ",").concat(ghostMatrix.f, ")");
+ css(ghostEl, 'webkitTransform', cssMatrix);
+ css(ghostEl, 'mozTransform', cssMatrix);
+ css(ghostEl, 'msTransform', cssMatrix);
+ css(ghostEl, 'transform', cssMatrix);
+ lastDx = dx;
+ lastDy = dy;
+ touchEvt = touch;
+ }
+
+ evt.cancelable && evt.preventDefault();
+ }
+ },
+ _appendGhost: function _appendGhost() {
+ // Bug if using scale(): https://stackoverflow.com/questions/2637058
+ // Not being adjusted for
+ if (!ghostEl) {
+ var container = this.options.fallbackOnBody ? document.body : rootEl,
+ rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),
+ options = this.options; // Position absolutely
+
+ if (PositionGhostAbsolutely) {
+ // Get relatively positioned parent
+ ghostRelativeParent = container;
+
+ while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {
+ ghostRelativeParent = ghostRelativeParent.parentNode;
+ }
+
+ if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {
+ if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();
+ rect.top += ghostRelativeParent.scrollTop;
+ rect.left += ghostRelativeParent.scrollLeft;
+ } else {
+ ghostRelativeParent = getWindowScrollingElement();
+ }
+
+ ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);
+ }
+
+ ghostEl = dragEl.cloneNode(true);
+ toggleClass(ghostEl, options.ghostClass, false);
+ toggleClass(ghostEl, options.fallbackClass, true);
+ toggleClass(ghostEl, options.dragClass, true);
+ css(ghostEl, 'transition', '');
+ css(ghostEl, 'transform', '');
+ css(ghostEl, 'box-sizing', 'border-box');
+ css(ghostEl, 'margin', 0);
+ css(ghostEl, 'top', rect.top);
+ css(ghostEl, 'left', rect.left);
+ css(ghostEl, 'width', rect.width);
+ css(ghostEl, 'height', rect.height);
+ css(ghostEl, 'opacity', '0.8');
+ css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');
+ css(ghostEl, 'zIndex', '100000');
+ css(ghostEl, 'pointerEvents', 'none');
+ Sortable.ghost = ghostEl;
+ container.appendChild(ghostEl); // Set transform-origin
+
+ css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');
+ }
+ },
+ _onDragStart: function _onDragStart(
+ /**Event*/
+ evt,
+ /**boolean*/
+ fallback) {
+ var _this = this;
+
+ var dataTransfer = evt.dataTransfer;
+ var options = _this.options;
+ pluginEvent('dragStart', this, {
+ evt: evt
+ });
+
+ if (Sortable.eventCanceled) {
+ this._onDrop();
+
+ return;
+ }
+
+ pluginEvent('setupClone', this);
+
+ if (!Sortable.eventCanceled) {
+ cloneEl = clone(dragEl);
+ cloneEl.draggable = false;
+ cloneEl.style['will-change'] = '';
+
+ this._hideClone();
+
+ toggleClass(cloneEl, this.options.chosenClass, false);
+ Sortable.clone = cloneEl;
+ } // #1143: IFrame support workaround
+
+
+ _this.cloneId = _nextTick(function () {
+ pluginEvent('clone', _this);
+ if (Sortable.eventCanceled) return;
+
+ if (!_this.options.removeCloneOnHide) {
+ rootEl.insertBefore(cloneEl, dragEl);
+ }
+
+ _this._hideClone();
+
+ _dispatchEvent({
+ sortable: _this,
+ name: 'clone'
+ });
+ });
+ !fallback && toggleClass(dragEl, options.dragClass, true); // Set proper drop events
+
+ if (fallback) {
+ ignoreNextClick = true;
+ _this._loopId = setInterval(_this._emulateDragOver, 50);
+ } else {
+ // Undo what was set in _prepareDragStart before drag started
+ off(document, 'mouseup', _this._onDrop);
+ off(document, 'touchend', _this._onDrop);
+ off(document, 'touchcancel', _this._onDrop);
+
+ if (dataTransfer) {
+ dataTransfer.effectAllowed = 'move';
+ options.setData && options.setData.call(_this, dataTransfer, dragEl);
+ }
+
+ on(document, 'drop', _this); // #1276 fix:
+
+ css(dragEl, 'transform', 'translateZ(0)');
+ }
+
+ awaitingDragStarted = true;
+ _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));
+ on(document, 'selectstart', _this);
+ moved = true;
+
+ if (Safari) {
+ css(document.body, 'user-select', 'none');
+ }
+ },
+ // Returns true - if no further action is needed (either inserted or another condition)
+ _onDragOver: function _onDragOver(
+ /**Event*/
+ evt) {
+ var el = this.el,
+ target = evt.target,
+ dragRect,
+ targetRect,
+ revert,
+ options = this.options,
+ group = options.group,
+ activeSortable = Sortable.active,
+ isOwner = activeGroup === group,
+ canSort = options.sort,
+ fromSortable = putSortable || activeSortable,
+ vertical,
+ _this = this,
+ completedFired = false;
+
+ if (_silent) return;
+
+ function dragOverEvent(name, extra) {
+ pluginEvent(name, _this, _objectSpread2({
+ evt: evt,
+ isOwner: isOwner,
+ axis: vertical ? 'vertical' : 'horizontal',
+ revert: revert,
+ dragRect: dragRect,
+ targetRect: targetRect,
+ canSort: canSort,
+ fromSortable: fromSortable,
+ target: target,
+ completed: completed,
+ onMove: function onMove(target, after) {
+ return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);
+ },
+ changed: changed
+ }, extra));
+ } // Capture animation state
+
+
+ function capture() {
+ dragOverEvent('dragOverAnimationCapture');
+
+ _this.captureAnimationState();
+
+ if (_this !== fromSortable) {
+ fromSortable.captureAnimationState();
+ }
+ } // Return invocation when dragEl is inserted (or completed)
+
+
+ function completed(insertion) {
+ dragOverEvent('dragOverCompleted', {
+ insertion: insertion
+ });
+
+ if (insertion) {
+ // Clones must be hidden before folding animation to capture dragRectAbsolute properly
+ if (isOwner) {
+ activeSortable._hideClone();
+ } else {
+ activeSortable._showClone(_this);
+ }
+
+ if (_this !== fromSortable) {
+ // Set ghost class to new sortable's ghost class
+ toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);
+ toggleClass(dragEl, options.ghostClass, true);
+ }
+
+ if (putSortable !== _this && _this !== Sortable.active) {
+ putSortable = _this;
+ } else if (_this === Sortable.active && putSortable) {
+ putSortable = null;
+ } // Animation
+
+
+ if (fromSortable === _this) {
+ _this._ignoreWhileAnimating = target;
+ }
+
+ _this.animateAll(function () {
+ dragOverEvent('dragOverAnimationComplete');
+ _this._ignoreWhileAnimating = null;
+ });
+
+ if (_this !== fromSortable) {
+ fromSortable.animateAll();
+ fromSortable._ignoreWhileAnimating = null;
+ }
+ } // Null lastTarget if it is not inside a previously swapped element
+
+
+ if (target === dragEl && !dragEl.animated || target === el && !target.animated) {
+ lastTarget = null;
+ } // no bubbling and not fallback
+
+
+ if (!options.dragoverBubble && !evt.rootEl && target !== document) {
+ dragEl.parentNode[expando]._isOutsideThisEl(evt.target); // Do not detect for empty insert if already inserted
+
+
+ !insertion && nearestEmptyInsertDetectEvent(evt);
+ }
+
+ !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();
+ return completedFired = true;
+ } // Call when dragEl has been inserted
+
+
+ function changed() {
+ newIndex = index(dragEl);
+ newDraggableIndex = index(dragEl, options.draggable);
+
+ _dispatchEvent({
+ sortable: _this,
+ name: 'change',
+ toEl: el,
+ newIndex: newIndex,
+ newDraggableIndex: newDraggableIndex,
+ originalEvent: evt
+ });
+ }
+
+ if (evt.preventDefault !== void 0) {
+ evt.cancelable && evt.preventDefault();
+ }
+
+ target = closest(target, options.draggable, el, true);
+ dragOverEvent('dragOver');
+ if (Sortable.eventCanceled) return completedFired;
+
+ if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {
+ return completed(false);
+ }
+
+ ignoreNextClick = false;
+
+ if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list
+ : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {
+ vertical = this._getDirection(evt, target) === 'vertical';
+ dragRect = getRect(dragEl);
+ dragOverEvent('dragOverValid');
+ if (Sortable.eventCanceled) return completedFired;
+
+ if (revert) {
+ parentEl = rootEl; // actualization
+
+ capture();
+
+ this._hideClone();
+
+ dragOverEvent('revert');
+
+ if (!Sortable.eventCanceled) {
+ if (nextEl) {
+ rootEl.insertBefore(dragEl, nextEl);
+ } else {
+ rootEl.appendChild(dragEl);
+ }
+ }
+
+ return completed(true);
+ }
+
+ var elLastChild = lastChild(el, options.draggable);
+
+ if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {
+ // Insert to end of list
+ // If already at end of list: Do not insert
+ if (elLastChild === dragEl) {
+ return completed(false);
+ } // if there is a last element, it is the target
+
+
+ if (elLastChild && el === evt.target) {
+ target = elLastChild;
+ }
+
+ if (target) {
+ targetRect = getRect(target);
+ }
+
+ if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {
+ capture();
+ el.appendChild(dragEl);
+ parentEl = el; // actualization
+
+ changed();
+ return completed(true);
+ }
+ } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {
+ // Insert to start of list
+ var firstChild = getChild(el, 0, options, true);
+
+ if (firstChild === dragEl) {
+ return completed(false);
+ }
+
+ target = firstChild;
+ targetRect = getRect(target);
+
+ if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {
+ capture();
+ el.insertBefore(dragEl, firstChild);
+ parentEl = el; // actualization
+
+ changed();
+ return completed(true);
+ }
+ } else if (target.parentNode === el) {
+ targetRect = getRect(target);
+ var direction = 0,
+ targetBeforeFirstSwap,
+ differentLevel = dragEl.parentNode !== el,
+ differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),
+ side1 = vertical ? 'top' : 'left',
+ scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),
+ scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;
+
+ if (lastTarget !== target) {
+ targetBeforeFirstSwap = targetRect[side1];
+ pastFirstInvertThresh = false;
+ isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;
+ }
+
+ direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);
+ var sibling;
+
+ if (direction !== 0) {
+ // Check if target is beside dragEl in respective direction (ignoring hidden elements)
+ var dragIndex = index(dragEl);
+
+ do {
+ dragIndex -= direction;
+ sibling = parentEl.children[dragIndex];
+ } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));
+ } // If dragEl is already beside target: Do not insert
+
+
+ if (direction === 0 || sibling === target) {
+ return completed(false);
+ }
+
+ lastTarget = target;
+ lastDirection = direction;
+ var nextSibling = target.nextElementSibling,
+ after = false;
+ after = direction === 1;
+
+ var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);
+
+ if (moveVector !== false) {
+ if (moveVector === 1 || moveVector === -1) {
+ after = moveVector === 1;
+ }
+
+ _silent = true;
+ setTimeout(_unsilent, 30);
+ capture();
+
+ if (after && !nextSibling) {
+ el.appendChild(dragEl);
+ } else {
+ target.parentNode.insertBefore(dragEl, after ? nextSibling : target);
+ } // Undo chrome's scroll adjustment (has no effect on other browsers)
+
+
+ if (scrolledPastTop) {
+ scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);
+ }
+
+ parentEl = dragEl.parentNode; // actualization
+ // must be done before animation
+
+ if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {
+ targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);
+ }
+
+ changed();
+ return completed(true);
+ }
+ }
+
+ if (el.contains(dragEl)) {
+ return completed(false);
+ }
+ }
+
+ return false;
+ },
+ _ignoreWhileAnimating: null,
+ _offMoveEvents: function _offMoveEvents() {
+ off(document, 'mousemove', this._onTouchMove);
+ off(document, 'touchmove', this._onTouchMove);
+ off(document, 'pointermove', this._onTouchMove);
+ off(document, 'dragover', nearestEmptyInsertDetectEvent);
+ off(document, 'mousemove', nearestEmptyInsertDetectEvent);
+ off(document, 'touchmove', nearestEmptyInsertDetectEvent);
+ },
+ _offUpEvents: function _offUpEvents() {
+ var ownerDocument = this.el.ownerDocument;
+ off(ownerDocument, 'mouseup', this._onDrop);
+ off(ownerDocument, 'touchend', this._onDrop);
+ off(ownerDocument, 'pointerup', this._onDrop);
+ off(ownerDocument, 'touchcancel', this._onDrop);
+ off(document, 'selectstart', this);
+ },
+ _onDrop: function _onDrop(
+ /**Event*/
+ evt) {
+ var el = this.el,
+ options = this.options; // Get the index of the dragged element within its parent
+
+ newIndex = index(dragEl);
+ newDraggableIndex = index(dragEl, options.draggable);
+ pluginEvent('drop', this, {
+ evt: evt
+ });
+ parentEl = dragEl && dragEl.parentNode; // Get again after plugin event
+
+ newIndex = index(dragEl);
+ newDraggableIndex = index(dragEl, options.draggable);
+
+ if (Sortable.eventCanceled) {
+ this._nulling();
+
+ return;
+ }
+
+ awaitingDragStarted = false;
+ isCircumstantialInvert = false;
+ pastFirstInvertThresh = false;
+ clearInterval(this._loopId);
+ clearTimeout(this._dragStartTimer);
+
+ _cancelNextTick(this.cloneId);
+
+ _cancelNextTick(this._dragStartId); // Unbind events
+
+
+ if (this.nativeDraggable) {
+ off(document, 'drop', this);
+ off(el, 'dragstart', this._onDragStart);
+ }
+
+ this._offMoveEvents();
+
+ this._offUpEvents();
+
+ if (Safari) {
+ css(document.body, 'user-select', '');
+ }
+
+ css(dragEl, 'transform', '');
+
+ if (evt) {
+ if (moved) {
+ evt.cancelable && evt.preventDefault();
+ !options.dropBubble && evt.stopPropagation();
+ }
+
+ ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);
+
+ if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {
+ // Remove clone(s)
+ cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);
+ }
+
+ if (dragEl) {
+ if (this.nativeDraggable) {
+ off(dragEl, 'dragend', this);
+ }
+
+ _disableDraggable(dragEl);
+
+ dragEl.style['will-change'] = ''; // Remove classes
+ // ghostClass is added in dragStarted
+
+ if (moved && !awaitingDragStarted) {
+ toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);
+ }
+
+ toggleClass(dragEl, this.options.chosenClass, false); // Drag stop event
+
+ _dispatchEvent({
+ sortable: this,
+ name: 'unchoose',
+ toEl: parentEl,
+ newIndex: null,
+ newDraggableIndex: null,
+ originalEvent: evt
+ });
+
+ if (rootEl !== parentEl) {
+ if (newIndex >= 0) {
+ // Add event
+ _dispatchEvent({
+ rootEl: parentEl,
+ name: 'add',
+ toEl: parentEl,
+ fromEl: rootEl,
+ originalEvent: evt
+ }); // Remove event
+
+
+ _dispatchEvent({
+ sortable: this,
+ name: 'remove',
+ toEl: parentEl,
+ originalEvent: evt
+ }); // drag from one list and drop into another
+
+
+ _dispatchEvent({
+ rootEl: parentEl,
+ name: 'sort',
+ toEl: parentEl,
+ fromEl: rootEl,
+ originalEvent: evt
+ });
+
+ _dispatchEvent({
+ sortable: this,
+ name: 'sort',
+ toEl: parentEl,
+ originalEvent: evt
+ });
+ }
+
+ putSortable && putSortable.save();
+ } else {
+ if (newIndex !== oldIndex) {
+ if (newIndex >= 0) {
+ // drag & drop within the same list
+ _dispatchEvent({
+ sortable: this,
+ name: 'update',
+ toEl: parentEl,
+ originalEvent: evt
+ });
+
+ _dispatchEvent({
+ sortable: this,
+ name: 'sort',
+ toEl: parentEl,
+ originalEvent: evt
+ });
+ }
+ }
+ }
+
+ if (Sortable.active) {
+ /* jshint eqnull:true */
+ if (newIndex == null || newIndex === -1) {
+ newIndex = oldIndex;
+ newDraggableIndex = oldDraggableIndex;
+ }
+
+ _dispatchEvent({
+ sortable: this,
+ name: 'end',
+ toEl: parentEl,
+ originalEvent: evt
+ }); // Save sorting
+
+
+ this.save();
+ }
+ }
+ }
+
+ this._nulling();
+ },
+ _nulling: function _nulling() {
+ pluginEvent('nulling', this);
+ rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;
+ savedInputChecked.forEach(function (el) {
+ el.checked = true;
+ });
+ savedInputChecked.length = lastDx = lastDy = 0;
+ },
+ handleEvent: function handleEvent(
+ /**Event*/
+ evt) {
+ switch (evt.type) {
+ case 'drop':
+ case 'dragend':
+ this._onDrop(evt);
+
+ break;
+
+ case 'dragenter':
+ case 'dragover':
+ if (dragEl) {
+ this._onDragOver(evt);
+
+ _globalDragOver(evt);
+ }
+
+ break;
+
+ case 'selectstart':
+ evt.preventDefault();
+ break;
+ }
+ },
+
+ /**
+ * Serializes the item into an array of string.
+ * @returns {String[]}
+ */
+ toArray: function toArray() {
+ var order = [],
+ el,
+ children = this.el.children,
+ i = 0,
+ n = children.length,
+ options = this.options;
+
+ for (; i < n; i++) {
+ el = children[i];
+
+ if (closest(el, options.draggable, this.el, false)) {
+ order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));
+ }
+ }
+
+ return order;
+ },
+
+ /**
+ * Sorts the elements according to the array.
+ * @param {String[]} order order of the items
+ */
+ sort: function sort(order, useAnimation) {
+ var items = {},
+ rootEl = this.el;
+ this.toArray().forEach(function (id, i) {
+ var el = rootEl.children[i];
+
+ if (closest(el, this.options.draggable, rootEl, false)) {
+ items[id] = el;
+ }
+ }, this);
+ useAnimation && this.captureAnimationState();
+ order.forEach(function (id) {
+ if (items[id]) {
+ rootEl.removeChild(items[id]);
+ rootEl.appendChild(items[id]);
+ }
+ });
+ useAnimation && this.animateAll();
+ },
+
+ /**
+ * Save the current sorting
+ */
+ save: function save() {
+ var store = this.options.store;
+ store && store.set && store.set(this);
+ },
+
+ /**
+ * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.
+ * @param {HTMLElement} el
+ * @param {String} [selector] default: `options.draggable`
+ * @returns {HTMLElement|null}
+ */
+ closest: function closest$1(el, selector) {
+ return closest(el, selector || this.options.draggable, this.el, false);
+ },
+
+ /**
+ * Set/get option
+ * @param {string} name
+ * @param {*} [value]
+ * @returns {*}
+ */
+ option: function option(name, value) {
+ var options = this.options;
+
+ if (value === void 0) {
+ return options[name];
+ } else {
+ var modifiedValue = PluginManager.modifyOption(this, name, value);
+
+ if (typeof modifiedValue !== 'undefined') {
+ options[name] = modifiedValue;
+ } else {
+ options[name] = value;
+ }
+
+ if (name === 'group') {
+ _prepareGroup(options);
+ }
+ }
+ },
+
+ /**
+ * Destroy
+ */
+ destroy: function destroy() {
+ pluginEvent('destroy', this);
+ var el = this.el;
+ el[expando] = null;
+ off(el, 'mousedown', this._onTapStart);
+ off(el, 'touchstart', this._onTapStart);
+ off(el, 'pointerdown', this._onTapStart);
+
+ if (this.nativeDraggable) {
+ off(el, 'dragover', this);
+ off(el, 'dragenter', this);
+ } // Remove draggable attributes
+
+
+ Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {
+ el.removeAttribute('draggable');
+ });
+
+ this._onDrop();
+
+ this._disableDelayedDragEvents();
+
+ sortables.splice(sortables.indexOf(this.el), 1);
+ this.el = el = null;
+ },
+ _hideClone: function _hideClone() {
+ if (!cloneHidden) {
+ pluginEvent('hideClone', this);
+ if (Sortable.eventCanceled) return;
+ css(cloneEl, 'display', 'none');
+
+ if (this.options.removeCloneOnHide && cloneEl.parentNode) {
+ cloneEl.parentNode.removeChild(cloneEl);
+ }
+
+ cloneHidden = true;
+ }
+ },
+ _showClone: function _showClone(putSortable) {
+ if (putSortable.lastPutMode !== 'clone') {
+ this._hideClone();
+
+ return;
+ }
+
+ if (cloneHidden) {
+ pluginEvent('showClone', this);
+ if (Sortable.eventCanceled) return; // show clone at dragEl or original position
+
+ if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {
+ rootEl.insertBefore(cloneEl, dragEl);
+ } else if (nextEl) {
+ rootEl.insertBefore(cloneEl, nextEl);
+ } else {
+ rootEl.appendChild(cloneEl);
+ }
+
+ if (this.options.group.revertClone) {
+ this.animate(dragEl, cloneEl);
+ }
+
+ css(cloneEl, 'display', '');
+ cloneHidden = false;
+ }
+ }
+};
+
+function _globalDragOver(
+/**Event*/
+evt) {
+ if (evt.dataTransfer) {
+ evt.dataTransfer.dropEffect = 'move';
+ }
+
+ evt.cancelable && evt.preventDefault();
+}
+
+function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {
+ var evt,
+ sortable = fromEl[expando],
+ onMoveFn = sortable.options.onMove,
+ retVal; // Support for new CustomEvent feature
+
+ if (window.CustomEvent && !IE11OrLess && !Edge) {
+ evt = new CustomEvent('move', {
+ bubbles: true,
+ cancelable: true
+ });
+ } else {
+ evt = document.createEvent('Event');
+ evt.initEvent('move', true, true);
+ }
+
+ evt.to = toEl;
+ evt.from = fromEl;
+ evt.dragged = dragEl;
+ evt.draggedRect = dragRect;
+ evt.related = targetEl || toEl;
+ evt.relatedRect = targetRect || getRect(toEl);
+ evt.willInsertAfter = willInsertAfter;
+ evt.originalEvent = originalEvent;
+ fromEl.dispatchEvent(evt);
+
+ if (onMoveFn) {
+ retVal = onMoveFn.call(sortable, evt, originalEvent);
+ }
+
+ return retVal;
+}
+
+function _disableDraggable(el) {
+ el.draggable = false;
+}
+
+function _unsilent() {
+ _silent = false;
+}
+
+function _ghostIsFirst(evt, vertical, sortable) {
+ var rect = getRect(getChild(sortable.el, 0, sortable.options, true));
+ var spacer = 10;
+ return vertical ? evt.clientX < rect.left - spacer || evt.clientY < rect.top && evt.clientX < rect.right : evt.clientY < rect.top - spacer || evt.clientY < rect.bottom && evt.clientX < rect.left;
+}
+
+function _ghostIsLast(evt, vertical, sortable) {
+ var rect = getRect(lastChild(sortable.el, sortable.options.draggable));
+ var spacer = 10;
+ return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer;
+}
+
+function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {
+ var mouseOnAxis = vertical ? evt.clientY : evt.clientX,
+ targetLength = vertical ? targetRect.height : targetRect.width,
+ targetS1 = vertical ? targetRect.top : targetRect.left,
+ targetS2 = vertical ? targetRect.bottom : targetRect.right,
+ invert = false;
+
+ if (!invertSwap) {
+ // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold
+ if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {
+ // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2
+ // check if past first invert threshold on side opposite of lastDirection
+ if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {
+ // past first invert threshold, do not restrict inverted threshold to dragEl shadow
+ pastFirstInvertThresh = true;
+ }
+
+ if (!pastFirstInvertThresh) {
+ // dragEl shadow (target move distance shadow)
+ if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow
+ : mouseOnAxis > targetS2 - targetMoveDistance) {
+ return -lastDirection;
+ }
+ } else {
+ invert = true;
+ }
+ } else {
+ // Regular
+ if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {
+ return _getInsertDirection(target);
+ }
+ }
+ }
+
+ invert = invert || invertSwap;
+
+ if (invert) {
+ // Invert of regular
+ if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {
+ return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;
+ }
+ }
+
+ return 0;
+}
+/**
+ * Gets the direction dragEl must be swapped relative to target in order to make it
+ * seem that dragEl has been "inserted" into that element's position
+ * @param {HTMLElement} target The target whose position dragEl is being inserted at
+ * @return {Number} Direction dragEl must be swapped
+ */
+
+
+function _getInsertDirection(target) {
+ if (index(dragEl) < index(target)) {
+ return 1;
+ } else {
+ return -1;
+ }
+}
+/**
+ * Generate id
+ * @param {HTMLElement} el
+ * @returns {String}
+ * @private
+ */
+
+
+function _generateId(el) {
+ var str = el.tagName + el.className + el.src + el.href + el.textContent,
+ i = str.length,
+ sum = 0;
+
+ while (i--) {
+ sum += str.charCodeAt(i);
+ }
+
+ return sum.toString(36);
+}
+
+function _saveInputCheckedState(root) {
+ savedInputChecked.length = 0;
+ var inputs = root.getElementsByTagName('input');
+ var idx = inputs.length;
+
+ while (idx--) {
+ var el = inputs[idx];
+ el.checked && savedInputChecked.push(el);
+ }
+}
+
+function _nextTick(fn) {
+ return setTimeout(fn, 0);
+}
+
+function _cancelNextTick(id) {
+ return clearTimeout(id);
+} // Fixed #973:
+
+
+if (documentExists) {
+ on(document, 'touchmove', function (evt) {
+ if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {
+ evt.preventDefault();
+ }
+ });
+} // Export utils
+
+
+Sortable.utils = {
+ on: on,
+ off: off,
+ css: css,
+ find: find,
+ is: function is(el, selector) {
+ return !!closest(el, selector, el, false);
+ },
+ extend: extend,
+ throttle: throttle,
+ closest: closest,
+ toggleClass: toggleClass,
+ clone: clone,
+ index: index,
+ nextTick: _nextTick,
+ cancelNextTick: _cancelNextTick,
+ detectDirection: _detectDirection,
+ getChild: getChild
+};
+/**
+ * Get the Sortable instance of an element
+ * @param {HTMLElement} element The element
+ * @return {Sortable|undefined} The instance of Sortable
+ */
+
+Sortable.get = function (element) {
+ return element[expando];
+};
+/**
+ * Mount a plugin to Sortable
+ * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted
+ */
+
+
+Sortable.mount = function () {
+ for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {
+ plugins[_key] = arguments[_key];
+ }
+
+ if (plugins[0].constructor === Array) plugins = plugins[0];
+ plugins.forEach(function (plugin) {
+ if (!plugin.prototype || !plugin.prototype.constructor) {
+ throw "Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(plugin));
+ }
+
+ if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);
+ PluginManager.mount(plugin);
+ });
+};
+/**
+ * Create sortable instance
+ * @param {HTMLElement} el
+ * @param {Object} [options]
+ */
+
+
+Sortable.create = function (el, options) {
+ return new Sortable(el, options);
+}; // Export
+
+
+Sortable.version = version;
+
+var autoScrolls = [],
+ scrollEl,
+ scrollRootEl,
+ scrolling = false,
+ lastAutoScrollX,
+ lastAutoScrollY,
+ touchEvt$1,
+ pointerElemChangedInterval;
+
+function AutoScrollPlugin() {
+ function AutoScroll() {
+ this.defaults = {
+ scroll: true,
+ forceAutoScrollFallback: false,
+ scrollSensitivity: 30,
+ scrollSpeed: 10,
+ bubbleScroll: true
+ }; // Bind all private methods
+
+ for (var fn in this) {
+ if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {
+ this[fn] = this[fn].bind(this);
+ }
+ }
+ }
+
+ AutoScroll.prototype = {
+ dragStarted: function dragStarted(_ref) {
+ var originalEvent = _ref.originalEvent;
+
+ if (this.sortable.nativeDraggable) {
+ on(document, 'dragover', this._handleAutoScroll);
+ } else {
+ if (this.options.supportPointer) {
+ on(document, 'pointermove', this._handleFallbackAutoScroll);
+ } else if (originalEvent.touches) {
+ on(document, 'touchmove', this._handleFallbackAutoScroll);
+ } else {
+ on(document, 'mousemove', this._handleFallbackAutoScroll);
+ }
+ }
+ },
+ dragOverCompleted: function dragOverCompleted(_ref2) {
+ var originalEvent = _ref2.originalEvent;
+
+ // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)
+ if (!this.options.dragOverBubble && !originalEvent.rootEl) {
+ this._handleAutoScroll(originalEvent);
+ }
+ },
+ drop: function drop() {
+ if (this.sortable.nativeDraggable) {
+ off(document, 'dragover', this._handleAutoScroll);
+ } else {
+ off(document, 'pointermove', this._handleFallbackAutoScroll);
+ off(document, 'touchmove', this._handleFallbackAutoScroll);
+ off(document, 'mousemove', this._handleFallbackAutoScroll);
+ }
+
+ clearPointerElemChangedInterval();
+ clearAutoScrolls();
+ cancelThrottle();
+ },
+ nulling: function nulling() {
+ touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;
+ autoScrolls.length = 0;
+ },
+ _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {
+ this._handleAutoScroll(evt, true);
+ },
+ _handleAutoScroll: function _handleAutoScroll(evt, fallback) {
+ var _this = this;
+
+ var x = (evt.touches ? evt.touches[0] : evt).clientX,
+ y = (evt.touches ? evt.touches[0] : evt).clientY,
+ elem = document.elementFromPoint(x, y);
+ touchEvt$1 = evt; // IE does not seem to have native autoscroll,
+ // Edge's autoscroll seems too conditional,
+ // MACOS Safari does not have autoscroll,
+ // Firefox and Chrome are good
+
+ if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {
+ autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change
+
+ var ogElemScroller = getParentAutoScrollElement(elem, true);
+
+ if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {
+ pointerElemChangedInterval && clearPointerElemChangedInterval(); // Detect for pointer elem change, emulating native DnD behaviour
+
+ pointerElemChangedInterval = setInterval(function () {
+ var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);
+
+ if (newElem !== ogElemScroller) {
+ ogElemScroller = newElem;
+ clearAutoScrolls();
+ }
+
+ autoScroll(evt, _this.options, newElem, fallback);
+ }, 10);
+ lastAutoScrollX = x;
+ lastAutoScrollY = y;
+ }
+ } else {
+ // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll
+ if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {
+ clearAutoScrolls();
+ return;
+ }
+
+ autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);
+ }
+ }
+ };
+ return _extends(AutoScroll, {
+ pluginName: 'scroll',
+ initializeByDefault: true
+ });
+}
+
+function clearAutoScrolls() {
+ autoScrolls.forEach(function (autoScroll) {
+ clearInterval(autoScroll.pid);
+ });
+ autoScrolls = [];
+}
+
+function clearPointerElemChangedInterval() {
+ clearInterval(pointerElemChangedInterval);
+}
+
+var autoScroll = throttle(function (evt, options, rootEl, isFallback) {
+ // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521
+ if (!options.scroll) return;
+ var x = (evt.touches ? evt.touches[0] : evt).clientX,
+ y = (evt.touches ? evt.touches[0] : evt).clientY,
+ sens = options.scrollSensitivity,
+ speed = options.scrollSpeed,
+ winScroller = getWindowScrollingElement();
+ var scrollThisInstance = false,
+ scrollCustomFn; // New scroll root, set scrollEl
+
+ if (scrollRootEl !== rootEl) {
+ scrollRootEl = rootEl;
+ clearAutoScrolls();
+ scrollEl = options.scroll;
+ scrollCustomFn = options.scrollFn;
+
+ if (scrollEl === true) {
+ scrollEl = getParentAutoScrollElement(rootEl, true);
+ }
+ }
+
+ var layersOut = 0;
+ var currentParent = scrollEl;
+
+ do {
+ var el = currentParent,
+ rect = getRect(el),
+ top = rect.top,
+ bottom = rect.bottom,
+ left = rect.left,
+ right = rect.right,
+ width = rect.width,
+ height = rect.height,
+ canScrollX = void 0,
+ canScrollY = void 0,
+ scrollWidth = el.scrollWidth,
+ scrollHeight = el.scrollHeight,
+ elCSS = css(el),
+ scrollPosX = el.scrollLeft,
+ scrollPosY = el.scrollTop;
+
+ if (el === winScroller) {
+ canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');
+ canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');
+ } else {
+ canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');
+ canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');
+ }
+
+ var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);
+ var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);
+
+ if (!autoScrolls[layersOut]) {
+ for (var i = 0; i <= layersOut; i++) {
+ if (!autoScrolls[i]) {
+ autoScrolls[i] = {};
+ }
+ }
+ }
+
+ if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {
+ autoScrolls[layersOut].el = el;
+ autoScrolls[layersOut].vx = vx;
+ autoScrolls[layersOut].vy = vy;
+ clearInterval(autoScrolls[layersOut].pid);
+
+ if (vx != 0 || vy != 0) {
+ scrollThisInstance = true;
+ /* jshint loopfunc:true */
+
+ autoScrolls[layersOut].pid = setInterval(function () {
+ // emulate drag over during autoscroll (fallback), emulating native DnD behaviour
+ if (isFallback && this.layer === 0) {
+ Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely
+
+ }
+
+ var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;
+ var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;
+
+ if (typeof scrollCustomFn === 'function') {
+ if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {
+ return;
+ }
+ }
+
+ scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);
+ }.bind({
+ layer: layersOut
+ }), 24);
+ }
+ }
+
+ layersOut++;
+ } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));
+
+ scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not
+}, 30);
+
+var drop = function drop(_ref) {
+ var originalEvent = _ref.originalEvent,
+ putSortable = _ref.putSortable,
+ dragEl = _ref.dragEl,
+ activeSortable = _ref.activeSortable,
+ dispatchSortableEvent = _ref.dispatchSortableEvent,
+ hideGhostForTarget = _ref.hideGhostForTarget,
+ unhideGhostForTarget = _ref.unhideGhostForTarget;
+ if (!originalEvent) return;
+ var toSortable = putSortable || activeSortable;
+ hideGhostForTarget();
+ var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;
+ var target = document.elementFromPoint(touch.clientX, touch.clientY);
+ unhideGhostForTarget();
+
+ if (toSortable && !toSortable.el.contains(target)) {
+ dispatchSortableEvent('spill');
+ this.onSpill({
+ dragEl: dragEl,
+ putSortable: putSortable
+ });
+ }
+};
+
+function Revert() {}
+
+Revert.prototype = {
+ startIndex: null,
+ dragStart: function dragStart(_ref2) {
+ var oldDraggableIndex = _ref2.oldDraggableIndex;
+ this.startIndex = oldDraggableIndex;
+ },
+ onSpill: function onSpill(_ref3) {
+ var dragEl = _ref3.dragEl,
+ putSortable = _ref3.putSortable;
+ this.sortable.captureAnimationState();
+
+ if (putSortable) {
+ putSortable.captureAnimationState();
+ }
+
+ var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);
+
+ if (nextSibling) {
+ this.sortable.el.insertBefore(dragEl, nextSibling);
+ } else {
+ this.sortable.el.appendChild(dragEl);
+ }
+
+ this.sortable.animateAll();
+
+ if (putSortable) {
+ putSortable.animateAll();
+ }
+ },
+ drop: drop
+};
+
+_extends(Revert, {
+ pluginName: 'revertOnSpill'
+});
+
+function Remove() {}
+
+Remove.prototype = {
+ onSpill: function onSpill(_ref4) {
+ var dragEl = _ref4.dragEl,
+ putSortable = _ref4.putSortable;
+ var parentSortable = putSortable || this.sortable;
+ parentSortable.captureAnimationState();
+ dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);
+ parentSortable.animateAll();
+ },
+ drop: drop
+};
+
+_extends(Remove, {
+ pluginName: 'removeOnSpill'
+});
+
+Sortable.mount(new AutoScrollPlugin());
+Sortable.mount(Remove, Revert);
+
+var RegexEvent;
+(function (RegexEvent) {
+ (function (ParsonsInputAction) {
+ ParsonsInputAction["ADD"] = "add";
+ ParsonsInputAction["MOVE"] = "move";
+ ParsonsInputAction["REMOVE"] = "remove";
+ })(RegexEvent.ParsonsInputAction || (RegexEvent.ParsonsInputAction = {}));
+ (function (RegexCompilationStatus) {
+ RegexCompilationStatus["ERROR"] = "error";
+ RegexCompilationStatus["SUCCESS"] = "success";
+ })(RegexEvent.RegexCompilationStatus || (RegexEvent.RegexCompilationStatus = {}));
+ (function (MatchTriggerType) {
+ MatchTriggerType["MANUAL"] = "manual";
+ MatchTriggerType["AUTO"] = "auto";
+ })(RegexEvent.MatchTriggerType || (RegexEvent.MatchTriggerType = {}));
+ (function (PageStatus) {
+ PageStatus["FOCUS"] = "focus";
+ PageStatus["VISIBILITY"] = "visibility";
+ })(RegexEvent.PageStatus || (RegexEvent.PageStatus = {}));
+})(RegexEvent || (RegexEvent = {}));
+
+class ParsonsInput {
+ // The input element
+ el;
+ _dropArea;
+ _dragArea;
+ _dropSortable;
+ _dragSortable;
+ parentElement;
+ _prevPosition;
+ reusable;
+ randomize;
+ storedSourceBlocks;
+ storedSourceBlockExplanations;
+ // if the input has been initialized once
+ initialized;
+ constructor(parentElement, reusable, randomize) {
+ this.el = document.createElement('div');
+ this.parentElement = parentElement;
+ this.el.id = 'regextool-' + this.parentElement.toolNumber + '-parsons-input';
+ const dragTip = document.createElement('div');
+ dragTip.innerText = 'Drag or click the blocks below to form your code:';
+ dragTip.classList.add('hparsons-tip');
+ this.el.append(dragTip);
+ this._dragArea = document.createElement('div');
+ this.el.appendChild(this._dragArea);
+ this._dragArea.classList.add('drag-area');
+ const dropTip = document.createElement('div');
+ dropTip.innerText = 'Your code (click on a block to remove it):';
+ dropTip.classList.add('hparsons-tip');
+ this.el.append(dropTip);
+ this._dropArea = document.createElement('div');
+ this.el.appendChild(this._dropArea);
+ this._dropArea.classList.add('drop-area');
+ this._prevPosition = -1;
+ this.storedSourceBlocks = [];
+ this.storedSourceBlockExplanations = null;
+ this.reusable = reusable;
+ this.randomize = randomize;
+ this._dragSortable = null;
+ this._dropSortable = null;
+ this._initSortable();
+ this.initialized = false;
+ }
+ getText = () => {
+ let ret = '';
+ if (this._dropArea.hasChildNodes()) {
+ let el = this._dropArea.firstChild;
+ ret += el.innerText.replace(/\xA0/g, ' ');
+ while (el.nextSibling) {
+ el = el.nextSibling;
+ ret += el.innerText.replace(/\xA0/g, ' ');
+ }
+ return ret;
+ }
+ else {
+ return ret;
+ }
+ };
+ // Durstenfeld shuffle
+ shuffleArray(array) {
+ for (let i = array.length - 1; i > 0; i--) {
+ let j = Math.floor(Math.random() * (i + 1));
+ let temp = array[i];
+ array[i] = array[j];
+ array[j] = temp;
+ }
+ }
+ setSourceBlocks = (data, tooltips) => {
+ // shuffle source blocks if randomize
+ if (this.randomize) {
+ let originalData = JSON.stringify(data);
+ this.shuffleArray(data);
+ while (JSON.stringify(data) == originalData) {
+ this.shuffleArray(data);
+ }
+ }
+ this.storedSourceBlocks = data;
+ this.storedSourceBlockExplanations = tooltips;
+ this._resetInput();
+ };
+ // TODO: not efficient enough. should not need to create new elements; simply sorting them should be good.
+ _resetInput = () => {
+ // clearing previous blocks
+ while (this._dragArea.firstChild) {
+ this._dragArea.removeChild(this._dragArea.firstChild);
+ }
+ while (this._dropArea.firstChild) {
+ this._dropArea.removeChild(this._dropArea.firstChild);
+ }
+ // add new blocks
+ for (let i = 0; i < this.storedSourceBlocks.length; ++i) {
+ const newBlock = document.createElement('div');
+ this._dragArea.appendChild(newBlock);
+ if (this.storedSourceBlocks[i] === ' ') {
+ // console.log('here');
+ newBlock.innerHTML = ' ';
+ }
+ else {
+ // console.log(data[i]);
+ newBlock.innerText = this.storedSourceBlocks[i];
+ }
+ newBlock.style.display = 'inline-block';
+ newBlock.classList.add('parsons-block');
+ newBlock.onclick = () => {
+ this._onBlockClicked(newBlock);
+ };
+ }
+ };
+ _onBlockClicked = (block) => {
+ if (block.parentElement == this._dragArea) {
+ let endPosition;
+ if (this.reusable) {
+ const blockCopy = block.cloneNode(true);
+ blockCopy.onclick = () => this._onBlockClicked(blockCopy);
+ this._dropArea.appendChild(blockCopy);
+ endPosition = this._getBlockPosition(blockCopy);
+ }
+ else {
+ this._dropArea.appendChild(block);
+ endPosition = this._getBlockPosition(block);
+ }
+ const inputEvent = {
+ 'event-type': 'parsons-input',
+ action: 'add',
+ position: [-1, endPosition],
+ answer: this._getTextArray(),
+ };
+ this.parentElement.logEvent(inputEvent);
+ }
+ else {
+ const startPosition = this._getBlockPosition(block);
+ if (this.reusable) {
+ this._dropArea.removeChild(block);
+ }
+ else {
+ this._dragArea.appendChild(block);
+ }
+ const inputEvent = {
+ 'event-type': 'parsons-input',
+ action: 'remove',
+ position: [startPosition, -1],
+ answer: this._getTextArray(),
+ };
+ this.parentElement.logEvent(inputEvent);
+ }
+ };
+ _initSortable = () => {
+ if (this.reusable) {
+ this._dragSortable = new Sortable(this._dragArea, {
+ group: {
+ name: 'shared',
+ pull: 'clone',
+ put: false
+ },
+ sort: false,
+ direction: 'horizontal',
+ animation: 150,
+ draggable: '.parsons-block',
+ onClone: (event) => {
+ const newBlock = event.clone;
+ newBlock.onclick = () => this._onBlockClicked(newBlock);
+ }
+ });
+ this._dropSortable = new Sortable(this._dropArea, {
+ group: 'shared',
+ direction: 'horizontal',
+ animation: 150,
+ draggable: '.parsons-block',
+ onAdd: (event) => {
+ const inputEvent = {
+ 'event-type': 'parsons-input',
+ action: 'add',
+ position: [-1, this._getBlockPosition(event.item)],
+ answer: this._getTextArray(),
+ };
+ this.parentElement.logEvent(inputEvent);
+ },
+ onStart: (event) => {
+ this._prevPosition = this._getBlockPosition(event.item);
+ },
+ onEnd: (event) => {
+ let endposition;
+ let action = 'move';
+ const upperbound = this._dropArea.getBoundingClientRect().top;
+ const lowerbound = this._dropArea.getBoundingClientRect().bottom;
+ if (event.originalEvent.clientY > lowerbound || event.originalEvent.clientY < upperbound) {
+ const item = event.item;
+ if (item.parentNode) {
+ item.parentNode.removeChild(item);
+ }
+ endposition = -1;
+ action = 'remove';
+ }
+ else {
+ endposition = this._getBlockPosition(event.item);
+ }
+ const inputEvent = {
+ 'event-type': 'parsons-input',
+ action: action,
+ position: [this._prevPosition, endposition],
+ answer: this._getTextArray(),
+ };
+ this.parentElement.logEvent(inputEvent);
+ },
+ });
+ }
+ else {
+ this._dragSortable = new Sortable(this._dragArea, {
+ group: {
+ name: 'shared',
+ // pull: 'clone',
+ // put: false
+ },
+ // sort: false,
+ direction: 'horizontal',
+ animation: 150,
+ draggable: '.parsons-block',
+ });
+ this._dropSortable = new Sortable(this._dropArea, {
+ group: 'shared',
+ direction: 'horizontal',
+ animation: 150,
+ draggable: '.parsons-block',
+ onAdd: (event) => {
+ const inputEvent = {
+ 'event-type': 'parsons-input',
+ action: 'add',
+ position: [-1, this._getBlockPosition(event.item)],
+ answer: this._getTextArray(),
+ };
+ this.parentElement.logEvent(inputEvent);
+ },
+ onStart: (event) => {
+ this._prevPosition = this._getBlockPosition(event.item);
+ },
+ onEnd: (event) => {
+ let endposition = this._getBlockPosition(event.item);
+ const action = endposition == -1 ? 'remove' : 'move';
+ const inputEvent = {
+ 'event-type': 'parsons-input',
+ action: action,
+ position: [this._prevPosition, endposition],
+ answer: this._getTextArray(),
+ };
+ this.parentElement.logEvent(inputEvent);
+ },
+ });
+ }
+ };
+ updateTestStatus = (result) => {
+ if (this._dropArea.classList.contains(result)) {
+ return;
+ }
+ if (this._dropArea.classList.contains('Pass')) {
+ this._dropArea.classList.remove('Pass');
+ }
+ else if (this._dropArea.classList.contains('Fail')) {
+ this._dropArea.classList.remove('Fail');
+ }
+ else if (this._dropArea.classList.contains('Error')) {
+ this._dropArea.classList.remove('Error');
+ }
+ this._dropArea.classList.add(result);
+ };
+ _getBlockPosition = (block) => {
+ let position = -1;
+ const parent = this._dropArea;
+ if (parent) {
+ for (position = 0; position < parent.childNodes.length; ++position) {
+ if (parent.childNodes[position] === block) {
+ break;
+ }
+ }
+ }
+ return position;
+ };
+ _getTextArray = () => {
+ let answer = [];
+ if (this._dropArea.hasChildNodes()) {
+ let el = this._dropArea.firstChild;
+ answer.push(el.innerText);
+ while (el.nextSibling) {
+ el = el.nextSibling;
+ answer.push(el.innerText);
+ }
+ }
+ return answer;
+ };
+ highlightError = (position) => {
+ // console.log(position);
+ let count = 0;
+ if (this._dropArea.hasChildNodes()) {
+ let el = this._dropArea.firstChild;
+ count += el.innerText.length;
+ if (count >= position) {
+ // the current block contains the symbol with error
+ el.style.backgroundColor = '#ff99b3';
+ }
+ else {
+ while (el.nextSibling) {
+ el = el.nextSibling;
+ count += el.innerText.length;
+ if (count >= position) {
+ // the current block contains the symbol with error
+ el.style.backgroundColor = '#ff99b3';
+ break;
+ }
+ }
+ }
+ }
+ };
+ removeFormat = () => {
+ if (this._dropArea.hasChildNodes()) {
+ let el = this._dropArea.firstChild;
+ el.style.removeProperty('background-color');
+ while (el.nextSibling) {
+ el = el.nextSibling;
+ el.style.removeProperty('background-color');
+ }
+ }
+ };
+ resetInput = () => {
+ if (this.reusable) {
+ while (this._dropArea.firstChild) {
+ this._dropArea.removeChild(this._dropArea.firstChild);
+ }
+ }
+ else {
+ this._resetInput();
+ }
+ };
+ // TODO: not used for now, not sure if is working correctly
+ restoreAnswer(type, answer) {
+ if (type != 'parsons' || !Array.isArray(answer)) {
+ return;
+ }
+ this._dropArea.innerHTML = '';
+ for (let i = 0; i < answer.length; ++i) {
+ if (typeof answer[i] === 'string') {
+ const newBlock = document.createElement('div');
+ this._dropArea.appendChild(newBlock);
+ newBlock.innerText = answer[i];
+ newBlock.style.display = 'inline-block';
+ newBlock.classList.add('parsons-block');
+ newBlock.onclick = () => {
+ // clicking the new block generated by clicking an extendable block to remove that block
+ // console.log('expandable new block onclick')
+ const endPosition = this._getBlockPosition(newBlock);
+ newBlock.parentNode?.removeChild(newBlock);
+ if (this.parentElement) {
+ this.parentElement.temporaryInputEvent = {
+ 'event-type': 'parsons-input',
+ action: RegexEvent.ParsonsInputAction.REMOVE,
+ position: [endPosition, -1],
+ answer: this._getTextArray()
+ };
+ }
+ };
+ this.el.dispatchEvent(new Event('codeChanged'));
+ }
+ }
+ }
+}
+
+var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+function getDefaultExportFromCjs (x) {
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
+}
+
+function createCommonjsModule(fn) {
+ var module = { exports: {} };
+ return fn(module, module.exports), module.exports;
+}
+
+/*!
+ * Quill Editor v1.3.7
+ * https://quilljs.com/
+ * Copyright (c) 2014, Jason Chen
+ * Copyright (c) 2013, salesforce.com
+ */
+
+var quill = createCommonjsModule(function (module, exports) {
+(function webpackUniversalModuleDefinition(root, factory) {
+ module.exports = factory();
+})(typeof self !== 'undefined' ? self : commonjsGlobal, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 109);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var container_1 = __webpack_require__(17);
+var format_1 = __webpack_require__(18);
+var leaf_1 = __webpack_require__(19);
+var scroll_1 = __webpack_require__(45);
+var inline_1 = __webpack_require__(46);
+var block_1 = __webpack_require__(47);
+var embed_1 = __webpack_require__(48);
+var text_1 = __webpack_require__(49);
+var attributor_1 = __webpack_require__(12);
+var class_1 = __webpack_require__(32);
+var style_1 = __webpack_require__(33);
+var store_1 = __webpack_require__(31);
+var Registry = __webpack_require__(1);
+var Parchment = {
+ Scope: Registry.Scope,
+ create: Registry.create,
+ find: Registry.find,
+ query: Registry.query,
+ register: Registry.register,
+ Container: container_1.default,
+ Format: format_1.default,
+ Leaf: leaf_1.default,
+ Embed: embed_1.default,
+ Scroll: scroll_1.default,
+ Block: block_1.default,
+ Inline: inline_1.default,
+ Text: text_1.default,
+ Attributor: {
+ Attribute: attributor_1.default,
+ Class: class_1.default,
+ Style: style_1.default,
+ Store: store_1.default,
+ },
+};
+exports.default = Parchment;
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var ParchmentError = /** @class */ (function (_super) {
+ __extends(ParchmentError, _super);
+ function ParchmentError(message) {
+ var _this = this;
+ message = '[Parchment] ' + message;
+ _this = _super.call(this, message) || this;
+ _this.message = message;
+ _this.name = _this.constructor.name;
+ return _this;
+ }
+ return ParchmentError;
+}(Error));
+exports.ParchmentError = ParchmentError;
+var attributes = {};
+var classes = {};
+var tags = {};
+var types = {};
+exports.DATA_KEY = '__blot';
+var Scope;
+(function (Scope) {
+ Scope[Scope["TYPE"] = 3] = "TYPE";
+ Scope[Scope["LEVEL"] = 12] = "LEVEL";
+ Scope[Scope["ATTRIBUTE"] = 13] = "ATTRIBUTE";
+ Scope[Scope["BLOT"] = 14] = "BLOT";
+ Scope[Scope["INLINE"] = 7] = "INLINE";
+ Scope[Scope["BLOCK"] = 11] = "BLOCK";
+ Scope[Scope["BLOCK_BLOT"] = 10] = "BLOCK_BLOT";
+ Scope[Scope["INLINE_BLOT"] = 6] = "INLINE_BLOT";
+ Scope[Scope["BLOCK_ATTRIBUTE"] = 9] = "BLOCK_ATTRIBUTE";
+ Scope[Scope["INLINE_ATTRIBUTE"] = 5] = "INLINE_ATTRIBUTE";
+ Scope[Scope["ANY"] = 15] = "ANY";
+})(Scope = exports.Scope || (exports.Scope = {}));
+function create(input, value) {
+ var match = query(input);
+ if (match == null) {
+ throw new ParchmentError("Unable to create " + input + " blot");
+ }
+ var BlotClass = match;
+ var node =
+ // @ts-ignore
+ input instanceof Node || input['nodeType'] === Node.TEXT_NODE ? input : BlotClass.create(value);
+ return new BlotClass(node, value);
+}
+exports.create = create;
+function find(node, bubble) {
+ if (bubble === void 0) { bubble = false; }
+ if (node == null)
+ return null;
+ // @ts-ignore
+ if (node[exports.DATA_KEY] != null)
+ return node[exports.DATA_KEY].blot;
+ if (bubble)
+ return find(node.parentNode, bubble);
+ return null;
+}
+exports.find = find;
+function query(query, scope) {
+ if (scope === void 0) { scope = Scope.ANY; }
+ var match;
+ if (typeof query === 'string') {
+ match = types[query] || attributes[query];
+ // @ts-ignore
+ }
+ else if (query instanceof Text || query['nodeType'] === Node.TEXT_NODE) {
+ match = types['text'];
+ }
+ else if (typeof query === 'number') {
+ if (query & Scope.LEVEL & Scope.BLOCK) {
+ match = types['block'];
+ }
+ else if (query & Scope.LEVEL & Scope.INLINE) {
+ match = types['inline'];
+ }
+ }
+ else if (query instanceof HTMLElement) {
+ var names = (query.getAttribute('class') || '').split(/\s+/);
+ for (var i in names) {
+ match = classes[names[i]];
+ if (match)
+ break;
+ }
+ match = match || tags[query.tagName];
+ }
+ if (match == null)
+ return null;
+ // @ts-ignore
+ if (scope & Scope.LEVEL & match.scope && scope & Scope.TYPE & match.scope)
+ return match;
+ return null;
+}
+exports.query = query;
+function register() {
+ var Definitions = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ Definitions[_i] = arguments[_i];
+ }
+ if (Definitions.length > 1) {
+ return Definitions.map(function (d) {
+ return register(d);
+ });
+ }
+ var Definition = Definitions[0];
+ if (typeof Definition.blotName !== 'string' && typeof Definition.attrName !== 'string') {
+ throw new ParchmentError('Invalid definition');
+ }
+ else if (Definition.blotName === 'abstract') {
+ throw new ParchmentError('Cannot register abstract class');
+ }
+ types[Definition.blotName || Definition.attrName] = Definition;
+ if (typeof Definition.keyName === 'string') {
+ attributes[Definition.keyName] = Definition;
+ }
+ else {
+ if (Definition.className != null) {
+ classes[Definition.className] = Definition;
+ }
+ if (Definition.tagName != null) {
+ if (Array.isArray(Definition.tagName)) {
+ Definition.tagName = Definition.tagName.map(function (tagName) {
+ return tagName.toUpperCase();
+ });
+ }
+ else {
+ Definition.tagName = Definition.tagName.toUpperCase();
+ }
+ var tagNames = Array.isArray(Definition.tagName) ? Definition.tagName : [Definition.tagName];
+ tagNames.forEach(function (tag) {
+ if (tags[tag] == null || Definition.className == null) {
+ tags[tag] = Definition;
+ }
+ });
+ }
+ }
+ return Definition;
+}
+exports.register = register;
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var diff = __webpack_require__(51);
+var equal = __webpack_require__(11);
+var extend = __webpack_require__(3);
+var op = __webpack_require__(20);
+
+
+var NULL_CHARACTER = String.fromCharCode(0); // Placeholder char for embed in diff()
+
+
+var Delta = function (ops) {
+ // Assume we are given a well formed ops
+ if (Array.isArray(ops)) {
+ this.ops = ops;
+ } else if (ops != null && Array.isArray(ops.ops)) {
+ this.ops = ops.ops;
+ } else {
+ this.ops = [];
+ }
+};
+
+
+Delta.prototype.insert = function (text, attributes) {
+ var newOp = {};
+ if (text.length === 0) return this;
+ newOp.insert = text;
+ if (attributes != null && typeof attributes === 'object' && Object.keys(attributes).length > 0) {
+ newOp.attributes = attributes;
+ }
+ return this.push(newOp);
+};
+
+Delta.prototype['delete'] = function (length) {
+ if (length <= 0) return this;
+ return this.push({ 'delete': length });
+};
+
+Delta.prototype.retain = function (length, attributes) {
+ if (length <= 0) return this;
+ var newOp = { retain: length };
+ if (attributes != null && typeof attributes === 'object' && Object.keys(attributes).length > 0) {
+ newOp.attributes = attributes;
+ }
+ return this.push(newOp);
+};
+
+Delta.prototype.push = function (newOp) {
+ var index = this.ops.length;
+ var lastOp = this.ops[index - 1];
+ newOp = extend(true, {}, newOp);
+ if (typeof lastOp === 'object') {
+ if (typeof newOp['delete'] === 'number' && typeof lastOp['delete'] === 'number') {
+ this.ops[index - 1] = { 'delete': lastOp['delete'] + newOp['delete'] };
+ return this;
+ }
+ // Since it does not matter if we insert before or after deleting at the same index,
+ // always prefer to insert first
+ if (typeof lastOp['delete'] === 'number' && newOp.insert != null) {
+ index -= 1;
+ lastOp = this.ops[index - 1];
+ if (typeof lastOp !== 'object') {
+ this.ops.unshift(newOp);
+ return this;
+ }
+ }
+ if (equal(newOp.attributes, lastOp.attributes)) {
+ if (typeof newOp.insert === 'string' && typeof lastOp.insert === 'string') {
+ this.ops[index - 1] = { insert: lastOp.insert + newOp.insert };
+ if (typeof newOp.attributes === 'object') this.ops[index - 1].attributes = newOp.attributes;
+ return this;
+ } else if (typeof newOp.retain === 'number' && typeof lastOp.retain === 'number') {
+ this.ops[index - 1] = { retain: lastOp.retain + newOp.retain };
+ if (typeof newOp.attributes === 'object') this.ops[index - 1].attributes = newOp.attributes;
+ return this;
+ }
+ }
+ }
+ if (index === this.ops.length) {
+ this.ops.push(newOp);
+ } else {
+ this.ops.splice(index, 0, newOp);
+ }
+ return this;
+};
+
+Delta.prototype.chop = function () {
+ var lastOp = this.ops[this.ops.length - 1];
+ if (lastOp && lastOp.retain && !lastOp.attributes) {
+ this.ops.pop();
+ }
+ return this;
+};
+
+Delta.prototype.filter = function (predicate) {
+ return this.ops.filter(predicate);
+};
+
+Delta.prototype.forEach = function (predicate) {
+ this.ops.forEach(predicate);
+};
+
+Delta.prototype.map = function (predicate) {
+ return this.ops.map(predicate);
+};
+
+Delta.prototype.partition = function (predicate) {
+ var passed = [], failed = [];
+ this.forEach(function(op) {
+ var target = predicate(op) ? passed : failed;
+ target.push(op);
+ });
+ return [passed, failed];
+};
+
+Delta.prototype.reduce = function (predicate, initial) {
+ return this.ops.reduce(predicate, initial);
+};
+
+Delta.prototype.changeLength = function () {
+ return this.reduce(function (length, elem) {
+ if (elem.insert) {
+ return length + op.length(elem);
+ } else if (elem.delete) {
+ return length - elem.delete;
+ }
+ return length;
+ }, 0);
+};
+
+Delta.prototype.length = function () {
+ return this.reduce(function (length, elem) {
+ return length + op.length(elem);
+ }, 0);
+};
+
+Delta.prototype.slice = function (start, end) {
+ start = start || 0;
+ if (typeof end !== 'number') end = Infinity;
+ var ops = [];
+ var iter = op.iterator(this.ops);
+ var index = 0;
+ while (index < end && iter.hasNext()) {
+ var nextOp;
+ if (index < start) {
+ nextOp = iter.next(start - index);
+ } else {
+ nextOp = iter.next(end - index);
+ ops.push(nextOp);
+ }
+ index += op.length(nextOp);
+ }
+ return new Delta(ops);
+};
+
+
+Delta.prototype.compose = function (other) {
+ var thisIter = op.iterator(this.ops);
+ var otherIter = op.iterator(other.ops);
+ var ops = [];
+ var firstOther = otherIter.peek();
+ if (firstOther != null && typeof firstOther.retain === 'number' && firstOther.attributes == null) {
+ var firstLeft = firstOther.retain;
+ while (thisIter.peekType() === 'insert' && thisIter.peekLength() <= firstLeft) {
+ firstLeft -= thisIter.peekLength();
+ ops.push(thisIter.next());
+ }
+ if (firstOther.retain - firstLeft > 0) {
+ otherIter.next(firstOther.retain - firstLeft);
+ }
+ }
+ var delta = new Delta(ops);
+ while (thisIter.hasNext() || otherIter.hasNext()) {
+ if (otherIter.peekType() === 'insert') {
+ delta.push(otherIter.next());
+ } else if (thisIter.peekType() === 'delete') {
+ delta.push(thisIter.next());
+ } else {
+ var length = Math.min(thisIter.peekLength(), otherIter.peekLength());
+ var thisOp = thisIter.next(length);
+ var otherOp = otherIter.next(length);
+ if (typeof otherOp.retain === 'number') {
+ var newOp = {};
+ if (typeof thisOp.retain === 'number') {
+ newOp.retain = length;
+ } else {
+ newOp.insert = thisOp.insert;
+ }
+ // Preserve null when composing with a retain, otherwise remove it for inserts
+ var attributes = op.attributes.compose(thisOp.attributes, otherOp.attributes, typeof thisOp.retain === 'number');
+ if (attributes) newOp.attributes = attributes;
+ delta.push(newOp);
+
+ // Optimization if rest of other is just retain
+ if (!otherIter.hasNext() && equal(delta.ops[delta.ops.length - 1], newOp)) {
+ var rest = new Delta(thisIter.rest());
+ return delta.concat(rest).chop();
+ }
+
+ // Other op should be delete, we could be an insert or retain
+ // Insert + delete cancels out
+ } else if (typeof otherOp['delete'] === 'number' && typeof thisOp.retain === 'number') {
+ delta.push(otherOp);
+ }
+ }
+ }
+ return delta.chop();
+};
+
+Delta.prototype.concat = function (other) {
+ var delta = new Delta(this.ops.slice());
+ if (other.ops.length > 0) {
+ delta.push(other.ops[0]);
+ delta.ops = delta.ops.concat(other.ops.slice(1));
+ }
+ return delta;
+};
+
+Delta.prototype.diff = function (other, index) {
+ if (this.ops === other.ops) {
+ return new Delta();
+ }
+ var strings = [this, other].map(function (delta) {
+ return delta.map(function (op) {
+ if (op.insert != null) {
+ return typeof op.insert === 'string' ? op.insert : NULL_CHARACTER;
+ }
+ var prep = (delta === other) ? 'on' : 'with';
+ throw new Error('diff() called ' + prep + ' non-document');
+ }).join('');
+ });
+ var delta = new Delta();
+ var diffResult = diff(strings[0], strings[1], index);
+ var thisIter = op.iterator(this.ops);
+ var otherIter = op.iterator(other.ops);
+ diffResult.forEach(function (component) {
+ var length = component[1].length;
+ while (length > 0) {
+ var opLength = 0;
+ switch (component[0]) {
+ case diff.INSERT:
+ opLength = Math.min(otherIter.peekLength(), length);
+ delta.push(otherIter.next(opLength));
+ break;
+ case diff.DELETE:
+ opLength = Math.min(length, thisIter.peekLength());
+ thisIter.next(opLength);
+ delta['delete'](opLength);
+ break;
+ case diff.EQUAL:
+ opLength = Math.min(thisIter.peekLength(), otherIter.peekLength(), length);
+ var thisOp = thisIter.next(opLength);
+ var otherOp = otherIter.next(opLength);
+ if (equal(thisOp.insert, otherOp.insert)) {
+ delta.retain(opLength, op.attributes.diff(thisOp.attributes, otherOp.attributes));
+ } else {
+ delta.push(otherOp)['delete'](opLength);
+ }
+ break;
+ }
+ length -= opLength;
+ }
+ });
+ return delta.chop();
+};
+
+Delta.prototype.eachLine = function (predicate, newline) {
+ newline = newline || '\n';
+ var iter = op.iterator(this.ops);
+ var line = new Delta();
+ var i = 0;
+ while (iter.hasNext()) {
+ if (iter.peekType() !== 'insert') return;
+ var thisOp = iter.peek();
+ var start = op.length(thisOp) - iter.peekLength();
+ var index = typeof thisOp.insert === 'string' ?
+ thisOp.insert.indexOf(newline, start) - start : -1;
+ if (index < 0) {
+ line.push(iter.next());
+ } else if (index > 0) {
+ line.push(iter.next(index));
+ } else {
+ if (predicate(line, iter.next(1).attributes || {}, i) === false) {
+ return;
+ }
+ i += 1;
+ line = new Delta();
+ }
+ }
+ if (line.length() > 0) {
+ predicate(line, {}, i);
+ }
+};
+
+Delta.prototype.transform = function (other, priority) {
+ priority = !!priority;
+ if (typeof other === 'number') {
+ return this.transformPosition(other, priority);
+ }
+ var thisIter = op.iterator(this.ops);
+ var otherIter = op.iterator(other.ops);
+ var delta = new Delta();
+ while (thisIter.hasNext() || otherIter.hasNext()) {
+ if (thisIter.peekType() === 'insert' && (priority || otherIter.peekType() !== 'insert')) {
+ delta.retain(op.length(thisIter.next()));
+ } else if (otherIter.peekType() === 'insert') {
+ delta.push(otherIter.next());
+ } else {
+ var length = Math.min(thisIter.peekLength(), otherIter.peekLength());
+ var thisOp = thisIter.next(length);
+ var otherOp = otherIter.next(length);
+ if (thisOp['delete']) {
+ // Our delete either makes their delete redundant or removes their retain
+ continue;
+ } else if (otherOp['delete']) {
+ delta.push(otherOp);
+ } else {
+ // We retain either their retain or insert
+ delta.retain(length, op.attributes.transform(thisOp.attributes, otherOp.attributes, priority));
+ }
+ }
+ }
+ return delta.chop();
+};
+
+Delta.prototype.transformPosition = function (index, priority) {
+ priority = !!priority;
+ var thisIter = op.iterator(this.ops);
+ var offset = 0;
+ while (thisIter.hasNext() && offset <= index) {
+ var length = thisIter.peekLength();
+ var nextType = thisIter.peekType();
+ thisIter.next();
+ if (nextType === 'delete') {
+ index -= Math.min(length, index - offset);
+ continue;
+ } else if (nextType === 'insert' && (offset < index || !priority)) {
+ index += length;
+ }
+ offset += length;
+ }
+ return index;
+};
+
+
+module.exports = Delta;
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports) {
+
+var hasOwn = Object.prototype.hasOwnProperty;
+var toStr = Object.prototype.toString;
+var defineProperty = Object.defineProperty;
+var gOPD = Object.getOwnPropertyDescriptor;
+
+var isArray = function isArray(arr) {
+ if (typeof Array.isArray === 'function') {
+ return Array.isArray(arr);
+ }
+
+ return toStr.call(arr) === '[object Array]';
+};
+
+var isPlainObject = function isPlainObject(obj) {
+ if (!obj || toStr.call(obj) !== '[object Object]') {
+ return false;
+ }
+
+ var hasOwnConstructor = hasOwn.call(obj, 'constructor');
+ var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');
+ // Not own constructor property must be Object
+ if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {
+ return false;
+ }
+
+ // Own properties are enumerated firstly, so to speed up,
+ // if last one is own, then all properties are own.
+ var key;
+ for (key in obj) { /**/ }
+
+ return typeof key === 'undefined' || hasOwn.call(obj, key);
+};
+
+// If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target
+var setProperty = function setProperty(target, options) {
+ if (defineProperty && options.name === '__proto__') {
+ defineProperty(target, options.name, {
+ enumerable: true,
+ configurable: true,
+ value: options.newValue,
+ writable: true
+ });
+ } else {
+ target[options.name] = options.newValue;
+ }
+};
+
+// Return undefined instead of __proto__ if '__proto__' is not an own property
+var getProperty = function getProperty(obj, name) {
+ if (name === '__proto__') {
+ if (!hasOwn.call(obj, name)) {
+ return void 0;
+ } else if (gOPD) {
+ // In early versions of node, obj['__proto__'] is buggy when obj has
+ // __proto__ as an own property. Object.getOwnPropertyDescriptor() works.
+ return gOPD(obj, name).value;
+ }
+ }
+
+ return obj[name];
+};
+
+module.exports = function extend() {
+ var options, name, src, copy, copyIsArray, clone;
+ var target = arguments[0];
+ var i = 1;
+ var length = arguments.length;
+ var deep = false;
+
+ // Handle a deep copy situation
+ if (typeof target === 'boolean') {
+ deep = target;
+ target = arguments[1] || {};
+ // skip the boolean and the target
+ i = 2;
+ }
+ if (target == null || (typeof target !== 'object' && typeof target !== 'function')) {
+ target = {};
+ }
+
+ for (; i < length; ++i) {
+ options = arguments[i];
+ // Only deal with non-null/undefined values
+ if (options != null) {
+ // Extend the base object
+ for (name in options) {
+ src = getProperty(target, name);
+ copy = getProperty(options, name);
+
+ // Prevent never-ending loop
+ if (target !== copy) {
+ // Recurse if we're merging plain objects or arrays
+ if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {
+ if (copyIsArray) {
+ copyIsArray = false;
+ clone = src && isArray(src) ? src : [];
+ } else {
+ clone = src && isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ setProperty(target, { name: name, newValue: extend(deep, clone, copy) });
+
+ // Don't bring in undefined values
+ } else if (typeof copy !== 'undefined') {
+ setProperty(target, { name: name, newValue: copy });
+ }
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = exports.BlockEmbed = exports.bubbleFormats = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _extend = __webpack_require__(3);
+
+var _extend2 = _interopRequireDefault(_extend);
+
+var _quillDelta = __webpack_require__(2);
+
+var _quillDelta2 = _interopRequireDefault(_quillDelta);
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _break = __webpack_require__(16);
+
+var _break2 = _interopRequireDefault(_break);
+
+var _inline = __webpack_require__(6);
+
+var _inline2 = _interopRequireDefault(_inline);
+
+var _text = __webpack_require__(7);
+
+var _text2 = _interopRequireDefault(_text);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var NEWLINE_LENGTH = 1;
+
+var BlockEmbed = function (_Parchment$Embed) {
+ _inherits(BlockEmbed, _Parchment$Embed);
+
+ function BlockEmbed() {
+ _classCallCheck(this, BlockEmbed);
+
+ return _possibleConstructorReturn(this, (BlockEmbed.__proto__ || Object.getPrototypeOf(BlockEmbed)).apply(this, arguments));
+ }
+
+ _createClass(BlockEmbed, [{
+ key: 'attach',
+ value: function attach() {
+ _get(BlockEmbed.prototype.__proto__ || Object.getPrototypeOf(BlockEmbed.prototype), 'attach', this).call(this);
+ this.attributes = new _parchment2.default.Attributor.Store(this.domNode);
+ }
+ }, {
+ key: 'delta',
+ value: function delta() {
+ return new _quillDelta2.default().insert(this.value(), (0, _extend2.default)(this.formats(), this.attributes.values()));
+ }
+ }, {
+ key: 'format',
+ value: function format(name, value) {
+ var attribute = _parchment2.default.query(name, _parchment2.default.Scope.BLOCK_ATTRIBUTE);
+ if (attribute != null) {
+ this.attributes.attribute(attribute, value);
+ }
+ }
+ }, {
+ key: 'formatAt',
+ value: function formatAt(index, length, name, value) {
+ this.format(name, value);
+ }
+ }, {
+ key: 'insertAt',
+ value: function insertAt(index, value, def) {
+ if (typeof value === 'string' && value.endsWith('\n')) {
+ var block = _parchment2.default.create(Block.blotName);
+ this.parent.insertBefore(block, index === 0 ? this : this.next);
+ block.insertAt(0, value.slice(0, -1));
+ } else {
+ _get(BlockEmbed.prototype.__proto__ || Object.getPrototypeOf(BlockEmbed.prototype), 'insertAt', this).call(this, index, value, def);
+ }
+ }
+ }]);
+
+ return BlockEmbed;
+}(_parchment2.default.Embed);
+
+BlockEmbed.scope = _parchment2.default.Scope.BLOCK_BLOT;
+// It is important for cursor behavior BlockEmbeds use tags that are block level elements
+
+
+var Block = function (_Parchment$Block) {
+ _inherits(Block, _Parchment$Block);
+
+ function Block(domNode) {
+ _classCallCheck(this, Block);
+
+ var _this2 = _possibleConstructorReturn(this, (Block.__proto__ || Object.getPrototypeOf(Block)).call(this, domNode));
+
+ _this2.cache = {};
+ return _this2;
+ }
+
+ _createClass(Block, [{
+ key: 'delta',
+ value: function delta() {
+ if (this.cache.delta == null) {
+ this.cache.delta = this.descendants(_parchment2.default.Leaf).reduce(function (delta, leaf) {
+ if (leaf.length() === 0) {
+ return delta;
+ } else {
+ return delta.insert(leaf.value(), bubbleFormats(leaf));
+ }
+ }, new _quillDelta2.default()).insert('\n', bubbleFormats(this));
+ }
+ return this.cache.delta;
+ }
+ }, {
+ key: 'deleteAt',
+ value: function deleteAt(index, length) {
+ _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'deleteAt', this).call(this, index, length);
+ this.cache = {};
+ }
+ }, {
+ key: 'formatAt',
+ value: function formatAt(index, length, name, value) {
+ if (length <= 0) return;
+ if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK)) {
+ if (index + length === this.length()) {
+ this.format(name, value);
+ }
+ } else {
+ _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'formatAt', this).call(this, index, Math.min(length, this.length() - index - 1), name, value);
+ }
+ this.cache = {};
+ }
+ }, {
+ key: 'insertAt',
+ value: function insertAt(index, value, def) {
+ if (def != null) return _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertAt', this).call(this, index, value, def);
+ if (value.length === 0) return;
+ var lines = value.split('\n');
+ var text = lines.shift();
+ if (text.length > 0) {
+ if (index < this.length() - 1 || this.children.tail == null) {
+ _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertAt', this).call(this, Math.min(index, this.length() - 1), text);
+ } else {
+ this.children.tail.insertAt(this.children.tail.length(), text);
+ }
+ this.cache = {};
+ }
+ var block = this;
+ lines.reduce(function (index, line) {
+ block = block.split(index, true);
+ block.insertAt(0, line);
+ return line.length;
+ }, index + text.length);
+ }
+ }, {
+ key: 'insertBefore',
+ value: function insertBefore(blot, ref) {
+ var head = this.children.head;
+ _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertBefore', this).call(this, blot, ref);
+ if (head instanceof _break2.default) {
+ head.remove();
+ }
+ this.cache = {};
+ }
+ }, {
+ key: 'length',
+ value: function length() {
+ if (this.cache.length == null) {
+ this.cache.length = _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'length', this).call(this) + NEWLINE_LENGTH;
+ }
+ return this.cache.length;
+ }
+ }, {
+ key: 'moveChildren',
+ value: function moveChildren(target, ref) {
+ _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'moveChildren', this).call(this, target, ref);
+ this.cache = {};
+ }
+ }, {
+ key: 'optimize',
+ value: function optimize(context) {
+ _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'optimize', this).call(this, context);
+ this.cache = {};
+ }
+ }, {
+ key: 'path',
+ value: function path(index) {
+ return _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'path', this).call(this, index, true);
+ }
+ }, {
+ key: 'removeChild',
+ value: function removeChild(child) {
+ _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'removeChild', this).call(this, child);
+ this.cache = {};
+ }
+ }, {
+ key: 'split',
+ value: function split(index) {
+ var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ if (force && (index === 0 || index >= this.length() - NEWLINE_LENGTH)) {
+ var clone = this.clone();
+ if (index === 0) {
+ this.parent.insertBefore(clone, this);
+ return this;
+ } else {
+ this.parent.insertBefore(clone, this.next);
+ return clone;
+ }
+ } else {
+ var next = _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'split', this).call(this, index, force);
+ this.cache = {};
+ return next;
+ }
+ }
+ }]);
+
+ return Block;
+}(_parchment2.default.Block);
+
+Block.blotName = 'block';
+Block.tagName = 'P';
+Block.defaultChild = 'break';
+Block.allowedChildren = [_inline2.default, _parchment2.default.Embed, _text2.default];
+
+function bubbleFormats(blot) {
+ var formats = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ if (blot == null) return formats;
+ if (typeof blot.formats === 'function') {
+ formats = (0, _extend2.default)(formats, blot.formats());
+ }
+ if (blot.parent == null || blot.parent.blotName == 'scroll' || blot.parent.statics.scope !== blot.statics.scope) {
+ return formats;
+ }
+ return bubbleFormats(blot.parent, formats);
+}
+
+exports.bubbleFormats = bubbleFormats;
+exports.BlockEmbed = BlockEmbed;
+exports.default = Block;
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = exports.overload = exports.expandConfig = undefined;
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+__webpack_require__(50);
+
+var _quillDelta = __webpack_require__(2);
+
+var _quillDelta2 = _interopRequireDefault(_quillDelta);
+
+var _editor = __webpack_require__(14);
+
+var _editor2 = _interopRequireDefault(_editor);
+
+var _emitter3 = __webpack_require__(8);
+
+var _emitter4 = _interopRequireDefault(_emitter3);
+
+var _module = __webpack_require__(9);
+
+var _module2 = _interopRequireDefault(_module);
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _selection = __webpack_require__(15);
+
+var _selection2 = _interopRequireDefault(_selection);
+
+var _extend = __webpack_require__(3);
+
+var _extend2 = _interopRequireDefault(_extend);
+
+var _logger = __webpack_require__(10);
+
+var _logger2 = _interopRequireDefault(_logger);
+
+var _theme = __webpack_require__(34);
+
+var _theme2 = _interopRequireDefault(_theme);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var debug = (0, _logger2.default)('quill');
+
+var Quill = function () {
+ _createClass(Quill, null, [{
+ key: 'debug',
+ value: function debug(limit) {
+ if (limit === true) {
+ limit = 'log';
+ }
+ _logger2.default.level(limit);
+ }
+ }, {
+ key: 'find',
+ value: function find(node) {
+ return node.__quill || _parchment2.default.find(node);
+ }
+ }, {
+ key: 'import',
+ value: function _import(name) {
+ if (this.imports[name] == null) {
+ debug.error('Cannot import ' + name + '. Are you sure it was registered?');
+ }
+ return this.imports[name];
+ }
+ }, {
+ key: 'register',
+ value: function register(path, target) {
+ var _this = this;
+
+ var overwrite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+ if (typeof path !== 'string') {
+ var name = path.attrName || path.blotName;
+ if (typeof name === 'string') {
+ // register(Blot | Attributor, overwrite)
+ this.register('formats/' + name, path, target);
+ } else {
+ Object.keys(path).forEach(function (key) {
+ _this.register(key, path[key], target);
+ });
+ }
+ } else {
+ if (this.imports[path] != null && !overwrite) {
+ debug.warn('Overwriting ' + path + ' with', target);
+ }
+ this.imports[path] = target;
+ if ((path.startsWith('blots/') || path.startsWith('formats/')) && target.blotName !== 'abstract') {
+ _parchment2.default.register(target);
+ } else if (path.startsWith('modules') && typeof target.register === 'function') {
+ target.register();
+ }
+ }
+ }
+ }]);
+
+ function Quill(container) {
+ var _this2 = this;
+
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ _classCallCheck(this, Quill);
+
+ this.options = expandConfig(container, options);
+ this.container = this.options.container;
+ if (this.container == null) {
+ return debug.error('Invalid Quill container', container);
+ }
+ if (this.options.debug) {
+ Quill.debug(this.options.debug);
+ }
+ var html = this.container.innerHTML.trim();
+ this.container.classList.add('ql-container');
+ this.container.innerHTML = '';
+ this.container.__quill = this;
+ this.root = this.addContainer('ql-editor');
+ this.root.classList.add('ql-blank');
+ this.root.setAttribute('data-gramm', false);
+ this.scrollingContainer = this.options.scrollingContainer || this.root;
+ this.emitter = new _emitter4.default();
+ this.scroll = _parchment2.default.create(this.root, {
+ emitter: this.emitter,
+ whitelist: this.options.formats
+ });
+ this.editor = new _editor2.default(this.scroll);
+ this.selection = new _selection2.default(this.scroll, this.emitter);
+ this.theme = new this.options.theme(this, this.options);
+ this.keyboard = this.theme.addModule('keyboard');
+ this.clipboard = this.theme.addModule('clipboard');
+ this.history = this.theme.addModule('history');
+ this.theme.init();
+ this.emitter.on(_emitter4.default.events.EDITOR_CHANGE, function (type) {
+ if (type === _emitter4.default.events.TEXT_CHANGE) {
+ _this2.root.classList.toggle('ql-blank', _this2.editor.isBlank());
+ }
+ });
+ this.emitter.on(_emitter4.default.events.SCROLL_UPDATE, function (source, mutations) {
+ var range = _this2.selection.lastRange;
+ var index = range && range.length === 0 ? range.index : undefined;
+ modify.call(_this2, function () {
+ return _this2.editor.update(null, mutations, index);
+ }, source);
+ });
+ var contents = this.clipboard.convert('
' + html + '
');
+ this.setContents(contents);
+ this.history.clear();
+ if (this.options.placeholder) {
+ this.root.setAttribute('data-placeholder', this.options.placeholder);
+ }
+ if (this.options.readOnly) {
+ this.disable();
+ }
+ }
+
+ _createClass(Quill, [{
+ key: 'addContainer',
+ value: function addContainer(container) {
+ var refNode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
+
+ if (typeof container === 'string') {
+ var className = container;
+ container = document.createElement('div');
+ container.classList.add(className);
+ }
+ this.container.insertBefore(container, refNode);
+ return container;
+ }
+ }, {
+ key: 'blur',
+ value: function blur() {
+ this.selection.setRange(null);
+ }
+ }, {
+ key: 'deleteText',
+ value: function deleteText(index, length, source) {
+ var _this3 = this;
+
+ var _overload = overload(index, length, source);
+
+ var _overload2 = _slicedToArray(_overload, 4);
+
+ index = _overload2[0];
+ length = _overload2[1];
+ source = _overload2[3];
+
+ return modify.call(this, function () {
+ return _this3.editor.deleteText(index, length);
+ }, source, index, -1 * length);
+ }
+ }, {
+ key: 'disable',
+ value: function disable() {
+ this.enable(false);
+ }
+ }, {
+ key: 'enable',
+ value: function enable() {
+ var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
+
+ this.scroll.enable(enabled);
+ this.container.classList.toggle('ql-disabled', !enabled);
+ }
+ }, {
+ key: 'focus',
+ value: function focus() {
+ var scrollTop = this.scrollingContainer.scrollTop;
+ this.selection.focus();
+ this.scrollingContainer.scrollTop = scrollTop;
+ this.scrollIntoView();
+ }
+ }, {
+ key: 'format',
+ value: function format(name, value) {
+ var _this4 = this;
+
+ var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _emitter4.default.sources.API;
+
+ return modify.call(this, function () {
+ var range = _this4.getSelection(true);
+ var change = new _quillDelta2.default();
+ if (range == null) {
+ return change;
+ } else if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK)) {
+ change = _this4.editor.formatLine(range.index, range.length, _defineProperty({}, name, value));
+ } else if (range.length === 0) {
+ _this4.selection.format(name, value);
+ return change;
+ } else {
+ change = _this4.editor.formatText(range.index, range.length, _defineProperty({}, name, value));
+ }
+ _this4.setSelection(range, _emitter4.default.sources.SILENT);
+ return change;
+ }, source);
+ }
+ }, {
+ key: 'formatLine',
+ value: function formatLine(index, length, name, value, source) {
+ var _this5 = this;
+
+ var formats = void 0;
+
+ var _overload3 = overload(index, length, name, value, source);
+
+ var _overload4 = _slicedToArray(_overload3, 4);
+
+ index = _overload4[0];
+ length = _overload4[1];
+ formats = _overload4[2];
+ source = _overload4[3];
+
+ return modify.call(this, function () {
+ return _this5.editor.formatLine(index, length, formats);
+ }, source, index, 0);
+ }
+ }, {
+ key: 'formatText',
+ value: function formatText(index, length, name, value, source) {
+ var _this6 = this;
+
+ var formats = void 0;
+
+ var _overload5 = overload(index, length, name, value, source);
+
+ var _overload6 = _slicedToArray(_overload5, 4);
+
+ index = _overload6[0];
+ length = _overload6[1];
+ formats = _overload6[2];
+ source = _overload6[3];
+
+ return modify.call(this, function () {
+ return _this6.editor.formatText(index, length, formats);
+ }, source, index, 0);
+ }
+ }, {
+ key: 'getBounds',
+ value: function getBounds(index) {
+ var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+
+ var bounds = void 0;
+ if (typeof index === 'number') {
+ bounds = this.selection.getBounds(index, length);
+ } else {
+ bounds = this.selection.getBounds(index.index, index.length);
+ }
+ var containerBounds = this.container.getBoundingClientRect();
+ return {
+ bottom: bounds.bottom - containerBounds.top,
+ height: bounds.height,
+ left: bounds.left - containerBounds.left,
+ right: bounds.right - containerBounds.left,
+ top: bounds.top - containerBounds.top,
+ width: bounds.width
+ };
+ }
+ }, {
+ key: 'getContents',
+ value: function getContents() {
+ var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+ var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getLength() - index;
+
+ var _overload7 = overload(index, length);
+
+ var _overload8 = _slicedToArray(_overload7, 2);
+
+ index = _overload8[0];
+ length = _overload8[1];
+
+ return this.editor.getContents(index, length);
+ }
+ }, {
+ key: 'getFormat',
+ value: function getFormat() {
+ var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getSelection(true);
+ var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+
+ if (typeof index === 'number') {
+ return this.editor.getFormat(index, length);
+ } else {
+ return this.editor.getFormat(index.index, index.length);
+ }
+ }
+ }, {
+ key: 'getIndex',
+ value: function getIndex(blot) {
+ return blot.offset(this.scroll);
+ }
+ }, {
+ key: 'getLength',
+ value: function getLength() {
+ return this.scroll.length();
+ }
+ }, {
+ key: 'getLeaf',
+ value: function getLeaf(index) {
+ return this.scroll.leaf(index);
+ }
+ }, {
+ key: 'getLine',
+ value: function getLine(index) {
+ return this.scroll.line(index);
+ }
+ }, {
+ key: 'getLines',
+ value: function getLines() {
+ var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+ var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.MAX_VALUE;
+
+ if (typeof index !== 'number') {
+ return this.scroll.lines(index.index, index.length);
+ } else {
+ return this.scroll.lines(index, length);
+ }
+ }
+ }, {
+ key: 'getModule',
+ value: function getModule(name) {
+ return this.theme.modules[name];
+ }
+ }, {
+ key: 'getSelection',
+ value: function getSelection() {
+ var focus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+ if (focus) this.focus();
+ this.update(); // Make sure we access getRange with editor in consistent state
+ return this.selection.getRange()[0];
+ }
+ }, {
+ key: 'getText',
+ value: function getText() {
+ var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+ var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getLength() - index;
+
+ var _overload9 = overload(index, length);
+
+ var _overload10 = _slicedToArray(_overload9, 2);
+
+ index = _overload10[0];
+ length = _overload10[1];
+
+ return this.editor.getText(index, length);
+ }
+ }, {
+ key: 'hasFocus',
+ value: function hasFocus() {
+ return this.selection.hasFocus();
+ }
+ }, {
+ key: 'insertEmbed',
+ value: function insertEmbed(index, embed, value) {
+ var _this7 = this;
+
+ var source = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Quill.sources.API;
+
+ return modify.call(this, function () {
+ return _this7.editor.insertEmbed(index, embed, value);
+ }, source, index);
+ }
+ }, {
+ key: 'insertText',
+ value: function insertText(index, text, name, value, source) {
+ var _this8 = this;
+
+ var formats = void 0;
+
+ var _overload11 = overload(index, 0, name, value, source);
+
+ var _overload12 = _slicedToArray(_overload11, 4);
+
+ index = _overload12[0];
+ formats = _overload12[2];
+ source = _overload12[3];
+
+ return modify.call(this, function () {
+ return _this8.editor.insertText(index, text, formats);
+ }, source, index, text.length);
+ }
+ }, {
+ key: 'isEnabled',
+ value: function isEnabled() {
+ return !this.container.classList.contains('ql-disabled');
+ }
+ }, {
+ key: 'off',
+ value: function off() {
+ return this.emitter.off.apply(this.emitter, arguments);
+ }
+ }, {
+ key: 'on',
+ value: function on() {
+ return this.emitter.on.apply(this.emitter, arguments);
+ }
+ }, {
+ key: 'once',
+ value: function once() {
+ return this.emitter.once.apply(this.emitter, arguments);
+ }
+ }, {
+ key: 'pasteHTML',
+ value: function pasteHTML(index, html, source) {
+ this.clipboard.dangerouslyPasteHTML(index, html, source);
+ }
+ }, {
+ key: 'removeFormat',
+ value: function removeFormat(index, length, source) {
+ var _this9 = this;
+
+ var _overload13 = overload(index, length, source);
+
+ var _overload14 = _slicedToArray(_overload13, 4);
+
+ index = _overload14[0];
+ length = _overload14[1];
+ source = _overload14[3];
+
+ return modify.call(this, function () {
+ return _this9.editor.removeFormat(index, length);
+ }, source, index);
+ }
+ }, {
+ key: 'scrollIntoView',
+ value: function scrollIntoView() {
+ this.selection.scrollIntoView(this.scrollingContainer);
+ }
+ }, {
+ key: 'setContents',
+ value: function setContents(delta) {
+ var _this10 = this;
+
+ var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API;
+
+ return modify.call(this, function () {
+ delta = new _quillDelta2.default(delta);
+ var length = _this10.getLength();
+ var deleted = _this10.editor.deleteText(0, length);
+ var applied = _this10.editor.applyDelta(delta);
+ var lastOp = applied.ops[applied.ops.length - 1];
+ if (lastOp != null && typeof lastOp.insert === 'string' && lastOp.insert[lastOp.insert.length - 1] === '\n') {
+ _this10.editor.deleteText(_this10.getLength() - 1, 1);
+ applied.delete(1);
+ }
+ var ret = deleted.compose(applied);
+ return ret;
+ }, source);
+ }
+ }, {
+ key: 'setSelection',
+ value: function setSelection(index, length, source) {
+ if (index == null) {
+ this.selection.setRange(null, length || Quill.sources.API);
+ } else {
+ var _overload15 = overload(index, length, source);
+
+ var _overload16 = _slicedToArray(_overload15, 4);
+
+ index = _overload16[0];
+ length = _overload16[1];
+ source = _overload16[3];
+
+ this.selection.setRange(new _selection.Range(index, length), source);
+ if (source !== _emitter4.default.sources.SILENT) {
+ this.selection.scrollIntoView(this.scrollingContainer);
+ }
+ }
+ }
+ }, {
+ key: 'setText',
+ value: function setText(text) {
+ var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API;
+
+ var delta = new _quillDelta2.default().insert(text);
+ return this.setContents(delta, source);
+ }
+ }, {
+ key: 'update',
+ value: function update() {
+ var source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _emitter4.default.sources.USER;
+
+ var change = this.scroll.update(source); // Will update selection before selection.update() does if text changes
+ this.selection.update(source);
+ return change;
+ }
+ }, {
+ key: 'updateContents',
+ value: function updateContents(delta) {
+ var _this11 = this;
+
+ var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API;
+
+ return modify.call(this, function () {
+ delta = new _quillDelta2.default(delta);
+ return _this11.editor.applyDelta(delta, source);
+ }, source, true);
+ }
+ }]);
+
+ return Quill;
+}();
+
+Quill.DEFAULTS = {
+ bounds: null,
+ formats: null,
+ modules: {},
+ placeholder: '',
+ readOnly: false,
+ scrollingContainer: null,
+ strict: true,
+ theme: 'default'
+};
+Quill.events = _emitter4.default.events;
+Quill.sources = _emitter4.default.sources;
+// eslint-disable-next-line no-undef
+Quill.version = "1.3.7";
+
+Quill.imports = {
+ 'delta': _quillDelta2.default,
+ 'parchment': _parchment2.default,
+ 'core/module': _module2.default,
+ 'core/theme': _theme2.default
+};
+
+function expandConfig(container, userConfig) {
+ userConfig = (0, _extend2.default)(true, {
+ container: container,
+ modules: {
+ clipboard: true,
+ keyboard: true,
+ history: true
+ }
+ }, userConfig);
+ if (!userConfig.theme || userConfig.theme === Quill.DEFAULTS.theme) {
+ userConfig.theme = _theme2.default;
+ } else {
+ userConfig.theme = Quill.import('themes/' + userConfig.theme);
+ if (userConfig.theme == null) {
+ throw new Error('Invalid theme ' + userConfig.theme + '. Did you register it?');
+ }
+ }
+ var themeConfig = (0, _extend2.default)(true, {}, userConfig.theme.DEFAULTS);
+ [themeConfig, userConfig].forEach(function (config) {
+ config.modules = config.modules || {};
+ Object.keys(config.modules).forEach(function (module) {
+ if (config.modules[module] === true) {
+ config.modules[module] = {};
+ }
+ });
+ });
+ var moduleNames = Object.keys(themeConfig.modules).concat(Object.keys(userConfig.modules));
+ var moduleConfig = moduleNames.reduce(function (config, name) {
+ var moduleClass = Quill.import('modules/' + name);
+ if (moduleClass == null) {
+ debug.error('Cannot load ' + name + ' module. Are you sure you registered it?');
+ } else {
+ config[name] = moduleClass.DEFAULTS || {};
+ }
+ return config;
+ }, {});
+ // Special case toolbar shorthand
+ if (userConfig.modules != null && userConfig.modules.toolbar && userConfig.modules.toolbar.constructor !== Object) {
+ userConfig.modules.toolbar = {
+ container: userConfig.modules.toolbar
+ };
+ }
+ userConfig = (0, _extend2.default)(true, {}, Quill.DEFAULTS, { modules: moduleConfig }, themeConfig, userConfig);
+ ['bounds', 'container', 'scrollingContainer'].forEach(function (key) {
+ if (typeof userConfig[key] === 'string') {
+ userConfig[key] = document.querySelector(userConfig[key]);
+ }
+ });
+ userConfig.modules = Object.keys(userConfig.modules).reduce(function (config, name) {
+ if (userConfig.modules[name]) {
+ config[name] = userConfig.modules[name];
+ }
+ return config;
+ }, {});
+ return userConfig;
+}
+
+// Handle selection preservation and TEXT_CHANGE emission
+// common to modification APIs
+function modify(modifier, source, index, shift) {
+ if (this.options.strict && !this.isEnabled() && source === _emitter4.default.sources.USER) {
+ return new _quillDelta2.default();
+ }
+ var range = index == null ? null : this.getSelection();
+ var oldDelta = this.editor.delta;
+ var change = modifier();
+ if (range != null) {
+ if (index === true) index = range.index;
+ if (shift == null) {
+ range = shiftRange(range, change, source);
+ } else if (shift !== 0) {
+ range = shiftRange(range, index, shift, source);
+ }
+ this.setSelection(range, _emitter4.default.sources.SILENT);
+ }
+ if (change.length() > 0) {
+ var _emitter;
+
+ var args = [_emitter4.default.events.TEXT_CHANGE, change, oldDelta, source];
+ (_emitter = this.emitter).emit.apply(_emitter, [_emitter4.default.events.EDITOR_CHANGE].concat(args));
+ if (source !== _emitter4.default.sources.SILENT) {
+ var _emitter2;
+
+ (_emitter2 = this.emitter).emit.apply(_emitter2, args);
+ }
+ }
+ return change;
+}
+
+function overload(index, length, name, value, source) {
+ var formats = {};
+ if (typeof index.index === 'number' && typeof index.length === 'number') {
+ // Allow for throwaway end (used by insertText/insertEmbed)
+ if (typeof length !== 'number') {
+ source = value, value = name, name = length, length = index.length, index = index.index;
+ } else {
+ length = index.length, index = index.index;
+ }
+ } else if (typeof length !== 'number') {
+ source = value, value = name, name = length, length = 0;
+ }
+ // Handle format being object, two format name/value strings or excluded
+ if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') {
+ formats = name;
+ source = value;
+ } else if (typeof name === 'string') {
+ if (value != null) {
+ formats[name] = value;
+ } else {
+ source = name;
+ }
+ }
+ // Handle optional source
+ source = source || _emitter4.default.sources.API;
+ return [index, length, formats, source];
+}
+
+function shiftRange(range, index, length, source) {
+ if (range == null) return null;
+ var start = void 0,
+ end = void 0;
+ if (index instanceof _quillDelta2.default) {
+ var _map = [range.index, range.index + range.length].map(function (pos) {
+ return index.transformPosition(pos, source !== _emitter4.default.sources.USER);
+ });
+
+ var _map2 = _slicedToArray(_map, 2);
+
+ start = _map2[0];
+ end = _map2[1];
+ } else {
+ var _map3 = [range.index, range.index + range.length].map(function (pos) {
+ if (pos < index || pos === index && source === _emitter4.default.sources.USER) return pos;
+ if (length >= 0) {
+ return pos + length;
+ } else {
+ return Math.max(index, pos + length);
+ }
+ });
+
+ var _map4 = _slicedToArray(_map3, 2);
+
+ start = _map4[0];
+ end = _map4[1];
+ }
+ return new _selection.Range(start, end - start);
+}
+
+exports.expandConfig = expandConfig;
+exports.overload = overload;
+exports.default = Quill;
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _text = __webpack_require__(7);
+
+var _text2 = _interopRequireDefault(_text);
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var Inline = function (_Parchment$Inline) {
+ _inherits(Inline, _Parchment$Inline);
+
+ function Inline() {
+ _classCallCheck(this, Inline);
+
+ return _possibleConstructorReturn(this, (Inline.__proto__ || Object.getPrototypeOf(Inline)).apply(this, arguments));
+ }
+
+ _createClass(Inline, [{
+ key: 'formatAt',
+ value: function formatAt(index, length, name, value) {
+ if (Inline.compare(this.statics.blotName, name) < 0 && _parchment2.default.query(name, _parchment2.default.Scope.BLOT)) {
+ var blot = this.isolate(index, length);
+ if (value) {
+ blot.wrap(name, value);
+ }
+ } else {
+ _get(Inline.prototype.__proto__ || Object.getPrototypeOf(Inline.prototype), 'formatAt', this).call(this, index, length, name, value);
+ }
+ }
+ }, {
+ key: 'optimize',
+ value: function optimize(context) {
+ _get(Inline.prototype.__proto__ || Object.getPrototypeOf(Inline.prototype), 'optimize', this).call(this, context);
+ if (this.parent instanceof Inline && Inline.compare(this.statics.blotName, this.parent.statics.blotName) > 0) {
+ var parent = this.parent.isolate(this.offset(), this.length());
+ this.moveChildren(parent);
+ parent.wrap(this);
+ }
+ }
+ }], [{
+ key: 'compare',
+ value: function compare(self, other) {
+ var selfIndex = Inline.order.indexOf(self);
+ var otherIndex = Inline.order.indexOf(other);
+ if (selfIndex >= 0 || otherIndex >= 0) {
+ return selfIndex - otherIndex;
+ } else if (self === other) {
+ return 0;
+ } else if (self < other) {
+ return -1;
+ } else {
+ return 1;
+ }
+ }
+ }]);
+
+ return Inline;
+}(_parchment2.default.Inline);
+
+Inline.allowedChildren = [Inline, _parchment2.default.Embed, _text2.default];
+// Lower index means deeper in the DOM tree, since not found (-1) is for embeds
+Inline.order = ['cursor', 'inline', // Must be lower
+'underline', 'strike', 'italic', 'bold', 'script', 'link', 'code' // Must be higher
+];
+
+exports.default = Inline;
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var TextBlot = function (_Parchment$Text) {
+ _inherits(TextBlot, _Parchment$Text);
+
+ function TextBlot() {
+ _classCallCheck(this, TextBlot);
+
+ return _possibleConstructorReturn(this, (TextBlot.__proto__ || Object.getPrototypeOf(TextBlot)).apply(this, arguments));
+ }
+
+ return TextBlot;
+}(_parchment2.default.Text);
+
+exports.default = TextBlot;
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _eventemitter = __webpack_require__(54);
+
+var _eventemitter2 = _interopRequireDefault(_eventemitter);
+
+var _logger = __webpack_require__(10);
+
+var _logger2 = _interopRequireDefault(_logger);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var debug = (0, _logger2.default)('quill:events');
+
+var EVENTS = ['selectionchange', 'mousedown', 'mouseup', 'click'];
+
+EVENTS.forEach(function (eventName) {
+ document.addEventListener(eventName, function () {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ [].slice.call(document.querySelectorAll('.ql-container')).forEach(function (node) {
+ // TODO use WeakMap
+ if (node.__quill && node.__quill.emitter) {
+ var _node$__quill$emitter;
+
+ (_node$__quill$emitter = node.__quill.emitter).handleDOM.apply(_node$__quill$emitter, args);
+ }
+ });
+ });
+});
+
+var Emitter = function (_EventEmitter) {
+ _inherits(Emitter, _EventEmitter);
+
+ function Emitter() {
+ _classCallCheck(this, Emitter);
+
+ var _this = _possibleConstructorReturn(this, (Emitter.__proto__ || Object.getPrototypeOf(Emitter)).call(this));
+
+ _this.listeners = {};
+ _this.on('error', debug.error);
+ return _this;
+ }
+
+ _createClass(Emitter, [{
+ key: 'emit',
+ value: function emit() {
+ debug.log.apply(debug, arguments);
+ _get(Emitter.prototype.__proto__ || Object.getPrototypeOf(Emitter.prototype), 'emit', this).apply(this, arguments);
+ }
+ }, {
+ key: 'handleDOM',
+ value: function handleDOM(event) {
+ for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+ args[_key2 - 1] = arguments[_key2];
+ }
+
+ (this.listeners[event.type] || []).forEach(function (_ref) {
+ var node = _ref.node,
+ handler = _ref.handler;
+
+ if (event.target === node || node.contains(event.target)) {
+ handler.apply(undefined, [event].concat(args));
+ }
+ });
+ }
+ }, {
+ key: 'listenDOM',
+ value: function listenDOM(eventName, node, handler) {
+ if (!this.listeners[eventName]) {
+ this.listeners[eventName] = [];
+ }
+ this.listeners[eventName].push({ node: node, handler: handler });
+ }
+ }]);
+
+ return Emitter;
+}(_eventemitter2.default);
+
+Emitter.events = {
+ EDITOR_CHANGE: 'editor-change',
+ SCROLL_BEFORE_UPDATE: 'scroll-before-update',
+ SCROLL_OPTIMIZE: 'scroll-optimize',
+ SCROLL_UPDATE: 'scroll-update',
+ SELECTION_CHANGE: 'selection-change',
+ TEXT_CHANGE: 'text-change'
+};
+Emitter.sources = {
+ API: 'api',
+ SILENT: 'silent',
+ USER: 'user'
+};
+
+exports.default = Emitter;
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var Module = function Module(quill) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ _classCallCheck(this, Module);
+
+ this.quill = quill;
+ this.options = options;
+};
+
+Module.DEFAULTS = {};
+
+exports.default = Module;
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var levels = ['error', 'warn', 'log', 'info'];
+var level = 'warn';
+
+function debug(method) {
+ if (levels.indexOf(method) <= levels.indexOf(level)) {
+ var _console;
+
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ (_console = console)[method].apply(_console, args); // eslint-disable-line no-console
+ }
+}
+
+function namespace(ns) {
+ return levels.reduce(function (logger, method) {
+ logger[method] = debug.bind(console, method, ns);
+ return logger;
+ }, {});
+}
+
+debug.level = namespace.level = function (newLevel) {
+ level = newLevel;
+};
+
+exports.default = namespace;
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var pSlice = Array.prototype.slice;
+var objectKeys = __webpack_require__(52);
+var isArguments = __webpack_require__(53);
+
+var deepEqual = module.exports = function (actual, expected, opts) {
+ if (!opts) opts = {};
+ // 7.1. All identical values are equivalent, as determined by ===.
+ if (actual === expected) {
+ return true;
+
+ } else if (actual instanceof Date && expected instanceof Date) {
+ return actual.getTime() === expected.getTime();
+
+ // 7.3. Other pairs that do not both pass typeof value == 'object',
+ // equivalence is determined by ==.
+ } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') {
+ return opts.strict ? actual === expected : actual == expected;
+
+ // 7.4. For all other Object pairs, including Array objects, equivalence is
+ // determined by having the same number of owned properties (as verified
+ // with Object.prototype.hasOwnProperty.call), the same set of keys
+ // (although not necessarily the same order), equivalent values for every
+ // corresponding key, and an identical 'prototype' property. Note: this
+ // accounts for both named and indexed properties on Arrays.
+ } else {
+ return objEquiv(actual, expected, opts);
+ }
+};
+
+function isUndefinedOrNull(value) {
+ return value === null || value === undefined;
+}
+
+function isBuffer (x) {
+ if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false;
+ if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {
+ return false;
+ }
+ if (x.length > 0 && typeof x[0] !== 'number') return false;
+ return true;
+}
+
+function objEquiv(a, b, opts) {
+ var i, key;
+ if (isUndefinedOrNull(a) || isUndefinedOrNull(b))
+ return false;
+ // an identical 'prototype' property.
+ if (a.prototype !== b.prototype) return false;
+ //~~~I've managed to break Object.keys through screwy arguments passing.
+ // Converting to array solves the problem.
+ if (isArguments(a)) {
+ if (!isArguments(b)) {
+ return false;
+ }
+ a = pSlice.call(a);
+ b = pSlice.call(b);
+ return deepEqual(a, b, opts);
+ }
+ if (isBuffer(a)) {
+ if (!isBuffer(b)) {
+ return false;
+ }
+ if (a.length !== b.length) return false;
+ for (i = 0; i < a.length; i++) {
+ if (a[i] !== b[i]) return false;
+ }
+ return true;
+ }
+ try {
+ var ka = objectKeys(a),
+ kb = objectKeys(b);
+ } catch (e) {//happens when one is a string literal and the other isn't
+ return false;
+ }
+ // having the same number of owned properties (keys incorporates
+ // hasOwnProperty)
+ if (ka.length != kb.length)
+ return false;
+ //the same set of keys (although not necessarily the same order),
+ ka.sort();
+ kb.sort();
+ //~~~cheap key test
+ for (i = ka.length - 1; i >= 0; i--) {
+ if (ka[i] != kb[i])
+ return false;
+ }
+ //equivalent values for every corresponding key, and
+ //~~~possibly expensive deep test
+ for (i = ka.length - 1; i >= 0; i--) {
+ key = ka[i];
+ if (!deepEqual(a[key], b[key], opts)) return false;
+ }
+ return typeof a === typeof b;
+}
+
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var Registry = __webpack_require__(1);
+var Attributor = /** @class */ (function () {
+ function Attributor(attrName, keyName, options) {
+ if (options === void 0) { options = {}; }
+ this.attrName = attrName;
+ this.keyName = keyName;
+ var attributeBit = Registry.Scope.TYPE & Registry.Scope.ATTRIBUTE;
+ if (options.scope != null) {
+ // Ignore type bits, force attribute bit
+ this.scope = (options.scope & Registry.Scope.LEVEL) | attributeBit;
+ }
+ else {
+ this.scope = Registry.Scope.ATTRIBUTE;
+ }
+ if (options.whitelist != null)
+ this.whitelist = options.whitelist;
+ }
+ Attributor.keys = function (node) {
+ return [].map.call(node.attributes, function (item) {
+ return item.name;
+ });
+ };
+ Attributor.prototype.add = function (node, value) {
+ if (!this.canAdd(node, value))
+ return false;
+ node.setAttribute(this.keyName, value);
+ return true;
+ };
+ Attributor.prototype.canAdd = function (node, value) {
+ var match = Registry.query(node, Registry.Scope.BLOT & (this.scope | Registry.Scope.TYPE));
+ if (match == null)
+ return false;
+ if (this.whitelist == null)
+ return true;
+ if (typeof value === 'string') {
+ return this.whitelist.indexOf(value.replace(/["']/g, '')) > -1;
+ }
+ else {
+ return this.whitelist.indexOf(value) > -1;
+ }
+ };
+ Attributor.prototype.remove = function (node) {
+ node.removeAttribute(this.keyName);
+ };
+ Attributor.prototype.value = function (node) {
+ var value = node.getAttribute(this.keyName);
+ if (this.canAdd(node, value) && value) {
+ return value;
+ }
+ return '';
+ };
+ return Attributor;
+}());
+exports.default = Attributor;
+
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = exports.Code = undefined;
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _quillDelta = __webpack_require__(2);
+
+var _quillDelta2 = _interopRequireDefault(_quillDelta);
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _block = __webpack_require__(4);
+
+var _block2 = _interopRequireDefault(_block);
+
+var _inline = __webpack_require__(6);
+
+var _inline2 = _interopRequireDefault(_inline);
+
+var _text = __webpack_require__(7);
+
+var _text2 = _interopRequireDefault(_text);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var Code = function (_Inline) {
+ _inherits(Code, _Inline);
+
+ function Code() {
+ _classCallCheck(this, Code);
+
+ return _possibleConstructorReturn(this, (Code.__proto__ || Object.getPrototypeOf(Code)).apply(this, arguments));
+ }
+
+ return Code;
+}(_inline2.default);
+
+Code.blotName = 'code';
+Code.tagName = 'CODE';
+
+var CodeBlock = function (_Block) {
+ _inherits(CodeBlock, _Block);
+
+ function CodeBlock() {
+ _classCallCheck(this, CodeBlock);
+
+ return _possibleConstructorReturn(this, (CodeBlock.__proto__ || Object.getPrototypeOf(CodeBlock)).apply(this, arguments));
+ }
+
+ _createClass(CodeBlock, [{
+ key: 'delta',
+ value: function delta() {
+ var _this3 = this;
+
+ var text = this.domNode.textContent;
+ if (text.endsWith('\n')) {
+ // Should always be true
+ text = text.slice(0, -1);
+ }
+ return text.split('\n').reduce(function (delta, frag) {
+ return delta.insert(frag).insert('\n', _this3.formats());
+ }, new _quillDelta2.default());
+ }
+ }, {
+ key: 'format',
+ value: function format(name, value) {
+ if (name === this.statics.blotName && value) return;
+
+ var _descendant = this.descendant(_text2.default, this.length() - 1),
+ _descendant2 = _slicedToArray(_descendant, 1),
+ text = _descendant2[0];
+
+ if (text != null) {
+ text.deleteAt(text.length() - 1, 1);
+ }
+ _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'format', this).call(this, name, value);
+ }
+ }, {
+ key: 'formatAt',
+ value: function formatAt(index, length, name, value) {
+ if (length === 0) return;
+ if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK) == null || name === this.statics.blotName && value === this.statics.formats(this.domNode)) {
+ return;
+ }
+ var nextNewline = this.newlineIndex(index);
+ if (nextNewline < 0 || nextNewline >= index + length) return;
+ var prevNewline = this.newlineIndex(index, true) + 1;
+ var isolateLength = nextNewline - prevNewline + 1;
+ var blot = this.isolate(prevNewline, isolateLength);
+ var next = blot.next;
+ blot.format(name, value);
+ if (next instanceof CodeBlock) {
+ next.formatAt(0, index - prevNewline + length - isolateLength, name, value);
+ }
+ }
+ }, {
+ key: 'insertAt',
+ value: function insertAt(index, value, def) {
+ if (def != null) return;
+
+ var _descendant3 = this.descendant(_text2.default, index),
+ _descendant4 = _slicedToArray(_descendant3, 2),
+ text = _descendant4[0],
+ offset = _descendant4[1];
+
+ text.insertAt(offset, value);
+ }
+ }, {
+ key: 'length',
+ value: function length() {
+ var length = this.domNode.textContent.length;
+ if (!this.domNode.textContent.endsWith('\n')) {
+ return length + 1;
+ }
+ return length;
+ }
+ }, {
+ key: 'newlineIndex',
+ value: function newlineIndex(searchIndex) {
+ var reverse = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ if (!reverse) {
+ var offset = this.domNode.textContent.slice(searchIndex).indexOf('\n');
+ return offset > -1 ? searchIndex + offset : -1;
+ } else {
+ return this.domNode.textContent.slice(0, searchIndex).lastIndexOf('\n');
+ }
+ }
+ }, {
+ key: 'optimize',
+ value: function optimize(context) {
+ if (!this.domNode.textContent.endsWith('\n')) {
+ this.appendChild(_parchment2.default.create('text', '\n'));
+ }
+ _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'optimize', this).call(this, context);
+ var next = this.next;
+ if (next != null && next.prev === this && next.statics.blotName === this.statics.blotName && this.statics.formats(this.domNode) === next.statics.formats(next.domNode)) {
+ next.optimize(context);
+ next.moveChildren(this);
+ next.remove();
+ }
+ }
+ }, {
+ key: 'replace',
+ value: function replace(target) {
+ _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'replace', this).call(this, target);
+ [].slice.call(this.domNode.querySelectorAll('*')).forEach(function (node) {
+ var blot = _parchment2.default.find(node);
+ if (blot == null) {
+ node.parentNode.removeChild(node);
+ } else if (blot instanceof _parchment2.default.Embed) {
+ blot.remove();
+ } else {
+ blot.unwrap();
+ }
+ });
+ }
+ }], [{
+ key: 'create',
+ value: function create(value) {
+ var domNode = _get(CodeBlock.__proto__ || Object.getPrototypeOf(CodeBlock), 'create', this).call(this, value);
+ domNode.setAttribute('spellcheck', false);
+ return domNode;
+ }
+ }, {
+ key: 'formats',
+ value: function formats() {
+ return true;
+ }
+ }]);
+
+ return CodeBlock;
+}(_block2.default);
+
+CodeBlock.blotName = 'code-block';
+CodeBlock.tagName = 'PRE';
+CodeBlock.TAB = ' ';
+
+exports.Code = Code;
+exports.default = CodeBlock;
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _quillDelta = __webpack_require__(2);
+
+var _quillDelta2 = _interopRequireDefault(_quillDelta);
+
+var _op = __webpack_require__(20);
+
+var _op2 = _interopRequireDefault(_op);
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _code = __webpack_require__(13);
+
+var _code2 = _interopRequireDefault(_code);
+
+var _cursor = __webpack_require__(24);
+
+var _cursor2 = _interopRequireDefault(_cursor);
+
+var _block = __webpack_require__(4);
+
+var _block2 = _interopRequireDefault(_block);
+
+var _break = __webpack_require__(16);
+
+var _break2 = _interopRequireDefault(_break);
+
+var _clone = __webpack_require__(21);
+
+var _clone2 = _interopRequireDefault(_clone);
+
+var _deepEqual = __webpack_require__(11);
+
+var _deepEqual2 = _interopRequireDefault(_deepEqual);
+
+var _extend = __webpack_require__(3);
+
+var _extend2 = _interopRequireDefault(_extend);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var ASCII = /^[ -~]*$/;
+
+var Editor = function () {
+ function Editor(scroll) {
+ _classCallCheck(this, Editor);
+
+ this.scroll = scroll;
+ this.delta = this.getDelta();
+ }
+
+ _createClass(Editor, [{
+ key: 'applyDelta',
+ value: function applyDelta(delta) {
+ var _this = this;
+
+ var consumeNextNewline = false;
+ this.scroll.update();
+ var scrollLength = this.scroll.length();
+ this.scroll.batchStart();
+ delta = normalizeDelta(delta);
+ delta.reduce(function (index, op) {
+ var length = op.retain || op.delete || op.insert.length || 1;
+ var attributes = op.attributes || {};
+ if (op.insert != null) {
+ if (typeof op.insert === 'string') {
+ var text = op.insert;
+ if (text.endsWith('\n') && consumeNextNewline) {
+ consumeNextNewline = false;
+ text = text.slice(0, -1);
+ }
+ if (index >= scrollLength && !text.endsWith('\n')) {
+ consumeNextNewline = true;
+ }
+ _this.scroll.insertAt(index, text);
+
+ var _scroll$line = _this.scroll.line(index),
+ _scroll$line2 = _slicedToArray(_scroll$line, 2),
+ line = _scroll$line2[0],
+ offset = _scroll$line2[1];
+
+ var formats = (0, _extend2.default)({}, (0, _block.bubbleFormats)(line));
+ if (line instanceof _block2.default) {
+ var _line$descendant = line.descendant(_parchment2.default.Leaf, offset),
+ _line$descendant2 = _slicedToArray(_line$descendant, 1),
+ leaf = _line$descendant2[0];
+
+ formats = (0, _extend2.default)(formats, (0, _block.bubbleFormats)(leaf));
+ }
+ attributes = _op2.default.attributes.diff(formats, attributes) || {};
+ } else if (_typeof(op.insert) === 'object') {
+ var key = Object.keys(op.insert)[0]; // There should only be one key
+ if (key == null) return index;
+ _this.scroll.insertAt(index, key, op.insert[key]);
+ }
+ scrollLength += length;
+ }
+ Object.keys(attributes).forEach(function (name) {
+ _this.scroll.formatAt(index, length, name, attributes[name]);
+ });
+ return index + length;
+ }, 0);
+ delta.reduce(function (index, op) {
+ if (typeof op.delete === 'number') {
+ _this.scroll.deleteAt(index, op.delete);
+ return index;
+ }
+ return index + (op.retain || op.insert.length || 1);
+ }, 0);
+ this.scroll.batchEnd();
+ return this.update(delta);
+ }
+ }, {
+ key: 'deleteText',
+ value: function deleteText(index, length) {
+ this.scroll.deleteAt(index, length);
+ return this.update(new _quillDelta2.default().retain(index).delete(length));
+ }
+ }, {
+ key: 'formatLine',
+ value: function formatLine(index, length) {
+ var _this2 = this;
+
+ var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+
+ this.scroll.update();
+ Object.keys(formats).forEach(function (format) {
+ if (_this2.scroll.whitelist != null && !_this2.scroll.whitelist[format]) return;
+ var lines = _this2.scroll.lines(index, Math.max(length, 1));
+ var lengthRemaining = length;
+ lines.forEach(function (line) {
+ var lineLength = line.length();
+ if (!(line instanceof _code2.default)) {
+ line.format(format, formats[format]);
+ } else {
+ var codeIndex = index - line.offset(_this2.scroll);
+ var codeLength = line.newlineIndex(codeIndex + lengthRemaining) - codeIndex + 1;
+ line.formatAt(codeIndex, codeLength, format, formats[format]);
+ }
+ lengthRemaining -= lineLength;
+ });
+ });
+ this.scroll.optimize();
+ return this.update(new _quillDelta2.default().retain(index).retain(length, (0, _clone2.default)(formats)));
+ }
+ }, {
+ key: 'formatText',
+ value: function formatText(index, length) {
+ var _this3 = this;
+
+ var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+
+ Object.keys(formats).forEach(function (format) {
+ _this3.scroll.formatAt(index, length, format, formats[format]);
+ });
+ return this.update(new _quillDelta2.default().retain(index).retain(length, (0, _clone2.default)(formats)));
+ }
+ }, {
+ key: 'getContents',
+ value: function getContents(index, length) {
+ return this.delta.slice(index, index + length);
+ }
+ }, {
+ key: 'getDelta',
+ value: function getDelta() {
+ return this.scroll.lines().reduce(function (delta, line) {
+ return delta.concat(line.delta());
+ }, new _quillDelta2.default());
+ }
+ }, {
+ key: 'getFormat',
+ value: function getFormat(index) {
+ var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+
+ var lines = [],
+ leaves = [];
+ if (length === 0) {
+ this.scroll.path(index).forEach(function (path) {
+ var _path = _slicedToArray(path, 1),
+ blot = _path[0];
+
+ if (blot instanceof _block2.default) {
+ lines.push(blot);
+ } else if (blot instanceof _parchment2.default.Leaf) {
+ leaves.push(blot);
+ }
+ });
+ } else {
+ lines = this.scroll.lines(index, length);
+ leaves = this.scroll.descendants(_parchment2.default.Leaf, index, length);
+ }
+ var formatsArr = [lines, leaves].map(function (blots) {
+ if (blots.length === 0) return {};
+ var formats = (0, _block.bubbleFormats)(blots.shift());
+ while (Object.keys(formats).length > 0) {
+ var blot = blots.shift();
+ if (blot == null) return formats;
+ formats = combineFormats((0, _block.bubbleFormats)(blot), formats);
+ }
+ return formats;
+ });
+ return _extend2.default.apply(_extend2.default, formatsArr);
+ }
+ }, {
+ key: 'getText',
+ value: function getText(index, length) {
+ return this.getContents(index, length).filter(function (op) {
+ return typeof op.insert === 'string';
+ }).map(function (op) {
+ return op.insert;
+ }).join('');
+ }
+ }, {
+ key: 'insertEmbed',
+ value: function insertEmbed(index, embed, value) {
+ this.scroll.insertAt(index, embed, value);
+ return this.update(new _quillDelta2.default().retain(index).insert(_defineProperty({}, embed, value)));
+ }
+ }, {
+ key: 'insertText',
+ value: function insertText(index, text) {
+ var _this4 = this;
+
+ var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+
+ text = text.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
+ this.scroll.insertAt(index, text);
+ Object.keys(formats).forEach(function (format) {
+ _this4.scroll.formatAt(index, text.length, format, formats[format]);
+ });
+ return this.update(new _quillDelta2.default().retain(index).insert(text, (0, _clone2.default)(formats)));
+ }
+ }, {
+ key: 'isBlank',
+ value: function isBlank() {
+ if (this.scroll.children.length == 0) return true;
+ if (this.scroll.children.length > 1) return false;
+ var block = this.scroll.children.head;
+ if (block.statics.blotName !== _block2.default.blotName) return false;
+ if (block.children.length > 1) return false;
+ return block.children.head instanceof _break2.default;
+ }
+ }, {
+ key: 'removeFormat',
+ value: function removeFormat(index, length) {
+ var text = this.getText(index, length);
+
+ var _scroll$line3 = this.scroll.line(index + length),
+ _scroll$line4 = _slicedToArray(_scroll$line3, 2),
+ line = _scroll$line4[0],
+ offset = _scroll$line4[1];
+
+ var suffixLength = 0,
+ suffix = new _quillDelta2.default();
+ if (line != null) {
+ if (!(line instanceof _code2.default)) {
+ suffixLength = line.length() - offset;
+ } else {
+ suffixLength = line.newlineIndex(offset) - offset + 1;
+ }
+ suffix = line.delta().slice(offset, offset + suffixLength - 1).insert('\n');
+ }
+ var contents = this.getContents(index, length + suffixLength);
+ var diff = contents.diff(new _quillDelta2.default().insert(text).concat(suffix));
+ var delta = new _quillDelta2.default().retain(index).concat(diff);
+ return this.applyDelta(delta);
+ }
+ }, {
+ key: 'update',
+ value: function update(change) {
+ var mutations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
+ var cursorIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
+
+ var oldDelta = this.delta;
+ if (mutations.length === 1 && mutations[0].type === 'characterData' && mutations[0].target.data.match(ASCII) && _parchment2.default.find(mutations[0].target)) {
+ // Optimization for character changes
+ var textBlot = _parchment2.default.find(mutations[0].target);
+ var formats = (0, _block.bubbleFormats)(textBlot);
+ var index = textBlot.offset(this.scroll);
+ var oldValue = mutations[0].oldValue.replace(_cursor2.default.CONTENTS, '');
+ var oldText = new _quillDelta2.default().insert(oldValue);
+ var newText = new _quillDelta2.default().insert(textBlot.value());
+ var diffDelta = new _quillDelta2.default().retain(index).concat(oldText.diff(newText, cursorIndex));
+ change = diffDelta.reduce(function (delta, op) {
+ if (op.insert) {
+ return delta.insert(op.insert, formats);
+ } else {
+ return delta.push(op);
+ }
+ }, new _quillDelta2.default());
+ this.delta = oldDelta.compose(change);
+ } else {
+ this.delta = this.getDelta();
+ if (!change || !(0, _deepEqual2.default)(oldDelta.compose(change), this.delta)) {
+ change = oldDelta.diff(this.delta, cursorIndex);
+ }
+ }
+ return change;
+ }
+ }]);
+
+ return Editor;
+}();
+
+function combineFormats(formats, combined) {
+ return Object.keys(combined).reduce(function (merged, name) {
+ if (formats[name] == null) return merged;
+ if (combined[name] === formats[name]) {
+ merged[name] = combined[name];
+ } else if (Array.isArray(combined[name])) {
+ if (combined[name].indexOf(formats[name]) < 0) {
+ merged[name] = combined[name].concat([formats[name]]);
+ }
+ } else {
+ merged[name] = [combined[name], formats[name]];
+ }
+ return merged;
+ }, {});
+}
+
+function normalizeDelta(delta) {
+ return delta.reduce(function (delta, op) {
+ if (op.insert === 1) {
+ var attributes = (0, _clone2.default)(op.attributes);
+ delete attributes['image'];
+ return delta.insert({ image: op.attributes.image }, attributes);
+ }
+ if (op.attributes != null && (op.attributes.list === true || op.attributes.bullet === true)) {
+ op = (0, _clone2.default)(op);
+ if (op.attributes.list) {
+ op.attributes.list = 'ordered';
+ } else {
+ op.attributes.list = 'bullet';
+ delete op.attributes.bullet;
+ }
+ }
+ if (typeof op.insert === 'string') {
+ var text = op.insert.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
+ return delta.insert(text, op.attributes);
+ }
+ return delta.push(op);
+ }, new _quillDelta2.default());
+}
+
+exports.default = Editor;
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = exports.Range = undefined;
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _clone = __webpack_require__(21);
+
+var _clone2 = _interopRequireDefault(_clone);
+
+var _deepEqual = __webpack_require__(11);
+
+var _deepEqual2 = _interopRequireDefault(_deepEqual);
+
+var _emitter3 = __webpack_require__(8);
+
+var _emitter4 = _interopRequireDefault(_emitter3);
+
+var _logger = __webpack_require__(10);
+
+var _logger2 = _interopRequireDefault(_logger);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var debug = (0, _logger2.default)('quill:selection');
+
+var Range = function Range(index) {
+ var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+
+ _classCallCheck(this, Range);
+
+ this.index = index;
+ this.length = length;
+};
+
+var Selection = function () {
+ function Selection(scroll, emitter) {
+ var _this = this;
+
+ _classCallCheck(this, Selection);
+
+ this.emitter = emitter;
+ this.scroll = scroll;
+ this.composing = false;
+ this.mouseDown = false;
+ this.root = this.scroll.domNode;
+ this.cursor = _parchment2.default.create('cursor', this);
+ // savedRange is last non-null range
+ this.lastRange = this.savedRange = new Range(0, 0);
+ this.handleComposition();
+ this.handleDragging();
+ this.emitter.listenDOM('selectionchange', document, function () {
+ if (!_this.mouseDown) {
+ setTimeout(_this.update.bind(_this, _emitter4.default.sources.USER), 1);
+ }
+ });
+ this.emitter.on(_emitter4.default.events.EDITOR_CHANGE, function (type, delta) {
+ if (type === _emitter4.default.events.TEXT_CHANGE && delta.length() > 0) {
+ _this.update(_emitter4.default.sources.SILENT);
+ }
+ });
+ this.emitter.on(_emitter4.default.events.SCROLL_BEFORE_UPDATE, function () {
+ if (!_this.hasFocus()) return;
+ var native = _this.getNativeRange();
+ if (native == null) return;
+ if (native.start.node === _this.cursor.textNode) return; // cursor.restore() will handle
+ // TODO unclear if this has negative side effects
+ _this.emitter.once(_emitter4.default.events.SCROLL_UPDATE, function () {
+ try {
+ _this.setNativeRange(native.start.node, native.start.offset, native.end.node, native.end.offset);
+ } catch (ignored) {}
+ });
+ });
+ this.emitter.on(_emitter4.default.events.SCROLL_OPTIMIZE, function (mutations, context) {
+ if (context.range) {
+ var _context$range = context.range,
+ startNode = _context$range.startNode,
+ startOffset = _context$range.startOffset,
+ endNode = _context$range.endNode,
+ endOffset = _context$range.endOffset;
+
+ _this.setNativeRange(startNode, startOffset, endNode, endOffset);
+ }
+ });
+ this.update(_emitter4.default.sources.SILENT);
+ }
+
+ _createClass(Selection, [{
+ key: 'handleComposition',
+ value: function handleComposition() {
+ var _this2 = this;
+
+ this.root.addEventListener('compositionstart', function () {
+ _this2.composing = true;
+ });
+ this.root.addEventListener('compositionend', function () {
+ _this2.composing = false;
+ if (_this2.cursor.parent) {
+ var range = _this2.cursor.restore();
+ if (!range) return;
+ setTimeout(function () {
+ _this2.setNativeRange(range.startNode, range.startOffset, range.endNode, range.endOffset);
+ }, 1);
+ }
+ });
+ }
+ }, {
+ key: 'handleDragging',
+ value: function handleDragging() {
+ var _this3 = this;
+
+ this.emitter.listenDOM('mousedown', document.body, function () {
+ _this3.mouseDown = true;
+ });
+ this.emitter.listenDOM('mouseup', document.body, function () {
+ _this3.mouseDown = false;
+ _this3.update(_emitter4.default.sources.USER);
+ });
+ }
+ }, {
+ key: 'focus',
+ value: function focus() {
+ if (this.hasFocus()) return;
+ this.root.focus();
+ this.setRange(this.savedRange);
+ }
+ }, {
+ key: 'format',
+ value: function format(_format, value) {
+ if (this.scroll.whitelist != null && !this.scroll.whitelist[_format]) return;
+ this.scroll.update();
+ var nativeRange = this.getNativeRange();
+ if (nativeRange == null || !nativeRange.native.collapsed || _parchment2.default.query(_format, _parchment2.default.Scope.BLOCK)) return;
+ if (nativeRange.start.node !== this.cursor.textNode) {
+ var blot = _parchment2.default.find(nativeRange.start.node, false);
+ if (blot == null) return;
+ // TODO Give blot ability to not split
+ if (blot instanceof _parchment2.default.Leaf) {
+ var after = blot.split(nativeRange.start.offset);
+ blot.parent.insertBefore(this.cursor, after);
+ } else {
+ blot.insertBefore(this.cursor, nativeRange.start.node); // Should never happen
+ }
+ this.cursor.attach();
+ }
+ this.cursor.format(_format, value);
+ this.scroll.optimize();
+ this.setNativeRange(this.cursor.textNode, this.cursor.textNode.data.length);
+ this.update();
+ }
+ }, {
+ key: 'getBounds',
+ value: function getBounds(index) {
+ var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+
+ var scrollLength = this.scroll.length();
+ index = Math.min(index, scrollLength - 1);
+ length = Math.min(index + length, scrollLength - 1) - index;
+ var node = void 0,
+ _scroll$leaf = this.scroll.leaf(index),
+ _scroll$leaf2 = _slicedToArray(_scroll$leaf, 2),
+ leaf = _scroll$leaf2[0],
+ offset = _scroll$leaf2[1];
+ if (leaf == null) return null;
+
+ var _leaf$position = leaf.position(offset, true);
+
+ var _leaf$position2 = _slicedToArray(_leaf$position, 2);
+
+ node = _leaf$position2[0];
+ offset = _leaf$position2[1];
+
+ var range = document.createRange();
+ if (length > 0) {
+ range.setStart(node, offset);
+
+ var _scroll$leaf3 = this.scroll.leaf(index + length);
+
+ var _scroll$leaf4 = _slicedToArray(_scroll$leaf3, 2);
+
+ leaf = _scroll$leaf4[0];
+ offset = _scroll$leaf4[1];
+
+ if (leaf == null) return null;
+
+ var _leaf$position3 = leaf.position(offset, true);
+
+ var _leaf$position4 = _slicedToArray(_leaf$position3, 2);
+
+ node = _leaf$position4[0];
+ offset = _leaf$position4[1];
+
+ range.setEnd(node, offset);
+ return range.getBoundingClientRect();
+ } else {
+ var side = 'left';
+ var rect = void 0;
+ if (node instanceof Text) {
+ if (offset < node.data.length) {
+ range.setStart(node, offset);
+ range.setEnd(node, offset + 1);
+ } else {
+ range.setStart(node, offset - 1);
+ range.setEnd(node, offset);
+ side = 'right';
+ }
+ rect = range.getBoundingClientRect();
+ } else {
+ rect = leaf.domNode.getBoundingClientRect();
+ if (offset > 0) side = 'right';
+ }
+ return {
+ bottom: rect.top + rect.height,
+ height: rect.height,
+ left: rect[side],
+ right: rect[side],
+ top: rect.top,
+ width: 0
+ };
+ }
+ }
+ }, {
+ key: 'getNativeRange',
+ value: function getNativeRange() {
+ var selection = document.getSelection();
+ if (selection == null || selection.rangeCount <= 0) return null;
+ var nativeRange = selection.getRangeAt(0);
+ if (nativeRange == null) return null;
+ var range = this.normalizeNative(nativeRange);
+ debug.info('getNativeRange', range);
+ return range;
+ }
+ }, {
+ key: 'getRange',
+ value: function getRange() {
+ var normalized = this.getNativeRange();
+ if (normalized == null) return [null, null];
+ var range = this.normalizedToRange(normalized);
+ return [range, normalized];
+ }
+ }, {
+ key: 'hasFocus',
+ value: function hasFocus() {
+ return document.activeElement === this.root;
+ }
+ }, {
+ key: 'normalizedToRange',
+ value: function normalizedToRange(range) {
+ var _this4 = this;
+
+ var positions = [[range.start.node, range.start.offset]];
+ if (!range.native.collapsed) {
+ positions.push([range.end.node, range.end.offset]);
+ }
+ var indexes = positions.map(function (position) {
+ var _position = _slicedToArray(position, 2),
+ node = _position[0],
+ offset = _position[1];
+
+ var blot = _parchment2.default.find(node, true);
+ var index = blot.offset(_this4.scroll);
+ if (offset === 0) {
+ return index;
+ } else if (blot instanceof _parchment2.default.Container) {
+ return index + blot.length();
+ } else {
+ return index + blot.index(node, offset);
+ }
+ });
+ var end = Math.min(Math.max.apply(Math, _toConsumableArray(indexes)), this.scroll.length() - 1);
+ var start = Math.min.apply(Math, [end].concat(_toConsumableArray(indexes)));
+ return new Range(start, end - start);
+ }
+ }, {
+ key: 'normalizeNative',
+ value: function normalizeNative(nativeRange) {
+ if (!contains(this.root, nativeRange.startContainer) || !nativeRange.collapsed && !contains(this.root, nativeRange.endContainer)) {
+ return null;
+ }
+ var range = {
+ start: { node: nativeRange.startContainer, offset: nativeRange.startOffset },
+ end: { node: nativeRange.endContainer, offset: nativeRange.endOffset },
+ native: nativeRange
+ };
+ [range.start, range.end].forEach(function (position) {
+ var node = position.node,
+ offset = position.offset;
+ while (!(node instanceof Text) && node.childNodes.length > 0) {
+ if (node.childNodes.length > offset) {
+ node = node.childNodes[offset];
+ offset = 0;
+ } else if (node.childNodes.length === offset) {
+ node = node.lastChild;
+ offset = node instanceof Text ? node.data.length : node.childNodes.length + 1;
+ } else {
+ break;
+ }
+ }
+ position.node = node, position.offset = offset;
+ });
+ return range;
+ }
+ }, {
+ key: 'rangeToNative',
+ value: function rangeToNative(range) {
+ var _this5 = this;
+
+ var indexes = range.collapsed ? [range.index] : [range.index, range.index + range.length];
+ var args = [];
+ var scrollLength = this.scroll.length();
+ indexes.forEach(function (index, i) {
+ index = Math.min(scrollLength - 1, index);
+ var node = void 0,
+ _scroll$leaf5 = _this5.scroll.leaf(index),
+ _scroll$leaf6 = _slicedToArray(_scroll$leaf5, 2),
+ leaf = _scroll$leaf6[0],
+ offset = _scroll$leaf6[1];
+ var _leaf$position5 = leaf.position(offset, i !== 0);
+
+ var _leaf$position6 = _slicedToArray(_leaf$position5, 2);
+
+ node = _leaf$position6[0];
+ offset = _leaf$position6[1];
+
+ args.push(node, offset);
+ });
+ if (args.length < 2) {
+ args = args.concat(args);
+ }
+ return args;
+ }
+ }, {
+ key: 'scrollIntoView',
+ value: function scrollIntoView(scrollingContainer) {
+ var range = this.lastRange;
+ if (range == null) return;
+ var bounds = this.getBounds(range.index, range.length);
+ if (bounds == null) return;
+ var limit = this.scroll.length() - 1;
+
+ var _scroll$line = this.scroll.line(Math.min(range.index, limit)),
+ _scroll$line2 = _slicedToArray(_scroll$line, 1),
+ first = _scroll$line2[0];
+
+ var last = first;
+ if (range.length > 0) {
+ var _scroll$line3 = this.scroll.line(Math.min(range.index + range.length, limit));
+
+ var _scroll$line4 = _slicedToArray(_scroll$line3, 1);
+
+ last = _scroll$line4[0];
+ }
+ if (first == null || last == null) return;
+ var scrollBounds = scrollingContainer.getBoundingClientRect();
+ if (bounds.top < scrollBounds.top) {
+ scrollingContainer.scrollTop -= scrollBounds.top - bounds.top;
+ } else if (bounds.bottom > scrollBounds.bottom) {
+ scrollingContainer.scrollTop += bounds.bottom - scrollBounds.bottom;
+ }
+ }
+ }, {
+ key: 'setNativeRange',
+ value: function setNativeRange(startNode, startOffset) {
+ var endNode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : startNode;
+ var endOffset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : startOffset;
+ var force = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
+
+ debug.info('setNativeRange', startNode, startOffset, endNode, endOffset);
+ if (startNode != null && (this.root.parentNode == null || startNode.parentNode == null || endNode.parentNode == null)) {
+ return;
+ }
+ var selection = document.getSelection();
+ if (selection == null) return;
+ if (startNode != null) {
+ if (!this.hasFocus()) this.root.focus();
+ var native = (this.getNativeRange() || {}).native;
+ if (native == null || force || startNode !== native.startContainer || startOffset !== native.startOffset || endNode !== native.endContainer || endOffset !== native.endOffset) {
+
+ if (startNode.tagName == "BR") {
+ startOffset = [].indexOf.call(startNode.parentNode.childNodes, startNode);
+ startNode = startNode.parentNode;
+ }
+ if (endNode.tagName == "BR") {
+ endOffset = [].indexOf.call(endNode.parentNode.childNodes, endNode);
+ endNode = endNode.parentNode;
+ }
+ var range = document.createRange();
+ range.setStart(startNode, startOffset);
+ range.setEnd(endNode, endOffset);
+ selection.removeAllRanges();
+ selection.addRange(range);
+ }
+ } else {
+ selection.removeAllRanges();
+ this.root.blur();
+ document.body.focus(); // root.blur() not enough on IE11+Travis+SauceLabs (but not local VMs)
+ }
+ }
+ }, {
+ key: 'setRange',
+ value: function setRange(range) {
+ var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _emitter4.default.sources.API;
+
+ if (typeof force === 'string') {
+ source = force;
+ force = false;
+ }
+ debug.info('setRange', range);
+ if (range != null) {
+ var args = this.rangeToNative(range);
+ this.setNativeRange.apply(this, _toConsumableArray(args).concat([force]));
+ } else {
+ this.setNativeRange(null);
+ }
+ this.update(source);
+ }
+ }, {
+ key: 'update',
+ value: function update() {
+ var source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _emitter4.default.sources.USER;
+
+ var oldRange = this.lastRange;
+
+ var _getRange = this.getRange(),
+ _getRange2 = _slicedToArray(_getRange, 2),
+ lastRange = _getRange2[0],
+ nativeRange = _getRange2[1];
+
+ this.lastRange = lastRange;
+ if (this.lastRange != null) {
+ this.savedRange = this.lastRange;
+ }
+ if (!(0, _deepEqual2.default)(oldRange, this.lastRange)) {
+ var _emitter;
+
+ if (!this.composing && nativeRange != null && nativeRange.native.collapsed && nativeRange.start.node !== this.cursor.textNode) {
+ this.cursor.restore();
+ }
+ var args = [_emitter4.default.events.SELECTION_CHANGE, (0, _clone2.default)(this.lastRange), (0, _clone2.default)(oldRange), source];
+ (_emitter = this.emitter).emit.apply(_emitter, [_emitter4.default.events.EDITOR_CHANGE].concat(args));
+ if (source !== _emitter4.default.sources.SILENT) {
+ var _emitter2;
+
+ (_emitter2 = this.emitter).emit.apply(_emitter2, args);
+ }
+ }
+ }
+ }]);
+
+ return Selection;
+}();
+
+function contains(parent, descendant) {
+ try {
+ // Firefox inserts inaccessible nodes around video elements
+ descendant.parentNode;
+ } catch (e) {
+ return false;
+ }
+ // IE11 has bug with Text nodes
+ // https://connect.microsoft.com/IE/feedback/details/780874/node-contains-is-incorrect
+ if (descendant instanceof Text) {
+ descendant = descendant.parentNode;
+ }
+ return parent.contains(descendant);
+}
+
+exports.Range = Range;
+exports.default = Selection;
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var Break = function (_Parchment$Embed) {
+ _inherits(Break, _Parchment$Embed);
+
+ function Break() {
+ _classCallCheck(this, Break);
+
+ return _possibleConstructorReturn(this, (Break.__proto__ || Object.getPrototypeOf(Break)).apply(this, arguments));
+ }
+
+ _createClass(Break, [{
+ key: 'insertInto',
+ value: function insertInto(parent, ref) {
+ if (parent.children.length === 0) {
+ _get(Break.prototype.__proto__ || Object.getPrototypeOf(Break.prototype), 'insertInto', this).call(this, parent, ref);
+ } else {
+ this.remove();
+ }
+ }
+ }, {
+ key: 'length',
+ value: function length() {
+ return 0;
+ }
+ }, {
+ key: 'value',
+ value: function value() {
+ return '';
+ }
+ }], [{
+ key: 'value',
+ value: function value() {
+ return undefined;
+ }
+ }]);
+
+ return Break;
+}(_parchment2.default.Embed);
+
+Break.blotName = 'break';
+Break.tagName = 'BR';
+
+exports.default = Break;
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var linked_list_1 = __webpack_require__(44);
+var shadow_1 = __webpack_require__(30);
+var Registry = __webpack_require__(1);
+var ContainerBlot = /** @class */ (function (_super) {
+ __extends(ContainerBlot, _super);
+ function ContainerBlot(domNode) {
+ var _this = _super.call(this, domNode) || this;
+ _this.build();
+ return _this;
+ }
+ ContainerBlot.prototype.appendChild = function (other) {
+ this.insertBefore(other);
+ };
+ ContainerBlot.prototype.attach = function () {
+ _super.prototype.attach.call(this);
+ this.children.forEach(function (child) {
+ child.attach();
+ });
+ };
+ ContainerBlot.prototype.build = function () {
+ var _this = this;
+ this.children = new linked_list_1.default();
+ // Need to be reversed for if DOM nodes already in order
+ [].slice
+ .call(this.domNode.childNodes)
+ .reverse()
+ .forEach(function (node) {
+ try {
+ var child = makeBlot(node);
+ _this.insertBefore(child, _this.children.head || undefined);
+ }
+ catch (err) {
+ if (err instanceof Registry.ParchmentError)
+ return;
+ else
+ throw err;
+ }
+ });
+ };
+ ContainerBlot.prototype.deleteAt = function (index, length) {
+ if (index === 0 && length === this.length()) {
+ return this.remove();
+ }
+ this.children.forEachAt(index, length, function (child, offset, length) {
+ child.deleteAt(offset, length);
+ });
+ };
+ ContainerBlot.prototype.descendant = function (criteria, index) {
+ var _a = this.children.find(index), child = _a[0], offset = _a[1];
+ if ((criteria.blotName == null && criteria(child)) ||
+ (criteria.blotName != null && child instanceof criteria)) {
+ return [child, offset];
+ }
+ else if (child instanceof ContainerBlot) {
+ return child.descendant(criteria, offset);
+ }
+ else {
+ return [null, -1];
+ }
+ };
+ ContainerBlot.prototype.descendants = function (criteria, index, length) {
+ if (index === void 0) { index = 0; }
+ if (length === void 0) { length = Number.MAX_VALUE; }
+ var descendants = [];
+ var lengthLeft = length;
+ this.children.forEachAt(index, length, function (child, index, length) {
+ if ((criteria.blotName == null && criteria(child)) ||
+ (criteria.blotName != null && child instanceof criteria)) {
+ descendants.push(child);
+ }
+ if (child instanceof ContainerBlot) {
+ descendants = descendants.concat(child.descendants(criteria, index, lengthLeft));
+ }
+ lengthLeft -= length;
+ });
+ return descendants;
+ };
+ ContainerBlot.prototype.detach = function () {
+ this.children.forEach(function (child) {
+ child.detach();
+ });
+ _super.prototype.detach.call(this);
+ };
+ ContainerBlot.prototype.formatAt = function (index, length, name, value) {
+ this.children.forEachAt(index, length, function (child, offset, length) {
+ child.formatAt(offset, length, name, value);
+ });
+ };
+ ContainerBlot.prototype.insertAt = function (index, value, def) {
+ var _a = this.children.find(index), child = _a[0], offset = _a[1];
+ if (child) {
+ child.insertAt(offset, value, def);
+ }
+ else {
+ var blot = def == null ? Registry.create('text', value) : Registry.create(value, def);
+ this.appendChild(blot);
+ }
+ };
+ ContainerBlot.prototype.insertBefore = function (childBlot, refBlot) {
+ if (this.statics.allowedChildren != null &&
+ !this.statics.allowedChildren.some(function (child) {
+ return childBlot instanceof child;
+ })) {
+ throw new Registry.ParchmentError("Cannot insert " + childBlot.statics.blotName + " into " + this.statics.blotName);
+ }
+ childBlot.insertInto(this, refBlot);
+ };
+ ContainerBlot.prototype.length = function () {
+ return this.children.reduce(function (memo, child) {
+ return memo + child.length();
+ }, 0);
+ };
+ ContainerBlot.prototype.moveChildren = function (targetParent, refNode) {
+ this.children.forEach(function (child) {
+ targetParent.insertBefore(child, refNode);
+ });
+ };
+ ContainerBlot.prototype.optimize = function (context) {
+ _super.prototype.optimize.call(this, context);
+ if (this.children.length === 0) {
+ if (this.statics.defaultChild != null) {
+ var child = Registry.create(this.statics.defaultChild);
+ this.appendChild(child);
+ child.optimize(context);
+ }
+ else {
+ this.remove();
+ }
+ }
+ };
+ ContainerBlot.prototype.path = function (index, inclusive) {
+ if (inclusive === void 0) { inclusive = false; }
+ var _a = this.children.find(index, inclusive), child = _a[0], offset = _a[1];
+ var position = [[this, index]];
+ if (child instanceof ContainerBlot) {
+ return position.concat(child.path(offset, inclusive));
+ }
+ else if (child != null) {
+ position.push([child, offset]);
+ }
+ return position;
+ };
+ ContainerBlot.prototype.removeChild = function (child) {
+ this.children.remove(child);
+ };
+ ContainerBlot.prototype.replace = function (target) {
+ if (target instanceof ContainerBlot) {
+ target.moveChildren(this);
+ }
+ _super.prototype.replace.call(this, target);
+ };
+ ContainerBlot.prototype.split = function (index, force) {
+ if (force === void 0) { force = false; }
+ if (!force) {
+ if (index === 0)
+ return this;
+ if (index === this.length())
+ return this.next;
+ }
+ var after = this.clone();
+ this.parent.insertBefore(after, this.next);
+ this.children.forEachAt(index, this.length(), function (child, offset, length) {
+ child = child.split(offset, force);
+ after.appendChild(child);
+ });
+ return after;
+ };
+ ContainerBlot.prototype.unwrap = function () {
+ this.moveChildren(this.parent, this.next);
+ this.remove();
+ };
+ ContainerBlot.prototype.update = function (mutations, context) {
+ var _this = this;
+ var addedNodes = [];
+ var removedNodes = [];
+ mutations.forEach(function (mutation) {
+ if (mutation.target === _this.domNode && mutation.type === 'childList') {
+ addedNodes.push.apply(addedNodes, mutation.addedNodes);
+ removedNodes.push.apply(removedNodes, mutation.removedNodes);
+ }
+ });
+ removedNodes.forEach(function (node) {
+ // Check node has actually been removed
+ // One exception is Chrome does not immediately remove IFRAMEs
+ // from DOM but MutationRecord is correct in its reported removal
+ if (node.parentNode != null &&
+ // @ts-ignore
+ node.tagName !== 'IFRAME' &&
+ document.body.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY) {
+ return;
+ }
+ var blot = Registry.find(node);
+ if (blot == null)
+ return;
+ if (blot.domNode.parentNode == null || blot.domNode.parentNode === _this.domNode) {
+ blot.detach();
+ }
+ });
+ addedNodes
+ .filter(function (node) {
+ return node.parentNode == _this.domNode;
+ })
+ .sort(function (a, b) {
+ if (a === b)
+ return 0;
+ if (a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING) {
+ return 1;
+ }
+ return -1;
+ })
+ .forEach(function (node) {
+ var refBlot = null;
+ if (node.nextSibling != null) {
+ refBlot = Registry.find(node.nextSibling);
+ }
+ var blot = makeBlot(node);
+ if (blot.next != refBlot || blot.next == null) {
+ if (blot.parent != null) {
+ blot.parent.removeChild(_this);
+ }
+ _this.insertBefore(blot, refBlot || undefined);
+ }
+ });
+ };
+ return ContainerBlot;
+}(shadow_1.default));
+function makeBlot(node) {
+ var blot = Registry.find(node);
+ if (blot == null) {
+ try {
+ blot = Registry.create(node);
+ }
+ catch (e) {
+ blot = Registry.create(Registry.Scope.INLINE);
+ [].slice.call(node.childNodes).forEach(function (child) {
+ // @ts-ignore
+ blot.domNode.appendChild(child);
+ });
+ if (node.parentNode) {
+ node.parentNode.replaceChild(blot.domNode, node);
+ }
+ blot.attach();
+ }
+ }
+ return blot;
+}
+exports.default = ContainerBlot;
+
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var attributor_1 = __webpack_require__(12);
+var store_1 = __webpack_require__(31);
+var container_1 = __webpack_require__(17);
+var Registry = __webpack_require__(1);
+var FormatBlot = /** @class */ (function (_super) {
+ __extends(FormatBlot, _super);
+ function FormatBlot(domNode) {
+ var _this = _super.call(this, domNode) || this;
+ _this.attributes = new store_1.default(_this.domNode);
+ return _this;
+ }
+ FormatBlot.formats = function (domNode) {
+ if (typeof this.tagName === 'string') {
+ return true;
+ }
+ else if (Array.isArray(this.tagName)) {
+ return domNode.tagName.toLowerCase();
+ }
+ return undefined;
+ };
+ FormatBlot.prototype.format = function (name, value) {
+ var format = Registry.query(name);
+ if (format instanceof attributor_1.default) {
+ this.attributes.attribute(format, value);
+ }
+ else if (value) {
+ if (format != null && (name !== this.statics.blotName || this.formats()[name] !== value)) {
+ this.replaceWith(name, value);
+ }
+ }
+ };
+ FormatBlot.prototype.formats = function () {
+ var formats = this.attributes.values();
+ var format = this.statics.formats(this.domNode);
+ if (format != null) {
+ formats[this.statics.blotName] = format;
+ }
+ return formats;
+ };
+ FormatBlot.prototype.replaceWith = function (name, value) {
+ var replacement = _super.prototype.replaceWith.call(this, name, value);
+ this.attributes.copy(replacement);
+ return replacement;
+ };
+ FormatBlot.prototype.update = function (mutations, context) {
+ var _this = this;
+ _super.prototype.update.call(this, mutations, context);
+ if (mutations.some(function (mutation) {
+ return mutation.target === _this.domNode && mutation.type === 'attributes';
+ })) {
+ this.attributes.build();
+ }
+ };
+ FormatBlot.prototype.wrap = function (name, value) {
+ var wrapper = _super.prototype.wrap.call(this, name, value);
+ if (wrapper instanceof FormatBlot && wrapper.statics.scope === this.statics.scope) {
+ this.attributes.move(wrapper);
+ }
+ return wrapper;
+ };
+ return FormatBlot;
+}(container_1.default));
+exports.default = FormatBlot;
+
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var shadow_1 = __webpack_require__(30);
+var Registry = __webpack_require__(1);
+var LeafBlot = /** @class */ (function (_super) {
+ __extends(LeafBlot, _super);
+ function LeafBlot() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ LeafBlot.value = function (domNode) {
+ return true;
+ };
+ LeafBlot.prototype.index = function (node, offset) {
+ if (this.domNode === node ||
+ this.domNode.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY) {
+ return Math.min(offset, 1);
+ }
+ return -1;
+ };
+ LeafBlot.prototype.position = function (index, inclusive) {
+ var offset = [].indexOf.call(this.parent.domNode.childNodes, this.domNode);
+ if (index > 0)
+ offset += 1;
+ return [this.parent.domNode, offset];
+ };
+ LeafBlot.prototype.value = function () {
+ var _a;
+ return _a = {}, _a[this.statics.blotName] = this.statics.value(this.domNode) || true, _a;
+ };
+ LeafBlot.scope = Registry.Scope.INLINE_BLOT;
+ return LeafBlot;
+}(shadow_1.default));
+exports.default = LeafBlot;
+
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var equal = __webpack_require__(11);
+var extend = __webpack_require__(3);
+
+
+var lib = {
+ attributes: {
+ compose: function (a, b, keepNull) {
+ if (typeof a !== 'object') a = {};
+ if (typeof b !== 'object') b = {};
+ var attributes = extend(true, {}, b);
+ if (!keepNull) {
+ attributes = Object.keys(attributes).reduce(function (copy, key) {
+ if (attributes[key] != null) {
+ copy[key] = attributes[key];
+ }
+ return copy;
+ }, {});
+ }
+ for (var key in a) {
+ if (a[key] !== undefined && b[key] === undefined) {
+ attributes[key] = a[key];
+ }
+ }
+ return Object.keys(attributes).length > 0 ? attributes : undefined;
+ },
+
+ diff: function(a, b) {
+ if (typeof a !== 'object') a = {};
+ if (typeof b !== 'object') b = {};
+ var attributes = Object.keys(a).concat(Object.keys(b)).reduce(function (attributes, key) {
+ if (!equal(a[key], b[key])) {
+ attributes[key] = b[key] === undefined ? null : b[key];
+ }
+ return attributes;
+ }, {});
+ return Object.keys(attributes).length > 0 ? attributes : undefined;
+ },
+
+ transform: function (a, b, priority) {
+ if (typeof a !== 'object') return b;
+ if (typeof b !== 'object') return undefined;
+ if (!priority) return b; // b simply overwrites us without priority
+ var attributes = Object.keys(b).reduce(function (attributes, key) {
+ if (a[key] === undefined) attributes[key] = b[key]; // null is a valid value
+ return attributes;
+ }, {});
+ return Object.keys(attributes).length > 0 ? attributes : undefined;
+ }
+ },
+
+ iterator: function (ops) {
+ return new Iterator(ops);
+ },
+
+ length: function (op) {
+ if (typeof op['delete'] === 'number') {
+ return op['delete'];
+ } else if (typeof op.retain === 'number') {
+ return op.retain;
+ } else {
+ return typeof op.insert === 'string' ? op.insert.length : 1;
+ }
+ }
+};
+
+
+function Iterator(ops) {
+ this.ops = ops;
+ this.index = 0;
+ this.offset = 0;
+}
+Iterator.prototype.hasNext = function () {
+ return this.peekLength() < Infinity;
+};
+
+Iterator.prototype.next = function (length) {
+ if (!length) length = Infinity;
+ var nextOp = this.ops[this.index];
+ if (nextOp) {
+ var offset = this.offset;
+ var opLength = lib.length(nextOp);
+ if (length >= opLength - offset) {
+ length = opLength - offset;
+ this.index += 1;
+ this.offset = 0;
+ } else {
+ this.offset += length;
+ }
+ if (typeof nextOp['delete'] === 'number') {
+ return { 'delete': length };
+ } else {
+ var retOp = {};
+ if (nextOp.attributes) {
+ retOp.attributes = nextOp.attributes;
+ }
+ if (typeof nextOp.retain === 'number') {
+ retOp.retain = length;
+ } else if (typeof nextOp.insert === 'string') {
+ retOp.insert = nextOp.insert.substr(offset, length);
+ } else {
+ // offset should === 0, length should === 1
+ retOp.insert = nextOp.insert;
+ }
+ return retOp;
+ }
+ } else {
+ return { retain: Infinity };
+ }
+};
+
+Iterator.prototype.peek = function () {
+ return this.ops[this.index];
+};
+
+Iterator.prototype.peekLength = function () {
+ if (this.ops[this.index]) {
+ // Should never return 0 if our index is being managed correctly
+ return lib.length(this.ops[this.index]) - this.offset;
+ } else {
+ return Infinity;
+ }
+};
+
+Iterator.prototype.peekType = function () {
+ if (this.ops[this.index]) {
+ if (typeof this.ops[this.index]['delete'] === 'number') {
+ return 'delete';
+ } else if (typeof this.ops[this.index].retain === 'number') {
+ return 'retain';
+ } else {
+ return 'insert';
+ }
+ }
+ return 'retain';
+};
+
+Iterator.prototype.rest = function () {
+ if (!this.hasNext()) {
+ return [];
+ } else if (this.offset === 0) {
+ return this.ops.slice(this.index);
+ } else {
+ var offset = this.offset;
+ var index = this.index;
+ var next = this.next();
+ var rest = this.ops.slice(this.index);
+ this.offset = offset;
+ this.index = index;
+ return [next].concat(rest);
+ }
+};
+
+
+module.exports = lib;
+
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports) {
+
+var clone = (function() {
+
+function _instanceof(obj, type) {
+ return type != null && obj instanceof type;
+}
+
+var nativeMap;
+try {
+ nativeMap = Map;
+} catch(_) {
+ // maybe a reference error because no `Map`. Give it a dummy value that no
+ // value will ever be an instanceof.
+ nativeMap = function() {};
+}
+
+var nativeSet;
+try {
+ nativeSet = Set;
+} catch(_) {
+ nativeSet = function() {};
+}
+
+var nativePromise;
+try {
+ nativePromise = Promise;
+} catch(_) {
+ nativePromise = function() {};
+}
+
+/**
+ * Clones (copies) an Object using deep copying.
+ *
+ * This function supports circular references by default, but if you are certain
+ * there are no circular references in your object, you can save some CPU time
+ * by calling clone(obj, false).
+ *
+ * Caution: if `circular` is false and `parent` contains circular references,
+ * your program may enter an infinite loop and crash.
+ *
+ * @param `parent` - the object to be cloned
+ * @param `circular` - set to true if the object to be cloned may contain
+ * circular references. (optional - true by default)
+ * @param `depth` - set to a number if the object is only to be cloned to
+ * a particular depth. (optional - defaults to Infinity)
+ * @param `prototype` - sets the prototype to be used when cloning an object.
+ * (optional - defaults to parent prototype).
+ * @param `includeNonEnumerable` - set to true if the non-enumerable properties
+ * should be cloned as well. Non-enumerable properties on the prototype
+ * chain will be ignored. (optional - false by default)
+*/
+function clone(parent, circular, depth, prototype, includeNonEnumerable) {
+ if (typeof circular === 'object') {
+ depth = circular.depth;
+ prototype = circular.prototype;
+ includeNonEnumerable = circular.includeNonEnumerable;
+ circular = circular.circular;
+ }
+ // maintain two arrays for circular references, where corresponding parents
+ // and children have the same index
+ var allParents = [];
+ var allChildren = [];
+
+ var useBuffer = typeof Buffer != 'undefined';
+
+ if (typeof circular == 'undefined')
+ circular = true;
+
+ if (typeof depth == 'undefined')
+ depth = Infinity;
+
+ // recurse this function so we don't reset allParents and allChildren
+ function _clone(parent, depth) {
+ // cloning null always returns null
+ if (parent === null)
+ return null;
+
+ if (depth === 0)
+ return parent;
+
+ var child;
+ var proto;
+ if (typeof parent != 'object') {
+ return parent;
+ }
+
+ if (_instanceof(parent, nativeMap)) {
+ child = new nativeMap();
+ } else if (_instanceof(parent, nativeSet)) {
+ child = new nativeSet();
+ } else if (_instanceof(parent, nativePromise)) {
+ child = new nativePromise(function (resolve, reject) {
+ parent.then(function(value) {
+ resolve(_clone(value, depth - 1));
+ }, function(err) {
+ reject(_clone(err, depth - 1));
+ });
+ });
+ } else if (clone.__isArray(parent)) {
+ child = [];
+ } else if (clone.__isRegExp(parent)) {
+ child = new RegExp(parent.source, __getRegExpFlags(parent));
+ if (parent.lastIndex) child.lastIndex = parent.lastIndex;
+ } else if (clone.__isDate(parent)) {
+ child = new Date(parent.getTime());
+ } else if (useBuffer && Buffer.isBuffer(parent)) {
+ if (Buffer.allocUnsafe) {
+ // Node.js >= 4.5.0
+ child = Buffer.allocUnsafe(parent.length);
+ } else {
+ // Older Node.js versions
+ child = new Buffer(parent.length);
+ }
+ parent.copy(child);
+ return child;
+ } else if (_instanceof(parent, Error)) {
+ child = Object.create(parent);
+ } else {
+ if (typeof prototype == 'undefined') {
+ proto = Object.getPrototypeOf(parent);
+ child = Object.create(proto);
+ }
+ else {
+ child = Object.create(prototype);
+ proto = prototype;
+ }
+ }
+
+ if (circular) {
+ var index = allParents.indexOf(parent);
+
+ if (index != -1) {
+ return allChildren[index];
+ }
+ allParents.push(parent);
+ allChildren.push(child);
+ }
+
+ if (_instanceof(parent, nativeMap)) {
+ parent.forEach(function(value, key) {
+ var keyChild = _clone(key, depth - 1);
+ var valueChild = _clone(value, depth - 1);
+ child.set(keyChild, valueChild);
+ });
+ }
+ if (_instanceof(parent, nativeSet)) {
+ parent.forEach(function(value) {
+ var entryChild = _clone(value, depth - 1);
+ child.add(entryChild);
+ });
+ }
+
+ for (var i in parent) {
+ var attrs;
+ if (proto) {
+ attrs = Object.getOwnPropertyDescriptor(proto, i);
+ }
+
+ if (attrs && attrs.set == null) {
+ continue;
+ }
+ child[i] = _clone(parent[i], depth - 1);
+ }
+
+ if (Object.getOwnPropertySymbols) {
+ var symbols = Object.getOwnPropertySymbols(parent);
+ for (var i = 0; i < symbols.length; i++) {
+ // Don't need to worry about cloning a symbol because it is a primitive,
+ // like a number or string.
+ var symbol = symbols[i];
+ var descriptor = Object.getOwnPropertyDescriptor(parent, symbol);
+ if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {
+ continue;
+ }
+ child[symbol] = _clone(parent[symbol], depth - 1);
+ if (!descriptor.enumerable) {
+ Object.defineProperty(child, symbol, {
+ enumerable: false
+ });
+ }
+ }
+ }
+
+ if (includeNonEnumerable) {
+ var allPropertyNames = Object.getOwnPropertyNames(parent);
+ for (var i = 0; i < allPropertyNames.length; i++) {
+ var propertyName = allPropertyNames[i];
+ var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName);
+ if (descriptor && descriptor.enumerable) {
+ continue;
+ }
+ child[propertyName] = _clone(parent[propertyName], depth - 1);
+ Object.defineProperty(child, propertyName, {
+ enumerable: false
+ });
+ }
+ }
+
+ return child;
+ }
+
+ return _clone(parent, depth);
+}
+
+/**
+ * Simple flat clone using prototype, accepts only objects, usefull for property
+ * override on FLAT configuration object (no nested props).
+ *
+ * USE WITH CAUTION! This may not behave as you wish if you do not know how this
+ * works.
+ */
+clone.clonePrototype = function clonePrototype(parent) {
+ if (parent === null)
+ return null;
+
+ var c = function () {};
+ c.prototype = parent;
+ return new c();
+};
+
+// private utility functions
+
+function __objToStr(o) {
+ return Object.prototype.toString.call(o);
+}
+clone.__objToStr = __objToStr;
+
+function __isDate(o) {
+ return typeof o === 'object' && __objToStr(o) === '[object Date]';
+}
+clone.__isDate = __isDate;
+
+function __isArray(o) {
+ return typeof o === 'object' && __objToStr(o) === '[object Array]';
+}
+clone.__isArray = __isArray;
+
+function __isRegExp(o) {
+ return typeof o === 'object' && __objToStr(o) === '[object RegExp]';
+}
+clone.__isRegExp = __isRegExp;
+
+function __getRegExpFlags(re) {
+ var flags = '';
+ if (re.global) flags += 'g';
+ if (re.ignoreCase) flags += 'i';
+ if (re.multiline) flags += 'm';
+ return flags;
+}
+clone.__getRegExpFlags = __getRegExpFlags;
+
+return clone;
+})();
+
+if (typeof module === 'object' && module.exports) {
+ module.exports = clone;
+}
+
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _emitter = __webpack_require__(8);
+
+var _emitter2 = _interopRequireDefault(_emitter);
+
+var _block = __webpack_require__(4);
+
+var _block2 = _interopRequireDefault(_block);
+
+var _break = __webpack_require__(16);
+
+var _break2 = _interopRequireDefault(_break);
+
+var _code = __webpack_require__(13);
+
+var _code2 = _interopRequireDefault(_code);
+
+var _container = __webpack_require__(25);
+
+var _container2 = _interopRequireDefault(_container);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+function isLine(blot) {
+ return blot instanceof _block2.default || blot instanceof _block.BlockEmbed;
+}
+
+var Scroll = function (_Parchment$Scroll) {
+ _inherits(Scroll, _Parchment$Scroll);
+
+ function Scroll(domNode, config) {
+ _classCallCheck(this, Scroll);
+
+ var _this = _possibleConstructorReturn(this, (Scroll.__proto__ || Object.getPrototypeOf(Scroll)).call(this, domNode));
+
+ _this.emitter = config.emitter;
+ if (Array.isArray(config.whitelist)) {
+ _this.whitelist = config.whitelist.reduce(function (whitelist, format) {
+ whitelist[format] = true;
+ return whitelist;
+ }, {});
+ }
+ // Some reason fixes composition issues with character languages in Windows/Chrome, Safari
+ _this.domNode.addEventListener('DOMNodeInserted', function () {});
+ _this.optimize();
+ _this.enable();
+ return _this;
+ }
+
+ _createClass(Scroll, [{
+ key: 'batchStart',
+ value: function batchStart() {
+ this.batch = true;
+ }
+ }, {
+ key: 'batchEnd',
+ value: function batchEnd() {
+ this.batch = false;
+ this.optimize();
+ }
+ }, {
+ key: 'deleteAt',
+ value: function deleteAt(index, length) {
+ var _line = this.line(index),
+ _line2 = _slicedToArray(_line, 2),
+ first = _line2[0],
+ offset = _line2[1];
+
+ var _line3 = this.line(index + length),
+ _line4 = _slicedToArray(_line3, 1),
+ last = _line4[0];
+
+ _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'deleteAt', this).call(this, index, length);
+ if (last != null && first !== last && offset > 0) {
+ if (first instanceof _block.BlockEmbed || last instanceof _block.BlockEmbed) {
+ this.optimize();
+ return;
+ }
+ if (first instanceof _code2.default) {
+ var newlineIndex = first.newlineIndex(first.length(), true);
+ if (newlineIndex > -1) {
+ first = first.split(newlineIndex + 1);
+ if (first === last) {
+ this.optimize();
+ return;
+ }
+ }
+ } else if (last instanceof _code2.default) {
+ var _newlineIndex = last.newlineIndex(0);
+ if (_newlineIndex > -1) {
+ last.split(_newlineIndex + 1);
+ }
+ }
+ var ref = last.children.head instanceof _break2.default ? null : last.children.head;
+ first.moveChildren(last, ref);
+ first.remove();
+ }
+ this.optimize();
+ }
+ }, {
+ key: 'enable',
+ value: function enable() {
+ var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
+
+ this.domNode.setAttribute('contenteditable', enabled);
+ }
+ }, {
+ key: 'formatAt',
+ value: function formatAt(index, length, format, value) {
+ if (this.whitelist != null && !this.whitelist[format]) return;
+ _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'formatAt', this).call(this, index, length, format, value);
+ this.optimize();
+ }
+ }, {
+ key: 'insertAt',
+ value: function insertAt(index, value, def) {
+ if (def != null && this.whitelist != null && !this.whitelist[value]) return;
+ if (index >= this.length()) {
+ if (def == null || _parchment2.default.query(value, _parchment2.default.Scope.BLOCK) == null) {
+ var blot = _parchment2.default.create(this.statics.defaultChild);
+ this.appendChild(blot);
+ if (def == null && value.endsWith('\n')) {
+ value = value.slice(0, -1);
+ }
+ blot.insertAt(0, value, def);
+ } else {
+ var embed = _parchment2.default.create(value, def);
+ this.appendChild(embed);
+ }
+ } else {
+ _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'insertAt', this).call(this, index, value, def);
+ }
+ this.optimize();
+ }
+ }, {
+ key: 'insertBefore',
+ value: function insertBefore(blot, ref) {
+ if (blot.statics.scope === _parchment2.default.Scope.INLINE_BLOT) {
+ var wrapper = _parchment2.default.create(this.statics.defaultChild);
+ wrapper.appendChild(blot);
+ blot = wrapper;
+ }
+ _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'insertBefore', this).call(this, blot, ref);
+ }
+ }, {
+ key: 'leaf',
+ value: function leaf(index) {
+ return this.path(index).pop() || [null, -1];
+ }
+ }, {
+ key: 'line',
+ value: function line(index) {
+ if (index === this.length()) {
+ return this.line(index - 1);
+ }
+ return this.descendant(isLine, index);
+ }
+ }, {
+ key: 'lines',
+ value: function lines() {
+ var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+ var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.MAX_VALUE;
+
+ var getLines = function getLines(blot, index, length) {
+ var lines = [],
+ lengthLeft = length;
+ blot.children.forEachAt(index, length, function (child, index, length) {
+ if (isLine(child)) {
+ lines.push(child);
+ } else if (child instanceof _parchment2.default.Container) {
+ lines = lines.concat(getLines(child, index, lengthLeft));
+ }
+ lengthLeft -= length;
+ });
+ return lines;
+ };
+ return getLines(this, index, length);
+ }
+ }, {
+ key: 'optimize',
+ value: function optimize() {
+ var mutations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
+ var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ if (this.batch === true) return;
+ _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'optimize', this).call(this, mutations, context);
+ if (mutations.length > 0) {
+ this.emitter.emit(_emitter2.default.events.SCROLL_OPTIMIZE, mutations, context);
+ }
+ }
+ }, {
+ key: 'path',
+ value: function path(index) {
+ return _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'path', this).call(this, index).slice(1); // Exclude self
+ }
+ }, {
+ key: 'update',
+ value: function update(mutations) {
+ if (this.batch === true) return;
+ var source = _emitter2.default.sources.USER;
+ if (typeof mutations === 'string') {
+ source = mutations;
+ }
+ if (!Array.isArray(mutations)) {
+ mutations = this.observer.takeRecords();
+ }
+ if (mutations.length > 0) {
+ this.emitter.emit(_emitter2.default.events.SCROLL_BEFORE_UPDATE, source, mutations);
+ }
+ _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'update', this).call(this, mutations.concat([])); // pass copy
+ if (mutations.length > 0) {
+ this.emitter.emit(_emitter2.default.events.SCROLL_UPDATE, source, mutations);
+ }
+ }
+ }]);
+
+ return Scroll;
+}(_parchment2.default.Scroll);
+
+Scroll.blotName = 'scroll';
+Scroll.className = 'ql-editor';
+Scroll.tagName = 'DIV';
+Scroll.defaultChild = 'block';
+Scroll.allowedChildren = [_block2.default, _block.BlockEmbed, _container2.default];
+
+exports.default = Scroll;
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.SHORTKEY = exports.default = undefined;
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _clone = __webpack_require__(21);
+
+var _clone2 = _interopRequireDefault(_clone);
+
+var _deepEqual = __webpack_require__(11);
+
+var _deepEqual2 = _interopRequireDefault(_deepEqual);
+
+var _extend = __webpack_require__(3);
+
+var _extend2 = _interopRequireDefault(_extend);
+
+var _quillDelta = __webpack_require__(2);
+
+var _quillDelta2 = _interopRequireDefault(_quillDelta);
+
+var _op = __webpack_require__(20);
+
+var _op2 = _interopRequireDefault(_op);
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _quill = __webpack_require__(5);
+
+var _quill2 = _interopRequireDefault(_quill);
+
+var _logger = __webpack_require__(10);
+
+var _logger2 = _interopRequireDefault(_logger);
+
+var _module = __webpack_require__(9);
+
+var _module2 = _interopRequireDefault(_module);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var debug = (0, _logger2.default)('quill:keyboard');
+
+var SHORTKEY = /Mac/i.test(navigator.platform) ? 'metaKey' : 'ctrlKey';
+
+var Keyboard = function (_Module) {
+ _inherits(Keyboard, _Module);
+
+ _createClass(Keyboard, null, [{
+ key: 'match',
+ value: function match(evt, binding) {
+ binding = normalize(binding);
+ if (['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].some(function (key) {
+ return !!binding[key] !== evt[key] && binding[key] !== null;
+ })) {
+ return false;
+ }
+ return binding.key === (evt.which || evt.keyCode);
+ }
+ }]);
+
+ function Keyboard(quill, options) {
+ _classCallCheck(this, Keyboard);
+
+ var _this = _possibleConstructorReturn(this, (Keyboard.__proto__ || Object.getPrototypeOf(Keyboard)).call(this, quill, options));
+
+ _this.bindings = {};
+ Object.keys(_this.options.bindings).forEach(function (name) {
+ if (name === 'list autofill' && quill.scroll.whitelist != null && !quill.scroll.whitelist['list']) {
+ return;
+ }
+ if (_this.options.bindings[name]) {
+ _this.addBinding(_this.options.bindings[name]);
+ }
+ });
+ _this.addBinding({ key: Keyboard.keys.ENTER, shiftKey: null }, handleEnter);
+ _this.addBinding({ key: Keyboard.keys.ENTER, metaKey: null, ctrlKey: null, altKey: null }, function () {});
+ if (/Firefox/i.test(navigator.userAgent)) {
+ // Need to handle delete and backspace for Firefox in the general case #1171
+ _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true }, handleBackspace);
+ _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true }, handleDelete);
+ } else {
+ _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true, prefix: /^.?$/ }, handleBackspace);
+ _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true, suffix: /^.?$/ }, handleDelete);
+ }
+ _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: false }, handleDeleteRange);
+ _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: false }, handleDeleteRange);
+ _this.addBinding({ key: Keyboard.keys.BACKSPACE, altKey: null, ctrlKey: null, metaKey: null, shiftKey: null }, { collapsed: true, offset: 0 }, handleBackspace);
+ _this.listen();
+ return _this;
+ }
+
+ _createClass(Keyboard, [{
+ key: 'addBinding',
+ value: function addBinding(key) {
+ var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ var handler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+
+ var binding = normalize(key);
+ if (binding == null || binding.key == null) {
+ return debug.warn('Attempted to add invalid keyboard binding', binding);
+ }
+ if (typeof context === 'function') {
+ context = { handler: context };
+ }
+ if (typeof handler === 'function') {
+ handler = { handler: handler };
+ }
+ binding = (0, _extend2.default)(binding, context, handler);
+ this.bindings[binding.key] = this.bindings[binding.key] || [];
+ this.bindings[binding.key].push(binding);
+ }
+ }, {
+ key: 'listen',
+ value: function listen() {
+ var _this2 = this;
+
+ this.quill.root.addEventListener('keydown', function (evt) {
+ if (evt.defaultPrevented) return;
+ var which = evt.which || evt.keyCode;
+ var bindings = (_this2.bindings[which] || []).filter(function (binding) {
+ return Keyboard.match(evt, binding);
+ });
+ if (bindings.length === 0) return;
+ var range = _this2.quill.getSelection();
+ if (range == null || !_this2.quill.hasFocus()) return;
+
+ var _quill$getLine = _this2.quill.getLine(range.index),
+ _quill$getLine2 = _slicedToArray(_quill$getLine, 2),
+ line = _quill$getLine2[0],
+ offset = _quill$getLine2[1];
+
+ var _quill$getLeaf = _this2.quill.getLeaf(range.index),
+ _quill$getLeaf2 = _slicedToArray(_quill$getLeaf, 2),
+ leafStart = _quill$getLeaf2[0],
+ offsetStart = _quill$getLeaf2[1];
+
+ var _ref = range.length === 0 ? [leafStart, offsetStart] : _this2.quill.getLeaf(range.index + range.length),
+ _ref2 = _slicedToArray(_ref, 2),
+ leafEnd = _ref2[0],
+ offsetEnd = _ref2[1];
+
+ var prefixText = leafStart instanceof _parchment2.default.Text ? leafStart.value().slice(0, offsetStart) : '';
+ var suffixText = leafEnd instanceof _parchment2.default.Text ? leafEnd.value().slice(offsetEnd) : '';
+ var curContext = {
+ collapsed: range.length === 0,
+ empty: range.length === 0 && line.length() <= 1,
+ format: _this2.quill.getFormat(range),
+ offset: offset,
+ prefix: prefixText,
+ suffix: suffixText
+ };
+ var prevented = bindings.some(function (binding) {
+ if (binding.collapsed != null && binding.collapsed !== curContext.collapsed) return false;
+ if (binding.empty != null && binding.empty !== curContext.empty) return false;
+ if (binding.offset != null && binding.offset !== curContext.offset) return false;
+ if (Array.isArray(binding.format)) {
+ // any format is present
+ if (binding.format.every(function (name) {
+ return curContext.format[name] == null;
+ })) {
+ return false;
+ }
+ } else if (_typeof(binding.format) === 'object') {
+ // all formats must match
+ if (!Object.keys(binding.format).every(function (name) {
+ if (binding.format[name] === true) return curContext.format[name] != null;
+ if (binding.format[name] === false) return curContext.format[name] == null;
+ return (0, _deepEqual2.default)(binding.format[name], curContext.format[name]);
+ })) {
+ return false;
+ }
+ }
+ if (binding.prefix != null && !binding.prefix.test(curContext.prefix)) return false;
+ if (binding.suffix != null && !binding.suffix.test(curContext.suffix)) return false;
+ return binding.handler.call(_this2, range, curContext) !== true;
+ });
+ if (prevented) {
+ evt.preventDefault();
+ }
+ });
+ }
+ }]);
+
+ return Keyboard;
+}(_module2.default);
+
+Keyboard.keys = {
+ BACKSPACE: 8,
+ TAB: 9,
+ ENTER: 13,
+ ESCAPE: 27,
+ LEFT: 37,
+ UP: 38,
+ RIGHT: 39,
+ DOWN: 40,
+ DELETE: 46
+};
+
+Keyboard.DEFAULTS = {
+ bindings: {
+ 'bold': makeFormatHandler('bold'),
+ 'italic': makeFormatHandler('italic'),
+ 'underline': makeFormatHandler('underline'),
+ 'indent': {
+ // highlight tab or tab at beginning of list, indent or blockquote
+ key: Keyboard.keys.TAB,
+ format: ['blockquote', 'indent', 'list'],
+ handler: function handler(range, context) {
+ if (context.collapsed && context.offset !== 0) return true;
+ this.quill.format('indent', '+1', _quill2.default.sources.USER);
+ }
+ },
+ 'outdent': {
+ key: Keyboard.keys.TAB,
+ shiftKey: true,
+ format: ['blockquote', 'indent', 'list'],
+ // highlight tab or tab at beginning of list, indent or blockquote
+ handler: function handler(range, context) {
+ if (context.collapsed && context.offset !== 0) return true;
+ this.quill.format('indent', '-1', _quill2.default.sources.USER);
+ }
+ },
+ 'outdent backspace': {
+ key: Keyboard.keys.BACKSPACE,
+ collapsed: true,
+ shiftKey: null,
+ metaKey: null,
+ ctrlKey: null,
+ altKey: null,
+ format: ['indent', 'list'],
+ offset: 0,
+ handler: function handler(range, context) {
+ if (context.format.indent != null) {
+ this.quill.format('indent', '-1', _quill2.default.sources.USER);
+ } else if (context.format.list != null) {
+ this.quill.format('list', false, _quill2.default.sources.USER);
+ }
+ }
+ },
+ 'indent code-block': makeCodeBlockHandler(true),
+ 'outdent code-block': makeCodeBlockHandler(false),
+ 'remove tab': {
+ key: Keyboard.keys.TAB,
+ shiftKey: true,
+ collapsed: true,
+ prefix: /\t$/,
+ handler: function handler(range) {
+ this.quill.deleteText(range.index - 1, 1, _quill2.default.sources.USER);
+ }
+ },
+ 'tab': {
+ key: Keyboard.keys.TAB,
+ handler: function handler(range) {
+ this.quill.history.cutoff();
+ var delta = new _quillDelta2.default().retain(range.index).delete(range.length).insert('\t');
+ this.quill.updateContents(delta, _quill2.default.sources.USER);
+ this.quill.history.cutoff();
+ this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);
+ }
+ },
+ 'list empty enter': {
+ key: Keyboard.keys.ENTER,
+ collapsed: true,
+ format: ['list'],
+ empty: true,
+ handler: function handler(range, context) {
+ this.quill.format('list', false, _quill2.default.sources.USER);
+ if (context.format.indent) {
+ this.quill.format('indent', false, _quill2.default.sources.USER);
+ }
+ }
+ },
+ 'checklist enter': {
+ key: Keyboard.keys.ENTER,
+ collapsed: true,
+ format: { list: 'checked' },
+ handler: function handler(range) {
+ var _quill$getLine3 = this.quill.getLine(range.index),
+ _quill$getLine4 = _slicedToArray(_quill$getLine3, 2),
+ line = _quill$getLine4[0],
+ offset = _quill$getLine4[1];
+
+ var formats = (0, _extend2.default)({}, line.formats(), { list: 'checked' });
+ var delta = new _quillDelta2.default().retain(range.index).insert('\n', formats).retain(line.length() - offset - 1).retain(1, { list: 'unchecked' });
+ this.quill.updateContents(delta, _quill2.default.sources.USER);
+ this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);
+ this.quill.scrollIntoView();
+ }
+ },
+ 'header enter': {
+ key: Keyboard.keys.ENTER,
+ collapsed: true,
+ format: ['header'],
+ suffix: /^$/,
+ handler: function handler(range, context) {
+ var _quill$getLine5 = this.quill.getLine(range.index),
+ _quill$getLine6 = _slicedToArray(_quill$getLine5, 2),
+ line = _quill$getLine6[0],
+ offset = _quill$getLine6[1];
+
+ var delta = new _quillDelta2.default().retain(range.index).insert('\n', context.format).retain(line.length() - offset - 1).retain(1, { header: null });
+ this.quill.updateContents(delta, _quill2.default.sources.USER);
+ this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);
+ this.quill.scrollIntoView();
+ }
+ },
+ 'list autofill': {
+ key: ' ',
+ collapsed: true,
+ format: { list: false },
+ prefix: /^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/,
+ handler: function handler(range, context) {
+ var length = context.prefix.length;
+
+ var _quill$getLine7 = this.quill.getLine(range.index),
+ _quill$getLine8 = _slicedToArray(_quill$getLine7, 2),
+ line = _quill$getLine8[0],
+ offset = _quill$getLine8[1];
+
+ if (offset > length) return true;
+ var value = void 0;
+ switch (context.prefix.trim()) {
+ case '[]':case '[ ]':
+ value = 'unchecked';
+ break;
+ case '[x]':
+ value = 'checked';
+ break;
+ case '-':case '*':
+ value = 'bullet';
+ break;
+ default:
+ value = 'ordered';
+ }
+ this.quill.insertText(range.index, ' ', _quill2.default.sources.USER);
+ this.quill.history.cutoff();
+ var delta = new _quillDelta2.default().retain(range.index - offset).delete(length + 1).retain(line.length() - 2 - offset).retain(1, { list: value });
+ this.quill.updateContents(delta, _quill2.default.sources.USER);
+ this.quill.history.cutoff();
+ this.quill.setSelection(range.index - length, _quill2.default.sources.SILENT);
+ }
+ },
+ 'code exit': {
+ key: Keyboard.keys.ENTER,
+ collapsed: true,
+ format: ['code-block'],
+ prefix: /\n\n$/,
+ suffix: /^\s+$/,
+ handler: function handler(range) {
+ var _quill$getLine9 = this.quill.getLine(range.index),
+ _quill$getLine10 = _slicedToArray(_quill$getLine9, 2),
+ line = _quill$getLine10[0],
+ offset = _quill$getLine10[1];
+
+ var delta = new _quillDelta2.default().retain(range.index + line.length() - offset - 2).retain(1, { 'code-block': null }).delete(1);
+ this.quill.updateContents(delta, _quill2.default.sources.USER);
+ }
+ },
+ 'embed left': makeEmbedArrowHandler(Keyboard.keys.LEFT, false),
+ 'embed left shift': makeEmbedArrowHandler(Keyboard.keys.LEFT, true),
+ 'embed right': makeEmbedArrowHandler(Keyboard.keys.RIGHT, false),
+ 'embed right shift': makeEmbedArrowHandler(Keyboard.keys.RIGHT, true)
+ }
+};
+
+function makeEmbedArrowHandler(key, shiftKey) {
+ var _ref3;
+
+ var where = key === Keyboard.keys.LEFT ? 'prefix' : 'suffix';
+ return _ref3 = {
+ key: key,
+ shiftKey: shiftKey,
+ altKey: null
+ }, _defineProperty(_ref3, where, /^$/), _defineProperty(_ref3, 'handler', function handler(range) {
+ var index = range.index;
+ if (key === Keyboard.keys.RIGHT) {
+ index += range.length + 1;
+ }
+
+ var _quill$getLeaf3 = this.quill.getLeaf(index),
+ _quill$getLeaf4 = _slicedToArray(_quill$getLeaf3, 1),
+ leaf = _quill$getLeaf4[0];
+
+ if (!(leaf instanceof _parchment2.default.Embed)) return true;
+ if (key === Keyboard.keys.LEFT) {
+ if (shiftKey) {
+ this.quill.setSelection(range.index - 1, range.length + 1, _quill2.default.sources.USER);
+ } else {
+ this.quill.setSelection(range.index - 1, _quill2.default.sources.USER);
+ }
+ } else {
+ if (shiftKey) {
+ this.quill.setSelection(range.index, range.length + 1, _quill2.default.sources.USER);
+ } else {
+ this.quill.setSelection(range.index + range.length + 1, _quill2.default.sources.USER);
+ }
+ }
+ return false;
+ }), _ref3;
+}
+
+function handleBackspace(range, context) {
+ if (range.index === 0 || this.quill.getLength() <= 1) return;
+
+ var _quill$getLine11 = this.quill.getLine(range.index),
+ _quill$getLine12 = _slicedToArray(_quill$getLine11, 1),
+ line = _quill$getLine12[0];
+
+ var formats = {};
+ if (context.offset === 0) {
+ var _quill$getLine13 = this.quill.getLine(range.index - 1),
+ _quill$getLine14 = _slicedToArray(_quill$getLine13, 1),
+ prev = _quill$getLine14[0];
+
+ if (prev != null && prev.length() > 1) {
+ var curFormats = line.formats();
+ var prevFormats = this.quill.getFormat(range.index - 1, 1);
+ formats = _op2.default.attributes.diff(curFormats, prevFormats) || {};
+ }
+ }
+ // Check for astral symbols
+ var length = /[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(context.prefix) ? 2 : 1;
+ this.quill.deleteText(range.index - length, length, _quill2.default.sources.USER);
+ if (Object.keys(formats).length > 0) {
+ this.quill.formatLine(range.index - length, length, formats, _quill2.default.sources.USER);
+ }
+ this.quill.focus();
+}
+
+function handleDelete(range, context) {
+ // Check for astral symbols
+ var length = /^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(context.suffix) ? 2 : 1;
+ if (range.index >= this.quill.getLength() - length) return;
+ var formats = {},
+ nextLength = 0;
+
+ var _quill$getLine15 = this.quill.getLine(range.index),
+ _quill$getLine16 = _slicedToArray(_quill$getLine15, 1),
+ line = _quill$getLine16[0];
+
+ if (context.offset >= line.length() - 1) {
+ var _quill$getLine17 = this.quill.getLine(range.index + 1),
+ _quill$getLine18 = _slicedToArray(_quill$getLine17, 1),
+ next = _quill$getLine18[0];
+
+ if (next) {
+ var curFormats = line.formats();
+ var nextFormats = this.quill.getFormat(range.index, 1);
+ formats = _op2.default.attributes.diff(curFormats, nextFormats) || {};
+ nextLength = next.length();
+ }
+ }
+ this.quill.deleteText(range.index, length, _quill2.default.sources.USER);
+ if (Object.keys(formats).length > 0) {
+ this.quill.formatLine(range.index + nextLength - 1, length, formats, _quill2.default.sources.USER);
+ }
+}
+
+function handleDeleteRange(range) {
+ var lines = this.quill.getLines(range);
+ var formats = {};
+ if (lines.length > 1) {
+ var firstFormats = lines[0].formats();
+ var lastFormats = lines[lines.length - 1].formats();
+ formats = _op2.default.attributes.diff(lastFormats, firstFormats) || {};
+ }
+ this.quill.deleteText(range, _quill2.default.sources.USER);
+ if (Object.keys(formats).length > 0) {
+ this.quill.formatLine(range.index, 1, formats, _quill2.default.sources.USER);
+ }
+ this.quill.setSelection(range.index, _quill2.default.sources.SILENT);
+ this.quill.focus();
+}
+
+function handleEnter(range, context) {
+ var _this3 = this;
+
+ if (range.length > 0) {
+ this.quill.scroll.deleteAt(range.index, range.length); // So we do not trigger text-change
+ }
+ var lineFormats = Object.keys(context.format).reduce(function (lineFormats, format) {
+ if (_parchment2.default.query(format, _parchment2.default.Scope.BLOCK) && !Array.isArray(context.format[format])) {
+ lineFormats[format] = context.format[format];
+ }
+ return lineFormats;
+ }, {});
+ this.quill.insertText(range.index, '\n', lineFormats, _quill2.default.sources.USER);
+ // Earlier scroll.deleteAt might have messed up our selection,
+ // so insertText's built in selection preservation is not reliable
+ this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT);
+ this.quill.focus();
+ Object.keys(context.format).forEach(function (name) {
+ if (lineFormats[name] != null) return;
+ if (Array.isArray(context.format[name])) return;
+ if (name === 'link') return;
+ _this3.quill.format(name, context.format[name], _quill2.default.sources.USER);
+ });
+}
+
+function makeCodeBlockHandler(indent) {
+ return {
+ key: Keyboard.keys.TAB,
+ shiftKey: !indent,
+ format: { 'code-block': true },
+ handler: function handler(range) {
+ var CodeBlock = _parchment2.default.query('code-block');
+ var index = range.index,
+ length = range.length;
+
+ var _quill$scroll$descend = this.quill.scroll.descendant(CodeBlock, index),
+ _quill$scroll$descend2 = _slicedToArray(_quill$scroll$descend, 2),
+ block = _quill$scroll$descend2[0],
+ offset = _quill$scroll$descend2[1];
+
+ if (block == null) return;
+ var scrollIndex = this.quill.getIndex(block);
+ var start = block.newlineIndex(offset, true) + 1;
+ var end = block.newlineIndex(scrollIndex + offset + length);
+ var lines = block.domNode.textContent.slice(start, end).split('\n');
+ offset = 0;
+ lines.forEach(function (line, i) {
+ if (indent) {
+ block.insertAt(start + offset, CodeBlock.TAB);
+ offset += CodeBlock.TAB.length;
+ if (i === 0) {
+ index += CodeBlock.TAB.length;
+ } else {
+ length += CodeBlock.TAB.length;
+ }
+ } else if (line.startsWith(CodeBlock.TAB)) {
+ block.deleteAt(start + offset, CodeBlock.TAB.length);
+ offset -= CodeBlock.TAB.length;
+ if (i === 0) {
+ index -= CodeBlock.TAB.length;
+ } else {
+ length -= CodeBlock.TAB.length;
+ }
+ }
+ offset += line.length + 1;
+ });
+ this.quill.update(_quill2.default.sources.USER);
+ this.quill.setSelection(index, length, _quill2.default.sources.SILENT);
+ }
+ };
+}
+
+function makeFormatHandler(format) {
+ return {
+ key: format[0].toUpperCase(),
+ shortKey: true,
+ handler: function handler(range, context) {
+ this.quill.format(format, !context.format[format], _quill2.default.sources.USER);
+ }
+ };
+}
+
+function normalize(binding) {
+ if (typeof binding === 'string' || typeof binding === 'number') {
+ return normalize({ key: binding });
+ }
+ if ((typeof binding === 'undefined' ? 'undefined' : _typeof(binding)) === 'object') {
+ binding = (0, _clone2.default)(binding, false);
+ }
+ if (typeof binding.key === 'string') {
+ if (Keyboard.keys[binding.key.toUpperCase()] != null) {
+ binding.key = Keyboard.keys[binding.key.toUpperCase()];
+ } else if (binding.key.length === 1) {
+ binding.key = binding.key.toUpperCase().charCodeAt(0);
+ } else {
+ return null;
+ }
+ }
+ if (binding.shortKey) {
+ binding[SHORTKEY] = binding.shortKey;
+ delete binding.shortKey;
+ }
+ return binding;
+}
+
+exports.default = Keyboard;
+exports.SHORTKEY = SHORTKEY;
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _text = __webpack_require__(7);
+
+var _text2 = _interopRequireDefault(_text);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var Cursor = function (_Parchment$Embed) {
+ _inherits(Cursor, _Parchment$Embed);
+
+ _createClass(Cursor, null, [{
+ key: 'value',
+ value: function value() {
+ return undefined;
+ }
+ }]);
+
+ function Cursor(domNode, selection) {
+ _classCallCheck(this, Cursor);
+
+ var _this = _possibleConstructorReturn(this, (Cursor.__proto__ || Object.getPrototypeOf(Cursor)).call(this, domNode));
+
+ _this.selection = selection;
+ _this.textNode = document.createTextNode(Cursor.CONTENTS);
+ _this.domNode.appendChild(_this.textNode);
+ _this._length = 0;
+ return _this;
+ }
+
+ _createClass(Cursor, [{
+ key: 'detach',
+ value: function detach() {
+ // super.detach() will also clear domNode.__blot
+ if (this.parent != null) this.parent.removeChild(this);
+ }
+ }, {
+ key: 'format',
+ value: function format(name, value) {
+ if (this._length !== 0) {
+ return _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'format', this).call(this, name, value);
+ }
+ var target = this,
+ index = 0;
+ while (target != null && target.statics.scope !== _parchment2.default.Scope.BLOCK_BLOT) {
+ index += target.offset(target.parent);
+ target = target.parent;
+ }
+ if (target != null) {
+ this._length = Cursor.CONTENTS.length;
+ target.optimize();
+ target.formatAt(index, Cursor.CONTENTS.length, name, value);
+ this._length = 0;
+ }
+ }
+ }, {
+ key: 'index',
+ value: function index(node, offset) {
+ if (node === this.textNode) return 0;
+ return _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'index', this).call(this, node, offset);
+ }
+ }, {
+ key: 'length',
+ value: function length() {
+ return this._length;
+ }
+ }, {
+ key: 'position',
+ value: function position() {
+ return [this.textNode, this.textNode.data.length];
+ }
+ }, {
+ key: 'remove',
+ value: function remove() {
+ _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'remove', this).call(this);
+ this.parent = null;
+ }
+ }, {
+ key: 'restore',
+ value: function restore() {
+ if (this.selection.composing || this.parent == null) return;
+ var textNode = this.textNode;
+ var range = this.selection.getNativeRange();
+ var restoreText = void 0,
+ start = void 0,
+ end = void 0;
+ if (range != null && range.start.node === textNode && range.end.node === textNode) {
+ var _ref = [textNode, range.start.offset, range.end.offset];
+ restoreText = _ref[0];
+ start = _ref[1];
+ end = _ref[2];
+ }
+ // Link format will insert text outside of anchor tag
+ while (this.domNode.lastChild != null && this.domNode.lastChild !== this.textNode) {
+ this.domNode.parentNode.insertBefore(this.domNode.lastChild, this.domNode);
+ }
+ if (this.textNode.data !== Cursor.CONTENTS) {
+ var text = this.textNode.data.split(Cursor.CONTENTS).join('');
+ if (this.next instanceof _text2.default) {
+ restoreText = this.next.domNode;
+ this.next.insertAt(0, text);
+ this.textNode.data = Cursor.CONTENTS;
+ } else {
+ this.textNode.data = text;
+ this.parent.insertBefore(_parchment2.default.create(this.textNode), this);
+ this.textNode = document.createTextNode(Cursor.CONTENTS);
+ this.domNode.appendChild(this.textNode);
+ }
+ }
+ this.remove();
+ if (start != null) {
+ var _map = [start, end].map(function (offset) {
+ return Math.max(0, Math.min(restoreText.data.length, offset - 1));
+ });
+
+ var _map2 = _slicedToArray(_map, 2);
+
+ start = _map2[0];
+ end = _map2[1];
+
+ return {
+ startNode: restoreText,
+ startOffset: start,
+ endNode: restoreText,
+ endOffset: end
+ };
+ }
+ }
+ }, {
+ key: 'update',
+ value: function update(mutations, context) {
+ var _this2 = this;
+
+ if (mutations.some(function (mutation) {
+ return mutation.type === 'characterData' && mutation.target === _this2.textNode;
+ })) {
+ var range = this.restore();
+ if (range) context.range = range;
+ }
+ }
+ }, {
+ key: 'value',
+ value: function value() {
+ return '';
+ }
+ }]);
+
+ return Cursor;
+}(_parchment2.default.Embed);
+
+Cursor.blotName = 'cursor';
+Cursor.className = 'ql-cursor';
+Cursor.tagName = 'span';
+Cursor.CONTENTS = '\uFEFF'; // Zero width no break space
+
+
+exports.default = Cursor;
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _block = __webpack_require__(4);
+
+var _block2 = _interopRequireDefault(_block);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var Container = function (_Parchment$Container) {
+ _inherits(Container, _Parchment$Container);
+
+ function Container() {
+ _classCallCheck(this, Container);
+
+ return _possibleConstructorReturn(this, (Container.__proto__ || Object.getPrototypeOf(Container)).apply(this, arguments));
+ }
+
+ return Container;
+}(_parchment2.default.Container);
+
+Container.allowedChildren = [_block2.default, _block.BlockEmbed, Container];
+
+exports.default = Container;
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.ColorStyle = exports.ColorClass = exports.ColorAttributor = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var ColorAttributor = function (_Parchment$Attributor) {
+ _inherits(ColorAttributor, _Parchment$Attributor);
+
+ function ColorAttributor() {
+ _classCallCheck(this, ColorAttributor);
+
+ return _possibleConstructorReturn(this, (ColorAttributor.__proto__ || Object.getPrototypeOf(ColorAttributor)).apply(this, arguments));
+ }
+
+ _createClass(ColorAttributor, [{
+ key: 'value',
+ value: function value(domNode) {
+ var value = _get(ColorAttributor.prototype.__proto__ || Object.getPrototypeOf(ColorAttributor.prototype), 'value', this).call(this, domNode);
+ if (!value.startsWith('rgb(')) return value;
+ value = value.replace(/^[^\d]+/, '').replace(/[^\d]+$/, '');
+ return '#' + value.split(',').map(function (component) {
+ return ('00' + parseInt(component).toString(16)).slice(-2);
+ }).join('');
+ }
+ }]);
+
+ return ColorAttributor;
+}(_parchment2.default.Attributor.Style);
+
+var ColorClass = new _parchment2.default.Attributor.Class('color', 'ql-color', {
+ scope: _parchment2.default.Scope.INLINE
+});
+var ColorStyle = new ColorAttributor('color', 'color', {
+ scope: _parchment2.default.Scope.INLINE
+});
+
+exports.ColorAttributor = ColorAttributor;
+exports.ColorClass = ColorClass;
+exports.ColorStyle = ColorStyle;
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.sanitize = exports.default = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _inline = __webpack_require__(6);
+
+var _inline2 = _interopRequireDefault(_inline);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var Link = function (_Inline) {
+ _inherits(Link, _Inline);
+
+ function Link() {
+ _classCallCheck(this, Link);
+
+ return _possibleConstructorReturn(this, (Link.__proto__ || Object.getPrototypeOf(Link)).apply(this, arguments));
+ }
+
+ _createClass(Link, [{
+ key: 'format',
+ value: function format(name, value) {
+ if (name !== this.statics.blotName || !value) return _get(Link.prototype.__proto__ || Object.getPrototypeOf(Link.prototype), 'format', this).call(this, name, value);
+ value = this.constructor.sanitize(value);
+ this.domNode.setAttribute('href', value);
+ }
+ }], [{
+ key: 'create',
+ value: function create(value) {
+ var node = _get(Link.__proto__ || Object.getPrototypeOf(Link), 'create', this).call(this, value);
+ value = this.sanitize(value);
+ node.setAttribute('href', value);
+ node.setAttribute('rel', 'noopener noreferrer');
+ node.setAttribute('target', '_blank');
+ return node;
+ }
+ }, {
+ key: 'formats',
+ value: function formats(domNode) {
+ return domNode.getAttribute('href');
+ }
+ }, {
+ key: 'sanitize',
+ value: function sanitize(url) {
+ return _sanitize(url, this.PROTOCOL_WHITELIST) ? url : this.SANITIZED_URL;
+ }
+ }]);
+
+ return Link;
+}(_inline2.default);
+
+Link.blotName = 'link';
+Link.tagName = 'A';
+Link.SANITIZED_URL = 'about:blank';
+Link.PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel'];
+
+function _sanitize(url, protocols) {
+ var anchor = document.createElement('a');
+ anchor.href = url;
+ var protocol = anchor.href.slice(0, anchor.href.indexOf(':'));
+ return protocols.indexOf(protocol) > -1;
+}
+
+exports.default = Link;
+exports.sanitize = _sanitize;
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _keyboard = __webpack_require__(23);
+
+var _keyboard2 = _interopRequireDefault(_keyboard);
+
+var _dropdown = __webpack_require__(107);
+
+var _dropdown2 = _interopRequireDefault(_dropdown);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var optionsCounter = 0;
+
+function toggleAriaAttribute(element, attribute) {
+ element.setAttribute(attribute, !(element.getAttribute(attribute) === 'true'));
+}
+
+var Picker = function () {
+ function Picker(select) {
+ var _this = this;
+
+ _classCallCheck(this, Picker);
+
+ this.select = select;
+ this.container = document.createElement('span');
+ this.buildPicker();
+ this.select.style.display = 'none';
+ this.select.parentNode.insertBefore(this.container, this.select);
+
+ this.label.addEventListener('mousedown', function () {
+ _this.togglePicker();
+ });
+ this.label.addEventListener('keydown', function (event) {
+ switch (event.keyCode) {
+ // Allows the "Enter" key to open the picker
+ case _keyboard2.default.keys.ENTER:
+ _this.togglePicker();
+ break;
+
+ // Allows the "Escape" key to close the picker
+ case _keyboard2.default.keys.ESCAPE:
+ _this.escape();
+ event.preventDefault();
+ break;
+ }
+ });
+ this.select.addEventListener('change', this.update.bind(this));
+ }
+
+ _createClass(Picker, [{
+ key: 'togglePicker',
+ value: function togglePicker() {
+ this.container.classList.toggle('ql-expanded');
+ // Toggle aria-expanded and aria-hidden to make the picker accessible
+ toggleAriaAttribute(this.label, 'aria-expanded');
+ toggleAriaAttribute(this.options, 'aria-hidden');
+ }
+ }, {
+ key: 'buildItem',
+ value: function buildItem(option) {
+ var _this2 = this;
+
+ var item = document.createElement('span');
+ item.tabIndex = '0';
+ item.setAttribute('role', 'button');
+
+ item.classList.add('ql-picker-item');
+ if (option.hasAttribute('value')) {
+ item.setAttribute('data-value', option.getAttribute('value'));
+ }
+ if (option.textContent) {
+ item.setAttribute('data-label', option.textContent);
+ }
+ item.addEventListener('click', function () {
+ _this2.selectItem(item, true);
+ });
+ item.addEventListener('keydown', function (event) {
+ switch (event.keyCode) {
+ // Allows the "Enter" key to select an item
+ case _keyboard2.default.keys.ENTER:
+ _this2.selectItem(item, true);
+ event.preventDefault();
+ break;
+
+ // Allows the "Escape" key to close the picker
+ case _keyboard2.default.keys.ESCAPE:
+ _this2.escape();
+ event.preventDefault();
+ break;
+ }
+ });
+
+ return item;
+ }
+ }, {
+ key: 'buildLabel',
+ value: function buildLabel() {
+ var label = document.createElement('span');
+ label.classList.add('ql-picker-label');
+ label.innerHTML = _dropdown2.default;
+ label.tabIndex = '0';
+ label.setAttribute('role', 'button');
+ label.setAttribute('aria-expanded', 'false');
+ this.container.appendChild(label);
+ return label;
+ }
+ }, {
+ key: 'buildOptions',
+ value: function buildOptions() {
+ var _this3 = this;
+
+ var options = document.createElement('span');
+ options.classList.add('ql-picker-options');
+
+ // Don't want screen readers to read this until options are visible
+ options.setAttribute('aria-hidden', 'true');
+ options.tabIndex = '-1';
+
+ // Need a unique id for aria-controls
+ options.id = 'ql-picker-options-' + optionsCounter;
+ optionsCounter += 1;
+ this.label.setAttribute('aria-controls', options.id);
+
+ this.options = options;
+
+ [].slice.call(this.select.options).forEach(function (option) {
+ var item = _this3.buildItem(option);
+ options.appendChild(item);
+ if (option.selected === true) {
+ _this3.selectItem(item);
+ }
+ });
+ this.container.appendChild(options);
+ }
+ }, {
+ key: 'buildPicker',
+ value: function buildPicker() {
+ var _this4 = this;
+
+ [].slice.call(this.select.attributes).forEach(function (item) {
+ _this4.container.setAttribute(item.name, item.value);
+ });
+ this.container.classList.add('ql-picker');
+ this.label = this.buildLabel();
+ this.buildOptions();
+ }
+ }, {
+ key: 'escape',
+ value: function escape() {
+ var _this5 = this;
+
+ // Close menu and return focus to trigger label
+ this.close();
+ // Need setTimeout for accessibility to ensure that the browser executes
+ // focus on the next process thread and after any DOM content changes
+ setTimeout(function () {
+ return _this5.label.focus();
+ }, 1);
+ }
+ }, {
+ key: 'close',
+ value: function close() {
+ this.container.classList.remove('ql-expanded');
+ this.label.setAttribute('aria-expanded', 'false');
+ this.options.setAttribute('aria-hidden', 'true');
+ }
+ }, {
+ key: 'selectItem',
+ value: function selectItem(item) {
+ var trigger = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ var selected = this.container.querySelector('.ql-selected');
+ if (item === selected) return;
+ if (selected != null) {
+ selected.classList.remove('ql-selected');
+ }
+ if (item == null) return;
+ item.classList.add('ql-selected');
+ this.select.selectedIndex = [].indexOf.call(item.parentNode.children, item);
+ if (item.hasAttribute('data-value')) {
+ this.label.setAttribute('data-value', item.getAttribute('data-value'));
+ } else {
+ this.label.removeAttribute('data-value');
+ }
+ if (item.hasAttribute('data-label')) {
+ this.label.setAttribute('data-label', item.getAttribute('data-label'));
+ } else {
+ this.label.removeAttribute('data-label');
+ }
+ if (trigger) {
+ if (typeof Event === 'function') {
+ this.select.dispatchEvent(new Event('change'));
+ } else if ((typeof Event === 'undefined' ? 'undefined' : _typeof(Event)) === 'object') {
+ // IE11
+ var event = document.createEvent('Event');
+ event.initEvent('change', true, true);
+ this.select.dispatchEvent(event);
+ }
+ this.close();
+ }
+ }
+ }, {
+ key: 'update',
+ value: function update() {
+ var option = void 0;
+ if (this.select.selectedIndex > -1) {
+ var item = this.container.querySelector('.ql-picker-options').children[this.select.selectedIndex];
+ option = this.select.options[this.select.selectedIndex];
+ this.selectItem(item);
+ } else {
+ this.selectItem(null);
+ }
+ var isActive = option != null && option !== this.select.querySelector('option[selected]');
+ this.label.classList.toggle('ql-active', isActive);
+ }
+ }]);
+
+ return Picker;
+}();
+
+exports.default = Picker;
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _quill = __webpack_require__(5);
+
+var _quill2 = _interopRequireDefault(_quill);
+
+var _block = __webpack_require__(4);
+
+var _block2 = _interopRequireDefault(_block);
+
+var _break = __webpack_require__(16);
+
+var _break2 = _interopRequireDefault(_break);
+
+var _container = __webpack_require__(25);
+
+var _container2 = _interopRequireDefault(_container);
+
+var _cursor = __webpack_require__(24);
+
+var _cursor2 = _interopRequireDefault(_cursor);
+
+var _embed = __webpack_require__(35);
+
+var _embed2 = _interopRequireDefault(_embed);
+
+var _inline = __webpack_require__(6);
+
+var _inline2 = _interopRequireDefault(_inline);
+
+var _scroll = __webpack_require__(22);
+
+var _scroll2 = _interopRequireDefault(_scroll);
+
+var _text = __webpack_require__(7);
+
+var _text2 = _interopRequireDefault(_text);
+
+var _clipboard = __webpack_require__(55);
+
+var _clipboard2 = _interopRequireDefault(_clipboard);
+
+var _history = __webpack_require__(42);
+
+var _history2 = _interopRequireDefault(_history);
+
+var _keyboard = __webpack_require__(23);
+
+var _keyboard2 = _interopRequireDefault(_keyboard);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+_quill2.default.register({
+ 'blots/block': _block2.default,
+ 'blots/block/embed': _block.BlockEmbed,
+ 'blots/break': _break2.default,
+ 'blots/container': _container2.default,
+ 'blots/cursor': _cursor2.default,
+ 'blots/embed': _embed2.default,
+ 'blots/inline': _inline2.default,
+ 'blots/scroll': _scroll2.default,
+ 'blots/text': _text2.default,
+
+ 'modules/clipboard': _clipboard2.default,
+ 'modules/history': _history2.default,
+ 'modules/keyboard': _keyboard2.default
+});
+
+_parchment2.default.register(_block2.default, _break2.default, _cursor2.default, _inline2.default, _scroll2.default, _text2.default);
+
+exports.default = _quill2.default;
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var Registry = __webpack_require__(1);
+var ShadowBlot = /** @class */ (function () {
+ function ShadowBlot(domNode) {
+ this.domNode = domNode;
+ // @ts-ignore
+ this.domNode[Registry.DATA_KEY] = { blot: this };
+ }
+ Object.defineProperty(ShadowBlot.prototype, "statics", {
+ // Hack for accessing inherited static methods
+ get: function () {
+ return this.constructor;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ ShadowBlot.create = function (value) {
+ if (this.tagName == null) {
+ throw new Registry.ParchmentError('Blot definition missing tagName');
+ }
+ var node;
+ if (Array.isArray(this.tagName)) {
+ if (typeof value === 'string') {
+ value = value.toUpperCase();
+ if (parseInt(value).toString() === value) {
+ value = parseInt(value);
+ }
+ }
+ if (typeof value === 'number') {
+ node = document.createElement(this.tagName[value - 1]);
+ }
+ else if (this.tagName.indexOf(value) > -1) {
+ node = document.createElement(value);
+ }
+ else {
+ node = document.createElement(this.tagName[0]);
+ }
+ }
+ else {
+ node = document.createElement(this.tagName);
+ }
+ if (this.className) {
+ node.classList.add(this.className);
+ }
+ return node;
+ };
+ ShadowBlot.prototype.attach = function () {
+ if (this.parent != null) {
+ this.scroll = this.parent.scroll;
+ }
+ };
+ ShadowBlot.prototype.clone = function () {
+ var domNode = this.domNode.cloneNode(false);
+ return Registry.create(domNode);
+ };
+ ShadowBlot.prototype.detach = function () {
+ if (this.parent != null)
+ this.parent.removeChild(this);
+ // @ts-ignore
+ delete this.domNode[Registry.DATA_KEY];
+ };
+ ShadowBlot.prototype.deleteAt = function (index, length) {
+ var blot = this.isolate(index, length);
+ blot.remove();
+ };
+ ShadowBlot.prototype.formatAt = function (index, length, name, value) {
+ var blot = this.isolate(index, length);
+ if (Registry.query(name, Registry.Scope.BLOT) != null && value) {
+ blot.wrap(name, value);
+ }
+ else if (Registry.query(name, Registry.Scope.ATTRIBUTE) != null) {
+ var parent = Registry.create(this.statics.scope);
+ blot.wrap(parent);
+ parent.format(name, value);
+ }
+ };
+ ShadowBlot.prototype.insertAt = function (index, value, def) {
+ var blot = def == null ? Registry.create('text', value) : Registry.create(value, def);
+ var ref = this.split(index);
+ this.parent.insertBefore(blot, ref);
+ };
+ ShadowBlot.prototype.insertInto = function (parentBlot, refBlot) {
+ if (refBlot === void 0) { refBlot = null; }
+ if (this.parent != null) {
+ this.parent.children.remove(this);
+ }
+ var refDomNode = null;
+ parentBlot.children.insertBefore(this, refBlot);
+ if (refBlot != null) {
+ refDomNode = refBlot.domNode;
+ }
+ if (this.domNode.parentNode != parentBlot.domNode ||
+ this.domNode.nextSibling != refDomNode) {
+ parentBlot.domNode.insertBefore(this.domNode, refDomNode);
+ }
+ this.parent = parentBlot;
+ this.attach();
+ };
+ ShadowBlot.prototype.isolate = function (index, length) {
+ var target = this.split(index);
+ target.split(length);
+ return target;
+ };
+ ShadowBlot.prototype.length = function () {
+ return 1;
+ };
+ ShadowBlot.prototype.offset = function (root) {
+ if (root === void 0) { root = this.parent; }
+ if (this.parent == null || this == root)
+ return 0;
+ return this.parent.children.offset(this) + this.parent.offset(root);
+ };
+ ShadowBlot.prototype.optimize = function (context) {
+ // TODO clean up once we use WeakMap
+ // @ts-ignore
+ if (this.domNode[Registry.DATA_KEY] != null) {
+ // @ts-ignore
+ delete this.domNode[Registry.DATA_KEY].mutations;
+ }
+ };
+ ShadowBlot.prototype.remove = function () {
+ if (this.domNode.parentNode != null) {
+ this.domNode.parentNode.removeChild(this.domNode);
+ }
+ this.detach();
+ };
+ ShadowBlot.prototype.replace = function (target) {
+ if (target.parent == null)
+ return;
+ target.parent.insertBefore(this, target.next);
+ target.remove();
+ };
+ ShadowBlot.prototype.replaceWith = function (name, value) {
+ var replacement = typeof name === 'string' ? Registry.create(name, value) : name;
+ replacement.replace(this);
+ return replacement;
+ };
+ ShadowBlot.prototype.split = function (index, force) {
+ return index === 0 ? this : this.next;
+ };
+ ShadowBlot.prototype.update = function (mutations, context) {
+ // Nothing to do by default
+ };
+ ShadowBlot.prototype.wrap = function (name, value) {
+ var wrapper = typeof name === 'string' ? Registry.create(name, value) : name;
+ if (this.parent != null) {
+ this.parent.insertBefore(wrapper, this.next);
+ }
+ wrapper.appendChild(this);
+ return wrapper;
+ };
+ ShadowBlot.blotName = 'abstract';
+ return ShadowBlot;
+}());
+exports.default = ShadowBlot;
+
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var attributor_1 = __webpack_require__(12);
+var class_1 = __webpack_require__(32);
+var style_1 = __webpack_require__(33);
+var Registry = __webpack_require__(1);
+var AttributorStore = /** @class */ (function () {
+ function AttributorStore(domNode) {
+ this.attributes = {};
+ this.domNode = domNode;
+ this.build();
+ }
+ AttributorStore.prototype.attribute = function (attribute, value) {
+ // verb
+ if (value) {
+ if (attribute.add(this.domNode, value)) {
+ if (attribute.value(this.domNode) != null) {
+ this.attributes[attribute.attrName] = attribute;
+ }
+ else {
+ delete this.attributes[attribute.attrName];
+ }
+ }
+ }
+ else {
+ attribute.remove(this.domNode);
+ delete this.attributes[attribute.attrName];
+ }
+ };
+ AttributorStore.prototype.build = function () {
+ var _this = this;
+ this.attributes = {};
+ var attributes = attributor_1.default.keys(this.domNode);
+ var classes = class_1.default.keys(this.domNode);
+ var styles = style_1.default.keys(this.domNode);
+ attributes
+ .concat(classes)
+ .concat(styles)
+ .forEach(function (name) {
+ var attr = Registry.query(name, Registry.Scope.ATTRIBUTE);
+ if (attr instanceof attributor_1.default) {
+ _this.attributes[attr.attrName] = attr;
+ }
+ });
+ };
+ AttributorStore.prototype.copy = function (target) {
+ var _this = this;
+ Object.keys(this.attributes).forEach(function (key) {
+ var value = _this.attributes[key].value(_this.domNode);
+ target.format(key, value);
+ });
+ };
+ AttributorStore.prototype.move = function (target) {
+ var _this = this;
+ this.copy(target);
+ Object.keys(this.attributes).forEach(function (key) {
+ _this.attributes[key].remove(_this.domNode);
+ });
+ this.attributes = {};
+ };
+ AttributorStore.prototype.values = function () {
+ var _this = this;
+ return Object.keys(this.attributes).reduce(function (attributes, name) {
+ attributes[name] = _this.attributes[name].value(_this.domNode);
+ return attributes;
+ }, {});
+ };
+ return AttributorStore;
+}());
+exports.default = AttributorStore;
+
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var attributor_1 = __webpack_require__(12);
+function match(node, prefix) {
+ var className = node.getAttribute('class') || '';
+ return className.split(/\s+/).filter(function (name) {
+ return name.indexOf(prefix + "-") === 0;
+ });
+}
+var ClassAttributor = /** @class */ (function (_super) {
+ __extends(ClassAttributor, _super);
+ function ClassAttributor() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ ClassAttributor.keys = function (node) {
+ return (node.getAttribute('class') || '').split(/\s+/).map(function (name) {
+ return name
+ .split('-')
+ .slice(0, -1)
+ .join('-');
+ });
+ };
+ ClassAttributor.prototype.add = function (node, value) {
+ if (!this.canAdd(node, value))
+ return false;
+ this.remove(node);
+ node.classList.add(this.keyName + "-" + value);
+ return true;
+ };
+ ClassAttributor.prototype.remove = function (node) {
+ var matches = match(node, this.keyName);
+ matches.forEach(function (name) {
+ node.classList.remove(name);
+ });
+ if (node.classList.length === 0) {
+ node.removeAttribute('class');
+ }
+ };
+ ClassAttributor.prototype.value = function (node) {
+ var result = match(node, this.keyName)[0] || '';
+ var value = result.slice(this.keyName.length + 1); // +1 for hyphen
+ return this.canAdd(node, value) ? value : '';
+ };
+ return ClassAttributor;
+}(attributor_1.default));
+exports.default = ClassAttributor;
+
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var attributor_1 = __webpack_require__(12);
+function camelize(name) {
+ var parts = name.split('-');
+ var rest = parts
+ .slice(1)
+ .map(function (part) {
+ return part[0].toUpperCase() + part.slice(1);
+ })
+ .join('');
+ return parts[0] + rest;
+}
+var StyleAttributor = /** @class */ (function (_super) {
+ __extends(StyleAttributor, _super);
+ function StyleAttributor() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ StyleAttributor.keys = function (node) {
+ return (node.getAttribute('style') || '').split(';').map(function (value) {
+ var arr = value.split(':');
+ return arr[0].trim();
+ });
+ };
+ StyleAttributor.prototype.add = function (node, value) {
+ if (!this.canAdd(node, value))
+ return false;
+ // @ts-ignore
+ node.style[camelize(this.keyName)] = value;
+ return true;
+ };
+ StyleAttributor.prototype.remove = function (node) {
+ // @ts-ignore
+ node.style[camelize(this.keyName)] = '';
+ if (!node.getAttribute('style')) {
+ node.removeAttribute('style');
+ }
+ };
+ StyleAttributor.prototype.value = function (node) {
+ // @ts-ignore
+ var value = node.style[camelize(this.keyName)];
+ return this.canAdd(node, value) ? value : '';
+ };
+ return StyleAttributor;
+}(attributor_1.default));
+exports.default = StyleAttributor;
+
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var Theme = function () {
+ function Theme(quill, options) {
+ _classCallCheck(this, Theme);
+
+ this.quill = quill;
+ this.options = options;
+ this.modules = {};
+ }
+
+ _createClass(Theme, [{
+ key: 'init',
+ value: function init() {
+ var _this = this;
+
+ Object.keys(this.options.modules).forEach(function (name) {
+ if (_this.modules[name] == null) {
+ _this.addModule(name);
+ }
+ });
+ }
+ }, {
+ key: 'addModule',
+ value: function addModule(name) {
+ var moduleClass = this.quill.constructor.import('modules/' + name);
+ this.modules[name] = new moduleClass(this.quill, this.options.modules[name] || {});
+ return this.modules[name];
+ }
+ }]);
+
+ return Theme;
+}();
+
+Theme.DEFAULTS = {
+ modules: {}
+};
+Theme.themes = {
+ 'default': Theme
+};
+
+exports.default = Theme;
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _text = __webpack_require__(7);
+
+var _text2 = _interopRequireDefault(_text);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var GUARD_TEXT = '\uFEFF';
+
+var Embed = function (_Parchment$Embed) {
+ _inherits(Embed, _Parchment$Embed);
+
+ function Embed(node) {
+ _classCallCheck(this, Embed);
+
+ var _this = _possibleConstructorReturn(this, (Embed.__proto__ || Object.getPrototypeOf(Embed)).call(this, node));
+
+ _this.contentNode = document.createElement('span');
+ _this.contentNode.setAttribute('contenteditable', false);
+ [].slice.call(_this.domNode.childNodes).forEach(function (childNode) {
+ _this.contentNode.appendChild(childNode);
+ });
+ _this.leftGuard = document.createTextNode(GUARD_TEXT);
+ _this.rightGuard = document.createTextNode(GUARD_TEXT);
+ _this.domNode.appendChild(_this.leftGuard);
+ _this.domNode.appendChild(_this.contentNode);
+ _this.domNode.appendChild(_this.rightGuard);
+ return _this;
+ }
+
+ _createClass(Embed, [{
+ key: 'index',
+ value: function index(node, offset) {
+ if (node === this.leftGuard) return 0;
+ if (node === this.rightGuard) return 1;
+ return _get(Embed.prototype.__proto__ || Object.getPrototypeOf(Embed.prototype), 'index', this).call(this, node, offset);
+ }
+ }, {
+ key: 'restore',
+ value: function restore(node) {
+ var range = void 0,
+ textNode = void 0;
+ var text = node.data.split(GUARD_TEXT).join('');
+ if (node === this.leftGuard) {
+ if (this.prev instanceof _text2.default) {
+ var prevLength = this.prev.length();
+ this.prev.insertAt(prevLength, text);
+ range = {
+ startNode: this.prev.domNode,
+ startOffset: prevLength + text.length
+ };
+ } else {
+ textNode = document.createTextNode(text);
+ this.parent.insertBefore(_parchment2.default.create(textNode), this);
+ range = {
+ startNode: textNode,
+ startOffset: text.length
+ };
+ }
+ } else if (node === this.rightGuard) {
+ if (this.next instanceof _text2.default) {
+ this.next.insertAt(0, text);
+ range = {
+ startNode: this.next.domNode,
+ startOffset: text.length
+ };
+ } else {
+ textNode = document.createTextNode(text);
+ this.parent.insertBefore(_parchment2.default.create(textNode), this.next);
+ range = {
+ startNode: textNode,
+ startOffset: text.length
+ };
+ }
+ }
+ node.data = GUARD_TEXT;
+ return range;
+ }
+ }, {
+ key: 'update',
+ value: function update(mutations, context) {
+ var _this2 = this;
+
+ mutations.forEach(function (mutation) {
+ if (mutation.type === 'characterData' && (mutation.target === _this2.leftGuard || mutation.target === _this2.rightGuard)) {
+ var range = _this2.restore(mutation.target);
+ if (range) context.range = range;
+ }
+ });
+ }
+ }]);
+
+ return Embed;
+}(_parchment2.default.Embed);
+
+exports.default = Embed;
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.AlignStyle = exports.AlignClass = exports.AlignAttribute = undefined;
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var config = {
+ scope: _parchment2.default.Scope.BLOCK,
+ whitelist: ['right', 'center', 'justify']
+};
+
+var AlignAttribute = new _parchment2.default.Attributor.Attribute('align', 'align', config);
+var AlignClass = new _parchment2.default.Attributor.Class('align', 'ql-align', config);
+var AlignStyle = new _parchment2.default.Attributor.Style('align', 'text-align', config);
+
+exports.AlignAttribute = AlignAttribute;
+exports.AlignClass = AlignClass;
+exports.AlignStyle = AlignStyle;
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.BackgroundStyle = exports.BackgroundClass = undefined;
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _color = __webpack_require__(26);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var BackgroundClass = new _parchment2.default.Attributor.Class('background', 'ql-bg', {
+ scope: _parchment2.default.Scope.INLINE
+});
+var BackgroundStyle = new _color.ColorAttributor('background', 'background-color', {
+ scope: _parchment2.default.Scope.INLINE
+});
+
+exports.BackgroundClass = BackgroundClass;
+exports.BackgroundStyle = BackgroundStyle;
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.DirectionStyle = exports.DirectionClass = exports.DirectionAttribute = undefined;
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var config = {
+ scope: _parchment2.default.Scope.BLOCK,
+ whitelist: ['rtl']
+};
+
+var DirectionAttribute = new _parchment2.default.Attributor.Attribute('direction', 'dir', config);
+var DirectionClass = new _parchment2.default.Attributor.Class('direction', 'ql-direction', config);
+var DirectionStyle = new _parchment2.default.Attributor.Style('direction', 'direction', config);
+
+exports.DirectionAttribute = DirectionAttribute;
+exports.DirectionClass = DirectionClass;
+exports.DirectionStyle = DirectionStyle;
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.FontClass = exports.FontStyle = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var config = {
+ scope: _parchment2.default.Scope.INLINE,
+ whitelist: ['serif', 'monospace']
+};
+
+var FontClass = new _parchment2.default.Attributor.Class('font', 'ql-font', config);
+
+var FontStyleAttributor = function (_Parchment$Attributor) {
+ _inherits(FontStyleAttributor, _Parchment$Attributor);
+
+ function FontStyleAttributor() {
+ _classCallCheck(this, FontStyleAttributor);
+
+ return _possibleConstructorReturn(this, (FontStyleAttributor.__proto__ || Object.getPrototypeOf(FontStyleAttributor)).apply(this, arguments));
+ }
+
+ _createClass(FontStyleAttributor, [{
+ key: 'value',
+ value: function value(node) {
+ return _get(FontStyleAttributor.prototype.__proto__ || Object.getPrototypeOf(FontStyleAttributor.prototype), 'value', this).call(this, node).replace(/["']/g, '');
+ }
+ }]);
+
+ return FontStyleAttributor;
+}(_parchment2.default.Attributor.Style);
+
+var FontStyle = new FontStyleAttributor('font', 'font-family', config);
+
+exports.FontStyle = FontStyle;
+exports.FontClass = FontClass;
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.SizeStyle = exports.SizeClass = undefined;
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var SizeClass = new _parchment2.default.Attributor.Class('size', 'ql-size', {
+ scope: _parchment2.default.Scope.INLINE,
+ whitelist: ['small', 'large', 'huge']
+});
+var SizeStyle = new _parchment2.default.Attributor.Style('size', 'font-size', {
+ scope: _parchment2.default.Scope.INLINE,
+ whitelist: ['10px', '18px', '32px']
+});
+
+exports.SizeClass = SizeClass;
+exports.SizeStyle = SizeStyle;
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+module.exports = {
+ 'align': {
+ '': __webpack_require__(76),
+ 'center': __webpack_require__(77),
+ 'right': __webpack_require__(78),
+ 'justify': __webpack_require__(79)
+ },
+ 'background': __webpack_require__(80),
+ 'blockquote': __webpack_require__(81),
+ 'bold': __webpack_require__(82),
+ 'clean': __webpack_require__(83),
+ 'code': __webpack_require__(58),
+ 'code-block': __webpack_require__(58),
+ 'color': __webpack_require__(84),
+ 'direction': {
+ '': __webpack_require__(85),
+ 'rtl': __webpack_require__(86)
+ },
+ 'float': {
+ 'center': __webpack_require__(87),
+ 'full': __webpack_require__(88),
+ 'left': __webpack_require__(89),
+ 'right': __webpack_require__(90)
+ },
+ 'formula': __webpack_require__(91),
+ 'header': {
+ '1': __webpack_require__(92),
+ '2': __webpack_require__(93)
+ },
+ 'italic': __webpack_require__(94),
+ 'image': __webpack_require__(95),
+ 'indent': {
+ '+1': __webpack_require__(96),
+ '-1': __webpack_require__(97)
+ },
+ 'link': __webpack_require__(98),
+ 'list': {
+ 'ordered': __webpack_require__(99),
+ 'bullet': __webpack_require__(100),
+ 'check': __webpack_require__(101)
+ },
+ 'script': {
+ 'sub': __webpack_require__(102),
+ 'super': __webpack_require__(103)
+ },
+ 'strike': __webpack_require__(104),
+ 'underline': __webpack_require__(105),
+ 'video': __webpack_require__(106)
+};
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.getLastChangeIndex = exports.default = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _quill = __webpack_require__(5);
+
+var _quill2 = _interopRequireDefault(_quill);
+
+var _module = __webpack_require__(9);
+
+var _module2 = _interopRequireDefault(_module);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var History = function (_Module) {
+ _inherits(History, _Module);
+
+ function History(quill, options) {
+ _classCallCheck(this, History);
+
+ var _this = _possibleConstructorReturn(this, (History.__proto__ || Object.getPrototypeOf(History)).call(this, quill, options));
+
+ _this.lastRecorded = 0;
+ _this.ignoreChange = false;
+ _this.clear();
+ _this.quill.on(_quill2.default.events.EDITOR_CHANGE, function (eventName, delta, oldDelta, source) {
+ if (eventName !== _quill2.default.events.TEXT_CHANGE || _this.ignoreChange) return;
+ if (!_this.options.userOnly || source === _quill2.default.sources.USER) {
+ _this.record(delta, oldDelta);
+ } else {
+ _this.transform(delta);
+ }
+ });
+ _this.quill.keyboard.addBinding({ key: 'Z', shortKey: true }, _this.undo.bind(_this));
+ _this.quill.keyboard.addBinding({ key: 'Z', shortKey: true, shiftKey: true }, _this.redo.bind(_this));
+ if (/Win/i.test(navigator.platform)) {
+ _this.quill.keyboard.addBinding({ key: 'Y', shortKey: true }, _this.redo.bind(_this));
+ }
+ return _this;
+ }
+
+ _createClass(History, [{
+ key: 'change',
+ value: function change(source, dest) {
+ if (this.stack[source].length === 0) return;
+ var delta = this.stack[source].pop();
+ this.stack[dest].push(delta);
+ this.lastRecorded = 0;
+ this.ignoreChange = true;
+ this.quill.updateContents(delta[source], _quill2.default.sources.USER);
+ this.ignoreChange = false;
+ var index = getLastChangeIndex(delta[source]);
+ this.quill.setSelection(index);
+ }
+ }, {
+ key: 'clear',
+ value: function clear() {
+ this.stack = { undo: [], redo: [] };
+ }
+ }, {
+ key: 'cutoff',
+ value: function cutoff() {
+ this.lastRecorded = 0;
+ }
+ }, {
+ key: 'record',
+ value: function record(changeDelta, oldDelta) {
+ if (changeDelta.ops.length === 0) return;
+ this.stack.redo = [];
+ var undoDelta = this.quill.getContents().diff(oldDelta);
+ var timestamp = Date.now();
+ if (this.lastRecorded + this.options.delay > timestamp && this.stack.undo.length > 0) {
+ var delta = this.stack.undo.pop();
+ undoDelta = undoDelta.compose(delta.undo);
+ changeDelta = delta.redo.compose(changeDelta);
+ } else {
+ this.lastRecorded = timestamp;
+ }
+ this.stack.undo.push({
+ redo: changeDelta,
+ undo: undoDelta
+ });
+ if (this.stack.undo.length > this.options.maxStack) {
+ this.stack.undo.shift();
+ }
+ }
+ }, {
+ key: 'redo',
+ value: function redo() {
+ this.change('redo', 'undo');
+ }
+ }, {
+ key: 'transform',
+ value: function transform(delta) {
+ this.stack.undo.forEach(function (change) {
+ change.undo = delta.transform(change.undo, true);
+ change.redo = delta.transform(change.redo, true);
+ });
+ this.stack.redo.forEach(function (change) {
+ change.undo = delta.transform(change.undo, true);
+ change.redo = delta.transform(change.redo, true);
+ });
+ }
+ }, {
+ key: 'undo',
+ value: function undo() {
+ this.change('undo', 'redo');
+ }
+ }]);
+
+ return History;
+}(_module2.default);
+
+History.DEFAULTS = {
+ delay: 1000,
+ maxStack: 100,
+ userOnly: false
+};
+
+function endsWithNewlineChange(delta) {
+ var lastOp = delta.ops[delta.ops.length - 1];
+ if (lastOp == null) return false;
+ if (lastOp.insert != null) {
+ return typeof lastOp.insert === 'string' && lastOp.insert.endsWith('\n');
+ }
+ if (lastOp.attributes != null) {
+ return Object.keys(lastOp.attributes).some(function (attr) {
+ return _parchment2.default.query(attr, _parchment2.default.Scope.BLOCK) != null;
+ });
+ }
+ return false;
+}
+
+function getLastChangeIndex(delta) {
+ var deleteLength = delta.reduce(function (length, op) {
+ length += op.delete || 0;
+ return length;
+ }, 0);
+ var changeIndex = delta.length() - deleteLength;
+ if (endsWithNewlineChange(delta)) {
+ changeIndex -= 1;
+ }
+ return changeIndex;
+}
+
+exports.default = History;
+exports.getLastChangeIndex = getLastChangeIndex;
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = exports.BaseTooltip = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _extend = __webpack_require__(3);
+
+var _extend2 = _interopRequireDefault(_extend);
+
+var _quillDelta = __webpack_require__(2);
+
+var _quillDelta2 = _interopRequireDefault(_quillDelta);
+
+var _emitter = __webpack_require__(8);
+
+var _emitter2 = _interopRequireDefault(_emitter);
+
+var _keyboard = __webpack_require__(23);
+
+var _keyboard2 = _interopRequireDefault(_keyboard);
+
+var _theme = __webpack_require__(34);
+
+var _theme2 = _interopRequireDefault(_theme);
+
+var _colorPicker = __webpack_require__(59);
+
+var _colorPicker2 = _interopRequireDefault(_colorPicker);
+
+var _iconPicker = __webpack_require__(60);
+
+var _iconPicker2 = _interopRequireDefault(_iconPicker);
+
+var _picker = __webpack_require__(28);
+
+var _picker2 = _interopRequireDefault(_picker);
+
+var _tooltip = __webpack_require__(61);
+
+var _tooltip2 = _interopRequireDefault(_tooltip);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var ALIGNS = [false, 'center', 'right', 'justify'];
+
+var COLORS = ["#000000", "#e60000", "#ff9900", "#ffff00", "#008a00", "#0066cc", "#9933ff", "#ffffff", "#facccc", "#ffebcc", "#ffffcc", "#cce8cc", "#cce0f5", "#ebd6ff", "#bbbbbb", "#f06666", "#ffc266", "#ffff66", "#66b966", "#66a3e0", "#c285ff", "#888888", "#a10000", "#b26b00", "#b2b200", "#006100", "#0047b2", "#6b24b2", "#444444", "#5c0000", "#663d00", "#666600", "#003700", "#002966", "#3d1466"];
+
+var FONTS = [false, 'serif', 'monospace'];
+
+var HEADERS = ['1', '2', '3', false];
+
+var SIZES = ['small', false, 'large', 'huge'];
+
+var BaseTheme = function (_Theme) {
+ _inherits(BaseTheme, _Theme);
+
+ function BaseTheme(quill, options) {
+ _classCallCheck(this, BaseTheme);
+
+ var _this = _possibleConstructorReturn(this, (BaseTheme.__proto__ || Object.getPrototypeOf(BaseTheme)).call(this, quill, options));
+
+ var listener = function listener(e) {
+ if (!document.body.contains(quill.root)) {
+ return document.body.removeEventListener('click', listener);
+ }
+ if (_this.tooltip != null && !_this.tooltip.root.contains(e.target) && document.activeElement !== _this.tooltip.textbox && !_this.quill.hasFocus()) {
+ _this.tooltip.hide();
+ }
+ if (_this.pickers != null) {
+ _this.pickers.forEach(function (picker) {
+ if (!picker.container.contains(e.target)) {
+ picker.close();
+ }
+ });
+ }
+ };
+ quill.emitter.listenDOM('click', document.body, listener);
+ return _this;
+ }
+
+ _createClass(BaseTheme, [{
+ key: 'addModule',
+ value: function addModule(name) {
+ var module = _get(BaseTheme.prototype.__proto__ || Object.getPrototypeOf(BaseTheme.prototype), 'addModule', this).call(this, name);
+ if (name === 'toolbar') {
+ this.extendToolbar(module);
+ }
+ return module;
+ }
+ }, {
+ key: 'buildButtons',
+ value: function buildButtons(buttons, icons) {
+ buttons.forEach(function (button) {
+ var className = button.getAttribute('class') || '';
+ className.split(/\s+/).forEach(function (name) {
+ if (!name.startsWith('ql-')) return;
+ name = name.slice('ql-'.length);
+ if (icons[name] == null) return;
+ if (name === 'direction') {
+ button.innerHTML = icons[name][''] + icons[name]['rtl'];
+ } else if (typeof icons[name] === 'string') {
+ button.innerHTML = icons[name];
+ } else {
+ var value = button.value || '';
+ if (value != null && icons[name][value]) {
+ button.innerHTML = icons[name][value];
+ }
+ }
+ });
+ });
+ }
+ }, {
+ key: 'buildPickers',
+ value: function buildPickers(selects, icons) {
+ var _this2 = this;
+
+ this.pickers = selects.map(function (select) {
+ if (select.classList.contains('ql-align')) {
+ if (select.querySelector('option') == null) {
+ fillSelect(select, ALIGNS);
+ }
+ return new _iconPicker2.default(select, icons.align);
+ } else if (select.classList.contains('ql-background') || select.classList.contains('ql-color')) {
+ var format = select.classList.contains('ql-background') ? 'background' : 'color';
+ if (select.querySelector('option') == null) {
+ fillSelect(select, COLORS, format === 'background' ? '#ffffff' : '#000000');
+ }
+ return new _colorPicker2.default(select, icons[format]);
+ } else {
+ if (select.querySelector('option') == null) {
+ if (select.classList.contains('ql-font')) {
+ fillSelect(select, FONTS);
+ } else if (select.classList.contains('ql-header')) {
+ fillSelect(select, HEADERS);
+ } else if (select.classList.contains('ql-size')) {
+ fillSelect(select, SIZES);
+ }
+ }
+ return new _picker2.default(select);
+ }
+ });
+ var update = function update() {
+ _this2.pickers.forEach(function (picker) {
+ picker.update();
+ });
+ };
+ this.quill.on(_emitter2.default.events.EDITOR_CHANGE, update);
+ }
+ }]);
+
+ return BaseTheme;
+}(_theme2.default);
+
+BaseTheme.DEFAULTS = (0, _extend2.default)(true, {}, _theme2.default.DEFAULTS, {
+ modules: {
+ toolbar: {
+ handlers: {
+ formula: function formula() {
+ this.quill.theme.tooltip.edit('formula');
+ },
+ image: function image() {
+ var _this3 = this;
+
+ var fileInput = this.container.querySelector('input.ql-image[type=file]');
+ if (fileInput == null) {
+ fileInput = document.createElement('input');
+ fileInput.setAttribute('type', 'file');
+ fileInput.setAttribute('accept', 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon');
+ fileInput.classList.add('ql-image');
+ fileInput.addEventListener('change', function () {
+ if (fileInput.files != null && fileInput.files[0] != null) {
+ var reader = new FileReader();
+ reader.onload = function (e) {
+ var range = _this3.quill.getSelection(true);
+ _this3.quill.updateContents(new _quillDelta2.default().retain(range.index).delete(range.length).insert({ image: e.target.result }), _emitter2.default.sources.USER);
+ _this3.quill.setSelection(range.index + 1, _emitter2.default.sources.SILENT);
+ fileInput.value = "";
+ };
+ reader.readAsDataURL(fileInput.files[0]);
+ }
+ });
+ this.container.appendChild(fileInput);
+ }
+ fileInput.click();
+ },
+ video: function video() {
+ this.quill.theme.tooltip.edit('video');
+ }
+ }
+ }
+ }
+});
+
+var BaseTooltip = function (_Tooltip) {
+ _inherits(BaseTooltip, _Tooltip);
+
+ function BaseTooltip(quill, boundsContainer) {
+ _classCallCheck(this, BaseTooltip);
+
+ var _this4 = _possibleConstructorReturn(this, (BaseTooltip.__proto__ || Object.getPrototypeOf(BaseTooltip)).call(this, quill, boundsContainer));
+
+ _this4.textbox = _this4.root.querySelector('input[type="text"]');
+ _this4.listen();
+ return _this4;
+ }
+
+ _createClass(BaseTooltip, [{
+ key: 'listen',
+ value: function listen() {
+ var _this5 = this;
+
+ this.textbox.addEventListener('keydown', function (event) {
+ if (_keyboard2.default.match(event, 'enter')) {
+ _this5.save();
+ event.preventDefault();
+ } else if (_keyboard2.default.match(event, 'escape')) {
+ _this5.cancel();
+ event.preventDefault();
+ }
+ });
+ }
+ }, {
+ key: 'cancel',
+ value: function cancel() {
+ this.hide();
+ }
+ }, {
+ key: 'edit',
+ value: function edit() {
+ var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'link';
+ var preview = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
+
+ this.root.classList.remove('ql-hidden');
+ this.root.classList.add('ql-editing');
+ if (preview != null) {
+ this.textbox.value = preview;
+ } else if (mode !== this.root.getAttribute('data-mode')) {
+ this.textbox.value = '';
+ }
+ this.position(this.quill.getBounds(this.quill.selection.savedRange));
+ this.textbox.select();
+ this.textbox.setAttribute('placeholder', this.textbox.getAttribute('data-' + mode) || '');
+ this.root.setAttribute('data-mode', mode);
+ }
+ }, {
+ key: 'restoreFocus',
+ value: function restoreFocus() {
+ var scrollTop = this.quill.scrollingContainer.scrollTop;
+ this.quill.focus();
+ this.quill.scrollingContainer.scrollTop = scrollTop;
+ }
+ }, {
+ key: 'save',
+ value: function save() {
+ var value = this.textbox.value;
+ switch (this.root.getAttribute('data-mode')) {
+ case 'link':
+ {
+ var scrollTop = this.quill.root.scrollTop;
+ if (this.linkRange) {
+ this.quill.formatText(this.linkRange, 'link', value, _emitter2.default.sources.USER);
+ delete this.linkRange;
+ } else {
+ this.restoreFocus();
+ this.quill.format('link', value, _emitter2.default.sources.USER);
+ }
+ this.quill.root.scrollTop = scrollTop;
+ break;
+ }
+ case 'video':
+ {
+ value = extractVideoUrl(value);
+ } // eslint-disable-next-line no-fallthrough
+ case 'formula':
+ {
+ if (!value) break;
+ var range = this.quill.getSelection(true);
+ if (range != null) {
+ var index = range.index + range.length;
+ this.quill.insertEmbed(index, this.root.getAttribute('data-mode'), value, _emitter2.default.sources.USER);
+ if (this.root.getAttribute('data-mode') === 'formula') {
+ this.quill.insertText(index + 1, ' ', _emitter2.default.sources.USER);
+ }
+ this.quill.setSelection(index + 2, _emitter2.default.sources.USER);
+ }
+ break;
+ }
+ }
+ this.textbox.value = '';
+ this.hide();
+ }
+ }]);
+
+ return BaseTooltip;
+}(_tooltip2.default);
+
+function extractVideoUrl(url) {
+ var match = url.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/) || url.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/);
+ if (match) {
+ return (match[1] || 'https') + '://www.youtube.com/embed/' + match[2] + '?showinfo=0';
+ }
+ if (match = url.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/)) {
+ // eslint-disable-line no-cond-assign
+ return (match[1] || 'https') + '://player.vimeo.com/video/' + match[2] + '/';
+ }
+ return url;
+}
+
+function fillSelect(select, values) {
+ var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+ values.forEach(function (value) {
+ var option = document.createElement('option');
+ if (value === defaultValue) {
+ option.setAttribute('selected', 'selected');
+ } else {
+ option.setAttribute('value', value);
+ }
+ select.appendChild(option);
+ });
+}
+
+exports.BaseTooltip = BaseTooltip;
+exports.default = BaseTheme;
+
+/***/ }),
+/* 44 */
+/***/ (function(module, exports, __webpack_require__) {
+
+Object.defineProperty(exports, "__esModule", { value: true });
+var LinkedList = /** @class */ (function () {
+ function LinkedList() {
+ this.head = this.tail = null;
+ this.length = 0;
+ }
+ LinkedList.prototype.append = function () {
+ var nodes = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ nodes[_i] = arguments[_i];
+ }
+ this.insertBefore(nodes[0], null);
+ if (nodes.length > 1) {
+ this.append.apply(this, nodes.slice(1));
+ }
+ };
+ LinkedList.prototype.contains = function (node) {
+ var cur, next = this.iterator();
+ while ((cur = next())) {
+ if (cur === node)
+ return true;
+ }
+ return false;
+ };
+ LinkedList.prototype.insertBefore = function (node, refNode) {
+ if (!node)
+ return;
+ node.next = refNode;
+ if (refNode != null) {
+ node.prev = refNode.prev;
+ if (refNode.prev != null) {
+ refNode.prev.next = node;
+ }
+ refNode.prev = node;
+ if (refNode === this.head) {
+ this.head = node;
+ }
+ }
+ else if (this.tail != null) {
+ this.tail.next = node;
+ node.prev = this.tail;
+ this.tail = node;
+ }
+ else {
+ node.prev = null;
+ this.head = this.tail = node;
+ }
+ this.length += 1;
+ };
+ LinkedList.prototype.offset = function (target) {
+ var index = 0, cur = this.head;
+ while (cur != null) {
+ if (cur === target)
+ return index;
+ index += cur.length();
+ cur = cur.next;
+ }
+ return -1;
+ };
+ LinkedList.prototype.remove = function (node) {
+ if (!this.contains(node))
+ return;
+ if (node.prev != null)
+ node.prev.next = node.next;
+ if (node.next != null)
+ node.next.prev = node.prev;
+ if (node === this.head)
+ this.head = node.next;
+ if (node === this.tail)
+ this.tail = node.prev;
+ this.length -= 1;
+ };
+ LinkedList.prototype.iterator = function (curNode) {
+ if (curNode === void 0) { curNode = this.head; }
+ // TODO use yield when we can
+ return function () {
+ var ret = curNode;
+ if (curNode != null)
+ curNode = curNode.next;
+ return ret;
+ };
+ };
+ LinkedList.prototype.find = function (index, inclusive) {
+ if (inclusive === void 0) { inclusive = false; }
+ var cur, next = this.iterator();
+ while ((cur = next())) {
+ var length = cur.length();
+ if (index < length ||
+ (inclusive && index === length && (cur.next == null || cur.next.length() !== 0))) {
+ return [cur, index];
+ }
+ index -= length;
+ }
+ return [null, 0];
+ };
+ LinkedList.prototype.forEach = function (callback) {
+ var cur, next = this.iterator();
+ while ((cur = next())) {
+ callback(cur);
+ }
+ };
+ LinkedList.prototype.forEachAt = function (index, length, callback) {
+ if (length <= 0)
+ return;
+ var _a = this.find(index), startNode = _a[0], offset = _a[1];
+ var cur, curIndex = index - offset, next = this.iterator(startNode);
+ while ((cur = next()) && curIndex < index + length) {
+ var curLength = cur.length();
+ if (index > curIndex) {
+ callback(cur, index - curIndex, Math.min(length, curIndex + curLength - index));
+ }
+ else {
+ callback(cur, 0, Math.min(curLength, index + length - curIndex));
+ }
+ curIndex += curLength;
+ }
+ };
+ LinkedList.prototype.map = function (callback) {
+ return this.reduce(function (memo, cur) {
+ memo.push(callback(cur));
+ return memo;
+ }, []);
+ };
+ LinkedList.prototype.reduce = function (callback, memo) {
+ var cur, next = this.iterator();
+ while ((cur = next())) {
+ memo = callback(memo, cur);
+ }
+ return memo;
+ };
+ return LinkedList;
+}());
+exports.default = LinkedList;
+
+
+/***/ }),
+/* 45 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var container_1 = __webpack_require__(17);
+var Registry = __webpack_require__(1);
+var OBSERVER_CONFIG = {
+ attributes: true,
+ characterData: true,
+ characterDataOldValue: true,
+ childList: true,
+ subtree: true,
+};
+var MAX_OPTIMIZE_ITERATIONS = 100;
+var ScrollBlot = /** @class */ (function (_super) {
+ __extends(ScrollBlot, _super);
+ function ScrollBlot(node) {
+ var _this = _super.call(this, node) || this;
+ _this.scroll = _this;
+ _this.observer = new MutationObserver(function (mutations) {
+ _this.update(mutations);
+ });
+ _this.observer.observe(_this.domNode, OBSERVER_CONFIG);
+ _this.attach();
+ return _this;
+ }
+ ScrollBlot.prototype.detach = function () {
+ _super.prototype.detach.call(this);
+ this.observer.disconnect();
+ };
+ ScrollBlot.prototype.deleteAt = function (index, length) {
+ this.update();
+ if (index === 0 && length === this.length()) {
+ this.children.forEach(function (child) {
+ child.remove();
+ });
+ }
+ else {
+ _super.prototype.deleteAt.call(this, index, length);
+ }
+ };
+ ScrollBlot.prototype.formatAt = function (index, length, name, value) {
+ this.update();
+ _super.prototype.formatAt.call(this, index, length, name, value);
+ };
+ ScrollBlot.prototype.insertAt = function (index, value, def) {
+ this.update();
+ _super.prototype.insertAt.call(this, index, value, def);
+ };
+ ScrollBlot.prototype.optimize = function (mutations, context) {
+ var _this = this;
+ if (mutations === void 0) { mutations = []; }
+ if (context === void 0) { context = {}; }
+ _super.prototype.optimize.call(this, context);
+ // We must modify mutations directly, cannot make copy and then modify
+ var records = [].slice.call(this.observer.takeRecords());
+ // Array.push currently seems to be implemented by a non-tail recursive function
+ // so we cannot just mutations.push.apply(mutations, this.observer.takeRecords());
+ while (records.length > 0)
+ mutations.push(records.pop());
+ // TODO use WeakMap
+ var mark = function (blot, markParent) {
+ if (markParent === void 0) { markParent = true; }
+ if (blot == null || blot === _this)
+ return;
+ if (blot.domNode.parentNode == null)
+ return;
+ // @ts-ignore
+ if (blot.domNode[Registry.DATA_KEY].mutations == null) {
+ // @ts-ignore
+ blot.domNode[Registry.DATA_KEY].mutations = [];
+ }
+ if (markParent)
+ mark(blot.parent);
+ };
+ var optimize = function (blot) {
+ // Post-order traversal
+ if (
+ // @ts-ignore
+ blot.domNode[Registry.DATA_KEY] == null ||
+ // @ts-ignore
+ blot.domNode[Registry.DATA_KEY].mutations == null) {
+ return;
+ }
+ if (blot instanceof container_1.default) {
+ blot.children.forEach(optimize);
+ }
+ blot.optimize(context);
+ };
+ var remaining = mutations;
+ for (var i = 0; remaining.length > 0; i += 1) {
+ if (i >= MAX_OPTIMIZE_ITERATIONS) {
+ throw new Error('[Parchment] Maximum optimize iterations reached');
+ }
+ remaining.forEach(function (mutation) {
+ var blot = Registry.find(mutation.target, true);
+ if (blot == null)
+ return;
+ if (blot.domNode === mutation.target) {
+ if (mutation.type === 'childList') {
+ mark(Registry.find(mutation.previousSibling, false));
+ [].forEach.call(mutation.addedNodes, function (node) {
+ var child = Registry.find(node, false);
+ mark(child, false);
+ if (child instanceof container_1.default) {
+ child.children.forEach(function (grandChild) {
+ mark(grandChild, false);
+ });
+ }
+ });
+ }
+ else if (mutation.type === 'attributes') {
+ mark(blot.prev);
+ }
+ }
+ mark(blot);
+ });
+ this.children.forEach(optimize);
+ remaining = [].slice.call(this.observer.takeRecords());
+ records = remaining.slice();
+ while (records.length > 0)
+ mutations.push(records.pop());
+ }
+ };
+ ScrollBlot.prototype.update = function (mutations, context) {
+ var _this = this;
+ if (context === void 0) { context = {}; }
+ mutations = mutations || this.observer.takeRecords();
+ // TODO use WeakMap
+ mutations
+ .map(function (mutation) {
+ var blot = Registry.find(mutation.target, true);
+ if (blot == null)
+ return null;
+ // @ts-ignore
+ if (blot.domNode[Registry.DATA_KEY].mutations == null) {
+ // @ts-ignore
+ blot.domNode[Registry.DATA_KEY].mutations = [mutation];
+ return blot;
+ }
+ else {
+ // @ts-ignore
+ blot.domNode[Registry.DATA_KEY].mutations.push(mutation);
+ return null;
+ }
+ })
+ .forEach(function (blot) {
+ if (blot == null ||
+ blot === _this ||
+ //@ts-ignore
+ blot.domNode[Registry.DATA_KEY] == null)
+ return;
+ // @ts-ignore
+ blot.update(blot.domNode[Registry.DATA_KEY].mutations || [], context);
+ });
+ // @ts-ignore
+ if (this.domNode[Registry.DATA_KEY].mutations != null) {
+ // @ts-ignore
+ _super.prototype.update.call(this, this.domNode[Registry.DATA_KEY].mutations, context);
+ }
+ this.optimize(mutations, context);
+ };
+ ScrollBlot.blotName = 'scroll';
+ ScrollBlot.defaultChild = 'block';
+ ScrollBlot.scope = Registry.Scope.BLOCK_BLOT;
+ ScrollBlot.tagName = 'DIV';
+ return ScrollBlot;
+}(container_1.default));
+exports.default = ScrollBlot;
+
+
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var format_1 = __webpack_require__(18);
+var Registry = __webpack_require__(1);
+// Shallow object comparison
+function isEqual(obj1, obj2) {
+ if (Object.keys(obj1).length !== Object.keys(obj2).length)
+ return false;
+ // @ts-ignore
+ for (var prop in obj1) {
+ // @ts-ignore
+ if (obj1[prop] !== obj2[prop])
+ return false;
+ }
+ return true;
+}
+var InlineBlot = /** @class */ (function (_super) {
+ __extends(InlineBlot, _super);
+ function InlineBlot() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ InlineBlot.formats = function (domNode) {
+ if (domNode.tagName === InlineBlot.tagName)
+ return undefined;
+ return _super.formats.call(this, domNode);
+ };
+ InlineBlot.prototype.format = function (name, value) {
+ var _this = this;
+ if (name === this.statics.blotName && !value) {
+ this.children.forEach(function (child) {
+ if (!(child instanceof format_1.default)) {
+ child = child.wrap(InlineBlot.blotName, true);
+ }
+ _this.attributes.copy(child);
+ });
+ this.unwrap();
+ }
+ else {
+ _super.prototype.format.call(this, name, value);
+ }
+ };
+ InlineBlot.prototype.formatAt = function (index, length, name, value) {
+ if (this.formats()[name] != null || Registry.query(name, Registry.Scope.ATTRIBUTE)) {
+ var blot = this.isolate(index, length);
+ blot.format(name, value);
+ }
+ else {
+ _super.prototype.formatAt.call(this, index, length, name, value);
+ }
+ };
+ InlineBlot.prototype.optimize = function (context) {
+ _super.prototype.optimize.call(this, context);
+ var formats = this.formats();
+ if (Object.keys(formats).length === 0) {
+ return this.unwrap(); // unformatted span
+ }
+ var next = this.next;
+ if (next instanceof InlineBlot && next.prev === this && isEqual(formats, next.formats())) {
+ next.moveChildren(this);
+ next.remove();
+ }
+ };
+ InlineBlot.blotName = 'inline';
+ InlineBlot.scope = Registry.Scope.INLINE_BLOT;
+ InlineBlot.tagName = 'SPAN';
+ return InlineBlot;
+}(format_1.default));
+exports.default = InlineBlot;
+
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var format_1 = __webpack_require__(18);
+var Registry = __webpack_require__(1);
+var BlockBlot = /** @class */ (function (_super) {
+ __extends(BlockBlot, _super);
+ function BlockBlot() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ BlockBlot.formats = function (domNode) {
+ var tagName = Registry.query(BlockBlot.blotName).tagName;
+ if (domNode.tagName === tagName)
+ return undefined;
+ return _super.formats.call(this, domNode);
+ };
+ BlockBlot.prototype.format = function (name, value) {
+ if (Registry.query(name, Registry.Scope.BLOCK) == null) {
+ return;
+ }
+ else if (name === this.statics.blotName && !value) {
+ this.replaceWith(BlockBlot.blotName);
+ }
+ else {
+ _super.prototype.format.call(this, name, value);
+ }
+ };
+ BlockBlot.prototype.formatAt = function (index, length, name, value) {
+ if (Registry.query(name, Registry.Scope.BLOCK) != null) {
+ this.format(name, value);
+ }
+ else {
+ _super.prototype.formatAt.call(this, index, length, name, value);
+ }
+ };
+ BlockBlot.prototype.insertAt = function (index, value, def) {
+ if (def == null || Registry.query(value, Registry.Scope.INLINE) != null) {
+ // Insert text or inline
+ _super.prototype.insertAt.call(this, index, value, def);
+ }
+ else {
+ var after = this.split(index);
+ var blot = Registry.create(value, def);
+ after.parent.insertBefore(blot, after);
+ }
+ };
+ BlockBlot.prototype.update = function (mutations, context) {
+ if (navigator.userAgent.match(/Trident/)) {
+ this.build();
+ }
+ else {
+ _super.prototype.update.call(this, mutations, context);
+ }
+ };
+ BlockBlot.blotName = 'block';
+ BlockBlot.scope = Registry.Scope.BLOCK_BLOT;
+ BlockBlot.tagName = 'P';
+ return BlockBlot;
+}(format_1.default));
+exports.default = BlockBlot;
+
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var leaf_1 = __webpack_require__(19);
+var EmbedBlot = /** @class */ (function (_super) {
+ __extends(EmbedBlot, _super);
+ function EmbedBlot() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ EmbedBlot.formats = function (domNode) {
+ return undefined;
+ };
+ EmbedBlot.prototype.format = function (name, value) {
+ // super.formatAt wraps, which is what we want in general,
+ // but this allows subclasses to overwrite for formats
+ // that just apply to particular embeds
+ _super.prototype.formatAt.call(this, 0, this.length(), name, value);
+ };
+ EmbedBlot.prototype.formatAt = function (index, length, name, value) {
+ if (index === 0 && length === this.length()) {
+ this.format(name, value);
+ }
+ else {
+ _super.prototype.formatAt.call(this, index, length, name, value);
+ }
+ };
+ EmbedBlot.prototype.formats = function () {
+ return this.statics.formats(this.domNode);
+ };
+ return EmbedBlot;
+}(leaf_1.default));
+exports.default = EmbedBlot;
+
+
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var leaf_1 = __webpack_require__(19);
+var Registry = __webpack_require__(1);
+var TextBlot = /** @class */ (function (_super) {
+ __extends(TextBlot, _super);
+ function TextBlot(node) {
+ var _this = _super.call(this, node) || this;
+ _this.text = _this.statics.value(_this.domNode);
+ return _this;
+ }
+ TextBlot.create = function (value) {
+ return document.createTextNode(value);
+ };
+ TextBlot.value = function (domNode) {
+ var text = domNode.data;
+ // @ts-ignore
+ if (text['normalize'])
+ text = text['normalize']();
+ return text;
+ };
+ TextBlot.prototype.deleteAt = function (index, length) {
+ this.domNode.data = this.text = this.text.slice(0, index) + this.text.slice(index + length);
+ };
+ TextBlot.prototype.index = function (node, offset) {
+ if (this.domNode === node) {
+ return offset;
+ }
+ return -1;
+ };
+ TextBlot.prototype.insertAt = function (index, value, def) {
+ if (def == null) {
+ this.text = this.text.slice(0, index) + value + this.text.slice(index);
+ this.domNode.data = this.text;
+ }
+ else {
+ _super.prototype.insertAt.call(this, index, value, def);
+ }
+ };
+ TextBlot.prototype.length = function () {
+ return this.text.length;
+ };
+ TextBlot.prototype.optimize = function (context) {
+ _super.prototype.optimize.call(this, context);
+ this.text = this.statics.value(this.domNode);
+ if (this.text.length === 0) {
+ this.remove();
+ }
+ else if (this.next instanceof TextBlot && this.next.prev === this) {
+ this.insertAt(this.length(), this.next.value());
+ this.next.remove();
+ }
+ };
+ TextBlot.prototype.position = function (index, inclusive) {
+ return [this.domNode, index];
+ };
+ TextBlot.prototype.split = function (index, force) {
+ if (force === void 0) { force = false; }
+ if (!force) {
+ if (index === 0)
+ return this;
+ if (index === this.length())
+ return this.next;
+ }
+ var after = Registry.create(this.domNode.splitText(index));
+ this.parent.insertBefore(after, this.next);
+ this.text = this.statics.value(this.domNode);
+ return after;
+ };
+ TextBlot.prototype.update = function (mutations, context) {
+ var _this = this;
+ if (mutations.some(function (mutation) {
+ return mutation.type === 'characterData' && mutation.target === _this.domNode;
+ })) {
+ this.text = this.statics.value(this.domNode);
+ }
+ };
+ TextBlot.prototype.value = function () {
+ return this.text;
+ };
+ TextBlot.blotName = 'text';
+ TextBlot.scope = Registry.Scope.INLINE_BLOT;
+ return TextBlot;
+}(leaf_1.default));
+exports.default = TextBlot;
+
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+var elem = document.createElement('div');
+elem.classList.toggle('test-class', false);
+if (elem.classList.contains('test-class')) {
+ var _toggle = DOMTokenList.prototype.toggle;
+ DOMTokenList.prototype.toggle = function (token, force) {
+ if (arguments.length > 1 && !this.contains(token) === !force) {
+ return force;
+ } else {
+ return _toggle.call(this, token);
+ }
+ };
+}
+
+if (!String.prototype.startsWith) {
+ String.prototype.startsWith = function (searchString, position) {
+ position = position || 0;
+ return this.substr(position, searchString.length) === searchString;
+ };
+}
+
+if (!String.prototype.endsWith) {
+ String.prototype.endsWith = function (searchString, position) {
+ var subjectString = this.toString();
+ if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) {
+ position = subjectString.length;
+ }
+ position -= searchString.length;
+ var lastIndex = subjectString.indexOf(searchString, position);
+ return lastIndex !== -1 && lastIndex === position;
+ };
+}
+
+if (!Array.prototype.find) {
+ Object.defineProperty(Array.prototype, "find", {
+ value: function value(predicate) {
+ if (this === null) {
+ throw new TypeError('Array.prototype.find called on null or undefined');
+ }
+ if (typeof predicate !== 'function') {
+ throw new TypeError('predicate must be a function');
+ }
+ var list = Object(this);
+ var length = list.length >>> 0;
+ var thisArg = arguments[1];
+ var value;
+
+ for (var i = 0; i < length; i++) {
+ value = list[i];
+ if (predicate.call(thisArg, value, i, list)) {
+ return value;
+ }
+ }
+ return undefined;
+ }
+ });
+}
+
+document.addEventListener("DOMContentLoaded", function () {
+ // Disable resizing in Firefox
+ document.execCommand("enableObjectResizing", false, false);
+ // Disable automatic linkifying in IE11
+ document.execCommand("autoUrlDetect", false, false);
+});
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports) {
+
+/**
+ * This library modifies the diff-patch-match library by Neil Fraser
+ * by removing the patch and match functionality and certain advanced
+ * options in the diff function. The original license is as follows:
+ *
+ * ===
+ *
+ * Diff Match and Patch
+ *
+ * Copyright 2006 Google Inc.
+ * http://code.google.com/p/google-diff-match-patch/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+/**
+ * The data structure representing a diff is an array of tuples:
+ * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]
+ * which means: delete 'Hello', add 'Goodbye' and keep ' world.'
+ */
+var DIFF_DELETE = -1;
+var DIFF_INSERT = 1;
+var DIFF_EQUAL = 0;
+
+
+/**
+ * Find the differences between two texts. Simplifies the problem by stripping
+ * any common prefix or suffix off the texts before diffing.
+ * @param {string} text1 Old string to be diffed.
+ * @param {string} text2 New string to be diffed.
+ * @param {Int} cursor_pos Expected edit position in text1 (optional)
+ * @return {Array} Array of diff tuples.
+ */
+function diff_main(text1, text2, cursor_pos) {
+ // Check for equality (speedup).
+ if (text1 == text2) {
+ if (text1) {
+ return [[DIFF_EQUAL, text1]];
+ }
+ return [];
+ }
+
+ // Check cursor_pos within bounds
+ if (cursor_pos < 0 || text1.length < cursor_pos) {
+ cursor_pos = null;
+ }
+
+ // Trim off common prefix (speedup).
+ var commonlength = diff_commonPrefix(text1, text2);
+ var commonprefix = text1.substring(0, commonlength);
+ text1 = text1.substring(commonlength);
+ text2 = text2.substring(commonlength);
+
+ // Trim off common suffix (speedup).
+ commonlength = diff_commonSuffix(text1, text2);
+ var commonsuffix = text1.substring(text1.length - commonlength);
+ text1 = text1.substring(0, text1.length - commonlength);
+ text2 = text2.substring(0, text2.length - commonlength);
+
+ // Compute the diff on the middle block.
+ var diffs = diff_compute_(text1, text2);
+
+ // Restore the prefix and suffix.
+ if (commonprefix) {
+ diffs.unshift([DIFF_EQUAL, commonprefix]);
+ }
+ if (commonsuffix) {
+ diffs.push([DIFF_EQUAL, commonsuffix]);
+ }
+ diff_cleanupMerge(diffs);
+ if (cursor_pos != null) {
+ diffs = fix_cursor(diffs, cursor_pos);
+ }
+ diffs = fix_emoji(diffs);
+ return diffs;
+}
+
+/**
+ * Find the differences between two texts. Assumes that the texts do not
+ * have any common prefix or suffix.
+ * @param {string} text1 Old string to be diffed.
+ * @param {string} text2 New string to be diffed.
+ * @return {Array} Array of diff tuples.
+ */
+function diff_compute_(text1, text2) {
+ var diffs;
+
+ if (!text1) {
+ // Just add some text (speedup).
+ return [[DIFF_INSERT, text2]];
+ }
+
+ if (!text2) {
+ // Just delete some text (speedup).
+ return [[DIFF_DELETE, text1]];
+ }
+
+ var longtext = text1.length > text2.length ? text1 : text2;
+ var shorttext = text1.length > text2.length ? text2 : text1;
+ var i = longtext.indexOf(shorttext);
+ if (i != -1) {
+ // Shorter text is inside the longer text (speedup).
+ diffs = [[DIFF_INSERT, longtext.substring(0, i)],
+ [DIFF_EQUAL, shorttext],
+ [DIFF_INSERT, longtext.substring(i + shorttext.length)]];
+ // Swap insertions for deletions if diff is reversed.
+ if (text1.length > text2.length) {
+ diffs[0][0] = diffs[2][0] = DIFF_DELETE;
+ }
+ return diffs;
+ }
+
+ if (shorttext.length == 1) {
+ // Single character string.
+ // After the previous speedup, the character can't be an equality.
+ return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];
+ }
+
+ // Check to see if the problem can be split in two.
+ var hm = diff_halfMatch_(text1, text2);
+ if (hm) {
+ // A half-match was found, sort out the return data.
+ var text1_a = hm[0];
+ var text1_b = hm[1];
+ var text2_a = hm[2];
+ var text2_b = hm[3];
+ var mid_common = hm[4];
+ // Send both pairs off for separate processing.
+ var diffs_a = diff_main(text1_a, text2_a);
+ var diffs_b = diff_main(text1_b, text2_b);
+ // Merge the results.
+ return diffs_a.concat([[DIFF_EQUAL, mid_common]], diffs_b);
+ }
+
+ return diff_bisect_(text1, text2);
+}
+
+/**
+ * Find the 'middle snake' of a diff, split the problem in two
+ * and return the recursively constructed diff.
+ * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.
+ * @param {string} text1 Old string to be diffed.
+ * @param {string} text2 New string to be diffed.
+ * @return {Array} Array of diff tuples.
+ * @private
+ */
+function diff_bisect_(text1, text2) {
+ // Cache the text lengths to prevent multiple calls.
+ var text1_length = text1.length;
+ var text2_length = text2.length;
+ var max_d = Math.ceil((text1_length + text2_length) / 2);
+ var v_offset = max_d;
+ var v_length = 2 * max_d;
+ var v1 = new Array(v_length);
+ var v2 = new Array(v_length);
+ // Setting all elements to -1 is faster in Chrome & Firefox than mixing
+ // integers and undefined.
+ for (var x = 0; x < v_length; x++) {
+ v1[x] = -1;
+ v2[x] = -1;
+ }
+ v1[v_offset + 1] = 0;
+ v2[v_offset + 1] = 0;
+ var delta = text1_length - text2_length;
+ // If the total number of characters is odd, then the front path will collide
+ // with the reverse path.
+ var front = (delta % 2 != 0);
+ // Offsets for start and end of k loop.
+ // Prevents mapping of space beyond the grid.
+ var k1start = 0;
+ var k1end = 0;
+ var k2start = 0;
+ var k2end = 0;
+ for (var d = 0; d < max_d; d++) {
+ // Walk the front path one step.
+ for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {
+ var k1_offset = v_offset + k1;
+ var x1;
+ if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) {
+ x1 = v1[k1_offset + 1];
+ } else {
+ x1 = v1[k1_offset - 1] + 1;
+ }
+ var y1 = x1 - k1;
+ while (x1 < text1_length && y1 < text2_length &&
+ text1.charAt(x1) == text2.charAt(y1)) {
+ x1++;
+ y1++;
+ }
+ v1[k1_offset] = x1;
+ if (x1 > text1_length) {
+ // Ran off the right of the graph.
+ k1end += 2;
+ } else if (y1 > text2_length) {
+ // Ran off the bottom of the graph.
+ k1start += 2;
+ } else if (front) {
+ var k2_offset = v_offset + delta - k1;
+ if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) {
+ // Mirror x2 onto top-left coordinate system.
+ var x2 = text1_length - v2[k2_offset];
+ if (x1 >= x2) {
+ // Overlap detected.
+ return diff_bisectSplit_(text1, text2, x1, y1);
+ }
+ }
+ }
+ }
+
+ // Walk the reverse path one step.
+ for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {
+ var k2_offset = v_offset + k2;
+ var x2;
+ if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) {
+ x2 = v2[k2_offset + 1];
+ } else {
+ x2 = v2[k2_offset - 1] + 1;
+ }
+ var y2 = x2 - k2;
+ while (x2 < text1_length && y2 < text2_length &&
+ text1.charAt(text1_length - x2 - 1) ==
+ text2.charAt(text2_length - y2 - 1)) {
+ x2++;
+ y2++;
+ }
+ v2[k2_offset] = x2;
+ if (x2 > text1_length) {
+ // Ran off the left of the graph.
+ k2end += 2;
+ } else if (y2 > text2_length) {
+ // Ran off the top of the graph.
+ k2start += 2;
+ } else if (!front) {
+ var k1_offset = v_offset + delta - k2;
+ if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) {
+ var x1 = v1[k1_offset];
+ var y1 = v_offset + x1 - k1_offset;
+ // Mirror x2 onto top-left coordinate system.
+ x2 = text1_length - x2;
+ if (x1 >= x2) {
+ // Overlap detected.
+ return diff_bisectSplit_(text1, text2, x1, y1);
+ }
+ }
+ }
+ }
+ }
+ // Diff took too long and hit the deadline or
+ // number of diffs equals number of characters, no commonality at all.
+ return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];
+}
+
+/**
+ * Given the location of the 'middle snake', split the diff in two parts
+ * and recurse.
+ * @param {string} text1 Old string to be diffed.
+ * @param {string} text2 New string to be diffed.
+ * @param {number} x Index of split point in text1.
+ * @param {number} y Index of split point in text2.
+ * @return {Array} Array of diff tuples.
+ */
+function diff_bisectSplit_(text1, text2, x, y) {
+ var text1a = text1.substring(0, x);
+ var text2a = text2.substring(0, y);
+ var text1b = text1.substring(x);
+ var text2b = text2.substring(y);
+
+ // Compute both diffs serially.
+ var diffs = diff_main(text1a, text2a);
+ var diffsb = diff_main(text1b, text2b);
+
+ return diffs.concat(diffsb);
+}
+
+/**
+ * Determine the common prefix of two strings.
+ * @param {string} text1 First string.
+ * @param {string} text2 Second string.
+ * @return {number} The number of characters common to the start of each
+ * string.
+ */
+function diff_commonPrefix(text1, text2) {
+ // Quick check for common null cases.
+ if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) {
+ return 0;
+ }
+ // Binary search.
+ // Performance analysis: http://neil.fraser.name/news/2007/10/09/
+ var pointermin = 0;
+ var pointermax = Math.min(text1.length, text2.length);
+ var pointermid = pointermax;
+ var pointerstart = 0;
+ while (pointermin < pointermid) {
+ if (text1.substring(pointerstart, pointermid) ==
+ text2.substring(pointerstart, pointermid)) {
+ pointermin = pointermid;
+ pointerstart = pointermin;
+ } else {
+ pointermax = pointermid;
+ }
+ pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);
+ }
+ return pointermid;
+}
+
+/**
+ * Determine the common suffix of two strings.
+ * @param {string} text1 First string.
+ * @param {string} text2 Second string.
+ * @return {number} The number of characters common to the end of each string.
+ */
+function diff_commonSuffix(text1, text2) {
+ // Quick check for common null cases.
+ if (!text1 || !text2 ||
+ text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) {
+ return 0;
+ }
+ // Binary search.
+ // Performance analysis: http://neil.fraser.name/news/2007/10/09/
+ var pointermin = 0;
+ var pointermax = Math.min(text1.length, text2.length);
+ var pointermid = pointermax;
+ var pointerend = 0;
+ while (pointermin < pointermid) {
+ if (text1.substring(text1.length - pointermid, text1.length - pointerend) ==
+ text2.substring(text2.length - pointermid, text2.length - pointerend)) {
+ pointermin = pointermid;
+ pointerend = pointermin;
+ } else {
+ pointermax = pointermid;
+ }
+ pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);
+ }
+ return pointermid;
+}
+
+/**
+ * Do the two texts share a substring which is at least half the length of the
+ * longer text?
+ * This speedup can produce non-minimal diffs.
+ * @param {string} text1 First string.
+ * @param {string} text2 Second string.
+ * @return {Array.} Five element Array, containing the prefix of
+ * text1, the suffix of text1, the prefix of text2, the suffix of
+ * text2 and the common middle. Or null if there was no match.
+ */
+function diff_halfMatch_(text1, text2) {
+ var longtext = text1.length > text2.length ? text1 : text2;
+ var shorttext = text1.length > text2.length ? text2 : text1;
+ if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {
+ return null; // Pointless.
+ }
+
+ /**
+ * Does a substring of shorttext exist within longtext such that the substring
+ * is at least half the length of longtext?
+ * Closure, but does not reference any external variables.
+ * @param {string} longtext Longer string.
+ * @param {string} shorttext Shorter string.
+ * @param {number} i Start index of quarter length substring within longtext.
+ * @return {Array.} Five element Array, containing the prefix of
+ * longtext, the suffix of longtext, the prefix of shorttext, the suffix
+ * of shorttext and the common middle. Or null if there was no match.
+ * @private
+ */
+ function diff_halfMatchI_(longtext, shorttext, i) {
+ // Start with a 1/4 length substring at position i as a seed.
+ var seed = longtext.substring(i, i + Math.floor(longtext.length / 4));
+ var j = -1;
+ var best_common = '';
+ var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;
+ while ((j = shorttext.indexOf(seed, j + 1)) != -1) {
+ var prefixLength = diff_commonPrefix(longtext.substring(i),
+ shorttext.substring(j));
+ var suffixLength = diff_commonSuffix(longtext.substring(0, i),
+ shorttext.substring(0, j));
+ if (best_common.length < suffixLength + prefixLength) {
+ best_common = shorttext.substring(j - suffixLength, j) +
+ shorttext.substring(j, j + prefixLength);
+ best_longtext_a = longtext.substring(0, i - suffixLength);
+ best_longtext_b = longtext.substring(i + prefixLength);
+ best_shorttext_a = shorttext.substring(0, j - suffixLength);
+ best_shorttext_b = shorttext.substring(j + prefixLength);
+ }
+ }
+ if (best_common.length * 2 >= longtext.length) {
+ return [best_longtext_a, best_longtext_b,
+ best_shorttext_a, best_shorttext_b, best_common];
+ } else {
+ return null;
+ }
+ }
+
+ // First check if the second quarter is the seed for a half-match.
+ var hm1 = diff_halfMatchI_(longtext, shorttext,
+ Math.ceil(longtext.length / 4));
+ // Check again based on the third quarter.
+ var hm2 = diff_halfMatchI_(longtext, shorttext,
+ Math.ceil(longtext.length / 2));
+ var hm;
+ if (!hm1 && !hm2) {
+ return null;
+ } else if (!hm2) {
+ hm = hm1;
+ } else if (!hm1) {
+ hm = hm2;
+ } else {
+ // Both matched. Select the longest.
+ hm = hm1[4].length > hm2[4].length ? hm1 : hm2;
+ }
+
+ // A half-match was found, sort out the return data.
+ var text1_a, text1_b, text2_a, text2_b;
+ if (text1.length > text2.length) {
+ text1_a = hm[0];
+ text1_b = hm[1];
+ text2_a = hm[2];
+ text2_b = hm[3];
+ } else {
+ text2_a = hm[0];
+ text2_b = hm[1];
+ text1_a = hm[2];
+ text1_b = hm[3];
+ }
+ var mid_common = hm[4];
+ return [text1_a, text1_b, text2_a, text2_b, mid_common];
+}
+
+/**
+ * Reorder and merge like edit sections. Merge equalities.
+ * Any edit section can move as long as it doesn't cross an equality.
+ * @param {Array} diffs Array of diff tuples.
+ */
+function diff_cleanupMerge(diffs) {
+ diffs.push([DIFF_EQUAL, '']); // Add a dummy entry at the end.
+ var pointer = 0;
+ var count_delete = 0;
+ var count_insert = 0;
+ var text_delete = '';
+ var text_insert = '';
+ var commonlength;
+ while (pointer < diffs.length) {
+ switch (diffs[pointer][0]) {
+ case DIFF_INSERT:
+ count_insert++;
+ text_insert += diffs[pointer][1];
+ pointer++;
+ break;
+ case DIFF_DELETE:
+ count_delete++;
+ text_delete += diffs[pointer][1];
+ pointer++;
+ break;
+ case DIFF_EQUAL:
+ // Upon reaching an equality, check for prior redundancies.
+ if (count_delete + count_insert > 1) {
+ if (count_delete !== 0 && count_insert !== 0) {
+ // Factor out any common prefixies.
+ commonlength = diff_commonPrefix(text_insert, text_delete);
+ if (commonlength !== 0) {
+ if ((pointer - count_delete - count_insert) > 0 &&
+ diffs[pointer - count_delete - count_insert - 1][0] ==
+ DIFF_EQUAL) {
+ diffs[pointer - count_delete - count_insert - 1][1] +=
+ text_insert.substring(0, commonlength);
+ } else {
+ diffs.splice(0, 0, [DIFF_EQUAL,
+ text_insert.substring(0, commonlength)]);
+ pointer++;
+ }
+ text_insert = text_insert.substring(commonlength);
+ text_delete = text_delete.substring(commonlength);
+ }
+ // Factor out any common suffixies.
+ commonlength = diff_commonSuffix(text_insert, text_delete);
+ if (commonlength !== 0) {
+ diffs[pointer][1] = text_insert.substring(text_insert.length -
+ commonlength) + diffs[pointer][1];
+ text_insert = text_insert.substring(0, text_insert.length -
+ commonlength);
+ text_delete = text_delete.substring(0, text_delete.length -
+ commonlength);
+ }
+ }
+ // Delete the offending records and add the merged ones.
+ if (count_delete === 0) {
+ diffs.splice(pointer - count_insert,
+ count_delete + count_insert, [DIFF_INSERT, text_insert]);
+ } else if (count_insert === 0) {
+ diffs.splice(pointer - count_delete,
+ count_delete + count_insert, [DIFF_DELETE, text_delete]);
+ } else {
+ diffs.splice(pointer - count_delete - count_insert,
+ count_delete + count_insert, [DIFF_DELETE, text_delete],
+ [DIFF_INSERT, text_insert]);
+ }
+ pointer = pointer - count_delete - count_insert +
+ (count_delete ? 1 : 0) + (count_insert ? 1 : 0) + 1;
+ } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) {
+ // Merge this equality with the previous one.
+ diffs[pointer - 1][1] += diffs[pointer][1];
+ diffs.splice(pointer, 1);
+ } else {
+ pointer++;
+ }
+ count_insert = 0;
+ count_delete = 0;
+ text_delete = '';
+ text_insert = '';
+ break;
+ }
+ }
+ if (diffs[diffs.length - 1][1] === '') {
+ diffs.pop(); // Remove the dummy entry at the end.
+ }
+
+ // Second pass: look for single edits surrounded on both sides by equalities
+ // which can be shifted sideways to eliminate an equality.
+ // e.g: ABAC -> ABAC
+ var changes = false;
+ pointer = 1;
+ // Intentionally ignore the first and last element (don't need checking).
+ while (pointer < diffs.length - 1) {
+ if (diffs[pointer - 1][0] == DIFF_EQUAL &&
+ diffs[pointer + 1][0] == DIFF_EQUAL) {
+ // This is a single edit surrounded by equalities.
+ if (diffs[pointer][1].substring(diffs[pointer][1].length -
+ diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) {
+ // Shift the edit over the previous equality.
+ diffs[pointer][1] = diffs[pointer - 1][1] +
+ diffs[pointer][1].substring(0, diffs[pointer][1].length -
+ diffs[pointer - 1][1].length);
+ diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];
+ diffs.splice(pointer - 1, 1);
+ changes = true;
+ } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) ==
+ diffs[pointer + 1][1]) {
+ // Shift the edit over the next equality.
+ diffs[pointer - 1][1] += diffs[pointer + 1][1];
+ diffs[pointer][1] =
+ diffs[pointer][1].substring(diffs[pointer + 1][1].length) +
+ diffs[pointer + 1][1];
+ diffs.splice(pointer + 1, 1);
+ changes = true;
+ }
+ }
+ pointer++;
+ }
+ // If shifts were made, the diff needs reordering and another shift sweep.
+ if (changes) {
+ diff_cleanupMerge(diffs);
+ }
+}
+
+var diff = diff_main;
+diff.INSERT = DIFF_INSERT;
+diff.DELETE = DIFF_DELETE;
+diff.EQUAL = DIFF_EQUAL;
+
+module.exports = diff;
+
+/*
+ * Modify a diff such that the cursor position points to the start of a change:
+ * E.g.
+ * cursor_normalize_diff([[DIFF_EQUAL, 'abc']], 1)
+ * => [1, [[DIFF_EQUAL, 'a'], [DIFF_EQUAL, 'bc']]]
+ * cursor_normalize_diff([[DIFF_INSERT, 'new'], [DIFF_DELETE, 'xyz']], 2)
+ * => [2, [[DIFF_INSERT, 'new'], [DIFF_DELETE, 'xy'], [DIFF_DELETE, 'z']]]
+ *
+ * @param {Array} diffs Array of diff tuples
+ * @param {Int} cursor_pos Suggested edit position. Must not be out of bounds!
+ * @return {Array} A tuple [cursor location in the modified diff, modified diff]
+ */
+function cursor_normalize_diff (diffs, cursor_pos) {
+ if (cursor_pos === 0) {
+ return [DIFF_EQUAL, diffs];
+ }
+ for (var current_pos = 0, i = 0; i < diffs.length; i++) {
+ var d = diffs[i];
+ if (d[0] === DIFF_DELETE || d[0] === DIFF_EQUAL) {
+ var next_pos = current_pos + d[1].length;
+ if (cursor_pos === next_pos) {
+ return [i + 1, diffs];
+ } else if (cursor_pos < next_pos) {
+ // copy to prevent side effects
+ diffs = diffs.slice();
+ // split d into two diff changes
+ var split_pos = cursor_pos - current_pos;
+ var d_left = [d[0], d[1].slice(0, split_pos)];
+ var d_right = [d[0], d[1].slice(split_pos)];
+ diffs.splice(i, 1, d_left, d_right);
+ return [i + 1, diffs];
+ } else {
+ current_pos = next_pos;
+ }
+ }
+ }
+ throw new Error('cursor_pos is out of bounds!')
+}
+
+/*
+ * Modify a diff such that the edit position is "shifted" to the proposed edit location (cursor_position).
+ *
+ * Case 1)
+ * Check if a naive shift is possible:
+ * [0, X], [ 1, Y] -> [ 1, Y], [0, X] (if X + Y === Y + X)
+ * [0, X], [-1, Y] -> [-1, Y], [0, X] (if X + Y === Y + X) - holds same result
+ * Case 2)
+ * Check if the following shifts are possible:
+ * [0, 'pre'], [ 1, 'prefix'] -> [ 1, 'pre'], [0, 'pre'], [ 1, 'fix']
+ * [0, 'pre'], [-1, 'prefix'] -> [-1, 'pre'], [0, 'pre'], [-1, 'fix']
+ * ^ ^
+ * d d_next
+ *
+ * @param {Array} diffs Array of diff tuples
+ * @param {Int} cursor_pos Suggested edit position. Must not be out of bounds!
+ * @return {Array} Array of diff tuples
+ */
+function fix_cursor (diffs, cursor_pos) {
+ var norm = cursor_normalize_diff(diffs, cursor_pos);
+ var ndiffs = norm[1];
+ var cursor_pointer = norm[0];
+ var d = ndiffs[cursor_pointer];
+ var d_next = ndiffs[cursor_pointer + 1];
+
+ if (d == null) {
+ // Text was deleted from end of original string,
+ // cursor is now out of bounds in new string
+ return diffs;
+ } else if (d[0] !== DIFF_EQUAL) {
+ // A modification happened at the cursor location.
+ // This is the expected outcome, so we can return the original diff.
+ return diffs;
+ } else {
+ if (d_next != null && d[1] + d_next[1] === d_next[1] + d[1]) {
+ // Case 1)
+ // It is possible to perform a naive shift
+ ndiffs.splice(cursor_pointer, 2, d_next, d);
+ return merge_tuples(ndiffs, cursor_pointer, 2)
+ } else if (d_next != null && d_next[1].indexOf(d[1]) === 0) {
+ // Case 2)
+ // d[1] is a prefix of d_next[1]
+ // We can assume that d_next[0] !== 0, since d[0] === 0
+ // Shift edit locations..
+ ndiffs.splice(cursor_pointer, 2, [d_next[0], d[1]], [0, d[1]]);
+ var suffix = d_next[1].slice(d[1].length);
+ if (suffix.length > 0) {
+ ndiffs.splice(cursor_pointer + 2, 0, [d_next[0], suffix]);
+ }
+ return merge_tuples(ndiffs, cursor_pointer, 3)
+ } else {
+ // Not possible to perform any modification
+ return diffs;
+ }
+ }
+}
+
+/*
+ * Check diff did not split surrogate pairs.
+ * Ex. [0, '\uD83D'], [-1, '\uDC36'], [1, '\uDC2F'] -> [-1, '\uD83D\uDC36'], [1, '\uD83D\uDC2F']
+ * '\uD83D\uDC36' === '🐶', '\uD83D\uDC2F' === '🐯'
+ *
+ * @param {Array} diffs Array of diff tuples
+ * @return {Array} Array of diff tuples
+ */
+function fix_emoji (diffs) {
+ var compact = false;
+ var starts_with_pair_end = function(str) {
+ return str.charCodeAt(0) >= 0xDC00 && str.charCodeAt(0) <= 0xDFFF;
+ };
+ var ends_with_pair_start = function(str) {
+ return str.charCodeAt(str.length-1) >= 0xD800 && str.charCodeAt(str.length-1) <= 0xDBFF;
+ };
+ for (var i = 2; i < diffs.length; i += 1) {
+ if (diffs[i-2][0] === DIFF_EQUAL && ends_with_pair_start(diffs[i-2][1]) &&
+ diffs[i-1][0] === DIFF_DELETE && starts_with_pair_end(diffs[i-1][1]) &&
+ diffs[i][0] === DIFF_INSERT && starts_with_pair_end(diffs[i][1])) {
+ compact = true;
+
+ diffs[i-1][1] = diffs[i-2][1].slice(-1) + diffs[i-1][1];
+ diffs[i][1] = diffs[i-2][1].slice(-1) + diffs[i][1];
+
+ diffs[i-2][1] = diffs[i-2][1].slice(0, -1);
+ }
+ }
+ if (!compact) {
+ return diffs;
+ }
+ var fixed_diffs = [];
+ for (var i = 0; i < diffs.length; i += 1) {
+ if (diffs[i][1].length > 0) {
+ fixed_diffs.push(diffs[i]);
+ }
+ }
+ return fixed_diffs;
+}
+
+/*
+ * Try to merge tuples with their neigbors in a given range.
+ * E.g. [0, 'a'], [0, 'b'] -> [0, 'ab']
+ *
+ * @param {Array} diffs Array of diff tuples.
+ * @param {Int} start Position of the first element to merge (diffs[start] is also merged with diffs[start - 1]).
+ * @param {Int} length Number of consecutive elements to check.
+ * @return {Array} Array of merged diff tuples.
+ */
+function merge_tuples (diffs, start, length) {
+ // Check from (start-1) to (start+length).
+ for (var i = start + length - 1; i >= 0 && i >= start - 1; i--) {
+ if (i + 1 < diffs.length) {
+ var left_d = diffs[i];
+ var right_d = diffs[i+1];
+ if (left_d[0] === right_d[1]) {
+ diffs.splice(i, 2, [left_d[0], left_d[1] + right_d[1]]);
+ }
+ }
+ }
+ return diffs;
+}
+
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports) {
+
+exports = module.exports = typeof Object.keys === 'function'
+ ? Object.keys : shim;
+
+exports.shim = shim;
+function shim (obj) {
+ var keys = [];
+ for (var key in obj) keys.push(key);
+ return keys;
+}
+
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports) {
+
+var supportsArgumentsClass = (function(){
+ return Object.prototype.toString.call(arguments)
+})() == '[object Arguments]';
+
+exports = module.exports = supportsArgumentsClass ? supported : unsupported;
+
+exports.supported = supported;
+function supported(object) {
+ return Object.prototype.toString.call(object) == '[object Arguments]';
+}
+exports.unsupported = unsupported;
+function unsupported(object){
+ return object &&
+ typeof object == 'object' &&
+ typeof object.length == 'number' &&
+ Object.prototype.hasOwnProperty.call(object, 'callee') &&
+ !Object.prototype.propertyIsEnumerable.call(object, 'callee') ||
+ false;
+}
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports) {
+
+var has = Object.prototype.hasOwnProperty
+ , prefix = '~';
+
+/**
+ * Constructor to create a storage for our `EE` objects.
+ * An `Events` instance is a plain object whose properties are event names.
+ *
+ * @constructor
+ * @api private
+ */
+function Events() {}
+
+//
+// We try to not inherit from `Object.prototype`. In some engines creating an
+// instance in this way is faster than calling `Object.create(null)` directly.
+// If `Object.create(null)` is not supported we prefix the event names with a
+// character to make sure that the built-in object properties are not
+// overridden or used as an attack vector.
+//
+if (Object.create) {
+ Events.prototype = Object.create(null);
+
+ //
+ // This hack is needed because the `__proto__` property is still inherited in
+ // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.
+ //
+ if (!new Events().__proto__) prefix = false;
+}
+
+/**
+ * Representation of a single event listener.
+ *
+ * @param {Function} fn The listener function.
+ * @param {Mixed} context The context to invoke the listener with.
+ * @param {Boolean} [once=false] Specify if the listener is a one-time listener.
+ * @constructor
+ * @api private
+ */
+function EE(fn, context, once) {
+ this.fn = fn;
+ this.context = context;
+ this.once = once || false;
+}
+
+/**
+ * Minimal `EventEmitter` interface that is molded against the Node.js
+ * `EventEmitter` interface.
+ *
+ * @constructor
+ * @api public
+ */
+function EventEmitter() {
+ this._events = new Events();
+ this._eventsCount = 0;
+}
+
+/**
+ * Return an array listing the events for which the emitter has registered
+ * listeners.
+ *
+ * @returns {Array}
+ * @api public
+ */
+EventEmitter.prototype.eventNames = function eventNames() {
+ var names = []
+ , events
+ , name;
+
+ if (this._eventsCount === 0) return names;
+
+ for (name in (events = this._events)) {
+ if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
+ }
+
+ if (Object.getOwnPropertySymbols) {
+ return names.concat(Object.getOwnPropertySymbols(events));
+ }
+
+ return names;
+};
+
+/**
+ * Return the listeners registered for a given event.
+ *
+ * @param {String|Symbol} event The event name.
+ * @param {Boolean} exists Only check if there are listeners.
+ * @returns {Array|Boolean}
+ * @api public
+ */
+EventEmitter.prototype.listeners = function listeners(event, exists) {
+ var evt = prefix ? prefix + event : event
+ , available = this._events[evt];
+
+ if (exists) return !!available;
+ if (!available) return [];
+ if (available.fn) return [available.fn];
+
+ for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {
+ ee[i] = available[i].fn;
+ }
+
+ return ee;
+};
+
+/**
+ * Calls each of the listeners registered for a given event.
+ *
+ * @param {String|Symbol} event The event name.
+ * @returns {Boolean} `true` if the event had listeners, else `false`.
+ * @api public
+ */
+EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
+ var evt = prefix ? prefix + event : event;
+
+ if (!this._events[evt]) return false;
+
+ var listeners = this._events[evt]
+ , len = arguments.length
+ , args
+ , i;
+
+ if (listeners.fn) {
+ if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);
+
+ switch (len) {
+ case 1: return listeners.fn.call(listeners.context), true;
+ case 2: return listeners.fn.call(listeners.context, a1), true;
+ case 3: return listeners.fn.call(listeners.context, a1, a2), true;
+ case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;
+ case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
+ case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
+ }
+
+ for (i = 1, args = new Array(len -1); i < len; i++) {
+ args[i - 1] = arguments[i];
+ }
+
+ listeners.fn.apply(listeners.context, args);
+ } else {
+ var length = listeners.length
+ , j;
+
+ for (i = 0; i < length; i++) {
+ if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);
+
+ switch (len) {
+ case 1: listeners[i].fn.call(listeners[i].context); break;
+ case 2: listeners[i].fn.call(listeners[i].context, a1); break;
+ case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
+ case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;
+ default:
+ if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {
+ args[j - 1] = arguments[j];
+ }
+
+ listeners[i].fn.apply(listeners[i].context, args);
+ }
+ }
+ }
+
+ return true;
+};
+
+/**
+ * Add a listener for a given event.
+ *
+ * @param {String|Symbol} event The event name.
+ * @param {Function} fn The listener function.
+ * @param {Mixed} [context=this] The context to invoke the listener with.
+ * @returns {EventEmitter} `this`.
+ * @api public
+ */
+EventEmitter.prototype.on = function on(event, fn, context) {
+ var listener = new EE(fn, context || this)
+ , evt = prefix ? prefix + event : event;
+
+ if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;
+ else if (!this._events[evt].fn) this._events[evt].push(listener);
+ else this._events[evt] = [this._events[evt], listener];
+
+ return this;
+};
+
+/**
+ * Add a one-time listener for a given event.
+ *
+ * @param {String|Symbol} event The event name.
+ * @param {Function} fn The listener function.
+ * @param {Mixed} [context=this] The context to invoke the listener with.
+ * @returns {EventEmitter} `this`.
+ * @api public
+ */
+EventEmitter.prototype.once = function once(event, fn, context) {
+ var listener = new EE(fn, context || this, true)
+ , evt = prefix ? prefix + event : event;
+
+ if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++;
+ else if (!this._events[evt].fn) this._events[evt].push(listener);
+ else this._events[evt] = [this._events[evt], listener];
+
+ return this;
+};
+
+/**
+ * Remove the listeners of a given event.
+ *
+ * @param {String|Symbol} event The event name.
+ * @param {Function} fn Only remove the listeners that match this function.
+ * @param {Mixed} context Only remove the listeners that have this context.
+ * @param {Boolean} once Only remove one-time listeners.
+ * @returns {EventEmitter} `this`.
+ * @api public
+ */
+EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
+ var evt = prefix ? prefix + event : event;
+
+ if (!this._events[evt]) return this;
+ if (!fn) {
+ if (--this._eventsCount === 0) this._events = new Events();
+ else delete this._events[evt];
+ return this;
+ }
+
+ var listeners = this._events[evt];
+
+ if (listeners.fn) {
+ if (
+ listeners.fn === fn
+ && (!once || listeners.once)
+ && (!context || listeners.context === context)
+ ) {
+ if (--this._eventsCount === 0) this._events = new Events();
+ else delete this._events[evt];
+ }
+ } else {
+ for (var i = 0, events = [], length = listeners.length; i < length; i++) {
+ if (
+ listeners[i].fn !== fn
+ || (once && !listeners[i].once)
+ || (context && listeners[i].context !== context)
+ ) {
+ events.push(listeners[i]);
+ }
+ }
+
+ //
+ // Reset the array, or remove it completely if we have no more listeners.
+ //
+ if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
+ else if (--this._eventsCount === 0) this._events = new Events();
+ else delete this._events[evt];
+ }
+
+ return this;
+};
+
+/**
+ * Remove all listeners, or those of the specified event.
+ *
+ * @param {String|Symbol} [event] The event name.
+ * @returns {EventEmitter} `this`.
+ * @api public
+ */
+EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
+ var evt;
+
+ if (event) {
+ evt = prefix ? prefix + event : event;
+ if (this._events[evt]) {
+ if (--this._eventsCount === 0) this._events = new Events();
+ else delete this._events[evt];
+ }
+ } else {
+ this._events = new Events();
+ this._eventsCount = 0;
+ }
+
+ return this;
+};
+
+//
+// Alias methods names because people roll like that.
+//
+EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
+EventEmitter.prototype.addListener = EventEmitter.prototype.on;
+
+//
+// This function doesn't apply anymore.
+//
+EventEmitter.prototype.setMaxListeners = function setMaxListeners() {
+ return this;
+};
+
+//
+// Expose the prefix.
+//
+EventEmitter.prefixed = prefix;
+
+//
+// Allow `EventEmitter` to be imported as module namespace.
+//
+EventEmitter.EventEmitter = EventEmitter;
+
+//
+// Expose the module.
+//
+if ('undefined' !== typeof module) {
+ module.exports = EventEmitter;
+}
+
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.matchText = exports.matchSpacing = exports.matchNewline = exports.matchBlot = exports.matchAttributor = exports.default = undefined;
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _extend2 = __webpack_require__(3);
+
+var _extend3 = _interopRequireDefault(_extend2);
+
+var _quillDelta = __webpack_require__(2);
+
+var _quillDelta2 = _interopRequireDefault(_quillDelta);
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _quill = __webpack_require__(5);
+
+var _quill2 = _interopRequireDefault(_quill);
+
+var _logger = __webpack_require__(10);
+
+var _logger2 = _interopRequireDefault(_logger);
+
+var _module = __webpack_require__(9);
+
+var _module2 = _interopRequireDefault(_module);
+
+var _align = __webpack_require__(36);
+
+var _background = __webpack_require__(37);
+
+var _code = __webpack_require__(13);
+
+var _code2 = _interopRequireDefault(_code);
+
+var _color = __webpack_require__(26);
+
+var _direction = __webpack_require__(38);
+
+var _font = __webpack_require__(39);
+
+var _size = __webpack_require__(40);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var debug = (0, _logger2.default)('quill:clipboard');
+
+var DOM_KEY = '__ql-matcher';
+
+var CLIPBOARD_CONFIG = [[Node.TEXT_NODE, matchText], [Node.TEXT_NODE, matchNewline], ['br', matchBreak], [Node.ELEMENT_NODE, matchNewline], [Node.ELEMENT_NODE, matchBlot], [Node.ELEMENT_NODE, matchSpacing], [Node.ELEMENT_NODE, matchAttributor], [Node.ELEMENT_NODE, matchStyles], ['li', matchIndent], ['b', matchAlias.bind(matchAlias, 'bold')], ['i', matchAlias.bind(matchAlias, 'italic')], ['style', matchIgnore]];
+
+var ATTRIBUTE_ATTRIBUTORS = [_align.AlignAttribute, _direction.DirectionAttribute].reduce(function (memo, attr) {
+ memo[attr.keyName] = attr;
+ return memo;
+}, {});
+
+var STYLE_ATTRIBUTORS = [_align.AlignStyle, _background.BackgroundStyle, _color.ColorStyle, _direction.DirectionStyle, _font.FontStyle, _size.SizeStyle].reduce(function (memo, attr) {
+ memo[attr.keyName] = attr;
+ return memo;
+}, {});
+
+var Clipboard = function (_Module) {
+ _inherits(Clipboard, _Module);
+
+ function Clipboard(quill, options) {
+ _classCallCheck(this, Clipboard);
+
+ var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this, quill, options));
+
+ _this.quill.root.addEventListener('paste', _this.onPaste.bind(_this));
+ _this.container = _this.quill.addContainer('ql-clipboard');
+ _this.container.setAttribute('contenteditable', true);
+ _this.container.setAttribute('tabindex', -1);
+ _this.matchers = [];
+ CLIPBOARD_CONFIG.concat(_this.options.matchers).forEach(function (_ref) {
+ var _ref2 = _slicedToArray(_ref, 2),
+ selector = _ref2[0],
+ matcher = _ref2[1];
+
+ if (!options.matchVisual && matcher === matchSpacing) return;
+ _this.addMatcher(selector, matcher);
+ });
+ return _this;
+ }
+
+ _createClass(Clipboard, [{
+ key: 'addMatcher',
+ value: function addMatcher(selector, matcher) {
+ this.matchers.push([selector, matcher]);
+ }
+ }, {
+ key: 'convert',
+ value: function convert(html) {
+ if (typeof html === 'string') {
+ this.container.innerHTML = html.replace(/\>\r?\n +\<'); // Remove spaces between tags
+ return this.convert();
+ }
+ var formats = this.quill.getFormat(this.quill.selection.savedRange.index);
+ if (formats[_code2.default.blotName]) {
+ var text = this.container.innerText;
+ this.container.innerHTML = '';
+ return new _quillDelta2.default().insert(text, _defineProperty({}, _code2.default.blotName, formats[_code2.default.blotName]));
+ }
+
+ var _prepareMatching = this.prepareMatching(),
+ _prepareMatching2 = _slicedToArray(_prepareMatching, 2),
+ elementMatchers = _prepareMatching2[0],
+ textMatchers = _prepareMatching2[1];
+
+ var delta = traverse(this.container, elementMatchers, textMatchers);
+ // Remove trailing newline
+ if (deltaEndsWith(delta, '\n') && delta.ops[delta.ops.length - 1].attributes == null) {
+ delta = delta.compose(new _quillDelta2.default().retain(delta.length() - 1).delete(1));
+ }
+ debug.log('convert', this.container.innerHTML, delta);
+ this.container.innerHTML = '';
+ return delta;
+ }
+ }, {
+ key: 'dangerouslyPasteHTML',
+ value: function dangerouslyPasteHTML(index, html) {
+ var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _quill2.default.sources.API;
+
+ if (typeof index === 'string') {
+ this.quill.setContents(this.convert(index), html);
+ this.quill.setSelection(0, _quill2.default.sources.SILENT);
+ } else {
+ var paste = this.convert(html);
+ this.quill.updateContents(new _quillDelta2.default().retain(index).concat(paste), source);
+ this.quill.setSelection(index + paste.length(), _quill2.default.sources.SILENT);
+ }
+ }
+ }, {
+ key: 'onPaste',
+ value: function onPaste(e) {
+ var _this2 = this;
+
+ if (e.defaultPrevented || !this.quill.isEnabled()) return;
+ var range = this.quill.getSelection();
+ var delta = new _quillDelta2.default().retain(range.index);
+ var scrollTop = this.quill.scrollingContainer.scrollTop;
+ this.container.focus();
+ this.quill.selection.update(_quill2.default.sources.SILENT);
+ setTimeout(function () {
+ delta = delta.concat(_this2.convert()).delete(range.length);
+ _this2.quill.updateContents(delta, _quill2.default.sources.USER);
+ // range.length contributes to delta.length()
+ _this2.quill.setSelection(delta.length() - range.length, _quill2.default.sources.SILENT);
+ _this2.quill.scrollingContainer.scrollTop = scrollTop;
+ _this2.quill.focus();
+ }, 1);
+ }
+ }, {
+ key: 'prepareMatching',
+ value: function prepareMatching() {
+ var _this3 = this;
+
+ var elementMatchers = [],
+ textMatchers = [];
+ this.matchers.forEach(function (pair) {
+ var _pair = _slicedToArray(pair, 2),
+ selector = _pair[0],
+ matcher = _pair[1];
+
+ switch (selector) {
+ case Node.TEXT_NODE:
+ textMatchers.push(matcher);
+ break;
+ case Node.ELEMENT_NODE:
+ elementMatchers.push(matcher);
+ break;
+ default:
+ [].forEach.call(_this3.container.querySelectorAll(selector), function (node) {
+ // TODO use weakmap
+ node[DOM_KEY] = node[DOM_KEY] || [];
+ node[DOM_KEY].push(matcher);
+ });
+ break;
+ }
+ });
+ return [elementMatchers, textMatchers];
+ }
+ }]);
+
+ return Clipboard;
+}(_module2.default);
+
+Clipboard.DEFAULTS = {
+ matchers: [],
+ matchVisual: true
+};
+
+function applyFormat(delta, format, value) {
+ if ((typeof format === 'undefined' ? 'undefined' : _typeof(format)) === 'object') {
+ return Object.keys(format).reduce(function (delta, key) {
+ return applyFormat(delta, key, format[key]);
+ }, delta);
+ } else {
+ return delta.reduce(function (delta, op) {
+ if (op.attributes && op.attributes[format]) {
+ return delta.push(op);
+ } else {
+ return delta.insert(op.insert, (0, _extend3.default)({}, _defineProperty({}, format, value), op.attributes));
+ }
+ }, new _quillDelta2.default());
+ }
+}
+
+function computeStyle(node) {
+ if (node.nodeType !== Node.ELEMENT_NODE) return {};
+ var DOM_KEY = '__ql-computed-style';
+ return node[DOM_KEY] || (node[DOM_KEY] = window.getComputedStyle(node));
+}
+
+function deltaEndsWith(delta, text) {
+ var endText = "";
+ for (var i = delta.ops.length - 1; i >= 0 && endText.length < text.length; --i) {
+ var op = delta.ops[i];
+ if (typeof op.insert !== 'string') break;
+ endText = op.insert + endText;
+ }
+ return endText.slice(-1 * text.length) === text;
+}
+
+function isLine(node) {
+ if (node.childNodes.length === 0) return false; // Exclude embed blocks
+ var style = computeStyle(node);
+ return ['block', 'list-item'].indexOf(style.display) > -1;
+}
+
+function traverse(node, elementMatchers, textMatchers) {
+ // Post-order
+ if (node.nodeType === node.TEXT_NODE) {
+ return textMatchers.reduce(function (delta, matcher) {
+ return matcher(node, delta);
+ }, new _quillDelta2.default());
+ } else if (node.nodeType === node.ELEMENT_NODE) {
+ return [].reduce.call(node.childNodes || [], function (delta, childNode) {
+ var childrenDelta = traverse(childNode, elementMatchers, textMatchers);
+ if (childNode.nodeType === node.ELEMENT_NODE) {
+ childrenDelta = elementMatchers.reduce(function (childrenDelta, matcher) {
+ return matcher(childNode, childrenDelta);
+ }, childrenDelta);
+ childrenDelta = (childNode[DOM_KEY] || []).reduce(function (childrenDelta, matcher) {
+ return matcher(childNode, childrenDelta);
+ }, childrenDelta);
+ }
+ return delta.concat(childrenDelta);
+ }, new _quillDelta2.default());
+ } else {
+ return new _quillDelta2.default();
+ }
+}
+
+function matchAlias(format, node, delta) {
+ return applyFormat(delta, format, true);
+}
+
+function matchAttributor(node, delta) {
+ var attributes = _parchment2.default.Attributor.Attribute.keys(node);
+ var classes = _parchment2.default.Attributor.Class.keys(node);
+ var styles = _parchment2.default.Attributor.Style.keys(node);
+ var formats = {};
+ attributes.concat(classes).concat(styles).forEach(function (name) {
+ var attr = _parchment2.default.query(name, _parchment2.default.Scope.ATTRIBUTE);
+ if (attr != null) {
+ formats[attr.attrName] = attr.value(node);
+ if (formats[attr.attrName]) return;
+ }
+ attr = ATTRIBUTE_ATTRIBUTORS[name];
+ if (attr != null && (attr.attrName === name || attr.keyName === name)) {
+ formats[attr.attrName] = attr.value(node) || undefined;
+ }
+ attr = STYLE_ATTRIBUTORS[name];
+ if (attr != null && (attr.attrName === name || attr.keyName === name)) {
+ attr = STYLE_ATTRIBUTORS[name];
+ formats[attr.attrName] = attr.value(node) || undefined;
+ }
+ });
+ if (Object.keys(formats).length > 0) {
+ delta = applyFormat(delta, formats);
+ }
+ return delta;
+}
+
+function matchBlot(node, delta) {
+ var match = _parchment2.default.query(node);
+ if (match == null) return delta;
+ if (match.prototype instanceof _parchment2.default.Embed) {
+ var embed = {};
+ var value = match.value(node);
+ if (value != null) {
+ embed[match.blotName] = value;
+ delta = new _quillDelta2.default().insert(embed, match.formats(node));
+ }
+ } else if (typeof match.formats === 'function') {
+ delta = applyFormat(delta, match.blotName, match.formats(node));
+ }
+ return delta;
+}
+
+function matchBreak(node, delta) {
+ if (!deltaEndsWith(delta, '\n')) {
+ delta.insert('\n');
+ }
+ return delta;
+}
+
+function matchIgnore() {
+ return new _quillDelta2.default();
+}
+
+function matchIndent(node, delta) {
+ var match = _parchment2.default.query(node);
+ if (match == null || match.blotName !== 'list-item' || !deltaEndsWith(delta, '\n')) {
+ return delta;
+ }
+ var indent = -1,
+ parent = node.parentNode;
+ while (!parent.classList.contains('ql-clipboard')) {
+ if ((_parchment2.default.query(parent) || {}).blotName === 'list') {
+ indent += 1;
+ }
+ parent = parent.parentNode;
+ }
+ if (indent <= 0) return delta;
+ return delta.compose(new _quillDelta2.default().retain(delta.length() - 1).retain(1, { indent: indent }));
+}
+
+function matchNewline(node, delta) {
+ if (!deltaEndsWith(delta, '\n')) {
+ if (isLine(node) || delta.length() > 0 && node.nextSibling && isLine(node.nextSibling)) {
+ delta.insert('\n');
+ }
+ }
+ return delta;
+}
+
+function matchSpacing(node, delta) {
+ if (isLine(node) && node.nextElementSibling != null && !deltaEndsWith(delta, '\n\n')) {
+ var nodeHeight = node.offsetHeight + parseFloat(computeStyle(node).marginTop) + parseFloat(computeStyle(node).marginBottom);
+ if (node.nextElementSibling.offsetTop > node.offsetTop + nodeHeight * 1.5) {
+ delta.insert('\n');
+ }
+ }
+ return delta;
+}
+
+function matchStyles(node, delta) {
+ var formats = {};
+ var style = node.style || {};
+ if (style.fontStyle && computeStyle(node).fontStyle === 'italic') {
+ formats.italic = true;
+ }
+ if (style.fontWeight && (computeStyle(node).fontWeight.startsWith('bold') || parseInt(computeStyle(node).fontWeight) >= 700)) {
+ formats.bold = true;
+ }
+ if (Object.keys(formats).length > 0) {
+ delta = applyFormat(delta, formats);
+ }
+ if (parseFloat(style.textIndent || 0) > 0) {
+ // Could be 0.5in
+ delta = new _quillDelta2.default().insert('\t').concat(delta);
+ }
+ return delta;
+}
+
+function matchText(node, delta) {
+ var text = node.data;
+ // Word represents empty line with
+ if (node.parentNode.tagName === 'O:P') {
+ return delta.insert(text.trim());
+ }
+ if (text.trim().length === 0 && node.parentNode.classList.contains('ql-clipboard')) {
+ return delta;
+ }
+ if (!computeStyle(node.parentNode).whiteSpace.startsWith('pre')) {
+ // eslint-disable-next-line func-style
+ var replacer = function replacer(collapse, match) {
+ match = match.replace(/[^\u00a0]/g, ''); // \u00a0 is nbsp;
+ return match.length < 1 && collapse ? ' ' : match;
+ };
+ text = text.replace(/\r\n/g, ' ').replace(/\n/g, ' ');
+ text = text.replace(/\s\s+/g, replacer.bind(replacer, true)); // collapse whitespace
+ if (node.previousSibling == null && isLine(node.parentNode) || node.previousSibling != null && isLine(node.previousSibling)) {
+ text = text.replace(/^\s+/, replacer.bind(replacer, false));
+ }
+ if (node.nextSibling == null && isLine(node.parentNode) || node.nextSibling != null && isLine(node.nextSibling)) {
+ text = text.replace(/\s+$/, replacer.bind(replacer, false));
+ }
+ }
+ return delta.insert(text);
+}
+
+exports.default = Clipboard;
+exports.matchAttributor = matchAttributor;
+exports.matchBlot = matchBlot;
+exports.matchNewline = matchNewline;
+exports.matchSpacing = matchSpacing;
+exports.matchText = matchText;
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _inline = __webpack_require__(6);
+
+var _inline2 = _interopRequireDefault(_inline);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var Bold = function (_Inline) {
+ _inherits(Bold, _Inline);
+
+ function Bold() {
+ _classCallCheck(this, Bold);
+
+ return _possibleConstructorReturn(this, (Bold.__proto__ || Object.getPrototypeOf(Bold)).apply(this, arguments));
+ }
+
+ _createClass(Bold, [{
+ key: 'optimize',
+ value: function optimize(context) {
+ _get(Bold.prototype.__proto__ || Object.getPrototypeOf(Bold.prototype), 'optimize', this).call(this, context);
+ if (this.domNode.tagName !== this.statics.tagName[0]) {
+ this.replaceWith(this.statics.blotName);
+ }
+ }
+ }], [{
+ key: 'create',
+ value: function create() {
+ return _get(Bold.__proto__ || Object.getPrototypeOf(Bold), 'create', this).call(this);
+ }
+ }, {
+ key: 'formats',
+ value: function formats() {
+ return true;
+ }
+ }]);
+
+ return Bold;
+}(_inline2.default);
+
+Bold.blotName = 'bold';
+Bold.tagName = ['STRONG', 'B'];
+
+exports.default = Bold;
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.addControls = exports.default = undefined;
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _quillDelta = __webpack_require__(2);
+
+var _quillDelta2 = _interopRequireDefault(_quillDelta);
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _quill = __webpack_require__(5);
+
+var _quill2 = _interopRequireDefault(_quill);
+
+var _logger = __webpack_require__(10);
+
+var _logger2 = _interopRequireDefault(_logger);
+
+var _module = __webpack_require__(9);
+
+var _module2 = _interopRequireDefault(_module);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var debug = (0, _logger2.default)('quill:toolbar');
+
+var Toolbar = function (_Module) {
+ _inherits(Toolbar, _Module);
+
+ function Toolbar(quill, options) {
+ _classCallCheck(this, Toolbar);
+
+ var _this = _possibleConstructorReturn(this, (Toolbar.__proto__ || Object.getPrototypeOf(Toolbar)).call(this, quill, options));
+
+ if (Array.isArray(_this.options.container)) {
+ var container = document.createElement('div');
+ addControls(container, _this.options.container);
+ quill.container.parentNode.insertBefore(container, quill.container);
+ _this.container = container;
+ } else if (typeof _this.options.container === 'string') {
+ _this.container = document.querySelector(_this.options.container);
+ } else {
+ _this.container = _this.options.container;
+ }
+ if (!(_this.container instanceof HTMLElement)) {
+ var _ret;
+
+ return _ret = debug.error('Container required for toolbar', _this.options), _possibleConstructorReturn(_this, _ret);
+ }
+ _this.container.classList.add('ql-toolbar');
+ _this.controls = [];
+ _this.handlers = {};
+ Object.keys(_this.options.handlers).forEach(function (format) {
+ _this.addHandler(format, _this.options.handlers[format]);
+ });
+ [].forEach.call(_this.container.querySelectorAll('button, select'), function (input) {
+ _this.attach(input);
+ });
+ _this.quill.on(_quill2.default.events.EDITOR_CHANGE, function (type, range) {
+ if (type === _quill2.default.events.SELECTION_CHANGE) {
+ _this.update(range);
+ }
+ });
+ _this.quill.on(_quill2.default.events.SCROLL_OPTIMIZE, function () {
+ var _this$quill$selection = _this.quill.selection.getRange(),
+ _this$quill$selection2 = _slicedToArray(_this$quill$selection, 1),
+ range = _this$quill$selection2[0]; // quill.getSelection triggers update
+
+
+ _this.update(range);
+ });
+ return _this;
+ }
+
+ _createClass(Toolbar, [{
+ key: 'addHandler',
+ value: function addHandler(format, handler) {
+ this.handlers[format] = handler;
+ }
+ }, {
+ key: 'attach',
+ value: function attach(input) {
+ var _this2 = this;
+
+ var format = [].find.call(input.classList, function (className) {
+ return className.indexOf('ql-') === 0;
+ });
+ if (!format) return;
+ format = format.slice('ql-'.length);
+ if (input.tagName === 'BUTTON') {
+ input.setAttribute('type', 'button');
+ }
+ if (this.handlers[format] == null) {
+ if (this.quill.scroll.whitelist != null && this.quill.scroll.whitelist[format] == null) {
+ debug.warn('ignoring attaching to disabled format', format, input);
+ return;
+ }
+ if (_parchment2.default.query(format) == null) {
+ debug.warn('ignoring attaching to nonexistent format', format, input);
+ return;
+ }
+ }
+ var eventName = input.tagName === 'SELECT' ? 'change' : 'click';
+ input.addEventListener(eventName, function (e) {
+ var value = void 0;
+ if (input.tagName === 'SELECT') {
+ if (input.selectedIndex < 0) return;
+ var selected = input.options[input.selectedIndex];
+ if (selected.hasAttribute('selected')) {
+ value = false;
+ } else {
+ value = selected.value || false;
+ }
+ } else {
+ if (input.classList.contains('ql-active')) {
+ value = false;
+ } else {
+ value = input.value || !input.hasAttribute('value');
+ }
+ e.preventDefault();
+ }
+ _this2.quill.focus();
+
+ var _quill$selection$getR = _this2.quill.selection.getRange(),
+ _quill$selection$getR2 = _slicedToArray(_quill$selection$getR, 1),
+ range = _quill$selection$getR2[0];
+
+ if (_this2.handlers[format] != null) {
+ _this2.handlers[format].call(_this2, value);
+ } else if (_parchment2.default.query(format).prototype instanceof _parchment2.default.Embed) {
+ value = prompt('Enter ' + format);
+ if (!value) return;
+ _this2.quill.updateContents(new _quillDelta2.default().retain(range.index).delete(range.length).insert(_defineProperty({}, format, value)), _quill2.default.sources.USER);
+ } else {
+ _this2.quill.format(format, value, _quill2.default.sources.USER);
+ }
+ _this2.update(range);
+ });
+ // TODO use weakmap
+ this.controls.push([format, input]);
+ }
+ }, {
+ key: 'update',
+ value: function update(range) {
+ var formats = range == null ? {} : this.quill.getFormat(range);
+ this.controls.forEach(function (pair) {
+ var _pair = _slicedToArray(pair, 2),
+ format = _pair[0],
+ input = _pair[1];
+
+ if (input.tagName === 'SELECT') {
+ var option = void 0;
+ if (range == null) {
+ option = null;
+ } else if (formats[format] == null) {
+ option = input.querySelector('option[selected]');
+ } else if (!Array.isArray(formats[format])) {
+ var value = formats[format];
+ if (typeof value === 'string') {
+ value = value.replace(/\"/g, '\\"');
+ }
+ option = input.querySelector('option[value="' + value + '"]');
+ }
+ if (option == null) {
+ input.value = ''; // TODO make configurable?
+ input.selectedIndex = -1;
+ } else {
+ option.selected = true;
+ }
+ } else {
+ if (range == null) {
+ input.classList.remove('ql-active');
+ } else if (input.hasAttribute('value')) {
+ // both being null should match (default values)
+ // '1' should match with 1 (headers)
+ var isActive = formats[format] === input.getAttribute('value') || formats[format] != null && formats[format].toString() === input.getAttribute('value') || formats[format] == null && !input.getAttribute('value');
+ input.classList.toggle('ql-active', isActive);
+ } else {
+ input.classList.toggle('ql-active', formats[format] != null);
+ }
+ }
+ });
+ }
+ }]);
+
+ return Toolbar;
+}(_module2.default);
+
+Toolbar.DEFAULTS = {};
+
+function addButton(container, format, value) {
+ var input = document.createElement('button');
+ input.setAttribute('type', 'button');
+ input.classList.add('ql-' + format);
+ if (value != null) {
+ input.value = value;
+ }
+ container.appendChild(input);
+}
+
+function addControls(container, groups) {
+ if (!Array.isArray(groups[0])) {
+ groups = [groups];
+ }
+ groups.forEach(function (controls) {
+ var group = document.createElement('span');
+ group.classList.add('ql-formats');
+ controls.forEach(function (control) {
+ if (typeof control === 'string') {
+ addButton(group, control);
+ } else {
+ var format = Object.keys(control)[0];
+ var value = control[format];
+ if (Array.isArray(value)) {
+ addSelect(group, format, value);
+ } else {
+ addButton(group, format, value);
+ }
+ }
+ });
+ container.appendChild(group);
+ });
+}
+
+function addSelect(container, format, values) {
+ var input = document.createElement('select');
+ input.classList.add('ql-' + format);
+ values.forEach(function (value) {
+ var option = document.createElement('option');
+ if (value !== false) {
+ option.setAttribute('value', value);
+ } else {
+ option.setAttribute('selected', 'selected');
+ }
+ input.appendChild(option);
+ });
+ container.appendChild(input);
+}
+
+Toolbar.DEFAULTS = {
+ container: null,
+ handlers: {
+ clean: function clean() {
+ var _this3 = this;
+
+ var range = this.quill.getSelection();
+ if (range == null) return;
+ if (range.length == 0) {
+ var formats = this.quill.getFormat();
+ Object.keys(formats).forEach(function (name) {
+ // Clean functionality in existing apps only clean inline formats
+ if (_parchment2.default.query(name, _parchment2.default.Scope.INLINE) != null) {
+ _this3.quill.format(name, false);
+ }
+ });
+ } else {
+ this.quill.removeFormat(range, _quill2.default.sources.USER);
+ }
+ },
+ direction: function direction(value) {
+ var align = this.quill.getFormat()['align'];
+ if (value === 'rtl' && align == null) {
+ this.quill.format('align', 'right', _quill2.default.sources.USER);
+ } else if (!value && align === 'right') {
+ this.quill.format('align', false, _quill2.default.sources.USER);
+ }
+ this.quill.format('direction', value, _quill2.default.sources.USER);
+ },
+ indent: function indent(value) {
+ var range = this.quill.getSelection();
+ var formats = this.quill.getFormat(range);
+ var indent = parseInt(formats.indent || 0);
+ if (value === '+1' || value === '-1') {
+ var modifier = value === '+1' ? 1 : -1;
+ if (formats.direction === 'rtl') modifier *= -1;
+ this.quill.format('indent', indent + modifier, _quill2.default.sources.USER);
+ }
+ },
+ link: function link(value) {
+ if (value === true) {
+ value = prompt('Enter link URL:');
+ }
+ this.quill.format('link', value, _quill2.default.sources.USER);
+ },
+ list: function list(value) {
+ var range = this.quill.getSelection();
+ var formats = this.quill.getFormat(range);
+ if (value === 'check') {
+ if (formats['list'] === 'checked' || formats['list'] === 'unchecked') {
+ this.quill.format('list', false, _quill2.default.sources.USER);
+ } else {
+ this.quill.format('list', 'unchecked', _quill2.default.sources.USER);
+ }
+ } else {
+ this.quill.format('list', value, _quill2.default.sources.USER);
+ }
+ }
+ }
+};
+
+exports.default = Toolbar;
+exports.addControls = addControls;
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _picker = __webpack_require__(28);
+
+var _picker2 = _interopRequireDefault(_picker);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var ColorPicker = function (_Picker) {
+ _inherits(ColorPicker, _Picker);
+
+ function ColorPicker(select, label) {
+ _classCallCheck(this, ColorPicker);
+
+ var _this = _possibleConstructorReturn(this, (ColorPicker.__proto__ || Object.getPrototypeOf(ColorPicker)).call(this, select));
+
+ _this.label.innerHTML = label;
+ _this.container.classList.add('ql-color-picker');
+ [].slice.call(_this.container.querySelectorAll('.ql-picker-item'), 0, 7).forEach(function (item) {
+ item.classList.add('ql-primary');
+ });
+ return _this;
+ }
+
+ _createClass(ColorPicker, [{
+ key: 'buildItem',
+ value: function buildItem(option) {
+ var item = _get(ColorPicker.prototype.__proto__ || Object.getPrototypeOf(ColorPicker.prototype), 'buildItem', this).call(this, option);
+ item.style.backgroundColor = option.getAttribute('value') || '';
+ return item;
+ }
+ }, {
+ key: 'selectItem',
+ value: function selectItem(item, trigger) {
+ _get(ColorPicker.prototype.__proto__ || Object.getPrototypeOf(ColorPicker.prototype), 'selectItem', this).call(this, item, trigger);
+ var colorLabel = this.label.querySelector('.ql-color-label');
+ var value = item ? item.getAttribute('data-value') || '' : '';
+ if (colorLabel) {
+ if (colorLabel.tagName === 'line') {
+ colorLabel.style.stroke = value;
+ } else {
+ colorLabel.style.fill = value;
+ }
+ }
+ }
+ }]);
+
+ return ColorPicker;
+}(_picker2.default);
+
+exports.default = ColorPicker;
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _picker = __webpack_require__(28);
+
+var _picker2 = _interopRequireDefault(_picker);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var IconPicker = function (_Picker) {
+ _inherits(IconPicker, _Picker);
+
+ function IconPicker(select, icons) {
+ _classCallCheck(this, IconPicker);
+
+ var _this = _possibleConstructorReturn(this, (IconPicker.__proto__ || Object.getPrototypeOf(IconPicker)).call(this, select));
+
+ _this.container.classList.add('ql-icon-picker');
+ [].forEach.call(_this.container.querySelectorAll('.ql-picker-item'), function (item) {
+ item.innerHTML = icons[item.getAttribute('data-value') || ''];
+ });
+ _this.defaultItem = _this.container.querySelector('.ql-selected');
+ _this.selectItem(_this.defaultItem);
+ return _this;
+ }
+
+ _createClass(IconPicker, [{
+ key: 'selectItem',
+ value: function selectItem(item, trigger) {
+ _get(IconPicker.prototype.__proto__ || Object.getPrototypeOf(IconPicker.prototype), 'selectItem', this).call(this, item, trigger);
+ item = item || this.defaultItem;
+ this.label.innerHTML = item.innerHTML;
+ }
+ }]);
+
+ return IconPicker;
+}(_picker2.default);
+
+exports.default = IconPicker;
+
+/***/ }),
+/* 61 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var Tooltip = function () {
+ function Tooltip(quill, boundsContainer) {
+ var _this = this;
+
+ _classCallCheck(this, Tooltip);
+
+ this.quill = quill;
+ this.boundsContainer = boundsContainer || document.body;
+ this.root = quill.addContainer('ql-tooltip');
+ this.root.innerHTML = this.constructor.TEMPLATE;
+ if (this.quill.root === this.quill.scrollingContainer) {
+ this.quill.root.addEventListener('scroll', function () {
+ _this.root.style.marginTop = -1 * _this.quill.root.scrollTop + 'px';
+ });
+ }
+ this.hide();
+ }
+
+ _createClass(Tooltip, [{
+ key: 'hide',
+ value: function hide() {
+ this.root.classList.add('ql-hidden');
+ }
+ }, {
+ key: 'position',
+ value: function position(reference) {
+ var left = reference.left + reference.width / 2 - this.root.offsetWidth / 2;
+ // root.scrollTop should be 0 if scrollContainer !== root
+ var top = reference.bottom + this.quill.root.scrollTop;
+ this.root.style.left = left + 'px';
+ this.root.style.top = top + 'px';
+ this.root.classList.remove('ql-flip');
+ var containerBounds = this.boundsContainer.getBoundingClientRect();
+ var rootBounds = this.root.getBoundingClientRect();
+ var shift = 0;
+ if (rootBounds.right > containerBounds.right) {
+ shift = containerBounds.right - rootBounds.right;
+ this.root.style.left = left + shift + 'px';
+ }
+ if (rootBounds.left < containerBounds.left) {
+ shift = containerBounds.left - rootBounds.left;
+ this.root.style.left = left + shift + 'px';
+ }
+ if (rootBounds.bottom > containerBounds.bottom) {
+ var height = rootBounds.bottom - rootBounds.top;
+ var verticalShift = reference.bottom - reference.top + height;
+ this.root.style.top = top - verticalShift + 'px';
+ this.root.classList.add('ql-flip');
+ }
+ return shift;
+ }
+ }, {
+ key: 'show',
+ value: function show() {
+ this.root.classList.remove('ql-editing');
+ this.root.classList.remove('ql-hidden');
+ }
+ }]);
+
+ return Tooltip;
+}();
+
+exports.default = Tooltip;
+
+/***/ }),
+/* 62 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _extend = __webpack_require__(3);
+
+var _extend2 = _interopRequireDefault(_extend);
+
+var _emitter = __webpack_require__(8);
+
+var _emitter2 = _interopRequireDefault(_emitter);
+
+var _base = __webpack_require__(43);
+
+var _base2 = _interopRequireDefault(_base);
+
+var _link = __webpack_require__(27);
+
+var _link2 = _interopRequireDefault(_link);
+
+var _selection = __webpack_require__(15);
+
+var _icons = __webpack_require__(41);
+
+var _icons2 = _interopRequireDefault(_icons);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var TOOLBAR_CONFIG = [[{ header: ['1', '2', '3', false] }], ['bold', 'italic', 'underline', 'link'], [{ list: 'ordered' }, { list: 'bullet' }], ['clean']];
+
+var SnowTheme = function (_BaseTheme) {
+ _inherits(SnowTheme, _BaseTheme);
+
+ function SnowTheme(quill, options) {
+ _classCallCheck(this, SnowTheme);
+
+ if (options.modules.toolbar != null && options.modules.toolbar.container == null) {
+ options.modules.toolbar.container = TOOLBAR_CONFIG;
+ }
+
+ var _this = _possibleConstructorReturn(this, (SnowTheme.__proto__ || Object.getPrototypeOf(SnowTheme)).call(this, quill, options));
+
+ _this.quill.container.classList.add('ql-snow');
+ return _this;
+ }
+
+ _createClass(SnowTheme, [{
+ key: 'extendToolbar',
+ value: function extendToolbar(toolbar) {
+ toolbar.container.classList.add('ql-snow');
+ this.buildButtons([].slice.call(toolbar.container.querySelectorAll('button')), _icons2.default);
+ this.buildPickers([].slice.call(toolbar.container.querySelectorAll('select')), _icons2.default);
+ this.tooltip = new SnowTooltip(this.quill, this.options.bounds);
+ if (toolbar.container.querySelector('.ql-link')) {
+ this.quill.keyboard.addBinding({ key: 'K', shortKey: true }, function (range, context) {
+ toolbar.handlers['link'].call(toolbar, !context.format.link);
+ });
+ }
+ }
+ }]);
+
+ return SnowTheme;
+}(_base2.default);
+
+SnowTheme.DEFAULTS = (0, _extend2.default)(true, {}, _base2.default.DEFAULTS, {
+ modules: {
+ toolbar: {
+ handlers: {
+ link: function link(value) {
+ if (value) {
+ var range = this.quill.getSelection();
+ if (range == null || range.length == 0) return;
+ var preview = this.quill.getText(range);
+ if (/^\S+@\S+\.\S+$/.test(preview) && preview.indexOf('mailto:') !== 0) {
+ preview = 'mailto:' + preview;
+ }
+ var tooltip = this.quill.theme.tooltip;
+ tooltip.edit('link', preview);
+ } else {
+ this.quill.format('link', false);
+ }
+ }
+ }
+ }
+ }
+});
+
+var SnowTooltip = function (_BaseTooltip) {
+ _inherits(SnowTooltip, _BaseTooltip);
+
+ function SnowTooltip(quill, bounds) {
+ _classCallCheck(this, SnowTooltip);
+
+ var _this2 = _possibleConstructorReturn(this, (SnowTooltip.__proto__ || Object.getPrototypeOf(SnowTooltip)).call(this, quill, bounds));
+
+ _this2.preview = _this2.root.querySelector('a.ql-preview');
+ return _this2;
+ }
+
+ _createClass(SnowTooltip, [{
+ key: 'listen',
+ value: function listen() {
+ var _this3 = this;
+
+ _get(SnowTooltip.prototype.__proto__ || Object.getPrototypeOf(SnowTooltip.prototype), 'listen', this).call(this);
+ this.root.querySelector('a.ql-action').addEventListener('click', function (event) {
+ if (_this3.root.classList.contains('ql-editing')) {
+ _this3.save();
+ } else {
+ _this3.edit('link', _this3.preview.textContent);
+ }
+ event.preventDefault();
+ });
+ this.root.querySelector('a.ql-remove').addEventListener('click', function (event) {
+ if (_this3.linkRange != null) {
+ var range = _this3.linkRange;
+ _this3.restoreFocus();
+ _this3.quill.formatText(range, 'link', false, _emitter2.default.sources.USER);
+ delete _this3.linkRange;
+ }
+ event.preventDefault();
+ _this3.hide();
+ });
+ this.quill.on(_emitter2.default.events.SELECTION_CHANGE, function (range, oldRange, source) {
+ if (range == null) return;
+ if (range.length === 0 && source === _emitter2.default.sources.USER) {
+ var _quill$scroll$descend = _this3.quill.scroll.descendant(_link2.default, range.index),
+ _quill$scroll$descend2 = _slicedToArray(_quill$scroll$descend, 2),
+ link = _quill$scroll$descend2[0],
+ offset = _quill$scroll$descend2[1];
+
+ if (link != null) {
+ _this3.linkRange = new _selection.Range(range.index - offset, link.length());
+ var preview = _link2.default.formats(link.domNode);
+ _this3.preview.textContent = preview;
+ _this3.preview.setAttribute('href', preview);
+ _this3.show();
+ _this3.position(_this3.quill.getBounds(_this3.linkRange));
+ return;
+ }
+ } else {
+ delete _this3.linkRange;
+ }
+ _this3.hide();
+ });
+ }
+ }, {
+ key: 'show',
+ value: function show() {
+ _get(SnowTooltip.prototype.__proto__ || Object.getPrototypeOf(SnowTooltip.prototype), 'show', this).call(this);
+ this.root.removeAttribute('data-mode');
+ }
+ }]);
+
+ return SnowTooltip;
+}(_base.BaseTooltip);
+
+SnowTooltip.TEMPLATE = ['', '', '', ''].join('');
+
+exports.default = SnowTheme;
+
+/***/ }),
+/* 63 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _core = __webpack_require__(29);
+
+var _core2 = _interopRequireDefault(_core);
+
+var _align = __webpack_require__(36);
+
+var _direction = __webpack_require__(38);
+
+var _indent = __webpack_require__(64);
+
+var _blockquote = __webpack_require__(65);
+
+var _blockquote2 = _interopRequireDefault(_blockquote);
+
+var _header = __webpack_require__(66);
+
+var _header2 = _interopRequireDefault(_header);
+
+var _list = __webpack_require__(67);
+
+var _list2 = _interopRequireDefault(_list);
+
+var _background = __webpack_require__(37);
+
+var _color = __webpack_require__(26);
+
+var _font = __webpack_require__(39);
+
+var _size = __webpack_require__(40);
+
+var _bold = __webpack_require__(56);
+
+var _bold2 = _interopRequireDefault(_bold);
+
+var _italic = __webpack_require__(68);
+
+var _italic2 = _interopRequireDefault(_italic);
+
+var _link = __webpack_require__(27);
+
+var _link2 = _interopRequireDefault(_link);
+
+var _script = __webpack_require__(69);
+
+var _script2 = _interopRequireDefault(_script);
+
+var _strike = __webpack_require__(70);
+
+var _strike2 = _interopRequireDefault(_strike);
+
+var _underline = __webpack_require__(71);
+
+var _underline2 = _interopRequireDefault(_underline);
+
+var _image = __webpack_require__(72);
+
+var _image2 = _interopRequireDefault(_image);
+
+var _video = __webpack_require__(73);
+
+var _video2 = _interopRequireDefault(_video);
+
+var _code = __webpack_require__(13);
+
+var _code2 = _interopRequireDefault(_code);
+
+var _formula = __webpack_require__(74);
+
+var _formula2 = _interopRequireDefault(_formula);
+
+var _syntax = __webpack_require__(75);
+
+var _syntax2 = _interopRequireDefault(_syntax);
+
+var _toolbar = __webpack_require__(57);
+
+var _toolbar2 = _interopRequireDefault(_toolbar);
+
+var _icons = __webpack_require__(41);
+
+var _icons2 = _interopRequireDefault(_icons);
+
+var _picker = __webpack_require__(28);
+
+var _picker2 = _interopRequireDefault(_picker);
+
+var _colorPicker = __webpack_require__(59);
+
+var _colorPicker2 = _interopRequireDefault(_colorPicker);
+
+var _iconPicker = __webpack_require__(60);
+
+var _iconPicker2 = _interopRequireDefault(_iconPicker);
+
+var _tooltip = __webpack_require__(61);
+
+var _tooltip2 = _interopRequireDefault(_tooltip);
+
+var _bubble = __webpack_require__(108);
+
+var _bubble2 = _interopRequireDefault(_bubble);
+
+var _snow = __webpack_require__(62);
+
+var _snow2 = _interopRequireDefault(_snow);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+_core2.default.register({
+ 'attributors/attribute/direction': _direction.DirectionAttribute,
+
+ 'attributors/class/align': _align.AlignClass,
+ 'attributors/class/background': _background.BackgroundClass,
+ 'attributors/class/color': _color.ColorClass,
+ 'attributors/class/direction': _direction.DirectionClass,
+ 'attributors/class/font': _font.FontClass,
+ 'attributors/class/size': _size.SizeClass,
+
+ 'attributors/style/align': _align.AlignStyle,
+ 'attributors/style/background': _background.BackgroundStyle,
+ 'attributors/style/color': _color.ColorStyle,
+ 'attributors/style/direction': _direction.DirectionStyle,
+ 'attributors/style/font': _font.FontStyle,
+ 'attributors/style/size': _size.SizeStyle
+}, true);
+
+_core2.default.register({
+ 'formats/align': _align.AlignClass,
+ 'formats/direction': _direction.DirectionClass,
+ 'formats/indent': _indent.IndentClass,
+
+ 'formats/background': _background.BackgroundStyle,
+ 'formats/color': _color.ColorStyle,
+ 'formats/font': _font.FontClass,
+ 'formats/size': _size.SizeClass,
+
+ 'formats/blockquote': _blockquote2.default,
+ 'formats/code-block': _code2.default,
+ 'formats/header': _header2.default,
+ 'formats/list': _list2.default,
+
+ 'formats/bold': _bold2.default,
+ 'formats/code': _code.Code,
+ 'formats/italic': _italic2.default,
+ 'formats/link': _link2.default,
+ 'formats/script': _script2.default,
+ 'formats/strike': _strike2.default,
+ 'formats/underline': _underline2.default,
+
+ 'formats/image': _image2.default,
+ 'formats/video': _video2.default,
+
+ 'formats/list/item': _list.ListItem,
+
+ 'modules/formula': _formula2.default,
+ 'modules/syntax': _syntax2.default,
+ 'modules/toolbar': _toolbar2.default,
+
+ 'themes/bubble': _bubble2.default,
+ 'themes/snow': _snow2.default,
+
+ 'ui/icons': _icons2.default,
+ 'ui/picker': _picker2.default,
+ 'ui/icon-picker': _iconPicker2.default,
+ 'ui/color-picker': _colorPicker2.default,
+ 'ui/tooltip': _tooltip2.default
+}, true);
+
+exports.default = _core2.default;
+
+/***/ }),
+/* 64 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.IndentClass = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var IdentAttributor = function (_Parchment$Attributor) {
+ _inherits(IdentAttributor, _Parchment$Attributor);
+
+ function IdentAttributor() {
+ _classCallCheck(this, IdentAttributor);
+
+ return _possibleConstructorReturn(this, (IdentAttributor.__proto__ || Object.getPrototypeOf(IdentAttributor)).apply(this, arguments));
+ }
+
+ _createClass(IdentAttributor, [{
+ key: 'add',
+ value: function add(node, value) {
+ if (value === '+1' || value === '-1') {
+ var indent = this.value(node) || 0;
+ value = value === '+1' ? indent + 1 : indent - 1;
+ }
+ if (value === 0) {
+ this.remove(node);
+ return true;
+ } else {
+ return _get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'add', this).call(this, node, value);
+ }
+ }
+ }, {
+ key: 'canAdd',
+ value: function canAdd(node, value) {
+ return _get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'canAdd', this).call(this, node, value) || _get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'canAdd', this).call(this, node, parseInt(value));
+ }
+ }, {
+ key: 'value',
+ value: function value(node) {
+ return parseInt(_get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'value', this).call(this, node)) || undefined; // Don't return NaN
+ }
+ }]);
+
+ return IdentAttributor;
+}(_parchment2.default.Attributor.Class);
+
+var IndentClass = new IdentAttributor('indent', 'ql-indent', {
+ scope: _parchment2.default.Scope.BLOCK,
+ whitelist: [1, 2, 3, 4, 5, 6, 7, 8]
+});
+
+exports.IndentClass = IndentClass;
+
+/***/ }),
+/* 65 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _block = __webpack_require__(4);
+
+var _block2 = _interopRequireDefault(_block);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var Blockquote = function (_Block) {
+ _inherits(Blockquote, _Block);
+
+ function Blockquote() {
+ _classCallCheck(this, Blockquote);
+
+ return _possibleConstructorReturn(this, (Blockquote.__proto__ || Object.getPrototypeOf(Blockquote)).apply(this, arguments));
+ }
+
+ return Blockquote;
+}(_block2.default);
+
+Blockquote.blotName = 'blockquote';
+Blockquote.tagName = 'blockquote';
+
+exports.default = Blockquote;
+
+/***/ }),
+/* 66 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _block = __webpack_require__(4);
+
+var _block2 = _interopRequireDefault(_block);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var Header = function (_Block) {
+ _inherits(Header, _Block);
+
+ function Header() {
+ _classCallCheck(this, Header);
+
+ return _possibleConstructorReturn(this, (Header.__proto__ || Object.getPrototypeOf(Header)).apply(this, arguments));
+ }
+
+ _createClass(Header, null, [{
+ key: 'formats',
+ value: function formats(domNode) {
+ return this.tagName.indexOf(domNode.tagName) + 1;
+ }
+ }]);
+
+ return Header;
+}(_block2.default);
+
+Header.blotName = 'header';
+Header.tagName = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'];
+
+exports.default = Header;
+
+/***/ }),
+/* 67 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = exports.ListItem = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _block = __webpack_require__(4);
+
+var _block2 = _interopRequireDefault(_block);
+
+var _container = __webpack_require__(25);
+
+var _container2 = _interopRequireDefault(_container);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var ListItem = function (_Block) {
+ _inherits(ListItem, _Block);
+
+ function ListItem() {
+ _classCallCheck(this, ListItem);
+
+ return _possibleConstructorReturn(this, (ListItem.__proto__ || Object.getPrototypeOf(ListItem)).apply(this, arguments));
+ }
+
+ _createClass(ListItem, [{
+ key: 'format',
+ value: function format(name, value) {
+ if (name === List.blotName && !value) {
+ this.replaceWith(_parchment2.default.create(this.statics.scope));
+ } else {
+ _get(ListItem.prototype.__proto__ || Object.getPrototypeOf(ListItem.prototype), 'format', this).call(this, name, value);
+ }
+ }
+ }, {
+ key: 'remove',
+ value: function remove() {
+ if (this.prev == null && this.next == null) {
+ this.parent.remove();
+ } else {
+ _get(ListItem.prototype.__proto__ || Object.getPrototypeOf(ListItem.prototype), 'remove', this).call(this);
+ }
+ }
+ }, {
+ key: 'replaceWith',
+ value: function replaceWith(name, value) {
+ this.parent.isolate(this.offset(this.parent), this.length());
+ if (name === this.parent.statics.blotName) {
+ this.parent.replaceWith(name, value);
+ return this;
+ } else {
+ this.parent.unwrap();
+ return _get(ListItem.prototype.__proto__ || Object.getPrototypeOf(ListItem.prototype), 'replaceWith', this).call(this, name, value);
+ }
+ }
+ }], [{
+ key: 'formats',
+ value: function formats(domNode) {
+ return domNode.tagName === this.tagName ? undefined : _get(ListItem.__proto__ || Object.getPrototypeOf(ListItem), 'formats', this).call(this, domNode);
+ }
+ }]);
+
+ return ListItem;
+}(_block2.default);
+
+ListItem.blotName = 'list-item';
+ListItem.tagName = 'LI';
+
+var List = function (_Container) {
+ _inherits(List, _Container);
+
+ _createClass(List, null, [{
+ key: 'create',
+ value: function create(value) {
+ var tagName = value === 'ordered' ? 'OL' : 'UL';
+ var node = _get(List.__proto__ || Object.getPrototypeOf(List), 'create', this).call(this, tagName);
+ if (value === 'checked' || value === 'unchecked') {
+ node.setAttribute('data-checked', value === 'checked');
+ }
+ return node;
+ }
+ }, {
+ key: 'formats',
+ value: function formats(domNode) {
+ if (domNode.tagName === 'OL') return 'ordered';
+ if (domNode.tagName === 'UL') {
+ if (domNode.hasAttribute('data-checked')) {
+ return domNode.getAttribute('data-checked') === 'true' ? 'checked' : 'unchecked';
+ } else {
+ return 'bullet';
+ }
+ }
+ return undefined;
+ }
+ }]);
+
+ function List(domNode) {
+ _classCallCheck(this, List);
+
+ var _this2 = _possibleConstructorReturn(this, (List.__proto__ || Object.getPrototypeOf(List)).call(this, domNode));
+
+ var listEventHandler = function listEventHandler(e) {
+ if (e.target.parentNode !== domNode) return;
+ var format = _this2.statics.formats(domNode);
+ var blot = _parchment2.default.find(e.target);
+ if (format === 'checked') {
+ blot.format('list', 'unchecked');
+ } else if (format === 'unchecked') {
+ blot.format('list', 'checked');
+ }
+ };
+
+ domNode.addEventListener('touchstart', listEventHandler);
+ domNode.addEventListener('mousedown', listEventHandler);
+ return _this2;
+ }
+
+ _createClass(List, [{
+ key: 'format',
+ value: function format(name, value) {
+ if (this.children.length > 0) {
+ this.children.tail.format(name, value);
+ }
+ }
+ }, {
+ key: 'formats',
+ value: function formats() {
+ // We don't inherit from FormatBlot
+ return _defineProperty({}, this.statics.blotName, this.statics.formats(this.domNode));
+ }
+ }, {
+ key: 'insertBefore',
+ value: function insertBefore(blot, ref) {
+ if (blot instanceof ListItem) {
+ _get(List.prototype.__proto__ || Object.getPrototypeOf(List.prototype), 'insertBefore', this).call(this, blot, ref);
+ } else {
+ var index = ref == null ? this.length() : ref.offset(this);
+ var after = this.split(index);
+ after.parent.insertBefore(blot, after);
+ }
+ }
+ }, {
+ key: 'optimize',
+ value: function optimize(context) {
+ _get(List.prototype.__proto__ || Object.getPrototypeOf(List.prototype), 'optimize', this).call(this, context);
+ var next = this.next;
+ if (next != null && next.prev === this && next.statics.blotName === this.statics.blotName && next.domNode.tagName === this.domNode.tagName && next.domNode.getAttribute('data-checked') === this.domNode.getAttribute('data-checked')) {
+ next.moveChildren(this);
+ next.remove();
+ }
+ }
+ }, {
+ key: 'replace',
+ value: function replace(target) {
+ if (target.statics.blotName !== this.statics.blotName) {
+ var item = _parchment2.default.create(this.statics.defaultChild);
+ target.moveChildren(item);
+ this.appendChild(item);
+ }
+ _get(List.prototype.__proto__ || Object.getPrototypeOf(List.prototype), 'replace', this).call(this, target);
+ }
+ }]);
+
+ return List;
+}(_container2.default);
+
+List.blotName = 'list';
+List.scope = _parchment2.default.Scope.BLOCK_BLOT;
+List.tagName = ['OL', 'UL'];
+List.defaultChild = 'list-item';
+List.allowedChildren = [ListItem];
+
+exports.ListItem = ListItem;
+exports.default = List;
+
+/***/ }),
+/* 68 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _bold = __webpack_require__(56);
+
+var _bold2 = _interopRequireDefault(_bold);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var Italic = function (_Bold) {
+ _inherits(Italic, _Bold);
+
+ function Italic() {
+ _classCallCheck(this, Italic);
+
+ return _possibleConstructorReturn(this, (Italic.__proto__ || Object.getPrototypeOf(Italic)).apply(this, arguments));
+ }
+
+ return Italic;
+}(_bold2.default);
+
+Italic.blotName = 'italic';
+Italic.tagName = ['EM', 'I'];
+
+exports.default = Italic;
+
+/***/ }),
+/* 69 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _inline = __webpack_require__(6);
+
+var _inline2 = _interopRequireDefault(_inline);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var Script = function (_Inline) {
+ _inherits(Script, _Inline);
+
+ function Script() {
+ _classCallCheck(this, Script);
+
+ return _possibleConstructorReturn(this, (Script.__proto__ || Object.getPrototypeOf(Script)).apply(this, arguments));
+ }
+
+ _createClass(Script, null, [{
+ key: 'create',
+ value: function create(value) {
+ if (value === 'super') {
+ return document.createElement('sup');
+ } else if (value === 'sub') {
+ return document.createElement('sub');
+ } else {
+ return _get(Script.__proto__ || Object.getPrototypeOf(Script), 'create', this).call(this, value);
+ }
+ }
+ }, {
+ key: 'formats',
+ value: function formats(domNode) {
+ if (domNode.tagName === 'SUB') return 'sub';
+ if (domNode.tagName === 'SUP') return 'super';
+ return undefined;
+ }
+ }]);
+
+ return Script;
+}(_inline2.default);
+
+Script.blotName = 'script';
+Script.tagName = ['SUB', 'SUP'];
+
+exports.default = Script;
+
+/***/ }),
+/* 70 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _inline = __webpack_require__(6);
+
+var _inline2 = _interopRequireDefault(_inline);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var Strike = function (_Inline) {
+ _inherits(Strike, _Inline);
+
+ function Strike() {
+ _classCallCheck(this, Strike);
+
+ return _possibleConstructorReturn(this, (Strike.__proto__ || Object.getPrototypeOf(Strike)).apply(this, arguments));
+ }
+
+ return Strike;
+}(_inline2.default);
+
+Strike.blotName = 'strike';
+Strike.tagName = 'S';
+
+exports.default = Strike;
+
+/***/ }),
+/* 71 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _inline = __webpack_require__(6);
+
+var _inline2 = _interopRequireDefault(_inline);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var Underline = function (_Inline) {
+ _inherits(Underline, _Inline);
+
+ function Underline() {
+ _classCallCheck(this, Underline);
+
+ return _possibleConstructorReturn(this, (Underline.__proto__ || Object.getPrototypeOf(Underline)).apply(this, arguments));
+ }
+
+ return Underline;
+}(_inline2.default);
+
+Underline.blotName = 'underline';
+Underline.tagName = 'U';
+
+exports.default = Underline;
+
+/***/ }),
+/* 72 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _link = __webpack_require__(27);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var ATTRIBUTES = ['alt', 'height', 'width'];
+
+var Image = function (_Parchment$Embed) {
+ _inherits(Image, _Parchment$Embed);
+
+ function Image() {
+ _classCallCheck(this, Image);
+
+ return _possibleConstructorReturn(this, (Image.__proto__ || Object.getPrototypeOf(Image)).apply(this, arguments));
+ }
+
+ _createClass(Image, [{
+ key: 'format',
+ value: function format(name, value) {
+ if (ATTRIBUTES.indexOf(name) > -1) {
+ if (value) {
+ this.domNode.setAttribute(name, value);
+ } else {
+ this.domNode.removeAttribute(name);
+ }
+ } else {
+ _get(Image.prototype.__proto__ || Object.getPrototypeOf(Image.prototype), 'format', this).call(this, name, value);
+ }
+ }
+ }], [{
+ key: 'create',
+ value: function create(value) {
+ var node = _get(Image.__proto__ || Object.getPrototypeOf(Image), 'create', this).call(this, value);
+ if (typeof value === 'string') {
+ node.setAttribute('src', this.sanitize(value));
+ }
+ return node;
+ }
+ }, {
+ key: 'formats',
+ value: function formats(domNode) {
+ return ATTRIBUTES.reduce(function (formats, attribute) {
+ if (domNode.hasAttribute(attribute)) {
+ formats[attribute] = domNode.getAttribute(attribute);
+ }
+ return formats;
+ }, {});
+ }
+ }, {
+ key: 'match',
+ value: function match(url) {
+ return (/\.(jpe?g|gif|png)$/.test(url) || /^data:image\/.+;base64/.test(url)
+ );
+ }
+ }, {
+ key: 'sanitize',
+ value: function sanitize(url) {
+ return (0, _link.sanitize)(url, ['http', 'https', 'data']) ? url : '//:0';
+ }
+ }, {
+ key: 'value',
+ value: function value(domNode) {
+ return domNode.getAttribute('src');
+ }
+ }]);
+
+ return Image;
+}(_parchment2.default.Embed);
+
+Image.blotName = 'image';
+Image.tagName = 'IMG';
+
+exports.default = Image;
+
+/***/ }),
+/* 73 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _block = __webpack_require__(4);
+
+var _link = __webpack_require__(27);
+
+var _link2 = _interopRequireDefault(_link);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var ATTRIBUTES = ['height', 'width'];
+
+var Video = function (_BlockEmbed) {
+ _inherits(Video, _BlockEmbed);
+
+ function Video() {
+ _classCallCheck(this, Video);
+
+ return _possibleConstructorReturn(this, (Video.__proto__ || Object.getPrototypeOf(Video)).apply(this, arguments));
+ }
+
+ _createClass(Video, [{
+ key: 'format',
+ value: function format(name, value) {
+ if (ATTRIBUTES.indexOf(name) > -1) {
+ if (value) {
+ this.domNode.setAttribute(name, value);
+ } else {
+ this.domNode.removeAttribute(name);
+ }
+ } else {
+ _get(Video.prototype.__proto__ || Object.getPrototypeOf(Video.prototype), 'format', this).call(this, name, value);
+ }
+ }
+ }], [{
+ key: 'create',
+ value: function create(value) {
+ var node = _get(Video.__proto__ || Object.getPrototypeOf(Video), 'create', this).call(this, value);
+ node.setAttribute('frameborder', '0');
+ node.setAttribute('allowfullscreen', true);
+ node.setAttribute('src', this.sanitize(value));
+ return node;
+ }
+ }, {
+ key: 'formats',
+ value: function formats(domNode) {
+ return ATTRIBUTES.reduce(function (formats, attribute) {
+ if (domNode.hasAttribute(attribute)) {
+ formats[attribute] = domNode.getAttribute(attribute);
+ }
+ return formats;
+ }, {});
+ }
+ }, {
+ key: 'sanitize',
+ value: function sanitize(url) {
+ return _link2.default.sanitize(url);
+ }
+ }, {
+ key: 'value',
+ value: function value(domNode) {
+ return domNode.getAttribute('src');
+ }
+ }]);
+
+ return Video;
+}(_block.BlockEmbed);
+
+Video.blotName = 'video';
+Video.className = 'ql-video';
+Video.tagName = 'IFRAME';
+
+exports.default = Video;
+
+/***/ }),
+/* 74 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = exports.FormulaBlot = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _embed = __webpack_require__(35);
+
+var _embed2 = _interopRequireDefault(_embed);
+
+var _quill = __webpack_require__(5);
+
+var _quill2 = _interopRequireDefault(_quill);
+
+var _module = __webpack_require__(9);
+
+var _module2 = _interopRequireDefault(_module);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var FormulaBlot = function (_Embed) {
+ _inherits(FormulaBlot, _Embed);
+
+ function FormulaBlot() {
+ _classCallCheck(this, FormulaBlot);
+
+ return _possibleConstructorReturn(this, (FormulaBlot.__proto__ || Object.getPrototypeOf(FormulaBlot)).apply(this, arguments));
+ }
+
+ _createClass(FormulaBlot, null, [{
+ key: 'create',
+ value: function create(value) {
+ var node = _get(FormulaBlot.__proto__ || Object.getPrototypeOf(FormulaBlot), 'create', this).call(this, value);
+ if (typeof value === 'string') {
+ window.katex.render(value, node, {
+ throwOnError: false,
+ errorColor: '#f00'
+ });
+ node.setAttribute('data-value', value);
+ }
+ return node;
+ }
+ }, {
+ key: 'value',
+ value: function value(domNode) {
+ return domNode.getAttribute('data-value');
+ }
+ }]);
+
+ return FormulaBlot;
+}(_embed2.default);
+
+FormulaBlot.blotName = 'formula';
+FormulaBlot.className = 'ql-formula';
+FormulaBlot.tagName = 'SPAN';
+
+var Formula = function (_Module) {
+ _inherits(Formula, _Module);
+
+ _createClass(Formula, null, [{
+ key: 'register',
+ value: function register() {
+ _quill2.default.register(FormulaBlot, true);
+ }
+ }]);
+
+ function Formula() {
+ _classCallCheck(this, Formula);
+
+ var _this2 = _possibleConstructorReturn(this, (Formula.__proto__ || Object.getPrototypeOf(Formula)).call(this));
+
+ if (window.katex == null) {
+ throw new Error('Formula module requires KaTeX.');
+ }
+ return _this2;
+ }
+
+ return Formula;
+}(_module2.default);
+
+exports.FormulaBlot = FormulaBlot;
+exports.default = Formula;
+
+/***/ }),
+/* 75 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = exports.CodeToken = exports.CodeBlock = undefined;
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _parchment = __webpack_require__(0);
+
+var _parchment2 = _interopRequireDefault(_parchment);
+
+var _quill = __webpack_require__(5);
+
+var _quill2 = _interopRequireDefault(_quill);
+
+var _module = __webpack_require__(9);
+
+var _module2 = _interopRequireDefault(_module);
+
+var _code = __webpack_require__(13);
+
+var _code2 = _interopRequireDefault(_code);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var SyntaxCodeBlock = function (_CodeBlock) {
+ _inherits(SyntaxCodeBlock, _CodeBlock);
+
+ function SyntaxCodeBlock() {
+ _classCallCheck(this, SyntaxCodeBlock);
+
+ return _possibleConstructorReturn(this, (SyntaxCodeBlock.__proto__ || Object.getPrototypeOf(SyntaxCodeBlock)).apply(this, arguments));
+ }
+
+ _createClass(SyntaxCodeBlock, [{
+ key: 'replaceWith',
+ value: function replaceWith(block) {
+ this.domNode.textContent = this.domNode.textContent;
+ this.attach();
+ _get(SyntaxCodeBlock.prototype.__proto__ || Object.getPrototypeOf(SyntaxCodeBlock.prototype), 'replaceWith', this).call(this, block);
+ }
+ }, {
+ key: 'highlight',
+ value: function highlight(_highlight) {
+ var text = this.domNode.textContent;
+ if (this.cachedText !== text) {
+ if (text.trim().length > 0 || this.cachedText == null) {
+ this.domNode.innerHTML = _highlight(text);
+ this.domNode.normalize();
+ this.attach();
+ }
+ this.cachedText = text;
+ }
+ }
+ }]);
+
+ return SyntaxCodeBlock;
+}(_code2.default);
+
+SyntaxCodeBlock.className = 'ql-syntax';
+
+var CodeToken = new _parchment2.default.Attributor.Class('token', 'hljs', {
+ scope: _parchment2.default.Scope.INLINE
+});
+
+var Syntax = function (_Module) {
+ _inherits(Syntax, _Module);
+
+ _createClass(Syntax, null, [{
+ key: 'register',
+ value: function register() {
+ _quill2.default.register(CodeToken, true);
+ _quill2.default.register(SyntaxCodeBlock, true);
+ }
+ }]);
+
+ function Syntax(quill, options) {
+ _classCallCheck(this, Syntax);
+
+ var _this2 = _possibleConstructorReturn(this, (Syntax.__proto__ || Object.getPrototypeOf(Syntax)).call(this, quill, options));
+
+ if (typeof _this2.options.highlight !== 'function') {
+ throw new Error('Syntax module requires highlight.js. Please include the library on the page before Quill.');
+ }
+ var timer = null;
+ _this2.quill.on(_quill2.default.events.SCROLL_OPTIMIZE, function () {
+ clearTimeout(timer);
+ timer = setTimeout(function () {
+ _this2.highlight();
+ timer = null;
+ }, _this2.options.interval);
+ });
+ _this2.highlight();
+ return _this2;
+ }
+
+ _createClass(Syntax, [{
+ key: 'highlight',
+ value: function highlight() {
+ var _this3 = this;
+
+ if (this.quill.selection.composing) return;
+ this.quill.update(_quill2.default.sources.USER);
+ var range = this.quill.getSelection();
+ this.quill.scroll.descendants(SyntaxCodeBlock).forEach(function (code) {
+ code.highlight(_this3.options.highlight);
+ });
+ this.quill.update(_quill2.default.sources.SILENT);
+ if (range != null) {
+ this.quill.setSelection(range, _quill2.default.sources.SILENT);
+ }
+ }
+ }]);
+
+ return Syntax;
+}(_module2.default);
+
+Syntax.DEFAULTS = {
+ highlight: function () {
+ if (window.hljs == null) return null;
+ return function (text) {
+ var result = window.hljs.highlightAuto(text);
+ return result.value;
+ };
+ }(),
+ interval: 1000
+};
+
+exports.CodeBlock = SyntaxCodeBlock;
+exports.CodeToken = CodeToken;
+exports.default = Syntax;
+
+/***/ }),
+/* 76 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 77 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 78 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 79 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 80 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 81 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 82 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 83 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 84 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 85 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 86 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 87 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 88 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 89 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 90 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 91 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 92 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 93 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 94 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 95 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 96 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 97 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 98 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 99 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 100 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 101 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 102 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 103 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 104 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 105 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 106 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 107 */
+/***/ (function(module, exports) {
+
+module.exports = "";
+
+/***/ }),
+/* 108 */
+/***/ (function(module, exports, __webpack_require__) {
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = exports.BubbleTooltip = undefined;
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _extend = __webpack_require__(3);
+
+var _extend2 = _interopRequireDefault(_extend);
+
+var _emitter = __webpack_require__(8);
+
+var _emitter2 = _interopRequireDefault(_emitter);
+
+var _base = __webpack_require__(43);
+
+var _base2 = _interopRequireDefault(_base);
+
+var _selection = __webpack_require__(15);
+
+var _icons = __webpack_require__(41);
+
+var _icons2 = _interopRequireDefault(_icons);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+var TOOLBAR_CONFIG = [['bold', 'italic', 'link'], [{ header: 1 }, { header: 2 }, 'blockquote']];
+
+var BubbleTheme = function (_BaseTheme) {
+ _inherits(BubbleTheme, _BaseTheme);
+
+ function BubbleTheme(quill, options) {
+ _classCallCheck(this, BubbleTheme);
+
+ if (options.modules.toolbar != null && options.modules.toolbar.container == null) {
+ options.modules.toolbar.container = TOOLBAR_CONFIG;
+ }
+
+ var _this = _possibleConstructorReturn(this, (BubbleTheme.__proto__ || Object.getPrototypeOf(BubbleTheme)).call(this, quill, options));
+
+ _this.quill.container.classList.add('ql-bubble');
+ return _this;
+ }
+
+ _createClass(BubbleTheme, [{
+ key: 'extendToolbar',
+ value: function extendToolbar(toolbar) {
+ this.tooltip = new BubbleTooltip(this.quill, this.options.bounds);
+ this.tooltip.root.appendChild(toolbar.container);
+ this.buildButtons([].slice.call(toolbar.container.querySelectorAll('button')), _icons2.default);
+ this.buildPickers([].slice.call(toolbar.container.querySelectorAll('select')), _icons2.default);
+ }
+ }]);
+
+ return BubbleTheme;
+}(_base2.default);
+
+BubbleTheme.DEFAULTS = (0, _extend2.default)(true, {}, _base2.default.DEFAULTS, {
+ modules: {
+ toolbar: {
+ handlers: {
+ link: function link(value) {
+ if (!value) {
+ this.quill.format('link', false);
+ } else {
+ this.quill.theme.tooltip.edit();
+ }
+ }
+ }
+ }
+ }
+});
+
+var BubbleTooltip = function (_BaseTooltip) {
+ _inherits(BubbleTooltip, _BaseTooltip);
+
+ function BubbleTooltip(quill, bounds) {
+ _classCallCheck(this, BubbleTooltip);
+
+ var _this2 = _possibleConstructorReturn(this, (BubbleTooltip.__proto__ || Object.getPrototypeOf(BubbleTooltip)).call(this, quill, bounds));
+
+ _this2.quill.on(_emitter2.default.events.EDITOR_CHANGE, function (type, range, oldRange, source) {
+ if (type !== _emitter2.default.events.SELECTION_CHANGE) return;
+ if (range != null && range.length > 0 && source === _emitter2.default.sources.USER) {
+ _this2.show();
+ // Lock our width so we will expand beyond our offsetParent boundaries
+ _this2.root.style.left = '0px';
+ _this2.root.style.width = '';
+ _this2.root.style.width = _this2.root.offsetWidth + 'px';
+ var lines = _this2.quill.getLines(range.index, range.length);
+ if (lines.length === 1) {
+ _this2.position(_this2.quill.getBounds(range));
+ } else {
+ var lastLine = lines[lines.length - 1];
+ var index = _this2.quill.getIndex(lastLine);
+ var length = Math.min(lastLine.length() - 1, range.index + range.length - index);
+ var _bounds = _this2.quill.getBounds(new _selection.Range(index, length));
+ _this2.position(_bounds);
+ }
+ } else if (document.activeElement !== _this2.textbox && _this2.quill.hasFocus()) {
+ _this2.hide();
+ }
+ });
+ return _this2;
+ }
+
+ _createClass(BubbleTooltip, [{
+ key: 'listen',
+ value: function listen() {
+ var _this3 = this;
+
+ _get(BubbleTooltip.prototype.__proto__ || Object.getPrototypeOf(BubbleTooltip.prototype), 'listen', this).call(this);
+ this.root.querySelector('.ql-close').addEventListener('click', function () {
+ _this3.root.classList.remove('ql-editing');
+ });
+ this.quill.on(_emitter2.default.events.SCROLL_OPTIMIZE, function () {
+ // Let selection be restored by toolbar handlers before repositioning
+ setTimeout(function () {
+ if (_this3.root.classList.contains('ql-hidden')) return;
+ var range = _this3.quill.getSelection();
+ if (range != null) {
+ _this3.position(_this3.quill.getBounds(range));
+ }
+ }, 1);
+ });
+ }
+ }, {
+ key: 'cancel',
+ value: function cancel() {
+ this.show();
+ }
+ }, {
+ key: 'position',
+ value: function position(reference) {
+ var shift = _get(BubbleTooltip.prototype.__proto__ || Object.getPrototypeOf(BubbleTooltip.prototype), 'position', this).call(this, reference);
+ var arrow = this.root.querySelector('.ql-tooltip-arrow');
+ arrow.style.marginLeft = '';
+ if (shift === 0) return shift;
+ arrow.style.marginLeft = -1 * shift - arrow.offsetWidth / 2 + 'px';
+ }
+ }]);
+
+ return BubbleTooltip;
+}(_base.BaseTooltip);
+
+BubbleTooltip.TEMPLATE = ['', '
', '', '', '
'].join('');
+
+exports.BubbleTooltip = BubbleTooltip;
+exports.default = BubbleTheme;
+
+/***/ }),
+/* 109 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(63);
+
+
+/***/ })
+/******/ ])["default"];
+});
+});
+
+var Quill = /*@__PURE__*/getDefaultExportFromCjs(quill);
+
+var randomColor = createCommonjsModule(function (module, exports) {
+(function(root, factory) {
+
+ // Support CommonJS
+ {
+ var randomColor = factory();
+
+ // Support NodeJS & Component, which allow module.exports to be a function
+ if (module && module.exports) {
+ exports = module.exports = randomColor;
+ }
+
+ // Support CommonJS 1.1.1 spec
+ exports.randomColor = randomColor;
+
+ // Support AMD
+ }
+
+}(commonjsGlobal, function() {
+
+ // Seed to get repeatable colors
+ var seed = null;
+
+ // Shared color dictionary
+ var colorDictionary = {};
+
+ // Populate the color dictionary
+ loadColorBounds();
+
+ // check if a range is taken
+ var colorRanges = [];
+
+ var randomColor = function (options) {
+
+ options = options || {};
+
+ // Check if there is a seed and ensure it's an
+ // integer. Otherwise, reset the seed value.
+ if (options.seed !== undefined && options.seed !== null && options.seed === parseInt(options.seed, 10)) {
+ seed = options.seed;
+
+ // A string was passed as a seed
+ } else if (typeof options.seed === 'string') {
+ seed = stringToInteger(options.seed);
+
+ // Something was passed as a seed but it wasn't an integer or string
+ } else if (options.seed !== undefined && options.seed !== null) {
+ throw new TypeError('The seed value must be an integer or string');
+
+ // No seed, reset the value outside.
+ } else {
+ seed = null;
+ }
+
+ var H,S,B;
+
+ // Check if we need to generate multiple colors
+ if (options.count !== null && options.count !== undefined) {
+
+ var totalColors = options.count,
+ colors = [];
+ // Value false at index i means the range i is not taken yet.
+ for (var i = 0; i < options.count; i++) {
+ colorRanges.push(false);
+ }
+ options.count = null;
+
+ while (totalColors > colors.length) {
+
+ var color = randomColor(options);
+
+ if (seed !== null) {
+ options.seed = seed;
+ }
+
+ colors.push(color);
+ }
+
+ options.count = totalColors;
+
+ return colors;
+ }
+
+ // First we pick a hue (H)
+ H = pickHue(options);
+
+ // Then use H to determine saturation (S)
+ S = pickSaturation(H, options);
+
+ // Then use S and H to determine brightness (B).
+ B = pickBrightness(H, S, options);
+
+ // Then we return the HSB color in the desired format
+ return setFormat([H,S,B], options);
+ };
+
+ function pickHue(options) {
+ if (colorRanges.length > 0) {
+ var hueRange = getRealHueRange(options.hue);
+
+ var hue = randomWithin(hueRange);
+
+ //Each of colorRanges.length ranges has a length equal approximatelly one step
+ var step = (hueRange[1] - hueRange[0]) / colorRanges.length;
+
+ var j = parseInt((hue - hueRange[0]) / step);
+
+ //Check if the range j is taken
+ if (colorRanges[j] === true) {
+ j = (j + 2) % colorRanges.length;
+ }
+ else {
+ colorRanges[j] = true;
+ }
+
+ var min = (hueRange[0] + j * step) % 359,
+ max = (hueRange[0] + (j + 1) * step) % 359;
+
+ hueRange = [min, max];
+
+ hue = randomWithin(hueRange);
+
+ if (hue < 0) {hue = 360 + hue;}
+ return hue
+ }
+ else {
+ var hueRange = getHueRange(options.hue);
+
+ hue = randomWithin(hueRange);
+ // Instead of storing red as two seperate ranges,
+ // we group them, using negative numbers
+ if (hue < 0) {
+ hue = 360 + hue;
+ }
+
+ return hue;
+ }
+ }
+
+ function pickSaturation (hue, options) {
+
+ if (options.hue === 'monochrome') {
+ return 0;
+ }
+
+ if (options.luminosity === 'random') {
+ return randomWithin([0,100]);
+ }
+
+ var saturationRange = getSaturationRange(hue);
+
+ var sMin = saturationRange[0],
+ sMax = saturationRange[1];
+
+ switch (options.luminosity) {
+
+ case 'bright':
+ sMin = 55;
+ break;
+
+ case 'dark':
+ sMin = sMax - 10;
+ break;
+
+ case 'light':
+ sMax = 55;
+ break;
+ }
+
+ return randomWithin([sMin, sMax]);
+
+ }
+
+ function pickBrightness (H, S, options) {
+
+ var bMin = getMinimumBrightness(H, S),
+ bMax = 100;
+
+ switch (options.luminosity) {
+
+ case 'dark':
+ bMax = bMin + 20;
+ break;
+
+ case 'light':
+ bMin = (bMax + bMin)/2;
+ break;
+
+ case 'random':
+ bMin = 0;
+ bMax = 100;
+ break;
+ }
+
+ return randomWithin([bMin, bMax]);
+ }
+
+ function setFormat (hsv, options) {
+
+ switch (options.format) {
+
+ case 'hsvArray':
+ return hsv;
+
+ case 'hslArray':
+ return HSVtoHSL(hsv);
+
+ case 'hsl':
+ var hsl = HSVtoHSL(hsv);
+ return 'hsl('+hsl[0]+', '+hsl[1]+'%, '+hsl[2]+'%)';
+
+ case 'hsla':
+ var hslColor = HSVtoHSL(hsv);
+ var alpha = options.alpha || Math.random();
+ return 'hsla('+hslColor[0]+', '+hslColor[1]+'%, '+hslColor[2]+'%, ' + alpha + ')';
+
+ case 'rgbArray':
+ return HSVtoRGB(hsv);
+
+ case 'rgb':
+ var rgb = HSVtoRGB(hsv);
+ return 'rgb(' + rgb.join(', ') + ')';
+
+ case 'rgba':
+ var rgbColor = HSVtoRGB(hsv);
+ var alpha = options.alpha || Math.random();
+ return 'rgba(' + rgbColor.join(', ') + ', ' + alpha + ')';
+
+ default:
+ return HSVtoHex(hsv);
+ }
+
+ }
+
+ function getMinimumBrightness(H, S) {
+
+ var lowerBounds = getColorInfo(H).lowerBounds;
+
+ for (var i = 0; i < lowerBounds.length - 1; i++) {
+
+ var s1 = lowerBounds[i][0],
+ v1 = lowerBounds[i][1];
+
+ var s2 = lowerBounds[i+1][0],
+ v2 = lowerBounds[i+1][1];
+
+ if (S >= s1 && S <= s2) {
+
+ var m = (v2 - v1)/(s2 - s1),
+ b = v1 - m*s1;
+
+ return m*S + b;
+ }
+
+ }
+
+ return 0;
+ }
+
+ function getHueRange (colorInput) {
+
+ if (typeof parseInt(colorInput) === 'number') {
+
+ var number = parseInt(colorInput);
+
+ if (number < 360 && number > 0) {
+ return [number, number];
+ }
+
+ }
+
+ if (typeof colorInput === 'string') {
+
+ if (colorDictionary[colorInput]) {
+ var color = colorDictionary[colorInput];
+ if (color.hueRange) {return color.hueRange;}
+ } else if (colorInput.match(/^#?([0-9A-F]{3}|[0-9A-F]{6})$/i)) {
+ var hue = HexToHSB(colorInput)[0];
+ return [ hue, hue ];
+ }
+ }
+
+ return [0,360];
+
+ }
+
+ function getSaturationRange (hue) {
+ return getColorInfo(hue).saturationRange;
+ }
+
+ function getColorInfo (hue) {
+
+ // Maps red colors to make picking hue easier
+ if (hue >= 334 && hue <= 360) {
+ hue-= 360;
+ }
+
+ for (var colorName in colorDictionary) {
+ var color = colorDictionary[colorName];
+ if (color.hueRange &&
+ hue >= color.hueRange[0] &&
+ hue <= color.hueRange[1]) {
+ return colorDictionary[colorName];
+ }
+ } return 'Color not found';
+ }
+
+ function randomWithin (range) {
+ if (seed === null) {
+ //generate random evenly destinct number from : https://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
+ var golden_ratio = 0.618033988749895;
+ var r=Math.random();
+ r += golden_ratio;
+ r %= 1;
+ return Math.floor(range[0] + r*(range[1] + 1 - range[0]));
+ } else {
+ //Seeded random algorithm from http://indiegamr.com/generate-repeatable-random-numbers-in-js/
+ var max = range[1] || 1;
+ var min = range[0] || 0;
+ seed = (seed * 9301 + 49297) % 233280;
+ var rnd = seed / 233280.0;
+ return Math.floor(min + rnd * (max - min));
+}
+ }
+
+ function HSVtoHex (hsv){
+
+ var rgb = HSVtoRGB(hsv);
+
+ function componentToHex(c) {
+ var hex = c.toString(16);
+ return hex.length == 1 ? '0' + hex : hex;
+ }
+
+ var hex = '#' + componentToHex(rgb[0]) + componentToHex(rgb[1]) + componentToHex(rgb[2]);
+
+ return hex;
+
+ }
+
+ function defineColor (name, hueRange, lowerBounds) {
+
+ var sMin = lowerBounds[0][0],
+ sMax = lowerBounds[lowerBounds.length - 1][0],
+
+ bMin = lowerBounds[lowerBounds.length - 1][1],
+ bMax = lowerBounds[0][1];
+
+ colorDictionary[name] = {
+ hueRange: hueRange,
+ lowerBounds: lowerBounds,
+ saturationRange: [sMin, sMax],
+ brightnessRange: [bMin, bMax]
+ };
+
+ }
+
+ function loadColorBounds () {
+
+ defineColor(
+ 'monochrome',
+ null,
+ [[0,0],[100,0]]
+ );
+
+ defineColor(
+ 'red',
+ [-26,18],
+ [[20,100],[30,92],[40,89],[50,85],[60,78],[70,70],[80,60],[90,55],[100,50]]
+ );
+
+ defineColor(
+ 'orange',
+ [18,46],
+ [[20,100],[30,93],[40,88],[50,86],[60,85],[70,70],[100,70]]
+ );
+
+ defineColor(
+ 'yellow',
+ [46,62],
+ [[25,100],[40,94],[50,89],[60,86],[70,84],[80,82],[90,80],[100,75]]
+ );
+
+ defineColor(
+ 'green',
+ [62,178],
+ [[30,100],[40,90],[50,85],[60,81],[70,74],[80,64],[90,50],[100,40]]
+ );
+
+ defineColor(
+ 'blue',
+ [178, 257],
+ [[20,100],[30,86],[40,80],[50,74],[60,60],[70,52],[80,44],[90,39],[100,35]]
+ );
+
+ defineColor(
+ 'purple',
+ [257, 282],
+ [[20,100],[30,87],[40,79],[50,70],[60,65],[70,59],[80,52],[90,45],[100,42]]
+ );
+
+ defineColor(
+ 'pink',
+ [282, 334],
+ [[20,100],[30,90],[40,86],[60,84],[80,80],[90,75],[100,73]]
+ );
+
+ }
+
+ function HSVtoRGB (hsv) {
+
+ // this doesn't work for the values of 0 and 360
+ // here's the hacky fix
+ var h = hsv[0];
+ if (h === 0) {h = 1;}
+ if (h === 360) {h = 359;}
+
+ // Rebase the h,s,v values
+ h = h/360;
+ var s = hsv[1]/100,
+ v = hsv[2]/100;
+
+ var h_i = Math.floor(h*6),
+ f = h * 6 - h_i,
+ p = v * (1 - s),
+ q = v * (1 - f*s),
+ t = v * (1 - (1 - f)*s),
+ r = 256,
+ g = 256,
+ b = 256;
+
+ switch(h_i) {
+ case 0: r = v; g = t; b = p; break;
+ case 1: r = q; g = v; b = p; break;
+ case 2: r = p; g = v; b = t; break;
+ case 3: r = p; g = q; b = v; break;
+ case 4: r = t; g = p; b = v; break;
+ case 5: r = v; g = p; b = q; break;
+ }
+
+ var result = [Math.floor(r*255), Math.floor(g*255), Math.floor(b*255)];
+ return result;
+ }
+
+ function HexToHSB (hex) {
+ hex = hex.replace(/^#/, '');
+ hex = hex.length === 3 ? hex.replace(/(.)/g, '$1$1') : hex;
+
+ var red = parseInt(hex.substr(0, 2), 16) / 255,
+ green = parseInt(hex.substr(2, 2), 16) / 255,
+ blue = parseInt(hex.substr(4, 2), 16) / 255;
+
+ var cMax = Math.max(red, green, blue),
+ delta = cMax - Math.min(red, green, blue),
+ saturation = cMax ? (delta / cMax) : 0;
+
+ switch (cMax) {
+ case red: return [ 60 * (((green - blue) / delta) % 6) || 0, saturation, cMax ];
+ case green: return [ 60 * (((blue - red) / delta) + 2) || 0, saturation, cMax ];
+ case blue: return [ 60 * (((red - green) / delta) + 4) || 0, saturation, cMax ];
+ }
+ }
+
+ function HSVtoHSL (hsv) {
+ var h = hsv[0],
+ s = hsv[1]/100,
+ v = hsv[2]/100,
+ k = (2-s)*v;
+
+ return [
+ h,
+ Math.round(s*v / (k<1 ? k : 2-k) * 10000) / 100,
+ k/2 * 100
+ ];
+ }
+
+ function stringToInteger (string) {
+ var total = 0;
+ for (var i = 0; i !== string.length; i++) {
+ if (total >= Number.MAX_SAFE_INTEGER) break;
+ total += string.charCodeAt(i);
+ }
+ return total
+ }
+
+ // get The range of given hue when options.count!=0
+ function getRealHueRange(colorHue)
+ { if (!isNaN(colorHue)) {
+ var number = parseInt(colorHue);
+
+ if (number < 360 && number > 0) {
+ return getColorInfo(colorHue).hueRange
+ }
+ }
+ else if (typeof colorHue === 'string') {
+
+ if (colorDictionary[colorHue]) {
+ var color = colorDictionary[colorHue];
+
+ if (color.hueRange) {
+ return color.hueRange
+ }
+ } else if (colorHue.match(/^#?([0-9A-F]{3}|[0-9A-F]{6})$/i)) {
+ var hue = HexToHSB(colorHue)[0];
+ return getColorInfo(hue).hueRange
+ }
+ }
+
+ return [0,360]
+}
+ return randomColor;
+}));
+});
+
+class TextInput {
+ // The input element
+ el;
+ quill;
+ groups;
+ parentElement;
+ droppedText;
+ constructor(parentElement) {
+ this.parentElement = parentElement;
+ this.el = document.createElement('div');
+ this.el.id = 'regextool-' + this.parentElement.toolNumber + '-regex-input';
+ this.el.classList.add('regex-input');
+ this.quill = null;
+ this.groups = new Array();
+ this.droppedText = false;
+ }
+ initQuill = () => {
+ // initializing quill
+ this.quill = new Quill('#regextool-' + this.parentElement.toolNumber + '-regex-input', {
+ modules: {
+ toolbar: false
+ },
+ });
+ this.quill.keyboard.addBinding({
+ key: 'C',
+ shortKey: true,
+ }, (range, context) => {
+ const freeKeyboardEvent = {
+ 'event-type': 'text-input-keyboard',
+ range: range,
+ keys: ['ctrl', 'c']
+ };
+ if (this.parentElement) {
+ this.parentElement.logEvent(freeKeyboardEvent);
+ }
+ return true;
+ });
+ this.quill.keyboard.addBinding({
+ key: 'V',
+ shortKey: true,
+ }, (range, context) => {
+ const freeKeyboardEvent = {
+ 'event-type': 'text-input-keyboard',
+ range: range,
+ keys: ['ctrl', 'v']
+ };
+ if (this.parentElement) {
+ this.parentElement.logEvent(freeKeyboardEvent);
+ }
+ return true;
+ });
+ this.el.ondrop = (event) => {
+ this.droppedText = true;
+ };
+ };
+ getText = () => {
+ if (this.quill != null) {
+ return this.quill.getText(0, this.quill.getLength() - 1);
+ }
+ else {
+ return '';
+ }
+ };
+ highlightGroup = (colors) => {
+ this.calculateGroup();
+ console.log(this.groups);
+ this.quill?.removeFormat(0, this.quill.getLength() - 1, 'silent');
+ // generate new colors for group if current colors are not enough
+ const groupCount = this.groups.length;
+ if (colors.length < groupCount) {
+ this.generateColor(colors, groupCount - colors.length);
+ }
+ // highlight the groups
+ for (let i = 0; i < this.groups.length; ++i) {
+ this.quill?.formatText(this.groups[i].start, this.groups[i].end - this.groups[i].start, {
+ 'background': colors[i]
+ }, 'silent');
+ }
+ };
+ calculateGroup = () => {
+ let stack = new Array();
+ this.groups = new Array();
+ const pattern = this.getText();
+ this.groups.push({ start: 0, end: pattern.length });
+ for (let i = 0; i < pattern.length; ++i) {
+ if (pattern[i] == '(') {
+ stack.push(this.groups.length);
+ this.groups.push({ start: i, end: -1 });
+ }
+ else if (pattern[i] == ')') {
+ const startIndex = stack.pop();
+ if (startIndex) {
+ this.groups[startIndex].end = i + 1;
+ }
+ }
+ }
+ };
+ // TODO: (structure) move this function to the main element after adding highlight to input
+ generateColor = (colors, cnt) => {
+ for (let i = 0; i < cnt; ++i) {
+ colors.push(randomColor.randomColor());
+ }
+ };
+ updateTestStatus = (result) => {
+ if (this.el.classList.contains(result)) {
+ return;
+ }
+ if (this.el.classList.contains('Pass')) {
+ this.el.classList.remove('Pass');
+ }
+ else if (this.el.classList.contains('Fail')) {
+ this.el.classList.remove('Fail');
+ }
+ else if (this.el.classList.contains('Error')) {
+ this.el.classList.remove('Error');
+ }
+ this.el.classList.add(result);
+ };
+ removeFormat = () => {
+ this.quill?.removeFormat(0, this.quill.getLength() - 1, 'silent');
+ };
+ highlightError = (position) => {
+ this.quill?.formatText(position, 1, {
+ 'background': '#ff99b3'
+ }, 'silent');
+ };
+ restoreAnswer(type, answer) {
+ // TODO (misplaced): consider removing expandable blocks
+ // TODO: add logging to restoring answer
+ if (type != 'text' || typeof answer !== 'string') {
+ return;
+ }
+ this.quill?.setText(answer);
+ }
+}
+
+class HParsonsElement extends HTMLElement {
+ root;
+ _parsonsData;
+ parsonsExplanation;
+ hparsonsInput;
+ inputType;
+ static toolCount = 0;
+ toolNumber;
+ temporaryInputEvent;
+ inputDiv;
+ constructor() {
+ super();
+ HParsonsElement.toolCount += 1;
+ // console.log(RegexElement.toolCount);
+ this.toolNumber = HParsonsElement.toolCount;
+ this.root = this.attachShadow({ mode: 'open' });
+ this.addStyle();
+ this.inputDiv = document.createElement('div');
+ this.inputDiv.classList.add('hparsons-input');
+ this.root.append(this.inputDiv);
+ const reusable = this.getAttribute('reuse-blocks') ? true : false;
+ const randomize = this.getAttribute('randomize') ? true : false;
+ this.hparsonsInput = new ParsonsInput(this, reusable, randomize);
+ // console.log(reusable)
+ // a div wrapping the input and the test case status
+ // init regex input based on the input type
+ this._parsonsData = new Array();
+ this.parsonsExplanation = null;
+ this.inputType = 'parsons';
+ // this.regexErrorMessage = document.createElement('div');
+ // this.regexErrorPosition = -1;
+ this.initRegexInput();
+ this.temporaryInputEvent = {};
+ }
+ set parsonsData(data) {
+ this._parsonsData = data;
+ if (this.inputType == 'parsons') {
+ this.hparsonsInput.setSourceBlocks(data, this.parsonsExplanation);
+ }
+ }
+ get parsonsData() {
+ return this._parsonsData;
+ }
+ // TODO[refactor]: put stylesheet in a separate css/scss file
+ addStyle = () => {
+ const sheet = document.createElement('style');
+ // parsons block
+ sheet.innerHTML += '.hparsons-input {padding: 15px;}\n';
+ sheet.innerHTML += '.hparsons-tip { font-style: italic; }\n';
+ sheet.innerHTML += '.parsons-block {display: inline-block; font-family: monospace; border-color:gray; margin: 0 1px; position: relative; border-radius: 10px; background-color: #efefef; border: 1px solid #d3d3d3; padding: 5px 10px; margin-top: 5px;}\n';
+ sheet.innerHTML += '.parsons-block:hover, .parsons-block:focus { border-color: black;}\n';
+ sheet.innerHTML += '.drop-area { background-color: #ffa; padding: 0 5px; height: 42px; margin: 2px 0;}\n';
+ // TODO:(UI) move the tooltip to the top of the line
+ sheet.innerHTML += '.parsons-block .tooltip { visibility: hidden; width: 200px; background-color: black; color: #fff; text-align: center; padding: 5px 0; border-radius: 6px; position: absolute; z-index: 1; margin: 0 10px; bottom: 120%; margin-left: -100px;}\n';
+ sheet.innerHTML += '.parsons-block .tooltip::after {content: " ";position: absolute; top: 100%;left: 50%; margin-left: -5px; border-width: 5px; border-style: solid; border-color: black transparent transparent transparent;}\n';
+ sheet.innerHTML += '.drag-area .parsons-block:hover .tooltip { visibility: visible;}\n';
+ sheet.innerHTML += '.drag-area { background-color: #efefff; padding: 0 5px; height: 42px; margin: 2px 0; }\n';
+ // unittest
+ this.root.appendChild(sheet);
+ const global_sheet = document.createElement('style');
+ global_sheet.innerHTML += '.regex-input .ql-editor {height: fit-content;}\n';
+ global_sheet.innerHTML += '.ql-editor { box-shadow: 0 0 2px 5px #b1dafa; margin: 5px; }\n';
+ this.appendChild(global_sheet);
+ };
+ logEvent = (eventContent) => {
+ // TODO: fix the logging scheme for horizontal parsons in general.
+ // Right now it only dispatches event of moving parsons blocks.
+ const basicEvent = {
+ 'input-type': this.inputType,
+ };
+ const ev = new CustomEvent('horizontal-parsons', { bubbles: true, detail: { ...basicEvent, ...eventContent } });
+ this.dispatchEvent(ev);
+ };
+ // private _getTimestamp = (): string => {
+ // const timestamp = new Date();
+ // return timestamp.getFullYear() + '/' + (timestamp.getMonth() + 1) + '/' + timestamp.getDate() + '/' + timestamp.getHours() + '/' + timestamp.getMinutes() + '/' + timestamp.getSeconds() + '/' + timestamp.getMilliseconds();
+ // }
+ // // log regex input event along with compilation result
+ // private _logRegexInputEvent = (): void => {
+ // // TODO: just using any here. but regexInputEvent is actually RegexEvent.ParsonsInputEvent or FreeInputEvent... so much trouble with typing!!
+ // let regexInputEvent: any = {
+ // ...this.temporaryInputEvent,
+ // valid: this.patternValidFlag
+ // };
+ // if (!this.patternValidFlag) {
+ // // regexInputEvent['error-message'] = this.regexErrorMessage.innerText;
+ // }
+ // this.logEvent(regexInputEvent);
+ // }
+ static get observedAttributes() { return ['input-type']; }
+ attributeChangedCallback(name, oldValue, newValue) {
+ switch (name) {
+ case 'input-type': {
+ this.initRegexInput();
+ break;
+ }
+ }
+ }
+ initRegexInput() {
+ this.inputDiv.innerHTML = '';
+ let inputType = this.getAttribute('input-type');
+ this.inputType = inputType == 'parsons' ? 'parsons' : 'text';
+ this._parsonsData = new Array();
+ this.parsonsExplanation = null;
+ // todo:(UI) fix the css for the input
+ if (this.inputType == 'parsons') {
+ // init elements: parsons regex input
+ const reusable = this.getAttribute('reuse-blocks') != null ? true : false;
+ const randomize = this.getAttribute('randomize') != null ? true : false;
+ this.hparsonsInput = new ParsonsInput(this, reusable, randomize);
+ this.inputDiv.appendChild(this.hparsonsInput.el);
+ }
+ else {
+ // (this.inputType == 'text')
+ const regex_slot = document.createElement('slot');
+ regex_slot.name = 'regex-input';
+ this.inputDiv.appendChild(regex_slot);
+ // TODO: (refactor) rename RegexInput
+ this.hparsonsInput = new TextInput(this);
+ this.appendChild(this.hparsonsInput.el);
+ this.hparsonsInput.el.slot = 'regex-input';
+ this.hparsonsInput.initQuill();
+ this.hparsonsInput.quill?.on('text-change', (delta) => {
+ this.hparsonsInput.removeFormat();
+ // logging free input event
+ this.temporaryInputEvent = {
+ 'event-type': 'text-input',
+ dropped: this.hparsonsInput.droppedText,
+ delta: delta,
+ answer: this.hparsonsInput.getText()
+ };
+ this.hparsonsInput.droppedText = false;
+ // this._logRegexInputEvent();
+ });
+ }
+ }
+ resetInput() {
+ if (this.inputType != 'parsons') {
+ const regexInput = this.hparsonsInput;
+ regexInput.quill?.setText('', 'silent');
+ }
+ else if (this.inputType == 'parsons') {
+ this.hparsonsInput.resetInput();
+ }
+ const resetEvent = {
+ 'event-type': 'reset',
+ };
+ this.logEvent(resetEvent);
+ }
+ // restore student answer from outside storage
+ restoreAnswer(type, answer) {
+ if (type == undefined || answer == undefined) {
+ return;
+ }
+ this.hparsonsInput.restoreAnswer(type, answer);
+ }
+ getCurrentInput() {
+ return this.hparsonsInput.getText();
+ }
+ getParsonsTextArray() {
+ return this.hparsonsInput._getTextArray();
+ }
+}
+customElements.define('horizontal-parsons', HParsonsElement);
+
+export { HParsonsElement };
+//# sourceMappingURL=horizontal-parsons.js.map
diff --git a/runestone/hparsons/js/hparsons-sql.js b/runestone/hparsons/js/hparsons-sql.js
new file mode 100644
index 000000000..b55651b91
--- /dev/null
+++ b/runestone/hparsons/js/hparsons-sql.js
@@ -0,0 +1,573 @@
+import Handsontable from "handsontable";
+// import 'handsontable/dist/handsontable.full.css';
+import initSqlJs from "sql.js/dist/sql-wasm.js";
+import RunestoneBase from "../../common/js/runestonebase.js";
+import "../css/hparsons.css";
+import 'handsontable/dist/handsontable.full.css';
+
+var allDburls = {};
+
+export var hpList;
+// Dictionary that contains all instances of horizontal Parsons problem objects
+if (hpList === undefined) hpList = {};
+
+
+import "./horizontal-parsons.js";
+
+export default class SQLHParons extends RunestoneBase {
+ constructor(opts) {
+ super(opts);
+ // copied from activecode
+ var suffStart;
+ var orig = $(opts.orig).find("textarea")[0];
+ this.textentry = $(orig).data('textentry') ? true : false;
+ this.reuse = $(orig).data('reuse') ? true : false;
+ this.randomize = $(orig).data('randomize') ? true : false;
+ this.divid = opts.orig.id;
+ this.containerDiv = opts.orig;
+ this.useRunestoneServices = opts.useRunestoneServices;
+ this.origElem = orig;
+ this.origText = this.origElem.textContent;
+ this.code = $(orig).text() || "\n\n\n\n\n";
+ this.dburl = $(orig).data("dburl");
+ this.runButton = null;
+ this.saveButton = null;
+ this.loadButton = null;
+ this.outerDiv = null;
+ this.logResults = true;
+ this.output = null; // create pre for output
+ this.controlDiv = null;
+ let prefixEnd = this.code.indexOf("^^^^");
+ if (prefixEnd > -1) {
+ this.prefix = this.code.substring(0, prefixEnd);
+ this.code = this.code.substring(prefixEnd + 5);
+ }
+ suffStart = this.code.indexOf("--unittest--");
+ if (suffStart > -1) {
+ this.suffix = this.code.substring(suffStart + 5);
+ this.code = this.code.substring(0, suffStart);
+ }
+ this.createEditor();
+ this.createOutput();
+ this.createControls();
+ if ($(orig).data("caption")) {
+ this.caption = $(orig).data("caption");
+ } else {
+ this.caption = "HorizontalParsons";
+ }
+ this.addCaption("runestone");
+ this.indicate_component_ready();
+
+ // copied from activecode-sql
+ // fnprefix sets the path to load the sql-wasm.wasm file
+ var bookprefix;
+ var fnprefix;
+ if (eBookConfig.useRunestoneServices) {
+ bookprefix = `${eBookConfig.app}/books/published/${eBookConfig.basecourse}`;
+ fnprefix = bookprefix + "/_static";
+ } else {
+ bookprefix = "";
+ fnprefix = "/_static";
+ }
+ this.config = {
+ locateFile: (filename) => `${fnprefix}/${filename}`,
+ };
+ var self = this;
+ initSqlJs(this.config).then(function (SQL) {
+ // set up call to load database asynchronously if given
+ if (self.dburl) {
+ if (self.dburl.startsWith("/_static")) {
+ self.dburl = `${bookprefix}${self.dburl}`;
+ }
+ $(self.runButton).attr("disabled", "disabled");
+ let buttonText = $(self.runButton).text();
+ $(self.runButton).text($.i18n("msg_activecode_load_db"));
+ if (!(self.dburl in allDburls)) {
+ allDburls[self.dburl] = {
+ status: "loading",
+ xWaitFor: jQuery.Deferred(),
+ };
+ } else {
+ if (allDburls[self.dburl].status == "loading") {
+ allDburls[self.dburl].xWaitFor.done(function () {
+ self.db = allDburls[self.dburl].dbObject;
+ $(self.runButton).removeAttr("disabled");
+ $(self.runButton).text(buttonText);
+ });
+ return;
+ }
+ self.db = allDburls[self.dburl].dbObject;
+ $(self.runButton).removeAttr("disabled");
+ $(self.runButton).text(buttonText);
+ return;
+ }
+ var xhr = new XMLHttpRequest();
+ // For example: https://github.com/lerocha/chinook-database/raw/master/ChinookDatabase/DataSources/Chinook_Sqlite.sqlite
+ xhr.open("GET", self.dburl, true);
+ xhr.responseType = "arraybuffer";
+ xhr.onload = (e) => {
+ var uInt8Array = new Uint8Array(xhr.response);
+ self.db = new SQL.Database(uInt8Array);
+ allDburls[self.dburl].dbObject = self.db;
+ $(self.runButton).text(buttonText);
+ $(self.runButton).removeAttr("disabled");
+ allDburls[self.dburl].db = uInt8Array;
+ allDburls[self.dburl].status = "ready";
+ allDburls[self.dburl].xWaitFor.resolve();
+ // contents is now [{columns:['col1','col2',...], values:[[first row], [second row], ...]}]
+ };
+ xhr.send();
+ } else {
+ self.db = new SQL.Database();
+ }
+ });
+ }
+
+ // copied from activecode
+ async runButtonHandler() {
+ // Disable the run button until the run is finished.
+ this.runButton.disabled = true;
+ try {
+ await this.runProg();
+ } catch (e) {
+ console.log(`there was an error ${e} running the code`);
+ }
+ if (this.logResults) {
+ this.logCurrentAnswer();
+ }
+ this.renderFeedback();
+ // The run is finished; re-enable the button.
+ this.runButton.disabled = false;
+ }
+
+ // copied from activecode, already modified to add parsons
+ createEditor() {
+ this.outerDiv = document.createElement("div");
+ $(this.origElem).replaceWith(this.outerDiv);
+ let parsonsHTML = ``
+ this.outerDiv.innerHTML = parsonsHTML;
+ this.outerDiv.addEventListener('horizontal-parsons', (ev) => {this.logHorizontalParsonsEvent(ev.detail)})
+ let blocks = [];
+ let blockIndex = this.code.indexOf('--blocks--');
+ if (blockIndex > -1) {
+ let blocksString = this.code.substring(blockIndex + 10);
+ let endIndex = blocksString.indexOf('\n--');
+ blocksString = endIndex > -1 ? blocksString.substring(0, endIndex) : blocksString;
+ blocks = blocksString.split('\n');
+ }
+ this.hparsons = $(this.outerDiv).find("horizontal-parsons")[0];
+ this.hparsons.parsonsData = blocks.slice(1, -1);
+ }
+
+ // copied from activecode
+ // seems pretty clear, and do not need to modify
+ createOutput() {
+ // Create a parent div with two elements: pre for standard output and a div
+ // to hold turtle graphics output. We use a div in case the turtle changes from
+ var outDiv = document.createElement("div");
+ $(outDiv).addClass("hp_output col-md-12");
+ this.outDiv = outDiv;
+ this.output = document.createElement("pre");
+ this.output.id = this.divid + "_stdout";
+ $(this.output).css("visibility", "hidden");
+ var clearDiv = document.createElement("div");
+ $(clearDiv).css("clear", "both"); // needed to make parent div resize properly
+ this.outerDiv.appendChild(clearDiv);
+ outDiv.appendChild(this.output);
+ this.outerDiv.appendChild(outDiv);
+ clearDiv = document.createElement("div");
+ $(clearDiv).css("clear", "both"); // needed to make parent div resize properly
+ this.outerDiv.appendChild(clearDiv);
+ }
+
+ // copied from activecode
+ createControls() {
+ var ctrlDiv = document.createElement("div");
+ var butt;
+ $(ctrlDiv).addClass("hp_actions");
+ $(ctrlDiv).addClass("col-md-12");
+ // Run
+ butt = document.createElement("button");
+ $(butt).text("Run");
+ $(butt).addClass("btn btn-success run-button");
+ ctrlDiv.appendChild(butt);
+ this.runButton = butt;
+ this.runButton.onclick = this.runButtonHandler.bind(this);
+ $(butt).attr("type", "button");
+
+ // Reset button
+ var resetBtn;
+ resetBtn = document.createElement("button");
+ $(resetBtn).text("Reset");
+ $(resetBtn).addClass("btn btn-warning run-button");
+ ctrlDiv.appendChild(resetBtn);
+ this.resetButton = resetBtn;
+ this.resetButton.onclick = () => this.hparsons.resetInput();
+ $(resetBtn).attr("type", "button");
+
+ // TODO: maybe remove the question part
+ $(this.outerDiv).prepend(ctrlDiv);
+ this.controlDiv = ctrlDiv;
+ }
+
+ // copied from activecode-sql
+ async runProg(noUI, logResults) {
+ if (typeof logResults === "undefined") {
+ this.logResults = true;
+ } else {
+ this.logResults = logResults;
+ }
+ if (typeof noUI !== "boolean") {
+ noUI = false;
+ }
+ // Clear any old results
+ this.saveCode = "True";
+ let divid = this.divid + "_sql_out";
+ let respDiv = document.getElementById(divid);
+ if (respDiv) {
+ respDiv.parentElement.removeChild(respDiv);
+ }
+ $(this.output).text("");
+ // Run this query
+ let query = await this.buildProg(false); // false --> Do not include suffix
+ if (!this.db) {
+ $(this.output).text(
+ `Error: Database not initialized! DBURL: ${this.dburl}`
+ );
+ return;
+ }
+
+ let it = this.db.iterateStatements(query);
+ this.results = [];
+ try {
+ for (let statement of it) {
+ let columns = statement.getColumnNames();
+ if (columns.length > 0) {
+ // data! probably a SELECT
+ let data = [];
+ while (statement.step()) {
+ data.push(statement.get());
+ }
+ this.results.push({
+ status: "success",
+ columns: columns,
+ values: data,
+ rowcount: data.length,
+ });
+ } else {
+ let nsql = statement.getNormalizedSQL();
+ let prefix = nsql.substr(0, 6).toLowerCase();
+ statement.step(); // execute the query
+ // Try to detect INSERT/UPDATE/DELETE to give friendly feedback
+ // on rows modified - unfortunately, this won't catch such queries
+ // if they use CTEs. There seems to be no reliable way of knowing
+ // when a SQLite query actually modified data.
+ if (
+ prefix === "insert" ||
+ prefix === "update" ||
+ prefix === "delete"
+ ) {
+ this.results.push({
+ status: "success",
+ operation: prefix,
+ rowcount: this.db.getRowsModified(),
+ });
+ } else {
+ this.results.push({ status: "success" });
+ }
+ }
+ }
+ } catch (e) {
+ this.results.push({
+ status: "failure",
+ message: e.toString(),
+ sql: it.getRemainingSQL(),
+ });
+ }
+
+ if (this.results.length === 0) {
+ this.results.push({
+ status: "failure",
+ message: "No queries submitted.",
+ });
+ }
+
+ respDiv = document.createElement("div");
+ respDiv.id = divid;
+ this.outDiv.appendChild(respDiv);
+ $(this.outDiv).show();
+ // Sometimes we don't want to show a bunch of intermediate results
+ // like when we are including a bunch of previous statements from
+ // other activecodes In that case the showlastsql flag can be set
+ // so we only show the last result
+ let resultArray = this.results;
+ for (let r of resultArray) {
+ let section = document.createElement("div");
+ section.setAttribute("class", "hp_sql_result");
+ respDiv.appendChild(section);
+ if (r.status === "success") {
+ if (r.columns) {
+ let tableDiv = document.createElement("div");
+ section.appendChild(tableDiv);
+ let maxHeight = 350;
+ if (resultArray.length > 1) maxHeight = 200; // max height smaller if lots of results
+ createTable(r, tableDiv, maxHeight);
+ let messageBox = document.createElement("pre");
+ let rmsg = r.rowcount !== 1 ? " rows " : " row ";
+ let msg = "" + r.rowcount + rmsg + "returned";
+ if (r.rowcount > 100) {
+ msg = msg + " (only first 100 rows displayed)";
+ }
+ msg = msg + ".";
+ messageBox.textContent = msg;
+ messageBox.setAttribute("class", "hp_sql_result_success");
+ section.appendChild(messageBox);
+ } else if (r.rowcount) {
+ let messageBox = document.createElement("pre");
+ let op = r.operation;
+ op = op + (op.charAt(op.length - 1) === "e" ? "d." : "ed.");
+ let rmsg = r.rowcount !== 1 ? " rows " : " row ";
+ messageBox.textContent = "" + r.rowcount + rmsg + op;
+ messageBox.setAttribute("class", "hp_sql_result_success");
+ section.appendChild(messageBox);
+ } else {
+ let messageBox = document.createElement("pre");
+ messageBox.textContent = "Operation succeeded.";
+ messageBox.setAttribute("class", "hp_sql_result_success");
+ section.appendChild(messageBox);
+ }
+ } else {
+ let messageBox = document.createElement("pre");
+ messageBox.textContent = r.message;
+ messageBox.setAttribute("class", "hp_sql_result_failure");
+ section.appendChild(messageBox);
+ }
+ }
+
+ // Now handle autograding
+ if (this.suffix) {
+ this.testResult = this.autograde(
+ this.results[this.results.length - 1]
+ );
+ } else {
+ $(this.output).css("visibility", "hidden");
+ }
+
+ return Promise.resolve("done");
+ }
+
+ // copied from anctivecode
+ // changed to getting parsons
+ async buildProg(useSuffix) {
+ // assemble code from prefix, suffix, and editor for running.
+ var prog;
+ if (this.textentry) {
+ prog = this.hparsons.getCurrentInput();
+ } else {
+ prog = this.hparsons.getParsonsTextArray().join(' ') + "\n";
+ }
+ this.pretext = "";
+ this.pretextLines = 0;
+ this.progLines = prog.match(/\n/g).length + 1;
+ if (useSuffix && this.suffix) {
+ prog = prog + this.suffix;
+ }
+ return Promise.resolve(prog);
+ }
+
+ // copied from activecode-sql
+ async logCurrentAnswer(sid) {
+ let data = {
+ div_id: this.divid,
+ code: this.hparsons.getParsonsTextArray(),
+ language: "sql",
+ // errinfo: this.results[this.results.length - 1].status,
+ to_save: this.saveCode,
+ prefix: this.pretext,
+ suffix: this.suffix,
+ }; // Log the run event
+ if (typeof sid !== "undefined") {
+ data.sid = sid;
+ }
+ await this.logRunEvent(data);
+
+ if (this.unit_results) {
+ let unitData = {
+ event: "unittest",
+ div_id: this.divid,
+ course: eBookConfig.course,
+ act: this.unit_results,
+ };
+ if (typeof sid !== "undefined") {
+ unitData.sid = sid;
+ }
+ await this.logBookEvent(unitData);
+ }
+ }
+
+ logHorizontalParsonsEvent(hparsonsEvent) {
+ // TODO: might need to find another way to change "act".
+ // The event string is probably too long.
+ let ev = {
+ event: "hparsons",
+ div_id: this.divid,
+ act: JSON.stringify(hparsonsEvent),
+ };
+ this.logBookEvent(ev);
+ }
+
+ renderFeedback() {
+ if (this.testResult) {
+ $(this.output).text(this.testResult);
+ $(this.output).css("visibility", "visible");
+ }
+ }
+
+ autograde(result_table) {
+ var tests = this.suffix.split(/\n/);
+ this.passed = 0;
+ this.failed = 0;
+ // Tests should be of the form
+ // assert row,col oper value for example
+ // assert 4,4 == 3
+ var result = "";
+ tests = tests.filter(function (s) {
+ return s.indexOf("assert") > -1;
+ });
+ for (let test of tests) {
+ let wlist = test.split(/\s+/);
+ wlist.shift();
+ let loc = wlist.shift();
+ let oper = wlist.shift();
+ let expected = wlist.join(" ");
+ let [row, col] = loc.split(",");
+ result += this.testOneAssert(
+ row,
+ col,
+ oper,
+ expected,
+ result_table
+ );
+ result += "\n";
+ }
+ let pct = (100 * this.passed) / (this.passed + this.failed);
+ pct = pct.toLocaleString(undefined, { maximumFractionDigits: 2 });
+ result += `You passed ${this.passed} out of ${this.passed + this.failed
+ } tests for ${pct}%`;
+ this.unit_results = `percent:${pct}:passed:${this.passed}:failed:${this.failed}`;
+ return result;
+ }
+ testOneAssert(row, col, oper, expected, result_table) {
+ // make sure row and col are in bounds
+ let actual;
+ let output = "";
+ try {
+ actual = result_table.values[row][col];
+ } catch (e) {
+ if (expected == 'NO_DATA') {
+ this.passed++;
+ output = `Passed: No data in row ${row}, column ${col}`;
+ return output;
+ } else {
+ output = `Failed: Not enough data to check row ${row} or column ${col}`;
+ return output;
+ }
+ }
+ const operators = {
+ "==": function (operand1, operand2) {
+ return operand1 == operand2;
+ },
+ "!=": function (operand1, operand2) {
+ return operand1 != operand2;
+ },
+ ">": function (operand1, operand2) {
+ return operand1 > operand2;
+ },
+ "<": function (operand1, operand2) {
+ return operand1 > operand2;
+ },
+ };
+ let res = operators[oper](actual, expected);
+ if (res) {
+ output = `Pass: ${actual} ${oper} ${expected} in row ${row} column ${result_table.columns[col]}`;
+ this.passed++;
+ } else {
+ output = `Failed ${actual} ${oper} ${expected} in row ${row} column ${result_table.columns[col]}`;
+ this.failed++;
+ }
+ return output;
+ }
+}
+
+function createTable(tableData, container, maxHeight) {
+ let data = tableData.values;
+ let trimRows = undefined;
+ if (data.length === 0) {
+ // kludge: no column headers will show up unless we do this
+ data = [tableData.columns.map((e) => null)];
+ trimRows = [0];
+ }
+
+ var hot = new Handsontable(container, {
+ data: data,
+ trimRows: trimRows,
+ width: "100%",
+ height: maxHeight,
+ autoRowSize: true,
+ autoColumnSize: { useHeaders: true },
+ rowHeaders: false,
+ colHeaders: tableData.columns,
+ editor: false,
+ maxRows: 100,
+ filters: false,
+ dropdownMenu: false,
+ licenseKey: "non-commercial-and-evaluation",
+ });
+
+ // calculate actual height and resize
+ let actualHeight = 40; // header height + small margin
+ if (tableData.values.length > 0) {
+ for (let i = 0; i < data.length; i++) {
+ actualHeight = actualHeight + hot.getRowHeight(i);
+ if (actualHeight > maxHeight) break;
+ }
+ }
+
+ hot.updateSettings({ height: actualHeight });
+
+ return hot;
+}
+
+
+/*=================================
+== Find the custom HTML tags and ==
+== execute our code on them ==
+=================================*/
+$(document).bind("runestone:login-complete", function () {
+ $("[data-component=hparsons]").each(function () {
+ if ($(this).closest("[data-component=timedAssessment]").length == 0) {
+ // If this element exists within a timed component, don't render it here
+ // try {
+ hpList[this.id] = new SQLHParons({
+ orig: this,
+ useRunestoneServices: eBookConfig.useRunestoneServices,
+ });
+ // } catch (err) {
+ // console.log(`Error rendering ShortAnswer Problem ${this.id}
+ // Details: ${err}`);
+ // }
+ }
+ });
+});
diff --git a/runestone/hparsons/test.rst b/runestone/hparsons/test.rst
new file mode 100644
index 000000000..8728a3602
--- /dev/null
+++ b/runestone/hparsons/test.rst
@@ -0,0 +1,23 @@
+ .. hparsons:: unqiue_problem_id_here
+ :maxdist:
+ :order:
+ :language:
+ :noindent:
+ :adaptive:
+ :numbered:
+
+ Solve my really cool horizontal Parsons problem...if you can.
+ -----
+ def findmax(alist):
+ =====
+ if len(alist) == 0:
+ return None
+ =====
+ curmax = alist[0]
+ for item in alist:
+ =====
+ if item > curmax:
+ =====
+ curmax = item
+ =====
+ return curmax
diff --git a/runestone/hparsons/test/_sources/_static/hptest.db b/runestone/hparsons/test/_sources/_static/hptest.db
new file mode 100644
index 000000000..1425dbd5a
Binary files /dev/null and b/runestone/hparsons/test/_sources/_static/hptest.db differ
diff --git a/runestone/hparsons/test/_sources/_static/test.db b/runestone/hparsons/test/_sources/_static/test.db
new file mode 100644
index 000000000..6ea96554c
Binary files /dev/null and b/runestone/hparsons/test/_sources/_static/test.db differ
diff --git a/runestone/hparsons/test/_sources/index.rst b/runestone/hparsons/test/_sources/index.rst
new file mode 100644
index 000000000..0d84a6ba2
--- /dev/null
+++ b/runestone/hparsons/test/_sources/index.rst
@@ -0,0 +1,49 @@
+==========================================
+Test: Horizontal Parsons Problems with SQL
+==========================================
+
+
+Examples
+========
+Randomized Block
+--------------------------------------
+.. hparsons:: test_hparsons_sql_1
+ :language: sql
+ :dburl: /_static/test.db
+ :randomize:
+
+ This is a horizontal Parsons problem! Feedback is based on code execution.
+ The blocks are randomized, but cannot be reused ;)
+ ~~~~
+ --blocks--
+ SELECT
+ *
+ FROM
+ test
+ --unittest--
+ assert 1,1 == world
+ assert 0,1 == hello
+ assert 2,1 == 42
+
+
+Reusable Block
+--------------------------------------
+.. hparsons:: test_hparsons_sql_2
+ :language: sql
+ :dburl: /_static/test.db
+ :reuse:
+
+ This is a horizontal parsons problem! Feedback is base on code execution.
+ The blocks are set as the original order, and can be used multiple times.
+ To delete a block, simply drag out of the input area.
+ These features might not be so useful in the context of SQL, but might be useful in regex.
+ ~~~~
+ --blocks--
+ SELECT
+ *
+ FROM
+ test
+ --unittest--
+ assert 1,1 == world
+ assert 0,1 == hello
+ assert 2,1 == 42
diff --git a/runestone/hparsons/test/conf.py b/runestone/hparsons/test/conf.py
new file mode 100644
index 000000000..935052f94
--- /dev/null
+++ b/runestone/hparsons/test/conf.py
@@ -0,0 +1,313 @@
+# *************************************************************
+# |docname| - Sphinx configuration file for a Runestone project
+# *************************************************************
+#
+# Problem Solving with Algorithms and Data Structures documentation build configuration file, created by
+# sphinx-quickstart on Thu Oct 27 08:17:45 2011.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('../modules'))
+
+from runestone import runestone_static_dirs, runestone_extensions, setup
+import pkg_resources
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx.ext.mathjax'] + runestone_extensions()
+
+#,'runestone.video','runestone.reveal','runestone.poll','runestone.tabbedStuff','runestone.disqus','runestone.codelens','runestone.activecode', 'runestone.assess', 'runestone.animation','runestone.meta', 'runestone.parsons', 'runestone.blockly', 'runestone.livecode','runestone.accessibility']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = 'Runestone Interactive Overview'
+copyright = '2017 amy21206'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '0.0.1'
+# The full version, including alpha/beta/rc tags.
+release = '0.0'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages. https://www.sphinx-doc.org/en/master/usage/configuration.html
+language = "en"
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = []
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+# `keep_warnings `_:
+# If true, keep warnings as “system message” paragraphs in the built documents.
+# Regardless of this setting, warnings are always written to the standard error
+# stream when sphinx-build is run.
+keep_warnings = True
+
+# `rst_prolog `_:
+# A string of reStructuredText that will be included at the beginning of every
+# source file that is read.
+rst_prolog = (
+# For fill-in-the-blank questions, provide a convenient means to indicate a blank.
+"""
+
+.. |blank| replace:: :blank:`x`
+"""
+
+# For literate programming files, provide a convenient way to refer to a source file's name. See `runestone.lp.lp._docname_role`.
+""".. |docname| replace:: :docname:`name`
+"""
+)
+
+# Select whether to use server-side grading where possible. Server-side grading
+# requires **all** the following:
+#
+# - The use of Runestone services (``eBookConfig.useRunestoneServices === true``)
+# - Logging enabled (``eBookConfig.logLevel > 0``)
+#
+# The first two conditions cause the ``RunestoneBase.logBookEvent`` in ``runestonebase.js`` to post a student response to the server. The last conditions ensures that ``hsblog`` in ``ajax.py`` on the server will return a response containing grading information.
+runestone_server_side_grading = False
+
+# Extensions
+# ==========
+# CodeChat
+# --------
+# **CodeChat note:** A dict of {glob_, lexer_alias}, which uses lexer_alias
+# (e.g. a lexer's `short name `_) to analyze
+# any file wihch matches the given `glob
+# `_.
+CodeChat_lexer_for_glob = {
+ # Otherwise, Pygments picks the wrong lexer for CSS...
+ '*.css': 'CSS',
+ # ... and for JavaScript.
+ '*.js': 'JavaScript',
+}
+#
+# **CodeChat note::** This is a list of exclude_patterns_ which applies only to
+# source documents; exclude_patterns_ will exclude the given files from all of
+# Sphinx (for example, files here won't be included even if they're mentioned in
+# html_static_path_.
+CodeChat_excludes = []
+#
+# Inline syntax highlight
+# -----------------------
+# `inline_highlight_respect_highlight `_:
+# Use the language specified by the ``highlight`` directive to syntax highlight ``code`` role contents.
+inline_highlight_respect_highlight = True
+inline_highlight_literals = False
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. sphinx_bootstrap is provided with
+# Runestone. Other themes are built into sphinx:
+# https://www.sphinx-doc.org/en/master/usage/theming.html?highlight=html_theme_path#using-a-theme
+html_theme = 'sphinx_bootstrap'
+
+# If using a non-sphinx theme, the path to the theme folder must be in this list
+html_theme_path = [pkg_resources.resource_filename('runestone', 'common/project_template/_templates/plugin_layouts')]
+
+# To override individual templates from the theme, you can make a directory and add its path
+# relative to this file to the templates_path list. In it, place copies of any template files
+# you wish to override - your template file(s) will be used instead of the default ones from the theme
+#templates_path = ['_templates']
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+html_theme_options = {
+ # Navigation bar title. (Default: ``project`` value)
+ 'navbar_title': "hparsons-test",
+
+ # Tab name for entire site. (Default: "Site")
+ 'navbar_site_name': "Chapters",
+
+ # Global TOC depth for "site" navbar tab. (Default: 1)
+ # Switching to -1 shows all levels.
+ 'globaltoc_depth': 1,
+
+ # Include hidden TOCs in Site navbar?
+ #
+ # Note: If this is "false", you cannot have mixed ``:hidden:`` and
+ # non-hidden ``toctree`` directives in the same page, or else the build
+ # will break.
+ #
+ # Values: "true" (default) or "false"
+ 'globaltoc_includehidden': "true",
+
+ # HTML navbar class (Default: "navbar") to attach to
element.
+ # For black navbar, do "navbar navbar-inverse"
+ 'navbar_class': "navbar",
+
+ # Fix navigation bar to top of page?
+ # Values: "true" (default) or "false"
+ 'navbar_fixed_top': "true",
+
+ # Location of link to source.
+ # Options are "nav" (default), "footer" or anything else to exclude.
+ 'source_link_position': "nav",
+
+ # Bootswatch (http://bootswatch.com/) theme.
+ #
+ # Options are nothing with "" (default) or the name of a valid theme
+ # such as "amelia" or "cosmo".
+ #
+ # Note that this is served off CDN, so won't be available offline.
+ #'bootswatch_theme': "slate",
+}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+# https://www.sphinx-doc.org/en/master/usage/configuration.html?highlight=html_sidebars#confval-html_additional_pages
+#html_additional_pages = {}
+
+# A list of paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+# Example: html_static_path = runestone_static_dirs() + ['_static', 'other']
+html_static_path = runestone_static_dirs()
+
+# List of extra stylesheets that should be added to all html pages
+# Files must be on a path contained in html_static_path
+#setup.custom_css_files = ["sample.css", "sample2.css"]
+
+# List of extra js files that should be added to all html pages
+# Items may be a file name or a dict with properties {"file":FILENAME, "key1", "value1", "key2, "value2"...}
+# in which case file should have the file name and other key/value pairs are used as attrs
+# on the script tag. The sample below will set sample2.js's script tag to have the defer attr
+# Files must be on a path contained in html_static_path
+#setup.custom_js_files = ["sample.css", {"file": "sample2.js", "defer": ""}]
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# " v documentation".
+html_title = 'Runestone Interactive Overview'
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+html_short_title ='Runestone Interactive Overview'
+
+# Logo is included at the top of the page
+#html_logo = "../source/_static/logo_small.png"
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+html_show_sourcelink = False
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# It True, sets js files from Sphinx & Runestone to be loaded with defer attr
+# substantially speeding up page rendering. May cause issues with books that
+# have custom directives or raw html that assume jquery or another library
+# is loaded before body is parsed.
+html_defer_js = True
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'PythonCoursewareProjectdoc'
+
+# .. _accessibility_style:
+#
+# accessibility_style
+# -------------------
+# This config value is defined in the `../../accessibility/accessibility.py` extension.
+# By this config value you can select what accessibility stylesheet
+# you want to add (``normal``, ``light``, ``darkest`` or ``none``).
+#accessibility_style = 'normal'
+
+# Config values for specific Runestone components
+#
+#activecode_div_class = 'runestone explainer ac_section alert alert-warning'
+#activecode_hide_load_history = False
+#mchoice_div_class = 'runestone alert alert-warning'
+#clickable_div_class = 'runestone alert alert-warning'
+#codelens_div_class = 'alert alert-warning cd_section'
+#dragndrop_div_class = 'runestone'
+#fitb_div_class = 'runestone'
+#parsons_div_class = 'runestone'
+#poll_div_class = 'alert alert-warning'
+#shortanswer_div_class = 'journal alert alert-warning'
+#shortanswer_optional_div_class = 'journal alert alert-success'
+#showeval_div_class = 'runestone explainer alert alert-warning'
+#tabbed_div_class = 'alert alert-warning'
diff --git a/runestone/hparsons/test/pavement.py b/runestone/hparsons/test/pavement.py
new file mode 100644
index 000000000..02be4cbfb
--- /dev/null
+++ b/runestone/hparsons/test/pavement.py
@@ -0,0 +1,67 @@
+import os
+import sys
+import pkg_resources
+from socket import gethostname
+
+from paver.easy import options, Bunch
+import paver.setuputils
+
+from runestone import get_master_url
+from runestone import build # NOQA: F401 -- build is called implicitly by the paver driver.
+from runestone.server import get_dburl
+
+paver.setuputils.install_distutils_tasks()
+sys.path.append(os.getcwd())
+
+# The project name, for use below.
+project_name = 'hparsons-test'
+
+master_url = 'http://127.0.0.1:8000'
+if not master_url:
+ master_url = get_master_url()
+
+# The root directory for ``runestone serve``.
+serving_dir = "./build/" + project_name
+# The destination directory for ``runestone deploy``.
+dest = "../../static"
+
+options(
+ sphinx=Bunch(docroot=".",),
+
+ build=Bunch(
+ builddir=serving_dir,
+ sourcedir="_sources",
+ outdir=serving_dir,
+ confdir=".",
+ template_args={
+ 'login_required': 'false',
+ 'loglevel': 0,
+ 'course_title': project_name,
+ 'python3': 'false',
+ 'dburl': '',
+ 'default_ac_lang': 'python',
+ 'downloads_enabled': 'false',
+ 'enable_chatcodes': 'false',
+ 'allow_pairs': 'false',
+ 'dynamic_pages': False,
+ 'use_services': 'false',
+ 'basecourse': project_name,
+ 'course_id': project_name,
+ # These are used for non-dynamic books.
+ 'appname': 'runestone',
+ 'course_url': master_url,
+ }
+ )
+)
+
+# if we are on runestone-deploy then use the proxy server not canterbury
+if gethostname() == 'runestone-deploy':
+ del options.build.template_args['jobe_server']
+ del options.build.template_args['proxy_uri_runs']
+ del options.build.template_args['proxy_uri_files']
+
+version = pkg_resources.require("runestone")[0].version
+options.build.template_args['runestone_version'] = version
+
+# If DBURL is in the environment override dburl
+options.build.template_args['dburl'] = get_dburl(outer=locals())
diff --git a/runestone/hparsons/test/test_hparsons.py b/runestone/hparsons/test/test_hparsons.py
new file mode 100644
index 000000000..ec0c5b5a5
--- /dev/null
+++ b/runestone/hparsons/test/test_hparsons.py
@@ -0,0 +1,112 @@
+"""
+Test horizontal Parsons problems directive
+"""
+
+__author__ = "zihan wu"
+
+import time
+from selenium.webdriver.support import expected_conditions as EC
+from selenium.webdriver.common.by import By
+
+def find_hp_question(selenium_utils, div_id):
+ selenium_utils.wait_until_ready(div_id)
+ return selenium_utils.driver.find_element(By.ID, div_id)
+
+def click_control(hp_question, button_name):
+ css = '.btn-success.run-button' if button_name == 'Run' else '.btn-warning.run-button'
+ btn = hp_question.find_element(By.CSS_SELECTOR, css)
+ btn.click()
+
+'''
+Test if the blocks are properly randomized.
+1. Assert the sequence of the blocks is not the same as set in .rst file.
+'''
+def test_randomize_block(selenium_utils_get):
+ div_id = "test_hparsons_sql_1"
+ hp = find_hp_question(selenium_utils_get, div_id).find_element(By.CSS_SELECTOR, 'horizontal-parsons')
+ original_sequence = ['SELECT','*','FROM','test']
+ randomized_sequence = []
+ for block in hp.shadow_root.find_element(By.CSS_SELECTOR,'.drag-area').find_elements(By.CSS_SELECTOR, '.parsons-block'):
+ randomized_sequence.append(block.text)
+ assert len(original_sequence) == len(randomized_sequence)
+ is_same_order = True
+ for i in range(len(original_sequence)):
+ if original_sequence[i] != randomized_sequence[i]:
+ is_same_order = False
+ break
+ assert not is_same_order
+
+
+"""
+Test adding and removing blocks by clicking in non-duplicating blocks
+For not reused blocks:
+1. Click on the first block and make sure it is moved to the bottom
+2. Click on the first block in the bottom and make sure it is put back
+For reuseable blocks:
+1. Click on the first block and make sure it is copied to the bottom
+2. Click on the first block in the bottom and make sure it disappears
+"""
+def test_add_and_remove_blocks(selenium_utils_get):
+ div_id = "test_hparsons_sql_1"
+ hp = find_hp_question(selenium_utils_get, div_id).find_element(By.CSS_SELECTOR, 'horizontal-parsons')
+ drag_area = hp.shadow_root.find_element(By.CSS_SELECTOR, '.drag-area')
+ drop_area = hp.shadow_root.find_element(By.CSS_SELECTOR, '.drop-area')
+
+ # 1. Click on the first block and make sure it is added to the bottom
+ block1 = drag_area.find_elements(By.CSS_SELECTOR, '.parsons-block')[0]
+ block1.click()
+ assert block1 not in drag_area.find_elements(By.CSS_SELECTOR, '.parsons-block')
+ assert block1 == drop_area.find_elements(By.CSS_SELECTOR, '.parsons-block')[-1]
+
+ # 2. Click on the moved block and make sure it is returned to the top
+ # block2 and block1 are the same object
+ block2 = drop_area.find_elements(By.CSS_SELECTOR, '.parsons-block')[0]
+ block2.click()
+ assert block2 not in drop_area.find_elements(By.CSS_SELECTOR, '.parsons-block')
+ assert block2 == drag_area.find_elements(By.CSS_SELECTOR, '.parsons-block')[-1]
+
+ # For reusable blocks
+ div_id = "test_hparsons_sql_2"
+ hp = find_hp_question(selenium_utils_get, div_id).find_element(By.CSS_SELECTOR, 'horizontal-parsons')
+ drag_area = hp.shadow_root.find_element(By.CSS_SELECTOR, '.drag-area')
+ drop_area = hp.shadow_root.find_element(By.CSS_SELECTOR, '.drop-area')
+
+ # 1. Click on the first block and make sure it is copied to the bottom
+ block1 = drag_area.find_elements(By.CSS_SELECTOR, '.parsons-block')[0]
+ block1.click()
+ assert len(drag_area.find_elements(By.CSS_SELECTOR, '.parsons-block')) == 4
+ assert block1.text == drop_area.find_elements(By.CSS_SELECTOR, '.parsons-block')[-1].text
+
+ # 2. Click on the moved block and make sure it is removed
+ block2 = drop_area.find_elements(By.CSS_SELECTOR, '.parsons-block')[0]
+ block2.click()
+ assert block2 not in drop_area.find_elements(By.CSS_SELECTOR, '.parsons-block')
+ assert len(drag_area.find_elements(By.CSS_SELECTOR, '.parsons-block')) == 4
+
+
+"""
+Test SQL feedback is correct
+1. Click on each of the four blocks in second problem to form a solution
+2. Click on run button to run code and check the result
+"""
+def test_run_SQL(selenium_utils_get):
+ # For reusable blocks
+ div_id = "test_hparsons_sql_2"
+ hp_question = find_hp_question(selenium_utils_get, div_id)
+ time.sleep(2)
+ hp = hp_question.find_element(By.CSS_SELECTOR, 'horizontal-parsons')
+ drag_area = hp.shadow_root.find_element(By.CSS_SELECTOR, '.drag-area')
+ drop_area = hp.shadow_root.find_element(By.CSS_SELECTOR, '.drop-area')
+
+ # 1. Click on each of the four blocks in second problem to form a solution
+ blocks = drag_area.find_elements(By.CSS_SELECTOR, '.parsons-block')
+ for block in blocks:
+ block.click()
+
+ # 2. Click on run button to run code and check the result
+ click_control(hp_question, 'Run')
+ selenium_utils_get.wait.until(EC.text_to_be_present_in_element((By.ID, f"{div_id}_stdout"), "You"))
+ res = selenium_utils_get.driver.find_element(By.ID, f"{div_id}_sql_out")
+ assert res
+ out = selenium_utils_get.driver.find_element(By.ID, f"{div_id}_stdout")
+ assert "You passed 2 out of 3 tests" in out.text
\ No newline at end of file
diff --git a/runestone/hparsons/toctree.rst b/runestone/hparsons/toctree.rst
new file mode 100644
index 000000000..cc2bcbc2b
--- /dev/null
+++ b/runestone/hparsons/toctree.rst
@@ -0,0 +1,10 @@
+*************************************************
+Accessibility
+*************************************************
+.. toctree::
+ :maxdepth: 1
+ :glob:
+
+ *.py
+ js/*.js
+ css/*.css
diff --git a/webpack.index.js b/webpack.index.js
index 39450b551..0bdca650d 100644
--- a/webpack.index.js
+++ b/webpack.index.js
@@ -70,6 +70,7 @@ const module_map = {
khanex: () => import("./runestone/khanex/js/khanex.js"),
lp_build: () => import("./runestone/lp/js/lp.js"),
multiplechoice: () => import("./runestone/mchoice/js/timedmc.js"),
+ hparsons: () => import("./runestone/hparsons/js/hparsons-sql.js"),
parsons: () => import("./runestone/parsons/js/timedparsons.js"),
poll: () => import("./runestone/poll/js/poll.js"),
quizly: () => import("./runestone/quizly/js/quizly.js"),