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 urls from '../../shared/urls'; | ||||
| import TabPresenter from '../presenters/tab'; | ||||
| import WindowPresenter from '../presenters/window'; | ||||
| import SettingRepository from '../repositories/setting'; | ||||
|  | @ -103,6 +104,6 @@ export default class CommandIndicator { | |||
| 
 | ||||
|   async urlOrSearch(keywords) { | ||||
|     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) => { | ||||
|   let num = Number(v); | ||||
|   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'); | ||||
|     break; | ||||
|   case operations.URLS_PASTE: | ||||
|     urls.paste(window, operation.newTab ? operation.newTab : false); | ||||
|     urls.paste( | ||||
|       window, operation.newTab ? operation.newTab : false, settings.search | ||||
|     ); | ||||
|     break; | ||||
|   default: | ||||
|     browser.runtime.sendMessage({ | ||||
|  |  | |||
|  | @ -1,4 +1,5 @@ | |||
| import messages from 'shared/messages'; | ||||
| import * as urls from '../shared/urls'; | ||||
| 
 | ||||
| const yank = (win) => { | ||||
|   let input = win.document.createElement('input'); | ||||
|  | @ -14,7 +15,7 @@ const yank = (win) => { | |||
|   input.remove(); | ||||
| }; | ||||
| 
 | ||||
| const paste = (win, newTab) => { | ||||
| const paste = (win, newTab, searchSettings) => { | ||||
|   let textarea = win.document.createElement('textarea'); | ||||
|   win.document.body.append(textarea); | ||||
| 
 | ||||
|  | @ -24,13 +25,13 @@ const paste = (win, newTab) => { | |||
|   textarea.focus(); | ||||
| 
 | ||||
|   if (win.document.execCommand('paste')) { | ||||
|     if (/^(https?|ftp):\/\//.test(textarea.textContent)) { | ||||
|       browser.runtime.sendMessage({ | ||||
|         type: messages.OPEN_URL, | ||||
|         url: textarea.textContent, | ||||
|         newTab: newTab ? newTab : false, | ||||
|       }); | ||||
|     } | ||||
|     let value = textarea.textContent; | ||||
|     let url = urls.normalizeUrl(value, searchSettings); | ||||
|     browser.runtime.sendMessage({ | ||||
|       type: messages.OPEN_URL, | ||||
|       url, | ||||
|       newTab, | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   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'); | ||||
|     }) | ||||
|   }); | ||||
| 
 | ||||
|   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