chrome.runtime.onMessage.addListener( function (request, sender, sendResponse) { // console.log(request); switch (request.from) { case "DataExtracter:Extract": let data = extractTabData(request.itemsSelector, request.fieldSelectors); if (sendResponse) sendResponse(data); break; case "DataExtracter:GotoUrl": window.location.replace(request.url); if (sendResponse) sendResponse(request.url); break; case "DataExtracter:ReportIn": if (sendResponse) sendResponse(request.from); break; case "DataExtracter:QueryUrl": if (sendResponse) sendResponse(window.location.href); break; default: break; } } ); function extractTabData(itemsSelector, fieldSelectors) { return $(itemsSelector).toArray().map( item => fieldSelectors.map( selector => { let [cls, attr] = selector.split('@').slice(0, 2); return $(item).find(cls).toArray().map(find => attr ? find[attr] : find.textContent.trim()).join('\n') } ) ); } function extract(...args) { let sig = ` # DataExtracter Help ---------------------------- ## Signitures: ---------------------------- function extract(itemsSelector:string, fieldSelectors:string[]) function extract(itemsSelector:string, fieldSelectors:string[], url:string, from:number, to:number, interval:number) function extract(itemsSelector:string, fieldSelectors:string, url:string, pages:number[]) function extract(itemsSelector:string, fieldSelectors:string[], urls:string[]) ## Examples: ---------------------------- ### Extract current page extract(".list-item", ["a.title", "p.content"]) ### Extract multiple pages (1-10, interval 1) extract(".list-item", ["a.title", "p.content"],"http://sample.com/?pn=\${page}", 1, 10, 1) ### Extract multiple urls (list) extract(".list-item", ["a.title", "p.content"],["http://sample.com/abc","http://sample.com/xyz"]) ### Extract specified pages (1,3,5) extract(".list-item", ["a.title", "p.content"], "http://sample.com/?pn=\${page}", [1, 3, 5]) ## Advanced Examples: ---------------------------- ### Extract link text and target (use 'selector@attribute') extract('.list-item', ['a.title', 'a.title@href']) `.trim(); if (!testArgs(...args)) { console.log(sig); return; } if (args.length == 2) { let data = extractTabData(args[0], args[1]); data.unshift(args[1]); saveFileAsk(data); return; } let message = { from: "DataExtracter:Extract", args: args } chrome.runtime.sendMessage(message, r => { if (r) { console.log(r); alert(r); } }); } function testArgs(...args) { if (args.length < 2) return false; if (args.length == 2) return (args[0] && args[1] && (typeof args[0] == "string") && (args[1] instanceof Array)) let urls = []; if (args.length > 2) return (typeof args[2] == "string") && ( (args[3] instanceof Array) || (!isNaN(args[3]) && !isNaN(args[4]) && !isNaN(args[5])) ) }