/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ // Excerpt from ad-block/scripts/generateDataFiles and inspired from ad-block/scripts/check.js const url = require('url'); const path = require('path') const fs = require('fs') const {AdBlockClient, FilterOptions} = require('ad-block'); const { makeAdBlockClientFromDATFile} = require('ad-block/lib/util'); function generateDataFileFromFile(filterRuleFile, outputDATFilename) { const filterRuleData = fs.readFileSync(filterRuleFile, 'utf8'); const client = new AdBlockClient() if (filterRuleData.constructor === Array) { filterRuleData.forEach(filterRuleDataItem => client.parse(filterRuleDataItem)) } else { client.parse(filterRuleData) } console.log('Parsing stats:', client.getParsingStats()) const serializedData = client.serialize() if (!fs.existsSync('data')) { fs.mkdirSync('./data') } fs.writeFileSync(path.join('data', outputDATFilename), serializedData) } function processURLs(urls, location, dataFile) { return makeAdBlockClientFromDATFile(dataFile) .then((adBlockClient) => { const parsedUrl = url.parse(location); let match = 0; let nomatch = 0; urls.forEach(async(href) => { if (adBlockClient.matches(href, FilterOptions.noFilterOption, parsedUrl.host)) { match++; } else { nomatch++; } }); return { match, nomatch, total: match + nomatch }; }) .catch((err) => { return err; }); } function urlProcessor() { const clients = { }; return async (href, location, dataFile) => { if (typeof clients[dataFile] === 'undefined') { clients[dataFile] = await makeAdBlockClientFromDATFile(dataFile); } const parsedUrl = url.parse(location); return clients[dataFile].matches(href, FilterOptions.noFilterOption, parsedUrl.host); } } module.exports = { generateDataFileFromFile, urlProcessor, processURLs };