Update to latest version of squire. fixes #30
Already update later version of Fomantic. fixes #30
This commit is contained in:
		@@ -24,22 +24,19 @@ var win = doc.defaultView;
 | 
			
		||||
var ua = navigator.userAgent;
 | 
			
		||||
 | 
			
		||||
var isAndroid = /Android/.test( ua );
 | 
			
		||||
var isIOS = /iP(?:ad|hone|od)/.test( ua );
 | 
			
		||||
var isMac = /Mac OS X/.test( ua );
 | 
			
		||||
var isWin = /Windows NT/.test( ua );
 | 
			
		||||
var isIOS = /iP(?:ad|hone|od)/.test( ua ) ||
 | 
			
		||||
    ( isMac && !!navigator.maxTouchPoints );
 | 
			
		||||
 | 
			
		||||
var isGecko = /Gecko\//.test( ua );
 | 
			
		||||
var isIElt11 = /Trident\/[456]\./.test( ua );
 | 
			
		||||
var isPresto = !!win.opera;
 | 
			
		||||
var isEdge = /Edge\//.test( ua );
 | 
			
		||||
var isWebKit = !isEdge && /WebKit\//.test( ua );
 | 
			
		||||
var isIE = /Trident\/[4567]\./.test( ua );
 | 
			
		||||
 | 
			
		||||
var ctrlKey = isMac ? 'meta-' : 'ctrl-';
 | 
			
		||||
 | 
			
		||||
var useTextFixer = isIElt11 || isPresto;
 | 
			
		||||
var cantFocusEmptyTextNodes = isIElt11 || isWebKit;
 | 
			
		||||
var losesSelectionOnBlur = isIElt11;
 | 
			
		||||
var cantFocusEmptyTextNodes = isWebKit;
 | 
			
		||||
 | 
			
		||||
var canObserveMutations = typeof MutationObserver !== 'undefined';
 | 
			
		||||
var canWeakMap = typeof WeakMap !== 'undefined';
 | 
			
		||||
@@ -49,15 +46,6 @@ var notWS = /[^ \t\r\n]/;
 | 
			
		||||
 | 
			
		||||
var indexOf = Array.prototype.indexOf;
 | 
			
		||||
 | 
			
		||||
// Polyfill for FF3.5
 | 
			
		||||
if ( !Object.create ) {
 | 
			
		||||
    Object.create = function ( proto ) {
 | 
			
		||||
        var F = function () {};
 | 
			
		||||
        F.prototype = proto;
 | 
			
		||||
        return new F();
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
    Native TreeWalker is buggy in IE and Opera:
 | 
			
		||||
    * IE9/10 sometimes throw errors when calling TreeWalker#nextNode or
 | 
			
		||||
@@ -390,7 +378,7 @@ function createElement ( doc, tag, props, children ) {
 | 
			
		||||
        for ( attr in props ) {
 | 
			
		||||
            value = props[ attr ];
 | 
			
		||||
            if ( value !== undefined ) {
 | 
			
		||||
                el.setAttribute( attr, props[ attr ] );
 | 
			
		||||
                el.setAttribute( attr, value );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -445,31 +433,10 @@ function fixCursor ( node, root ) {
 | 
			
		||||
                fixer = doc.createTextNode( '' );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        if ( useTextFixer ) {
 | 
			
		||||
            while ( node.nodeType !== TEXT_NODE && !isLeaf( node ) ) {
 | 
			
		||||
                child = node.firstChild;
 | 
			
		||||
                if ( !child ) {
 | 
			
		||||
                    fixer = doc.createTextNode( '' );
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                node = child;
 | 
			
		||||
            }
 | 
			
		||||
            if ( node.nodeType === TEXT_NODE ) {
 | 
			
		||||
                // Opera will collapse the block element if it contains
 | 
			
		||||
                // just spaces (but not if it contains no data at all).
 | 
			
		||||
                if ( /^ +$/.test( node.data ) ) {
 | 
			
		||||
                    node.data = '';
 | 
			
		||||
                }
 | 
			
		||||
            } else if ( isLeaf( node ) ) {
 | 
			
		||||
                node.parentNode.insertBefore( doc.createTextNode( '' ), node );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        else if ( !node.querySelector( 'BR' ) ) {
 | 
			
		||||
            fixer = createElement( doc, 'BR' );
 | 
			
		||||
            while ( ( child = node.lastElementChild ) && !isInline( child ) ) {
 | 
			
		||||
                node = child;
 | 
			
		||||
            }
 | 
			
		||||
    } else if ( !node.querySelector( 'BR' ) ) {
 | 
			
		||||
        fixer = createElement( doc, 'BR' );
 | 
			
		||||
        while ( ( child = node.lastElementChild ) && !isInline( child ) ) {
 | 
			
		||||
            node = child;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if ( fixer ) {
 | 
			
		||||
@@ -500,16 +467,14 @@ function fixContainer ( container, root ) {
 | 
			
		||||
        isBR = child.nodeName === 'BR';
 | 
			
		||||
        if ( !isBR && isInline( child ) ) {
 | 
			
		||||
            if ( !wrapper ) {
 | 
			
		||||
                 wrapper = createElement( doc,
 | 
			
		||||
                    config.blockTag, config.blockAttributes );
 | 
			
		||||
                 wrapper = createElement( doc, 'div' );
 | 
			
		||||
            }
 | 
			
		||||
            wrapper.appendChild( child );
 | 
			
		||||
            i -= 1;
 | 
			
		||||
            l -= 1;
 | 
			
		||||
        } else if ( isBR || wrapper ) {
 | 
			
		||||
            if ( !wrapper ) {
 | 
			
		||||
                wrapper = createElement( doc,
 | 
			
		||||
                    config.blockTag, config.blockAttributes );
 | 
			
		||||
                wrapper = createElement( doc, 'div' );
 | 
			
		||||
            }
 | 
			
		||||
            fixCursor( wrapper, root );
 | 
			
		||||
            if ( isBR ) {
 | 
			
		||||
@@ -680,18 +645,6 @@ function mergeWithBlock ( block, next, range, root ) {
 | 
			
		||||
    range.setStart( block, offset );
 | 
			
		||||
    range.collapse( true );
 | 
			
		||||
    mergeInlines( block, range );
 | 
			
		||||
 | 
			
		||||
    // Opera inserts a BR if you delete the last piece of text
 | 
			
		||||
    // in a block-level element. Unfortunately, it then gets
 | 
			
		||||
    // confused when setting the selection subsequently and
 | 
			
		||||
    // refuses to accept the range that finishes just before the
 | 
			
		||||
    // BR. Removing the BR fixes the bug.
 | 
			
		||||
    // Steps to reproduce bug: Type "a-b-c" (where - is return)
 | 
			
		||||
    // then backspace twice. The cursor goes to the top instead
 | 
			
		||||
    // of after "b".
 | 
			
		||||
    if ( isPresto && ( last = block.lastChild ) && last.nodeName === 'BR' ) {
 | 
			
		||||
        block.removeChild( last );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function mergeContainers ( node, root ) {
 | 
			
		||||
@@ -921,6 +874,7 @@ var deleteContentsOfRange = function ( range, root ) {
 | 
			
		||||
// Contents of range will be deleted.
 | 
			
		||||
// After method, range will be around inserted content
 | 
			
		||||
var insertTreeFragmentIntoRange = function ( range, frag, root ) {
 | 
			
		||||
    var firstInFragIsInline = frag.firstChild && isInline( frag.firstChild );
 | 
			
		||||
    var node, block, blockContentsAfterSplit, stopPoint, container, offset;
 | 
			
		||||
    var replaceBlock, firstBlockInFrag, nodeAfterSplit, nodeBeforeSplit;
 | 
			
		||||
    var tempRange;
 | 
			
		||||
@@ -946,11 +900,17 @@ var insertTreeFragmentIntoRange = function ( range, frag, root ) {
 | 
			
		||||
 | 
			
		||||
    // Merge the contents of the first block in the frag with the focused block.
 | 
			
		||||
    // If there are contents in the block after the focus point, collect this
 | 
			
		||||
    // up to insert in the last block later. If the block is empty, replace
 | 
			
		||||
    // it instead of merging.
 | 
			
		||||
    // up to insert in the last block later. This preserves the style that was
 | 
			
		||||
    // present in this bit of the page.
 | 
			
		||||
    //
 | 
			
		||||
    // If the block being inserted into is empty though, replace it instead of
 | 
			
		||||
    // merging if the fragment had block contents.
 | 
			
		||||
    // e.g. <blockquote><p>Foo</p></blockquote>
 | 
			
		||||
    // This seems a reasonable approximation of user intent.
 | 
			
		||||
 | 
			
		||||
    block = getStartBlockOfRange( range, root );
 | 
			
		||||
    firstBlockInFrag = getNextBlock( frag, frag );
 | 
			
		||||
    replaceBlock = !!block && isEmptyBlock( block );
 | 
			
		||||
    replaceBlock = !firstInFragIsInline && !!block && isEmptyBlock( block );
 | 
			
		||||
    if ( block && firstBlockInFrag && !replaceBlock &&
 | 
			
		||||
            // Don't merge table cells or PRE elements into block
 | 
			
		||||
            !getNearest( firstBlockInFrag, frag, 'PRE' ) &&
 | 
			
		||||
@@ -1314,12 +1274,6 @@ var onKey = function ( event ) {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // On keypress, delete and '.' both have event.keyCode 46
 | 
			
		||||
    // Must check event.which to differentiate.
 | 
			
		||||
    if ( isPresto && event.which === 46 ) {
 | 
			
		||||
        key = '.';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Function keys
 | 
			
		||||
    if ( 111 < code && code < 124 ) {
 | 
			
		||||
        key = 'f' + ( code - 111 );
 | 
			
		||||
@@ -1426,6 +1380,17 @@ var afterDelete = function ( self, range ) {
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var detachUneditableNode = function ( node, root ) {
 | 
			
		||||
    var parent;
 | 
			
		||||
    while (( parent = node.parentNode )) {
 | 
			
		||||
        if ( parent === root || parent.isContentEditable ) {
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        node = parent;
 | 
			
		||||
    }
 | 
			
		||||
    detach( node );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var handleEnter = function ( self, shiftKey, range ) {
 | 
			
		||||
    var root = self._root;
 | 
			
		||||
    var block, parent, node, offset, nodeAfterSplit;
 | 
			
		||||
@@ -1571,7 +1536,7 @@ var handleEnter = function ( self, shiftKey, range ) {
 | 
			
		||||
        // If you try to select the contents of a 'BR', FF will not let
 | 
			
		||||
        // you type anything!
 | 
			
		||||
        if ( !child || child.nodeName === 'BR' ||
 | 
			
		||||
                ( child.nodeType === TEXT_NODE && !isPresto ) ) {
 | 
			
		||||
                child.nodeType === TEXT_NODE ) {
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        nodeAfterSplit = child;
 | 
			
		||||
@@ -1639,7 +1604,7 @@ var keyHandlers = {
 | 
			
		||||
            if ( previous ) {
 | 
			
		||||
                // If not editable, just delete whole block.
 | 
			
		||||
                if ( !previous.isContentEditable ) {
 | 
			
		||||
                    detach( previous );
 | 
			
		||||
                    detachUneditableNode( previous, root );
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                // Otherwise merge.
 | 
			
		||||
@@ -1706,7 +1671,7 @@ var keyHandlers = {
 | 
			
		||||
            if ( next ) {
 | 
			
		||||
                // If not editable, just delete whole block.
 | 
			
		||||
                if ( !next.isContentEditable ) {
 | 
			
		||||
                    detach( next );
 | 
			
		||||
                    detachUneditableNode( next, root );
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                // Otherwise merge.
 | 
			
		||||
@@ -1882,24 +1847,6 @@ var fontSizes = {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var styleToSemantic = {
 | 
			
		||||
    backgroundColor: {
 | 
			
		||||
        regexp: notWS,
 | 
			
		||||
        replace: function ( doc, classNames, colour ) {
 | 
			
		||||
            return createElement( doc, 'SPAN', {
 | 
			
		||||
                'class': classNames.highlight,
 | 
			
		||||
                style: 'background-color:' + colour
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    color: {
 | 
			
		||||
        regexp: notWS,
 | 
			
		||||
        replace: function ( doc, classNames, colour ) {
 | 
			
		||||
            return createElement( doc, 'SPAN', {
 | 
			
		||||
                'class': classNames.colour,
 | 
			
		||||
                style: 'color:' + colour
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
    fontWeight: {
 | 
			
		||||
        regexp: /^bold|^700/i,
 | 
			
		||||
        replace: function ( doc ) {
 | 
			
		||||
@@ -1941,6 +1888,12 @@ var styleToSemantic = {
 | 
			
		||||
var replaceWithTag = function ( tag ) {
 | 
			
		||||
    return function ( node, parent ) {
 | 
			
		||||
        var el = createElement( node.ownerDocument, tag );
 | 
			
		||||
        var attributes = node.attributes;
 | 
			
		||||
        var i, l, attribute;
 | 
			
		||||
        for ( i = 0, l = attributes.length; i < l; i += 1 ) {
 | 
			
		||||
            attribute = attributes[i];
 | 
			
		||||
            el.setAttribute( attribute.name, attribute.value );
 | 
			
		||||
        }
 | 
			
		||||
        parent.replaceChild( el, node );
 | 
			
		||||
        el.appendChild( empty( node ) );
 | 
			
		||||
        return el;
 | 
			
		||||
@@ -1957,6 +1910,10 @@ var replaceStyles = function ( node, parent, config ) {
 | 
			
		||||
        css = style[ attr ];
 | 
			
		||||
        if ( css && converter.regexp.test( css ) ) {
 | 
			
		||||
            el = converter.replace( doc, config.classNames, css );
 | 
			
		||||
            if ( el.nodeName === node.nodeName &&
 | 
			
		||||
                    el.className === node.className ) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            if ( !newTreeTop ) {
 | 
			
		||||
                newTreeTop = el;
 | 
			
		||||
            }
 | 
			
		||||
@@ -1970,18 +1927,13 @@ var replaceStyles = function ( node, parent, config ) {
 | 
			
		||||
 | 
			
		||||
    if ( newTreeTop ) {
 | 
			
		||||
        newTreeBottom.appendChild( empty( node ) );
 | 
			
		||||
        if ( node.nodeName === 'SPAN' ) {
 | 
			
		||||
            parent.replaceChild( newTreeTop, node );
 | 
			
		||||
        } else {
 | 
			
		||||
            node.appendChild( newTreeTop );
 | 
			
		||||
        }
 | 
			
		||||
        node.appendChild( newTreeTop );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return newTreeBottom || node;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var stylesRewriters = {
 | 
			
		||||
    P: replaceStyles,
 | 
			
		||||
    SPAN: replaceStyles,
 | 
			
		||||
    STRONG: replaceWithTag( 'B' ),
 | 
			
		||||
    EM: replaceWithTag( 'I' ),
 | 
			
		||||
@@ -2602,12 +2554,6 @@ function Squire ( root, config ) {
 | 
			
		||||
    this._isFocused = false;
 | 
			
		||||
    this._lastSelection = null;
 | 
			
		||||
 | 
			
		||||
    // IE loses selection state of iframe on blur, so make sure we
 | 
			
		||||
    // cache it just before it loses focus.
 | 
			
		||||
    if ( losesSelectionOnBlur ) {
 | 
			
		||||
        this.addEventListener( 'beforedeactivate', this.getSelection );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this._hasZWS = false;
 | 
			
		||||
 | 
			
		||||
    this._lastAnchorNode = null;
 | 
			
		||||
@@ -2654,15 +2600,13 @@ function Squire ( root, config ) {
 | 
			
		||||
    // IE sometimes fires the beforepaste event twice; make sure it is not run
 | 
			
		||||
    // again before our after paste function is called.
 | 
			
		||||
    this._awaitingPaste = false;
 | 
			
		||||
    this.addEventListener( isIElt11 ? 'beforecut' : 'cut', onCut );
 | 
			
		||||
    this.addEventListener( 'cut', onCut );
 | 
			
		||||
    this.addEventListener( 'copy', onCopy );
 | 
			
		||||
    this.addEventListener( 'keydown', monitorShiftKey );
 | 
			
		||||
    this.addEventListener( 'keyup', monitorShiftKey );
 | 
			
		||||
    this.addEventListener( isIElt11 ? 'beforepaste' : 'paste', onPaste );
 | 
			
		||||
    this.addEventListener( 'paste', onPaste );
 | 
			
		||||
    this.addEventListener( 'drop', onDrop );
 | 
			
		||||
 | 
			
		||||
    // Opera does not fire keydown repeatedly.
 | 
			
		||||
    this.addEventListener( isPresto ? 'keypress' : 'keydown', onKey );
 | 
			
		||||
    this.addEventListener( 'keydown', onKey );
 | 
			
		||||
 | 
			
		||||
    // Add key handlers
 | 
			
		||||
    this._keyHandlers = Object.create( keyHandlers );
 | 
			
		||||
@@ -2670,35 +2614,6 @@ function Squire ( root, config ) {
 | 
			
		||||
    // Override default properties
 | 
			
		||||
    this.setConfig( config );
 | 
			
		||||
 | 
			
		||||
    // Fix IE<10's buggy implementation of Text#splitText.
 | 
			
		||||
    // If the split is at the end of the node, it doesn't insert the newly split
 | 
			
		||||
    // node into the document, and sets its value to undefined rather than ''.
 | 
			
		||||
    // And even if the split is not at the end, the original node is removed
 | 
			
		||||
    // from the document and replaced by another, rather than just having its
 | 
			
		||||
    // data shortened.
 | 
			
		||||
    // We used to feature test for this, but then found the feature test would
 | 
			
		||||
    // sometimes pass, but later on the buggy behaviour would still appear.
 | 
			
		||||
    // I think IE10 does not have the same bug, but it doesn't hurt to replace
 | 
			
		||||
    // its native fn too and then we don't need yet another UA category.
 | 
			
		||||
    if ( isIElt11 ) {
 | 
			
		||||
        win.Text.prototype.splitText = function ( offset ) {
 | 
			
		||||
            var afterSplit = this.ownerDocument.createTextNode(
 | 
			
		||||
                    this.data.slice( offset ) ),
 | 
			
		||||
                next = this.nextSibling,
 | 
			
		||||
                parent = this.parentNode,
 | 
			
		||||
                toDelete = this.length - offset;
 | 
			
		||||
            if ( next ) {
 | 
			
		||||
                parent.insertBefore( afterSplit, next );
 | 
			
		||||
            } else {
 | 
			
		||||
                parent.appendChild( afterSplit );
 | 
			
		||||
            }
 | 
			
		||||
            if ( toDelete ) {
 | 
			
		||||
                this.deleteData( offset, toDelete );
 | 
			
		||||
            }
 | 
			
		||||
            return afterSplit;
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    root.setAttribute( 'contenteditable', 'true' );
 | 
			
		||||
 | 
			
		||||
    // Remove Firefox's built-in controls
 | 
			
		||||
@@ -4218,24 +4133,7 @@ proto.getHTML = function ( withBookMark ) {
 | 
			
		||||
    if ( withBookMark && ( range = this.getSelection() ) ) {
 | 
			
		||||
        this._saveRangeToBookmark( range );
 | 
			
		||||
    }
 | 
			
		||||
    if ( useTextFixer ) {
 | 
			
		||||
        root = this._root;
 | 
			
		||||
        node = root;
 | 
			
		||||
        while ( node = getNextBlock( node, root ) ) {
 | 
			
		||||
            if ( !node.textContent && !node.querySelector( 'BR' ) ) {
 | 
			
		||||
                fixer = this.createElement( 'BR' );
 | 
			
		||||
                node.appendChild( fixer );
 | 
			
		||||
                brs.push( fixer );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    html = this._getHTML().replace( /\u200B/g, '' );
 | 
			
		||||
    if ( useTextFixer ) {
 | 
			
		||||
        l = brs.length;
 | 
			
		||||
        while ( l-- ) {
 | 
			
		||||
            detach( brs[l] );
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if ( range ) {
 | 
			
		||||
        this._getRangeAndRemoveBookmark( range );
 | 
			
		||||
    }
 | 
			
		||||
@@ -4356,7 +4254,57 @@ proto.insertImage = function ( src, attributes ) {
 | 
			
		||||
    return img;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
proto.linkRegExp = /\b((?:(?:ht|f)tps?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,}\/)(?:[^\s()<>]+|\([^\s()<>]+\))+(?:\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))|([\w\-.%+]+@(?:[\w\-]+\.)+[A-Z]{2,}\b)(?:\?[^&?\s]+=[^&?\s]+(?:&[^&?\s]+=[^&?\s]+)*)?/i;
 | 
			
		||||
/*
 | 
			
		||||
const linkRegExp = new RegExp(
 | 
			
		||||
// Only look on boundaries
 | 
			
		||||
'\\b(?:' +
 | 
			
		||||
// Capture group 1: URLs
 | 
			
		||||
'(' +
 | 
			
		||||
    // Add links to URLS
 | 
			
		||||
    // Starts with:
 | 
			
		||||
    '(?:' +
 | 
			
		||||
        // http(s):// or ftp://
 | 
			
		||||
        '(?:ht|f)tps?:\\/\\/' +
 | 
			
		||||
        // or
 | 
			
		||||
        '|' +
 | 
			
		||||
        // www.
 | 
			
		||||
        'www\\d{0,3}[.]' +
 | 
			
		||||
        // or
 | 
			
		||||
        '|' +
 | 
			
		||||
        // foo90.com/
 | 
			
		||||
        '[a-z0-9][a-z0-9.\\-]*[.][a-z]{2,}\\/' +
 | 
			
		||||
    ')' +
 | 
			
		||||
    // Then we get one or more:
 | 
			
		||||
    '(?:' +
 | 
			
		||||
        // Run of non-spaces, non ()<>
 | 
			
		||||
        '[^\\s()<>]+' +
 | 
			
		||||
        // or
 | 
			
		||||
        '|' +
 | 
			
		||||
        // balanced parentheses (one level deep only)
 | 
			
		||||
        '\\([^\\s()<>]+\\)' +
 | 
			
		||||
    ')+' +
 | 
			
		||||
    // And we finish with
 | 
			
		||||
    '(?:' +
 | 
			
		||||
        // Not a space or punctuation character
 | 
			
		||||
        '[^\\s?&`!()\\[\\]{};:\'".,<>«»“”‘’]' +
 | 
			
		||||
        // or
 | 
			
		||||
        '|' +
 | 
			
		||||
        // Balanced parentheses.
 | 
			
		||||
        '\\([^\\s()<>]+\\)' +
 | 
			
		||||
    ')' +
 | 
			
		||||
// Capture group 2: Emails
 | 
			
		||||
')|(' +
 | 
			
		||||
    // Add links to emails
 | 
			
		||||
    '[\\w\\-.%+]+@(?:[\\w\\-]+\\.)+[a-z]{2,}\\b' +
 | 
			
		||||
    // Allow query parameters in the mailto: style
 | 
			
		||||
    '(?:' +
 | 
			
		||||
        '[?][^&?\\s]+=[^\\s?&`!()\\[\\]{};:\'".,<>«»“”‘’]+' +
 | 
			
		||||
        '(?:&[^&?\\s]+=[^\\s?&`!()\\[\\]{};:\'".,<>«»“”‘’]+)*' +
 | 
			
		||||
    ')?' +
 | 
			
		||||
'))', 'i' );
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
proto.linkRegExp = /\b(?:((?:(?:ht|f)tps?:\/\/|www\d{0,3}[.]|[a-z0-9][a-z0-9.\-]*[.][a-z]{2,}\/)(?:[^\s()<>]+|\([^\s()<>]+\))+(?:[^\s?&`!()\[\]{};:'".,<>«»“”‘’]|\([^\s()<>]+\)))|([\w\-.%+]+@(?:[\w\-]+\.)+[a-z]{2,}\b(?:[?][^&?\s]+=[^\s?&`!()\[\]{};:'".,<>«»“”‘’]+(?:&[^&?\s]+=[^\s?&`!()\[\]{};:'".,<>«»“”‘’]+)*)?))/i;
 | 
			
		||||
 | 
			
		||||
var addLinks = function ( frag, root, self ) {
 | 
			
		||||
    var doc = frag.ownerDocument;
 | 
			
		||||
@@ -4482,11 +4430,11 @@ proto.insertHTML = function ( html, isPaste ) {
 | 
			
		||||
    return this;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var escapeHTMLFragement = function ( text ) {
 | 
			
		||||
var escapeHTML = function ( text ) {
 | 
			
		||||
    return text.split( '&' ).join( '&' )
 | 
			
		||||
               .split( '<' ).join( '<'  )
 | 
			
		||||
               .split( '>' ).join( '>'  )
 | 
			
		||||
               .split( '"' ).join( '"'  );
 | 
			
		||||
               .split( '<' ).join( '<' )
 | 
			
		||||
               .split( '>' ).join( '>' )
 | 
			
		||||
               .split( '"' ).join( '"' );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
proto.insertPlainText = function ( plainText, isPaste ) {
 | 
			
		||||
@@ -4532,16 +4480,21 @@ proto.insertPlainText = function ( plainText, isPaste ) {
 | 
			
		||||
 | 
			
		||||
    for ( attr in attributes ) {
 | 
			
		||||
        openBlock += ' ' + attr + '="' +
 | 
			
		||||
            escapeHTMLFragement( attributes[ attr ] ) +
 | 
			
		||||
            escapeHTML( attributes[ attr ] ) +
 | 
			
		||||
        '"';
 | 
			
		||||
    }
 | 
			
		||||
    openBlock += '>';
 | 
			
		||||
 | 
			
		||||
    for ( i = 0, l = lines.length; i < l; i += 1 ) {
 | 
			
		||||
        line = lines[i];
 | 
			
		||||
        line = escapeHTMLFragement( line ).replace( / (?= )/g, ' ' );
 | 
			
		||||
        line = escapeHTML( line ).replace( / (?= )/g, ' ' );
 | 
			
		||||
        // We don't wrap the first line in the block, so if it gets inserted
 | 
			
		||||
        // into a blank line it keeps that line's formatting.
 | 
			
		||||
        // Wrap each line in <div></div>
 | 
			
		||||
        lines[i] = openBlock + ( line || '<BR>' ) + closeBlock;
 | 
			
		||||
        if ( i ) {
 | 
			
		||||
            line = openBlock + ( line || '<BR>' ) + closeBlock;
 | 
			
		||||
        }
 | 
			
		||||
        lines[i] = line;
 | 
			
		||||
    }
 | 
			
		||||
    return this.insertHTML( lines.join( '' ), isPaste );
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -65,10 +65,10 @@
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/*.fade-enter-active {*/
 | 
			
		||||
	.fade-enter-active {
 | 
			
		||||
		animation: fade-in .3s;
 | 
			
		||||
	}
 | 
			
		||||
	/*.fade-leave-active {*/
 | 
			
		||||
	.fade-leave-active {
 | 
			
		||||
		animation: fade-in .1s reverse;
 | 
			
		||||
	}
 | 
			
		||||
	@keyframes fade-in {
 | 
			
		||||
@@ -83,7 +83,7 @@
 | 
			
		||||
</style>
 | 
			
		||||
 | 
			
		||||
<template>
 | 
			
		||||
	<!-- <transition name="fade"> -->
 | 
			
		||||
	<transition name="fade">
 | 
			
		||||
		<div>
 | 
			
		||||
 | 
			
		||||
			<div class="slide-container" :style="{ 'background-color':bgColor, 'color':textColor}">
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user