code optimize

This commit is contained in:
2018-09-26 15:41:45 +08:00
parent b7aaa2b7f3
commit fa46dc269f
2 changed files with 39 additions and 24 deletions

View File

@ -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 = {

View File

@ -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,