diff --git a/scripts/content.js b/scripts/content.js index 03234d1..b3a76bd 100644 --- a/scripts/content.js +++ b/scripts/content.js @@ -3,7 +3,7 @@ // console.log(request); switch (request.from) { case "DataExtracter:Extract": - let data = extractData(request.itemsSelector, request.fieldSelectors); + let data = extractTabData(request.itemsSelector, request.fieldSelectors); if (sendResponse) sendResponse(data); break; case "DataExtracter:GotoUrl": @@ -22,7 +22,7 @@ } ); -function extractData(itemsSelector, fieldSelectors) { +function extractTabData(itemsSelector, fieldSelectors) { return $(itemsSelector).toArray().map( item => fieldSelectors.map( selector => { @@ -69,7 +69,9 @@ extract('.list-item', ['a.title', 'a.title@href']) return; } if (args.length == 2) { - saveFileAsk(extractData(args[0], args[1])); + let data = extractTabData(args[0], args[1]); + data.unshift(args[1]); + saveFileAsk(data); return; } let message = { diff --git a/scripts/extract.js b/scripts/extract.js index 6f8918d..2271d27 100644 --- a/scripts/extract.js +++ b/scripts/extract.js @@ -4,21 +4,36 @@ * @param {Array} 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] */ -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} 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 listOrTempl = args.shift(); - if (listOrTempl instanceof Array) { - urls = listOrTempl; - } else if (url) { - let urlTempl = listOrTempl; - 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 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)); + } } } } @@ -35,20 +50,18 @@ function extract(itemsSelector, fieldSelectors, ...args) { results => { data.push(...results); return redirectTab(tab, url).then( - () => extractData(tab, itemsSelector, fieldSelectors) + () => extractTabData(tab, itemsSelector, fieldSelectors) ); }, () => p ), Promise.resolve([])); } else { - pms = extractData(tab, itemsSelector, fieldSelectors); + pms = extractTabData(tab, itemsSelector, fieldSelectors); } pms.then( results => { data.push(...results); - data.unshift(fieldSelectors); - saveFileAsk(data); - resolve("save done.") + resolve(data); }, 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 {string} itemsSelector items selectors for selecting items (data rows) * @param {Array} fieldSelectors fields selectors for selecting fields (data columns) under each item * @returns {Promise} a promise of extracted data */ -function extractData(tab, itemsSelector, fieldSelectors) { +function extractTabData(tab, itemsSelector, fieldSelectors) { let req = { from: "DataExtracter:Extract", itemsSelector: itemsSelector,