refactor
This commit is contained in:
		| @ -5,9 +5,12 @@ | ||||
|  * @param {...any} args url list / url templates, page numers, either [from, to, interval] or [...pages] | ||||
|  */ | ||||
| async function extract(itemsSelector, fieldSelectors, ...args) { | ||||
|     let data = await getData(itemsSelector, fieldSelectors, ...args); | ||||
|     data.unshift(fieldSelectors); | ||||
|     saveFileAsk(data); | ||||
|     let result = await getData(itemsSelector, fieldSelectors, ...args); | ||||
|     if (confirm( | ||||
|             `Click confirm to download if the sample data looks good (${result.data.length} items):\n\n${result.toString(50) || "- Empty -"}` | ||||
|         )) { | ||||
|         saveFile(result, "text/csv"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** | ||||
| @ -18,53 +21,51 @@ async function extract(itemsSelector, fieldSelectors, ...args) { | ||||
|  */ | ||||
| async function getData(itemsSelector, fieldSelectors, ...args) { | ||||
|     let urls = []; | ||||
|     let arg = args.shift(); | ||||
|     if (arg instanceof Array) { | ||||
|         urls = arg; | ||||
|     } else { | ||||
|         let urlTempl = arg; | ||||
|         if (urlTempl) { | ||||
|             if (args[0] instanceof Array) { | ||||
|                 urls = args[0].map(p => urlTempl.replace("${page}", p)); | ||||
|             } else if (args.length >= 3) { | ||||
|                 let from = args.shift(); | ||||
|                 let to = args.shift(); | ||||
|                 let interval = args.shift(); | ||||
|                 for (let i = from; i <= to; i += interval) { | ||||
|                     urls.push(urlTempl.replace("${page}", i)); | ||||
|     if (args.length) { | ||||
|         let arg = args.shift(); | ||||
|         if (arg instanceof Array) { | ||||
|             urls = arg; | ||||
|         } else { | ||||
|             let urlTempl = arg; | ||||
|             if (urlTempl) { | ||||
|                 if (args[0] instanceof Array) { | ||||
|                     urls = args[0].map(p => urlTempl.replace("${page}", p)); | ||||
|                 } else if (args.length >= 3) { | ||||
|                     let from = args.shift(); | ||||
|                     let to = args.shift(); | ||||
|                     let interval = args.shift(); | ||||
|                     for (let i = from; i <= to; i += interval) { | ||||
|                         urls.push(urlTempl.replace("${page}", i)); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     let data = []; | ||||
|     let tab = await getActiveTab(true) || await getActiveTab(false); | ||||
|     if (!tab) throw new Error("Cannot find active tab."); | ||||
|     return new Promise((resolve, reject) => { | ||||
|         chrome.tabs.query({ | ||||
|             active: true, | ||||
|             currentWindow: false | ||||
|         }, function (tabs) { | ||||
|             let pms; | ||||
|             let tab = tabs[0]; | ||||
|             if (urls.length) { | ||||
|                 pms = urls.reduce((p, url) => p.then( | ||||
|                     results => { | ||||
|                         data.push(...results); | ||||
|                         return redirectTab(tab, url).then( | ||||
|                             () => extractTabData(tab, itemsSelector, fieldSelectors) | ||||
|                         ); | ||||
|                     }, | ||||
|                     () => p | ||||
|                 ), Promise.resolve([])); | ||||
|             } else { | ||||
|                 pms = extractTabData(tab, itemsSelector, fieldSelectors); | ||||
|             } | ||||
|             pms.then( | ||||
|         let pms; | ||||
|         if (urls.length) { | ||||
|             pms = urls.reduce((p, url) => p.then( | ||||
|                 results => { | ||||
|                     data.push(...results); | ||||
|                     resolve(data); | ||||
|                     return redirectTab(tab, url).then( | ||||
|                         () => extractTabData(tab, itemsSelector, fieldSelectors) | ||||
|                     ); | ||||
|                 }, | ||||
|                 err => reject(err) | ||||
|             ); | ||||
|         }); | ||||
|                 () => p | ||||
|             ), Promise.resolve([])); | ||||
|         } else { | ||||
|             pms = extractTabData(tab, itemsSelector, fieldSelectors); | ||||
|         } | ||||
|         pms.then( | ||||
|             results => { | ||||
|                 data.push(...results); | ||||
|                 resolve(new CSV(data)); | ||||
|             }, | ||||
|             err => reject(err) | ||||
|         ); | ||||
|     }); | ||||
| } | ||||
|  | ||||
| @ -163,4 +164,15 @@ function sendMessage(tab, req, cond, failedTimeOut, detectInterval) { | ||||
|             }); | ||||
|         } | ||||
|     }); | ||||
| } | ||||
|  | ||||
| async function getActiveTab(currentWindow) { | ||||
|     return new Promise((resolve, reject) => { | ||||
|         chrome.tabs.query({ | ||||
|             active: true, | ||||
|             currentWindow: currentWindow | ||||
|         }, function (tabs) { | ||||
|             resolve(tabs[0]); | ||||
|         }) | ||||
|     }) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user