Skip to content

Commit

Permalink
Merge 375921b into 9909070
Browse files Browse the repository at this point in the history
  • Loading branch information
lqez committed Aug 21, 2018
2 parents 9909070 + 375921b commit 406a4f5
Show file tree
Hide file tree
Showing 9 changed files with 97 additions and 9 deletions.
12 changes: 8 additions & 4 deletions src/js/base/module/Editor.js
Expand Up @@ -196,9 +196,12 @@ export default class Editor {
if (this.options.onCreateLink) {
linkUrl = this.options.onCreateLink(linkUrl);
} else {
// if url doesn't match an URL schema, set http:// as default
linkUrl = /^[A-Za-z][A-Za-z0-9+-.]*\:[\/\/]?/.test(linkUrl)
? linkUrl : 'http://' + linkUrl;
// if url is not relative,
if (!/^\.?\/(.*)/.test(linkUrl)) {
// if url doesn't match an URL schema, set http:// as default
linkUrl = /^[A-Za-z][A-Za-z0-9+-.]*\:[\/\/]?/.test(linkUrl)
? linkUrl : 'http://' + linkUrl;
}
}

let anchors = [];
Expand Down Expand Up @@ -726,8 +729,9 @@ export default class Editor {
url: $anchor.length ? $anchor.attr('href') : ''
};

// Define isNewWindow when anchor exists.
// When anchor exists,
if ($anchor.length) {
// Set isNewWindow by checking its target.
linkInfo.isNewWindow = $anchor.attr('target') === '_blank';
}

Expand Down
6 changes: 3 additions & 3 deletions src/js/base/module/LinkDialog.js
Expand Up @@ -80,7 +80,7 @@ export default class LinkDialog {
const $linkText = this.$dialog.find('.note-link-text');
const $linkUrl = this.$dialog.find('.note-link-url');
const $linkBtn = this.$dialog.find('.note-link-btn');
const $openInNewWindow = this.$dialog.find('input[type=checkbox]');
const $openInNewWindow = this.$dialog.find('#sn-checkbox-open-in-new-window');

this.ui.onDialogShown(this.$dialog, () => {
this.context.triggerEvent('dialog.shown');
Expand Down Expand Up @@ -124,10 +124,10 @@ export default class LinkDialog {
this.bindEnterKey($linkUrl, $linkBtn);
this.bindEnterKey($linkText, $linkBtn);

const isChecked = linkInfo.isNewWindow !== undefined
const isNewWindowChecked = linkInfo.isNewWindow !== undefined
? linkInfo.isNewWindow : this.context.options.linkTargetBlank;

$openInNewWindow.prop('checked', isChecked);
$openInNewWindow.prop('checked', isNewWindowChecked);

$linkBtn.one('click', (event) => {
event.preventDefault();
Expand Down
3 changes: 2 additions & 1 deletion src/js/base/summernote-en-US.js
Expand Up @@ -54,7 +54,8 @@ $.extend($.summernote.lang, {
edit: 'Edit',
textToDisplay: 'Text to display',
url: 'To what URL should this link go?',
openInNewWindow: 'Open in new window'
openInNewWindow: 'Open in new window',
isRelativeUrl: 'Relative URL'
},
table: {
table: 'Table',
Expand Down
1 change: 1 addition & 0 deletions src/js/bs3/settings.js
Expand Up @@ -109,6 +109,7 @@ $.summernote = $.extend($.summernote, {
width: null,
height: null,
linkTargetBlank: true,
linkRelativeUrl: false,

focus: false,
tabSize: 4,
Expand Down
1 change: 1 addition & 0 deletions src/js/bs4/settings.js
Expand Up @@ -109,6 +109,7 @@ $.summernote = $.extend($.summernote, {
width: null,
height: null,
linkTargetBlank: true,
linkRelativeUrl: false,

focus: false,
tabSize: 4,
Expand Down
2 changes: 2 additions & 0 deletions src/js/lite/settings.js
Expand Up @@ -105,6 +105,8 @@ $.summernote = $.extend($.summernote, {

width: null,
height: null,
linkTargetBlank: true,
linkRelativeUrl: false,

focus: false,
tabSize: 4,
Expand Down
5 changes: 4 additions & 1 deletion src/js/lite/ui.js
Expand Up @@ -455,7 +455,10 @@ const linkDialog = function(opt) {
? '<div class="checkbox">' +
'<label>' + '<input type="checkbox" checked> ' + opt.lang.link.openInNewWindow + '</label>' +
'</div>' : ''
);
) +
'<div class="checkbox">' +
'<label>' + '<input type="checkbox" checked> ' + opt.lang.link.isRelativeUrl + '</label>' +
'</div>';
const footer = [
'<button href="#" type="button" class="note-btn note-btn-primary note-link-btn disabled" disabled>',
opt.lang.link.insert,
Expand Down
20 changes: 20 additions & 0 deletions test/unit/base/module/Editor.spec.js
Expand Up @@ -371,6 +371,26 @@ describe('Editor', () => {
expectContents(context, '<p><a href="http://summernote.org" target="_blank">summernote</a></p>');
});

it('should create a relative link without scheme', () => {
var text = 'hello';
var editable = context.layoutInfo.editable;
var pNode = editable.find('p')[0];
var textNode = pNode.childNodes[0];
var startIndex = textNode.wholeText.indexOf(text);
var endIndex = startIndex + text.length;

var rng = range.create(textNode, startIndex, textNode, endIndex);

editor.createLink({
url: '/relative/url',
text: 'summernote',
range: rng,
isNewWindow: true
});

expectContents(context, '<p><a href="/relative/url" target="_blank">summernote</a></p>');
});

it('should modify a link', () => {
context.invoke('code', '<p><a href="http://summernote.org">hello world</a></p>');

Expand Down
56 changes: 56 additions & 0 deletions test/unit/base/module/LinkDialog.spec.js
@@ -0,0 +1,56 @@
/**
* LinkDialog.spec.js
* (c) 2015~ Summernote Team
* summernote may be freely distributed under the MIT license./
*/
import chai from 'chai';
import $ from 'jquery';
import range from '../../../../src/js/base/core/range';
import Context from '../../../../src/js/base/Context';
import LinkDialog from '../../../../src/js/base/module/LinkDialog';

var expect = chai.expect;

describe('bs:module.LinkDialog', () => {
var context, dialog, $editable;

beforeEach(() => {
var options = $.extend({}, $.summernote.options);
options.langInfo = $.extend(true, {}, $.summernote.lang['en-US'], $.summernote.lang[options.lang]);
options.toolbar = [
['insert', ['link']]
];
context = new Context(
$('<div>' +
'<p><a href="https://summernote.org/" target="_blank">hello</a></p>' +
'<p><a href="https://summernote.org/">world</a></p>' +
'</div>'),
options
);
context.initialize();

dialog = new LinkDialog(context);
dialog.initialize();

$editable = context.layoutInfo.editable;
$editable.appendTo('body');
});

describe('LinkDialog', () => {
it('should check new window when target=_blank', () => {
range.createFromNode($editable.find('a')[0]).normalize().select();
dialog.show();

var checked = dialog.$dialog.find('#sn-checkbox-open-in-new-window').is(':checked');
expect(checked).to.be.true;
});

it('should uncheck new window without target=_blank', () => {
range.createFromNode($editable.find('a')[1]).normalize().select();
dialog.show();

var checked = dialog.$dialog.find('#sn-checkbox-open-in-new-window').is(':checked');
expect(checked).to.be.false;
});
});
});

0 comments on commit 406a4f5

Please sign in to comment.