@acemir/cssom 0.9.13 → 0.9.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/CSSOM.js CHANGED
@@ -1987,7 +1987,8 @@ CSSOM.parse = function parse(token, errorHandler) {
1987
1987
  // Fallback to a loose regexp for the overall selector structure (without deep paren matching)
1988
1988
  // This is similar to the original, but without nested paren limitations
1989
1989
  // Modified to support namespace selectors: *|element, prefix|element, |element
1990
- var looseSelectorRegExp = /^((?:(?:\*|[a-zA-Z_\u00A0-\uFFFF\\][a-zA-Z0-9_\u00A0-\uFFFF\-\\]*|)\|)?[a-zA-Z_\u00A0-\uFFFF\\][a-zA-Z0-9_\u00A0-\uFFFF\-\\]*|(?:(?:\*|[a-zA-Z_\u00A0-\uFFFF\\][a-zA-Z0-9_\u00A0-\uFFFF\-\\]*|)\|)?\*|#[a-zA-Z0-9_\u00A0-\uFFFF\-\\]+|\.[a-zA-Z0-9_\u00A0-\uFFFF\-\\]+|\[[^\[\]]*(?:\s+[iI])?\]|::?[a-zA-Z0-9_\u00A0-\uFFFF\-\\]+(?:\((.*)\))?|&|\s*[>+~]\s*|\s+)+$/;
1990
+ // Fixed attribute selector regex to properly handle |=, ~=, ^=, $=, *= operators
1991
+ var looseSelectorRegExp = /^((?:(?:\*|[a-zA-Z_\u00A0-\uFFFF\\][a-zA-Z0-9_\u00A0-\uFFFF\-\\]*|)\|)?[a-zA-Z_\u00A0-\uFFFF\\][a-zA-Z0-9_\u00A0-\uFFFF\-\\]*|(?:(?:\*|[a-zA-Z_\u00A0-\uFFFF\\][a-zA-Z0-9_\u00A0-\uFFFF\-\\]*|)\|)?\*|#[a-zA-Z0-9_\u00A0-\uFFFF\-\\]+|\.[a-zA-Z0-9_\u00A0-\uFFFF\-\\]+|\[(?:[^\[\]'"]|'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*")*(?:\s+[iI])?\]|::?[a-zA-Z0-9_\u00A0-\uFFFF\-\\]+(?:\((.*)\))?|&|\s*[>+~]\s*|\s+)+$/;
1991
1992
  return looseSelectorRegExp.test(selector);
1992
1993
  }
1993
1994
 
@@ -2138,7 +2139,42 @@ CSSOM.parse = function parse(token, errorHandler) {
2138
2139
  */
2139
2140
  function validateNamespaceSelector(selector) {
2140
2141
  // Check if selector contains a namespace prefix
2141
- var pipeIndex = selector.indexOf('|');
2142
+ // We need to ignore pipes inside attribute selectors
2143
+ var pipeIndex = -1;
2144
+ var inAttr = false;
2145
+ var inSingleQuote = false;
2146
+ var inDoubleQuote = false;
2147
+
2148
+ for (var i = 0; i < selector.length; i++) {
2149
+ var char = selector[i];
2150
+
2151
+ if (inSingleQuote) {
2152
+ if (char === "'" && selector[i - 1] !== "\\") {
2153
+ inSingleQuote = false;
2154
+ }
2155
+ } else if (inDoubleQuote) {
2156
+ if (char === '"' && selector[i - 1] !== "\\") {
2157
+ inDoubleQuote = false;
2158
+ }
2159
+ } else if (inAttr) {
2160
+ if (char === "]") {
2161
+ inAttr = false;
2162
+ } else if (char === "'") {
2163
+ inSingleQuote = true;
2164
+ } else if (char === '"') {
2165
+ inDoubleQuote = true;
2166
+ }
2167
+ } else {
2168
+ if (char === "[") {
2169
+ inAttr = true;
2170
+ } else if (char === "|" && !inAttr) {
2171
+ // This is a namespace separator, not an attribute operator
2172
+ pipeIndex = i;
2173
+ break;
2174
+ }
2175
+ }
2176
+ }
2177
+
2142
2178
  if (pipeIndex === -1) {
2143
2179
  return true; // No namespace, always valid
2144
2180
  }
package/lib/parse.js CHANGED
@@ -312,7 +312,8 @@ CSSOM.parse = function parse(token, errorHandler) {
312
312
  // Fallback to a loose regexp for the overall selector structure (without deep paren matching)
313
313
  // This is similar to the original, but without nested paren limitations
314
314
  // Modified to support namespace selectors: *|element, prefix|element, |element
315
- var looseSelectorRegExp = /^((?:(?:\*|[a-zA-Z_\u00A0-\uFFFF\\][a-zA-Z0-9_\u00A0-\uFFFF\-\\]*|)\|)?[a-zA-Z_\u00A0-\uFFFF\\][a-zA-Z0-9_\u00A0-\uFFFF\-\\]*|(?:(?:\*|[a-zA-Z_\u00A0-\uFFFF\\][a-zA-Z0-9_\u00A0-\uFFFF\-\\]*|)\|)?\*|#[a-zA-Z0-9_\u00A0-\uFFFF\-\\]+|\.[a-zA-Z0-9_\u00A0-\uFFFF\-\\]+|\[[^\[\]]*(?:\s+[iI])?\]|::?[a-zA-Z0-9_\u00A0-\uFFFF\-\\]+(?:\((.*)\))?|&|\s*[>+~]\s*|\s+)+$/;
315
+ // Fixed attribute selector regex to properly handle |=, ~=, ^=, $=, *= operators
316
+ var looseSelectorRegExp = /^((?:(?:\*|[a-zA-Z_\u00A0-\uFFFF\\][a-zA-Z0-9_\u00A0-\uFFFF\-\\]*|)\|)?[a-zA-Z_\u00A0-\uFFFF\\][a-zA-Z0-9_\u00A0-\uFFFF\-\\]*|(?:(?:\*|[a-zA-Z_\u00A0-\uFFFF\\][a-zA-Z0-9_\u00A0-\uFFFF\-\\]*|)\|)?\*|#[a-zA-Z0-9_\u00A0-\uFFFF\-\\]+|\.[a-zA-Z0-9_\u00A0-\uFFFF\-\\]+|\[(?:[^\[\]'"]|'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*")*(?:\s+[iI])?\]|::?[a-zA-Z0-9_\u00A0-\uFFFF\-\\]+(?:\((.*)\))?|&|\s*[>+~]\s*|\s+)+$/;
316
317
  return looseSelectorRegExp.test(selector);
317
318
  }
318
319
 
@@ -463,7 +464,42 @@ CSSOM.parse = function parse(token, errorHandler) {
463
464
  */
464
465
  function validateNamespaceSelector(selector) {
465
466
  // Check if selector contains a namespace prefix
466
- var pipeIndex = selector.indexOf('|');
467
+ // We need to ignore pipes inside attribute selectors
468
+ var pipeIndex = -1;
469
+ var inAttr = false;
470
+ var inSingleQuote = false;
471
+ var inDoubleQuote = false;
472
+
473
+ for (var i = 0; i < selector.length; i++) {
474
+ var char = selector[i];
475
+
476
+ if (inSingleQuote) {
477
+ if (char === "'" && selector[i - 1] !== "\\") {
478
+ inSingleQuote = false;
479
+ }
480
+ } else if (inDoubleQuote) {
481
+ if (char === '"' && selector[i - 1] !== "\\") {
482
+ inDoubleQuote = false;
483
+ }
484
+ } else if (inAttr) {
485
+ if (char === "]") {
486
+ inAttr = false;
487
+ } else if (char === "'") {
488
+ inSingleQuote = true;
489
+ } else if (char === '"') {
490
+ inDoubleQuote = true;
491
+ }
492
+ } else {
493
+ if (char === "[") {
494
+ inAttr = true;
495
+ } else if (char === "|" && !inAttr) {
496
+ // This is a namespace separator, not an attribute operator
497
+ pipeIndex = i;
498
+ break;
499
+ }
500
+ }
501
+ }
502
+
467
503
  if (pipeIndex === -1) {
468
504
  return true; // No namespace, always valid
469
505
  }
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "parser",
8
8
  "styleSheet"
9
9
  ],
10
- "version": "0.9.13",
10
+ "version": "0.9.14",
11
11
  "author": "Nikita Vasilyev <me@elv1s.ru>",
12
12
  "contributors": [
13
13
  "Acemir Sousa Mendes <acemirsm@gmail.com>"