@projectwallace/css-parser 0.13.3 → 0.13.4
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/dist/arena.d.ts +1 -0
- package/dist/arena.js +2 -1
- package/dist/parse-atrule-prelude.js +100 -18
- package/dist/parse.js +2 -2
- package/package.json +1 -1
package/dist/arena.d.ts
CHANGED
|
@@ -37,6 +37,7 @@ export declare const LAYER_NAME = 37;
|
|
|
37
37
|
export declare const PRELUDE_OPERATOR = 38;
|
|
38
38
|
export declare const FEATURE_RANGE = 39;
|
|
39
39
|
export declare const AT_RULE_PRELUDE = 40;
|
|
40
|
+
export declare const PRELUDE_SELECTORLIST = 41;
|
|
40
41
|
export declare const VALUE = 50;
|
|
41
42
|
export declare const FLAG_IMPORTANT: number;
|
|
42
43
|
export declare const FLAG_HAS_ERROR: number;
|
package/dist/arena.js
CHANGED
|
@@ -38,6 +38,7 @@ const LAYER_NAME = 37;
|
|
|
38
38
|
const PRELUDE_OPERATOR = 38;
|
|
39
39
|
const FEATURE_RANGE = 39;
|
|
40
40
|
const AT_RULE_PRELUDE = 40;
|
|
41
|
+
const PRELUDE_SELECTORLIST = 41;
|
|
41
42
|
const VALUE = 50;
|
|
42
43
|
const FLAG_IMPORTANT = 1 << 0;
|
|
43
44
|
const FLAG_HAS_ERROR = 1 << 1;
|
|
@@ -286,4 +287,4 @@ class CSSDataArena {
|
|
|
286
287
|
}
|
|
287
288
|
}
|
|
288
289
|
|
|
289
|
-
export { ATTRIBUTE_SELECTOR, ATTR_FLAG_CASE_INSENSITIVE, ATTR_FLAG_CASE_SENSITIVE, ATTR_FLAG_NONE, ATTR_OPERATOR_CARET_EQUAL, ATTR_OPERATOR_DOLLAR_EQUAL, ATTR_OPERATOR_EQUAL, ATTR_OPERATOR_NONE, ATTR_OPERATOR_PIPE_EQUAL, ATTR_OPERATOR_STAR_EQUAL, ATTR_OPERATOR_TILDE_EQUAL, AT_RULE, AT_RULE_PRELUDE, BLOCK, CLASS_SELECTOR, COMBINATOR, COMMENT, CONTAINER_QUERY, CSSDataArena, DECLARATION, DIMENSION, FEATURE_RANGE, FLAG_BROWSERHACK, FLAG_HAS_BLOCK, FLAG_HAS_DECLARATIONS, FLAG_HAS_ERROR, FLAG_HAS_PARENS, FLAG_IMPORTANT, FLAG_LENGTH_OVERFLOW, FUNCTION, HASH, IDENTIFIER, ID_SELECTOR, LANG_SELECTOR, LAYER_NAME, MEDIA_FEATURE, MEDIA_QUERY, MEDIA_TYPE, NESTING_SELECTOR, NTH_OF_SELECTOR, NTH_SELECTOR, NUMBER, OPERATOR, PARENTHESIS, PRELUDE_OPERATOR, PSEUDO_CLASS_SELECTOR, PSEUDO_ELEMENT_SELECTOR, SELECTOR, SELECTOR_LIST, STRING, STYLESHEET, STYLE_RULE, SUPPORTS_QUERY, TYPE_SELECTOR, UNICODE_RANGE, UNIVERSAL_SELECTOR, URL, VALUE };
|
|
290
|
+
export { ATTRIBUTE_SELECTOR, ATTR_FLAG_CASE_INSENSITIVE, ATTR_FLAG_CASE_SENSITIVE, ATTR_FLAG_NONE, ATTR_OPERATOR_CARET_EQUAL, ATTR_OPERATOR_DOLLAR_EQUAL, ATTR_OPERATOR_EQUAL, ATTR_OPERATOR_NONE, ATTR_OPERATOR_PIPE_EQUAL, ATTR_OPERATOR_STAR_EQUAL, ATTR_OPERATOR_TILDE_EQUAL, AT_RULE, AT_RULE_PRELUDE, BLOCK, CLASS_SELECTOR, COMBINATOR, COMMENT, CONTAINER_QUERY, CSSDataArena, DECLARATION, DIMENSION, FEATURE_RANGE, FLAG_BROWSERHACK, FLAG_HAS_BLOCK, FLAG_HAS_DECLARATIONS, FLAG_HAS_ERROR, FLAG_HAS_PARENS, FLAG_IMPORTANT, FLAG_LENGTH_OVERFLOW, FUNCTION, HASH, IDENTIFIER, ID_SELECTOR, LANG_SELECTOR, LAYER_NAME, MEDIA_FEATURE, MEDIA_QUERY, MEDIA_TYPE, NESTING_SELECTOR, NTH_OF_SELECTOR, NTH_SELECTOR, NUMBER, OPERATOR, PARENTHESIS, PRELUDE_OPERATOR, PRELUDE_SELECTORLIST, PSEUDO_CLASS_SELECTOR, PSEUDO_ELEMENT_SELECTOR, SELECTOR, SELECTOR_LIST, STRING, STYLESHEET, STYLE_RULE, SUPPORTS_QUERY, TYPE_SELECTOR, UNICODE_RANGE, UNIVERSAL_SELECTOR, URL, VALUE };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Lexer } from './tokenize.js';
|
|
2
|
-
import { CSSDataArena, PRELUDE_OPERATOR, MEDIA_TYPE, MEDIA_QUERY, MEDIA_FEATURE, FUNCTION, IDENTIFIER, CONTAINER_QUERY, SUPPORTS_QUERY, LAYER_NAME, STRING, URL, DIMENSION, NUMBER, FEATURE_RANGE } from './arena.js';
|
|
2
|
+
import { CSSDataArena, PRELUDE_OPERATOR, MEDIA_TYPE, MEDIA_QUERY, MEDIA_FEATURE, FUNCTION, IDENTIFIER, CONTAINER_QUERY, SUPPORTS_QUERY, LAYER_NAME, STRING, URL, DIMENSION, NUMBER, PRELUDE_SELECTORLIST, FEATURE_RANGE } from './arena.js';
|
|
3
3
|
import { TOKEN_COMMA, TOKEN_IDENT, TOKEN_LEFT_PAREN, TOKEN_RIGHT_PAREN, TOKEN_FUNCTION, TOKEN_EOF, TOKEN_WHITESPACE, TOKEN_STRING, TOKEN_URL, TOKEN_DIMENSION, TOKEN_PERCENTAGE, TOKEN_NUMBER } from './token-types.js';
|
|
4
4
|
import { strip_vendor_prefix, str_equals, CHAR_LESS_THAN, CHAR_GREATER_THAN, CHAR_EQUALS, CHAR_COLON, is_whitespace } from './string-utils.js';
|
|
5
5
|
import { skip_whitespace_and_comments_forward, trim_boundaries } from './parse-utils.js';
|
|
@@ -24,23 +24,35 @@ class AtRulePreludeParser {
|
|
|
24
24
|
}
|
|
25
25
|
// Dispatch to appropriate parser based on at-rule type
|
|
26
26
|
parse_prelude_dispatch(at_rule_name) {
|
|
27
|
-
let normalized_name = strip_vendor_prefix(at_rule_name);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
27
|
+
let normalized_name = strip_vendor_prefix(at_rule_name).toLowerCase();
|
|
28
|
+
switch (normalized_name) {
|
|
29
|
+
case "media":
|
|
30
|
+
return this.parse_media_query_list();
|
|
31
|
+
case "container":
|
|
32
|
+
return this.parse_container_query();
|
|
33
|
+
case "supports":
|
|
34
|
+
return this.parse_supports_query();
|
|
35
|
+
case "layer":
|
|
36
|
+
return this.parse_layer_names();
|
|
37
|
+
case "keyframes":
|
|
38
|
+
case "property":
|
|
39
|
+
case "counter-style":
|
|
40
|
+
case "color-profile":
|
|
41
|
+
case "font-palette-values":
|
|
42
|
+
case "position-try":
|
|
43
|
+
case "font-feature-values":
|
|
44
|
+
case "page":
|
|
45
|
+
return this.parse_identifier();
|
|
46
|
+
case "import":
|
|
47
|
+
return this.parse_import_prelude();
|
|
48
|
+
case "charset":
|
|
49
|
+
return this.parse_charset_prelude();
|
|
50
|
+
case "namespace":
|
|
51
|
+
return this.parse_namespace_prelude();
|
|
52
|
+
case "scope":
|
|
53
|
+
return this.parse_scope_prelude();
|
|
54
|
+
case "custom-media":
|
|
55
|
+
return this.parse_custom_media_prelude();
|
|
44
56
|
}
|
|
45
57
|
return [];
|
|
46
58
|
}
|
|
@@ -524,6 +536,76 @@ class AtRulePreludeParser {
|
|
|
524
536
|
this.lexer = saved_lexer;
|
|
525
537
|
return nodes;
|
|
526
538
|
}
|
|
539
|
+
// Parse @namespace prelude: [prefix] url("...") | "..."
|
|
540
|
+
// e.g. @namespace url("http://www.w3.org/1999/xhtml");
|
|
541
|
+
// e.g. @namespace svg url("http://www.w3.org/2000/svg");
|
|
542
|
+
parse_namespace_prelude() {
|
|
543
|
+
let nodes = [];
|
|
544
|
+
this.skip_whitespace();
|
|
545
|
+
if (this.lexer.pos >= this.prelude_end) return [];
|
|
546
|
+
const saved = this.lexer.save_position();
|
|
547
|
+
this.next_token();
|
|
548
|
+
if (this.lexer.token_type === TOKEN_IDENT) {
|
|
549
|
+
nodes.push(this.create_node(IDENTIFIER, this.lexer.token_start, this.lexer.token_end));
|
|
550
|
+
this.skip_whitespace();
|
|
551
|
+
} else {
|
|
552
|
+
this.lexer.restore_position(saved);
|
|
553
|
+
}
|
|
554
|
+
const url_node = this.parse_import_url();
|
|
555
|
+
if (url_node !== null) nodes.push(url_node);
|
|
556
|
+
return nodes;
|
|
557
|
+
}
|
|
558
|
+
// Parse @scope prelude: [(<scope-start>)] [to (<scope-end>)]
|
|
559
|
+
// e.g. @scope (.parent) to (.child) { }
|
|
560
|
+
parse_scope_prelude() {
|
|
561
|
+
let nodes = [];
|
|
562
|
+
while (this.lexer.pos < this.prelude_end) {
|
|
563
|
+
this.skip_whitespace();
|
|
564
|
+
if (this.lexer.pos >= this.prelude_end) break;
|
|
565
|
+
const token_type = this.peek_token_type();
|
|
566
|
+
if (token_type === TOKEN_LEFT_PAREN) {
|
|
567
|
+
this.next_token();
|
|
568
|
+
let paren_start = this.lexer.token_start;
|
|
569
|
+
let content_start = this.lexer.pos;
|
|
570
|
+
let depth = 1;
|
|
571
|
+
while (this.lexer.pos < this.prelude_end && depth > 0) {
|
|
572
|
+
this.next_token();
|
|
573
|
+
if (this.lexer.token_type === TOKEN_LEFT_PAREN) depth++;
|
|
574
|
+
else if (this.lexer.token_type === TOKEN_RIGHT_PAREN) depth--;
|
|
575
|
+
}
|
|
576
|
+
let content_end = this.lexer.token_start;
|
|
577
|
+
let paren_end = this.lexer.token_end;
|
|
578
|
+
let scope_node = this.create_node(PRELUDE_SELECTORLIST, paren_start, paren_end);
|
|
579
|
+
let trimmed = trim_boundaries(this.source, content_start, content_end);
|
|
580
|
+
if (trimmed) {
|
|
581
|
+
this.arena.set_value_start_delta(scope_node, trimmed[0] - paren_start);
|
|
582
|
+
this.arena.set_value_length(scope_node, trimmed[1] - trimmed[0]);
|
|
583
|
+
}
|
|
584
|
+
nodes.push(scope_node);
|
|
585
|
+
} else if (token_type === TOKEN_IDENT) {
|
|
586
|
+
this.next_token();
|
|
587
|
+
let text = this.source.substring(this.lexer.token_start, this.lexer.token_end);
|
|
588
|
+
if (str_equals("to", text)) {
|
|
589
|
+
nodes.push(this.create_node(PRELUDE_OPERATOR, this.lexer.token_start, this.lexer.token_end));
|
|
590
|
+
}
|
|
591
|
+
} else {
|
|
592
|
+
this.next_token();
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
return nodes;
|
|
596
|
+
}
|
|
597
|
+
// Parse @custom-media prelude: --name <media-condition>
|
|
598
|
+
// e.g. @custom-media --small (max-width: 30em);
|
|
599
|
+
parse_custom_media_prelude() {
|
|
600
|
+
let nodes = [];
|
|
601
|
+
this.skip_whitespace();
|
|
602
|
+
if (this.lexer.pos >= this.prelude_end) return [];
|
|
603
|
+
this.next_token();
|
|
604
|
+
if (this.lexer.token_type !== TOKEN_IDENT) return [];
|
|
605
|
+
nodes.push(this.create_node(IDENTIFIER, this.lexer.token_start, this.lexer.token_end));
|
|
606
|
+
nodes.push(...this.parse_media_query_list());
|
|
607
|
+
return nodes;
|
|
608
|
+
}
|
|
527
609
|
// Parse media feature range syntax: (50px <= width <= 100px)
|
|
528
610
|
parse_feature_range(feature_start, feature_end, content_start, content_end) {
|
|
529
611
|
let range_node = this.create_node(FEATURE_RANGE, feature_start, feature_end);
|
package/dist/parse.js
CHANGED
|
@@ -8,8 +8,8 @@ import { TOKEN_EOF, TOKEN_AT_KEYWORD, TOKEN_LEFT_BRACE, TOKEN_RIGHT_BRACE, TOKEN
|
|
|
8
8
|
import { trim_boundaries } from './parse-utils.js';
|
|
9
9
|
import { CHAR_PERIOD, CHAR_GREATER_THAN, CHAR_PLUS, CHAR_TILDE, CHAR_AMPERSAND } from './string-utils.js';
|
|
10
10
|
|
|
11
|
-
let DECLARATION_AT_RULES = /* @__PURE__ */ new Set(["font-face", "font-feature-values", "page", "property", "counter-style"]);
|
|
12
|
-
let CONDITIONAL_AT_RULES = /* @__PURE__ */ new Set(["media", "supports", "container", "layer", "nest"]);
|
|
11
|
+
let DECLARATION_AT_RULES = /* @__PURE__ */ new Set(["font-face", "font-feature-values", "page", "property", "counter-style", "color-profile", "font-palette-values", "position-try", "view-transition"]);
|
|
12
|
+
let CONDITIONAL_AT_RULES = /* @__PURE__ */ new Set(["media", "supports", "container", "layer", "nest", "scope", "starting-style"]);
|
|
13
13
|
class Parser {
|
|
14
14
|
source;
|
|
15
15
|
lexer;
|
package/package.json
CHANGED