Search keywords on paste
This commit is contained in:
parent
f914d76ce8
commit
09c5247dba
7 changed files with 70 additions and 61 deletions
|
@ -1,4 +1,5 @@
|
||||||
import * as parsers from './parsers';
|
import * as parsers from './parsers';
|
||||||
|
import * as urls from '../../shared/urls';
|
||||||
import TabPresenter from '../presenters/tab';
|
import TabPresenter from '../presenters/tab';
|
||||||
import WindowPresenter from '../presenters/window';
|
import WindowPresenter from '../presenters/window';
|
||||||
import SettingRepository from '../repositories/setting';
|
import SettingRepository from '../repositories/setting';
|
||||||
|
@ -103,6 +104,6 @@ export default class CommandIndicator {
|
||||||
|
|
||||||
async urlOrSearch(keywords) {
|
async urlOrSearch(keywords) {
|
||||||
let settings = await this.settingRepository.get();
|
let settings = await this.settingRepository.get();
|
||||||
return parsers.normalizeUrl(keywords, settings.search);
|
return urls.normalizeUrl(keywords, settings.search);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,27 +1,3 @@
|
||||||
const trimStart = (str) => {
|
|
||||||
// NOTE String.trimStart is available on Firefox 61
|
|
||||||
return str.replace(/^\s+/, '');
|
|
||||||
};
|
|
||||||
|
|
||||||
const normalizeUrl = (keywords, searchSettings) => {
|
|
||||||
try {
|
|
||||||
return new URL(keywords).href;
|
|
||||||
} catch (e) {
|
|
||||||
if (keywords.includes('.') && !keywords.includes(' ')) {
|
|
||||||
return 'http://' + keywords;
|
|
||||||
}
|
|
||||||
let template = searchSettings.engines[searchSettings.default];
|
|
||||||
let query = keywords;
|
|
||||||
|
|
||||||
let first = trimStart(keywords).split(' ')[0];
|
|
||||||
if (Object.keys(searchSettings.engines).includes(first)) {
|
|
||||||
template = searchSettings.engines[first];
|
|
||||||
query = trimStart(trimStart(keywords).slice(first.length));
|
|
||||||
}
|
|
||||||
return template.replace('{}', encodeURIComponent(query));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const mustNumber = (v) => {
|
const mustNumber = (v) => {
|
||||||
let num = Number(v);
|
let num = Number(v);
|
||||||
if (isNaN(num)) {
|
if (isNaN(num)) {
|
||||||
|
@ -52,4 +28,4 @@ const parseSetOption = (word, types) => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export { normalizeUrl, parseSetOption };
|
export { parseSetOption };
|
||||||
|
|
|
@ -83,7 +83,9 @@ const exec = (operation, repeat, settings, addonEnabled) => {
|
||||||
consoleFrames.postInfo(window.document, 'Current url yanked');
|
consoleFrames.postInfo(window.document, 'Current url yanked');
|
||||||
break;
|
break;
|
||||||
case operations.URLS_PASTE:
|
case operations.URLS_PASTE:
|
||||||
urls.paste(window, operation.newTab ? operation.newTab : false);
|
urls.paste(
|
||||||
|
window, operation.newTab ? operation.newTab : false, settings.search
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
browser.runtime.sendMessage({
|
browser.runtime.sendMessage({
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import messages from 'shared/messages';
|
import messages from 'shared/messages';
|
||||||
|
import * as urls from '../shared/urls';
|
||||||
|
|
||||||
const yank = (win) => {
|
const yank = (win) => {
|
||||||
let input = win.document.createElement('input');
|
let input = win.document.createElement('input');
|
||||||
|
@ -14,7 +15,7 @@ const yank = (win) => {
|
||||||
input.remove();
|
input.remove();
|
||||||
};
|
};
|
||||||
|
|
||||||
const paste = (win, newTab) => {
|
const paste = (win, newTab, searchSettings) => {
|
||||||
let textarea = win.document.createElement('textarea');
|
let textarea = win.document.createElement('textarea');
|
||||||
win.document.body.append(textarea);
|
win.document.body.append(textarea);
|
||||||
|
|
||||||
|
@ -24,13 +25,13 @@ const paste = (win, newTab) => {
|
||||||
textarea.focus();
|
textarea.focus();
|
||||||
|
|
||||||
if (win.document.execCommand('paste')) {
|
if (win.document.execCommand('paste')) {
|
||||||
if (/^(https?|ftp):\/\//.test(textarea.textContent)) {
|
let value = textarea.textContent;
|
||||||
browser.runtime.sendMessage({
|
let url = urls.normalizeUrl(value, searchSettings);
|
||||||
type: messages.OPEN_URL,
|
browser.runtime.sendMessage({
|
||||||
url: textarea.textContent,
|
type: messages.OPEN_URL,
|
||||||
newTab: newTab ? newTab : false,
|
url,
|
||||||
});
|
newTab,
|
||||||
}
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
textarea.remove();
|
textarea.remove();
|
||||||
|
|
25
src/shared/urls.js
Normal file
25
src/shared/urls.js
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
const trimStart = (str) => {
|
||||||
|
// NOTE String.trimStart is available on Firefox 61
|
||||||
|
return str.replace(/^\s+/, '');
|
||||||
|
};
|
||||||
|
|
||||||
|
const normalizeUrl = (keywords, searchSettings) => {
|
||||||
|
try {
|
||||||
|
return new URL(keywords).href;
|
||||||
|
} catch (e) {
|
||||||
|
if (keywords.includes('.') && !keywords.includes(' ')) {
|
||||||
|
return 'http://' + keywords;
|
||||||
|
}
|
||||||
|
let template = searchSettings.engines[searchSettings.default];
|
||||||
|
let query = keywords;
|
||||||
|
|
||||||
|
let first = trimStart(keywords).split(' ')[0];
|
||||||
|
if (Object.keys(searchSettings.engines).includes(first)) {
|
||||||
|
template = searchSettings.engines[first];
|
||||||
|
query = trimStart(trimStart(keywords).slice(first.length));
|
||||||
|
}
|
||||||
|
return template.replace('{}', encodeURIComponent(query));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export { normalizeUrl };
|
|
@ -44,30 +44,4 @@ describe("shared/commands/parsers", () => {
|
||||||
expect(() => parsers.parseSetOption('smoothscroll', { smoothscroll: 'number' })).to.throw(Error, 'Invalid');
|
expect(() => parsers.parseSetOption('smoothscroll', { smoothscroll: 'number' })).to.throw(Error, 'Invalid');
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#normalizeUrl', () => {
|
|
||||||
const config = {
|
|
||||||
default: 'google',
|
|
||||||
engines: {
|
|
||||||
google: 'https://google.com/search?q={}',
|
|
||||||
yahoo: 'https://yahoo.com/search?q={}',
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
it('convertes search url', () => {
|
|
||||||
expect(parsers.normalizeUrl('google apple', config))
|
|
||||||
.to.equal('https://google.com/search?q=apple');
|
|
||||||
expect(parsers.normalizeUrl('yahoo apple', config))
|
|
||||||
.to.equal('https://yahoo.com/search?q=apple');
|
|
||||||
expect(parsers.normalizeUrl('google apple banana', config))
|
|
||||||
.to.equal('https://google.com/search?q=apple%20banana');
|
|
||||||
expect(parsers.normalizeUrl('yahoo C++CLI', config))
|
|
||||||
.to.equal('https://yahoo.com/search?q=C%2B%2BCLI');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('user default search engine', () => {
|
|
||||||
expect(parsers.normalizeUrl('apple banana', config))
|
|
||||||
.to.equal('https://google.com/search?q=apple%20banana');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
30
test/shared/urls.test.js
Normal file
30
test/shared/urls.test.js
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
import * as parsers from 'shared/urls';
|
||||||
|
|
||||||
|
describe("shared/commands/parsers", () => {
|
||||||
|
describe('#normalizeUrl', () => {
|
||||||
|
const config = {
|
||||||
|
default: 'google',
|
||||||
|
engines: {
|
||||||
|
google: 'https://google.com/search?q={}',
|
||||||
|
yahoo: 'https://yahoo.com/search?q={}',
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
it('convertes search url', () => {
|
||||||
|
expect(parsers.normalizeUrl('google apple', config))
|
||||||
|
.to.equal('https://google.com/search?q=apple');
|
||||||
|
expect(parsers.normalizeUrl('yahoo apple', config))
|
||||||
|
.to.equal('https://yahoo.com/search?q=apple');
|
||||||
|
expect(parsers.normalizeUrl('google apple banana', config))
|
||||||
|
.to.equal('https://google.com/search?q=apple%20banana');
|
||||||
|
expect(parsers.normalizeUrl('yahoo C++CLI', config))
|
||||||
|
.to.equal('https://yahoo.com/search?q=C%2B%2BCLI');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('user default search engine', () => {
|
||||||
|
expect(parsers.normalizeUrl('apple banana', config))
|
||||||
|
.to.equal('https://google.com/search?q=apple%20banana');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
Reference in a new issue