@eslint/css-tree 3.2.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.
Files changed (279) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +194 -0
  3. package/cjs/convertor/create.cjs +32 -0
  4. package/cjs/convertor/index.cjs +8 -0
  5. package/cjs/data-patch.cjs +7 -0
  6. package/cjs/data.cjs +120 -0
  7. package/cjs/definition-syntax/SyntaxError.cjs +16 -0
  8. package/cjs/definition-syntax/generate.cjs +139 -0
  9. package/cjs/definition-syntax/index.cjs +13 -0
  10. package/cjs/definition-syntax/parse.cjs +556 -0
  11. package/cjs/definition-syntax/scanner.cjs +113 -0
  12. package/cjs/definition-syntax/walk.cjs +57 -0
  13. package/cjs/generator/create.cjs +102 -0
  14. package/cjs/generator/index.cjs +8 -0
  15. package/cjs/generator/sourceMap.cjs +96 -0
  16. package/cjs/generator/token-before.cjs +170 -0
  17. package/cjs/index.cjs +65 -0
  18. package/cjs/lexer/Lexer.cjs +517 -0
  19. package/cjs/lexer/error.cjs +128 -0
  20. package/cjs/lexer/generic-an-plus-b.cjs +235 -0
  21. package/cjs/lexer/generic-const.cjs +12 -0
  22. package/cjs/lexer/generic-urange.cjs +149 -0
  23. package/cjs/lexer/generic.cjs +589 -0
  24. package/cjs/lexer/index.cjs +7 -0
  25. package/cjs/lexer/match-graph.cjs +530 -0
  26. package/cjs/lexer/match.cjs +632 -0
  27. package/cjs/lexer/prepare-tokens.cjs +54 -0
  28. package/cjs/lexer/search.cjs +65 -0
  29. package/cjs/lexer/structure.cjs +173 -0
  30. package/cjs/lexer/trace.cjs +73 -0
  31. package/cjs/lexer/units.cjs +38 -0
  32. package/cjs/parser/SyntaxError.cjs +74 -0
  33. package/cjs/parser/create.cjs +378 -0
  34. package/cjs/parser/index.cjs +8 -0
  35. package/cjs/parser/parse-selector.cjs +8 -0
  36. package/cjs/parser/sequence.cjs +47 -0
  37. package/cjs/syntax/atrule/container.cjs +32 -0
  38. package/cjs/syntax/atrule/font-face.cjs +12 -0
  39. package/cjs/syntax/atrule/import.cjs +101 -0
  40. package/cjs/syntax/atrule/index.cjs +27 -0
  41. package/cjs/syntax/atrule/layer.cjs +16 -0
  42. package/cjs/syntax/atrule/media.cjs +16 -0
  43. package/cjs/syntax/atrule/nest.cjs +16 -0
  44. package/cjs/syntax/atrule/page.cjs +16 -0
  45. package/cjs/syntax/atrule/scope.cjs +16 -0
  46. package/cjs/syntax/atrule/starting-style.cjs +12 -0
  47. package/cjs/syntax/atrule/supports.cjs +16 -0
  48. package/cjs/syntax/config/generator.cjs +9 -0
  49. package/cjs/syntax/config/lexer.cjs +14 -0
  50. package/cjs/syntax/config/mix.cjs +126 -0
  51. package/cjs/syntax/config/parser-selector.cjs +19 -0
  52. package/cjs/syntax/config/parser.cjs +49 -0
  53. package/cjs/syntax/config/walker.cjs +9 -0
  54. package/cjs/syntax/create.cjs +58 -0
  55. package/cjs/syntax/function/expression.cjs +11 -0
  56. package/cjs/syntax/function/var.cjs +43 -0
  57. package/cjs/syntax/index.cjs +14 -0
  58. package/cjs/syntax/node/AnPlusB.cjs +293 -0
  59. package/cjs/syntax/node/Atrule.cjs +103 -0
  60. package/cjs/syntax/node/AtrulePrelude.cjs +52 -0
  61. package/cjs/syntax/node/AttributeSelector.cjs +148 -0
  62. package/cjs/syntax/node/Block.cjs +96 -0
  63. package/cjs/syntax/node/Brackets.cjs +38 -0
  64. package/cjs/syntax/node/CDC.cjs +26 -0
  65. package/cjs/syntax/node/CDO.cjs +26 -0
  66. package/cjs/syntax/node/ClassSelector.cjs +31 -0
  67. package/cjs/syntax/node/Combinator.cjs +61 -0
  68. package/cjs/syntax/node/Comment.cjs +40 -0
  69. package/cjs/syntax/node/Condition.cjs +120 -0
  70. package/cjs/syntax/node/Declaration.cjs +166 -0
  71. package/cjs/syntax/node/DeclarationList.cjs +62 -0
  72. package/cjs/syntax/node/Dimension.cjs +30 -0
  73. package/cjs/syntax/node/Feature.cjs +101 -0
  74. package/cjs/syntax/node/FeatureFunction.cjs +67 -0
  75. package/cjs/syntax/node/FeatureRange.cjs +133 -0
  76. package/cjs/syntax/node/Function.cjs +45 -0
  77. package/cjs/syntax/node/GeneralEnclosed.cjs +68 -0
  78. package/cjs/syntax/node/Hash.cjs +30 -0
  79. package/cjs/syntax/node/IdSelector.cjs +33 -0
  80. package/cjs/syntax/node/Identifier.cjs +25 -0
  81. package/cjs/syntax/node/Layer.cjs +35 -0
  82. package/cjs/syntax/node/LayerList.cjs +43 -0
  83. package/cjs/syntax/node/MediaQuery.cjs +100 -0
  84. package/cjs/syntax/node/MediaQueryList.cjs +41 -0
  85. package/cjs/syntax/node/NestingSelector.cjs +29 -0
  86. package/cjs/syntax/node/Nth.cjs +54 -0
  87. package/cjs/syntax/node/Number.cjs +25 -0
  88. package/cjs/syntax/node/Operator.cjs +28 -0
  89. package/cjs/syntax/node/Parentheses.cjs +38 -0
  90. package/cjs/syntax/node/Percentage.cjs +25 -0
  91. package/cjs/syntax/node/PseudoClassSelector.cjs +67 -0
  92. package/cjs/syntax/node/PseudoElementSelector.cjs +69 -0
  93. package/cjs/syntax/node/Ratio.cjs +71 -0
  94. package/cjs/syntax/node/Raw.cjs +48 -0
  95. package/cjs/syntax/node/Rule.cjs +58 -0
  96. package/cjs/syntax/node/Scope.cjs +69 -0
  97. package/cjs/syntax/node/Selector.cjs +38 -0
  98. package/cjs/syntax/node/SelectorList.cjs +43 -0
  99. package/cjs/syntax/node/String.cjs +26 -0
  100. package/cjs/syntax/node/StyleSheet.cjs +83 -0
  101. package/cjs/syntax/node/SupportsDeclaration.cjs +38 -0
  102. package/cjs/syntax/node/TypeSelector.cjs +59 -0
  103. package/cjs/syntax/node/UnicodeRange.cjs +158 -0
  104. package/cjs/syntax/node/Url.cjs +54 -0
  105. package/cjs/syntax/node/Value.cjs +26 -0
  106. package/cjs/syntax/node/WhiteSpace.cjs +34 -0
  107. package/cjs/syntax/node/index-generate.cjs +103 -0
  108. package/cjs/syntax/node/index-parse-selector.cjs +39 -0
  109. package/cjs/syntax/node/index-parse.cjs +103 -0
  110. package/cjs/syntax/node/index.cjs +103 -0
  111. package/cjs/syntax/pseudo/index.cjs +60 -0
  112. package/cjs/syntax/pseudo/lang.cjs +37 -0
  113. package/cjs/syntax/scope/atrulePrelude.cjs +9 -0
  114. package/cjs/syntax/scope/default.cjs +76 -0
  115. package/cjs/syntax/scope/index.cjs +11 -0
  116. package/cjs/syntax/scope/selector.cjs +88 -0
  117. package/cjs/syntax/scope/value.cjs +29 -0
  118. package/cjs/tokenizer/OffsetToLocation.cjs +91 -0
  119. package/cjs/tokenizer/TokenStream.cjs +358 -0
  120. package/cjs/tokenizer/adopt-buffer.cjs +13 -0
  121. package/cjs/tokenizer/char-code-definitions.cjs +236 -0
  122. package/cjs/tokenizer/index.cjs +554 -0
  123. package/cjs/tokenizer/names.cjs +32 -0
  124. package/cjs/tokenizer/types.cjs +57 -0
  125. package/cjs/tokenizer/utils.cjs +261 -0
  126. package/cjs/utils/List.cjs +473 -0
  127. package/cjs/utils/clone.cjs +25 -0
  128. package/cjs/utils/create-custom-error.cjs +18 -0
  129. package/cjs/utils/ident.cjs +102 -0
  130. package/cjs/utils/index.cjs +20 -0
  131. package/cjs/utils/names.cjs +113 -0
  132. package/cjs/utils/string.cjs +99 -0
  133. package/cjs/utils/url.cjs +108 -0
  134. package/cjs/version.cjs +5 -0
  135. package/cjs/walker/create.cjs +291 -0
  136. package/cjs/walker/index.cjs +8 -0
  137. package/data/patch.json +874 -0
  138. package/dist/csstree.esm.js +12 -0
  139. package/dist/csstree.js +12 -0
  140. package/dist/data.cjs +1341 -0
  141. package/dist/data.js +1341 -0
  142. package/dist/version.cjs +1 -0
  143. package/dist/version.js +1 -0
  144. package/lib/convertor/create.js +28 -0
  145. package/lib/convertor/index.js +4 -0
  146. package/lib/data-patch.js +6 -0
  147. package/lib/data.js +118 -0
  148. package/lib/definition-syntax/SyntaxError.js +12 -0
  149. package/lib/definition-syntax/generate.js +135 -0
  150. package/lib/definition-syntax/index.js +4 -0
  151. package/lib/definition-syntax/parse.js +552 -0
  152. package/lib/definition-syntax/scanner.js +109 -0
  153. package/lib/definition-syntax/walk.js +53 -0
  154. package/lib/generator/create.js +97 -0
  155. package/lib/generator/index.js +4 -0
  156. package/lib/generator/sourceMap.js +92 -0
  157. package/lib/generator/token-before.js +182 -0
  158. package/lib/index.d.ts +3016 -0
  159. package/lib/index.js +30 -0
  160. package/lib/lexer/Lexer.js +511 -0
  161. package/lib/lexer/error.js +123 -0
  162. package/lib/lexer/generic-an-plus-b.js +238 -0
  163. package/lib/lexer/generic-const.js +8 -0
  164. package/lib/lexer/generic-urange.js +151 -0
  165. package/lib/lexer/generic.js +622 -0
  166. package/lib/lexer/index.js +1 -0
  167. package/lib/lexer/match-graph.js +527 -0
  168. package/lib/lexer/match.js +630 -0
  169. package/lib/lexer/prepare-tokens.js +50 -0
  170. package/lib/lexer/search.js +61 -0
  171. package/lib/lexer/structure.js +169 -0
  172. package/lib/lexer/trace.js +66 -0
  173. package/lib/lexer/units.js +27 -0
  174. package/lib/parser/SyntaxError.js +70 -0
  175. package/lib/parser/create.js +388 -0
  176. package/lib/parser/index.js +4 -0
  177. package/lib/parser/parse-selector.js +4 -0
  178. package/lib/parser/sequence.js +43 -0
  179. package/lib/syntax/atrule/container.js +28 -0
  180. package/lib/syntax/atrule/font-face.js +8 -0
  181. package/lib/syntax/atrule/import.js +104 -0
  182. package/lib/syntax/atrule/index.js +23 -0
  183. package/lib/syntax/atrule/layer.js +12 -0
  184. package/lib/syntax/atrule/media.js +12 -0
  185. package/lib/syntax/atrule/nest.js +12 -0
  186. package/lib/syntax/atrule/page.js +12 -0
  187. package/lib/syntax/atrule/scope.js +12 -0
  188. package/lib/syntax/atrule/starting-style.js +8 -0
  189. package/lib/syntax/atrule/supports.js +12 -0
  190. package/lib/syntax/config/generator.js +5 -0
  191. package/lib/syntax/config/lexer.js +10 -0
  192. package/lib/syntax/config/mix.js +122 -0
  193. package/lib/syntax/config/parser-selector.js +15 -0
  194. package/lib/syntax/config/parser.js +45 -0
  195. package/lib/syntax/config/walker.js +5 -0
  196. package/lib/syntax/create.js +55 -0
  197. package/lib/syntax/function/expression.js +7 -0
  198. package/lib/syntax/function/var.js +39 -0
  199. package/lib/syntax/index.js +10 -0
  200. package/lib/syntax/node/AnPlusB.js +292 -0
  201. package/lib/syntax/node/Atrule.js +100 -0
  202. package/lib/syntax/node/AtrulePrelude.js +47 -0
  203. package/lib/syntax/node/AttributeSelector.js +147 -0
  204. package/lib/syntax/node/Block.js +95 -0
  205. package/lib/syntax/node/Brackets.js +35 -0
  206. package/lib/syntax/node/CDC.js +19 -0
  207. package/lib/syntax/node/CDO.js +19 -0
  208. package/lib/syntax/node/ClassSelector.js +24 -0
  209. package/lib/syntax/node/Combinator.js +54 -0
  210. package/lib/syntax/node/Comment.js +33 -0
  211. package/lib/syntax/node/Condition.js +123 -0
  212. package/lib/syntax/node/Declaration.js +165 -0
  213. package/lib/syntax/node/DeclarationList.js +62 -0
  214. package/lib/syntax/node/Dimension.js +23 -0
  215. package/lib/syntax/node/Feature.js +103 -0
  216. package/lib/syntax/node/FeatureFunction.js +63 -0
  217. package/lib/syntax/node/FeatureRange.js +133 -0
  218. package/lib/syntax/node/Function.js +41 -0
  219. package/lib/syntax/node/GeneralEnclosed.js +66 -0
  220. package/lib/syntax/node/Hash.js +23 -0
  221. package/lib/syntax/node/IdSelector.js +26 -0
  222. package/lib/syntax/node/Identifier.js +18 -0
  223. package/lib/syntax/node/Layer.js +28 -0
  224. package/lib/syntax/node/LayerList.js +36 -0
  225. package/lib/syntax/node/MediaQuery.js +102 -0
  226. package/lib/syntax/node/MediaQueryList.js +34 -0
  227. package/lib/syntax/node/NestingSelector.js +22 -0
  228. package/lib/syntax/node/Nth.js +47 -0
  229. package/lib/syntax/node/Number.js +18 -0
  230. package/lib/syntax/node/Operator.js +21 -0
  231. package/lib/syntax/node/Parentheses.js +34 -0
  232. package/lib/syntax/node/Percentage.js +18 -0
  233. package/lib/syntax/node/PseudoClassSelector.js +65 -0
  234. package/lib/syntax/node/PseudoElementSelector.js +66 -0
  235. package/lib/syntax/node/Ratio.js +68 -0
  236. package/lib/syntax/node/Raw.js +41 -0
  237. package/lib/syntax/node/Rule.js +51 -0
  238. package/lib/syntax/node/Scope.js +66 -0
  239. package/lib/syntax/node/Selector.js +31 -0
  240. package/lib/syntax/node/SelectorList.js +35 -0
  241. package/lib/syntax/node/String.js +19 -0
  242. package/lib/syntax/node/StyleSheet.js +82 -0
  243. package/lib/syntax/node/SupportsDeclaration.js +34 -0
  244. package/lib/syntax/node/TypeSelector.js +52 -0
  245. package/lib/syntax/node/UnicodeRange.js +156 -0
  246. package/lib/syntax/node/Url.js +52 -0
  247. package/lib/syntax/node/Value.js +19 -0
  248. package/lib/syntax/node/WhiteSpace.js +27 -0
  249. package/lib/syntax/node/index-generate.js +49 -0
  250. package/lib/syntax/node/index-parse-selector.js +17 -0
  251. package/lib/syntax/node/index-parse.js +49 -0
  252. package/lib/syntax/node/index.js +49 -0
  253. package/lib/syntax/pseudo/index.js +56 -0
  254. package/lib/syntax/pseudo/lang.js +33 -0
  255. package/lib/syntax/scope/atrulePrelude.js +5 -0
  256. package/lib/syntax/scope/default.js +85 -0
  257. package/lib/syntax/scope/index.js +3 -0
  258. package/lib/syntax/scope/selector.js +94 -0
  259. package/lib/syntax/scope/value.js +25 -0
  260. package/lib/tokenizer/OffsetToLocation.js +87 -0
  261. package/lib/tokenizer/TokenStream.js +366 -0
  262. package/lib/tokenizer/adopt-buffer.js +9 -0
  263. package/lib/tokenizer/char-code-definitions.js +212 -0
  264. package/lib/tokenizer/index.js +513 -0
  265. package/lib/tokenizer/names.js +28 -0
  266. package/lib/tokenizer/types.js +28 -0
  267. package/lib/tokenizer/utils.js +254 -0
  268. package/lib/utils/List.js +469 -0
  269. package/lib/utils/clone.js +21 -0
  270. package/lib/utils/create-custom-error.js +14 -0
  271. package/lib/utils/ident.js +101 -0
  272. package/lib/utils/index.js +6 -0
  273. package/lib/utils/names.js +106 -0
  274. package/lib/utils/string.js +99 -0
  275. package/lib/utils/url.js +108 -0
  276. package/lib/version.js +5 -0
  277. package/lib/walker/create.js +287 -0
  278. package/lib/walker/index.js +4 -0
  279. package/package.json +133 -0
@@ -0,0 +1,66 @@
1
+ import {
2
+ Ident,
3
+ LeftParenthesis,
4
+ RightParenthesis
5
+ } from '../../tokenizer/index.js';
6
+
7
+ export const name = 'Scope';
8
+ export const structure = {
9
+ root: ['SelectorList', 'Raw', null],
10
+ limit: ['SelectorList', 'Raw', null]
11
+ };
12
+
13
+ export function parse() {
14
+ let root = null;
15
+ let limit = null;
16
+
17
+ this.skipSC();
18
+
19
+ const startOffset = this.tokenStart;
20
+ if (this.tokenType === LeftParenthesis) {
21
+ this.next();
22
+ this.skipSC();
23
+ root = this.parseWithFallback(
24
+ this.SelectorList,
25
+ () => this.Raw(false, true)
26
+ );
27
+ this.skipSC();
28
+ this.eat(RightParenthesis);
29
+ }
30
+
31
+ if (this.lookupNonWSType(0) === Ident) {
32
+ this.skipSC();
33
+ this.eatIdent('to');
34
+ this.skipSC();
35
+ this.eat(LeftParenthesis);
36
+ this.skipSC();
37
+ limit = this.parseWithFallback(
38
+ this.SelectorList,
39
+ () => this.Raw(false, true)
40
+ );
41
+ this.skipSC();
42
+ this.eat(RightParenthesis);
43
+ }
44
+
45
+ return {
46
+ type: 'Scope',
47
+ loc: this.getLocation(startOffset, this.tokenStart),
48
+ root,
49
+ limit
50
+ };
51
+ }
52
+
53
+ export function generate(node) {
54
+ if (node.root) {
55
+ this.token(LeftParenthesis, '(');
56
+ this.node(node.root);
57
+ this.token(RightParenthesis, ')');
58
+ }
59
+
60
+ if (node.limit) {
61
+ this.token(Ident, 'to');
62
+ this.token(LeftParenthesis, '(');
63
+ this.node(node.limit);
64
+ this.token(RightParenthesis, ')');
65
+ }
66
+ }
@@ -0,0 +1,31 @@
1
+ export const name = 'Selector';
2
+ export const structure = {
3
+ children: [[
4
+ 'TypeSelector',
5
+ 'IdSelector',
6
+ 'ClassSelector',
7
+ 'AttributeSelector',
8
+ 'PseudoClassSelector',
9
+ 'PseudoElementSelector',
10
+ 'Combinator'
11
+ ]]
12
+ };
13
+
14
+ export function parse() {
15
+ const children = this.readSequence(this.scope.Selector);
16
+
17
+ // nothing were consumed
18
+ if (this.getFirstListNode(children) === null) {
19
+ this.error('Selector is expected');
20
+ }
21
+
22
+ return {
23
+ type: 'Selector',
24
+ loc: this.getLocationFromList(children),
25
+ children
26
+ };
27
+ }
28
+
29
+ export function generate(node) {
30
+ this.children(node);
31
+ }
@@ -0,0 +1,35 @@
1
+ import { Comma } from '../../tokenizer/index.js';
2
+
3
+ export const name = 'SelectorList';
4
+ export const walkContext = 'selector';
5
+ export const structure = {
6
+ children: [[
7
+ 'Selector',
8
+ 'Raw'
9
+ ]]
10
+ };
11
+
12
+ export function parse() {
13
+ const children = this.createList();
14
+
15
+ while (!this.eof) {
16
+ children.push(this.Selector());
17
+
18
+ if (this.tokenType === Comma) {
19
+ this.next();
20
+ continue;
21
+ }
22
+
23
+ break;
24
+ }
25
+
26
+ return {
27
+ type: 'SelectorList',
28
+ loc: this.getLocationFromList(children),
29
+ children
30
+ };
31
+ }
32
+
33
+ export function generate(node) {
34
+ this.children(node, () => this.token(Comma, ','));
35
+ }
@@ -0,0 +1,19 @@
1
+ import { String as StringToken } from '../../tokenizer/index.js';
2
+ import { decode, encode } from '../../utils/string.js';
3
+
4
+ export const name = 'String';
5
+ export const structure = {
6
+ value: String
7
+ };
8
+
9
+ export function parse() {
10
+ return {
11
+ type: 'String',
12
+ loc: this.getLocation(this.tokenStart, this.tokenEnd),
13
+ value: decode(this.consume(StringToken))
14
+ };
15
+ }
16
+
17
+ export function generate(node) {
18
+ this.token(StringToken, encode(node.value));
19
+ }
@@ -0,0 +1,82 @@
1
+ import {
2
+ WhiteSpace,
3
+ Comment,
4
+ AtKeyword,
5
+ CDO,
6
+ CDC
7
+ } from '../../tokenizer/index.js';
8
+
9
+ const EXCLAMATIONMARK = 0x0021; // U+0021 EXCLAMATION MARK (!)
10
+
11
+ function consumeRaw() {
12
+ return this.Raw(null, false);
13
+ }
14
+
15
+ export const name = 'StyleSheet';
16
+ export const walkContext = 'stylesheet';
17
+ export const structure = {
18
+ children: [[
19
+ 'Comment',
20
+ 'CDO',
21
+ 'CDC',
22
+ 'Atrule',
23
+ 'Rule',
24
+ 'Raw'
25
+ ]]
26
+ };
27
+
28
+ export function parse() {
29
+ const start = this.tokenStart;
30
+ const children = this.createList();
31
+ let child;
32
+
33
+ scan:
34
+ while (!this.eof) {
35
+ switch (this.tokenType) {
36
+ case WhiteSpace:
37
+ this.next();
38
+ continue;
39
+
40
+ case Comment:
41
+ // ignore comments except exclamation comments (i.e. /*! .. */) on top level
42
+ if (this.charCodeAt(this.tokenStart + 2) !== EXCLAMATIONMARK) {
43
+ this.next();
44
+ continue;
45
+ }
46
+
47
+ child = this.Comment();
48
+ break;
49
+
50
+ case CDO: // <!--
51
+ child = this.CDO();
52
+ break;
53
+
54
+ case CDC: // -->
55
+ child = this.CDC();
56
+ break;
57
+
58
+ // CSS Syntax Module Level 3
59
+ // §2.2 Error handling
60
+ // At the "top level" of a stylesheet, an <at-keyword-token> starts an at-rule.
61
+ case AtKeyword:
62
+ child = this.parseWithFallback(this.Atrule, consumeRaw);
63
+ break;
64
+
65
+ // Anything else starts a qualified rule ...
66
+ default:
67
+ child = this.parseWithFallback(this.Rule, consumeRaw);
68
+ }
69
+
70
+ children.push(child);
71
+ }
72
+
73
+ return {
74
+ type: 'StyleSheet',
75
+ loc: this.getLocation(start, this.tokenStart),
76
+ children
77
+ };
78
+ }
79
+
80
+ export function generate(node) {
81
+ this.children(node);
82
+ }
@@ -0,0 +1,34 @@
1
+ import {
2
+ LeftParenthesis,
3
+ RightParenthesis
4
+ } from '../../tokenizer/index.js';
5
+
6
+ export const name = 'SupportsDeclaration';
7
+ export const structure = {
8
+ declaration: 'Declaration'
9
+ };
10
+
11
+ export function parse() {
12
+ const start = this.tokenStart;
13
+
14
+ this.eat(LeftParenthesis);
15
+ this.skipSC();
16
+
17
+ const declaration = this.Declaration();
18
+
19
+ if (!this.eof) {
20
+ this.eat(RightParenthesis);
21
+ }
22
+
23
+ return {
24
+ type: 'SupportsDeclaration',
25
+ loc: this.getLocation(start, this.tokenStart),
26
+ declaration
27
+ };
28
+ }
29
+
30
+ export function generate(node) {
31
+ this.token(LeftParenthesis, '(');
32
+ this.node(node.declaration);
33
+ this.token(RightParenthesis, ')');
34
+ }
@@ -0,0 +1,52 @@
1
+ import { Ident } from '../../tokenizer/index.js';
2
+
3
+ const ASTERISK = 0x002A; // U+002A ASTERISK (*)
4
+ const VERTICALLINE = 0x007C; // U+007C VERTICAL LINE (|)
5
+
6
+ function eatIdentifierOrAsterisk() {
7
+ if (this.tokenType !== Ident &&
8
+ this.isDelim(ASTERISK) === false) {
9
+ this.error('Identifier or asterisk is expected');
10
+ }
11
+
12
+ this.next();
13
+ }
14
+
15
+ export const name = 'TypeSelector';
16
+ export const structure = {
17
+ name: String
18
+ };
19
+
20
+ // ident
21
+ // ident|ident
22
+ // ident|*
23
+ // *
24
+ // *|ident
25
+ // *|*
26
+ // |ident
27
+ // |*
28
+ export function parse() {
29
+ const start = this.tokenStart;
30
+
31
+ if (this.isDelim(VERTICALLINE)) {
32
+ this.next();
33
+ eatIdentifierOrAsterisk.call(this);
34
+ } else {
35
+ eatIdentifierOrAsterisk.call(this);
36
+
37
+ if (this.isDelim(VERTICALLINE)) {
38
+ this.next();
39
+ eatIdentifierOrAsterisk.call(this);
40
+ }
41
+ }
42
+
43
+ return {
44
+ type: 'TypeSelector',
45
+ loc: this.getLocation(start, this.tokenStart),
46
+ name: this.substrToCursor(start)
47
+ };
48
+ }
49
+
50
+ export function generate(node) {
51
+ this.tokenize(node.name);
52
+ }
@@ -0,0 +1,156 @@
1
+ import {
2
+ isHexDigit,
3
+ Ident,
4
+ Number,
5
+ Dimension
6
+ } from '../../tokenizer/index.js';
7
+
8
+ const PLUSSIGN = 0x002B; // U+002B PLUS SIGN (+)
9
+ const HYPHENMINUS = 0x002D; // U+002D HYPHEN-MINUS (-)
10
+ const QUESTIONMARK = 0x003F; // U+003F QUESTION MARK (?)
11
+
12
+ function eatHexSequence(offset, allowDash) {
13
+ let len = 0;
14
+
15
+ for (let pos = this.tokenStart + offset; pos < this.tokenEnd; pos++) {
16
+ const code = this.charCodeAt(pos);
17
+
18
+ if (code === HYPHENMINUS && allowDash && len !== 0) {
19
+ eatHexSequence.call(this, offset + len + 1, false);
20
+ return -1;
21
+ }
22
+
23
+ if (!isHexDigit(code)) {
24
+ this.error(
25
+ allowDash && len !== 0
26
+ ? 'Hyphen minus' + (len < 6 ? ' or hex digit' : '') + ' is expected'
27
+ : (len < 6 ? 'Hex digit is expected' : 'Unexpected input'),
28
+ pos
29
+ );
30
+ }
31
+
32
+ if (++len > 6) {
33
+ this.error('Too many hex digits', pos);
34
+ };
35
+ }
36
+
37
+ this.next();
38
+ return len;
39
+ }
40
+
41
+ function eatQuestionMarkSequence(max) {
42
+ let count = 0;
43
+
44
+ while (this.isDelim(QUESTIONMARK)) {
45
+ if (++count > max) {
46
+ this.error('Too many question marks');
47
+ }
48
+
49
+ this.next();
50
+ }
51
+ }
52
+
53
+ function startsWith(code) {
54
+ if (this.charCodeAt(this.tokenStart) !== code) {
55
+ this.error((code === PLUSSIGN ? 'Plus sign' : 'Hyphen minus') + ' is expected');
56
+ }
57
+ }
58
+
59
+ // https://drafts.csswg.org/css-syntax/#urange
60
+ // Informally, the <urange> production has three forms:
61
+ // U+0001
62
+ // Defines a range consisting of a single code point, in this case the code point "1".
63
+ // U+0001-00ff
64
+ // Defines a range of codepoints between the first and the second value, in this case
65
+ // the range between "1" and "ff" (255 in decimal) inclusive.
66
+ // U+00??
67
+ // Defines a range of codepoints where the "?" characters range over all hex digits,
68
+ // in this case defining the same as the value U+0000-00ff.
69
+ // In each form, a maximum of 6 digits is allowed for each hexadecimal number (if you treat "?" as a hexadecimal digit).
70
+ //
71
+ // <urange> =
72
+ // u '+' <ident-token> '?'* |
73
+ // u <dimension-token> '?'* |
74
+ // u <number-token> '?'* |
75
+ // u <number-token> <dimension-token> |
76
+ // u <number-token> <number-token> |
77
+ // u '+' '?'+
78
+ function scanUnicodeRange() {
79
+ let hexLength = 0;
80
+
81
+ switch (this.tokenType) {
82
+ case Number:
83
+ // u <number-token> '?'*
84
+ // u <number-token> <dimension-token>
85
+ // u <number-token> <number-token>
86
+ hexLength = eatHexSequence.call(this, 1, true);
87
+
88
+ if (this.isDelim(QUESTIONMARK)) {
89
+ eatQuestionMarkSequence.call(this, 6 - hexLength);
90
+ break;
91
+ }
92
+
93
+ if (this.tokenType === Dimension ||
94
+ this.tokenType === Number) {
95
+ startsWith.call(this, HYPHENMINUS);
96
+ eatHexSequence.call(this, 1, false);
97
+ break;
98
+ }
99
+
100
+ break;
101
+
102
+ case Dimension:
103
+ // u <dimension-token> '?'*
104
+ hexLength = eatHexSequence.call(this, 1, true);
105
+
106
+ if (hexLength > 0) {
107
+ eatQuestionMarkSequence.call(this, 6 - hexLength);
108
+ }
109
+
110
+ break;
111
+
112
+ default:
113
+ // u '+' <ident-token> '?'*
114
+ // u '+' '?'+
115
+ this.eatDelim(PLUSSIGN);
116
+
117
+ if (this.tokenType === Ident) {
118
+ hexLength = eatHexSequence.call(this, 0, true);
119
+ if (hexLength > 0) {
120
+ eatQuestionMarkSequence.call(this, 6 - hexLength);
121
+ }
122
+ break;
123
+ }
124
+
125
+ if (this.isDelim(QUESTIONMARK)) {
126
+ this.next();
127
+ eatQuestionMarkSequence.call(this, 5);
128
+ break;
129
+ }
130
+
131
+ this.error('Hex digit or question mark is expected');
132
+ }
133
+ }
134
+
135
+ export const name = 'UnicodeRange';
136
+ export const structure = {
137
+ value: String
138
+ };
139
+
140
+ export function parse() {
141
+ const start = this.tokenStart;
142
+
143
+ // U or u
144
+ this.eatIdent('u');
145
+ scanUnicodeRange.call(this);
146
+
147
+ return {
148
+ type: 'UnicodeRange',
149
+ loc: this.getLocation(start, this.tokenStart),
150
+ value: this.substrToCursor(start)
151
+ };
152
+ }
153
+
154
+ export function generate(node) {
155
+ this.tokenize(node.value);
156
+ }
@@ -0,0 +1,52 @@
1
+ import * as url from '../../utils/url.js';
2
+ import * as string from '../../utils/string.js';
3
+ import {
4
+ Function as FunctionToken,
5
+ String as StringToken,
6
+ Url,
7
+ RightParenthesis
8
+ } from '../../tokenizer/index.js';
9
+
10
+ export const name = 'Url';
11
+ export const structure = {
12
+ value: String
13
+ };
14
+
15
+ // <url-token> | <function-token> <string> )
16
+ export function parse() {
17
+ const start = this.tokenStart;
18
+ let value;
19
+
20
+ switch (this.tokenType) {
21
+ case Url:
22
+ value = url.decode(this.consume(Url));
23
+ break;
24
+
25
+ case FunctionToken:
26
+ if (!this.cmpStr(this.tokenStart, this.tokenEnd, 'url(')) {
27
+ this.error('Function name must be `url`');
28
+ }
29
+
30
+ this.eat(FunctionToken);
31
+ this.skipSC();
32
+ value = string.decode(this.consume(StringToken));
33
+ this.skipSC();
34
+ if (!this.eof) {
35
+ this.eat(RightParenthesis);
36
+ }
37
+ break;
38
+
39
+ default:
40
+ this.error('Url or Function is expected');
41
+ }
42
+
43
+ return {
44
+ type: 'Url',
45
+ loc: this.getLocation(start, this.tokenStart),
46
+ value
47
+ };
48
+ }
49
+
50
+ export function generate(node) {
51
+ this.token(Url, url.encode(node.value));
52
+ }
@@ -0,0 +1,19 @@
1
+ export const name = 'Value';
2
+ export const structure = {
3
+ children: [[]]
4
+ };
5
+
6
+ export function parse() {
7
+ const start = this.tokenStart;
8
+ const children = this.readSequence(this.scope.Value);
9
+
10
+ return {
11
+ type: 'Value',
12
+ loc: this.getLocation(start, this.tokenStart),
13
+ children
14
+ };
15
+ }
16
+
17
+ export function generate(node) {
18
+ this.children(node);
19
+ }
@@ -0,0 +1,27 @@
1
+ import { WhiteSpace } from '../../tokenizer/index.js';
2
+
3
+ const SPACE = Object.freeze({
4
+ type: 'WhiteSpace',
5
+ loc: null,
6
+ value: ' '
7
+ });
8
+
9
+ export const name = 'WhiteSpace';
10
+ export const structure = {
11
+ value: String
12
+ };
13
+
14
+ export function parse() {
15
+ this.eat(WhiteSpace);
16
+ return SPACE;
17
+
18
+ // return {
19
+ // type: 'WhiteSpace',
20
+ // loc: this.getLocation(this.tokenStart, this.tokenEnd),
21
+ // value: this.consume(WHITESPACE)
22
+ // };
23
+ }
24
+
25
+ export function generate(node) {
26
+ this.token(WhiteSpace, node.value);
27
+ }
@@ -0,0 +1,49 @@
1
+ export { generate as AnPlusB } from './AnPlusB.js';
2
+ export { generate as Atrule } from './Atrule.js';
3
+ export { generate as AtrulePrelude } from './AtrulePrelude.js';
4
+ export { generate as AttributeSelector } from './AttributeSelector.js';
5
+ export { generate as Block } from './Block.js';
6
+ export { generate as Brackets } from './Brackets.js';
7
+ export { generate as CDC } from './CDC.js';
8
+ export { generate as CDO } from './CDO.js';
9
+ export { generate as ClassSelector } from './ClassSelector.js';
10
+ export { generate as Combinator } from './Combinator.js';
11
+ export { generate as Comment } from './Comment.js';
12
+ export { generate as Condition } from './Condition.js';
13
+ export { generate as Declaration } from './Declaration.js';
14
+ export { generate as DeclarationList } from './DeclarationList.js';
15
+ export { generate as Dimension } from './Dimension.js';
16
+ export { generate as Feature } from './Feature.js';
17
+ export { generate as FeatureFunction } from './FeatureFunction.js';
18
+ export { generate as FeatureRange } from './FeatureRange.js';
19
+ export { generate as Function } from './Function.js';
20
+ export { generate as GeneralEnclosed } from './GeneralEnclosed.js';
21
+ export { generate as Hash } from './Hash.js';
22
+ export { generate as Identifier } from './Identifier.js';
23
+ export { generate as IdSelector } from './IdSelector.js';
24
+ export { generate as Layer } from './Layer.js';
25
+ export { generate as LayerList } from './LayerList.js';
26
+ export { generate as MediaQuery } from './MediaQuery.js';
27
+ export { generate as MediaQueryList } from './MediaQueryList.js';
28
+ export { generate as NestingSelector } from './NestingSelector.js';
29
+ export { generate as Nth } from './Nth.js';
30
+ export { generate as Number } from './Number.js';
31
+ export { generate as Operator } from './Operator.js';
32
+ export { generate as Parentheses } from './Parentheses.js';
33
+ export { generate as Percentage } from './Percentage.js';
34
+ export { generate as PseudoClassSelector } from './PseudoClassSelector.js';
35
+ export { generate as PseudoElementSelector } from './PseudoElementSelector.js';
36
+ export { generate as Ratio } from './Ratio.js';
37
+ export { generate as Raw } from './Raw.js';
38
+ export { generate as Rule } from './Rule.js';
39
+ export { generate as Scope } from './Scope.js';
40
+ export { generate as Selector } from './Selector.js';
41
+ export { generate as SelectorList } from './SelectorList.js';
42
+ export { generate as String } from './String.js';
43
+ export { generate as StyleSheet } from './StyleSheet.js';
44
+ export { generate as SupportsDeclaration } from './SupportsDeclaration.js';
45
+ export { generate as TypeSelector } from './TypeSelector.js';
46
+ export { generate as UnicodeRange } from './UnicodeRange.js';
47
+ export { generate as Url } from './Url.js';
48
+ export { generate as Value } from './Value.js';
49
+ export { generate as WhiteSpace } from './WhiteSpace.js';
@@ -0,0 +1,17 @@
1
+ export { parse as AnPlusB } from './AnPlusB.js';
2
+ export { parse as AttributeSelector } from './AttributeSelector.js';
3
+ export { parse as ClassSelector } from './ClassSelector.js';
4
+ export { parse as Combinator } from './Combinator.js';
5
+ export { parse as Identifier } from './Identifier.js';
6
+ export { parse as IdSelector } from './IdSelector.js';
7
+ export { parse as NestingSelector } from './NestingSelector.js';
8
+ export { parse as Nth } from './Nth.js';
9
+ export { parse as Operator } from './Operator.js';
10
+ export { parse as Percentage } from './Percentage.js';
11
+ export { parse as PseudoClassSelector } from './PseudoClassSelector.js';
12
+ export { parse as PseudoElementSelector } from './PseudoElementSelector.js';
13
+ export { parse as Raw } from './Raw.js';
14
+ export { parse as Selector } from './Selector.js';
15
+ export { parse as SelectorList } from './SelectorList.js';
16
+ export { parse as String } from './String.js';
17
+ export { parse as TypeSelector } from './TypeSelector.js';