|
1 | 1 |
|
2 | 2 | /** |
3 | 3 | * AdGuard Scriptlets |
4 | | - * Version 1.5.14 |
| 4 | + * Version 1.5.16 |
5 | 5 | */ |
6 | 6 |
|
7 | 7 | (function () { |
|
6247 | 6247 | var REMOVE_CLASS_ALIASES = scriptletList[REMOVE_CLASS_METHOD].names; |
6248 | 6248 | var ADG_REMOVE_ATTR_NAME = REMOVE_ATTR_ALIASES[0]; |
6249 | 6249 | var ADG_REMOVE_CLASS_NAME = REMOVE_CLASS_ALIASES[0]; |
| 6250 | + var REMOVE_ATTR_CLASS_APPLYING = ['asap', 'stay', 'complete']; |
6250 | 6251 | /** |
6251 | 6252 | * Returns array of strings separated by space which not in quotes |
6252 | 6253 | * @param {string} str |
|
6270 | 6271 | return acc; |
6271 | 6272 | }, str); |
6272 | 6273 | }; |
| 6274 | + |
| 6275 | + var splitArgs = function splitArgs(str) { |
| 6276 | + var args = []; |
| 6277 | + var prevArgStart = 0; |
| 6278 | + |
| 6279 | + for (var i = 0; i < str.length; i += 1) { |
| 6280 | + // do not split args by escaped comma |
| 6281 | + // https://github.com/AdguardTeam/Scriptlets/issues/133 |
| 6282 | + if (str[i] === COMMA_SEPARATOR && str[i - 1] !== '\\') { |
| 6283 | + args.push(str.slice(prevArgStart, i).trim()); |
| 6284 | + prevArgStart = i + 1; |
| 6285 | + } |
| 6286 | + } // collect arg after last comma |
| 6287 | + |
| 6288 | + |
| 6289 | + args.push(str.slice(prevArgStart, str.length).trim()); |
| 6290 | + return args; |
| 6291 | + }; |
6273 | 6292 | /** |
6274 | | - * Converts string of UBO scriptlet rule to AdGuard scritlet rule |
| 6293 | + * Converts string of UBO scriptlet rule to AdGuard scriptlet rule |
6275 | 6294 | * @param {string} rule - UBO scriptlet rule |
6276 | 6295 | * @returns {Array} - array with one AdGuard scriptlet rule |
6277 | 6296 | */ |
|
6286 | 6305 | template = ADGUARD_SCRIPTLET_EXCEPTION_TEMPLATE; |
6287 | 6306 | } else { |
6288 | 6307 | template = ADGUARD_SCRIPTLET_TEMPLATE; |
6289 | | - } // do not split args by escaped comma |
6290 | | - // https://github.com/AdguardTeam/Scriptlets/issues/133 |
6291 | | - |
6292 | | - |
6293 | | - var parsedArgs = getStringInBraces(rule).split(/(?<!\\),\s/g); |
6294 | | - |
6295 | | - if (parsedArgs.length === 1) { |
6296 | | - // Most probably this is not correct separator, in this case we use ',' |
6297 | | - parsedArgs = getStringInBraces(rule).split(/,/g); |
6298 | 6308 | } |
6299 | 6309 |
|
| 6310 | + var argsStr = getStringInBraces(rule); |
| 6311 | + var parsedArgs = splitArgs(argsStr); |
6300 | 6312 | var scriptletName = parsedArgs[0].indexOf(UBO_SCRIPTLET_JS_ENDING) > -1 ? "ubo-".concat(parsedArgs[0]) : "ubo-".concat(parsedArgs[0]).concat(UBO_SCRIPTLET_JS_ENDING); |
6301 | 6313 |
|
6302 | 6314 | if ((REMOVE_ATTR_ALIASES.indexOf(scriptletName) > -1 || REMOVE_CLASS_ALIASES.indexOf(scriptletName) > -1) && parsedArgs.length > MAX_REMOVE_ATTR_CLASS_ARGS_COUNT) { |
6303 | | - parsedArgs = [parsedArgs[0], parsedArgs[1], // if there are more than 3 args for remove-attr/class scriptlet, |
| 6315 | + // if there are more than 4 args for remove-attr/class scriptlet, |
6304 | 6316 | // ubo rule has multiple selector separated by comma. so we should: |
6305 | | - // 1. join them into a single string |
6306 | | - // 2. replace escaped commas by regular ones |
| 6317 | + // 1. check if last arg is 'applying' parameter |
| 6318 | + // 2. join 'selector' into one arg |
| 6319 | + // 3. combine all args |
6307 | 6320 | // https://github.com/AdguardTeam/Scriptlets/issues/133 |
6308 | | - replaceAll(parsedArgs.slice(2).join("".concat(COMMA_SEPARATOR, " ")), ESCAPED_COMMA_SEPARATOR, COMMA_SEPARATOR)]; |
| 6321 | + var lastArg = parsedArgs.pop(); |
| 6322 | + |
| 6323 | + var _parsedArgs = parsedArgs, |
| 6324 | + _parsedArgs2 = toArray(_parsedArgs), |
| 6325 | + name = _parsedArgs2[0], |
| 6326 | + value = _parsedArgs2[1], |
| 6327 | + restArgs = _parsedArgs2.slice(2); |
| 6328 | + |
| 6329 | + var applying; // check the last parsed arg for matching possible 'applying' vale |
| 6330 | + |
| 6331 | + if (REMOVE_ATTR_CLASS_APPLYING.some(function (el) { |
| 6332 | + return lastArg.indexOf(el) > -1; |
| 6333 | + })) { |
| 6334 | + applying = lastArg; |
| 6335 | + } else { |
| 6336 | + restArgs.push(lastArg); |
| 6337 | + } |
| 6338 | + |
| 6339 | + var selector = restArgs.join(', '); |
| 6340 | + parsedArgs = applying ? [name, value, selector, applying] : [name, value, selector]; |
6309 | 6341 | } |
6310 | 6342 |
|
6311 | 6343 | var args = parsedArgs.map(function (arg, index) { |
|
0 commit comments