code optimize
This commit is contained in:
		| @ -3,7 +3,7 @@ | |||||||
|         // console.log(request); |         // console.log(request); | ||||||
|         switch (request.from) { |         switch (request.from) { | ||||||
|             case "DataExtracter:Extract": |             case "DataExtracter:Extract": | ||||||
|                 let data = extractData(request.itemsSelector, request.fieldSelectors); |                 let data = extractTabData(request.itemsSelector, request.fieldSelectors); | ||||||
|                 if (sendResponse) sendResponse(data); |                 if (sendResponse) sendResponse(data); | ||||||
|                 break; |                 break; | ||||||
|             case "DataExtracter:GotoUrl": |             case "DataExtracter:GotoUrl": | ||||||
| @ -22,7 +22,7 @@ | |||||||
|     } |     } | ||||||
| ); | ); | ||||||
|  |  | ||||||
| function extractData(itemsSelector, fieldSelectors) { | function extractTabData(itemsSelector, fieldSelectors) { | ||||||
|     return $(itemsSelector).toArray().map( |     return $(itemsSelector).toArray().map( | ||||||
|         item => fieldSelectors.map( |         item => fieldSelectors.map( | ||||||
|             selector => { |             selector => { | ||||||
| @ -69,7 +69,9 @@ extract('.list-item', ['a.title', 'a.title@href']) | |||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     if (args.length == 2) { |     if (args.length == 2) { | ||||||
|         saveFileAsk(extractData(args[0], args[1])); |         let data = extractTabData(args[0], args[1]); | ||||||
|  |         data.unshift(args[1]); | ||||||
|  |         saveFileAsk(data); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|     let message = { |     let message = { | ||||||
|  | |||||||
| @ -4,21 +4,36 @@ | |||||||
|  * @param {Array<string>} fieldSelectors fields selectors for selecting fields (data columns) under each item |  * @param {Array<string>} fieldSelectors fields selectors for selecting fields (data columns) under each item | ||||||
|  * @param {...any} args url list / url templates, page numers, either [from, to, interval] or [...pages] |  * @param {...any} args url list / url templates, page numers, either [from, to, interval] or [...pages] | ||||||
|  */ |  */ | ||||||
| function extract(itemsSelector, fieldSelectors, ...args) { | async function extract(itemsSelector, fieldSelectors, ...args) { | ||||||
|  |     let data = await extractData(itemsSelector, fieldSelectors, ...args); | ||||||
|  |     data.unshift(fieldSelectors); | ||||||
|  |     saveFileAsk(data); | ||||||
|  |     resolve("save done.") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Extract data from current tab / multiple urls. | ||||||
|  |  * @param {string} itemsSelector items selectors for selecting items (data rows) | ||||||
|  |  * @param {Array<string>} fieldSelectors fields selectors for selecting fields (data columns) under each item | ||||||
|  |  * @param {...any} args url list / url templates, page numers, either [from, to, interval] or [...pages] | ||||||
|  |  */ | ||||||
|  | async function extractData(itemsSelector, fieldSelectors, ...args) { | ||||||
|     let urls = []; |     let urls = []; | ||||||
|     let listOrTempl = args.shift(); |     let arg = args.shift(); | ||||||
|     if (listOrTempl instanceof Array) { |     if (arg instanceof Array) { | ||||||
|         urls = listOrTempl; |         urls = arg; | ||||||
|     } else if (url) { |     } else { | ||||||
|         let urlTempl = listOrTempl; |         let urlTempl = arg; | ||||||
|         if (args[0] instanceof Array) { |         if (urlTempl) { | ||||||
|             urls = args[0].map(p => urlTempl.replace("${page}", p)); |             if (args[0] instanceof Array) { | ||||||
|         } else if (args.length >= 3) { |                 urls = args[0].map(p => urlTempl.replace("${page}", p)); | ||||||
|             let from = args.shift(); |             } else if (args.length >= 3) { | ||||||
|             let to = args.shift(); |                 let from = args.shift(); | ||||||
|             let interval = args.shift(); |                 let to = args.shift(); | ||||||
|             for (let i = from; i <= to; i += interval) { |                 let interval = args.shift(); | ||||||
|                 urls.push(urlTempl.replace("${page}", i)); |                 for (let i = from; i <= to; i += interval) { | ||||||
|  |                     urls.push(urlTempl.replace("${page}", i)); | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -35,20 +50,18 @@ function extract(itemsSelector, fieldSelectors, ...args) { | |||||||
|                     results => { |                     results => { | ||||||
|                         data.push(...results); |                         data.push(...results); | ||||||
|                         return redirectTab(tab, url).then( |                         return redirectTab(tab, url).then( | ||||||
|                             () => extractData(tab, itemsSelector, fieldSelectors) |                             () => extractTabData(tab, itemsSelector, fieldSelectors) | ||||||
|                         ); |                         ); | ||||||
|                     }, |                     }, | ||||||
|                     () => p |                     () => p | ||||||
|                 ), Promise.resolve([])); |                 ), Promise.resolve([])); | ||||||
|             } else { |             } else { | ||||||
|                 pms = extractData(tab, itemsSelector, fieldSelectors); |                 pms = extractTabData(tab, itemsSelector, fieldSelectors); | ||||||
|             } |             } | ||||||
|             pms.then( |             pms.then( | ||||||
|                 results => { |                 results => { | ||||||
|                     data.push(...results); |                     data.push(...results); | ||||||
|                     data.unshift(fieldSelectors); |                     resolve(data); | ||||||
|                     saveFileAsk(data); |  | ||||||
|                     resolve("save done.") |  | ||||||
|                 }, |                 }, | ||||||
|                 err => reject(err) |                 err => reject(err) | ||||||
|             ); |             ); | ||||||
| @ -74,13 +87,13 @@ function redirectTab(tab, url) { | |||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * extract data in from the target tab, usually used to detect if the content script is ready. |  * extract data in from the target tab. | ||||||
|  * @param {any} tab target tab |  * @param {any} tab target tab | ||||||
|  * @param {string} itemsSelector items selectors for selecting items (data rows) |  * @param {string} itemsSelector items selectors for selecting items (data rows) | ||||||
|  * @param {Array<string>} fieldSelectors fields selectors for selecting fields (data columns) under each item |  * @param {Array<string>} fieldSelectors fields selectors for selecting fields (data columns) under each item | ||||||
|  * @returns {Promise<string[]>} a promise of extracted data |  * @returns {Promise<string[]>} a promise of extracted data | ||||||
|  */ |  */ | ||||||
| function extractData(tab, itemsSelector, fieldSelectors) { | function extractTabData(tab, itemsSelector, fieldSelectors) { | ||||||
|     let req = { |     let req = { | ||||||
|         from: "DataExtracter:Extract", |         from: "DataExtracter:Extract", | ||||||
|         itemsSelector: itemsSelector, |         itemsSelector: itemsSelector, | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user