| OLD | NEW |
| 1 function splitSelector(selector) |
| 2 { |
| 3 if (selector.indexOf(",") == -1) |
| 4 return [selector]; |
| 5 |
| 6 var selectors = []; |
| 7 var start = 0; |
| 8 var level = 0; |
| 9 var sep = ""; |
| 10 |
| 11 for (var i = 0; i < selector.length; i++) |
| 12 { |
| 13 var chr = selector[i]; |
| 14 |
| 15 if (chr == "\\") // ignore escaped characters |
| 16 i++; |
| 17 else if (chr == sep) // don't split within quoted text |
| 18 sep = ""; // e.g. [attr=","] |
| 19 else if (sep == "") |
| 20 { |
| 21 if (chr == '"' || chr == "'") |
| 22 sep = chr; |
| 23 else if (chr == "(") // don't split between parentheses |
| 24 level++; // e.g. :matches(div,span) |
| 25 else if (chr == ")") |
| 26 level = Math.max(0, level - 1); |
| 27 else if (chr == "," && level == 0) |
| 28 { |
| 29 selectors.push(selector.substring(start, i)); |
| 30 start = i + 1; |
| 31 } |
| 32 } |
| 33 } |
| 34 |
| 35 selectors.push(selector.substring(start)); |
| 36 return selectors; |
| 37 } |
| 38 |
| 1 function CSSPropertyFilters(window, addSelectorsFunc) { | 39 function CSSPropertyFilters(window, addSelectorsFunc) { |
| 2 this.window = window; | 40 this.window = window; |
| 3 this.addSelectorsFunc = addSelectorsFunc; | 41 this.addSelectorsFunc = addSelectorsFunc; |
| 4 } | 42 } |
| 5 | 43 |
| 6 CSSPropertyFilters.prototype = { | 44 CSSPropertyFilters.prototype = { |
| 7 stringifyStyle: function(style) | 45 stringifyStyle: function(style) |
| 8 { | 46 { |
| 9 var styles = []; | 47 var styles = []; |
| 10 for (var i = 0; i < style.length; i++) | 48 for (var i = 0; i < style.length; i++) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 var style = this.stringifyStyle(rule.style); | 71 var style = this.stringifyStyle(rule.style); |
| 34 for (var j = 0; j < this.patterns.length; j++) | 72 for (var j = 0; j < this.patterns.length; j++) |
| 35 { | 73 { |
| 36 var pattern = this.patterns[j]; | 74 var pattern = this.patterns[j]; |
| 37 var regexp = pattern.regexp; | 75 var regexp = pattern.regexp; |
| 38 | 76 |
| 39 if (typeof regexp == "string") | 77 if (typeof regexp == "string") |
| 40 regexp = pattern.regexp = new RegExp(regexp); | 78 regexp = pattern.regexp = new RegExp(regexp); |
| 41 | 79 |
| 42 if (regexp.test(style)) | 80 if (regexp.test(style)) |
| 43 selectors.push(pattern.prefix + rule.selectorText + pattern.suffix); | 81 { |
| 82 var subSelectors = splitSelector(rule.selectorText); |
| 83 for (var k = 0; k < subSelectors.length; k++) |
| 84 selectors.push(pattern.prefix + subSelectors[k] + pattern.suffix); |
| 85 } |
| 44 } | 86 } |
| 45 } | 87 } |
| 46 }, | 88 }, |
| 47 | 89 |
| 48 addSelectors: function(stylesheets) | 90 addSelectors: function(stylesheets) |
| 49 { | 91 { |
| 50 var selectors = []; | 92 var selectors = []; |
| 51 for (var i = 0; i < stylesheets.length; i++) | 93 for (var i = 0; i < stylesheets.length; i++) |
| 52 this.findSelectors(stylesheets[i], selectors); | 94 this.findSelectors(stylesheets[i], selectors); |
| 53 this.addSelectorsFunc(selectors); | 95 this.addSelectorsFunc(selectors); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 78 apply: function() | 120 apply: function() |
| 79 { | 121 { |
| 80 if (this.patterns.length > 0) | 122 if (this.patterns.length > 0) |
| 81 { | 123 { |
| 82 var document = this.window.document; | 124 var document = this.window.document; |
| 83 this.addSelectors(document.styleSheets); | 125 this.addSelectors(document.styleSheets); |
| 84 document.addEventListener("load", this.onLoad.bind(this), true); | 126 document.addEventListener("load", this.onLoad.bind(this), true); |
| 85 } | 127 } |
| 86 } | 128 } |
| 87 }; | 129 }; |
| OLD | NEW |