@rickosborne/css 2025.2.16 → 2025.2.26
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/README.md +0 -84
- package/color-parser.cjs +108 -87
- package/color-parser.cjs.map +1 -1
- package/color-parser.d.ts.map +1 -1
- package/color-parser.mjs +108 -87
- package/color-parser.mjs.map +1 -1
- package/index.cjs +0 -1
- package/index.cjs.map +1 -1
- package/index.d.ts +0 -1
- package/index.d.ts.map +1 -1
- package/index.mjs +0 -1
- package/index.mjs.map +1 -1
- package/package.json +9 -15
- package/tokenizer.cjs +0 -87
- package/tokenizer.cjs.map +0 -6
- package/tokenizer.d.ts +0 -34
- package/tokenizer.d.ts.map +0 -1
- package/tokenizer.mjs +0 -68
- package/tokenizer.mjs.map +0 -6
package/README.md
CHANGED
|
@@ -275,18 +275,6 @@ isTransparentHex: (hex: string) => boolean
|
|
|
275
275
|
Whether the given hex would produce a fully transparent (alpha 0) color.
|
|
276
276
|
|
|
277
277
|
|
|
278
|
-
#### readFromCSS
|
|
279
|
-
|
|
280
|
-
<a id="api-readfromcss"></a>
|
|
281
|
-
|
|
282
|
-
```typescript
|
|
283
|
-
readFromCSS: (text: string) => CSSTokenReader
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
Minimal CSS pull parser, which only supports the happy-path tokens expected in a CSS color expression. Does not support anywhere near the full CSS Colors spec, but it'll do in a pinch.
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
278
|
#### toCSSColorName
|
|
291
279
|
|
|
292
280
|
<a id="api-tocsscolorname"></a>
|
|
@@ -297,14 +285,6 @@ toCSSColorName: (name: unknown) => CSSColorName | undefined
|
|
|
297
285
|
|
|
298
286
|
### Interfaces
|
|
299
287
|
|
|
300
|
-
#### CSSColorToken
|
|
301
|
-
|
|
302
|
-
<a id="api-csscolortoken"></a>
|
|
303
|
-
|
|
304
|
-
```typescript
|
|
305
|
-
export interface CSSColorToken<Type extends string = string>
|
|
306
|
-
```
|
|
307
|
-
|
|
308
288
|
#### CSSErrorOptions
|
|
309
289
|
|
|
310
290
|
<a id="api-csserroroptions"></a>
|
|
@@ -313,62 +293,6 @@ export interface CSSColorToken<Type extends string = string>
|
|
|
313
293
|
export interface CSSErrorOptions extends ErrorOptions
|
|
314
294
|
```
|
|
315
295
|
|
|
316
|
-
#### CSSFunctionToken
|
|
317
|
-
|
|
318
|
-
<a id="api-cssfunctiontoken"></a>
|
|
319
|
-
|
|
320
|
-
```typescript
|
|
321
|
-
export interface CSSFunctionToken extends CSSColorToken<"function">
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
#### CSSHexHashToken
|
|
325
|
-
|
|
326
|
-
<a id="api-csshexhashtoken"></a>
|
|
327
|
-
|
|
328
|
-
```typescript
|
|
329
|
-
export interface CSSHexHashToken extends CSSColorToken<"hex">
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
#### CSSKeywordToken
|
|
333
|
-
|
|
334
|
-
<a id="api-csskeywordtoken"></a>
|
|
335
|
-
|
|
336
|
-
```typescript
|
|
337
|
-
export interface CSSKeywordToken extends CSSColorToken<"keyword">
|
|
338
|
-
```
|
|
339
|
-
|
|
340
|
-
#### CSSLiteralToken
|
|
341
|
-
|
|
342
|
-
<a id="api-cssliteraltoken"></a>
|
|
343
|
-
|
|
344
|
-
```typescript
|
|
345
|
-
export interface CSSLiteralToken extends CSSColorToken<"literal">
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
#### CSSNumberToken
|
|
349
|
-
|
|
350
|
-
<a id="api-cssnumbertoken"></a>
|
|
351
|
-
|
|
352
|
-
```typescript
|
|
353
|
-
export interface CSSNumberToken extends CSSColorToken<"number">
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
#### CSSTokenReader
|
|
357
|
-
|
|
358
|
-
<a id="api-csstokenreader"></a>
|
|
359
|
-
|
|
360
|
-
```typescript
|
|
361
|
-
export interface CSSTokenReader
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
#### CSSTokenReaderMatcher
|
|
365
|
-
|
|
366
|
-
<a id="api-csstokenreadermatcher"></a>
|
|
367
|
-
|
|
368
|
-
```typescript
|
|
369
|
-
export interface CSSTokenReaderMatcher<Type extends CSSToken["type"] = CSSToken["type"]>
|
|
370
|
-
```
|
|
371
|
-
|
|
372
296
|
#### FunctionColorToken
|
|
373
297
|
|
|
374
298
|
<a id="api-functioncolortoken"></a>
|
|
@@ -458,14 +382,6 @@ type CSSLengthUnit = CSSRelativeLengthUnit | CSSAbsoluteLengthUnit;
|
|
|
458
382
|
type CSSRelativeLengthUnit = "em" | "ex" | "cap" | "ch" | "ic" | "rem" | "lh" | "rlh" | "vw" | "vh" | "vi" | "vb" | "vmin" | "vmax" | "svw" | "lvw" | "dvw" | "svh" | "lvh" | "dvh" | "svi" | "lvi" | "dvi" | "svb" | "lvb" | "dvb" | "svmin" | "lvmin" | "dvmin" | "svmax" | "lvmax" | "dvmax";
|
|
459
383
|
```
|
|
460
384
|
|
|
461
|
-
#### CSSToken
|
|
462
|
-
|
|
463
|
-
<a id="api-csstoken"></a>
|
|
464
|
-
|
|
465
|
-
```typescript
|
|
466
|
-
type CSSToken = CSSKeywordToken | CSSFunctionToken | CSSHexHashToken | CSSLiteralToken | CSSNumberToken;
|
|
467
|
-
```
|
|
468
|
-
|
|
469
385
|
#### DimensionPair
|
|
470
386
|
|
|
471
387
|
<a id="api-dimensionpair"></a>
|
package/color-parser.cjs
CHANGED
|
@@ -23,110 +23,131 @@ __export(color_parser_exports, {
|
|
|
23
23
|
colorTokensFromCSS: () => colorTokensFromCSS
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(color_parser_exports);
|
|
26
|
+
var import_foundation = require("@rickosborne/foundation");
|
|
27
|
+
var import_guard = require("@rickosborne/guard");
|
|
26
28
|
var import_colors = require("./colors.cjs");
|
|
27
29
|
var import_css_error = require("./css-error.cjs");
|
|
28
30
|
var import_href = require("./href.cjs");
|
|
29
|
-
var import_tokenizer = require("./tokenizer.cjs");
|
|
30
31
|
const COLOR_FUNCTIONS = Object.freeze(["color", "rgb", "rgba", "hsl", "hsla", "hwb"]);
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
{
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const keyword = kwOrFn.keyword;
|
|
47
|
-
const name = (0, import_colors.toCSSColorName)(keyword);
|
|
32
|
+
const _CSSColorTokenizer = class _CSSColorTokenizer extends import_foundation.StringTokenizer {
|
|
33
|
+
consumeColor() {
|
|
34
|
+
this.consumeSpace();
|
|
35
|
+
const char = this.peek();
|
|
36
|
+
if (char == null) {
|
|
37
|
+
return void 0;
|
|
38
|
+
}
|
|
39
|
+
if (char === "#") {
|
|
40
|
+
return this.consumeHex();
|
|
41
|
+
}
|
|
42
|
+
const literal = this.consumeLiteral();
|
|
43
|
+
if (COLOR_FUNCTIONS.includes(literal)) {
|
|
44
|
+
return this.consumeFunctionCall(literal);
|
|
45
|
+
}
|
|
46
|
+
const name = (0, import_colors.toCSSColorName)(literal);
|
|
48
47
|
if (name == null) {
|
|
49
|
-
throw
|
|
48
|
+
throw this.fail(`Unknown keyword: ${literal}`, { expected: "Color name", href: import_href.HREF_COLOR });
|
|
50
49
|
}
|
|
51
50
|
return { name };
|
|
52
51
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
52
|
+
consumeFunctionCall(functionName) {
|
|
53
|
+
this.consumeSpace();
|
|
54
|
+
this.consumeExact("(");
|
|
55
|
+
let space = void 0;
|
|
56
|
+
if (functionName === "color") {
|
|
57
|
+
space = this.consumeLiteral(() => this.fail("Missing color space", { href: import_href.HREF_COLOR_FN }));
|
|
58
|
+
}
|
|
59
|
+
const components = [];
|
|
60
|
+
const breakAfterComponent = /* @__PURE__ */ __name(() => {
|
|
61
|
+
this.consumeSpace();
|
|
62
|
+
if (components.length === 3) {
|
|
63
|
+
if (!this.tryConsume(",")) {
|
|
64
|
+
this.tryConsume("/");
|
|
65
|
+
}
|
|
66
|
+
} else {
|
|
67
|
+
this.tryConsume(",");
|
|
68
|
+
}
|
|
69
|
+
if (components.length >= 3) {
|
|
70
|
+
if (this.tryConsume(")")) {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}, "breakAfterComponent");
|
|
76
|
+
while (!this.done) {
|
|
77
|
+
if (components.length >= 4) {
|
|
78
|
+
throw this.fail(`Malformed ${functionName}() color`);
|
|
79
|
+
}
|
|
80
|
+
this.consumeSpace();
|
|
81
|
+
const component = this.tryConsumeColorComponent();
|
|
82
|
+
if (component != null) {
|
|
83
|
+
components.push(component);
|
|
84
|
+
if (breakAfterComponent()) {
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
} else {
|
|
88
|
+
throw this.fail(`Malformed ${functionName}() color`);
|
|
89
|
+
}
|
|
67
90
|
}
|
|
68
|
-
|
|
91
|
+
return {
|
|
92
|
+
components,
|
|
93
|
+
functionName,
|
|
94
|
+
...space == null ? {} : { space }
|
|
95
|
+
};
|
|
69
96
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
97
|
+
consumeHex() {
|
|
98
|
+
return { hex: this.consumeWhile((t, i) => i === 0 ? t === "#" : (0, import_guard.isHexDigit)(t)) };
|
|
99
|
+
}
|
|
100
|
+
consumeLiteral(errorProvider = () => new SyntaxError(`Expected a literal at ${this.at}`)) {
|
|
101
|
+
const literal = this.tryConsumeLiteral();
|
|
102
|
+
if (literal != null) {
|
|
103
|
+
return literal;
|
|
77
104
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
105
|
+
throw errorProvider();
|
|
106
|
+
}
|
|
107
|
+
fail(message, options = {}) {
|
|
108
|
+
return new import_css_error.CSSError(this.text, { ...options, message });
|
|
109
|
+
}
|
|
110
|
+
tryConsumeColorComponent() {
|
|
111
|
+
if (this.tryConsume("none")) {
|
|
112
|
+
return [0, void 0];
|
|
84
113
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
if (components.length >= 4) {
|
|
89
|
-
return fail(`Malformed ${functionName}() color`);
|
|
114
|
+
const maybeNumber = this.tryConsumeNumber();
|
|
115
|
+
if (maybeNumber == null) {
|
|
116
|
+
return void 0;
|
|
90
117
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
118
|
+
this.consumeSpace();
|
|
119
|
+
let unit;
|
|
120
|
+
if (this.tryConsume("%")) {
|
|
121
|
+
unit = "%";
|
|
122
|
+
} else {
|
|
123
|
+
unit = this.tryConsumeLiteral();
|
|
97
124
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
125
|
+
this.consumeSpace();
|
|
126
|
+
return [maybeNumber, unit];
|
|
127
|
+
}
|
|
128
|
+
tryConsumeLiteral() {
|
|
129
|
+
const literal = this.consumeWhile((t, i) => i === 0 ? new RegExp("^\\p{ID_Start}$", "u").test(t) : /^[-\p{ID_Continue}]$/u.test(t));
|
|
130
|
+
return literal === "" ? void 0 : literal;
|
|
131
|
+
}
|
|
132
|
+
tryConsumeNumber() {
|
|
133
|
+
const sign = this.tryConsume("-") ? -1 : 1;
|
|
134
|
+
const intText = this.consumeWhile(import_guard.isDigit);
|
|
135
|
+
if (intText === "") {
|
|
136
|
+
if (sign < 0) {
|
|
137
|
+
throw this.fail(`Expected a number at ${this.at}`);
|
|
105
138
|
}
|
|
139
|
+
return void 0;
|
|
106
140
|
}
|
|
107
|
-
if (
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
{ match: ["%"], type: "literal" }
|
|
111
|
-
);
|
|
112
|
-
let unit;
|
|
113
|
-
if ((unitToken == null ? void 0 : unitToken.type) === "literal") {
|
|
114
|
-
unit = unitToken.literal;
|
|
115
|
-
} else if ((unitToken == null ? void 0 : unitToken.type) === "keyword") {
|
|
116
|
-
unit = unitToken.keyword;
|
|
117
|
-
} else {
|
|
118
|
-
unit = void 0;
|
|
119
|
-
}
|
|
120
|
-
components.push([token.value, unit]);
|
|
121
|
-
if (breakAfterNumber()) {
|
|
122
|
-
break;
|
|
123
|
-
}
|
|
141
|
+
if (this.tryConsume(".")) {
|
|
142
|
+
const fracText = this.consumeWhile(import_guard.isDigit);
|
|
143
|
+
return sign * Number.parseFloat(`${intText}.${fracText}`);
|
|
124
144
|
}
|
|
145
|
+
return sign * Number.parseInt(intText, 10);
|
|
125
146
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
147
|
+
};
|
|
148
|
+
__name(_CSSColorTokenizer, "CSSColorTokenizer");
|
|
149
|
+
let CSSColorTokenizer = _CSSColorTokenizer;
|
|
150
|
+
const colorTokensFromCSS = /* @__PURE__ */ __name((text) => {
|
|
151
|
+
return new CSSColorTokenizer(text).consumeColor();
|
|
131
152
|
}, "colorTokensFromCSS");
|
|
132
153
|
//# sourceMappingURL=color-parser.cjs.map
|
package/color-parser.cjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/packages/css/color-parser.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/color-parser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"color-parser.d.ts","sourceRoot":"","sources":["../../../src/packages/css/color-parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"color-parser.d.ts","sourceRoot":"","sources":["../../../src/packages/css/color-parser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC7B,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,KAAK,CAAC,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC9B,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IAClC,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,aAAa,GAAG,kBAAkB,CAAC;AAEjF,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;AACjF,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,gBAAgB,EAAE,CAAmE,CAAC;AAgI7H,eAAO,MAAM,kBAAkB,SACxB,MAAM,KACV,cAAc,GAAG,SAEnB,CAAC"}
|
package/color-parser.mjs
CHANGED
|
@@ -1,110 +1,131 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
import { StringTokenizer } from "@rickosborne/foundation";
|
|
4
|
+
import { isDigit, isHexDigit } from "@rickosborne/guard";
|
|
3
5
|
import { toCSSColorName } from "./colors.mjs";
|
|
4
6
|
import { CSSError } from "./css-error.mjs";
|
|
5
7
|
import { HREF_COLOR, HREF_COLOR_FN } from "./href.mjs";
|
|
6
|
-
import { readFromCSS } from "./tokenizer.mjs";
|
|
7
8
|
const COLOR_FUNCTIONS = Object.freeze(["color", "rgb", "rgba", "hsl", "hsla", "hwb"]);
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
{
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const keyword = kwOrFn.keyword;
|
|
24
|
-
const name = toCSSColorName(keyword);
|
|
9
|
+
const _CSSColorTokenizer = class _CSSColorTokenizer extends StringTokenizer {
|
|
10
|
+
consumeColor() {
|
|
11
|
+
this.consumeSpace();
|
|
12
|
+
const char = this.peek();
|
|
13
|
+
if (char == null) {
|
|
14
|
+
return void 0;
|
|
15
|
+
}
|
|
16
|
+
if (char === "#") {
|
|
17
|
+
return this.consumeHex();
|
|
18
|
+
}
|
|
19
|
+
const literal = this.consumeLiteral();
|
|
20
|
+
if (COLOR_FUNCTIONS.includes(literal)) {
|
|
21
|
+
return this.consumeFunctionCall(literal);
|
|
22
|
+
}
|
|
23
|
+
const name = toCSSColorName(literal);
|
|
25
24
|
if (name == null) {
|
|
26
|
-
throw
|
|
25
|
+
throw this.fail(`Unknown keyword: ${literal}`, { expected: "Color name", href: HREF_COLOR });
|
|
27
26
|
}
|
|
28
27
|
return { name };
|
|
29
28
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
29
|
+
consumeFunctionCall(functionName) {
|
|
30
|
+
this.consumeSpace();
|
|
31
|
+
this.consumeExact("(");
|
|
32
|
+
let space = void 0;
|
|
33
|
+
if (functionName === "color") {
|
|
34
|
+
space = this.consumeLiteral(() => this.fail("Missing color space", { href: HREF_COLOR_FN }));
|
|
35
|
+
}
|
|
36
|
+
const components = [];
|
|
37
|
+
const breakAfterComponent = /* @__PURE__ */ __name(() => {
|
|
38
|
+
this.consumeSpace();
|
|
39
|
+
if (components.length === 3) {
|
|
40
|
+
if (!this.tryConsume(",")) {
|
|
41
|
+
this.tryConsume("/");
|
|
42
|
+
}
|
|
43
|
+
} else {
|
|
44
|
+
this.tryConsume(",");
|
|
45
|
+
}
|
|
46
|
+
if (components.length >= 3) {
|
|
47
|
+
if (this.tryConsume(")")) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}, "breakAfterComponent");
|
|
53
|
+
while (!this.done) {
|
|
54
|
+
if (components.length >= 4) {
|
|
55
|
+
throw this.fail(`Malformed ${functionName}() color`);
|
|
56
|
+
}
|
|
57
|
+
this.consumeSpace();
|
|
58
|
+
const component = this.tryConsumeColorComponent();
|
|
59
|
+
if (component != null) {
|
|
60
|
+
components.push(component);
|
|
61
|
+
if (breakAfterComponent()) {
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
throw this.fail(`Malformed ${functionName}() color`);
|
|
66
|
+
}
|
|
44
67
|
}
|
|
45
|
-
|
|
68
|
+
return {
|
|
69
|
+
components,
|
|
70
|
+
functionName,
|
|
71
|
+
...space == null ? {} : { space }
|
|
72
|
+
};
|
|
46
73
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
74
|
+
consumeHex() {
|
|
75
|
+
return { hex: this.consumeWhile((t, i) => i === 0 ? t === "#" : isHexDigit(t)) };
|
|
76
|
+
}
|
|
77
|
+
consumeLiteral(errorProvider = () => new SyntaxError(`Expected a literal at ${this.at}`)) {
|
|
78
|
+
const literal = this.tryConsumeLiteral();
|
|
79
|
+
if (literal != null) {
|
|
80
|
+
return literal;
|
|
54
81
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
82
|
+
throw errorProvider();
|
|
83
|
+
}
|
|
84
|
+
fail(message, options = {}) {
|
|
85
|
+
return new CSSError(this.text, { ...options, message });
|
|
86
|
+
}
|
|
87
|
+
tryConsumeColorComponent() {
|
|
88
|
+
if (this.tryConsume("none")) {
|
|
89
|
+
return [0, void 0];
|
|
61
90
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if (components.length >= 4) {
|
|
66
|
-
return fail(`Malformed ${functionName}() color`);
|
|
91
|
+
const maybeNumber = this.tryConsumeNumber();
|
|
92
|
+
if (maybeNumber == null) {
|
|
93
|
+
return void 0;
|
|
67
94
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
95
|
+
this.consumeSpace();
|
|
96
|
+
let unit;
|
|
97
|
+
if (this.tryConsume("%")) {
|
|
98
|
+
unit = "%";
|
|
99
|
+
} else {
|
|
100
|
+
unit = this.tryConsumeLiteral();
|
|
74
101
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
102
|
+
this.consumeSpace();
|
|
103
|
+
return [maybeNumber, unit];
|
|
104
|
+
}
|
|
105
|
+
tryConsumeLiteral() {
|
|
106
|
+
const literal = this.consumeWhile((t, i) => i === 0 ? new RegExp("^\\p{ID_Start}$", "u").test(t) : /^[-\p{ID_Continue}]$/u.test(t));
|
|
107
|
+
return literal === "" ? void 0 : literal;
|
|
108
|
+
}
|
|
109
|
+
tryConsumeNumber() {
|
|
110
|
+
const sign = this.tryConsume("-") ? -1 : 1;
|
|
111
|
+
const intText = this.consumeWhile(isDigit);
|
|
112
|
+
if (intText === "") {
|
|
113
|
+
if (sign < 0) {
|
|
114
|
+
throw this.fail(`Expected a number at ${this.at}`);
|
|
82
115
|
}
|
|
116
|
+
return void 0;
|
|
83
117
|
}
|
|
84
|
-
if (
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
{ match: ["%"], type: "literal" }
|
|
88
|
-
);
|
|
89
|
-
let unit;
|
|
90
|
-
if ((unitToken == null ? void 0 : unitToken.type) === "literal") {
|
|
91
|
-
unit = unitToken.literal;
|
|
92
|
-
} else if ((unitToken == null ? void 0 : unitToken.type) === "keyword") {
|
|
93
|
-
unit = unitToken.keyword;
|
|
94
|
-
} else {
|
|
95
|
-
unit = void 0;
|
|
96
|
-
}
|
|
97
|
-
components.push([token.value, unit]);
|
|
98
|
-
if (breakAfterNumber()) {
|
|
99
|
-
break;
|
|
100
|
-
}
|
|
118
|
+
if (this.tryConsume(".")) {
|
|
119
|
+
const fracText = this.consumeWhile(isDigit);
|
|
120
|
+
return sign * Number.parseFloat(`${intText}.${fracText}`);
|
|
101
121
|
}
|
|
122
|
+
return sign * Number.parseInt(intText, 10);
|
|
102
123
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
124
|
+
};
|
|
125
|
+
__name(_CSSColorTokenizer, "CSSColorTokenizer");
|
|
126
|
+
let CSSColorTokenizer = _CSSColorTokenizer;
|
|
127
|
+
const colorTokensFromCSS = /* @__PURE__ */ __name((text) => {
|
|
128
|
+
return new CSSColorTokenizer(text).consumeColor();
|
|
108
129
|
}, "colorTokensFromCSS");
|
|
109
130
|
export {
|
|
110
131
|
COLOR_FUNCTIONS,
|
package/color-parser.mjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/packages/css/color-parser.ts"],
|
|
4
|
-
"mappings": ";;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/index.cjs
CHANGED
|
@@ -22,6 +22,5 @@ __reExport(index_exports, require("./css-error.cjs"), module.exports);
|
|
|
22
22
|
__reExport(index_exports, require("./distance.cjs"), module.exports);
|
|
23
23
|
__reExport(index_exports, require("./format.cjs"), module.exports);
|
|
24
24
|
__reExport(index_exports, require("./href.cjs"), module.exports);
|
|
25
|
-
__reExport(index_exports, require("./tokenizer.cjs"), module.exports);
|
|
26
25
|
__reExport(index_exports, require("./units.cjs"), module.exports);
|
|
27
26
|
//# sourceMappingURL=index.cjs.map
|
package/index.cjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/packages/css/index.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAc,uBAAd;AACA,0BAAc,8BADd;AAEA,0BAAc,wBAFd;AAGA,0BAAc,2BAHd;AAIA,0BAAc,0BAJd;AAKA,0BAAc,wBALd;AAMA,0BAAc,sBANd;AAOA,0BAAc,
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAc,uBAAd;AACA,0BAAc,8BADd;AAEA,0BAAc,wBAFd;AAGA,0BAAc,2BAHd;AAIA,0BAAc,0BAJd;AAKA,0BAAc,wBALd;AAMA,0BAAc,sBANd;AAOA,0BAAc,uBAPd;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/index.d.ts
CHANGED
package/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/packages/css/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/packages/css/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
|
package/index.mjs
CHANGED
package/index.mjs.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/packages/css/index.ts"],
|
|
4
|
-
"mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;
|
|
4
|
+
"mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
"url": "https://rickosborne.org"
|
|
5
5
|
},
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@rickosborne/foundation": "2025.2.
|
|
8
|
-
"@rickosborne/guard": "2025.2.
|
|
9
|
-
"@rickosborne/typical": "2025.2.
|
|
7
|
+
"@rickosborne/foundation": "2025.2.26",
|
|
8
|
+
"@rickosborne/guard": "2025.2.26",
|
|
9
|
+
"@rickosborne/typical": "2025.2.26"
|
|
10
10
|
},
|
|
11
11
|
"description": "Rick Osborne's collection of CSS-related code.",
|
|
12
12
|
"engines": {
|
|
@@ -67,12 +67,6 @@
|
|
|
67
67
|
"require": "./href.cjs",
|
|
68
68
|
"default": "./href.mjs"
|
|
69
69
|
},
|
|
70
|
-
"./tokenizer": {
|
|
71
|
-
"types": "./tokenizer.d.ts",
|
|
72
|
-
"import": "./tokenizer.mjs",
|
|
73
|
-
"require": "./tokenizer.cjs",
|
|
74
|
-
"default": "./tokenizer.mjs"
|
|
75
|
-
},
|
|
76
70
|
"./units": {
|
|
77
71
|
"types": "./units.d.ts",
|
|
78
72
|
"import": "./units.mjs",
|
|
@@ -82,12 +76,12 @@
|
|
|
82
76
|
},
|
|
83
77
|
"git": {
|
|
84
78
|
"authorName": "Rick Osborne",
|
|
85
|
-
"commitDateISO": "2025-02-
|
|
86
|
-
"commitHash": "
|
|
87
|
-
"commitLink": "https://github.com/rickosborne/es-js-ts/commits/
|
|
88
|
-
"parentHash": "
|
|
79
|
+
"commitDateISO": "2025-02-26T16:44:58.000Z",
|
|
80
|
+
"commitHash": "d98c37cf1a65966fc3205af01aff807c5f2a36f4",
|
|
81
|
+
"commitLink": "https://github.com/rickosborne/es-js-ts/commits/d98c37cf1a65966fc3205af01aff807c5f2a36f4",
|
|
82
|
+
"parentHash": "0b10f561d72550dc94e78372e2e42110279a54f0",
|
|
89
83
|
"signingKeyId": "8e61c433fe39d4a4679ce1d5b873fb3c48464f3c",
|
|
90
|
-
"tag": "v2025.2.
|
|
84
|
+
"tag": "v2025.2.26"
|
|
91
85
|
},
|
|
92
86
|
"homepage": "https://github.com/rickosborne/es-js-ts",
|
|
93
87
|
"keywords": [
|
|
@@ -110,5 +104,5 @@
|
|
|
110
104
|
},
|
|
111
105
|
"types": "./index.d.ts",
|
|
112
106
|
"typings": "./index.d.ts",
|
|
113
|
-
"version": "2025.2.
|
|
107
|
+
"version": "2025.2.26"
|
|
114
108
|
}
|
package/tokenizer.cjs
DELETED
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
-
};
|
|
11
|
-
var __copyProps = (to, from, except, desc) => {
|
|
12
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
-
for (let key of __getOwnPropNames(from))
|
|
14
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
-
}
|
|
17
|
-
return to;
|
|
18
|
-
};
|
|
19
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
-
var tokenizer_exports = {};
|
|
21
|
-
__export(tokenizer_exports, {
|
|
22
|
-
readFromCSS: () => readFromCSS
|
|
23
|
-
});
|
|
24
|
-
module.exports = __toCommonJS(tokenizer_exports);
|
|
25
|
-
var import_css_error = require("./css-error.cjs");
|
|
26
|
-
const readFromCSS = /* @__PURE__ */ __name((text) => {
|
|
27
|
-
let remain = text.trim();
|
|
28
|
-
const done = /* @__PURE__ */ __name(() => remain.length === 0, "done");
|
|
29
|
-
return {
|
|
30
|
-
pull(...matchers) {
|
|
31
|
-
if (done()) {
|
|
32
|
-
return void 0;
|
|
33
|
-
}
|
|
34
|
-
for (const matcherOrType of matchers) {
|
|
35
|
-
const matcher = typeof matcherOrType === "string" ? { type: matcherOrType } : matcherOrType;
|
|
36
|
-
const { type, match } = matcher;
|
|
37
|
-
let pattern;
|
|
38
|
-
let builder;
|
|
39
|
-
const matchSet = match == null ? /* @__PURE__ */ new Set() : match instanceof Set ? match : typeof match === "string" ? new Set(match) : new Set(match);
|
|
40
|
-
switch (type) {
|
|
41
|
-
case "number": {
|
|
42
|
-
pattern = /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?/;
|
|
43
|
-
builder = /* @__PURE__ */ __name((f) => ({ type: "number", value: parseFloat(f) }), "builder");
|
|
44
|
-
break;
|
|
45
|
-
}
|
|
46
|
-
case "function": {
|
|
47
|
-
pattern = /^(\w+)\(/;
|
|
48
|
-
builder = /* @__PURE__ */ __name((name) => ({ name, type: "function" }), "builder");
|
|
49
|
-
break;
|
|
50
|
-
}
|
|
51
|
-
case "hex": {
|
|
52
|
-
pattern = /^#[a-fA-F0-9]+/;
|
|
53
|
-
builder = /* @__PURE__ */ __name((hex) => ({ hex, type: "hex" }), "builder");
|
|
54
|
-
break;
|
|
55
|
-
}
|
|
56
|
-
case "keyword": {
|
|
57
|
-
pattern = new RegExp("^\\p{ID_Start}[-\\p{ID_Continue}]*", "u");
|
|
58
|
-
builder = /* @__PURE__ */ __name((keyword) => ({ keyword, type: "keyword" }), "builder");
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
case "literal": {
|
|
62
|
-
if (matchSet.size == 0) {
|
|
63
|
-
throw new import_css_error.CSSError(text, { expected: "match[]", message: "Unspecified literal" });
|
|
64
|
-
}
|
|
65
|
-
pattern = new RegExp("^".concat(Array.from(matchSet).map((t) => t.replace(/([\\()[\].^${}])/g, "\\$1")).join("|")));
|
|
66
|
-
builder = /* @__PURE__ */ __name((literal) => ({ literal, type: "literal" }), "builder");
|
|
67
|
-
break;
|
|
68
|
-
}
|
|
69
|
-
default: {
|
|
70
|
-
throw new import_css_error.CSSError(type, { expected: "type", message: `Unknown token type: ${type}` });
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
const peek = pattern.exec(remain);
|
|
74
|
-
if (peek != null) {
|
|
75
|
-
let remove = peek[0];
|
|
76
|
-
let matched = peek[1] ?? peek[0];
|
|
77
|
-
if (matchSet.has(matched) || matchSet.size === 0) {
|
|
78
|
-
remain = remain.substring(remove.length).trim();
|
|
79
|
-
return builder(matched);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return void 0;
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
}, "readFromCSS");
|
|
87
|
-
//# sourceMappingURL=tokenizer.cjs.map
|
package/tokenizer.cjs.map
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/packages/css/tokenizer.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAyB;AA2ClB,MAAM,cAAc,wBAC1B,SACoB;AACpB,MAAI,SAAS,KAAK,KAAK;AACvB,QAAM,OAAO,6BAAM,OAAO,WAAW,GAAxB;AACb,SAAO;AAAA,IACN,QAAuC,UAA8F;AACpI,UAAI,KAAK,GAAG;AACX,eAAO;AAAA,MACR;AACA,iBAAW,iBAAiB,UAAU;AACrC,cAAM,UAAU,OAAO,kBAAkB,WAAW,EAAE,MAAM,cAAc,IAAI;AAC9E,cAAM,EAAE,MAAM,MAAM,IAAI;AACxB,YAAI;AACJ,YAAI;AACJ,cAAM,WAAW,SAAS,OAAO,oBAAI,IAAY,IAAI,iBAAiB,MAAM,QAAQ,OAAO,UAAU,WAAW,IAAI,IAAY,KAAK,IAAI,IAAI,IAAY,KAAK;AAC9J,gBAAQ,MAAM;AAAA,UACb,KAAK,UAAU;AACd,sBAAU;AACV,sBAAU,wBAAC,OAAO,EAAE,MAAM,UAAU,OAAO,WAAW,CAAC,EAAE,IAA/C;AACV;AAAA,UACD;AAAA,UACA,KAAK,YAAY;AAChB,sBAAU;AACV,sBAAU,wBAAC,UAAU,EAAE,MAAM,MAAM,WAAW,IAApC;AACV;AAAA,UACD;AAAA,UACA,KAAK,OAAO;AACX,sBAAU;AACV,sBAAU,wBAAC,SAAS,EAAE,KAAK,MAAM,MAAM,IAA7B;AACV;AAAA,UACD;AAAA,UACA,KAAK,WAAW;AACf,sBAAU,WAAC,sCAAiC,GAAC;AAC7C,sBAAU,wBAAC,aAAa,EAAE,SAAS,MAAM,UAAU,IAAzC;AACV;AAAA,UACD;AAAA,UACA,KAAK,WAAW;AACf,gBAAI,SAAS,QAAQ,GAAG;AACvB,oBAAM,IAAI,0BAAS,MAAM,EAAE,UAAU,WAAW,SAAS,sBAAsB,CAAC;AAAA,YACjF;AACA,sBAAU,IAAI,OAAO,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,qBAAqB,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;AAClH,sBAAU,wBAAC,aAAa,EAAE,SAAS,MAAM,UAAU,IAAzC;AACV;AAAA,UACD;AAAA,UACA,SAAS;AACR,kBAAM,IAAI,0BAAS,MAAM,EAAE,UAAU,QAAQ,SAAS,uBAAwB,IAAK,GAAG,CAAC;AAAA,UACxF;AAAA,QACD;AACA,cAAM,OAAO,QAAQ,KAAK,MAAM;AAChC,YAAI,QAAQ,MAAM;AACjB,cAAI,SAAS,KAAM,CAAE;AACrB,cAAI,UAAU,KAAM,CAAE,KAAK,KAAM,CAAE;AACnC,cAAI,SAAS,IAAI,OAAO,KAAK,SAAS,SAAS,GAAG;AACjD,qBAAS,OAAO,UAAU,OAAO,MAAM,EAAE,KAAK;AAC9C,mBAAO,QAAQ,OAAO;AAAA,UACvB;AAAA,QACD;AAAA,MACD;AACA,aAAO;AAAA,IACR;AAAA,EACD;AACD,GA9D2B;",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
package/tokenizer.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
export interface CSSColorToken<Type extends string = string> {
|
|
2
|
-
type: Type;
|
|
3
|
-
}
|
|
4
|
-
export interface CSSLiteralToken extends CSSColorToken<"literal"> {
|
|
5
|
-
literal: string;
|
|
6
|
-
}
|
|
7
|
-
export interface CSSHexHashToken extends CSSColorToken<"hex"> {
|
|
8
|
-
hex: string;
|
|
9
|
-
}
|
|
10
|
-
export interface CSSKeywordToken extends CSSColorToken<"keyword"> {
|
|
11
|
-
keyword: string;
|
|
12
|
-
}
|
|
13
|
-
export interface CSSFunctionToken extends CSSColorToken<"function"> {
|
|
14
|
-
name: string;
|
|
15
|
-
}
|
|
16
|
-
export interface CSSNumberToken extends CSSColorToken<"number"> {
|
|
17
|
-
value: number;
|
|
18
|
-
}
|
|
19
|
-
export interface CSSTokenReaderMatcher<Type extends CSSToken["type"] = CSSToken["type"]> {
|
|
20
|
-
match?: string[] | readonly string[] | Set<string> | undefined;
|
|
21
|
-
type: Type;
|
|
22
|
-
}
|
|
23
|
-
export type CSSToken = CSSKeywordToken | CSSFunctionToken | CSSHexHashToken | CSSLiteralToken | CSSNumberToken;
|
|
24
|
-
export interface CSSTokenReader {
|
|
25
|
-
pull<Type extends CSSToken["type"]>(...matchers: (Type | CSSTokenReaderMatcher<Type>)[]): CSSColorToken<Type> & CSSToken | undefined;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Minimal CSS pull parser, which only supports the happy-path
|
|
29
|
-
* tokens expected in a CSS color expression. Does not support
|
|
30
|
-
* anywhere near the full CSS Colors spec, but it'll do in a pinch.
|
|
31
|
-
* @see {@link https://www.w3.org/TR/css-color-4/ | CSS Color Level 4}
|
|
32
|
-
*/
|
|
33
|
-
export declare const readFromCSS: (text: string) => CSSTokenReader;
|
|
34
|
-
//# sourceMappingURL=tokenizer.d.ts.map
|
package/tokenizer.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../../src/packages/css/tokenizer.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM;IAC1D,IAAI,EAAE,IAAI,CAAC;CACX;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa,CAAC,SAAS,CAAC;IAChE,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa,CAAC,KAAK,CAAC;IAC5D,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa,CAAC,SAAS,CAAC;IAChE,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAiB,SAAQ,aAAa,CAAC,UAAU,CAAC;IAClE,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAe,SAAQ,aAAa,CAAC,QAAQ,CAAC;IAC9D,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB,CAAC,IAAI,SAAS,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;IACtF,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC/D,IAAI,EAAE,IAAI,CAAC;CACX;AAED,MAAM,MAAM,QAAQ,GAAG,eAAe,GAAG,gBAAgB,GAAG,eAAe,GAAG,eAAe,GAAG,cAAc,CAAC;AAE/G,MAAM,WAAW,cAAc;IAC9B,IAAI,CAAC,IAAI,SAAS,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC;CACrI;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,SACjB,MAAM,KACV,cA4DF,CAAC"}
|
package/tokenizer.mjs
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
-
import { CSSError } from "./css-error.mjs";
|
|
4
|
-
const readFromCSS = /* @__PURE__ */ __name((text) => {
|
|
5
|
-
let remain = text.trim();
|
|
6
|
-
const done = /* @__PURE__ */ __name(() => remain.length === 0, "done");
|
|
7
|
-
return {
|
|
8
|
-
pull(...matchers) {
|
|
9
|
-
if (done()) {
|
|
10
|
-
return void 0;
|
|
11
|
-
}
|
|
12
|
-
for (const matcherOrType of matchers) {
|
|
13
|
-
const matcher = typeof matcherOrType === "string" ? { type: matcherOrType } : matcherOrType;
|
|
14
|
-
const { type, match } = matcher;
|
|
15
|
-
let pattern;
|
|
16
|
-
let builder;
|
|
17
|
-
const matchSet = match == null ? /* @__PURE__ */ new Set() : match instanceof Set ? match : typeof match === "string" ? new Set(match) : new Set(match);
|
|
18
|
-
switch (type) {
|
|
19
|
-
case "number": {
|
|
20
|
-
pattern = /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?/;
|
|
21
|
-
builder = /* @__PURE__ */ __name((f) => ({ type: "number", value: parseFloat(f) }), "builder");
|
|
22
|
-
break;
|
|
23
|
-
}
|
|
24
|
-
case "function": {
|
|
25
|
-
pattern = /^(\w+)\(/;
|
|
26
|
-
builder = /* @__PURE__ */ __name((name) => ({ name, type: "function" }), "builder");
|
|
27
|
-
break;
|
|
28
|
-
}
|
|
29
|
-
case "hex": {
|
|
30
|
-
pattern = /^#[a-fA-F0-9]+/;
|
|
31
|
-
builder = /* @__PURE__ */ __name((hex) => ({ hex, type: "hex" }), "builder");
|
|
32
|
-
break;
|
|
33
|
-
}
|
|
34
|
-
case "keyword": {
|
|
35
|
-
pattern = new RegExp("^\\p{ID_Start}[-\\p{ID_Continue}]*", "u");
|
|
36
|
-
builder = /* @__PURE__ */ __name((keyword) => ({ keyword, type: "keyword" }), "builder");
|
|
37
|
-
break;
|
|
38
|
-
}
|
|
39
|
-
case "literal": {
|
|
40
|
-
if (matchSet.size == 0) {
|
|
41
|
-
throw new CSSError(text, { expected: "match[]", message: "Unspecified literal" });
|
|
42
|
-
}
|
|
43
|
-
pattern = new RegExp("^".concat(Array.from(matchSet).map((t) => t.replace(/([\\()[\].^${}])/g, "\\$1")).join("|")));
|
|
44
|
-
builder = /* @__PURE__ */ __name((literal) => ({ literal, type: "literal" }), "builder");
|
|
45
|
-
break;
|
|
46
|
-
}
|
|
47
|
-
default: {
|
|
48
|
-
throw new CSSError(type, { expected: "type", message: `Unknown token type: ${type}` });
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
const peek = pattern.exec(remain);
|
|
52
|
-
if (peek != null) {
|
|
53
|
-
let remove = peek[0];
|
|
54
|
-
let matched = peek[1] ?? peek[0];
|
|
55
|
-
if (matchSet.has(matched) || matchSet.size === 0) {
|
|
56
|
-
remain = remain.substring(remove.length).trim();
|
|
57
|
-
return builder(matched);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return void 0;
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
}, "readFromCSS");
|
|
65
|
-
export {
|
|
66
|
-
readFromCSS
|
|
67
|
-
};
|
|
68
|
-
//# sourceMappingURL=tokenizer.mjs.map
|
package/tokenizer.mjs.map
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/packages/css/tokenizer.ts"],
|
|
4
|
-
"mappings": ";;AAAA,SAAS,gBAAgB;AA2ClB,MAAM,cAAc,wBAC1B,SACoB;AACpB,MAAI,SAAS,KAAK,KAAK;AACvB,QAAM,OAAO,6BAAM,OAAO,WAAW,GAAxB;AACb,SAAO;AAAA,IACN,QAAuC,UAA8F;AACpI,UAAI,KAAK,GAAG;AACX,eAAO;AAAA,MACR;AACA,iBAAW,iBAAiB,UAAU;AACrC,cAAM,UAAU,OAAO,kBAAkB,WAAW,EAAE,MAAM,cAAc,IAAI;AAC9E,cAAM,EAAE,MAAM,MAAM,IAAI;AACxB,YAAI;AACJ,YAAI;AACJ,cAAM,WAAW,SAAS,OAAO,oBAAI,IAAY,IAAI,iBAAiB,MAAM,QAAQ,OAAO,UAAU,WAAW,IAAI,IAAY,KAAK,IAAI,IAAI,IAAY,KAAK;AAC9J,gBAAQ,MAAM;AAAA,UACb,KAAK,UAAU;AACd,sBAAU;AACV,sBAAU,wBAAC,OAAO,EAAE,MAAM,UAAU,OAAO,WAAW,CAAC,EAAE,IAA/C;AACV;AAAA,UACD;AAAA,UACA,KAAK,YAAY;AAChB,sBAAU;AACV,sBAAU,wBAAC,UAAU,EAAE,MAAM,MAAM,WAAW,IAApC;AACV;AAAA,UACD;AAAA,UACA,KAAK,OAAO;AACX,sBAAU;AACV,sBAAU,wBAAC,SAAS,EAAE,KAAK,MAAM,MAAM,IAA7B;AACV;AAAA,UACD;AAAA,UACA,KAAK,WAAW;AACf,sBAAU,WAAC,sCAAiC,GAAC;AAC7C,sBAAU,wBAAC,aAAa,EAAE,SAAS,MAAM,UAAU,IAAzC;AACV;AAAA,UACD;AAAA,UACA,KAAK,WAAW;AACf,gBAAI,SAAS,QAAQ,GAAG;AACvB,oBAAM,IAAI,SAAS,MAAM,EAAE,UAAU,WAAW,SAAS,sBAAsB,CAAC;AAAA,YACjF;AACA,sBAAU,IAAI,OAAO,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,qBAAqB,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;AAClH,sBAAU,wBAAC,aAAa,EAAE,SAAS,MAAM,UAAU,IAAzC;AACV;AAAA,UACD;AAAA,UACA,SAAS;AACR,kBAAM,IAAI,SAAS,MAAM,EAAE,UAAU,QAAQ,SAAS,uBAAwB,IAAK,GAAG,CAAC;AAAA,UACxF;AAAA,QACD;AACA,cAAM,OAAO,QAAQ,KAAK,MAAM;AAChC,YAAI,QAAQ,MAAM;AACjB,cAAI,SAAS,KAAM,CAAE;AACrB,cAAI,UAAU,KAAM,CAAE,KAAK,KAAM,CAAE;AACnC,cAAI,SAAS,IAAI,OAAO,KAAK,SAAS,SAAS,GAAG;AACjD,qBAAS,OAAO,UAAU,OAAO,MAAM,EAAE,KAAK;AAC9C,mBAAO,QAAQ,OAAO;AAAA,UACvB;AAAA,QACD;AAAA,MACD;AACA,aAAO;AAAA,IACR;AAAA,EACD;AACD,GA9D2B;",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|