import $ from 'jquery';
import lists from '../core/lists';
import key from '../core/key';
const defaultScheme = 'http://';
const linkPattern = /^([A-Za-z][A-Za-z0-9+-.]*\:[\/\/]?|mailto:[A-Z0-9._%+-]+@)?(www\.)?(.+)$/i;
export default class AutoLink {
constructor(context) {
this.context = context;
this.events = {
'summernote.keyup': (we, e) => {
Eif (!e.isDefaultPrevented()) {
this.handleKeyup(e);
}
},
'summernote.keydown': (we, e) => {
this.handleKeydown(e);
}
};
}
initialize() {
this.lastWordRange = null;
}
destroy() {
this.lastWordRange = null;
}
replace() {
if (!this.lastWordRange) {
return;
}
const keyword = this.lastWordRange.toString();
const match = keyword.match(linkPattern);
if (match && (match[1] || match[2])) {
const link = match[1] ? keyword : defaultScheme + keyword;
const node = $('<a />').html(keyword).attr('href', link)[0];
this.lastWordRange.insertNode(node);
this.lastWordRange = null;
this.context.invoke('editor.focus');
}
}
handleKeydown(e) {
Iif (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {
const wordRange = this.context.invoke('editor.createRange').getWordRange();
this.lastWordRange = wordRange;
}
}
handleKeyup(e) {
Iif (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {
this.replace();
}
}
}
|