@projectwallace/css-parser 0.8.10 → 0.10.0
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 +2 -0
- package/dist/arena.js +6 -2
- package/dist/constants.d.ts +4 -2
- package/dist/constants.js +5 -3
- package/dist/css-node.d.ts +5 -5
- package/dist/css-node.js +7 -13
- package/dist/index.js +1 -1
- package/dist/parse-atrule-prelude.js +117 -8
- package/dist/parse-declaration.js +6 -2
- package/dist/parse-value.d.ts +3 -3
- package/dist/parse-value.js +16 -6
- package/dist/string-utils.d.ts +1 -0
- package/dist/string-utils.js +2 -1
- package/package.json +1 -1
package/dist/arena.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export declare const FUNCTION = 15;
|
|
|
14
14
|
export declare const OPERATOR = 16;
|
|
15
15
|
export declare const PARENTHESIS = 17;
|
|
16
16
|
export declare const URL = 18;
|
|
17
|
+
export declare const VALUE = 19;
|
|
17
18
|
export declare const SELECTOR_LIST = 20;
|
|
18
19
|
export declare const TYPE_SELECTOR = 21;
|
|
19
20
|
export declare const CLASS_SELECTOR = 22;
|
|
@@ -34,6 +35,7 @@ export declare const CONTAINER_QUERY = 35;
|
|
|
34
35
|
export declare const SUPPORTS_QUERY = 36;
|
|
35
36
|
export declare const LAYER_NAME = 37;
|
|
36
37
|
export declare const PRELUDE_OPERATOR = 38;
|
|
38
|
+
export declare const FEATURE_RANGE = 39;
|
|
37
39
|
export declare const FLAG_IMPORTANT: number;
|
|
38
40
|
export declare const FLAG_HAS_ERROR: number;
|
|
39
41
|
export declare const FLAG_LENGTH_OVERFLOW: number;
|
package/dist/arena.js
CHANGED
|
@@ -15,6 +15,7 @@ const FUNCTION = 15;
|
|
|
15
15
|
const OPERATOR = 16;
|
|
16
16
|
const PARENTHESIS = 17;
|
|
17
17
|
const URL = 18;
|
|
18
|
+
const VALUE = 19;
|
|
18
19
|
const SELECTOR_LIST = 20;
|
|
19
20
|
const TYPE_SELECTOR = 21;
|
|
20
21
|
const CLASS_SELECTOR = 22;
|
|
@@ -35,6 +36,7 @@ const CONTAINER_QUERY = 35;
|
|
|
35
36
|
const SUPPORTS_QUERY = 36;
|
|
36
37
|
const LAYER_NAME = 37;
|
|
37
38
|
const PRELUDE_OPERATOR = 38;
|
|
39
|
+
const FEATURE_RANGE = 39;
|
|
38
40
|
const FLAG_IMPORTANT = 1 << 0;
|
|
39
41
|
const FLAG_HAS_ERROR = 1 << 1;
|
|
40
42
|
const FLAG_LENGTH_OVERFLOW = 1 << 2;
|
|
@@ -66,7 +68,9 @@ class CSSDataArena {
|
|
|
66
68
|
// Growth multiplier when capacity is exceeded
|
|
67
69
|
static GROWTH_FACTOR = 1.3;
|
|
68
70
|
// Estimated nodes per KB of CSS (based on real-world data)
|
|
69
|
-
|
|
71
|
+
// Increased from 270 to 325 to account for VALUE wrapper nodes
|
|
72
|
+
// (~20% of nodes are declarations, +1 VALUE node per declaration = +20% nodes)
|
|
73
|
+
static NODES_PER_KB = 325;
|
|
70
74
|
// Buffer to avoid frequent growth (15%)
|
|
71
75
|
static CAPACITY_BUFFER = 1.2;
|
|
72
76
|
constructor(initial_capacity = 1024) {
|
|
@@ -280,4 +284,4 @@ class CSSDataArena {
|
|
|
280
284
|
}
|
|
281
285
|
}
|
|
282
286
|
|
|
283
|
-
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, BLOCK, CLASS_SELECTOR, COMBINATOR, COMMENT, CONTAINER_QUERY, CSSDataArena, DECLARATION, DIMENSION, 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, UNIVERSAL_SELECTOR, URL };
|
|
287
|
+
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, 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, UNIVERSAL_SELECTOR, URL, VALUE };
|
package/dist/constants.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { STYLESHEET, STYLE_RULE, AT_RULE, DECLARATION, SELECTOR, COMMENT, BLOCK, IDENTIFIER, NUMBER, DIMENSION, STRING, HASH, FUNCTION, OPERATOR, PARENTHESIS, URL, SELECTOR_LIST, TYPE_SELECTOR, CLASS_SELECTOR, ID_SELECTOR, ATTRIBUTE_SELECTOR, PSEUDO_CLASS_SELECTOR, PSEUDO_ELEMENT_SELECTOR, COMBINATOR, UNIVERSAL_SELECTOR, NESTING_SELECTOR, NTH_SELECTOR, NTH_OF_SELECTOR, LANG_SELECTOR, MEDIA_QUERY, MEDIA_FEATURE, MEDIA_TYPE, CONTAINER_QUERY, SUPPORTS_QUERY, LAYER_NAME, PRELUDE_OPERATOR, FLAG_IMPORTANT, ATTR_OPERATOR_NONE, ATTR_OPERATOR_EQUAL, ATTR_OPERATOR_TILDE_EQUAL, ATTR_OPERATOR_PIPE_EQUAL, ATTR_OPERATOR_CARET_EQUAL, ATTR_OPERATOR_DOLLAR_EQUAL, ATTR_OPERATOR_STAR_EQUAL, ATTR_FLAG_NONE, ATTR_FLAG_CASE_INSENSITIVE, ATTR_FLAG_CASE_SENSITIVE } from './arena';
|
|
2
|
-
export { STYLESHEET, STYLE_RULE, AT_RULE, DECLARATION, SELECTOR, COMMENT, BLOCK, IDENTIFIER, NUMBER, DIMENSION, STRING, HASH, FUNCTION, OPERATOR, PARENTHESIS, URL, SELECTOR_LIST, TYPE_SELECTOR, CLASS_SELECTOR, ID_SELECTOR, ATTRIBUTE_SELECTOR, PSEUDO_CLASS_SELECTOR, PSEUDO_ELEMENT_SELECTOR, COMBINATOR, UNIVERSAL_SELECTOR, NESTING_SELECTOR, NTH_SELECTOR, NTH_OF_SELECTOR, LANG_SELECTOR, MEDIA_QUERY, MEDIA_FEATURE, MEDIA_TYPE, CONTAINER_QUERY, SUPPORTS_QUERY, LAYER_NAME, PRELUDE_OPERATOR, FLAG_IMPORTANT, ATTR_OPERATOR_NONE, ATTR_OPERATOR_EQUAL, ATTR_OPERATOR_TILDE_EQUAL, ATTR_OPERATOR_PIPE_EQUAL, ATTR_OPERATOR_CARET_EQUAL, ATTR_OPERATOR_DOLLAR_EQUAL, ATTR_OPERATOR_STAR_EQUAL, ATTR_FLAG_NONE, ATTR_FLAG_CASE_INSENSITIVE, ATTR_FLAG_CASE_SENSITIVE, };
|
|
1
|
+
import { STYLESHEET, STYLE_RULE, AT_RULE, DECLARATION, SELECTOR, COMMENT, BLOCK, IDENTIFIER, NUMBER, DIMENSION, STRING, HASH, FUNCTION, OPERATOR, PARENTHESIS, URL, VALUE, SELECTOR_LIST, TYPE_SELECTOR, CLASS_SELECTOR, ID_SELECTOR, ATTRIBUTE_SELECTOR, PSEUDO_CLASS_SELECTOR, PSEUDO_ELEMENT_SELECTOR, COMBINATOR, UNIVERSAL_SELECTOR, NESTING_SELECTOR, NTH_SELECTOR, NTH_OF_SELECTOR, LANG_SELECTOR, MEDIA_QUERY, MEDIA_FEATURE, MEDIA_TYPE, CONTAINER_QUERY, SUPPORTS_QUERY, LAYER_NAME, PRELUDE_OPERATOR, FEATURE_RANGE, FLAG_IMPORTANT, ATTR_OPERATOR_NONE, ATTR_OPERATOR_EQUAL, ATTR_OPERATOR_TILDE_EQUAL, ATTR_OPERATOR_PIPE_EQUAL, ATTR_OPERATOR_CARET_EQUAL, ATTR_OPERATOR_DOLLAR_EQUAL, ATTR_OPERATOR_STAR_EQUAL, ATTR_FLAG_NONE, ATTR_FLAG_CASE_INSENSITIVE, ATTR_FLAG_CASE_SENSITIVE } from './arena';
|
|
2
|
+
export { STYLESHEET, STYLE_RULE, AT_RULE, DECLARATION, SELECTOR, COMMENT, BLOCK, IDENTIFIER, NUMBER, DIMENSION, STRING, HASH, FUNCTION, OPERATOR, PARENTHESIS, URL, VALUE, SELECTOR_LIST, TYPE_SELECTOR, CLASS_SELECTOR, ID_SELECTOR, ATTRIBUTE_SELECTOR, PSEUDO_CLASS_SELECTOR, PSEUDO_ELEMENT_SELECTOR, COMBINATOR, UNIVERSAL_SELECTOR, NESTING_SELECTOR, NTH_SELECTOR, NTH_OF_SELECTOR, LANG_SELECTOR, MEDIA_QUERY, MEDIA_FEATURE, MEDIA_TYPE, CONTAINER_QUERY, SUPPORTS_QUERY, LAYER_NAME, PRELUDE_OPERATOR, FEATURE_RANGE, FLAG_IMPORTANT, ATTR_OPERATOR_NONE, ATTR_OPERATOR_EQUAL, ATTR_OPERATOR_TILDE_EQUAL, ATTR_OPERATOR_PIPE_EQUAL, ATTR_OPERATOR_CARET_EQUAL, ATTR_OPERATOR_DOLLAR_EQUAL, ATTR_OPERATOR_STAR_EQUAL, ATTR_FLAG_NONE, ATTR_FLAG_CASE_INSENSITIVE, ATTR_FLAG_CASE_SENSITIVE, };
|
|
3
3
|
export declare const NODE_TYPES: {
|
|
4
4
|
readonly STYLESHEET: 1;
|
|
5
5
|
readonly STYLE_RULE: 2;
|
|
@@ -17,6 +17,7 @@ export declare const NODE_TYPES: {
|
|
|
17
17
|
readonly OPERATOR: 16;
|
|
18
18
|
readonly PARENTHESIS: 17;
|
|
19
19
|
readonly URL: 18;
|
|
20
|
+
readonly VALUE: 19;
|
|
20
21
|
readonly SELECTOR_LIST: 20;
|
|
21
22
|
readonly TYPE_SELECTOR: 21;
|
|
22
23
|
readonly CLASS_SELECTOR: 22;
|
|
@@ -37,4 +38,5 @@ export declare const NODE_TYPES: {
|
|
|
37
38
|
readonly SUPPORTS_QUERY: 36;
|
|
38
39
|
readonly LAYER_NAME: 37;
|
|
39
40
|
readonly PRELUDE_OPERATOR: 38;
|
|
41
|
+
readonly FEATURE_RANGE: 39;
|
|
40
42
|
};
|
package/dist/constants.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PRELUDE_OPERATOR, LAYER_NAME, SUPPORTS_QUERY, CONTAINER_QUERY, MEDIA_TYPE, MEDIA_FEATURE, MEDIA_QUERY, LANG_SELECTOR, NTH_OF_SELECTOR, NTH_SELECTOR, NESTING_SELECTOR, UNIVERSAL_SELECTOR, COMBINATOR, PSEUDO_ELEMENT_SELECTOR, PSEUDO_CLASS_SELECTOR, ATTRIBUTE_SELECTOR, ID_SELECTOR, CLASS_SELECTOR, TYPE_SELECTOR, SELECTOR_LIST, URL, PARENTHESIS, OPERATOR, FUNCTION, HASH, STRING, DIMENSION, NUMBER, IDENTIFIER, BLOCK, COMMENT, SELECTOR, DECLARATION, AT_RULE, STYLE_RULE, STYLESHEET } from './arena.js';
|
|
1
|
+
import { FEATURE_RANGE, PRELUDE_OPERATOR, LAYER_NAME, SUPPORTS_QUERY, CONTAINER_QUERY, MEDIA_TYPE, MEDIA_FEATURE, MEDIA_QUERY, LANG_SELECTOR, NTH_OF_SELECTOR, NTH_SELECTOR, NESTING_SELECTOR, UNIVERSAL_SELECTOR, COMBINATOR, PSEUDO_ELEMENT_SELECTOR, PSEUDO_CLASS_SELECTOR, ATTRIBUTE_SELECTOR, ID_SELECTOR, CLASS_SELECTOR, TYPE_SELECTOR, SELECTOR_LIST, VALUE, URL, PARENTHESIS, OPERATOR, FUNCTION, HASH, STRING, DIMENSION, NUMBER, IDENTIFIER, BLOCK, COMMENT, SELECTOR, DECLARATION, AT_RULE, STYLE_RULE, STYLESHEET } from './arena.js';
|
|
2
2
|
export { 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, FLAG_IMPORTANT } from './arena.js';
|
|
3
3
|
|
|
4
4
|
const NODE_TYPES = {
|
|
@@ -20,6 +20,7 @@ const NODE_TYPES = {
|
|
|
20
20
|
OPERATOR,
|
|
21
21
|
PARENTHESIS,
|
|
22
22
|
URL,
|
|
23
|
+
VALUE,
|
|
23
24
|
// Selector nodes
|
|
24
25
|
SELECTOR_LIST,
|
|
25
26
|
TYPE_SELECTOR,
|
|
@@ -41,7 +42,8 @@ const NODE_TYPES = {
|
|
|
41
42
|
CONTAINER_QUERY,
|
|
42
43
|
SUPPORTS_QUERY,
|
|
43
44
|
LAYER_NAME,
|
|
44
|
-
PRELUDE_OPERATOR
|
|
45
|
+
PRELUDE_OPERATOR,
|
|
46
|
+
FEATURE_RANGE
|
|
45
47
|
};
|
|
46
48
|
|
|
47
|
-
export { ATTRIBUTE_SELECTOR, AT_RULE, BLOCK, CLASS_SELECTOR, COMBINATOR, COMMENT, CONTAINER_QUERY, DECLARATION, DIMENSION, FUNCTION, HASH, IDENTIFIER, ID_SELECTOR, LANG_SELECTOR, LAYER_NAME, MEDIA_FEATURE, MEDIA_QUERY, MEDIA_TYPE, NESTING_SELECTOR, NODE_TYPES, 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, UNIVERSAL_SELECTOR, URL };
|
|
49
|
+
export { ATTRIBUTE_SELECTOR, AT_RULE, BLOCK, CLASS_SELECTOR, COMBINATOR, COMMENT, CONTAINER_QUERY, DECLARATION, DIMENSION, FEATURE_RANGE, FUNCTION, HASH, IDENTIFIER, ID_SELECTOR, LANG_SELECTOR, LAYER_NAME, MEDIA_FEATURE, MEDIA_QUERY, MEDIA_TYPE, NESTING_SELECTOR, NODE_TYPES, 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, UNIVERSAL_SELECTOR, URL, VALUE };
|
package/dist/css-node.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CSSDataArena } from './arena';
|
|
2
|
-
import { STYLESHEET, STYLE_RULE, AT_RULE, DECLARATION, SELECTOR, COMMENT, BLOCK, IDENTIFIER, NUMBER, DIMENSION, STRING, HASH, FUNCTION, OPERATOR, PARENTHESIS, URL, SELECTOR_LIST, TYPE_SELECTOR, CLASS_SELECTOR, ID_SELECTOR, ATTRIBUTE_SELECTOR, PSEUDO_CLASS_SELECTOR, PSEUDO_ELEMENT_SELECTOR, COMBINATOR, UNIVERSAL_SELECTOR, NESTING_SELECTOR, NTH_SELECTOR, NTH_OF_SELECTOR, LANG_SELECTOR, MEDIA_QUERY, MEDIA_FEATURE, MEDIA_TYPE, CONTAINER_QUERY, SUPPORTS_QUERY, LAYER_NAME, PRELUDE_OPERATOR } from './arena';
|
|
2
|
+
import { STYLESHEET, STYLE_RULE, AT_RULE, DECLARATION, SELECTOR, COMMENT, BLOCK, IDENTIFIER, NUMBER, DIMENSION, STRING, HASH, FUNCTION, OPERATOR, PARENTHESIS, URL, VALUE, SELECTOR_LIST, TYPE_SELECTOR, CLASS_SELECTOR, ID_SELECTOR, ATTRIBUTE_SELECTOR, PSEUDO_CLASS_SELECTOR, PSEUDO_ELEMENT_SELECTOR, COMBINATOR, UNIVERSAL_SELECTOR, NESTING_SELECTOR, NTH_SELECTOR, NTH_OF_SELECTOR, LANG_SELECTOR, MEDIA_QUERY, MEDIA_FEATURE, MEDIA_TYPE, CONTAINER_QUERY, SUPPORTS_QUERY, LAYER_NAME, PRELUDE_OPERATOR, FEATURE_RANGE } from './arena';
|
|
3
3
|
export declare const TYPE_NAMES: {
|
|
4
4
|
readonly 1: "StyleSheet";
|
|
5
5
|
readonly 2: "Rule";
|
|
@@ -17,6 +17,7 @@ export declare const TYPE_NAMES: {
|
|
|
17
17
|
readonly 16: "Operator";
|
|
18
18
|
readonly 17: "Parentheses";
|
|
19
19
|
readonly 18: "Url";
|
|
20
|
+
readonly 19: "Value";
|
|
20
21
|
readonly 20: "SelectorList";
|
|
21
22
|
readonly 21: "TypeSelector";
|
|
22
23
|
readonly 22: "ClassSelector";
|
|
@@ -37,9 +38,10 @@ export declare const TYPE_NAMES: {
|
|
|
37
38
|
readonly 36: "SupportsQuery";
|
|
38
39
|
readonly 37: "Layer";
|
|
39
40
|
readonly 38: "Operator";
|
|
41
|
+
readonly 39: "MediaFeatureRange";
|
|
40
42
|
};
|
|
41
43
|
export type TypeName = (typeof TYPE_NAMES)[keyof typeof TYPE_NAMES] | 'unknown';
|
|
42
|
-
export type CSSNodeType = typeof STYLESHEET | typeof STYLE_RULE | typeof AT_RULE | typeof DECLARATION | typeof SELECTOR | typeof COMMENT | typeof BLOCK | typeof IDENTIFIER | typeof NUMBER | typeof DIMENSION | typeof STRING | typeof HASH | typeof FUNCTION | typeof OPERATOR | typeof PARENTHESIS | typeof URL | typeof SELECTOR_LIST | typeof TYPE_SELECTOR | typeof CLASS_SELECTOR | typeof ID_SELECTOR | typeof ATTRIBUTE_SELECTOR | typeof PSEUDO_CLASS_SELECTOR | typeof PSEUDO_ELEMENT_SELECTOR | typeof COMBINATOR | typeof UNIVERSAL_SELECTOR | typeof NESTING_SELECTOR | typeof NTH_SELECTOR | typeof NTH_OF_SELECTOR | typeof LANG_SELECTOR | typeof MEDIA_QUERY | typeof MEDIA_FEATURE | typeof MEDIA_TYPE | typeof CONTAINER_QUERY | typeof SUPPORTS_QUERY | typeof LAYER_NAME | typeof PRELUDE_OPERATOR;
|
|
44
|
+
export type CSSNodeType = typeof STYLESHEET | typeof STYLE_RULE | typeof AT_RULE | typeof DECLARATION | typeof SELECTOR | typeof COMMENT | typeof BLOCK | typeof IDENTIFIER | typeof NUMBER | typeof DIMENSION | typeof STRING | typeof HASH | typeof FUNCTION | typeof OPERATOR | typeof PARENTHESIS | typeof URL | typeof VALUE | typeof SELECTOR_LIST | typeof TYPE_SELECTOR | typeof CLASS_SELECTOR | typeof ID_SELECTOR | typeof ATTRIBUTE_SELECTOR | typeof PSEUDO_CLASS_SELECTOR | typeof PSEUDO_ELEMENT_SELECTOR | typeof COMBINATOR | typeof UNIVERSAL_SELECTOR | typeof NESTING_SELECTOR | typeof NTH_SELECTOR | typeof NTH_OF_SELECTOR | typeof LANG_SELECTOR | typeof MEDIA_QUERY | typeof MEDIA_FEATURE | typeof MEDIA_TYPE | typeof CONTAINER_QUERY | typeof SUPPORTS_QUERY | typeof LAYER_NAME | typeof PRELUDE_OPERATOR | typeof FEATURE_RANGE;
|
|
43
45
|
export interface CloneOptions {
|
|
44
46
|
/**
|
|
45
47
|
* Recursively clone all children
|
|
@@ -101,7 +103,7 @@ export declare class CSSNode {
|
|
|
101
103
|
* For URL nodes with quoted string: returns the string with quotes (consistent with STRING node)
|
|
102
104
|
* For URL nodes with unquoted URL: returns the URL content without quotes
|
|
103
105
|
*/
|
|
104
|
-
get value(): string | number | null;
|
|
106
|
+
get value(): CSSNode | string | number | null;
|
|
105
107
|
/** Get the numeric value for NUMBER and DIMENSION nodes, or null for other node types */
|
|
106
108
|
get value_as_number(): number | null;
|
|
107
109
|
/**
|
|
@@ -139,8 +141,6 @@ export declare class CSSNode {
|
|
|
139
141
|
get block(): CSSNode | null;
|
|
140
142
|
/** Check if this block is empty (no declarations or rules, only comments allowed) */
|
|
141
143
|
get is_empty(): boolean;
|
|
142
|
-
/** Get array of parsed value nodes (for declarations only) */
|
|
143
|
-
get values(): CSSNode[];
|
|
144
144
|
/** Get start line number */
|
|
145
145
|
get line(): number;
|
|
146
146
|
/** Get start column number */
|
package/dist/css-node.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DIMENSION, NUMBER, URL, STRING,
|
|
1
|
+
import { DECLARATION, DIMENSION, NUMBER, URL, STRING, FLAG_IMPORTANT, FLAG_BROWSERHACK, IDENTIFIER, FUNCTION, AT_RULE, PSEUDO_ELEMENT_SELECTOR, PSEUDO_CLASS_SELECTOR, FLAG_HAS_ERROR, FLAG_HAS_BLOCK, FLAG_HAS_DECLARATIONS, STYLE_RULE, BLOCK, COMMENT, FLAG_HAS_PARENS, NTH_SELECTOR, NTH_OF_SELECTOR, SELECTOR_LIST, SELECTOR, COMBINATOR, ATTRIBUTE_SELECTOR, FEATURE_RANGE, PRELUDE_OPERATOR, LAYER_NAME, SUPPORTS_QUERY, CONTAINER_QUERY, MEDIA_TYPE, MEDIA_FEATURE, MEDIA_QUERY, LANG_SELECTOR, NESTING_SELECTOR, UNIVERSAL_SELECTOR, ID_SELECTOR, CLASS_SELECTOR, TYPE_SELECTOR, VALUE, PARENTHESIS, OPERATOR, HASH, STYLESHEET } from './arena.js';
|
|
2
2
|
import { str_starts_with, is_vendor_prefixed, is_whitespace, CHAR_MINUS_HYPHEN, CHAR_PLUS } from './string-utils.js';
|
|
3
3
|
import { parse_dimension } from './parse-utils.js';
|
|
4
4
|
|
|
@@ -19,6 +19,7 @@ const TYPE_NAMES = {
|
|
|
19
19
|
[OPERATOR]: "Operator",
|
|
20
20
|
[PARENTHESIS]: "Parentheses",
|
|
21
21
|
[URL]: "Url",
|
|
22
|
+
[VALUE]: "Value",
|
|
22
23
|
[SELECTOR_LIST]: "SelectorList",
|
|
23
24
|
[TYPE_SELECTOR]: "TypeSelector",
|
|
24
25
|
[CLASS_SELECTOR]: "ClassSelector",
|
|
@@ -38,7 +39,8 @@ const TYPE_NAMES = {
|
|
|
38
39
|
[CONTAINER_QUERY]: "ContainerQuery",
|
|
39
40
|
[SUPPORTS_QUERY]: "SupportsQuery",
|
|
40
41
|
[LAYER_NAME]: "Layer",
|
|
41
|
-
[PRELUDE_OPERATOR]: "Operator"
|
|
42
|
+
[PRELUDE_OPERATOR]: "Operator",
|
|
43
|
+
[FEATURE_RANGE]: "MediaFeatureRange"
|
|
42
44
|
};
|
|
43
45
|
class CSSNode {
|
|
44
46
|
arena;
|
|
@@ -93,6 +95,9 @@ class CSSNode {
|
|
|
93
95
|
*/
|
|
94
96
|
get value() {
|
|
95
97
|
let { type, text } = this;
|
|
98
|
+
if (type === DECLARATION && this.first_child) {
|
|
99
|
+
return this.first_child;
|
|
100
|
+
}
|
|
96
101
|
if (type === DIMENSION) {
|
|
97
102
|
return parse_dimension(text).value;
|
|
98
103
|
}
|
|
@@ -237,17 +242,6 @@ class CSSNode {
|
|
|
237
242
|
}
|
|
238
243
|
return true;
|
|
239
244
|
}
|
|
240
|
-
// --- Value Node Access (for declarations) ---
|
|
241
|
-
/** Get array of parsed value nodes (for declarations only) */
|
|
242
|
-
get values() {
|
|
243
|
-
let result = [];
|
|
244
|
-
let child = this.first_child;
|
|
245
|
-
while (child) {
|
|
246
|
-
result.push(child);
|
|
247
|
-
child = child.next_sibling;
|
|
248
|
-
}
|
|
249
|
-
return result;
|
|
250
|
-
}
|
|
251
245
|
/** Get start line number */
|
|
252
246
|
get line() {
|
|
253
247
|
return this.arena.get_start_line(this.index);
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,6 @@ export { tokenize } from './tokenize.js';
|
|
|
7
7
|
export { BREAK, SKIP, traverse, walk } from './walk.js';
|
|
8
8
|
export { is_custom, is_vendor_prefixed, str_equals, str_index_of, str_starts_with } from './string-utils.js';
|
|
9
9
|
export { CSSNode, TYPE_NAMES } from './css-node.js';
|
|
10
|
-
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, BLOCK, CLASS_SELECTOR, COMBINATOR, COMMENT, CONTAINER_QUERY, DECLARATION, DIMENSION, FLAG_IMPORTANT, 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, UNIVERSAL_SELECTOR, URL } from './arena.js';
|
|
10
|
+
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, BLOCK, CLASS_SELECTOR, COMBINATOR, COMMENT, CONTAINER_QUERY, DECLARATION, DIMENSION, FEATURE_RANGE, FLAG_IMPORTANT, 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, UNIVERSAL_SELECTOR, URL, VALUE } from './arena.js';
|
|
11
11
|
export { NODE_TYPES } from './constants.js';
|
|
12
12
|
export { TOKEN_AT_KEYWORD, TOKEN_BAD_STRING, TOKEN_BAD_URL, TOKEN_CDC, TOKEN_CDO, TOKEN_COLON, TOKEN_COMMA, TOKEN_COMMENT, TOKEN_DELIM, TOKEN_DIMENSION, TOKEN_EOF, TOKEN_FUNCTION, TOKEN_HASH, TOKEN_IDENT, TOKEN_LEFT_BRACE, TOKEN_LEFT_BRACKET, TOKEN_LEFT_PAREN, TOKEN_NUMBER, TOKEN_PERCENTAGE, TOKEN_RIGHT_BRACE, TOKEN_RIGHT_BRACKET, TOKEN_RIGHT_PAREN, TOKEN_SEMICOLON, TOKEN_STRING, TOKEN_URL, TOKEN_WHITESPACE } from './token-types.js';
|
|
@@ -1,7 +1,7 @@
|
|
|
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, URL } from './arena.js';
|
|
3
|
-
import { TOKEN_COMMA, TOKEN_IDENT, TOKEN_LEFT_PAREN, TOKEN_RIGHT_PAREN, TOKEN_FUNCTION, TOKEN_EOF, TOKEN_WHITESPACE, TOKEN_URL, TOKEN_STRING } from './token-types.js';
|
|
4
|
-
import { str_equals } from './string-utils.js';
|
|
2
|
+
import { CSSDataArena, PRELUDE_OPERATOR, MEDIA_TYPE, MEDIA_QUERY, MEDIA_FEATURE, FUNCTION, IDENTIFIER, CONTAINER_QUERY, SUPPORTS_QUERY, LAYER_NAME, URL, STRING, DIMENSION, NUMBER, FEATURE_RANGE } from './arena.js';
|
|
3
|
+
import { TOKEN_COMMA, TOKEN_IDENT, TOKEN_LEFT_PAREN, TOKEN_RIGHT_PAREN, TOKEN_FUNCTION, TOKEN_EOF, TOKEN_WHITESPACE, TOKEN_URL, TOKEN_STRING, TOKEN_DIMENSION, TOKEN_PERCENTAGE, TOKEN_NUMBER } from './token-types.js';
|
|
4
|
+
import { str_equals, CHAR_LESS_THAN, CHAR_GREATER_THAN, CHAR_EQUALS, CHAR_COLON, is_whitespace } from './string-utils.js';
|
|
5
5
|
import { trim_boundaries, skip_whitespace_forward } from './parse-utils.js';
|
|
6
6
|
import { CSSNode } from './css-node.js';
|
|
7
7
|
|
|
@@ -113,7 +113,7 @@ class AtRulePreludeParser {
|
|
|
113
113
|
this.arena.append_children(query_node, components);
|
|
114
114
|
return query_node;
|
|
115
115
|
}
|
|
116
|
-
// Parse media feature: (min-width: 768px)
|
|
116
|
+
// Parse media feature: (min-width: 768px) or range: (50px <= width <= 100px)
|
|
117
117
|
parse_media_feature() {
|
|
118
118
|
let feature_start = this.lexer.token_start;
|
|
119
119
|
let depth = 1;
|
|
@@ -130,11 +130,44 @@ class AtRulePreludeParser {
|
|
|
130
130
|
if (depth !== 0) return null;
|
|
131
131
|
let content_end = this.lexer.token_start;
|
|
132
132
|
let feature_end = this.lexer.token_end;
|
|
133
|
+
let has_comparison = false;
|
|
134
|
+
for (let i = content_start; i < content_end; i++) {
|
|
135
|
+
let ch = this.source.charCodeAt(i);
|
|
136
|
+
if (ch === CHAR_LESS_THAN || ch === CHAR_GREATER_THAN || ch === CHAR_EQUALS) {
|
|
137
|
+
has_comparison = true;
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (has_comparison) {
|
|
142
|
+
return this.parse_feature_range(feature_start, feature_end, content_start, content_end);
|
|
143
|
+
}
|
|
133
144
|
let feature = this.create_node(MEDIA_FEATURE, feature_start, feature_end);
|
|
134
|
-
let
|
|
135
|
-
|
|
136
|
-
this.
|
|
137
|
-
|
|
145
|
+
let colon_pos = -1;
|
|
146
|
+
for (let i = content_start; i < content_end; i++) {
|
|
147
|
+
if (this.source.charCodeAt(i) === CHAR_COLON) {
|
|
148
|
+
colon_pos = i;
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (colon_pos !== -1) {
|
|
153
|
+
let name_trimmed = trim_boundaries(this.source, content_start, colon_pos);
|
|
154
|
+
if (name_trimmed) {
|
|
155
|
+
this.arena.set_content_start_delta(feature, name_trimmed[0] - feature_start);
|
|
156
|
+
this.arena.set_content_length(feature, name_trimmed[1] - name_trimmed[0]);
|
|
157
|
+
}
|
|
158
|
+
let value_trimmed = trim_boundaries(this.source, colon_pos + 1, content_end);
|
|
159
|
+
if (value_trimmed) {
|
|
160
|
+
let value_nodes = this.parse_feature_value(value_trimmed[0], value_trimmed[1]);
|
|
161
|
+
if (value_nodes.length > 0) {
|
|
162
|
+
this.arena.append_children(feature, value_nodes);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
} else {
|
|
166
|
+
let trimmed = trim_boundaries(this.source, content_start, content_end);
|
|
167
|
+
if (trimmed) {
|
|
168
|
+
this.arena.set_content_start_delta(feature, trimmed[0] - feature_start);
|
|
169
|
+
this.arena.set_content_length(feature, trimmed[1] - trimmed[0]);
|
|
170
|
+
}
|
|
138
171
|
}
|
|
139
172
|
return feature;
|
|
140
173
|
}
|
|
@@ -433,6 +466,82 @@ class AtRulePreludeParser {
|
|
|
433
466
|
}
|
|
434
467
|
return this.lexer.next_token_fast(false);
|
|
435
468
|
}
|
|
469
|
+
// Helper: Parse a single value token into a node
|
|
470
|
+
parse_value_token() {
|
|
471
|
+
switch (this.lexer.token_type) {
|
|
472
|
+
case TOKEN_IDENT:
|
|
473
|
+
return this.create_node(IDENTIFIER, this.lexer.token_start, this.lexer.token_end);
|
|
474
|
+
case TOKEN_NUMBER:
|
|
475
|
+
return this.create_node(NUMBER, this.lexer.token_start, this.lexer.token_end);
|
|
476
|
+
case TOKEN_PERCENTAGE:
|
|
477
|
+
case TOKEN_DIMENSION:
|
|
478
|
+
return this.create_node(DIMENSION, this.lexer.token_start, this.lexer.token_end);
|
|
479
|
+
case TOKEN_STRING:
|
|
480
|
+
return this.create_node(STRING, this.lexer.token_start, this.lexer.token_end);
|
|
481
|
+
default:
|
|
482
|
+
return null;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
// Helper: Parse feature value portion into typed nodes
|
|
486
|
+
parse_feature_value(start, end) {
|
|
487
|
+
let saved_pos = this.lexer.save_position();
|
|
488
|
+
this.lexer.pos = start;
|
|
489
|
+
let nodes = [];
|
|
490
|
+
while (this.lexer.pos < end) {
|
|
491
|
+
this.lexer.next_token_fast(false);
|
|
492
|
+
if (this.lexer.token_start >= end) break;
|
|
493
|
+
let all_whitespace = true;
|
|
494
|
+
for (let i = this.lexer.token_start; i < this.lexer.token_end && i < end; i++) {
|
|
495
|
+
if (!is_whitespace(this.source.charCodeAt(i))) {
|
|
496
|
+
all_whitespace = false;
|
|
497
|
+
break;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
if (all_whitespace) continue;
|
|
501
|
+
let node = this.parse_value_token();
|
|
502
|
+
if (node !== null) nodes.push(node);
|
|
503
|
+
}
|
|
504
|
+
this.lexer.restore_position(saved_pos);
|
|
505
|
+
return nodes;
|
|
506
|
+
}
|
|
507
|
+
// Parse media feature range syntax: (50px <= width <= 100px)
|
|
508
|
+
parse_feature_range(feature_start, feature_end, content_start, content_end) {
|
|
509
|
+
let range_node = this.create_node(FEATURE_RANGE, feature_start, feature_end);
|
|
510
|
+
let children = [];
|
|
511
|
+
let feature_name_start = -1;
|
|
512
|
+
let feature_name_end = -1;
|
|
513
|
+
let pos = content_start;
|
|
514
|
+
while (pos < content_end) {
|
|
515
|
+
pos = skip_whitespace_forward(this.source, pos, content_end);
|
|
516
|
+
if (pos >= content_end) break;
|
|
517
|
+
let ch = this.source.charCodeAt(pos);
|
|
518
|
+
if (ch === CHAR_LESS_THAN || ch === CHAR_GREATER_THAN || ch === CHAR_EQUALS) {
|
|
519
|
+
let op_start = pos++;
|
|
520
|
+
if (pos < content_end && this.source.charCodeAt(pos) === CHAR_EQUALS) pos++;
|
|
521
|
+
let op = this.create_node(PRELUDE_OPERATOR, op_start, pos);
|
|
522
|
+
children.push(op);
|
|
523
|
+
} else {
|
|
524
|
+
let saved = this.lexer.save_position();
|
|
525
|
+
this.lexer.pos = pos;
|
|
526
|
+
this.next_token();
|
|
527
|
+
if (this.lexer.token_type === TOKEN_IDENT) {
|
|
528
|
+
feature_name_start = this.lexer.token_start;
|
|
529
|
+
feature_name_end = this.lexer.token_end;
|
|
530
|
+
} else {
|
|
531
|
+
let value_nodes = this.parse_feature_value(this.lexer.token_start, this.lexer.token_end);
|
|
532
|
+
children.push(...value_nodes);
|
|
533
|
+
}
|
|
534
|
+
pos = this.lexer.pos;
|
|
535
|
+
this.lexer.restore_position(saved);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
if (feature_name_start !== -1) {
|
|
539
|
+
this.arena.set_content_start_delta(range_node, feature_name_start - feature_start);
|
|
540
|
+
this.arena.set_content_length(range_node, feature_name_end - feature_name_start);
|
|
541
|
+
}
|
|
542
|
+
this.arena.append_children(range_node, children);
|
|
543
|
+
return range_node;
|
|
544
|
+
}
|
|
436
545
|
}
|
|
437
546
|
function parse_atrule_prelude(at_rule_name, prelude) {
|
|
438
547
|
const arena = new CSSDataArena(CSSDataArena.capacity_for_source(prelude.length));
|
|
@@ -124,12 +124,16 @@ class DeclarationParser {
|
|
|
124
124
|
this.arena.set_value_start_delta(declaration, trimmed[0] - prop_start);
|
|
125
125
|
this.arena.set_value_length(declaration, trimmed[1] - trimmed[0]);
|
|
126
126
|
if (this.value_parser) {
|
|
127
|
-
let
|
|
128
|
-
this.arena.append_children(declaration,
|
|
127
|
+
let valueNode = this.value_parser.parse_value(value_start, trimmed[1], value_start_line, value_start_column);
|
|
128
|
+
this.arena.append_children(declaration, [valueNode]);
|
|
129
129
|
}
|
|
130
130
|
} else {
|
|
131
131
|
this.arena.set_value_start_delta(declaration, value_start - prop_start);
|
|
132
132
|
this.arena.set_value_length(declaration, 0);
|
|
133
|
+
if (this.value_parser) {
|
|
134
|
+
let valueNode = this.value_parser.parse_value(value_start, value_start, value_start_line, value_start_column);
|
|
135
|
+
this.arena.append_children(declaration, [valueNode]);
|
|
136
|
+
}
|
|
133
137
|
}
|
|
134
138
|
if (has_important) {
|
|
135
139
|
this.arena.set_flag(declaration, FLAG_IMPORTANT);
|
package/dist/parse-value.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CSSNode } from './css-node';
|
|
2
2
|
/**
|
|
3
|
-
* Parse a CSS declaration value string and return
|
|
3
|
+
* Parse a CSS declaration value string and return a VALUE node
|
|
4
4
|
* @param value_string - The CSS value to parse (e.g., "1px solid red")
|
|
5
|
-
* @returns
|
|
5
|
+
* @returns A CSSNode VALUE wrapper containing the parsed value tokens as children
|
|
6
6
|
*/
|
|
7
|
-
export declare function parse_value(value_string: string): CSSNode
|
|
7
|
+
export declare function parse_value(value_string: string): CSSNode;
|
package/dist/parse-value.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Lexer } from './tokenize.js';
|
|
2
|
-
import { CSSDataArena, OPERATOR, HASH, STRING, DIMENSION, NUMBER, IDENTIFIER, URL, FUNCTION, PARENTHESIS } from './arena.js';
|
|
2
|
+
import { CSSDataArena, VALUE, OPERATOR, HASH, STRING, DIMENSION, NUMBER, IDENTIFIER, URL, FUNCTION, PARENTHESIS } from './arena.js';
|
|
3
3
|
import { TOKEN_EOF, TOKEN_LEFT_PAREN, TOKEN_COMMA, TOKEN_DELIM, TOKEN_FUNCTION, TOKEN_HASH, TOKEN_STRING, TOKEN_DIMENSION, TOKEN_PERCENTAGE, TOKEN_NUMBER, TOKEN_IDENT, TOKEN_RIGHT_PAREN } from './token-types.js';
|
|
4
4
|
import { is_whitespace, CHAR_PLUS, CHAR_MINUS_HYPHEN, CHAR_ASTERISK, CHAR_FORWARD_SLASH, str_equals } from './string-utils.js';
|
|
5
5
|
import { CSSNode } from './css-node.js';
|
|
@@ -15,14 +15,24 @@ class ValueParser {
|
|
|
15
15
|
this.lexer = new Lexer(source, false);
|
|
16
16
|
this.value_end = 0;
|
|
17
17
|
}
|
|
18
|
-
// Parse a declaration value range into
|
|
19
|
-
// Returns
|
|
18
|
+
// Parse a declaration value range into a VALUE wrapper node
|
|
19
|
+
// Returns single VALUE node index
|
|
20
20
|
parse_value(start, end, start_line, start_column) {
|
|
21
21
|
this.value_end = end;
|
|
22
22
|
this.lexer.pos = start;
|
|
23
23
|
this.lexer.line = start_line;
|
|
24
24
|
this.lexer.column = start_column;
|
|
25
|
-
|
|
25
|
+
let value_nodes = this.parse_value_tokens();
|
|
26
|
+
if (value_nodes.length === 0) {
|
|
27
|
+
let value_node2 = this.arena.create_node(VALUE, start, 0, start_line, start_column);
|
|
28
|
+
return value_node2;
|
|
29
|
+
}
|
|
30
|
+
let first_node_start = this.arena.get_start_offset(value_nodes[0]);
|
|
31
|
+
let last_node_index = value_nodes[value_nodes.length - 1];
|
|
32
|
+
let last_node_end = this.arena.get_start_offset(last_node_index) + this.arena.get_length(last_node_index);
|
|
33
|
+
let value_node = this.arena.create_node(VALUE, first_node_start, last_node_end - first_node_start, start_line, start_column);
|
|
34
|
+
this.arena.append_children(value_node, value_nodes);
|
|
35
|
+
return value_node;
|
|
26
36
|
}
|
|
27
37
|
// Core token parsing logic
|
|
28
38
|
parse_value_tokens() {
|
|
@@ -210,8 +220,8 @@ class ValueParser {
|
|
|
210
220
|
function parse_value(value_string) {
|
|
211
221
|
const arena = new CSSDataArena(CSSDataArena.capacity_for_source(value_string.length));
|
|
212
222
|
const value_parser = new ValueParser(arena, value_string);
|
|
213
|
-
const
|
|
214
|
-
return
|
|
223
|
+
const value_node_index = value_parser.parse_value(0, value_string.length, 1, 1);
|
|
224
|
+
return new CSSNode(arena, value_string, value_node_index);
|
|
215
225
|
}
|
|
216
226
|
|
|
217
227
|
export { ValueParser, parse_value };
|
package/dist/string-utils.d.ts
CHANGED
|
@@ -18,6 +18,7 @@ export declare const CHAR_PIPE = 124;
|
|
|
18
18
|
export declare const CHAR_DOLLAR = 36;
|
|
19
19
|
export declare const CHAR_CARET = 94;
|
|
20
20
|
export declare const CHAR_COLON = 58;
|
|
21
|
+
export declare const CHAR_LESS_THAN = 60;
|
|
21
22
|
/**
|
|
22
23
|
* @param a Base string, MUST be lowercase!
|
|
23
24
|
* @param b Compare string
|
package/dist/string-utils.js
CHANGED
|
@@ -18,6 +18,7 @@ const CHAR_PIPE = 124;
|
|
|
18
18
|
const CHAR_DOLLAR = 36;
|
|
19
19
|
const CHAR_CARET = 94;
|
|
20
20
|
const CHAR_COLON = 58;
|
|
21
|
+
const CHAR_LESS_THAN = 60;
|
|
21
22
|
function is_whitespace(ch) {
|
|
22
23
|
return ch === CHAR_SPACE || ch === CHAR_TAB || ch === CHAR_NEWLINE || ch === CHAR_CARRIAGE_RETURN || ch === CHAR_FORM_FEED;
|
|
23
24
|
}
|
|
@@ -114,4 +115,4 @@ function is_custom(str) {
|
|
|
114
115
|
return str.charCodeAt(0) === CHAR_MINUS_HYPHEN && str.charCodeAt(1) === CHAR_MINUS_HYPHEN;
|
|
115
116
|
}
|
|
116
117
|
|
|
117
|
-
export { CHAR_AMPERSAND, CHAR_ASTERISK, CHAR_CARET, CHAR_CARRIAGE_RETURN, CHAR_COLON, CHAR_DOLLAR, CHAR_DOUBLE_QUOTE, CHAR_EQUALS, CHAR_FORM_FEED, CHAR_FORWARD_SLASH, CHAR_GREATER_THAN, CHAR_MINUS_HYPHEN, CHAR_NEWLINE, CHAR_PERIOD, CHAR_PIPE, CHAR_PLUS, CHAR_SINGLE_QUOTE, CHAR_SPACE, CHAR_TAB, CHAR_TILDE, is_combinator, is_custom, is_digit, is_vendor_prefixed, is_whitespace, str_equals, str_index_of, str_starts_with };
|
|
118
|
+
export { CHAR_AMPERSAND, CHAR_ASTERISK, CHAR_CARET, CHAR_CARRIAGE_RETURN, CHAR_COLON, CHAR_DOLLAR, CHAR_DOUBLE_QUOTE, CHAR_EQUALS, CHAR_FORM_FEED, CHAR_FORWARD_SLASH, CHAR_GREATER_THAN, CHAR_LESS_THAN, CHAR_MINUS_HYPHEN, CHAR_NEWLINE, CHAR_PERIOD, CHAR_PIPE, CHAR_PLUS, CHAR_SINGLE_QUOTE, CHAR_SPACE, CHAR_TAB, CHAR_TILDE, is_combinator, is_custom, is_digit, is_vendor_prefixed, is_whitespace, str_equals, str_index_of, str_starts_with };
|
package/package.json
CHANGED