Skip to content

Commit 4a1dc08

Browse files
author
Nicholas C. Zakas
committed
Updated parser with support for unknown @ rule error recovery (fixes #211)
1 parent fc9e126 commit 4a1dc08

1 file changed

Lines changed: 41 additions & 6 deletions

File tree

lib/parserlib.js

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2121
THE SOFTWARE.
2222
2323
*/
24-
/* Build time: 1-November-2011 12:11:55 */
24+
/* Build time: 16-November-2011 01:11:51 */
2525
var parserlib = {};
2626
(function(){
2727

@@ -925,7 +925,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
925925
THE SOFTWARE.
926926
927927
*/
928-
/* Build time: 1-November-2011 12:11:55 */
928+
/* Build time: 16-November-2011 01:11:51 */
929929
(function(){
930930
var EventTarget = parserlib.util.EventTarget,
931931
TokenStreamBase = parserlib.util.TokenStreamBase,
@@ -1258,6 +1258,7 @@ Parser.prototype = function(){
12581258

12591259
var tokenStream = this._tokenStream,
12601260
charset = null,
1261+
count,
12611262
token,
12621263
tt;
12631264

@@ -1304,7 +1305,36 @@ Parser.prototype = function(){
13041305
case Tokens.KEYFRAMES_SYM:
13051306
this._keyframes();
13061307
this._skipCruft();
1307-
break;
1308+
break;
1309+
case Tokens.UNKNOWN_SYM: //unknown @ rule
1310+
tokenStream.get();
1311+
if (!this.options.strict){
1312+
1313+
//fire error event
1314+
this.fire({
1315+
type: "error",
1316+
error: null,
1317+
message: "Unknown @ rule: " + tokenStream.LT(0).value + ".",
1318+
line: tokenStream.LT(0).startLine,
1319+
col: tokenStream.LT(0).startCol
1320+
});
1321+
1322+
//skip braces
1323+
count=0;
1324+
while (tokenStream.advance([Tokens.LBRACE, Tokens.RBRACE]) == Tokens.LBRACE){
1325+
count++; //keep track of nesting depth
1326+
}
1327+
1328+
while(count){
1329+
tokenStream.advance([Tokens.RBRACE]);
1330+
count--;
1331+
}
1332+
1333+
} else {
1334+
//not a syntax error, rethrow it
1335+
throw new SyntaxError("Unknown @ rule.", tokenStream.LT(0).startLine, tokenStream.LT(0).startCol);;
1336+
}
1337+
break;
13081338
case Tokens.S:
13091339
this._readWhitespace();
13101340
break;
@@ -4728,9 +4758,13 @@ TokenStream.prototype = mix(new TokenStreamBase(), {
47284758

47294759
//if it's not valid, use the first character only and reset the reader
47304760
if (tt == Tokens.CHAR || tt == Tokens.UNKNOWN){
4731-
tt = Tokens.CHAR;
4732-
rule = first;
4733-
reader.reset();
4761+
if (rule.length > 1){
4762+
tt = Tokens.UNKNOWN_SYM;
4763+
} else {
4764+
tt = Tokens.CHAR;
4765+
rule = first;
4766+
reader.reset();
4767+
}
47344768
}
47354769

47364770
return this.createToken(tt, rule, startLine, startCol);
@@ -5396,6 +5430,7 @@ var Tokens = [
53965430
{ name: "FONT_FACE_SYM", text: "@font-face"},
53975431
{ name: "CHARSET_SYM", text: "@charset"},
53985432
{ name: "NAMESPACE_SYM", text: "@namespace"},
5433+
{ name: "UNKNOWN_SYM" },
53995434
//{ name: "ATKEYWORD"},
54005435

54015436
//CSS3 animations

0 commit comments

Comments
 (0)