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/.gitignore +1 -0
- data/Gemfile +4 -2
- data/README.md +12 -4
- data/Rakefile +38 -2
- data/csso-rails.gemspec +6 -8
- data/lib/csso-rails.rb +1 -6
- data/lib/csso.rb +4 -10
- data/lib/csso/rails.rb +1 -17
- data/lib/csso/version.rb +2 -2
- data/spec/csso/csso_spec.rb +15 -8
- metadata +16 -39
- data/.gitmodules +0 -3
- data/lib/csso/js/compressor.js +0 -1471
- data/lib/csso/js/csso.js +0 -70
- data/lib/csso/js/cssoapi.js +0 -22
- data/lib/csso/js/gonzales.cssp.node.js +0 -2295
- data/lib/csso/js/translator.js +0 -128
- data/lib/csso/js/util.js +0 -41
- data/lib/csso/loader.rb +0 -74
- data/lib/csso/utils.rb +0 -53
- data/spec/spec_helper.rb +0 -3
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
|
-
}
|
data/lib/csso/js/cssoapi.js
DELETED
@@ -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;
|