csso-rails 0.0.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/csso/js/csso.js DELETED
@@ -1,70 +0,0 @@
1
- var fs = require('fs'),
2
- print = require('util').print,
3
- csso = require('./cssoapi.js'),
4
- src, x;
5
-
6
- var args = process.argv.slice(2),
7
- opts = args.length ? getOpts(args, [
8
- '-v', '--version',
9
- '-h', '--help',
10
- '-dp', '--parser',
11
- '-off', '--restructure-off'
12
- ], [
13
- '-r', '--rule',
14
- '-i', '--input',
15
- '-o', '--output'
16
- ]) : null,
17
- single = opts && opts.single,
18
- pairs = opts && opts.pairs,
19
- other = opts && opts.other,
20
- ro = single && single.contains(['-off', '--restructure-off']),
21
- inFile = (pairs && (pairs['-i'] || pairs['--input'])) || (other && other[0]),
22
- outFile = (pairs && (pairs['-o'] || pairs['--output'])) || (other && other[1]),
23
- rule = pairs && (pairs['-r'] || pairs['--rule']) || 'stylesheet';
24
-
25
- if (single && single.contains(['-v', '--version'])) {
26
- printFile('VERSION');
27
- } else if (!inFile || !opts || (single && single.contains(['-h', '--help'])) || other.length > 2) {
28
- printFile('USAGE');
29
- } else {
30
- src = fs.readFileSync(inFile).toString().trim();
31
-
32
- if (single.contains(['-dp', '--parser'])) csso.printTree(csso.cleanInfo(csso.parse(src, rule, true)));
33
- else {
34
- if (!outFile) print(csso.justDoIt(src, ro, true));
35
- else fs.writeFileSync(outFile, csso.justDoIt(src, ro, true));
36
- }
37
- }
38
-
39
- // Utils
40
-
41
- function getOpts(argv, o_single, o_pairs) {
42
- var opts = { single : [], pairs : {}, other : [] },
43
- arg,
44
- i = 0;
45
-
46
- for (; i < argv.length;) {
47
- arg = argv[i];
48
- if (o_single && o_single.indexOf(arg) !== -1 && (!o_pairs || o_pairs.indexOf(arg) === -1)) {
49
- opts.single.push(arg);
50
- } else if (o_pairs && o_pairs.indexOf(arg) !== -1 && (!o_single || o_single.indexOf(arg) === -1)) {
51
- opts.pairs[arg] = argv[++i];
52
- } else opts.other.push(arg);
53
- i++;
54
- }
55
-
56
- opts.single.contains = function(value) {
57
- if (typeof value === 'string') {
58
- return this.indexOf(value) !== -1;
59
- } else {
60
- for (var i = 0; i < value.length; i++) if (this.indexOf(value[i]) !== -1) return true;
61
- }
62
- return false;
63
- };
64
-
65
- return opts;
66
- }
67
-
68
- function printFile(filename) {
69
- print(fs.readFileSync(__dirname.slice(0, __dirname.lastIndexOf('/')) + '/' + filename).toString());
70
- }
@@ -1,22 +0,0 @@
1
- var util = require('./util.js'),
2
- gonzales = require('./gonzales.cssp.node.js'),
3
- translator = require('./translator.js'),
4
- compressor = require('./compressor.js');
5
-
6
- var parse = exports.parse = function(s, rule, needInfo) {
7
- return gonzales.srcToCSSP(s, rule, needInfo);
8
- };
9
-
10
- var cleanInfo = exports.cleanInfo = util.cleanInfo;
11
-
12
- exports.treeToString = util.treeToString;
13
-
14
- exports.printTree = util.printTree;
15
-
16
- var translate = exports.translate = translator.translate;
17
-
18
- var compress = exports.compress = compressor.compress;
19
-
20
- exports.justDoIt = function(src, ro, needInfo) {
21
- return translate(cleanInfo(compress(parse(src, 'stylesheet', needInfo), ro)));
22
- };
@@ -1,2295 +0,0 @@
1
- var srcToCSSP = (function() {
2
- var TokenType = {
3
- StringSQ: 'StringSQ',
4
- StringDQ: 'StringDQ',
5
- CommentML: 'CommentML',
6
- CommentSL: 'CommentSL',
7
-
8
- Newline: 'Newline',
9
- Space: 'Space',
10
- Tab: 'Tab',
11
-
12
- ExclamationMark: 'ExclamationMark', // !
13
- QuotationMark: 'QuotationMark', // "
14
- NumberSign: 'NumberSign', // #
15
- DollarSign: 'DollarSign', // $
16
- PercentSign: 'PercentSign', // %
17
- Ampersand: 'Ampersand', // &
18
- Apostrophe: 'Apostrophe', // '
19
- LeftParenthesis: 'LeftParenthesis', // (
20
- RightParenthesis: 'RightParenthesis', // )
21
- Asterisk: 'Asterisk', // *
22
- PlusSign: 'PlusSign', // +
23
- Comma: 'Comma', // ,
24
- HyphenMinus: 'HyphenMinus', // -
25
- FullStop: 'FullStop', // .
26
- Solidus: 'Solidus', // /
27
- Colon: 'Colon', // :
28
- Semicolon: 'Semicolon', // ;
29
- LessThanSign: 'LessThanSign', // <
30
- EqualsSign: 'EqualsSign', // =
31
- GreaterThanSign: 'GreaterThanSign', // >
32
- QuestionMark: 'QuestionMark', // ?
33
- CommercialAt: 'CommercialAt', // @
34
- LeftSquareBracket: 'LeftSquareBracket', // [
35
- ReverseSolidus: 'ReverseSolidus', // \
36
- RightSquareBracket: 'RightSquareBracket', // ]
37
- CircumflexAccent: 'CircumflexAccent', // ^
38
- LowLine: 'LowLine', // _
39
- LeftCurlyBracket: 'LeftCurlyBracket', // {
40
- VerticalLine: 'VerticalLine', // |
41
- RightCurlyBracket: 'RightCurlyBracket', // }
42
- Tilde: 'Tilde', // ~
43
-
44
- Identifier: 'Identifier',
45
- DecimalNumber: 'DecimalNumber'
46
- };
47
-
48
- var getTokens = (function() {
49
-
50
- var Punctuation,
51
- urlMode = false,
52
- blockMode = 0;
53
-
54
- Punctuation = {
55
- ' ': TokenType.Space,
56
- '\n': TokenType.Newline,
57
- '\r': TokenType.Newline,
58
- '\t': TokenType.Tab,
59
- '!': TokenType.ExclamationMark,
60
- '"': TokenType.QuotationMark,
61
- '#': TokenType.NumberSign,
62
- '$': TokenType.DollarSign,
63
- '%': TokenType.PercentSign,
64
- '&': TokenType.Ampersand,
65
- '\'': TokenType.Apostrophe,
66
- '(': TokenType.LeftParenthesis,
67
- ')': TokenType.RightParenthesis,
68
- '*': TokenType.Asterisk,
69
- '+': TokenType.PlusSign,
70
- ',': TokenType.Comma,
71
- '-': TokenType.HyphenMinus,
72
- '.': TokenType.FullStop,
73
- '/': TokenType.Solidus,
74
- ':': TokenType.Colon,
75
- ';': TokenType.Semicolon,
76
- '<': TokenType.LessThanSign,
77
- '=': TokenType.EqualsSign,
78
- '>': TokenType.GreaterThanSign,
79
- '?': TokenType.QuestionMark,
80
- '@': TokenType.CommercialAt,
81
- '[': TokenType.LeftSquareBracket,
82
- // '\\': TokenType.ReverseSolidus,
83
- ']': TokenType.RightSquareBracket,
84
- '^': TokenType.CircumflexAccent,
85
- '_': TokenType.LowLine,
86
- '{': TokenType.LeftCurlyBracket,
87
- '|': TokenType.VerticalLine,
88
- '}': TokenType.RightCurlyBracket,
89
- '~': TokenType.Tilde
90
- };
91
-
92
- function isDecimalDigit(c) {
93
- return '0123456789'.indexOf(c) >= 0;
94
- }
95
-
96
- function throwError(message) {
97
- throw message;
98
- }
99
-
100
- var buffer = '',
101
- tokens = [],
102
- pos,
103
- tn = 0,
104
- ln = 1;
105
-
106
- function _getTokens(s) {
107
- if (!s) return [];
108
-
109
- tokens = [];
110
-
111
- var c, cn;
112
-
113
- for (pos = 0; pos < s.length; pos++) {
114
- c = s.charAt(pos);
115
- cn = s.charAt(pos + 1);
116
-
117
- if (c === '/' && cn === '*') {
118
- parseMLComment(s);
119
- } else if (!urlMode && c === '/' && cn === '/') {
120
- if (blockMode > 0) parseIdentifier(s);
121
- else parseSLComment(s);
122
- } else if (c === '"' || c === "'") {
123
- parseString(s, c);
124
- } else if (c === ' ') {
125
- parseSpaces(s)
126
- } else if (c in Punctuation) {
127
- pushToken(Punctuation[c], c);
128
- if (c === '\n' || c === '\r') ln++;
129
- if (c === ')') urlMode = false;
130
- if (c === '{') blockMode++;
131
- if (c === '}') blockMode--;
132
- } else if (isDecimalDigit(c)) {
133
- parseDecimalNumber(s);
134
- } else {
135
- parseIdentifier(s);
136
- }
137
- }
138
-
139
- mark();
140
-
141
- return tokens;
142
- }
143
-
144
- function pushToken(type, value) {
145
- tokens.push({ tn: tn++, ln: ln, type: type, value: value });
146
- }
147
-
148
- function parseSpaces(s) {
149
- var start = pos;
150
-
151
- for (; pos < s.length; pos++) {
152
- if (s.charAt(pos) !== ' ') break;
153
- }
154
-
155
- pushToken(TokenType.Space, s.substring(start, pos));
156
- pos--;
157
- }
158
-
159
- function parseMLComment(s) {
160
- var start = pos;
161
-
162
- for (pos = pos + 2; pos < s.length; pos++) {
163
- if (s.charAt(pos) === '*') {
164
- if (s.charAt(pos + 1) === '/') {
165
- pos++;
166
- break;
167
- }
168
- }
169
- }
170
-
171
- pushToken(TokenType.CommentML, s.substring(start, pos + 1));
172
- }
173
-
174
- function parseSLComment(s) {
175
- var start = pos;
176
-
177
- for (pos = pos + 2; pos < s.length; pos++) {
178
- if (s.charAt(pos) === '\n' || s.charAt(pos) === '\r') {
179
- pos++;
180
- break;
181
- }
182
- }
183
-
184
- pushToken(TokenType.CommentSL, s.substring(start, pos));
185
- pos--;
186
- }
187
-
188
- function parseString(s, q) {
189
- var start = pos;
190
-
191
- for (pos = pos + 1; pos < s.length; pos++) {
192
- if (s.charAt(pos) === '\\') pos++;
193
- else if (s.charAt(pos) === q) break;
194
- }
195
-
196
- pushToken(q === '"' ? TokenType.StringDQ : TokenType.StringSQ, s.substring(start, pos + 1));
197
- }
198
-
199
- function parseDecimalNumber(s) {
200
- var start = pos;
201
-
202
- for (; pos < s.length; pos++) {
203
- if (!isDecimalDigit(s.charAt(pos))) break;
204
- }
205
-
206
- pushToken(TokenType.DecimalNumber, s.substring(start, pos));
207
- pos--;
208
- }
209
-
210
- function parseIdentifier(s) {
211
- var start = pos;
212
-
213
- while (s.charAt(pos) === '/') pos++;
214
-
215
- for (; pos < s.length; pos++) {
216
- if (s.charAt(pos) === '\\') pos++;
217
- else if (s.charAt(pos) in Punctuation) break;
218
- }
219
-
220
- var ident = s.substring(start, pos);
221
-
222
- urlMode = urlMode || ident === 'url';
223
-
224
- pushToken(TokenType.Identifier, ident);
225
- pos--;
226
- }
227
-
228
- // ====================================
229
- // second run
230
- // ====================================
231
-
232
- function mark() {
233
- var ps = [], // Parenthesis
234
- sbs = [], // SquareBracket
235
- cbs = [], // CurlyBracket
236
- t;
237
-
238
- for (var i = 0; i < tokens.length; i++) {
239
- t = tokens[i];
240
- switch(t.type) {
241
- case TokenType.LeftParenthesis:
242
- ps.push(i);
243
- break;
244
- case TokenType.RightParenthesis:
245
- if (ps.length) {
246
- t.left = ps.pop();
247
- tokens[t.left].right = i;
248
- }
249
- break;
250
- case TokenType.LeftSquareBracket:
251
- sbs.push(i);
252
- break;
253
- case TokenType.RightSquareBracket:
254
- if (sbs.length) {
255
- t.left = sbs.pop();
256
- tokens[t.left].right = i;
257
- }
258
- break;
259
- case TokenType.LeftCurlyBracket:
260
- cbs.push(i);
261
- break;
262
- case TokenType.RightCurlyBracket:
263
- if (cbs.length) {
264
- t.left = cbs.pop();
265
- tokens[t.left].right = i;
266
- }
267
- break;
268
- }
269
- }
270
- }
271
-
272
- return function(s) {
273
- return _getTokens(s);
274
- };
275
-
276
- }());
277
- // version: 1.0.0
278
-
279
- var getCSSPAST = (function() {
280
-
281
- var tokens,
282
- pos,
283
- failLN = 0,
284
- currentBlockLN = 0,
285
- needInfo = false;
286
-
287
- var CSSPNodeType,
288
- CSSLevel,
289
- CSSPRules;
290
-
291
- CSSPNodeType = {
292
- IdentType: 'ident',
293
- AtkeywordType: 'atkeyword',
294
- StringType: 'string',
295
- ShashType: 'shash',
296
- VhashType: 'vhash',
297
- NumberType: 'number',
298
- PercentageType: 'percentage',
299
- DimensionType: 'dimension',
300
- CdoType: 'cdo',
301
- CdcType: 'cdc',
302
- DecldelimType: 'decldelim',
303
- SType: 's',
304
- AttrselectorType: 'attrselector',
305
- AttribType: 'attrib',
306
- NthType: 'nth',
307
- NthselectorType: 'nthselector',
308
- NamespaceType: 'namespace',
309
- ClazzType: 'clazz',
310
- PseudoeType: 'pseudoe',
311
- PseudocType: 'pseudoc',
312
- DelimType: 'delim',
313
- StylesheetType: 'stylesheet',
314
- AtrulebType: 'atruleb',
315
- AtrulesType: 'atrules',
316
- AtrulerqType: 'atrulerq',
317
- AtrulersType: 'atrulers',
318
- AtrulerType: 'atruler',
319
- BlockType: 'block',
320
- RulesetType: 'ruleset',
321
- CombinatorType: 'combinator',
322
- SimpleselectorType: 'simpleselector',
323
- SelectorType: 'selector',
324
- DeclarationType: 'declaration',
325
- PropertyType: 'property',
326
- ImportantType: 'important',
327
- UnaryType: 'unary',
328
- OperatorType: 'operator',
329
- BracesType: 'braces',
330
- ValueType: 'value',
331
- ProgidType: 'progid',
332
- FiltervType: 'filterv',
333
- FilterType: 'filter',
334
- CommentType: 'comment',
335
- UriType: 'uri',
336
- RawType: 'raw',
337
- FunctionBodyType: 'functionBody',
338
- FunktionType: 'funktion',
339
- FunctionExpressionType: 'functionExpression',
340
- UnknownType: 'unknown'
341
- };
342
-
343
- CSSPRules = {
344
- 'ident': function() { if (checkIdent(pos)) return getIdent() },
345
- 'atkeyword': function() { if (checkAtkeyword(pos)) return getAtkeyword() },
346
- 'string': function() { if (checkString(pos)) return getString() },
347
- 'shash': function() { if (checkShash(pos)) return getShash() },
348
- 'vhash': function() { if (checkVhash(pos)) return getVhash() },
349
- 'number': function() { if (checkNumber(pos)) return getNumber() },
350
- 'percentage': function() { if (checkPercentage(pos)) return getPercentage() },
351
- 'dimension': function() { if (checkDimension(pos)) return getDimension() },
352
- // 'cdo': function() { if (checkCDO()) return getCDO() },
353
- // 'cdc': function() { if (checkCDC()) return getCDC() },
354
- 'decldelim': function() { if (checkDecldelim(pos)) return getDecldelim() },
355
- 's': function() { if (checkS(pos)) return getS() },
356
- 'attrselector': function() { if (checkAttrselector(pos)) return getAttrselector() },
357
- 'attrib': function() { if (checkAttrib(pos)) return getAttrib() },
358
- 'nth': function() { if (checkNth(pos)) return getNth() },
359
- 'nthselector': function() { if (checkNthselector(pos)) return getNthselector() },
360
- 'namespace': function() { if (checkNamespace(pos)) return getNamespace() },
361
- 'clazz': function() { if (checkClazz(pos)) return getClazz() },
362
- 'pseudoe': function() { if (checkPseudoe(pos)) return getPseudoe() },
363
- 'pseudoc': function() { if (checkPseudoc(pos)) return getPseudoc() },
364
- 'delim': function() { if (checkDelim(pos)) return getDelim() },
365
- 'stylesheet': function() { if (checkStylesheet(pos)) return getStylesheet() },
366
- 'atruleb': function() { if (checkAtruleb(pos)) return getAtruleb() },
367
- 'atrules': function() { if (checkAtrules(pos)) return getAtrules() },
368
- 'atrulerq': function() { if (checkAtrulerq(pos)) return getAtrulerq() },
369
- 'atrulers': function() { if (checkAtrulers(pos)) return getAtrulers() },
370
- 'atruler': function() { if (checkAtruler(pos)) return getAtruler() },
371
- 'block': function() { if (checkBlock(pos)) return getBlock() },
372
- 'ruleset': function() { if (checkRuleset(pos)) return getRuleset() },
373
- 'combinator': function() { if (checkCombinator(pos)) return getCombinator() },
374
- 'simpleselector': function() { if (checkSimpleselector(pos)) return getSimpleSelector() },
375
- 'selector': function() { if (checkSelector(pos)) return getSelector() },
376
- 'declaration': function() { if (checkDeclaration(pos)) return getDeclaration() },
377
- 'property': function() { if (checkProperty(pos)) return getProperty() },
378
- 'important': function() { if (checkImportant(pos)) return getImportant() },
379
- 'unary': function() { if (checkUnary(pos)) return getUnary() },
380
- 'operator': function() { if (checkOperator(pos)) return getOperator() },
381
- 'braces': function() { if (checkBraces(pos)) return getBraces() },
382
- 'value': function() { if (checkValue(pos)) return getValue() },
383
- 'progid': function() { if (checkProgid(pos)) return getProgid() },
384
- 'filterv': function() { if (checkFilterv(pos)) return getFilterv() },
385
- 'filter': function() { if (checkFilter(pos)) return getFilter() },
386
- 'comment': function() { if (checkComment(pos)) return getComment() },
387
- 'uri': function() { if (checkUri(pos)) return getUri() },
388
- 'raw': function() { if (checkRaw(pos)) return getRaw() },
389
- 'funktion': function() { if (checkFunktion(pos)) return getFunktion() },
390
- 'functionExpression': function() { if (checkFunctionExpression(pos)) return getFunctionExpression() },
391
- 'unknown': function() { if (checkUnknown(pos)) return getUnknown() }
392
- };
393
-
394
- function fail(token) {
395
- if (token && token.ln > failLN) failLN = token.ln;
396
- }
397
-
398
- function throwError() {
399
- throw new Error('Please check the validity of the CSS block starting from the line #' + currentBlockLN);
400
- }
401
-
402
- function _getAST(_tokens, rule, _needInfo) {
403
- tokens = _tokens;
404
- needInfo = _needInfo;
405
- pos = 0;
406
-
407
- markSC();
408
-
409
- return rule ? CSSPRules[rule]() : CSSPRules['stylesheet']();
410
- }
411
-
412
- //any = braces | string | percentage | dimension | number | uri | functionExpression | funktion | ident | unary
413
- function checkAny(_i) {
414
- return checkBraces(_i) ||
415
- checkString(_i) ||
416
- checkPercentage(_i) ||
417
- checkDimension(_i) ||
418
- checkNumber(_i) ||
419
- checkUri(_i) ||
420
- checkFunctionExpression(_i) ||
421
- checkFunktion(_i) ||
422
- checkIdent(_i) ||
423
- checkUnary(_i);
424
- }
425
-
426
- function getAny() {
427
- if (checkBraces(pos)) return getBraces();
428
- else if (checkString(pos)) return getString();
429
- else if (checkPercentage(pos)) return getPercentage();
430
- else if (checkDimension(pos)) return getDimension();
431
- else if (checkNumber(pos)) return getNumber();
432
- else if (checkUri(pos)) return getUri();
433
- else if (checkFunctionExpression(pos)) return getFunctionExpression();
434
- else if (checkFunktion(pos)) return getFunktion();
435
- else if (checkIdent(pos)) return getIdent();
436
- else if (checkUnary(pos)) return getUnary();
437
- }
438
-
439
- //atkeyword = '@' ident:x -> [#atkeyword, x]
440
- function checkAtkeyword(_i) {
441
- var l;
442
-
443
- if (tokens[_i++].type !== TokenType.CommercialAt) return fail(tokens[_i - 1]);
444
-
445
- if (l = checkIdent(_i)) return l + 1;
446
-
447
- return fail(tokens[_i]);
448
- }
449
-
450
- function getAtkeyword() {
451
- var startPos = pos;
452
-
453
- pos++;
454
-
455
- return needInfo?
456
- [{ ln: tokens[startPos].ln }, CSSPNodeType.AtkeywordType, getIdent()]:
457
- [CSSPNodeType.AtkeywordType, getIdent()];
458
- }
459
-
460
- //attrib = '[' sc*:s0 ident:x sc*:s1 attrselector:a sc*:s2 (ident | string):y sc*:s3 ']' -> this.concat([#attrib], s0, [x], s1, [a], s2, [y], s3)
461
- // | '[' sc*:s0 ident:x sc*:s1 ']' -> this.concat([#attrib], s0, [x], s1),
462
- function checkAttrib(_i) {
463
- if (tokens[_i].type !== TokenType.LeftSquareBracket) return fail(tokens[_i]);
464
-
465
- if (!tokens[_i].right) return fail(tokens[_i]);
466
-
467
- return tokens[_i].right - _i + 1;
468
- }
469
-
470
- function checkAttrib1(_i) {
471
- var start = _i;
472
-
473
- _i++;
474
-
475
- var l = checkSC(_i); // s0
476
-
477
- if (l) _i += l;
478
-
479
- if (l = checkIdent(_i)) _i += l; // x
480
- else return fail(tokens[_i]);
481
-
482
- if (l = checkSC(_i)) _i += l; // s1
483
-
484
- if (l = checkAttrselector(_i)) _i += l; // a
485
- else return fail(tokens[_i]);
486
-
487
- if (l = checkSC(_i)) _i += l; // s2
488
-
489
- if ((l = checkIdent(_i)) || (l = checkString(_i))) _i += l; // y
490
- else return fail(tokens[_i]);
491
-
492
- if (l = checkSC(_i)) _i += l; // s3
493
-
494
- if (tokens[_i].type === TokenType.RightSquareBracket) return _i - start;
495
-
496
- return fail(tokens[_i]);
497
- }
498
-
499
- function getAttrib1() {
500
- var startPos = pos;
501
-
502
- pos++;
503
-
504
- var a = (needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.AttribType] : [CSSPNodeType.AttribType])
505
- .concat(getSC())
506
- .concat([getIdent()])
507
- .concat(getSC())
508
- .concat([getAttrselector()])
509
- .concat(getSC())
510
- .concat([checkString(pos)? getString() : getIdent()])
511
- .concat(getSC());
512
-
513
- pos++;
514
-
515
- return a;
516
- }
517
-
518
- function checkAttrib2(_i) {
519
- var start = _i;
520
-
521
- _i++;
522
-
523
- var l = checkSC(_i);
524
-
525
- if (l) _i += l;
526
-
527
- if (l = checkIdent(_i)) _i += l;
528
-
529
- if (l = checkSC(_i)) _i += l;
530
-
531
- if (tokens[_i].type === TokenType.RightSquareBracket) return _i - start;
532
-
533
- return fail(tokens[_i]);
534
- }
535
-
536
- function getAttrib2() {
537
- var startPos = pos;
538
-
539
- pos++;
540
-
541
- var a = (needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.AttribType] : [CSSPNodeType.AttribType])
542
- .concat(getSC())
543
- .concat([getIdent()])
544
- .concat(getSC());
545
-
546
- pos++;
547
-
548
- return a;
549
- }
550
-
551
- function getAttrib() {
552
- if (checkAttrib1(pos)) return getAttrib1();
553
- if (checkAttrib2(pos)) return getAttrib2();
554
- }
555
-
556
- //attrselector = (seq('=') | seq('~=') | seq('^=') | seq('$=') | seq('*=') | seq('|=')):x -> [#attrselector, x]
557
- function checkAttrselector(_i) {
558
- if (tokens[_i].type === TokenType.EqualsSign) return 1;
559
- if (tokens[_i].type === TokenType.VerticalLine && (!tokens[_i + 1] || tokens[_i + 1].type !== TokenType.EqualsSign)) return 1;
560
-
561
- if (!tokens[_i + 1] || tokens[_i + 1].type !== TokenType.EqualsSign) return fail(tokens[_i]);
562
-
563
- switch(tokens[_i].type) {
564
- case TokenType.Tilde:
565
- case TokenType.CircumflexAccent:
566
- case TokenType.DollarSign:
567
- case TokenType.Asterisk:
568
- case TokenType.VerticalLine:
569
- return 2;
570
- }
571
-
572
- return fail(tokens[_i]);
573
- }
574
-
575
- function getAttrselector() {
576
- var startPos = pos,
577
- s = tokens[pos++].value;
578
-
579
- if (tokens[pos] && tokens[pos].type === TokenType.EqualsSign) s += tokens[pos++].value;
580
-
581
- return needInfo?
582
- [{ ln: tokens[startPos].ln }, CSSPNodeType.AttrselectorType, s] :
583
- [CSSPNodeType.AttrselectorType, s];
584
- }
585
-
586
- //atrule = atruler | atruleb | atrules
587
- function checkAtrule(_i) {
588
- var start = _i,
589
- l;
590
-
591
- if (tokens[start].atrule_l !== undefined) return tokens[start].atrule_l;
592
-
593
- if (l = checkAtruler(_i)) tokens[_i].atrule_type = 1;
594
- else if (l = checkAtruleb(_i)) tokens[_i].atrule_type = 2;
595
- else if (l = checkAtrules(_i)) tokens[_i].atrule_type = 3;
596
- else return fail(tokens[start]);
597
-
598
- tokens[start].atrule_l = l;
599
-
600
- return l;
601
- }
602
-
603
- function getAtrule() {
604
- switch (tokens[pos].atrule_type) {
605
- case 1: return getAtruler();
606
- case 2: return getAtruleb();
607
- case 3: return getAtrules();
608
- }
609
- }
610
-
611
- //atruleb = atkeyword:ak tset*:ap block:b -> this.concat([#atruleb, ak], ap, [b])
612
- function checkAtruleb(_i) {
613
- var start = _i,
614
- l;
615
-
616
- if (l = checkAtkeyword(_i)) _i += l;
617
- else return fail(tokens[_i]);
618
-
619
- if (l = checkTsets(_i)) _i += l;
620
-
621
- if (l = checkBlock(_i)) _i += l;
622
- else return fail(tokens[_i]);
623
-
624
- return _i - start;
625
- }
626
-
627
- function getAtruleb() {
628
- return (needInfo?
629
- [{ ln: tokens[pos].ln }, CSSPNodeType.AtrulebType, getAtkeyword()] :
630
- [CSSPNodeType.AtrulebType, getAtkeyword()])
631
- .concat(getTsets())
632
- .concat([getBlock()]);
633
- }
634
-
635
- //atruler = atkeyword:ak atrulerq:x '{' atrulers:y '}' -> [#atruler, ak, x, y]
636
- function checkAtruler(_i) {
637
- var start = _i,
638
- l;
639
-
640
- if (l = checkAtkeyword(_i)) _i += l;
641
- else return fail(tokens[_i]);
642
-
643
- if (l = checkAtrulerq(_i)) _i += l;
644
-
645
- if (_i < tokens.length && tokens[_i].type === TokenType.LeftCurlyBracket) _i++;
646
- else return fail(tokens[_i]);
647
-
648
- if (l = checkAtrulers(_i)) _i += l;
649
-
650
- if (_i < tokens.length && tokens[_i].type === TokenType.RightCurlyBracket) _i++;
651
- else return fail(tokens[_i]);
652
-
653
- return _i - start;
654
- }
655
-
656
- function getAtruler() {
657
- var atruler = needInfo?
658
- [{ ln: tokens[pos].ln }, CSSPNodeType.AtrulerType, getAtkeyword(), getAtrulerq()] :
659
- [CSSPNodeType.AtrulerType, getAtkeyword(), getAtrulerq()];
660
-
661
- pos++;
662
-
663
- atruler.push(getAtrulers());
664
-
665
- pos++;
666
-
667
- return atruler;
668
- }
669
-
670
- //atrulerq = tset*:ap -> [#atrulerq].concat(ap)
671
- function checkAtrulerq(_i) {
672
- return checkTsets(_i);
673
- }
674
-
675
- function getAtrulerq() {
676
- return (needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.AtrulerqType] : [CSSPNodeType.AtrulerqType]).concat(getTsets());
677
- }
678
-
679
- //atrulers = sc*:s0 ruleset*:r sc*:s1 -> this.concat([#atrulers], s0, r, s1)
680
- function checkAtrulers(_i) {
681
- var start = _i,
682
- l;
683
-
684
- if (l = checkSC(_i)) _i += l;
685
-
686
- while ((l = checkRuleset(_i)) || (l = checkAtrule(_i)) || (l = checkSC(_i))) {
687
- _i += l;
688
- }
689
-
690
- tokens[_i].atrulers_end = 1;
691
-
692
- if (l = checkSC(_i)) _i += l;
693
-
694
- return _i - start;
695
- }
696
-
697
- function getAtrulers() {
698
- var atrulers = (needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.AtrulersType] : [CSSPNodeType.AtrulersType]).concat(getSC()),
699
- x;
700
-
701
- while (!tokens[pos].atrulers_end) {
702
- if (checkSC(pos)) {
703
- atrulers = atrulers.concat(getSC());
704
- } else if (checkRuleset(pos)) {
705
- atrulers.push(getRuleset());
706
- } else {
707
- atrulers.push(getAtrule());
708
- }
709
- }
710
-
711
- return atrulers.concat(getSC());
712
- }
713
-
714
- //atrules = atkeyword:ak tset*:ap ';' -> this.concat([#atrules, ak], ap)
715
- function checkAtrules(_i) {
716
- var start = _i,
717
- l;
718
-
719
- if (l = checkAtkeyword(_i)) _i += l;
720
- else return fail(tokens[_i]);
721
-
722
- if (l = checkTsets(_i)) _i += l;
723
-
724
- if (_i >= tokens.length) return _i - start;
725
-
726
- if (tokens[_i].type === TokenType.Semicolon) _i++;
727
- else return fail(tokens[_i]);
728
-
729
- return _i - start;
730
- }
731
-
732
- function getAtrules() {
733
- var atrules = (needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.AtrulesType, getAtkeyword()] : [CSSPNodeType.AtrulesType, getAtkeyword()]).concat(getTsets());
734
-
735
- pos++;
736
-
737
- return atrules;
738
- }
739
-
740
- //block = '{' blockdecl*:x '}' -> this.concatContent([#block], x)
741
- function checkBlock(_i) {
742
- if (_i < tokens.length && tokens[_i].type === TokenType.LeftCurlyBracket) return tokens[_i].right - _i + 1;
743
-
744
- return fail(tokens[_i]);
745
- }
746
-
747
- function getBlock() {
748
- var block = needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.BlockType] : [CSSPNodeType.BlockType],
749
- end = tokens[pos].right;
750
-
751
- pos++;
752
-
753
- while (pos < end) {
754
- if (checkBlockdecl(pos)) block = block.concat(getBlockdecl());
755
- else throwError();
756
- }
757
-
758
- pos = end + 1;
759
-
760
- return block;
761
- }
762
-
763
- //blockdecl = sc*:s0 (filter | declaration):x decldelim:y sc*:s1 -> this.concat(s0, [x], [y], s1)
764
- // | sc*:s0 (filter | declaration):x sc*:s1 -> this.concat(s0, [x], s1)
765
- // | sc*:s0 decldelim:x sc*:s1 -> this.concat(s0, [x], s1)
766
- // | sc+:s0 -> s0
767
-
768
- function checkBlockdecl(_i) {
769
- var l;
770
-
771
- if (l = _checkBlockdecl0(_i)) tokens[_i].bd_type = 1;
772
- else if (l = _checkBlockdecl1(_i)) tokens[_i].bd_type = 2;
773
- else if (l = _checkBlockdecl2(_i)) tokens[_i].bd_type = 3;
774
- else if (l = _checkBlockdecl3(_i)) tokens[_i].bd_type = 4;
775
- else return fail(tokens[_i]);
776
-
777
- return l;
778
- }
779
-
780
- function getBlockdecl() {
781
- switch (tokens[pos].bd_type) {
782
- case 1: return _getBlockdecl0();
783
- case 2: return _getBlockdecl1();
784
- case 3: return _getBlockdecl2();
785
- case 4: return _getBlockdecl3();
786
- }
787
- }
788
-
789
- //sc*:s0 (filter | declaration):x decldelim:y sc*:s1 -> this.concat(s0, [x], [y], s1)
790
- function _checkBlockdecl0(_i) {
791
- var start = _i,
792
- l;
793
-
794
- if (l = checkSC(_i)) _i += l;
795
-
796
- if (l = checkFilter(_i)) {
797
- tokens[_i].bd_filter = 1;
798
- _i += l;
799
- } else if (l = checkDeclaration(_i)) {
800
- tokens[_i].bd_decl = 1;
801
- _i += l;
802
- } else return fail(tokens[_i]);
803
-
804
- if (_i < tokens.length && (l = checkDecldelim(_i))) _i += l;
805
- else return fail(tokens[_i]);
806
-
807
- if (l = checkSC(_i)) _i += l;
808
-
809
- return _i - start;
810
- }
811
-
812
- function _getBlockdecl0() {
813
- return getSC()
814
- .concat([tokens[pos].bd_filter? getFilter() : getDeclaration()])
815
- .concat([getDecldelim()])
816
- .concat(getSC());
817
- }
818
-
819
- //sc*:s0 (filter | declaration):x sc*:s1 -> this.concat(s0, [x], s1)
820
- function _checkBlockdecl1(_i) {
821
- var start = _i,
822
- l;
823
-
824
- if (l = checkSC(_i)) _i += l;
825
-
826
- if (l = checkFilter(_i)) {
827
- tokens[_i].bd_filter = 1;
828
- _i += l;
829
- } else if (l = checkDeclaration(_i)) {
830
- tokens[_i].bd_decl = 1;
831
- _i += l;
832
- } else return fail(tokens[_i]);
833
-
834
- if (l = checkSC(_i)) _i += l;
835
-
836
- return _i - start;
837
- }
838
-
839
- function _getBlockdecl1() {
840
- return getSC()
841
- .concat([tokens[pos].bd_filter? getFilter() : getDeclaration()])
842
- .concat(getSC());
843
- }
844
-
845
- //sc*:s0 decldelim:x sc*:s1 -> this.concat(s0, [x], s1)
846
- function _checkBlockdecl2(_i) {
847
- var start = _i,
848
- l;
849
-
850
- if (l = checkSC(_i)) _i += l;
851
-
852
- if (l = checkDecldelim(_i)) _i += l;
853
- else return fail(tokens[_i]);
854
-
855
- if (l = checkSC(_i)) _i += l;
856
-
857
- return _i - start;
858
- }
859
-
860
- function _getBlockdecl2() {
861
- return getSC()
862
- .concat([getDecldelim()])
863
- .concat(getSC());
864
- }
865
-
866
- //sc+:s0 -> s0
867
- function _checkBlockdecl3(_i) {
868
- return checkSC(_i);
869
- }
870
-
871
- function _getBlockdecl3() {
872
- return getSC();
873
- }
874
-
875
- //braces = '(' tset*:x ')' -> this.concat([#braces, '(', ')'], x)
876
- // | '[' tset*:x ']' -> this.concat([#braces, '[', ']'], x)
877
- function checkBraces(_i) {
878
- if (_i >= tokens.length ||
879
- (tokens[_i].type !== TokenType.LeftParenthesis &&
880
- tokens[_i].type !== TokenType.LeftSquareBracket)
881
- ) return fail(tokens[_i]);
882
-
883
- return tokens[_i].right - _i + 1;
884
- }
885
-
886
- function getBraces() {
887
- var startPos = pos,
888
- left = pos,
889
- right = tokens[pos].right;
890
-
891
- pos++;
892
-
893
- var tsets = getTsets();
894
-
895
- pos++;
896
-
897
- return needInfo?
898
- [{ ln: tokens[startPos].ln }, CSSPNodeType.BracesType, tokens[left].value, tokens[right].value].concat(tsets) :
899
- [CSSPNodeType.BracesType, tokens[left].value, tokens[right].value].concat(tsets);
900
- }
901
-
902
- function checkCDC(_i) {}
903
-
904
- function checkCDO(_i) {}
905
-
906
- // node: Clazz
907
- function checkClazz(_i) {
908
- var l;
909
-
910
- if (tokens[_i].clazz_l) return tokens[_i].clazz_l;
911
-
912
- if (tokens[_i].type === TokenType.FullStop) {
913
- if (l = checkIdent(_i + 1)) {
914
- tokens[_i].clazz_l = l + 1;
915
- return l + 1;
916
- }
917
- }
918
-
919
- return fail(tokens[_i]);
920
- }
921
-
922
- function getClazz() {
923
- var startPos = pos;
924
-
925
- pos++;
926
-
927
- return needInfo?
928
- [{ ln: tokens[startPos].ln }, CSSPNodeType.ClazzType, getIdent()] :
929
- [CSSPNodeType.ClazzType, getIdent()];
930
- }
931
-
932
- // node: Combinator
933
- function checkCombinator(_i) {
934
- if (tokens[_i].type === TokenType.PlusSign ||
935
- tokens[_i].type === TokenType.GreaterThanSign ||
936
- tokens[_i].type === TokenType.Tilde) return 1;
937
-
938
- return fail(tokens[_i]);
939
- }
940
-
941
- function getCombinator() {
942
- return needInfo?
943
- [{ ln: tokens[pos].ln }, CSSPNodeType.CombinatorType, tokens[pos++].value] :
944
- [CSSPNodeType.CombinatorType, tokens[pos++].value];
945
- }
946
-
947
- // node: Comment
948
- function checkComment(_i) {
949
- if (tokens[_i].type === TokenType.CommentML) return 1;
950
-
951
- return fail(tokens[_i]);
952
- }
953
-
954
- function getComment() {
955
- var startPos = pos,
956
- s = tokens[pos].value.substring(2),
957
- l = s.length;
958
-
959
- if (s.charAt(l - 2) === '*' && s.charAt(l - 1) === '/') s = s.substring(0, l - 2);
960
-
961
- pos++;
962
-
963
- return needInfo?
964
- [{ ln: tokens[startPos].ln }, CSSPNodeType.CommentType, s] :
965
- [CSSPNodeType.CommentType, s];
966
- }
967
-
968
- // declaration = property:x ':' value:y -> [#declaration, x, y]
969
- function checkDeclaration(_i) {
970
- var start = _i,
971
- l;
972
-
973
- if (l = checkProperty(_i)) _i += l;
974
- else return fail(tokens[_i]);
975
-
976
- if (_i < tokens.length && tokens[_i].type === TokenType.Colon) _i++;
977
- else return fail(tokens[_i]);
978
-
979
- if (l = checkValue(_i)) _i += l;
980
- else return fail(tokens[_i]);
981
-
982
- return _i - start;
983
- }
984
-
985
- function getDeclaration() {
986
- var declaration = needInfo?
987
- [{ ln: tokens[pos].ln }, CSSPNodeType.DeclarationType, getProperty()] :
988
- [CSSPNodeType.DeclarationType, getProperty()];
989
-
990
- pos++;
991
-
992
- declaration.push(getValue());
993
-
994
- return declaration;
995
- }
996
-
997
- // node: Decldelim
998
- function checkDecldelim(_i) {
999
- if (_i < tokens.length && tokens[_i].type === TokenType.Semicolon) return 1;
1000
-
1001
- return fail(tokens[_i]);
1002
- }
1003
-
1004
- function getDecldelim() {
1005
- var startPos = pos;
1006
-
1007
- pos++;
1008
-
1009
- return needInfo?
1010
- [{ ln: tokens[startPos].ln }, CSSPNodeType.DecldelimType] :
1011
- [CSSPNodeType.DecldelimType];
1012
- }
1013
-
1014
- // node: Delim
1015
- function checkDelim(_i) {
1016
- if (_i < tokens.length && tokens[_i].type === TokenType.Comma) return 1;
1017
-
1018
- if (_i >= tokens.length) return fail(tokens[tokens.length - 1]);
1019
-
1020
- return fail(tokens[_i]);
1021
- }
1022
-
1023
- function getDelim() {
1024
- var startPos = pos;
1025
-
1026
- pos++;
1027
-
1028
- return needInfo?
1029
- [{ ln: tokens[startPos].ln }, CSSPNodeType.DelimType] :
1030
- [CSSPNodeType.DelimType];
1031
- }
1032
-
1033
- // node: Dimension
1034
- function checkDimension(_i) {
1035
- var ln = checkNumber(_i),
1036
- li;
1037
-
1038
- if (!ln || (ln && _i + ln >= tokens.length)) return fail(tokens[_i]);
1039
-
1040
- if (li = checkNmName2(_i + ln)) return ln + li;
1041
-
1042
- return fail(tokens[_i]);
1043
- }
1044
-
1045
- function getDimension() {
1046
- var startPos = pos,
1047
- n = getNumber(),
1048
- dimension = needInfo ?
1049
- [{ ln: tokens[pos].ln }, CSSPNodeType.IdentType, getNmName2()] :
1050
- [CSSPNodeType.IdentType, getNmName2()];
1051
-
1052
- return needInfo?
1053
- [{ ln: tokens[startPos].ln }, CSSPNodeType.DimensionType, n, dimension] :
1054
- [CSSPNodeType.DimensionType, n, dimension];
1055
- }
1056
-
1057
- //filter = filterp:x ':' filterv:y -> [#filter, x, y]
1058
- function checkFilter(_i) {
1059
- var start = _i,
1060
- l;
1061
-
1062
- if (l = checkFilterp(_i)) _i += l;
1063
- else return fail(tokens[_i]);
1064
-
1065
- if (tokens[_i].type === TokenType.Colon) _i++;
1066
- else return fail(tokens[_i]);
1067
-
1068
- if (l = checkFilterv(_i)) _i += l;
1069
- else return fail(tokens[_i]);
1070
-
1071
- return _i - start;
1072
- }
1073
-
1074
- function getFilter() {
1075
- var filter = needInfo?
1076
- [{ ln: tokens[pos].ln }, CSSPNodeType.FilterType, getFilterp()] :
1077
- [CSSPNodeType.FilterType, getFilterp()];
1078
-
1079
- pos++;
1080
-
1081
- filter.push(getFilterv());
1082
-
1083
- return filter;
1084
- }
1085
-
1086
- //filterp = (seq('-filter') | seq('_filter') | seq('*filter') | seq('-ms-filter') | seq('filter')):t sc*:s0 -> this.concat([#property, [#ident, t]], s0)
1087
- function checkFilterp(_i) {
1088
- var start = _i,
1089
- l,
1090
- x;
1091
-
1092
- if (_i < tokens.length) {
1093
- if (tokens[_i].value === 'filter') l = 1;
1094
- else {
1095
- x = joinValues2(_i, 2);
1096
-
1097
- if (x === '-filter' || x === '_filter' || x === '*filter') l = 2;
1098
- else {
1099
- x = joinValues2(_i, 4);
1100
-
1101
- if (x === '-ms-filter') l = 4;
1102
- else return fail(tokens[_i]);
1103
- }
1104
- }
1105
-
1106
- tokens[start].filterp_l = l;
1107
-
1108
- _i += l;
1109
-
1110
- if (checkSC(_i)) _i += l;
1111
-
1112
- return _i - start;
1113
- }
1114
-
1115
- return fail(tokens[_i]);
1116
- }
1117
-
1118
- function getFilterp() {
1119
- var startPos = pos,
1120
- x = joinValues2(pos, tokens[pos].filterp_l),
1121
- ident = needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.IdentType, x] : [CSSPNodeType.IdentType, x];
1122
-
1123
- pos += tokens[pos].filterp_l;
1124
-
1125
- return (needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.PropertyType, ident] : [CSSPNodeType.PropertyType, ident])
1126
- .concat(getSC());
1127
-
1128
- }
1129
-
1130
- //filterv = progid+:x -> [#filterv].concat(x)
1131
- function checkFilterv(_i) {
1132
- var start = _i,
1133
- l;
1134
-
1135
- if (l = checkProgid(_i)) _i += l;
1136
- else return fail(tokens[_i]);
1137
-
1138
- while (l = checkProgid(_i)) {
1139
- _i += l;
1140
- }
1141
-
1142
- tokens[start].last_progid = _i;
1143
-
1144
- if (_i < tokens.length && (l = checkSC(_i))) _i += l;
1145
-
1146
- if (_i < tokens.length && (l = checkImportant(_i))) _i += l;
1147
-
1148
- return _i - start;
1149
- }
1150
-
1151
- function getFilterv() {
1152
- var filterv = needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.FiltervType] : [CSSPNodeType.FiltervType],
1153
- last_progid = tokens[pos].last_progid;
1154
-
1155
- while (pos < last_progid) {
1156
- filterv.push(getProgid());
1157
- }
1158
-
1159
- filterv = filterv.concat(checkSC(pos) ? getSC() : []);
1160
-
1161
- if (pos < tokens.length && checkImportant(pos)) filterv.push(getImportant());
1162
-
1163
- return filterv;
1164
- }
1165
-
1166
- //functionExpression = ``expression('' functionExpressionBody*:x ')' -> [#functionExpression, x.join('')],
1167
- function checkFunctionExpression(_i) {
1168
- var start = _i;
1169
-
1170
- if (!tokens[_i] || tokens[_i++].value !== 'expression') return fail(tokens[_i - 1]);
1171
-
1172
- if (!tokens[_i] || tokens[_i].type !== TokenType.LeftParenthesis) return fail(tokens[_i]);
1173
-
1174
- return tokens[_i].right - start + 1;
1175
- }
1176
-
1177
- function getFunctionExpression() {
1178
- var startPos = pos;
1179
-
1180
- pos++;
1181
-
1182
- var e = joinValues(pos + 1, tokens[pos].right - 1);
1183
-
1184
- pos = tokens[pos].right + 1;
1185
-
1186
- return needInfo?
1187
- [{ ln: tokens[startPos].ln }, CSSPNodeType.FunctionExpressionType, e] :
1188
- [CSSPNodeType.FunctionExpressionType, e];
1189
- }
1190
-
1191
- //funktion = ident:x '(' functionBody:y ')' -> [#funktion, x, y]
1192
- function checkFunktion(_i) {
1193
- var start = _i,
1194
- l = checkIdent(_i);
1195
-
1196
- if (!l) return fail(tokens[_i]);
1197
-
1198
- _i += l;
1199
-
1200
- if (_i >= tokens.length || tokens[_i].type !== TokenType.LeftParenthesis) return fail(tokens[_i - 1]);
1201
-
1202
- return tokens[_i].right - start + 1;
1203
- }
1204
-
1205
- function getFunktion() {
1206
- var startPos = pos,
1207
- ident = getIdent();
1208
-
1209
- pos++;
1210
-
1211
- var body = ident[needInfo? 2 : 1] !== 'not'?
1212
- getFunctionBody() :
1213
- getNotFunctionBody(); // ok, here we have CSS3 initial draft: http://dev.w3.org/csswg/selectors3/#negation
1214
-
1215
- return needInfo?
1216
- [{ ln: tokens[startPos].ln }, CSSPNodeType.FunktionType, ident, body] :
1217
- [CSSPNodeType.FunktionType, ident, body];
1218
- }
1219
-
1220
- function getFunctionBody() {
1221
- var startPos = pos,
1222
- body = [],
1223
- x;
1224
-
1225
- while (tokens[pos].type !== TokenType.RightParenthesis) {
1226
- if (checkTset(pos)) {
1227
- x = getTset();
1228
- if ((needInfo && typeof x[1] === 'string') || typeof x[0] === 'string') body.push(x);
1229
- else body = body.concat(x);
1230
- } else if (checkClazz(pos)) {
1231
- body.push(getClazz());
1232
- } else {
1233
- throwError();
1234
- }
1235
- }
1236
-
1237
- pos++;
1238
-
1239
- return (needInfo?
1240
- [{ ln: tokens[startPos].ln }, CSSPNodeType.FunctionBodyType] :
1241
- [CSSPNodeType.FunctionBodyType]
1242
- ).concat(body);
1243
- }
1244
-
1245
- function getNotFunctionBody() {
1246
- var startPos = pos,
1247
- body = [],
1248
- x;
1249
-
1250
- while (tokens[pos].type !== TokenType.RightParenthesis) {
1251
- if (checkSimpleselector(pos)) {
1252
- body.push(getSimpleSelector());
1253
- } else {
1254
- throwError();
1255
- }
1256
- }
1257
-
1258
- pos++;
1259
-
1260
- return (needInfo?
1261
- [{ ln: tokens[startPos].ln }, CSSPNodeType.FunctionBodyType] :
1262
- [CSSPNodeType.FunctionBodyType]
1263
- ).concat(body);
1264
- }
1265
-
1266
- // node: Ident
1267
- function checkIdent(_i) {
1268
- if (_i >= tokens.length) return fail(tokens[_i]);
1269
-
1270
- var start = _i,
1271
- wasIdent = false;
1272
-
1273
- if (tokens[_i].type === TokenType.LowLine) return checkIdentLowLine(_i);
1274
-
1275
- // start char / word
1276
- if (tokens[_i].type === TokenType.HyphenMinus ||
1277
- tokens[_i].type === TokenType.Identifier ||
1278
- tokens[_i].type === TokenType.DollarSign ||
1279
- tokens[_i].type === TokenType.Asterisk) _i++;
1280
- else return fail(tokens[_i]);
1281
-
1282
- wasIdent = tokens[_i - 1].type === TokenType.Identifier;
1283
-
1284
- for (; _i < tokens.length; _i++) {
1285
- if (tokens[_i].type !== TokenType.HyphenMinus &&
1286
- tokens[_i].type !== TokenType.LowLine) {
1287
- if (tokens[_i].type !== TokenType.Identifier &&
1288
- (tokens[_i].type !== TokenType.DecimalNumber || !wasIdent)
1289
- ) break;
1290
- else wasIdent = true;
1291
- }
1292
- }
1293
-
1294
- if (!wasIdent && tokens[start].type !== TokenType.Asterisk) return fail(tokens[_i]);
1295
-
1296
- tokens[start].ident_last = _i - 1;
1297
-
1298
- return _i - start;
1299
- }
1300
-
1301
- function checkIdentLowLine(_i) {
1302
- var start = _i;
1303
-
1304
- _i++;
1305
-
1306
- for (; _i < tokens.length; _i++) {
1307
- if (tokens[_i].type !== TokenType.HyphenMinus &&
1308
- tokens[_i].type !== TokenType.DecimalNumber &&
1309
- tokens[_i].type !== TokenType.LowLine &&
1310
- tokens[_i].type !== TokenType.Identifier) break;
1311
- }
1312
-
1313
- tokens[start].ident_last = _i - 1;
1314
-
1315
- return _i - start;
1316
- }
1317
-
1318
- function getIdent() {
1319
- var startPos = pos,
1320
- s = joinValues(pos, tokens[pos].ident_last);
1321
-
1322
- pos = tokens[pos].ident_last + 1;
1323
-
1324
- return needInfo?
1325
- [{ ln: tokens[startPos].ln }, CSSPNodeType.IdentType, s] :
1326
- [CSSPNodeType.IdentType, s];
1327
- }
1328
-
1329
- //important = '!' sc*:s0 seq('important') -> [#important].concat(s0)
1330
- function checkImportant(_i) {
1331
- var start = _i,
1332
- l;
1333
-
1334
- if (tokens[_i++].type !== TokenType.ExclamationMark) return fail(tokens[_i - 1]);
1335
-
1336
- if (l = checkSC(_i)) _i += l;
1337
-
1338
- if (tokens[_i].value !== 'important') return fail(tokens[_i]);
1339
-
1340
- return _i - start + 1;
1341
- }
1342
-
1343
- function getImportant() {
1344
- var startPos = pos;
1345
-
1346
- pos++;
1347
-
1348
- var sc = getSC();
1349
-
1350
- pos++;
1351
-
1352
- return (needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.ImportantType] : [CSSPNodeType.ImportantType]).concat(sc);
1353
- }
1354
-
1355
- // node: Namespace
1356
- function checkNamespace(_i) {
1357
- if (tokens[_i].type === TokenType.VerticalLine) return 1;
1358
-
1359
- return fail(tokens[_i]);
1360
- }
1361
-
1362
- function getNamespace() {
1363
- var startPos = pos;
1364
-
1365
- pos++;
1366
-
1367
- return needInfo?
1368
- [{ ln: tokens[startPos].ln }, CSSPNodeType.NamespaceType] :
1369
- [CSSPNodeType.NamespaceType];
1370
- }
1371
-
1372
- //nth = (digit | 'n')+:x -> [#nth, x.join('')]
1373
- // | (seq('even') | seq('odd')):x -> [#nth, x]
1374
- function checkNth(_i) {
1375
- return checkNth1(_i) || checkNth2(_i);
1376
- }
1377
-
1378
- function checkNth1(_i) {
1379
- var start = _i;
1380
-
1381
- for (; _i < tokens.length; _i++) {
1382
- if (tokens[_i].type !== TokenType.DecimalNumber && tokens[_i].value !== 'n') break;
1383
- }
1384
-
1385
- if (_i !== start) {
1386
- tokens[start].nth_last = _i - 1;
1387
- return _i - start;
1388
- }
1389
-
1390
- return fail(tokens[_i]);
1391
- }
1392
-
1393
- function getNth() {
1394
- var startPos = pos;
1395
-
1396
- if (tokens[pos].nth_last) {
1397
- var n = needInfo?
1398
- [{ ln: tokens[startPos].ln }, CSSPNodeType.NthType, joinValues(pos, tokens[pos].nth_last)] :
1399
- [CSSPNodeType.NthType, joinValues(pos, tokens[pos].nth_last)];
1400
-
1401
- pos = tokens[pos].nth_last + 1;
1402
-
1403
- return n;
1404
- }
1405
-
1406
- return needInfo?
1407
- [{ ln: tokens[startPos].ln }, CSSPNodeType.NthType, tokens[pos++].value] :
1408
- [CSSPNodeType.NthType, tokens[pos++].value];
1409
- }
1410
-
1411
- function checkNth2(_i) {
1412
- if (tokens[_i].value === 'even' || tokens[_i].value === 'odd') return 1;
1413
-
1414
- return fail(tokens[_i]);
1415
- }
1416
-
1417
- //nthf = ':' seq('nth-'):x (seq('child') | seq('last-child') | seq('of-type') | seq('last-of-type')):y -> (x + y)
1418
- function checkNthf(_i) {
1419
- var start = _i,
1420
- l = 0;
1421
-
1422
- if (tokens[_i++].type !== TokenType.Colon) return fail(tokens[_i - 1]); l++;
1423
-
1424
- if (tokens[_i++].value !== 'nth' || tokens[_i++].value !== '-') return fail(tokens[_i - 1]); l += 2;
1425
-
1426
- if ('child' === tokens[_i].value) {
1427
- l += 1;
1428
- } else if ('last-child' === tokens[_i].value +
1429
- tokens[_i + 1].value +
1430
- tokens[_i + 2].value) {
1431
- l += 3;
1432
- } else if ('of-type' === tokens[_i].value +
1433
- tokens[_i + 1].value +
1434
- tokens[_i + 2].value) {
1435
- l += 3;
1436
- } else if ('last-of-type' === tokens[_i].value +
1437
- tokens[_i + 1].value +
1438
- tokens[_i + 2].value +
1439
- tokens[_i + 3].value +
1440
- tokens[_i + 4].value) {
1441
- l += 5;
1442
- } else return fail(tokens[_i]);
1443
-
1444
- tokens[start + 1].nthf_last = start + l - 1;
1445
-
1446
- return l;
1447
- }
1448
-
1449
- function getNthf() {
1450
- pos++;
1451
-
1452
- var s = joinValues(pos, tokens[pos].nthf_last);
1453
-
1454
- pos = tokens[pos].nthf_last + 1;
1455
-
1456
- return s;
1457
- }
1458
-
1459
- //nthselector = nthf:x '(' (sc | unary | nth)*:y ')' -> [#nthselector, [#ident, x]].concat(y)
1460
- function checkNthselector(_i) {
1461
- var start = _i,
1462
- l;
1463
-
1464
- if (l = checkNthf(_i)) _i += l;
1465
- else return fail(tokens[_i]);
1466
-
1467
- if (tokens[_i].type !== TokenType.LeftParenthesis || !tokens[_i].right) return fail(tokens[_i]);
1468
-
1469
- l++;
1470
-
1471
- var rp = tokens[_i++].right;
1472
-
1473
- while (_i < rp) {
1474
- if (l = checkSC(_i)) _i += l;
1475
- else if (l = checkUnary(_i)) _i += l;
1476
- else if (l = checkNth(_i)) _i += l;
1477
- else return fail(tokens[_i]);
1478
- }
1479
-
1480
- return rp - start + 1;
1481
- }
1482
-
1483
- function getNthselector() {
1484
- var startPos = pos,
1485
- nthf = needInfo?
1486
- [{ ln: tokens[pos].ln }, CSSPNodeType.IdentType, getNthf()] :
1487
- [CSSPNodeType.IdentType, getNthf()],
1488
- ns = needInfo?
1489
- [{ ln: tokens[pos].ln }, CSSPNodeType.NthselectorType, nthf] :
1490
- [CSSPNodeType.NthselectorType, nthf];
1491
-
1492
- pos++;
1493
-
1494
- while (tokens[pos].type !== TokenType.RightParenthesis) {
1495
- if (checkSC(pos)) ns = ns.concat(getSC());
1496
- else if (checkUnary(pos)) ns.push(getUnary());
1497
- else if (checkNth(pos)) ns.push(getNth());
1498
- }
1499
-
1500
- pos++;
1501
-
1502
- return ns;
1503
- }
1504
-
1505
- // node: Number
1506
- function checkNumber(_i) {
1507
- if (_i < tokens.length && tokens[_i].number_l) return tokens[_i].number_l;
1508
-
1509
- if (_i < tokens.length && tokens[_i].type === TokenType.DecimalNumber &&
1510
- (!tokens[_i + 1] ||
1511
- (tokens[_i + 1] && tokens[_i + 1].type !== TokenType.FullStop))
1512
- ) return (tokens[_i].number_l = 1, tokens[_i].number_l); // 10
1513
-
1514
- if (_i < tokens.length &&
1515
- tokens[_i].type === TokenType.DecimalNumber &&
1516
- tokens[_i + 1] && tokens[_i + 1].type === TokenType.FullStop &&
1517
- (!tokens[_i + 2] || (tokens[_i + 2].type !== TokenType.DecimalNumber))
1518
- ) return (tokens[_i].number_l = 2, tokens[_i].number_l); // 10.
1519
-
1520
- if (_i < tokens.length &&
1521
- tokens[_i].type === TokenType.FullStop &&
1522
- tokens[_i + 1].type === TokenType.DecimalNumber
1523
- ) return (tokens[_i].number_l = 2, tokens[_i].number_l); // .10
1524
-
1525
- if (_i < tokens.length &&
1526
- tokens[_i].type === TokenType.DecimalNumber &&
1527
- tokens[_i + 1] && tokens[_i + 1].type === TokenType.FullStop &&
1528
- tokens[_i + 2] && tokens[_i + 2].type === TokenType.DecimalNumber
1529
- ) return (tokens[_i].number_l = 3, tokens[_i].number_l); // 10.10
1530
-
1531
- return fail(tokens[_i]);
1532
- }
1533
-
1534
- function getNumber() {
1535
- var s = '',
1536
- startPos = pos,
1537
- l = tokens[pos].number_l;
1538
-
1539
- for (var i = 0; i < l; i++) {
1540
- s += tokens[pos + i].value;
1541
- }
1542
-
1543
- pos += l;
1544
-
1545
- return needInfo?
1546
- [{ ln: tokens[startPos].ln }, CSSPNodeType.NumberType, s] :
1547
- [CSSPNodeType.NumberType, s];
1548
- }
1549
-
1550
- // node: Operator
1551
- function checkOperator(_i) {
1552
- if (_i < tokens.length &&
1553
- (tokens[_i].type === TokenType.Solidus ||
1554
- tokens[_i].type === TokenType.Comma ||
1555
- tokens[_i].type === TokenType.Colon ||
1556
- tokens[_i].type === TokenType.EqualsSign)) return 1;
1557
-
1558
- return fail(tokens[_i]);
1559
- }
1560
-
1561
- function getOperator() {
1562
- return needInfo?
1563
- [{ ln: tokens[pos].ln }, CSSPNodeType.OperatorType, tokens[pos++].value] :
1564
- [CSSPNodeType.OperatorType, tokens[pos++].value];
1565
- }
1566
-
1567
- // node: Percentage
1568
- function checkPercentage(_i) {
1569
- var x = checkNumber(_i);
1570
-
1571
- if (!x || (x && _i + x >= tokens.length)) return fail(tokens[_i]);
1572
-
1573
- if (tokens[_i + x].type === TokenType.PercentSign) return x + 1;
1574
-
1575
- return fail(tokens[_i]);
1576
- }
1577
-
1578
- function getPercentage() {
1579
- var startPos = pos,
1580
- n = getNumber();
1581
-
1582
- pos++;
1583
-
1584
- return needInfo?
1585
- [{ ln: tokens[startPos].ln }, CSSPNodeType.PercentageType, n] :
1586
- [CSSPNodeType.PercentageType, n];
1587
- }
1588
-
1589
- //progid = sc*:s0 seq('progid:DXImageTransform.Microsoft.'):x letter+:y '(' (m_string | m_comment | ~')' char)+:z ')' sc*:s1
1590
- // -> this.concat([#progid], s0, [[#raw, x + y.join('') + '(' + z.join('') + ')']], s1),
1591
- function checkProgid(_i) {
1592
- var start = _i,
1593
- l,
1594
- x;
1595
-
1596
- if (l = checkSC(_i)) _i += l;
1597
-
1598
- if ((x = joinValues2(_i, 6)) === 'progid:DXImageTransform.Microsoft.') {
1599
- _start = _i;
1600
- _i += 6;
1601
- } else return fail(tokens[_i - 1]);
1602
-
1603
- if (l = checkIdent(_i)) _i += l;
1604
- else return fail(tokens[_i]);
1605
-
1606
- if (l = checkSC(_i)) _i += l;
1607
-
1608
- if (tokens[_i].type === TokenType.LeftParenthesis) {
1609
- tokens[start].progid_end = tokens[_i].right;
1610
- _i = tokens[_i].right + 1;
1611
- } else return fail(tokens[_i]);
1612
-
1613
- if (l = checkSC(_i)) _i += l;
1614
-
1615
- return _i - start;
1616
- }
1617
-
1618
- function getProgid() {
1619
- var startPos = pos,
1620
- progid_end = tokens[pos].progid_end;
1621
-
1622
- return (needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.ProgidType] : [CSSPNodeType.ProgidType])
1623
- .concat(getSC())
1624
- .concat([_getProgid(progid_end)])
1625
- .concat(getSC());
1626
- }
1627
-
1628
- function _getProgid(progid_end) {
1629
- var startPos = pos,
1630
- x = joinValues(pos, progid_end);
1631
-
1632
- pos = progid_end + 1;
1633
-
1634
- return needInfo?
1635
- [{ ln: tokens[startPos].ln }, CSSPNodeType.RawType, x] :
1636
- [CSSPNodeType.RawType, x];
1637
- }
1638
-
1639
- //property = ident:x sc*:s0 -> this.concat([#property, x], s0)
1640
- function checkProperty(_i) {
1641
- var start = _i,
1642
- l;
1643
-
1644
- if (l = checkIdent(_i)) _i += l;
1645
- else return fail(tokens[_i]);
1646
-
1647
- if (l = checkSC(_i)) _i += l;
1648
- return _i - start;
1649
- }
1650
-
1651
- function getProperty() {
1652
- var startPos = pos;
1653
-
1654
- return (needInfo?
1655
- [{ ln: tokens[startPos].ln }, CSSPNodeType.PropertyType, getIdent()] :
1656
- [CSSPNodeType.PropertyType, getIdent()])
1657
- .concat(getSC());
1658
- }
1659
-
1660
- function checkPseudo(_i) {
1661
- return checkPseudoe(_i) ||
1662
- checkPseudoc(_i);
1663
- }
1664
-
1665
- function getPseudo() {
1666
- if (checkPseudoe(pos)) return getPseudoe();
1667
- if (checkPseudoc(pos)) return getPseudoc();
1668
- }
1669
-
1670
- function checkPseudoe(_i) {
1671
- var l;
1672
-
1673
- if (tokens[_i++].type !== TokenType.Colon) return fail(tokens[_i - 1]);
1674
-
1675
- if (tokens[_i++].type !== TokenType.Colon) return fail(tokens[_i - 1]);
1676
-
1677
- if (l = checkIdent(_i)) return l + 2;
1678
-
1679
- return fail(tokens[_i]);
1680
- }
1681
-
1682
- function getPseudoe() {
1683
- var startPos = pos;
1684
-
1685
- pos += 2;
1686
-
1687
- return needInfo?
1688
- [{ ln: tokens[startPos].ln }, CSSPNodeType.PseudoeType, getIdent()] :
1689
- [CSSPNodeType.PseudoeType, getIdent()];
1690
- }
1691
-
1692
- //pseudoc = ':' (funktion | ident):x -> [#pseudoc, x]
1693
- function checkPseudoc(_i) {
1694
- var l;
1695
-
1696
- if (tokens[_i++].type !== TokenType.Colon) return fail(tokens[_i - 1]);
1697
-
1698
- if ((l = checkFunktion(_i)) || (l = checkIdent(_i))) return l + 1;
1699
-
1700
- return fail(tokens[_i]);
1701
- }
1702
-
1703
- function getPseudoc() {
1704
- var startPos = pos;
1705
-
1706
- pos++;
1707
-
1708
- return needInfo?
1709
- [{ ln: tokens[startPos].ln }, CSSPNodeType.PseudocType, checkFunktion(pos)? getFunktion() : getIdent()] :
1710
- [CSSPNodeType.PseudocType, checkFunktion(pos)? getFunktion() : getIdent()];
1711
- }
1712
-
1713
- //ruleset = selector*:x block:y -> this.concat([#ruleset], x, [y])
1714
- function checkRuleset(_i) {
1715
- var start = _i,
1716
- l;
1717
-
1718
- if (tokens[start].ruleset_l !== undefined) return tokens[start].ruleset_l;
1719
-
1720
- while (l = checkSelector(_i)) {
1721
- _i += l;
1722
- }
1723
-
1724
- if (l = checkBlock(_i)) _i += l;
1725
- else return fail(tokens[_i]);
1726
-
1727
- tokens[start].ruleset_l = _i - start;
1728
-
1729
- return _i - start;
1730
- }
1731
-
1732
- function getRuleset() {
1733
- var ruleset = needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.RulesetType] : [CSSPNodeType.RulesetType];
1734
-
1735
- while (!checkBlock(pos)) {
1736
- ruleset.push(getSelector());
1737
- }
1738
-
1739
- ruleset.push(getBlock());
1740
-
1741
- return ruleset;
1742
- }
1743
-
1744
- // node: S
1745
- function checkS(_i) {
1746
- if (tokens[_i].ws) return tokens[_i].ws_last - _i + 1;
1747
-
1748
- return fail(tokens[_i]);
1749
- }
1750
-
1751
- function getS() {
1752
- var startPos = pos,
1753
- s = joinValues(pos, tokens[pos].ws_last);
1754
-
1755
- pos = tokens[pos].ws_last + 1;
1756
-
1757
- return needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.SType, s] : [CSSPNodeType.SType, s];
1758
- }
1759
-
1760
- function checkSC(_i) {
1761
- var l,
1762
- lsc = 0;
1763
-
1764
- while (_i < tokens.length) {
1765
- if (!(l = checkS(_i)) && !(l = checkComment(_i))) break;
1766
- _i += l;
1767
- lsc += l;
1768
- }
1769
-
1770
- if (lsc) return lsc;
1771
-
1772
- if (_i >= tokens.length) return fail(tokens[tokens.length - 1]);
1773
-
1774
- return fail(tokens[_i]);
1775
- }
1776
-
1777
- function getSC() {
1778
- var sc = [];
1779
-
1780
- while (pos < tokens.length) {
1781
- if (checkS(pos)) sc.push(getS());
1782
- else if (checkComment(pos)) sc.push(getComment());
1783
- else break;
1784
- }
1785
-
1786
- return sc;
1787
- }
1788
-
1789
- //selector = (simpleselector | delim)+:x -> this.concat([#selector], x)
1790
- function checkSelector(_i) {
1791
- var start = _i,
1792
- l;
1793
-
1794
- if (_i < tokens.length) {
1795
- while (l = checkSimpleselector(_i) || checkDelim(_i)) {
1796
- _i += l;
1797
- }
1798
-
1799
- tokens[start].selector_end = _i - 1;
1800
-
1801
- return _i - start;
1802
- }
1803
- }
1804
-
1805
- function getSelector() {
1806
- var selector = needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.SelectorType] : [CSSPNodeType.SelectorType],
1807
- selector_end = tokens[pos].selector_end;
1808
-
1809
- while (pos <= selector_end) {
1810
- selector.push(checkDelim(pos) ? getDelim() : getSimpleSelector());
1811
- }
1812
-
1813
- return selector;
1814
- }
1815
-
1816
- // node: Shash
1817
- function checkShash(_i) {
1818
- if (tokens[_i].type !== TokenType.NumberSign) return fail(tokens[_i]);
1819
-
1820
- var l = checkNmName(_i + 1);
1821
-
1822
- if (l) return l + 1;
1823
-
1824
- return fail(tokens[_i]);
1825
- }
1826
-
1827
- function getShash() {
1828
- var startPos = pos;
1829
-
1830
- pos++;
1831
-
1832
- return needInfo?
1833
- [{ ln: tokens[startPos].ln }, CSSPNodeType.ShashType, getNmName()] :
1834
- [CSSPNodeType.ShashType, getNmName()];
1835
- }
1836
-
1837
- //simpleselector = (nthselector | combinator | attrib | pseudo | clazz | shash | any | sc | namespace)+:x -> this.concatContent([#simpleselector], [x])
1838
- function checkSimpleselector(_i) {
1839
- var start = _i,
1840
- l;
1841
-
1842
- while (_i < tokens.length) {
1843
- if (l = _checkSimpleSelector(_i)) _i += l;
1844
- else break;
1845
- }
1846
-
1847
- if (_i - start) return _i - start;
1848
-
1849
- if (_i >= tokens.length) return fail(tokens[tokens.length - 1]);
1850
-
1851
- return fail(tokens[_i]);
1852
- }
1853
-
1854
- function _checkSimpleSelector(_i) {
1855
- return checkNthselector(_i) ||
1856
- checkCombinator(_i) ||
1857
- checkAttrib(_i) ||
1858
- checkPseudo(_i) ||
1859
- checkClazz(_i) ||
1860
- checkShash(_i) ||
1861
- checkAny(_i) ||
1862
- checkSC(_i) ||
1863
- checkNamespace(_i);
1864
- }
1865
-
1866
- function getSimpleSelector() {
1867
- var ss = needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.SimpleselectorType] : [CSSPNodeType.SimpleselectorType],
1868
- t;
1869
-
1870
- while (pos < tokens.length && _checkSimpleSelector(pos)) {
1871
- t = _getSimpleSelector();
1872
-
1873
- if ((needInfo && typeof t[1] === 'string') || typeof t[0] === 'string') ss.push(t);
1874
- else ss = ss.concat(t);
1875
- }
1876
-
1877
- return ss;
1878
- }
1879
-
1880
- function _getSimpleSelector() {
1881
- if (checkNthselector(pos)) return getNthselector();
1882
- else if (checkCombinator(pos)) return getCombinator();
1883
- else if (checkAttrib(pos)) return getAttrib();
1884
- else if (checkPseudo(pos)) return getPseudo();
1885
- else if (checkClazz(pos)) return getClazz();
1886
- else if (checkShash(pos)) return getShash();
1887
- else if (checkAny(pos)) return getAny();
1888
- else if (checkSC(pos)) return getSC();
1889
- else if (checkNamespace(pos)) return getNamespace();
1890
- }
1891
-
1892
- // node: String
1893
- function checkString(_i) {
1894
- if (_i < tokens.length &&
1895
- (tokens[_i].type === TokenType.StringSQ || tokens[_i].type === TokenType.StringDQ)
1896
- ) return 1;
1897
-
1898
- return fail(tokens[_i]);
1899
- }
1900
-
1901
- function getString() {
1902
- var startPos = pos;
1903
-
1904
- return needInfo?
1905
- [{ ln: tokens[startPos].ln }, CSSPNodeType.StringType, tokens[pos++].value] :
1906
- [CSSPNodeType.StringType, tokens[pos++].value];
1907
- }
1908
-
1909
- //stylesheet = (cdo | cdc | sc | statement)*:x -> this.concat([#stylesheet], x)
1910
- function checkStylesheet(_i) {
1911
- var start = _i,
1912
- l;
1913
-
1914
- while (_i < tokens.length) {
1915
- if (l = checkSC(_i)) _i += l;
1916
- else {
1917
- currentBlockLN = tokens[_i].ln;
1918
- if (l = checkAtrule(_i)) _i += l;
1919
- else if (l = checkRuleset(_i)) _i += l;
1920
- else if (l = checkUnknown(_i)) _i += l;
1921
- else throwError();
1922
- }
1923
- }
1924
-
1925
- return _i - start;
1926
- }
1927
-
1928
- function getStylesheet(_i) {
1929
- var t,
1930
- stylesheet = needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.StylesheetType] : [CSSPNodeType.StylesheetType];
1931
-
1932
- while (pos < tokens.length) {
1933
- if (checkSC(pos)) stylesheet = stylesheet.concat(getSC());
1934
- else {
1935
- currentBlockLN = tokens[pos].ln;
1936
- if (checkRuleset(pos)) stylesheet.push(getRuleset());
1937
- else if (checkAtrule(pos)) stylesheet.push(getAtrule());
1938
- else if (checkUnknown(pos)) stylesheet.push(getUnknown());
1939
- else throwError();
1940
- }
1941
- }
1942
-
1943
- return stylesheet;
1944
- }
1945
-
1946
- //tset = vhash | any | sc | operator
1947
- function checkTset(_i) {
1948
- return checkVhash(_i) ||
1949
- checkAny(_i) ||
1950
- checkSC(_i) ||
1951
- checkOperator(_i);
1952
- }
1953
-
1954
- function getTset() {
1955
- if (checkVhash(pos)) return getVhash();
1956
- else if (checkAny(pos)) return getAny();
1957
- else if (checkSC(pos)) return getSC();
1958
- else if (checkOperator(pos)) return getOperator();
1959
- }
1960
-
1961
- function checkTsets(_i) {
1962
- var start = _i,
1963
- l;
1964
-
1965
- while (l = checkTset(_i)) {
1966
- _i += l;
1967
- }
1968
-
1969
- return _i - start;
1970
- }
1971
-
1972
- function getTsets() {
1973
- var tsets = [],
1974
- x;
1975
-
1976
- while (x = getTset()) {
1977
- if ((needInfo && typeof x[1] === 'string') || typeof x[0] === 'string') tsets.push(x);
1978
- else tsets = tsets.concat(x);
1979
- }
1980
-
1981
- return tsets;
1982
- }
1983
-
1984
- // node: Unary
1985
- function checkUnary(_i) {
1986
- if (_i < tokens.length &&
1987
- (tokens[_i].type === TokenType.HyphenMinus ||
1988
- tokens[_i].type === TokenType.PlusSign)
1989
- ) return 1;
1990
-
1991
- return fail(tokens[_i]);
1992
- }
1993
-
1994
- function getUnary() {
1995
- var startPos = pos;
1996
-
1997
- return needInfo?
1998
- [{ ln: tokens[startPos].ln }, CSSPNodeType.UnaryType, tokens[pos++].value] :
1999
- [CSSPNodeType.UnaryType, tokens[pos++].value];
2000
- }
2001
-
2002
- // node: Unknown
2003
- function checkUnknown(_i) {
2004
- if (_i < tokens.length && tokens[_i].type === TokenType.CommentSL) return 1;
2005
-
2006
- return fail(tokens[_i]);
2007
- }
2008
-
2009
- function getUnknown() {
2010
- var startPos = pos;
2011
-
2012
- return needInfo?
2013
- [{ ln: tokens[startPos].ln }, CSSPNodeType.UnknownType, tokens[pos++].value] :
2014
- [CSSPNodeType.UnknownType, tokens[pos++].value];
2015
- }
2016
-
2017
- // uri = seq('url(') sc*:s0 string:x sc*:s1 ')' -> this.concat([#uri], s0, [x], s1)
2018
- // | seq('url(') sc*:s0 (~')' ~m_w char)*:x sc*:s1 ')' -> this.concat([#uri], s0, [[#raw, x.join('')]], s1),
2019
- function checkUri(_i) {
2020
- var start = _i,
2021
- l;
2022
-
2023
- if (_i < tokens.length && tokens[_i++].value !== 'url') return fail(tokens[_i - 1]);
2024
-
2025
- if (!tokens[_i] || tokens[_i].type !== TokenType.LeftParenthesis) return fail(tokens[_i]);
2026
-
2027
- return tokens[_i].right - start + 1;
2028
- }
2029
-
2030
- function getUri() {
2031
- var startPos = pos,
2032
- uriExcluding = {};
2033
-
2034
- pos += 2;
2035
-
2036
- uriExcluding[TokenType.Space] = 1;
2037
- uriExcluding[TokenType.Tab] = 1;
2038
- uriExcluding[TokenType.Newline] = 1;
2039
- uriExcluding[TokenType.LeftParenthesis] = 1;
2040
- uriExcluding[TokenType.RightParenthesis] = 1;
2041
-
2042
- if (checkUri1(pos)) {
2043
- var uri = (needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.UriType] : [CSSPNodeType.UriType])
2044
- .concat(getSC())
2045
- .concat([getString()])
2046
- .concat(getSC());
2047
-
2048
- pos++;
2049
-
2050
- return uri;
2051
- } else {
2052
- var uri = (needInfo? [{ ln: tokens[startPos].ln }, CSSPNodeType.UriType] : [CSSPNodeType.UriType])
2053
- .concat(getSC()),
2054
- l = checkExcluding(uriExcluding, pos),
2055
- raw = needInfo?
2056
- [{ ln: tokens[pos].ln }, CSSPNodeType.RawType, joinValues(pos, pos + l)] :
2057
- [CSSPNodeType.RawType, joinValues(pos, pos + l)];
2058
-
2059
- uri.push(raw);
2060
-
2061
- pos += l + 1;
2062
-
2063
- uri = uri.concat(getSC());
2064
-
2065
- pos++;
2066
-
2067
- return uri;
2068
- }
2069
- }
2070
-
2071
- function checkUri1(_i) {
2072
- var start = _i,
2073
- l = checkSC(_i);
2074
-
2075
- if (l) _i += l;
2076
-
2077
- if (tokens[_i].type !== TokenType.StringDQ && tokens[_i].type !== TokenType.StringSQ) return fail(tokens[_i]);
2078
-
2079
- _i++;
2080
-
2081
- if (l = checkSC(_i)) _i += l;
2082
-
2083
- return _i - start;
2084
- }
2085
-
2086
- // value = (sc | vhash | any | block | atkeyword | operator | important)+:x -> this.concat([#value], x)
2087
- function checkValue(_i) {
2088
- var start = _i,
2089
- l;
2090
-
2091
- while (_i < tokens.length) {
2092
- if (l = _checkValue(_i)) _i += l;
2093
- else break;
2094
- }
2095
-
2096
- if (_i - start) return _i - start;
2097
-
2098
- return fail(tokens[_i]);
2099
- }
2100
-
2101
- function _checkValue(_i) {
2102
- return checkSC(_i) ||
2103
- checkVhash(_i) ||
2104
- checkAny(_i) ||
2105
- checkBlock(_i) ||
2106
- checkAtkeyword(_i) ||
2107
- checkOperator(_i) ||
2108
- checkImportant(_i);
2109
- }
2110
-
2111
- function getValue() {
2112
- var ss = needInfo? [{ ln: tokens[pos].ln }, CSSPNodeType.ValueType] : [CSSPNodeType.ValueType],
2113
- t;
2114
-
2115
- while (pos < tokens.length && _checkValue(pos)) {
2116
- t = _getValue();
2117
-
2118
- if ((needInfo && typeof t[1] === 'string') || typeof t[0] === 'string') ss.push(t);
2119
- else ss = ss.concat(t);
2120
- }
2121
-
2122
- return ss;
2123
- }
2124
-
2125
- function _getValue() {
2126
- if (checkSC(pos)) return getSC();
2127
- else if (checkVhash(pos)) return getVhash();
2128
- else if (checkAny(pos)) return getAny();
2129
- else if (checkBlock(pos)) return getBlock();
2130
- else if (checkAtkeyword(pos)) return getAtkeyword();
2131
- else if (checkOperator(pos)) return getOperator();
2132
- else if (checkImportant(pos)) return getImportant();
2133
- }
2134
-
2135
- // node: Vhash
2136
- function checkVhash(_i) {
2137
- if (_i >= tokens.length || tokens[_i].type !== TokenType.NumberSign) return fail(tokens[_i]);
2138
-
2139
- var l = checkNmName2(_i + 1);
2140
-
2141
- if (l) return l + 1;
2142
-
2143
- return fail(tokens[_i]);
2144
- }
2145
-
2146
- function getVhash() {
2147
- var startPos = pos;
2148
-
2149
- pos++;
2150
-
2151
- return needInfo?
2152
- [{ ln: tokens[startPos].ln }, CSSPNodeType.VhashType, getNmName2()] :
2153
- [CSSPNodeType.VhashType, getNmName2()];
2154
- }
2155
-
2156
- function checkNmName(_i) {
2157
- var start = _i;
2158
-
2159
- // start char / word
2160
- if (tokens[_i].type === TokenType.HyphenMinus ||
2161
- tokens[_i].type === TokenType.LowLine ||
2162
- tokens[_i].type === TokenType.Identifier ||
2163
- tokens[_i].type === TokenType.DecimalNumber) _i++;
2164
- else return fail(tokens[_i]);
2165
-
2166
- for (; _i < tokens.length; _i++) {
2167
- if (tokens[_i].type !== TokenType.HyphenMinus &&
2168
- tokens[_i].type !== TokenType.LowLine &&
2169
- tokens[_i].type !== TokenType.Identifier &&
2170
- tokens[_i].type !== TokenType.DecimalNumber) break;
2171
- }
2172
-
2173
- tokens[start].nm_name_last = _i - 1;
2174
-
2175
- return _i - start;
2176
- }
2177
-
2178
- function getNmName() {
2179
- var s = joinValues(pos, tokens[pos].nm_name_last);
2180
-
2181
- pos = tokens[pos].nm_name_last + 1;
2182
-
2183
- return s;
2184
- }
2185
-
2186
- function checkNmName2(_i) {
2187
- var start = _i;
2188
-
2189
- if (tokens[_i].type === TokenType.Identifier) return 1;
2190
- else if (tokens[_i].type !== TokenType.DecimalNumber) return fail(tokens[_i]);
2191
-
2192
- _i++;
2193
-
2194
- if (!tokens[_i] || tokens[_i].type !== TokenType.Identifier) return 1;
2195
-
2196
- return 2;
2197
- }
2198
-
2199
- function getNmName2() {
2200
- var s = tokens[pos].value;
2201
-
2202
- if (tokens[pos++].type === TokenType.DecimalNumber &&
2203
- pos < tokens.length &&
2204
- tokens[pos].type === TokenType.Identifier
2205
- ) s += tokens[pos++].value;
2206
-
2207
- return s;
2208
- }
2209
-
2210
- function checkExcluding(exclude, _i) {
2211
- var start = _i;
2212
-
2213
- while(_i < tokens.length) {
2214
- if (exclude[tokens[_i++].type]) break;
2215
- }
2216
-
2217
- return _i - start - 2;
2218
- }
2219
-
2220
- function joinValues(start, finish) {
2221
- var s = '';
2222
-
2223
- for (var i = start; i < finish + 1; i++) {
2224
- s += tokens[i].value;
2225
- }
2226
-
2227
- return s;
2228
- }
2229
-
2230
- function joinValues2(start, num) {
2231
- if (start + num - 1 >= tokens.length) return;
2232
-
2233
- var s = '';
2234
-
2235
- for (var i = 0; i < num; i++) {
2236
- s += tokens[start + i].value;
2237
- }
2238
-
2239
- return s;
2240
- }
2241
-
2242
- function markSC() {
2243
- var ws = -1, // whitespaces
2244
- sc = -1, // ws and comments
2245
- t;
2246
-
2247
- for (var i = 0; i < tokens.length; i++) {
2248
- t = tokens[i];
2249
- switch (t.type) {
2250
- case TokenType.Space:
2251
- case TokenType.Tab:
2252
- case TokenType.Newline:
2253
- t.ws = true;
2254
- t.sc = true;
2255
-
2256
- if (ws === -1) ws = i;
2257
- if (sc === -1) sc = i;
2258
-
2259
- break;
2260
- case TokenType.CommentML:
2261
- if (ws !== -1) {
2262
- tokens[ws].ws_last = i - 1;
2263
- ws = -1;
2264
- }
2265
-
2266
- t.sc = true;
2267
-
2268
- break;
2269
- default:
2270
- if (ws !== -1) {
2271
- tokens[ws].ws_last = i - 1;
2272
- ws = -1;
2273
- }
2274
-
2275
- if (sc !== -1) {
2276
- tokens[sc].sc_last = i - 1;
2277
- sc = -1;
2278
- }
2279
- }
2280
- }
2281
-
2282
- if (ws !== -1) tokens[ws].ws_last = i - 1;
2283
- if (sc !== -1) tokens[sc].sc_last = i - 1;
2284
- }
2285
-
2286
- return function(_tokens, rule, _needInfo) {
2287
- return _getAST(_tokens, rule, _needInfo);
2288
- }
2289
-
2290
- }());
2291
- return function(s, rule, _needInfo) {
2292
- return getCSSPAST(getTokens(s), rule, _needInfo);
2293
- }
2294
- }());
2295
- exports.srcToCSSP = srcToCSSP;