parse5 2.1.5 → 2.2.3

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.
@@ -72,16 +72,12 @@ var DATA_STATE = 'DATA_STATE',
72
72
  COMMENT_END_STATE = 'COMMENT_END_STATE',
73
73
  COMMENT_END_BANG_STATE = 'COMMENT_END_BANG_STATE',
74
74
  DOCTYPE_STATE = 'DOCTYPE_STATE',
75
- BEFORE_DOCTYPE_NAME_STATE = 'BEFORE_DOCTYPE_NAME_STATE',
76
75
  DOCTYPE_NAME_STATE = 'DOCTYPE_NAME_STATE',
77
76
  AFTER_DOCTYPE_NAME_STATE = 'AFTER_DOCTYPE_NAME_STATE',
78
- AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE = 'AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE',
79
77
  BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE',
80
78
  DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE',
81
79
  DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE',
82
- AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE',
83
80
  BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE = 'BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE',
84
- AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE = 'AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE',
85
81
  BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE',
86
82
  DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE',
87
83
  DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE',
@@ -110,8 +106,12 @@ function isAsciiLower(cp) {
110
106
  return cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_Z;
111
107
  }
112
108
 
109
+ function isAsciiLetter(cp) {
110
+ return isAsciiLower(cp) || isAsciiUpper(cp);
111
+ }
112
+
113
113
  function isAsciiAlphaNumeric(cp) {
114
- return isAsciiDigit(cp) || isAsciiUpper(cp) || isAsciiLower(cp);
114
+ return isAsciiLetter(cp) || isAsciiDigit(cp);
115
115
  }
116
116
 
117
117
  function isDigit(cp, isHex) {
@@ -319,32 +319,23 @@ Tokenizer.prototype.isTempBufferEqualToScriptString = function () {
319
319
  };
320
320
 
321
321
  //Token creation
322
- Tokenizer.prototype.buildStartTagToken = function (tagName) {
323
- return {
322
+ Tokenizer.prototype._createStartTagToken = function () {
323
+ this.currentToken = {
324
324
  type: Tokenizer.START_TAG_TOKEN,
325
- tagName: tagName,
325
+ tagName: '',
326
326
  selfClosing: false,
327
327
  attrs: []
328
328
  };
329
329
  };
330
330
 
331
- Tokenizer.prototype.buildEndTagToken = function (tagName) {
332
- return {
331
+ Tokenizer.prototype._createEndTagToken = function () {
332
+ this.currentToken = {
333
333
  type: Tokenizer.END_TAG_TOKEN,
334
- tagName: tagName,
335
- ignored: false,
334
+ tagName: '',
336
335
  attrs: []
337
336
  };
338
337
  };
339
338
 
340
- Tokenizer.prototype._createStartTagToken = function (tagNameFirstCh) {
341
- this.currentToken = this.buildStartTagToken(tagNameFirstCh);
342
- };
343
-
344
- Tokenizer.prototype._createEndTagToken = function (tagNameFirstCh) {
345
- this.currentToken = this.buildEndTagToken(tagNameFirstCh);
346
- };
347
-
348
339
  Tokenizer.prototype._createCommentToken = function () {
349
340
  this.currentToken = {
350
341
  type: Tokenizer.COMMENT_TOKEN,
@@ -352,10 +343,10 @@ Tokenizer.prototype._createCommentToken = function () {
352
343
  };
353
344
  };
354
345
 
355
- Tokenizer.prototype._createDoctypeToken = function (doctypeNameFirstCh) {
346
+ Tokenizer.prototype._createDoctypeToken = function (initialName) {
356
347
  this.currentToken = {
357
348
  type: Tokenizer.DOCTYPE_TOKEN,
358
- name: doctypeNameFirstCh || null,
349
+ name: initialName,
359
350
  forceQuirks: false,
360
351
  publicId: null,
361
352
  systemId: null
@@ -583,6 +574,8 @@ var _ = Tokenizer.prototype;
583
574
  //12.2.4.1 Data state
584
575
  //------------------------------------------------------------------
585
576
  _[DATA_STATE] = function dataState(cp) {
577
+ this.preprocessor.dropParsedChunk();
578
+
586
579
  if (cp === $.AMPERSAND)
587
580
  this.state = CHARACTER_REFERENCE_IN_DATA_STATE;
588
581
 
@@ -622,6 +615,8 @@ _[CHARACTER_REFERENCE_IN_DATA_STATE] = function characterReferenceInDataState(cp
622
615
  //12.2.4.3 RCDATA state
623
616
  //------------------------------------------------------------------
624
617
  _[RCDATA_STATE] = function rcdataState(cp) {
618
+ this.preprocessor.dropParsedChunk();
619
+
625
620
  if (cp === $.AMPERSAND)
626
621
  this.state = CHARACTER_REFERENCE_IN_RCDATA_STATE;
627
622
 
@@ -661,6 +656,8 @@ _[CHARACTER_REFERENCE_IN_RCDATA_STATE] = function characterReferenceInRcdataStat
661
656
  //12.2.4.5 RAWTEXT state
662
657
  //------------------------------------------------------------------
663
658
  _[RAWTEXT_STATE] = function rawtextState(cp) {
659
+ this.preprocessor.dropParsedChunk();
660
+
664
661
  if (cp === $.LESS_THAN_SIGN)
665
662
  this.state = RAWTEXT_LESS_THAN_SIGN_STATE;
666
663
 
@@ -678,6 +675,8 @@ _[RAWTEXT_STATE] = function rawtextState(cp) {
678
675
  //12.2.4.6 Script data state
679
676
  //------------------------------------------------------------------
680
677
  _[SCRIPT_DATA_STATE] = function scriptDataState(cp) {
678
+ this.preprocessor.dropParsedChunk();
679
+
681
680
  if (cp === $.LESS_THAN_SIGN)
682
681
  this.state = SCRIPT_DATA_LESS_THAN_SIGN_STATE;
683
682
 
@@ -695,6 +694,8 @@ _[SCRIPT_DATA_STATE] = function scriptDataState(cp) {
695
694
  //12.2.4.7 PLAINTEXT state
696
695
  //------------------------------------------------------------------
697
696
  _[PLAINTEXT_STATE] = function plaintextState(cp) {
697
+ this.preprocessor.dropParsedChunk();
698
+
698
699
  if (cp === $.NULL)
699
700
  this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
700
701
 
@@ -715,14 +716,9 @@ _[TAG_OPEN_STATE] = function tagOpenState(cp) {
715
716
  else if (cp === $.SOLIDUS)
716
717
  this.state = END_TAG_OPEN_STATE;
717
718
 
718
- else if (isAsciiUpper(cp)) {
719
- this._createStartTagToken(toAsciiLowerChar(cp));
720
- this.state = TAG_NAME_STATE;
721
- }
722
-
723
- else if (isAsciiLower(cp)) {
724
- this._createStartTagToken(toChar(cp));
725
- this.state = TAG_NAME_STATE;
719
+ else if (isAsciiLetter(cp)) {
720
+ this._createStartTagToken();
721
+ this._reconsumeInState(TAG_NAME_STATE);
726
722
  }
727
723
 
728
724
  else if (cp === $.QUESTION_MARK)
@@ -738,14 +734,9 @@ _[TAG_OPEN_STATE] = function tagOpenState(cp) {
738
734
  //12.2.4.9 End tag open state
739
735
  //------------------------------------------------------------------
740
736
  _[END_TAG_OPEN_STATE] = function endTagOpenState(cp) {
741
- if (isAsciiUpper(cp)) {
742
- this._createEndTagToken(toAsciiLowerChar(cp));
743
- this.state = TAG_NAME_STATE;
744
- }
745
-
746
- else if (isAsciiLower(cp)) {
747
- this._createEndTagToken(toChar(cp));
748
- this.state = TAG_NAME_STATE;
737
+ if (isAsciiLetter(cp)) {
738
+ this._createEndTagToken();
739
+ this._reconsumeInState(TAG_NAME_STATE);
749
740
  }
750
741
 
751
742
  else if (cp === $.GREATER_THAN_SIGN)
@@ -808,16 +799,9 @@ _[RCDATA_LESS_THAN_SIGN_STATE] = function rcdataLessThanSignState(cp) {
808
799
  //12.2.4.12 RCDATA end tag open state
809
800
  //------------------------------------------------------------------
810
801
  _[RCDATA_END_TAG_OPEN_STATE] = function rcdataEndTagOpenState(cp) {
811
- if (isAsciiUpper(cp)) {
812
- this._createEndTagToken(toAsciiLowerChar(cp));
813
- this.tempBuff.push(cp);
814
- this.state = RCDATA_END_TAG_NAME_STATE;
815
- }
816
-
817
- else if (isAsciiLower(cp)) {
818
- this._createEndTagToken(toChar(cp));
819
- this.tempBuff.push(cp);
820
- this.state = RCDATA_END_TAG_NAME_STATE;
802
+ if (isAsciiLetter(cp)) {
803
+ this._createEndTagToken();
804
+ this._reconsumeInState(RCDATA_END_TAG_NAME_STATE);
821
805
  }
822
806
 
823
807
  else {
@@ -886,16 +870,9 @@ _[RAWTEXT_LESS_THAN_SIGN_STATE] = function rawtextLessThanSignState(cp) {
886
870
  //12.2.4.15 RAWTEXT end tag open state
887
871
  //------------------------------------------------------------------
888
872
  _[RAWTEXT_END_TAG_OPEN_STATE] = function rawtextEndTagOpenState(cp) {
889
- if (isAsciiUpper(cp)) {
890
- this._createEndTagToken(toAsciiLowerChar(cp));
891
- this.tempBuff.push(cp);
892
- this.state = RAWTEXT_END_TAG_NAME_STATE;
893
- }
894
-
895
- else if (isAsciiLower(cp)) {
896
- this._createEndTagToken(toChar(cp));
897
- this.tempBuff.push(cp);
898
- this.state = RAWTEXT_END_TAG_NAME_STATE;
873
+ if (isAsciiLetter(cp)) {
874
+ this._createEndTagToken();
875
+ this._reconsumeInState(RAWTEXT_END_TAG_NAME_STATE);
899
876
  }
900
877
 
901
878
  else {
@@ -970,16 +947,9 @@ _[SCRIPT_DATA_LESS_THAN_SIGN_STATE] = function scriptDataLessThanSignState(cp) {
970
947
  //12.2.4.18 Script data end tag open state
971
948
  //------------------------------------------------------------------
972
949
  _[SCRIPT_DATA_END_TAG_OPEN_STATE] = function scriptDataEndTagOpenState(cp) {
973
- if (isAsciiUpper(cp)) {
974
- this._createEndTagToken(toAsciiLowerChar(cp));
975
- this.tempBuff.push(cp);
976
- this.state = SCRIPT_DATA_END_TAG_NAME_STATE;
977
- }
978
-
979
- else if (isAsciiLower(cp)) {
980
- this._createEndTagToken(toChar(cp));
981
- this.tempBuff.push(cp);
982
- this.state = SCRIPT_DATA_END_TAG_NAME_STATE;
950
+ if (isAsciiLetter(cp)) {
951
+ this._createEndTagToken();
952
+ this._reconsumeInState(SCRIPT_DATA_END_TAG_NAME_STATE);
983
953
  }
984
954
 
985
955
  else {
@@ -1141,20 +1111,10 @@ _[SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE] = function scriptDataEscapedLessThan
1141
1111
  this.state = SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE;
1142
1112
  }
1143
1113
 
1144
- else if (isAsciiUpper(cp)) {
1145
- this.tempBuff = [];
1146
- this.tempBuff.push(toAsciiLowerCodePoint(cp));
1147
- this.state = SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE;
1148
- this._emitChar('<');
1149
- this._emitCodePoint(cp);
1150
- }
1151
-
1152
- else if (isAsciiLower(cp)) {
1114
+ else if (isAsciiLetter(cp)) {
1153
1115
  this.tempBuff = [];
1154
- this.tempBuff.push(cp);
1155
- this.state = SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE;
1156
1116
  this._emitChar('<');
1157
- this._emitCodePoint(cp);
1117
+ this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE);
1158
1118
  }
1159
1119
 
1160
1120
  else {
@@ -1167,16 +1127,9 @@ _[SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE] = function scriptDataEscapedLessThan
1167
1127
  //12.2.4.26 Script data escaped end tag open state
1168
1128
  //------------------------------------------------------------------
1169
1129
  _[SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE] = function scriptDataEscapedEndTagOpenState(cp) {
1170
- if (isAsciiUpper(cp)) {
1171
- this._createEndTagToken(toAsciiLowerChar(cp));
1172
- this.tempBuff.push(cp);
1173
- this.state = SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE;
1174
- }
1175
-
1176
- else if (isAsciiLower(cp)) {
1177
- this._createEndTagToken(toChar(cp));
1178
- this.tempBuff.push(cp);
1179
- this.state = SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE;
1130
+ if (isAsciiLetter(cp)) {
1131
+ this._createEndTagToken();
1132
+ this._reconsumeInState(SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE);
1180
1133
  }
1181
1134
 
1182
1135
  else {
@@ -1377,35 +1330,17 @@ _[BEFORE_ATTRIBUTE_NAME_STATE] = function beforeAttributeNameState(cp) {
1377
1330
  if (isWhitespace(cp))
1378
1331
  return;
1379
1332
 
1380
- if (cp === $.SOLIDUS)
1381
- this.state = SELF_CLOSING_START_TAG_STATE;
1382
-
1383
- else if (cp === $.GREATER_THAN_SIGN) {
1384
- this.state = DATA_STATE;
1385
- this._emitCurrentToken();
1386
- }
1387
-
1388
- else if (isAsciiUpper(cp)) {
1389
- this._createAttr(toAsciiLowerChar(cp));
1390
- this.state = ATTRIBUTE_NAME_STATE;
1391
- }
1333
+ if (cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN || cp === $.EOF)
1334
+ this._reconsumeInState(AFTER_ATTRIBUTE_NAME_STATE);
1392
1335
 
1393
- else if (cp === $.NULL) {
1394
- this._createAttr(UNICODE.REPLACEMENT_CHARACTER);
1336
+ else if (cp === $.EQUALS_SIGN) {
1337
+ this._createAttr('=');
1395
1338
  this.state = ATTRIBUTE_NAME_STATE;
1396
1339
  }
1397
1340
 
1398
- else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN || cp === $.EQUALS_SIGN) {
1399
- this._createAttr(toChar(cp));
1400
- this.state = ATTRIBUTE_NAME_STATE;
1401
- }
1402
-
1403
- else if (cp === $.EOF)
1404
- this._reconsumeInState(DATA_STATE);
1405
-
1406
1341
  else {
1407
- this._createAttr(toChar(cp));
1408
- this.state = ATTRIBUTE_NAME_STATE;
1342
+ this._createAttr('');
1343
+ this._reconsumeInState(ATTRIBUTE_NAME_STATE);
1409
1344
  }
1410
1345
  };
1411
1346
 
@@ -1413,20 +1348,14 @@ _[BEFORE_ATTRIBUTE_NAME_STATE] = function beforeAttributeNameState(cp) {
1413
1348
  //12.2.4.35 Attribute name state
1414
1349
  //------------------------------------------------------------------
1415
1350
  _[ATTRIBUTE_NAME_STATE] = function attributeNameState(cp) {
1416
- if (isWhitespace(cp))
1351
+ if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN || cp === $.EOF) {
1417
1352
  this._leaveAttrName(AFTER_ATTRIBUTE_NAME_STATE);
1418
-
1419
- else if (cp === $.SOLIDUS)
1420
- this._leaveAttrName(SELF_CLOSING_START_TAG_STATE);
1353
+ this._unconsume();
1354
+ }
1421
1355
 
1422
1356
  else if (cp === $.EQUALS_SIGN)
1423
1357
  this._leaveAttrName(BEFORE_ATTRIBUTE_VALUE_STATE);
1424
1358
 
1425
- else if (cp === $.GREATER_THAN_SIGN) {
1426
- this._leaveAttrName(DATA_STATE);
1427
- this._emitCurrentToken();
1428
- }
1429
-
1430
1359
  else if (isAsciiUpper(cp))
1431
1360
  this.currentAttr.name += toAsciiLowerChar(cp);
1432
1361
 
@@ -1436,9 +1365,6 @@ _[ATTRIBUTE_NAME_STATE] = function attributeNameState(cp) {
1436
1365
  else if (cp === $.NULL)
1437
1366
  this.currentAttr.name += UNICODE.REPLACEMENT_CHARACTER;
1438
1367
 
1439
- else if (cp === $.EOF)
1440
- this._reconsumeInState(DATA_STATE);
1441
-
1442
1368
  else
1443
1369
  this.currentAttr.name += toChar(cp);
1444
1370
  };
@@ -1461,27 +1387,12 @@ _[AFTER_ATTRIBUTE_NAME_STATE] = function afterAttributeNameState(cp) {
1461
1387
  this._emitCurrentToken();
1462
1388
  }
1463
1389
 
1464
- else if (isAsciiUpper(cp)) {
1465
- this._createAttr(toAsciiLowerChar(cp));
1466
- this.state = ATTRIBUTE_NAME_STATE;
1467
- }
1468
-
1469
- else if (cp === $.NULL) {
1470
- this._createAttr(UNICODE.REPLACEMENT_CHARACTER);
1471
- this.state = ATTRIBUTE_NAME_STATE;
1472
- }
1473
-
1474
- else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN) {
1475
- this._createAttr(toChar(cp));
1476
- this.state = ATTRIBUTE_NAME_STATE;
1477
- }
1478
-
1479
1390
  else if (cp === $.EOF)
1480
1391
  this._reconsumeInState(DATA_STATE);
1481
1392
 
1482
1393
  else {
1483
- this._createAttr(toChar(cp));
1484
- this.state = ATTRIBUTE_NAME_STATE;
1394
+ this._createAttr('');
1395
+ this._reconsumeInState(ATTRIBUTE_NAME_STATE);
1485
1396
  }
1486
1397
  };
1487
1398
 
@@ -1495,34 +1406,11 @@ _[BEFORE_ATTRIBUTE_VALUE_STATE] = function beforeAttributeValueState(cp) {
1495
1406
  if (cp === $.QUOTATION_MARK)
1496
1407
  this.state = ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE;
1497
1408
 
1498
- else if (cp === $.AMPERSAND)
1499
- this._reconsumeInState(ATTRIBUTE_VALUE_UNQUOTED_STATE);
1500
-
1501
1409
  else if (cp === $.APOSTROPHE)
1502
1410
  this.state = ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE;
1503
1411
 
1504
- else if (cp === $.NULL) {
1505
- this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER;
1506
- this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE;
1507
- }
1508
-
1509
- else if (cp === $.GREATER_THAN_SIGN) {
1510
- this.state = DATA_STATE;
1511
- this._emitCurrentToken();
1512
- }
1513
-
1514
- else if (cp === $.LESS_THAN_SIGN || cp === $.EQUALS_SIGN || cp === $.GRAVE_ACCENT) {
1515
- this.currentAttr.value += toChar(cp);
1516
- this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE;
1517
- }
1518
-
1519
- else if (cp === $.EOF)
1520
- this._reconsumeInState(DATA_STATE);
1521
-
1522
- else {
1523
- this.currentAttr.value += toChar(cp);
1524
- this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE;
1525
- }
1412
+ else
1413
+ this._reconsumeInState(ATTRIBUTE_VALUE_UNQUOTED_STATE);
1526
1414
  };
1527
1415
 
1528
1416
 
@@ -1894,54 +1782,25 @@ _[COMMENT_END_BANG_STATE] = function commentEndBangState(cp) {
1894
1782
  //12.2.4.52 DOCTYPE state
1895
1783
  //------------------------------------------------------------------
1896
1784
  _[DOCTYPE_STATE] = function doctypeState(cp) {
1897
- if (isWhitespace(cp))
1898
- this.state = BEFORE_DOCTYPE_NAME_STATE;
1899
-
1900
- else if (cp === $.EOF) {
1901
- this._createDoctypeToken();
1902
- this.currentToken.forceQuirks = true;
1903
- this._emitCurrentToken();
1904
- this._reconsumeInState(DATA_STATE);
1905
- }
1906
-
1907
- else
1908
- this._reconsumeInState(BEFORE_DOCTYPE_NAME_STATE);
1909
- };
1910
-
1911
-
1912
- //12.2.4.53 Before DOCTYPE name state
1913
- //------------------------------------------------------------------
1914
- _[BEFORE_DOCTYPE_NAME_STATE] = function beforeDoctypeNameState(cp) {
1915
1785
  if (isWhitespace(cp))
1916
1786
  return;
1917
1787
 
1918
- if (isAsciiUpper(cp)) {
1919
- this._createDoctypeToken(toAsciiLowerChar(cp));
1920
- this.state = DOCTYPE_NAME_STATE;
1921
- }
1922
-
1923
1788
  else if (cp === $.GREATER_THAN_SIGN) {
1924
- this._createDoctypeToken();
1789
+ this._createDoctypeToken(null);
1925
1790
  this.currentToken.forceQuirks = true;
1926
1791
  this._emitCurrentToken();
1927
1792
  this.state = DATA_STATE;
1928
1793
  }
1929
1794
 
1930
1795
  else if (cp === $.EOF) {
1931
- this._createDoctypeToken();
1796
+ this._createDoctypeToken(null);
1932
1797
  this.currentToken.forceQuirks = true;
1933
1798
  this._emitCurrentToken();
1934
1799
  this._reconsumeInState(DATA_STATE);
1935
1800
  }
1936
-
1937
- else if (cp === $.NULL) {
1938
- this._createDoctypeToken(UNICODE.REPLACEMENT_CHARACTER);
1939
- this.state = DOCTYPE_NAME_STATE;
1940
- }
1941
-
1942
1801
  else {
1943
- this._createDoctypeToken(toChar(cp));
1944
- this.state = DOCTYPE_NAME_STATE;
1802
+ this._createDoctypeToken('');
1803
+ this._reconsumeInState(DOCTYPE_NAME_STATE);
1945
1804
  }
1946
1805
  };
1947
1806
 
@@ -1949,13 +1808,8 @@ _[BEFORE_DOCTYPE_NAME_STATE] = function beforeDoctypeNameState(cp) {
1949
1808
  //12.2.4.54 DOCTYPE name state
1950
1809
  //------------------------------------------------------------------
1951
1810
  _[DOCTYPE_NAME_STATE] = function doctypeNameState(cp) {
1952
- if (isWhitespace(cp))
1953
- this.state = AFTER_DOCTYPE_NAME_STATE;
1954
-
1955
- else if (cp === $.GREATER_THAN_SIGN) {
1956
- this._emitCurrentToken();
1957
- this.state = DATA_STATE;
1958
- }
1811
+ if (isWhitespace(cp) || cp === $.GREATER_THAN_SIGN || cp === $.EOF)
1812
+ this._reconsumeInState(AFTER_DOCTYPE_NAME_STATE);
1959
1813
 
1960
1814
  else if (isAsciiUpper(cp))
1961
1815
  this.currentToken.name += toAsciiLowerChar(cp);
@@ -1963,12 +1817,6 @@ _[DOCTYPE_NAME_STATE] = function doctypeNameState(cp) {
1963
1817
  else if (cp === $.NULL)
1964
1818
  this.currentToken.name += UNICODE.REPLACEMENT_CHARACTER;
1965
1819
 
1966
- else if (cp === $.EOF) {
1967
- this.currentToken.forceQuirks = true;
1968
- this._emitCurrentToken();
1969
- this._reconsumeInState(DATA_STATE);
1970
- }
1971
-
1972
1820
  else
1973
1821
  this.currentToken.name += toChar(cp);
1974
1822
  };
@@ -1985,22 +1833,16 @@ _[AFTER_DOCTYPE_NAME_STATE] = function afterDoctypeNameState(cp) {
1985
1833
  this._emitCurrentToken();
1986
1834
  }
1987
1835
 
1988
- else if (cp === $.EOF) {
1989
- this.currentToken.forceQuirks = true;
1990
- this._emitCurrentToken();
1991
- this._reconsumeInState(DATA_STATE);
1992
- }
1993
-
1994
1836
  else {
1995
1837
  var publicMatch = this._consumeSubsequentIfMatch($$.PUBLIC_STRING, cp, false),
1996
1838
  systemMatch = !publicMatch && this._consumeSubsequentIfMatch($$.SYSTEM_STRING, cp, false);
1997
1839
 
1998
1840
  if (!this._ensureHibernation()) {
1999
1841
  if (publicMatch)
2000
- this.state = AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE;
1842
+ this.state = BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
2001
1843
 
2002
1844
  else if (systemMatch)
2003
- this.state = AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE;
1845
+ this.state = BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE;
2004
1846
 
2005
1847
  else {
2006
1848
  this.currentToken.forceQuirks = true;
@@ -2011,41 +1853,6 @@ _[AFTER_DOCTYPE_NAME_STATE] = function afterDoctypeNameState(cp) {
2011
1853
  };
2012
1854
 
2013
1855
 
2014
- //12.2.4.56 After DOCTYPE public keyword state
2015
- //------------------------------------------------------------------
2016
- _[AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE] = function afterDoctypePublicKeywordState(cp) {
2017
- if (isWhitespace(cp))
2018
- this.state = BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
2019
-
2020
- else if (cp === $.QUOTATION_MARK) {
2021
- this.currentToken.publicId = '';
2022
- this.state = DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE;
2023
- }
2024
-
2025
- else if (cp === $.APOSTROPHE) {
2026
- this.currentToken.publicId = '';
2027
- this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE;
2028
- }
2029
-
2030
- else if (cp === $.GREATER_THAN_SIGN) {
2031
- this.currentToken.forceQuirks = true;
2032
- this._emitCurrentToken();
2033
- this.state = DATA_STATE;
2034
- }
2035
-
2036
- else if (cp === $.EOF) {
2037
- this.currentToken.forceQuirks = true;
2038
- this._emitCurrentToken();
2039
- this._reconsumeInState(DATA_STATE);
2040
- }
2041
-
2042
- else {
2043
- this.currentToken.forceQuirks = true;
2044
- this.state = BOGUS_DOCTYPE_STATE;
2045
- }
2046
- };
2047
-
2048
-
2049
1856
  //12.2.4.57 Before DOCTYPE public identifier state
2050
1857
  //------------------------------------------------------------------
2051
1858
  _[BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE] = function beforeDoctypePublicIdentifierState(cp) {
@@ -2062,21 +1869,9 @@ _[BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE] = function beforeDoctypePublicIdentifi
2062
1869
  this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE;
2063
1870
  }
2064
1871
 
2065
- else if (cp === $.GREATER_THAN_SIGN) {
2066
- this.currentToken.forceQuirks = true;
2067
- this._emitCurrentToken();
2068
- this.state = DATA_STATE;
2069
- }
2070
-
2071
- else if (cp === $.EOF) {
2072
- this.currentToken.forceQuirks = true;
2073
- this._emitCurrentToken();
2074
- this._reconsumeInState(DATA_STATE);
2075
- }
2076
-
2077
1872
  else {
2078
1873
  this.currentToken.forceQuirks = true;
2079
- this.state = BOGUS_DOCTYPE_STATE;
1874
+ this._reconsumeInState(BOGUS_DOCTYPE_STATE);
2080
1875
  }
2081
1876
  };
2082
1877
 
@@ -2085,7 +1880,7 @@ _[BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE] = function beforeDoctypePublicIdentifi
2085
1880
  //------------------------------------------------------------------
2086
1881
  _[DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE] = function doctypePublicIdentifierDoubleQuotedState(cp) {
2087
1882
  if (cp === $.QUOTATION_MARK)
2088
- this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
1883
+ this.state = BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE;
2089
1884
 
2090
1885
  else if (cp === $.NULL)
2091
1886
  this.currentToken.publicId += UNICODE.REPLACEMENT_CHARACTER;
@@ -2111,7 +1906,7 @@ _[DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE] = function doctypePublicIdentif
2111
1906
  //------------------------------------------------------------------
2112
1907
  _[DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE] = function doctypePublicIdentifierSingleQuotedState(cp) {
2113
1908
  if (cp === $.APOSTROPHE)
2114
- this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
1909
+ this.state = BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE;
2115
1910
 
2116
1911
  else if (cp === $.NULL)
2117
1912
  this.currentToken.publicId += UNICODE.REPLACEMENT_CHARACTER;
@@ -2133,40 +1928,6 @@ _[DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE] = function doctypePublicIdentif
2133
1928
  };
2134
1929
 
2135
1930
 
2136
- //12.2.4.60 After DOCTYPE public identifier state
2137
- //------------------------------------------------------------------
2138
- _[AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE] = function afterDoctypePublicIdentifierState(cp) {
2139
- if (isWhitespace(cp))
2140
- this.state = BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE;
2141
-
2142
- else if (cp === $.GREATER_THAN_SIGN) {
2143
- this._emitCurrentToken();
2144
- this.state = DATA_STATE;
2145
- }
2146
-
2147
- else if (cp === $.QUOTATION_MARK) {
2148
- this.currentToken.systemId = '';
2149
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;
2150
- }
2151
-
2152
- else if (cp === $.APOSTROPHE) {
2153
- this.currentToken.systemId = '';
2154
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
2155
- }
2156
-
2157
- else if (cp === $.EOF) {
2158
- this.currentToken.forceQuirks = true;
2159
- this._emitCurrentToken();
2160
- this._reconsumeInState(DATA_STATE);
2161
- }
2162
-
2163
- else {
2164
- this.currentToken.forceQuirks = true;
2165
- this.state = BOGUS_DOCTYPE_STATE;
2166
- }
2167
- };
2168
-
2169
-
2170
1931
  //12.2.4.61 Between DOCTYPE public and system identifiers state
2171
1932
  //------------------------------------------------------------------
2172
1933
  _[BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE] = function betweenDoctypePublicAndSystemIdentifiersState(cp) {
@@ -2189,50 +1950,9 @@ _[BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE] = function betweenDoctype
2189
1950
  this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
2190
1951
  }
2191
1952
 
2192
- else if (cp === $.EOF) {
2193
- this.currentToken.forceQuirks = true;
2194
- this._emitCurrentToken();
2195
- this._reconsumeInState(DATA_STATE);
2196
- }
2197
-
2198
- else {
2199
- this.currentToken.forceQuirks = true;
2200
- this.state = BOGUS_DOCTYPE_STATE;
2201
- }
2202
- };
2203
-
2204
-
2205
- //12.2.4.62 After DOCTYPE system keyword state
2206
- //------------------------------------------------------------------
2207
- _[AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE] = function afterDoctypeSystemKeywordState(cp) {
2208
- if (isWhitespace(cp))
2209
- this.state = BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE;
2210
-
2211
- else if (cp === $.QUOTATION_MARK) {
2212
- this.currentToken.systemId = '';
2213
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;
2214
- }
2215
-
2216
- else if (cp === $.APOSTROPHE) {
2217
- this.currentToken.systemId = '';
2218
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
2219
- }
2220
-
2221
- else if (cp === $.GREATER_THAN_SIGN) {
2222
- this.currentToken.forceQuirks = true;
2223
- this._emitCurrentToken();
2224
- this.state = DATA_STATE;
2225
- }
2226
-
2227
- else if (cp === $.EOF) {
2228
- this.currentToken.forceQuirks = true;
2229
- this._emitCurrentToken();
2230
- this._reconsumeInState(DATA_STATE);
2231
- }
2232
-
2233
1953
  else {
2234
1954
  this.currentToken.forceQuirks = true;
2235
- this.state = BOGUS_DOCTYPE_STATE;
1955
+ this._reconsumeInState(BOGUS_DOCTYPE_STATE);
2236
1956
  }
2237
1957
  };
2238
1958
 
@@ -2253,21 +1973,9 @@ _[BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE] = function beforeDoctypeSystemIdentifi
2253
1973
  this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
2254
1974
  }
2255
1975
 
2256
- else if (cp === $.GREATER_THAN_SIGN) {
2257
- this.currentToken.forceQuirks = true;
2258
- this._emitCurrentToken();
2259
- this.state = DATA_STATE;
2260
- }
2261
-
2262
- else if (cp === $.EOF) {
2263
- this.currentToken.forceQuirks = true;
2264
- this._emitCurrentToken();
2265
- this._reconsumeInState(DATA_STATE);
2266
- }
2267
-
2268
1976
  else {
2269
1977
  this.currentToken.forceQuirks = true;
2270
- this.state = BOGUS_DOCTYPE_STATE;
1978
+ this._reconsumeInState(BOGUS_DOCTYPE_STATE);
2271
1979
  }
2272
1980
  };
2273
1981