| Left: | ||
| Right: |
| OLD | NEW |
|---|---|
| 1 "use strict"; | |
| 2 | |
| 1 var readline = require("readline"); | 3 var readline = require("readline"); |
| 2 var punycode = require("punycode"); | 4 var punycode = require("punycode"); |
| 3 var tldjs = require("tldjs"); | 5 var tldjs = require("tldjs"); |
| 4 var filterClasses = require("./adblockplus.js"); | 6 var filterClasses = require("./adblockplus.js"); |
| 5 | 7 |
| 6 var typeMap = filterClasses.RegExpFilter.typeMap; | 8 var typeMap = filterClasses.RegExpFilter.typeMap; |
| 7 | 9 |
| 8 var requestFilters = []; | 10 var requestFilters = []; |
| 9 var requestExceptions = []; | 11 var requestExceptions = []; |
| 10 var elemhideFilters = []; | 12 var elemhideFilters = []; |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 91 | 93 |
| 92 function convertElemHideFilter(filter) | 94 function convertElemHideFilter(filter) |
| 93 { | 95 { |
| 94 var included = []; | 96 var included = []; |
| 95 var excluded = []; | 97 var excluded = []; |
| 96 var rules = []; | 98 var rules = []; |
| 97 | 99 |
| 98 parseDomains(filter.domains, included, excluded); | 100 parseDomains(filter.domains, included, excluded); |
| 99 | 101 |
| 100 if (excluded.length == 0 && !(filter.selector in elemhideSelectorExceptions)) | 102 if (excluded.length == 0 && !(filter.selector in elemhideSelectorExceptions)) |
| 101 { | 103 return [included.map(matchDomain), filter.selector]; |
| 102 var action = { | |
| 103 type: "css-display-none", | |
| 104 selector: filter.selector | |
| 105 }; | |
| 106 | |
| 107 for (var i = 0; i < included.length; i++) | |
| 108 rules.push({ | |
| 109 trigger: {"url-filter": matchDomain(included[i])}, | |
| 110 action: action | |
| 111 }); | |
| 112 | |
| 113 if (included.length == 0) | |
| 114 rules.push({ | |
| 115 trigger: {"url-filter": "^https?://"}, | |
| 116 action: action | |
| 117 }); | |
| 118 } | |
| 119 | |
| 120 return rules; | |
| 121 } | 104 } |
| 122 | 105 |
| 123 function toRegExp(text) | 106 function toRegExp(text) |
| 124 { | 107 { |
| 125 var result = ""; | 108 var result = ""; |
| 126 var lastIndex = text.length - 1; | 109 var lastIndex = text.length - 1; |
| 127 | 110 |
| 128 for (var i = 0; i < text.length; i++) | 111 for (var i = 0; i < text.length; i++) |
| 129 { | 112 { |
| 130 var c = text[i]; | 113 var c = text[i]; |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 276 { | 259 { |
| 277 var rules = []; | 260 var rules = []; |
| 278 var i; | 261 var i; |
| 279 | 262 |
| 280 function addRule(rule) | 263 function addRule(rule) |
| 281 { | 264 { |
| 282 if (!hasNonASCI(rule)) | 265 if (!hasNonASCI(rule)) |
| 283 rules.push(rule); | 266 rules.push(rule); |
| 284 } | 267 } |
| 285 | 268 |
| 286 // HACK: We ignore element hiding filter for now to get the list of | 269 let groupedElemhideFilters = new Map(); |
| 287 // rules down below 50K. This limit is enforced by iOS and Safari. | 270 for (let filter of elemhideFilters) |
|
Sebastian Noack
2016/02/15 14:33:11
Does these ES2015 features even work in node.js wi
kzar
2016/02/15 18:19:20
(As discussed in IRC we will use ES2015 features t
| |
| 288 // To be undone with https://issues.adblockplus.org/ticket/3585 | 271 { |
| 272 let result = convertElemHideFilter(filter); | |
| 273 if (!result) | |
| 274 continue; | |
| 275 let targetDomains = result[0]; | |
| 276 let selector = result[1]; | |
| 289 | 277 |
| 290 //for (i = 0; i < elemhideFilters.length; i++) | 278 if (targetDomains.length == 0) |
| 291 // convertElemHideFilter(elemhideFilters[i]).forEach(addRule); | 279 targetDomains = ["^https?://"]; |
| 292 //for (i = 0; i < elemhideExceptions.length; i++) | 280 |
| 293 // addRule(convertFilter(elemhideExceptions[i], "ignore-previous-rules", fals e)); | 281 for (let domain of targetDomains) |
| 282 { | |
| 283 if (!groupedElemhideFilters.has(domain)) | |
| 284 groupedElemhideFilters.set(domain, []); | |
| 285 groupedElemhideFilters.get(domain).push(selector); | |
| 286 } | |
| 287 } | |
| 288 | |
| 289 groupedElemhideFilters.forEach((selectors, domain) => | |
| 290 { | |
| 291 let rule = {trigger: {"url-filter": domain}, | |
| 292 action: {type: "css-display-none"}}; | |
| 293 | |
| 294 if (selectors.length == 1) | |
| 295 rule["action"]["selector"] = selectors[0]; | |
| 296 else | |
| 297 rule["action"]["selector"] = ":matches(" + selectors.join(", ") + ")"; | |
|
kzar
2016/02/13 19:33:24
Note: I wasn't sure if we need to escape the selec
Sebastian Noack
2016/02/15 14:33:11
Well, if any CSS selector is invalid it will break
kzar
2016/02/15 18:19:20
Acknowledged.
| |
| 298 | |
| 299 addRule(rule); | |
| 300 }); | |
| 301 | |
| 302 for (i = 0; i < elemhideExceptions.length; i++) | |
| 303 addRule(convertFilter(elemhideExceptions[i], "ignore-previous-rules", false) ); | |
| 294 | 304 |
| 295 for (i = 0; i < requestFilters.length; i++) | 305 for (i = 0; i < requestFilters.length; i++) |
| 296 addRule(convertFilter(requestFilters[i], "block", true)); | 306 addRule(convertFilter(requestFilters[i], "block", true)); |
| 297 for (i = 0; i < requestExceptions.length; i++) | 307 for (i = 0; i < requestExceptions.length; i++) |
| 298 addRule(convertFilter(requestExceptions[i], "ignore-previous-rules", true)); | 308 addRule(convertFilter(requestExceptions[i], "ignore-previous-rules", true)); |
| 299 | 309 |
| 300 console.log(JSON.stringify(rules, null, "\t")); | 310 console.log(JSON.stringify(rules, null, "\t")); |
| 301 } | 311 } |
| 302 | 312 |
| 303 var rl = readline.createInterface({input: process.stdin, terminal: false}); | 313 var rl = readline.createInterface({input: process.stdin, terminal: false}); |
| 304 rl.on("line", parseFilter); | 314 rl.on("line", parseFilter); |
| 305 rl.on("close", logRules); | 315 rl.on("close", logRules); |
| OLD | NEW |