varbase-8.x-4.0-alpha1/libraries/ckeditor/plugins/autolink/plugin.js
libraries/ckeditor/plugins/autolink/plugin.js
/**
* @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
( function() {
'use strict';
var doubleQuoteRegex = /"/g;
CKEDITOR.plugins.add( 'autolink', {
requires: 'clipboard,textmatch',
init: function( editor ) {
var urlTemplate = new CKEDITOR.template( '<a href="{link}">{text}</a>' ),
emailTemplate = new CKEDITOR.template( '<a href="mailto:{link}">{text}</a>' );
editor.on( 'paste', function( evt ) {
if ( evt.data.dataTransfer.getTransferType( editor ) == CKEDITOR.DATA_TRANSFER_INTERNAL ) {
return;
}
var data = evt.data.dataValue;
// If we found "<" it means that most likely there's some tag and we don't want to touch it.
if ( data.indexOf( '<' ) > -1 ) {
return;
}
if ( matchLink( data ) ) {
evt.data.dataValue = getHtmlToInsert( data );
evt.data.type = 'html';
}
} );
// IE has its own link completion and we don't want to interfere with it.
if ( CKEDITOR.env.ie && !CKEDITOR.env.edge ) {
return;
}
var commitKeystrokes = editor.config.autolink_commitKeystrokes || CKEDITOR.config.autolink_commitKeystrokes;
editor.on( 'key', function( evt ) {
if ( editor.mode !== 'wysiwyg' || CKEDITOR.tools.indexOf( commitKeystrokes, evt.data.keyCode ) == -1 ) {
return;
}
var matched = CKEDITOR.plugins.textMatch.match( editor.getSelection().getRanges()[ 0 ], matchCallback );
if ( matched ) {
insertLink( matched );
}
} );
function insertLink( match ) {
var selection = editor.getSelection();
// We don't want to insert a link if selection is already inside another link.
if ( selection.getRanges()[ 0 ].startContainer.getAscendant( 'a', true ) ) {
return;
}
selection.selectRanges( [ match.range ] );
editor.insertHtml( getHtmlToInsert( match.text ), 'text' );
if ( !CKEDITOR.env.webkit ) {
// Make sure that link cannot be modified right after insertion
// by moving selection at the end of inserted node.
var insertionRange = selection.getRanges()[ 0 ],
newRange = editor.createRange();
newRange.setStartAfter( insertionRange.startContainer );
selection.selectRanges( [ newRange ] );
}
}
function tryToEncodeLink( data ) {
// If enabled use link plugin to encode email link.
if ( editor.plugins.link ) {
var link = CKEDITOR.dom.element.createFromHtml( data ),
linkData = CKEDITOR.plugins.link.parseLinkAttributes( editor, link ),
attributes = CKEDITOR.plugins.link.getLinkAttributes( editor, linkData );
if ( !CKEDITOR.tools.isEmpty( attributes.set ) ) {
link.setAttributes( attributes.set );
}
if ( attributes.removed.length ) {
link.removeAttributes( attributes.removed );
}
link.removeAttribute( 'data-cke-saved-href' );
return link.getOuterHtml();
}
return data;
}
function getHtmlToInsert( text ) {
var opts = {
text: text,
link: text.replace( doubleQuoteRegex, '%22' )
},
template = opts.link.match( CKEDITOR.config.autolink_urlRegex ) ?
urlTemplate.output( opts )
: emailTemplate.output( opts );
return tryToEncodeLink( template );
}
function matchCallback( text, offset ) {
var parts = text.slice( 0, offset )
.split( /\s+/ ),
query = parts[ parts.length - 1 ];
if ( !query ) {
return null;
}
if ( !matchLink( query ) ) {
return null;
}
return { start: text.lastIndexOf( query ), end: offset };
}
function matchLink( query ) {
return query.match( CKEDITOR.config.autolink_urlRegex ) ||
query.match( CKEDITOR.config.autolink_emailRegex );
}
}
} );
/**
* The [Auto Link](https://ckeditor.com/cke4/addon/autolink) plugin keystrokes used to finish link completion.
*
* ```javascript
* // Default configuration (13 = Enter, 32 = space).
* config.autolink_commitKeystrokes = [ 9, 13 ];
* ```
*
* Commit keystrokes can be also disabled by setting it to an empty array.
*
* ```javascript
* // Disable autolink commit keystrokes.
* config.autolink_commitKeystrokes = [];
* ```
*
* @since 4.11.0
* @cfg {Number/Number[]} [autolink_commitKeystrokes=[ 13, 32 ]]
* @member CKEDITOR.config
*/
CKEDITOR.config.autolink_commitKeystrokes = [ 13, 32 ];
/**
* Regex used by the [Auto Link](https://ckeditor.com/cke4/addon/autolink) plugin to match URL adresses.
*
* @cfg {RegExp} [autolink_urlRegex]
* @since 4.11.0
* @member CKEDITOR.config
*/
CKEDITOR.config.autolink_urlRegex = /^(https?|ftp):\/\/(-\.)?([^\s\/?\.#]+\.?)+(\/[^\s]*)?[^\s\.,]$/i;
// Regex by Imme Emosol.
/**
* Regex used by the [Auto Link](https://ckeditor.com/cke4/addon/autolink) plugin to match email adresses.
*
* @cfg {RegExp} [autolink_emailRegex]
* @since 4.11.0
* @member CKEDITOR.config
*/
CKEDITOR.config.autolink_emailRegex = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
// Regex by (https://html.spec.whatwg.org/#e-mail-state-(type=email)).
} )();
