@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,69 @@
1
+ 'use strict';
2
+
3
+ const types = require('../../tokenizer/types.cjs');
4
+
5
+ const name = 'PseudoElementSelector';
6
+ const walkContext = 'function';
7
+ const structure = {
8
+ name: String,
9
+ children: [['Raw'], null]
10
+ };
11
+
12
+ // :: [ <ident> | <function-token> <any-value>? ) ]
13
+ function parse() {
14
+ const start = this.tokenStart;
15
+ let children = null;
16
+ let name;
17
+ let nameLowerCase;
18
+
19
+ this.eat(types.Colon);
20
+ this.eat(types.Colon);
21
+
22
+ if (this.tokenType === types.Function) {
23
+ name = this.consumeFunctionName();
24
+ nameLowerCase = name.toLowerCase();
25
+
26
+ if (this.lookupNonWSType(0) == types.RightParenthesis) {
27
+ children = this.createList();
28
+ } else if (hasOwnProperty.call(this.pseudo, nameLowerCase)) {
29
+ this.skipSC();
30
+ children = this.pseudo[nameLowerCase].call(this);
31
+ this.skipSC();
32
+ } else {
33
+ children = this.createList();
34
+ children.push(
35
+ this.Raw(null, false)
36
+ );
37
+ }
38
+
39
+ this.eat(types.RightParenthesis);
40
+ } else {
41
+ name = this.consume(types.Ident);
42
+ }
43
+
44
+ return {
45
+ type: 'PseudoElementSelector',
46
+ loc: this.getLocation(start, this.tokenStart),
47
+ name,
48
+ children
49
+ };
50
+ }
51
+
52
+ function generate(node) {
53
+ this.token(types.Colon, ':');
54
+ this.token(types.Colon, ':');
55
+
56
+ if (node.children === null) {
57
+ this.token(types.Ident, node.name);
58
+ } else {
59
+ this.token(types.Function, node.name + '(');
60
+ this.children(node);
61
+ this.token(types.RightParenthesis, ')');
62
+ }
63
+ }
64
+
65
+ exports.generate = generate;
66
+ exports.name = name;
67
+ exports.parse = parse;
68
+ exports.structure = structure;
69
+ exports.walkContext = walkContext;
@@ -0,0 +1,71 @@
1
+ 'use strict';
2
+
3
+ const types = require('../../tokenizer/types.cjs');
4
+
5
+ const SOLIDUS = 0x002F; // U+002F SOLIDUS (/)
6
+
7
+ // Media Queries Level 3 defines terms of <ratio> as a positive (not zero or negative)
8
+ // integers (see https://drafts.csswg.org/mediaqueries-3/#values)
9
+ // However, Media Queries Level 4 removes any definition of values
10
+ // (see https://drafts.csswg.org/mediaqueries-4/#values) and refers to
11
+ // CSS Values and Units for detail. In CSS Values and Units Level 4 a <ratio>
12
+ // definition was added (see https://drafts.csswg.org/css-values-4/#ratios) which
13
+ // defines ratio as "<number [0,∞]> [ / <number [0,∞]> ]?" and based on it
14
+ // any constrains on terms were removed. Parser also doesn't test numbers
15
+ // in any way to make possible for linting and fixing them by the tools using CSSTree.
16
+ // An additional syntax examination may be applied by a lexer.
17
+ function consumeTerm() {
18
+ this.skipSC();
19
+
20
+ switch (this.tokenType) {
21
+ case types.Number:
22
+ return this.Number();
23
+
24
+ case types.Function:
25
+ return this.Function(this.readSequence, this.scope.Value);
26
+
27
+ default:
28
+ this.error('Number of function is expected');
29
+ }
30
+ }
31
+
32
+ const name = 'Ratio';
33
+ const structure = {
34
+ left: ['Number', 'Function'],
35
+ right: ['Number', 'Function', null]
36
+ };
37
+
38
+ // <number [0,∞]> [ / <number [0,∞]> ]?
39
+ function parse() {
40
+ const start = this.tokenStart;
41
+ const left = consumeTerm.call(this);
42
+ let right = null;
43
+
44
+ this.skipSC();
45
+ if (this.isDelim(SOLIDUS)) {
46
+ this.eatDelim(SOLIDUS);
47
+ right = consumeTerm.call(this);
48
+ }
49
+
50
+ return {
51
+ type: 'Ratio',
52
+ loc: this.getLocation(start, this.tokenStart),
53
+ left,
54
+ right
55
+ };
56
+ }
57
+
58
+ function generate(node) {
59
+ this.node(node.left);
60
+ this.token(types.Delim, '/');
61
+ if (node.right) {
62
+ this.node(node.right);
63
+ } else {
64
+ this.node(types.Number, 1);
65
+ }
66
+ }
67
+
68
+ exports.generate = generate;
69
+ exports.name = name;
70
+ exports.parse = parse;
71
+ exports.structure = structure;
@@ -0,0 +1,48 @@
1
+ 'use strict';
2
+
3
+ const types = require('../../tokenizer/types.cjs');
4
+
5
+ function getOffsetExcludeWS() {
6
+ if (this.tokenIndex > 0) {
7
+ if (this.lookupType(-1) === types.WhiteSpace) {
8
+ return this.tokenIndex > 1
9
+ ? this.getTokenStart(this.tokenIndex - 1)
10
+ : this.firstCharOffset;
11
+ }
12
+ }
13
+
14
+ return this.tokenStart;
15
+ }
16
+
17
+ const name = 'Raw';
18
+ const structure = {
19
+ value: String
20
+ };
21
+
22
+ function parse(consumeUntil, excludeWhiteSpace) {
23
+ const startOffset = this.getTokenStart(this.tokenIndex);
24
+ let endOffset;
25
+
26
+ this.skipUntilBalanced(this.tokenIndex, consumeUntil || this.consumeUntilBalanceEnd);
27
+
28
+ if (excludeWhiteSpace && this.tokenStart > startOffset) {
29
+ endOffset = getOffsetExcludeWS.call(this);
30
+ } else {
31
+ endOffset = this.tokenStart;
32
+ }
33
+
34
+ return {
35
+ type: 'Raw',
36
+ loc: this.getLocation(startOffset, endOffset),
37
+ value: this.substring(startOffset, endOffset)
38
+ };
39
+ }
40
+
41
+ function generate(node) {
42
+ this.tokenize(node.value);
43
+ }
44
+
45
+ exports.generate = generate;
46
+ exports.name = name;
47
+ exports.parse = parse;
48
+ exports.structure = structure;
@@ -0,0 +1,58 @@
1
+ 'use strict';
2
+
3
+ const types = require('../../tokenizer/types.cjs');
4
+
5
+ function consumeRaw() {
6
+ return this.Raw(this.consumeUntilLeftCurlyBracket, true);
7
+ }
8
+
9
+ function consumePrelude() {
10
+ const prelude = this.SelectorList();
11
+
12
+ if (prelude.type !== 'Raw' &&
13
+ this.eof === false &&
14
+ this.tokenType !== types.LeftCurlyBracket) {
15
+ this.error();
16
+ }
17
+
18
+ return prelude;
19
+ }
20
+
21
+ const name = 'Rule';
22
+ const walkContext = 'rule';
23
+ const structure = {
24
+ prelude: ['SelectorList', 'Raw'],
25
+ block: ['Block']
26
+ };
27
+
28
+ function parse() {
29
+ const startToken = this.tokenIndex;
30
+ const startOffset = this.tokenStart;
31
+ let prelude;
32
+ let block;
33
+
34
+ if (this.parseRulePrelude) {
35
+ prelude = this.parseWithFallback(consumePrelude, consumeRaw);
36
+ } else {
37
+ prelude = consumeRaw.call(this, startToken);
38
+ }
39
+
40
+ block = this.Block(true);
41
+
42
+ return {
43
+ type: 'Rule',
44
+ loc: this.getLocation(startOffset, this.tokenStart),
45
+ prelude,
46
+ block
47
+ };
48
+ }
49
+ function generate(node) {
50
+ this.node(node.prelude);
51
+ this.node(node.block);
52
+ }
53
+
54
+ exports.generate = generate;
55
+ exports.name = name;
56
+ exports.parse = parse;
57
+ exports.structure = structure;
58
+ exports.walkContext = walkContext;
@@ -0,0 +1,69 @@
1
+ 'use strict';
2
+
3
+ const types = require('../../tokenizer/types.cjs');
4
+
5
+ const name = 'Scope';
6
+ const structure = {
7
+ root: ['SelectorList', 'Raw', null],
8
+ limit: ['SelectorList', 'Raw', null]
9
+ };
10
+
11
+ function parse() {
12
+ let root = null;
13
+ let limit = null;
14
+
15
+ this.skipSC();
16
+
17
+ const startOffset = this.tokenStart;
18
+ if (this.tokenType === types.LeftParenthesis) {
19
+ this.next();
20
+ this.skipSC();
21
+ root = this.parseWithFallback(
22
+ this.SelectorList,
23
+ () => this.Raw(false, true)
24
+ );
25
+ this.skipSC();
26
+ this.eat(types.RightParenthesis);
27
+ }
28
+
29
+ if (this.lookupNonWSType(0) === types.Ident) {
30
+ this.skipSC();
31
+ this.eatIdent('to');
32
+ this.skipSC();
33
+ this.eat(types.LeftParenthesis);
34
+ this.skipSC();
35
+ limit = this.parseWithFallback(
36
+ this.SelectorList,
37
+ () => this.Raw(false, true)
38
+ );
39
+ this.skipSC();
40
+ this.eat(types.RightParenthesis);
41
+ }
42
+
43
+ return {
44
+ type: 'Scope',
45
+ loc: this.getLocation(startOffset, this.tokenStart),
46
+ root,
47
+ limit
48
+ };
49
+ }
50
+
51
+ function generate(node) {
52
+ if (node.root) {
53
+ this.token(types.LeftParenthesis, '(');
54
+ this.node(node.root);
55
+ this.token(types.RightParenthesis, ')');
56
+ }
57
+
58
+ if (node.limit) {
59
+ this.token(types.Ident, 'to');
60
+ this.token(types.LeftParenthesis, '(');
61
+ this.node(node.limit);
62
+ this.token(types.RightParenthesis, ')');
63
+ }
64
+ }
65
+
66
+ exports.generate = generate;
67
+ exports.name = name;
68
+ exports.parse = parse;
69
+ exports.structure = structure;
@@ -0,0 +1,38 @@
1
+ 'use strict';
2
+
3
+ const name = 'Selector';
4
+ const structure = {
5
+ children: [[
6
+ 'TypeSelector',
7
+ 'IdSelector',
8
+ 'ClassSelector',
9
+ 'AttributeSelector',
10
+ 'PseudoClassSelector',
11
+ 'PseudoElementSelector',
12
+ 'Combinator'
13
+ ]]
14
+ };
15
+
16
+ function parse() {
17
+ const children = this.readSequence(this.scope.Selector);
18
+
19
+ // nothing were consumed
20
+ if (this.getFirstListNode(children) === null) {
21
+ this.error('Selector is expected');
22
+ }
23
+
24
+ return {
25
+ type: 'Selector',
26
+ loc: this.getLocationFromList(children),
27
+ children
28
+ };
29
+ }
30
+
31
+ function generate(node) {
32
+ this.children(node);
33
+ }
34
+
35
+ exports.generate = generate;
36
+ exports.name = name;
37
+ exports.parse = parse;
38
+ exports.structure = structure;
@@ -0,0 +1,43 @@
1
+ 'use strict';
2
+
3
+ const types = require('../../tokenizer/types.cjs');
4
+
5
+ const name = 'SelectorList';
6
+ const walkContext = 'selector';
7
+ const structure = {
8
+ children: [[
9
+ 'Selector',
10
+ 'Raw'
11
+ ]]
12
+ };
13
+
14
+ function parse() {
15
+ const children = this.createList();
16
+
17
+ while (!this.eof) {
18
+ children.push(this.Selector());
19
+
20
+ if (this.tokenType === types.Comma) {
21
+ this.next();
22
+ continue;
23
+ }
24
+
25
+ break;
26
+ }
27
+
28
+ return {
29
+ type: 'SelectorList',
30
+ loc: this.getLocationFromList(children),
31
+ children
32
+ };
33
+ }
34
+
35
+ function generate(node) {
36
+ this.children(node, () => this.token(types.Comma, ','));
37
+ }
38
+
39
+ exports.generate = generate;
40
+ exports.name = name;
41
+ exports.parse = parse;
42
+ exports.structure = structure;
43
+ exports.walkContext = walkContext;
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ const string = require('../../utils/string.cjs');
4
+ const types = require('../../tokenizer/types.cjs');
5
+
6
+ const name = 'String';
7
+ const structure = {
8
+ value: String
9
+ };
10
+
11
+ function parse() {
12
+ return {
13
+ type: 'String',
14
+ loc: this.getLocation(this.tokenStart, this.tokenEnd),
15
+ value: string.decode(this.consume(types.String))
16
+ };
17
+ }
18
+
19
+ function generate(node) {
20
+ this.token(types.String, string.encode(node.value));
21
+ }
22
+
23
+ exports.generate = generate;
24
+ exports.name = name;
25
+ exports.parse = parse;
26
+ exports.structure = structure;
@@ -0,0 +1,83 @@
1
+ 'use strict';
2
+
3
+ const types = require('../../tokenizer/types.cjs');
4
+
5
+ const EXCLAMATIONMARK = 0x0021; // U+0021 EXCLAMATION MARK (!)
6
+
7
+ function consumeRaw() {
8
+ return this.Raw(null, false);
9
+ }
10
+
11
+ const name = 'StyleSheet';
12
+ const walkContext = 'stylesheet';
13
+ const structure = {
14
+ children: [[
15
+ 'Comment',
16
+ 'CDO',
17
+ 'CDC',
18
+ 'Atrule',
19
+ 'Rule',
20
+ 'Raw'
21
+ ]]
22
+ };
23
+
24
+ function parse() {
25
+ const start = this.tokenStart;
26
+ const children = this.createList();
27
+ let child;
28
+
29
+ while (!this.eof) {
30
+ switch (this.tokenType) {
31
+ case types.WhiteSpace:
32
+ this.next();
33
+ continue;
34
+
35
+ case types.Comment:
36
+ // ignore comments except exclamation comments (i.e. /*! .. */) on top level
37
+ if (this.charCodeAt(this.tokenStart + 2) !== EXCLAMATIONMARK) {
38
+ this.next();
39
+ continue;
40
+ }
41
+
42
+ child = this.Comment();
43
+ break;
44
+
45
+ case types.CDO: // <!--
46
+ child = this.CDO();
47
+ break;
48
+
49
+ case types.CDC: // -->
50
+ child = this.CDC();
51
+ break;
52
+
53
+ // CSS Syntax Module Level 3
54
+ // §2.2 Error handling
55
+ // At the "top level" of a stylesheet, an <at-keyword-token> starts an at-rule.
56
+ case types.AtKeyword:
57
+ child = this.parseWithFallback(this.Atrule, consumeRaw);
58
+ break;
59
+
60
+ // Anything else starts a qualified rule ...
61
+ default:
62
+ child = this.parseWithFallback(this.Rule, consumeRaw);
63
+ }
64
+
65
+ children.push(child);
66
+ }
67
+
68
+ return {
69
+ type: 'StyleSheet',
70
+ loc: this.getLocation(start, this.tokenStart),
71
+ children
72
+ };
73
+ }
74
+
75
+ function generate(node) {
76
+ this.children(node);
77
+ }
78
+
79
+ exports.generate = generate;
80
+ exports.name = name;
81
+ exports.parse = parse;
82
+ exports.structure = structure;
83
+ exports.walkContext = walkContext;
@@ -0,0 +1,38 @@
1
+ 'use strict';
2
+
3
+ const types = require('../../tokenizer/types.cjs');
4
+
5
+ const name = 'SupportsDeclaration';
6
+ const structure = {
7
+ declaration: 'Declaration'
8
+ };
9
+
10
+ function parse() {
11
+ const start = this.tokenStart;
12
+
13
+ this.eat(types.LeftParenthesis);
14
+ this.skipSC();
15
+
16
+ const declaration = this.Declaration();
17
+
18
+ if (!this.eof) {
19
+ this.eat(types.RightParenthesis);
20
+ }
21
+
22
+ return {
23
+ type: 'SupportsDeclaration',
24
+ loc: this.getLocation(start, this.tokenStart),
25
+ declaration
26
+ };
27
+ }
28
+
29
+ function generate(node) {
30
+ this.token(types.LeftParenthesis, '(');
31
+ this.node(node.declaration);
32
+ this.token(types.RightParenthesis, ')');
33
+ }
34
+
35
+ exports.generate = generate;
36
+ exports.name = name;
37
+ exports.parse = parse;
38
+ exports.structure = structure;
@@ -0,0 +1,59 @@
1
+ 'use strict';
2
+
3
+ const types = require('../../tokenizer/types.cjs');
4
+
5
+ const ASTERISK = 0x002A; // U+002A ASTERISK (*)
6
+ const VERTICALLINE = 0x007C; // U+007C VERTICAL LINE (|)
7
+
8
+ function eatIdentifierOrAsterisk() {
9
+ if (this.tokenType !== types.Ident &&
10
+ this.isDelim(ASTERISK) === false) {
11
+ this.error('Identifier or asterisk is expected');
12
+ }
13
+
14
+ this.next();
15
+ }
16
+
17
+ const name = 'TypeSelector';
18
+ const structure = {
19
+ name: String
20
+ };
21
+
22
+ // ident
23
+ // ident|ident
24
+ // ident|*
25
+ // *
26
+ // *|ident
27
+ // *|*
28
+ // |ident
29
+ // |*
30
+ function parse() {
31
+ const start = this.tokenStart;
32
+
33
+ if (this.isDelim(VERTICALLINE)) {
34
+ this.next();
35
+ eatIdentifierOrAsterisk.call(this);
36
+ } else {
37
+ eatIdentifierOrAsterisk.call(this);
38
+
39
+ if (this.isDelim(VERTICALLINE)) {
40
+ this.next();
41
+ eatIdentifierOrAsterisk.call(this);
42
+ }
43
+ }
44
+
45
+ return {
46
+ type: 'TypeSelector',
47
+ loc: this.getLocation(start, this.tokenStart),
48
+ name: this.substrToCursor(start)
49
+ };
50
+ }
51
+
52
+ function generate(node) {
53
+ this.tokenize(node.name);
54
+ }
55
+
56
+ exports.generate = generate;
57
+ exports.name = name;
58
+ exports.parse = parse;
59
+ exports.structure = structure;