csso-rails 0.0.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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;
|