Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(310)

Side by Side Diff: pkg/third_party/html5lib/lib/parser.dart

Issue 162093002: fix imports link rel=stylesheet (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /** 1 /**
2 * This library has a parser for HTML5 documents, that lets you parse HTML 2 * This library has a parser for HTML5 documents, that lets you parse HTML
3 * easily from a script or server side application: 3 * easily from a script or server side application:
4 * 4 *
5 * import 'package:html5lib/parser.dart' show parse; 5 * import 'package:html5lib/parser.dart' show parse;
6 * import 'package:html5lib/dom.dart'; 6 * import 'package:html5lib/dom.dart';
7 * main() { 7 * main() {
8 * var document = parse( 8 * var document = parse(
9 * '<body>Hello world! <a href="www.html5rocks.com">HTML5 rocks!'); 9 * '<body>Hello world! <a href="www.html5rocks.com">HTML5 rocks!');
10 * print(document.outerHtml); 10 * print(document.outerHtml);
(...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after
585 Phase(HtmlParser parser) : parser = parser, tree = parser.tree; 585 Phase(HtmlParser parser) : parser = parser, tree = parser.tree;
586 586
587 bool processEOF() { 587 bool processEOF() {
588 throw new UnimplementedError(); 588 throw new UnimplementedError();
589 } 589 }
590 590
591 Token processComment(CommentToken token) { 591 Token processComment(CommentToken token) {
592 // For most phases the following is correct. Where it's not it will be 592 // For most phases the following is correct. Where it's not it will be
593 // overridden. 593 // overridden.
594 tree.insertComment(token, tree.openElements.last); 594 tree.insertComment(token, tree.openElements.last);
595 return null;
595 } 596 }
596 597
597 Token processDoctype(DoctypeToken token) { 598 Token processDoctype(DoctypeToken token) {
598 parser.parseError(token.span, "unexpected-doctype"); 599 parser.parseError(token.span, "unexpected-doctype");
600 return null;
599 } 601 }
600 602
601 Token processCharacters(CharactersToken token) { 603 Token processCharacters(CharactersToken token) {
602 tree.insertText(token.data, token.span); 604 tree.insertText(token.data, token.span);
605 return null;
603 } 606 }
604 607
605 Token processSpaceCharacters(SpaceCharactersToken token) { 608 Token processSpaceCharacters(SpaceCharactersToken token) {
606 tree.insertText(token.data, token.span); 609 tree.insertText(token.data, token.span);
610 return null;
607 } 611 }
608 612
609 Token processStartTag(StartTagToken token) { 613 Token processStartTag(StartTagToken token) {
610 throw new UnimplementedError(); 614 throw new UnimplementedError();
611 } 615 }
612 616
613 Token startTagHtml(StartTagToken token) { 617 Token startTagHtml(StartTagToken token) {
614 if (parser.firstStartTag == false && token.name == "html") { 618 if (parser.firstStartTag == false && token.name == "html") {
615 parser.parseError(token.span, "non-html-root"); 619 parser.parseError(token.span, "non-html-root");
616 } 620 }
617 // XXX Need a check here to see if the first start tag token emitted is 621 // XXX Need a check here to see if the first start tag token emitted is
618 // this token... If it's not, invoke parser.parseError(). 622 // this token... If it's not, invoke parser.parseError().
619 token.data.forEach((attr, value) { 623 token.data.forEach((attr, value) {
620 tree.openElements[0].attributes.putIfAbsent(attr, () => value); 624 tree.openElements[0].attributes.putIfAbsent(attr, () => value);
621 }); 625 });
622 parser.firstStartTag = false; 626 parser.firstStartTag = false;
627 return null;
623 } 628 }
624 629
625 Token processEndTag(EndTagToken token) { 630 Token processEndTag(EndTagToken token) {
626 throw new UnimplementedError(); 631 throw new UnimplementedError();
627 } 632 }
628 633
629 /** Helper method for popping openElements. */ 634 /** Helper method for popping openElements. */
630 void popOpenElementsUntil(String name) { 635 void popOpenElementsUntil(String name) {
631 var node = tree.openElements.removeLast(); 636 var node = tree.openElements.removeLast();
632 while (node.tagName != name) { 637 while (node.tagName != name) {
633 node = tree.openElements.removeLast(); 638 node = tree.openElements.removeLast();
634 } 639 }
635 } 640 }
636 } 641 }
637 642
638 class InitialPhase extends Phase { 643 class InitialPhase extends Phase {
639 InitialPhase(parser) : super(parser); 644 InitialPhase(parser) : super(parser);
640 645
641 Token processSpaceCharacters(SpaceCharactersToken token) { 646 Token processSpaceCharacters(SpaceCharactersToken token) {
647 return null;
642 } 648 }
643 649
644 Token processComment(CommentToken token) { 650 Token processComment(CommentToken token) {
645 tree.insertComment(token, tree.document); 651 tree.insertComment(token, tree.document);
652 return null;
646 } 653 }
647 654
648 Token processDoctype(DoctypeToken token) { 655 Token processDoctype(DoctypeToken token) {
649 var name = token.name; 656 var name = token.name;
650 String publicId = token.publicId; 657 String publicId = token.publicId;
651 var systemId = token.systemId; 658 var systemId = token.systemId;
652 var correct = token.correct; 659 var correct = token.correct;
653 660
654 if ((name != "html" || publicId != null || 661 if ((name != "html" || publicId != null ||
655 systemId != null && systemId != "about:legacy-compat")) { 662 systemId != null && systemId != "about:legacy-compat")) {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
736 } else if (startsWithAny(publicId, const [ 743 } else if (startsWithAny(publicId, const [
737 "-//w3c//dtd xhtml 1.0 frameset//", 744 "-//w3c//dtd xhtml 1.0 frameset//",
738 "-//w3c//dtd xhtml 1.0 transitional//"]) 745 "-//w3c//dtd xhtml 1.0 transitional//"])
739 || startsWithAny(publicId, const [ 746 || startsWithAny(publicId, const [
740 "-//w3c//dtd html 4.01 frameset//", 747 "-//w3c//dtd html 4.01 frameset//",
741 "-//w3c//dtd html 4.01 transitional//"]) && 748 "-//w3c//dtd html 4.01 transitional//"]) &&
742 systemId != null) { 749 systemId != null) {
743 parser.compatMode = "limited quirks"; 750 parser.compatMode = "limited quirks";
744 } 751 }
745 parser.phase = parser._beforeHtmlPhase; 752 parser.phase = parser._beforeHtmlPhase;
753 return null;
746 } 754 }
747 755
748 void anythingElse() { 756 void anythingElse() {
749 parser.compatMode = "quirks"; 757 parser.compatMode = "quirks";
750 parser.phase = parser._beforeHtmlPhase; 758 parser.phase = parser._beforeHtmlPhase;
751 } 759 }
752 760
753 Token processCharacters(CharactersToken token) { 761 Token processCharacters(CharactersToken token) {
754 parser.parseError(token.span, "expected-doctype-but-got-chars"); 762 parser.parseError(token.span, "expected-doctype-but-got-chars");
755 anythingElse(); 763 anythingElse();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
788 } 796 }
789 797
790 // other 798 // other
791 bool processEOF() { 799 bool processEOF() {
792 insertHtmlElement(); 800 insertHtmlElement();
793 return true; 801 return true;
794 } 802 }
795 803
796 Token processComment(CommentToken token) { 804 Token processComment(CommentToken token) {
797 tree.insertComment(token, tree.document); 805 tree.insertComment(token, tree.document);
806 return null;
798 } 807 }
799 808
800 Token processSpaceCharacters(SpaceCharactersToken token) { 809 Token processSpaceCharacters(SpaceCharactersToken token) {
810 return null;
801 } 811 }
802 812
803 Token processCharacters(CharactersToken token) { 813 Token processCharacters(CharactersToken token) {
804 insertHtmlElement(); 814 insertHtmlElement();
805 return token; 815 return token;
806 } 816 }
807 817
808 Token processStartTag(StartTagToken token) { 818 Token processStartTag(StartTagToken token) {
809 if (token.name == "html") { 819 if (token.name == "html") {
810 parser.firstStartTag = true; 820 parser.firstStartTag = true;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
845 default: return endTagOther(token); 855 default: return endTagOther(token);
846 } 856 }
847 } 857 }
848 858
849 bool processEOF() { 859 bool processEOF() {
850 startTagHead(new StartTagToken("head", data: {})); 860 startTagHead(new StartTagToken("head", data: {}));
851 return true; 861 return true;
852 } 862 }
853 863
854 Token processSpaceCharacters(SpaceCharactersToken token) { 864 Token processSpaceCharacters(SpaceCharactersToken token) {
865 return null;
855 } 866 }
856 867
857 Token processCharacters(CharactersToken token) { 868 Token processCharacters(CharactersToken token) {
858 startTagHead(new StartTagToken("head", data: {})); 869 startTagHead(new StartTagToken("head", data: {}));
859 return token; 870 return token;
860 } 871 }
861 872
862 Token startTagHtml(StartTagToken token) { 873 Token startTagHtml(StartTagToken token) {
863 return parser._inBodyPhase.processStartTag(token); 874 return parser._inBodyPhase.processStartTag(token);
864 } 875 }
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after
1437 if (tree.elementInScope("button")) { 1448 if (tree.elementInScope("button")) {
1438 parser.parseError(token.span, "unexpected-start-tag-implies-end-tag", 1449 parser.parseError(token.span, "unexpected-start-tag-implies-end-tag",
1439 {"startName": "button", "endName": "button"}); 1450 {"startName": "button", "endName": "button"});
1440 processEndTag(new EndTagToken("button")); 1451 processEndTag(new EndTagToken("button"));
1441 return token; 1452 return token;
1442 } else { 1453 } else {
1443 tree.reconstructActiveFormattingElements(); 1454 tree.reconstructActiveFormattingElements();
1444 tree.insertElement(token); 1455 tree.insertElement(token);
1445 parser.framesetOK = false; 1456 parser.framesetOK = false;
1446 } 1457 }
1458 return null;
1447 } 1459 }
1448 1460
1449 void startTagAppletMarqueeObject(StartTagToken token) { 1461 void startTagAppletMarqueeObject(StartTagToken token) {
1450 tree.reconstructActiveFormattingElements(); 1462 tree.reconstructActiveFormattingElements();
1451 tree.insertElement(token); 1463 tree.insertElement(token);
1452 tree.activeFormattingElements.add(Marker); 1464 tree.activeFormattingElements.add(Marker);
1453 parser.framesetOK = false; 1465 parser.framesetOK = false;
1454 } 1466 }
1455 1467
1456 void startTagXmp(StartTagToken token) { 1468 void startTagXmp(StartTagToken token) {
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
1633 * "tr", "noscript" 1645 * "tr", "noscript"
1634 */ 1646 */
1635 void startTagMisplaced(StartTagToken token) { 1647 void startTagMisplaced(StartTagToken token) {
1636 parser.parseError(token.span, "unexpected-start-tag-ignored", 1648 parser.parseError(token.span, "unexpected-start-tag-ignored",
1637 {"name": token.name}); 1649 {"name": token.name});
1638 } 1650 }
1639 1651
1640 Token startTagOther(StartTagToken token) { 1652 Token startTagOther(StartTagToken token) {
1641 tree.reconstructActiveFormattingElements(); 1653 tree.reconstructActiveFormattingElements();
1642 tree.insertElement(token); 1654 tree.insertElement(token);
1655 return null;
1643 } 1656 }
1644 1657
1645 void endTagP(EndTagToken token) { 1658 void endTagP(EndTagToken token) {
1646 if (!tree.elementInScope("p", variant: "button")) { 1659 if (!tree.elementInScope("p", variant: "button")) {
1647 startTagCloseP(new StartTagToken("p", data: {})); 1660 startTagCloseP(new StartTagToken("p", data: {}));
1648 parser.parseError(token.span, "unexpected-end-tag", {"name": "p"}); 1661 parser.parseError(token.span, "unexpected-end-tag", {"name": "p"});
1649 endTagP(new EndTagToken("p")); 1662 endTagP(new EndTagToken("p"));
1650 } else { 1663 } else {
1651 tree.generateImpliedEndTags("p"); 1664 tree.generateImpliedEndTags("p");
1652 if (tree.openElements.last.tagName != "p") { 1665 if (tree.openElements.last.tagName != "p") {
(...skipping 23 matching lines...) Expand all
1676 } 1689 }
1677 parser.phase = parser._afterBodyPhase; 1690 parser.phase = parser._afterBodyPhase;
1678 } 1691 }
1679 1692
1680 Token endTagHtml(EndTagToken token) { 1693 Token endTagHtml(EndTagToken token) {
1681 //We repeat the test for the body end tag token being ignored here 1694 //We repeat the test for the body end tag token being ignored here
1682 if (tree.elementInScope("body")) { 1695 if (tree.elementInScope("body")) {
1683 endTagBody(new EndTagToken("body")); 1696 endTagBody(new EndTagToken("body"));
1684 return token; 1697 return token;
1685 } 1698 }
1699 return null;
1686 } 1700 }
1687 1701
1688 void endTagBlock(EndTagToken token) { 1702 void endTagBlock(EndTagToken token) {
1689 //Put us back in the right whitespace handling mode 1703 //Put us back in the right whitespace handling mode
1690 if (token.name == "pre") { 1704 if (token.name == "pre") {
1691 dropNewline = false; 1705 dropNewline = false;
1692 } 1706 }
1693 var inScope = tree.elementInScope(token.name); 1707 var inScope = tree.elementInScope(token.name);
1694 if (inScope) { 1708 if (inScope) {
1695 tree.generateImpliedEndTags(); 1709 tree.generateImpliedEndTags();
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
1949 // "Tried to process start tag %s in RCDATA/RAWTEXT mode"%token.name 1963 // "Tried to process start tag %s in RCDATA/RAWTEXT mode"%token.name
1950 processStartTag(StartTagToken token) { assert(false); } 1964 processStartTag(StartTagToken token) { assert(false); }
1951 1965
1952 processEndTag(EndTagToken token) { 1966 processEndTag(EndTagToken token) {
1953 if (token.name == 'script') return endTagScript(token); 1967 if (token.name == 'script') return endTagScript(token);
1954 return endTagOther(token); 1968 return endTagOther(token);
1955 } 1969 }
1956 1970
1957 Token processCharacters(CharactersToken token) { 1971 Token processCharacters(CharactersToken token) {
1958 tree.insertText(token.data, token.span); 1972 tree.insertText(token.data, token.span);
1973 return null;
1959 } 1974 }
1960 1975
1961 bool processEOF() { 1976 bool processEOF() {
1962 var last = tree.openElements.last; 1977 var last = tree.openElements.last;
1963 parser.parseError(last.sourceSpan, "expected-named-closing-tag-but-got-eof", 1978 parser.parseError(last.sourceSpan, "expected-named-closing-tag-but-got-eof",
1964 {'name': last.tagName}); 1979 {'name': last.tagName});
1965 tree.openElements.removeLast(); 1980 tree.openElements.removeLast();
1966 parser.phase = parser.originalPhase; 1981 parser.phase = parser.originalPhase;
1967 return true; 1982 return true;
1968 } 1983 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2033 } 2048 }
2034 //Stop parsing 2049 //Stop parsing
2035 return false; 2050 return false;
2036 } 2051 }
2037 2052
2038 Token processSpaceCharacters(SpaceCharactersToken token) { 2053 Token processSpaceCharacters(SpaceCharactersToken token) {
2039 var originalPhase = parser.phase; 2054 var originalPhase = parser.phase;
2040 parser.phase = parser._inTableTextPhase; 2055 parser.phase = parser._inTableTextPhase;
2041 parser._inTableTextPhase.originalPhase = originalPhase; 2056 parser._inTableTextPhase.originalPhase = originalPhase;
2042 parser.phase.processSpaceCharacters(token); 2057 parser.phase.processSpaceCharacters(token);
2058 return null;
2043 } 2059 }
2044 2060
2045 Token processCharacters(CharactersToken token) { 2061 Token processCharacters(CharactersToken token) {
2046 var originalPhase = parser.phase; 2062 var originalPhase = parser.phase;
2047 parser.phase = parser._inTableTextPhase; 2063 parser.phase = parser._inTableTextPhase;
2048 parser._inTableTextPhase.originalPhase = originalPhase; 2064 parser._inTableTextPhase.originalPhase = originalPhase;
2049 parser.phase.processCharacters(token); 2065 parser.phase.processCharacters(token);
2066 return null;
2050 } 2067 }
2051 2068
2052 void insertText(CharactersToken token) { 2069 void insertText(CharactersToken token) {
2053 // If we get here there must be at least one non-whitespace character 2070 // If we get here there must be at least one non-whitespace character
2054 // Do the table magic! 2071 // Do the table magic!
2055 tree.insertFromTable = true; 2072 tree.insertFromTable = true;
2056 parser._inBodyPhase.processCharacters(token); 2073 parser._inBodyPhase.processCharacters(token);
2057 tree.insertFromTable = false; 2074 tree.insertFromTable = false;
2058 } 2075 }
2059 2076
(...skipping 26 matching lines...) Expand all
2086 return token; 2103 return token;
2087 } 2104 }
2088 2105
2089 Token startTagTable(StartTagToken token) { 2106 Token startTagTable(StartTagToken token) {
2090 parser.parseError(token.span, "unexpected-start-tag-implies-end-tag", 2107 parser.parseError(token.span, "unexpected-start-tag-implies-end-tag",
2091 {"startName": "table", "endName": "table"}); 2108 {"startName": "table", "endName": "table"});
2092 parser.phase.processEndTag(new EndTagToken("table")); 2109 parser.phase.processEndTag(new EndTagToken("table"));
2093 if (!parser.innerHTMLMode) { 2110 if (!parser.innerHTMLMode) {
2094 return token; 2111 return token;
2095 } 2112 }
2113 return null;
2096 } 2114 }
2097 2115
2098 Token startTagStyleScript(StartTagToken token) { 2116 Token startTagStyleScript(StartTagToken token) {
2099 return parser._inHeadPhase.processStartTag(token); 2117 return parser._inHeadPhase.processStartTag(token);
2100 } 2118 }
2101 2119
2102 void startTagInput(StartTagToken token) { 2120 void startTagInput(StartTagToken token) {
2103 if (asciiUpper2Lower(token.data["type"]) == "hidden") { 2121 if (asciiUpper2Lower(token.data["type"]) == "hidden") {
2104 parser.parseError(token.span, "unexpected-hidden-input-in-table"); 2122 parser.parseError(token.span, "unexpected-hidden-input-in-table");
2105 tree.insertElement(token); 2123 tree.insertElement(token);
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
2201 flushCharacters(); 2219 flushCharacters();
2202 parser.phase = originalPhase; 2220 parser.phase = originalPhase;
2203 return true; 2221 return true;
2204 } 2222 }
2205 2223
2206 Token processCharacters(CharactersToken token) { 2224 Token processCharacters(CharactersToken token) {
2207 if (token.data == "\u0000") { 2225 if (token.data == "\u0000") {
2208 return null; 2226 return null;
2209 } 2227 }
2210 characterTokens.add(token); 2228 characterTokens.add(token);
2229 return null;
2211 } 2230 }
2212 2231
2213 Token processSpaceCharacters(SpaceCharactersToken token) { 2232 Token processSpaceCharacters(SpaceCharactersToken token) {
2214 //pretty sure we should never reach here 2233 //pretty sure we should never reach here
2215 characterTokens.add(token); 2234 characterTokens.add(token);
2216 // XXX assert(false); 2235 // XXX assert(false);
2236 return null;
2217 } 2237 }
2218 2238
2219 Token processStartTag(StartTagToken token) { 2239 Token processStartTag(StartTagToken token) {
2220 flushCharacters(); 2240 flushCharacters();
2221 parser.phase = originalPhase; 2241 parser.phase = originalPhase;
2222 return token; 2242 return token;
2223 } 2243 }
2224 2244
2225 Token processEndTag(EndTagToken token) { 2245 Token processEndTag(EndTagToken token) {
2226 flushCharacters(); 2246 flushCharacters();
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after
2676 2696
2677 Token startTagTableOther(StartTagToken token) { 2697 Token startTagTableOther(StartTagToken token) {
2678 if (tree.elementInScope("td", variant: "table") || 2698 if (tree.elementInScope("td", variant: "table") ||
2679 tree.elementInScope("th", variant: "table")) { 2699 tree.elementInScope("th", variant: "table")) {
2680 closeCell(); 2700 closeCell();
2681 return token; 2701 return token;
2682 } else { 2702 } else {
2683 // innerHTML case 2703 // innerHTML case
2684 assert(parser.innerHTMLMode); 2704 assert(parser.innerHTMLMode);
2685 parser.parseError(token.span, "undefined-error"); 2705 parser.parseError(token.span, "undefined-error");
2706 return null;
2686 } 2707 }
2687 } 2708 }
2688 2709
2689 Token startTagOther(StartTagToken token) { 2710 Token startTagOther(StartTagToken token) {
2690 return parser._inBodyPhase.processStartTag(token); 2711 return parser._inBodyPhase.processStartTag(token);
2691 } 2712 }
2692 2713
2693 void endTagTableCell(EndTagToken token) { 2714 void endTagTableCell(EndTagToken token) {
2694 if (tree.elementInScope(token.name, variant: "table")) { 2715 if (tree.elementInScope(token.name, variant: "table")) {
2695 tree.generateImpliedEndTags(token.name); 2716 tree.generateImpliedEndTags(token.name);
(...skipping 16 matching lines...) Expand all
2712 } 2733 }
2713 2734
2714 Token endTagImply(EndTagToken token) { 2735 Token endTagImply(EndTagToken token) {
2715 if (tree.elementInScope(token.name, variant: "table")) { 2736 if (tree.elementInScope(token.name, variant: "table")) {
2716 closeCell(); 2737 closeCell();
2717 return token; 2738 return token;
2718 } else { 2739 } else {
2719 // sometimes innerHTML case 2740 // sometimes innerHTML case
2720 parser.parseError(token.span, "undefined-error"); 2741 parser.parseError(token.span, "undefined-error");
2721 } 2742 }
2743 return null;
2722 } 2744 }
2723 2745
2724 Token endTagOther(EndTagToken token) { 2746 Token endTagOther(EndTagToken token) {
2725 return parser._inBodyPhase.processEndTag(token); 2747 return parser._inBodyPhase.processEndTag(token);
2726 } 2748 }
2727 } 2749 }
2728 2750
2729 class InSelectPhase extends Phase { 2751 class InSelectPhase extends Phase {
2730 InSelectPhase(parser) : super(parser); 2752 InSelectPhase(parser) : super(parser);
2731 2753
(...skipping 28 matching lines...) Expand all
2760 assert(parser.innerHTMLMode); 2782 assert(parser.innerHTMLMode);
2761 } 2783 }
2762 return false; 2784 return false;
2763 } 2785 }
2764 2786
2765 Token processCharacters(CharactersToken token) { 2787 Token processCharacters(CharactersToken token) {
2766 if (token.data == "\u0000") { 2788 if (token.data == "\u0000") {
2767 return null; 2789 return null;
2768 } 2790 }
2769 tree.insertText(token.data, token.span); 2791 tree.insertText(token.data, token.span);
2792 return null;
2770 } 2793 }
2771 2794
2772 void startTagOption(StartTagToken token) { 2795 void startTagOption(StartTagToken token) {
2773 // We need to imply </option> if <option> is the current node. 2796 // We need to imply </option> if <option> is the current node.
2774 if (tree.openElements.last.tagName == "option") { 2797 if (tree.openElements.last.tagName == "option") {
2775 tree.openElements.removeLast(); 2798 tree.openElements.removeLast();
2776 } 2799 }
2777 tree.insertElement(token); 2800 tree.insertElement(token);
2778 } 2801 }
2779 2802
(...skipping 13 matching lines...) Expand all
2793 } 2816 }
2794 2817
2795 Token startTagInput(StartTagToken token) { 2818 Token startTagInput(StartTagToken token) {
2796 parser.parseError(token.span, "unexpected-input-in-select"); 2819 parser.parseError(token.span, "unexpected-input-in-select");
2797 if (tree.elementInScope("select", variant: "select")) { 2820 if (tree.elementInScope("select", variant: "select")) {
2798 endTagSelect(new EndTagToken("select")); 2821 endTagSelect(new EndTagToken("select"));
2799 return token; 2822 return token;
2800 } else { 2823 } else {
2801 assert(parser.innerHTMLMode); 2824 assert(parser.innerHTMLMode);
2802 } 2825 }
2826 return null;
2803 } 2827 }
2804 2828
2805 Token startTagScript(StartTagToken token) { 2829 Token startTagScript(StartTagToken token) {
2806 return parser._inHeadPhase.processStartTag(token); 2830 return parser._inHeadPhase.processStartTag(token);
2807 } 2831 }
2808 2832
2809 Token startTagOther(StartTagToken token) { 2833 Token startTagOther(StartTagToken token) {
2810 parser.parseError(token.span, "unexpected-start-tag-in-select", 2834 parser.parseError(token.span, "unexpected-start-tag-in-select",
2811 {"name": token.name}); 2835 {"name": token.name});
2836 return null;
2812 } 2837 }
2813 2838
2814 void endTagOption(EndTagToken token) { 2839 void endTagOption(EndTagToken token) {
2815 if (tree.openElements.last.tagName == "option") { 2840 if (tree.openElements.last.tagName == "option") {
2816 tree.openElements.removeLast(); 2841 tree.openElements.removeLast();
2817 } else { 2842 } else {
2818 parser.parseError(token.span, "unexpected-end-tag-in-select", 2843 parser.parseError(token.span, "unexpected-end-tag-in-select",
2819 {"name": "option"}); 2844 {"name": "option"});
2820 } 2845 }
2821 } 2846 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
2897 } 2922 }
2898 2923
2899 Token endTagTable(EndTagToken token) { 2924 Token endTagTable(EndTagToken token) {
2900 parser.parseError(token.span, 2925 parser.parseError(token.span,
2901 "unexpected-table-element-end-tag-in-select-in-table", 2926 "unexpected-table-element-end-tag-in-select-in-table",
2902 {"name": token.name}); 2927 {"name": token.name});
2903 if (tree.elementInScope(token.name, variant: "table")) { 2928 if (tree.elementInScope(token.name, variant: "table")) {
2904 endTagOther(new EndTagToken("select")); 2929 endTagOther(new EndTagToken("select"));
2905 return token; 2930 return token;
2906 } 2931 }
2932 return null;
2907 } 2933 }
2908 2934
2909 Token endTagOther(EndTagToken token) { 2935 Token endTagOther(EndTagToken token) {
2910 return parser._inSelectPhase.processEndTag(token); 2936 return parser._inSelectPhase.processEndTag(token);
2911 } 2937 }
2912 } 2938 }
2913 2939
2914 2940
2915 class InForeignContentPhase extends Phase { 2941 class InForeignContentPhase extends Phase {
2916 // TODO(jmesserly): this is sorted so we could binary search. 2942 // TODO(jmesserly): this is sorted so we could binary search.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
2969 token.name = replace; 2995 token.name = replace;
2970 } 2996 }
2971 } 2997 }
2972 2998
2973 Token processCharacters(CharactersToken token) { 2999 Token processCharacters(CharactersToken token) {
2974 if (token.data == "\u0000") { 3000 if (token.data == "\u0000") {
2975 token.data = "\uFFFD"; 3001 token.data = "\uFFFD";
2976 } else if (parser.framesetOK && !allWhitespace(token.data)) { 3002 } else if (parser.framesetOK && !allWhitespace(token.data)) {
2977 parser.framesetOK = false; 3003 parser.framesetOK = false;
2978 } 3004 }
2979 super.processCharacters(token); 3005 return super.processCharacters(token);
2980 } 3006 }
2981 3007
2982 Token processStartTag(StartTagToken token) { 3008 Token processStartTag(StartTagToken token) {
2983 var currentNode = tree.openElements.last; 3009 var currentNode = tree.openElements.last;
2984 if (breakoutElements.contains(token.name) || 3010 if (breakoutElements.contains(token.name) ||
2985 (token.name == "font" && 3011 (token.name == "font" &&
2986 (token.data.containsKey("color") || 3012 (token.data.containsKey("color") ||
2987 token.data.containsKey("face") || 3013 token.data.containsKey("face") ||
2988 token.data.containsKey("size")))) { 3014 token.data.containsKey("size")))) {
2989 3015
(...skipping 14 matching lines...) Expand all
3004 adjustSVGTagNames(token); 3030 adjustSVGTagNames(token);
3005 parser.adjustSVGAttributes(token); 3031 parser.adjustSVGAttributes(token);
3006 } 3032 }
3007 parser.adjustForeignAttributes(token); 3033 parser.adjustForeignAttributes(token);
3008 token.namespace = currentNode.namespace; 3034 token.namespace = currentNode.namespace;
3009 tree.insertElement(token); 3035 tree.insertElement(token);
3010 if (token.selfClosing) { 3036 if (token.selfClosing) {
3011 tree.openElements.removeLast(); 3037 tree.openElements.removeLast();
3012 token.selfClosingAcknowledged = true; 3038 token.selfClosingAcknowledged = true;
3013 } 3039 }
3040 return null;
3014 } 3041 }
3015 } 3042 }
3016 3043
3017 Token processEndTag(EndTagToken token) { 3044 Token processEndTag(EndTagToken token) {
3018 var nodeIndex = tree.openElements.length - 1; 3045 var nodeIndex = tree.openElements.length - 1;
3019 var node = tree.openElements.last; 3046 var node = tree.openElements.last;
3020 if (node.tagName != token.name) { 3047 if (node.tagName != token.name) {
3021 parser.parseError(token.span, "unexpected-end-tag", {"name": token.name}); 3048 parser.parseError(token.span, "unexpected-end-tag", {"name": token.name});
3022 } 3049 }
3023 3050
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
3064 return endTagOther(token); 3091 return endTagOther(token);
3065 } 3092 }
3066 3093
3067 //Stop parsing 3094 //Stop parsing
3068 bool processEOF() => false; 3095 bool processEOF() => false;
3069 3096
3070 Token processComment(CommentToken token) { 3097 Token processComment(CommentToken token) {
3071 // This is needed because data is to be appended to the <html> element 3098 // This is needed because data is to be appended to the <html> element
3072 // here and not to whatever is currently open. 3099 // here and not to whatever is currently open.
3073 tree.insertComment(token, tree.openElements[0]); 3100 tree.insertComment(token, tree.openElements[0]);
3101 return null;
3074 } 3102 }
3075 3103
3076 Token processCharacters(CharactersToken token) { 3104 Token processCharacters(CharactersToken token) {
3077 parser.parseError(token.span, "unexpected-char-after-body"); 3105 parser.parseError(token.span, "unexpected-char-after-body");
3078 parser.phase = parser._inBodyPhase; 3106 parser.phase = parser._inBodyPhase;
3079 return token; 3107 return token;
3080 } 3108 }
3081 3109
3082 Token startTagHtml(StartTagToken token) { 3110 Token startTagHtml(StartTagToken token) {
3083 return parser._inBodyPhase.processStartTag(token); 3111 return parser._inBodyPhase.processStartTag(token);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
3132 if (last.tagName != "html") { 3160 if (last.tagName != "html") {
3133 parser.parseError(last.sourceSpan, "eof-in-frameset"); 3161 parser.parseError(last.sourceSpan, "eof-in-frameset");
3134 } else { 3162 } else {
3135 assert(parser.innerHTMLMode); 3163 assert(parser.innerHTMLMode);
3136 } 3164 }
3137 return false; 3165 return false;
3138 } 3166 }
3139 3167
3140 Token processCharacters(CharactersToken token) { 3168 Token processCharacters(CharactersToken token) {
3141 parser.parseError(token.span, "unexpected-char-in-frameset"); 3169 parser.parseError(token.span, "unexpected-char-in-frameset");
3170 return null;
3142 } 3171 }
3143 3172
3144 void startTagFrameset(StartTagToken token) { 3173 void startTagFrameset(StartTagToken token) {
3145 tree.insertElement(token); 3174 tree.insertElement(token);
3146 } 3175 }
3147 3176
3148 void startTagFrame(StartTagToken token) { 3177 void startTagFrame(StartTagToken token) {
3149 tree.insertElement(token); 3178 tree.insertElement(token);
3150 tree.openElements.removeLast(); 3179 tree.openElements.removeLast();
3151 } 3180 }
3152 3181
3153 Token startTagNoframes(StartTagToken token) { 3182 Token startTagNoframes(StartTagToken token) {
3154 return parser._inBodyPhase.processStartTag(token); 3183 return parser._inBodyPhase.processStartTag(token);
3155 } 3184 }
3156 3185
3157 Token startTagOther(StartTagToken token) { 3186 Token startTagOther(StartTagToken token) {
3158 parser.parseError(token.span, "unexpected-start-tag-in-frameset", 3187 parser.parseError(token.span, "unexpected-start-tag-in-frameset",
3159 {"name": token.name}); 3188 {"name": token.name});
3189 return null;
3160 } 3190 }
3161 3191
3162 void endTagFrameset(EndTagToken token) { 3192 void endTagFrameset(EndTagToken token) {
3163 if (tree.openElements.last.tagName == "html") { 3193 if (tree.openElements.last.tagName == "html") {
3164 // innerHTML case 3194 // innerHTML case
3165 parser.parseError(token.span, 3195 parser.parseError(token.span,
3166 "unexpected-frameset-in-frameset-innerhtml"); 3196 "unexpected-frameset-in-frameset-innerhtml");
3167 } else { 3197 } else {
3168 tree.openElements.removeLast(); 3198 tree.openElements.removeLast();
3169 } 3199 }
(...skipping 28 matching lines...) Expand all
3198 case "html": return endTagHtml(token); 3228 case "html": return endTagHtml(token);
3199 default: return endTagOther(token); 3229 default: return endTagOther(token);
3200 } 3230 }
3201 } 3231 }
3202 3232
3203 // Stop parsing 3233 // Stop parsing
3204 bool processEOF() => false; 3234 bool processEOF() => false;
3205 3235
3206 Token processCharacters(CharactersToken token) { 3236 Token processCharacters(CharactersToken token) {
3207 parser.parseError(token.span, "unexpected-char-after-frameset"); 3237 parser.parseError(token.span, "unexpected-char-after-frameset");
3238 return null;
3208 } 3239 }
3209 3240
3210 Token startTagNoframes(StartTagToken token) { 3241 Token startTagNoframes(StartTagToken token) {
3211 return parser._inHeadPhase.processStartTag(token); 3242 return parser._inHeadPhase.processStartTag(token);
3212 } 3243 }
3213 3244
3214 void startTagOther(StartTagToken token) { 3245 void startTagOther(StartTagToken token) {
3215 parser.parseError(token.span, "unexpected-start-tag-after-frameset", 3246 parser.parseError(token.span, "unexpected-start-tag-after-frameset",
3216 {"name": token.name}); 3247 {"name": token.name});
3217 } 3248 }
(...skipping 14 matching lines...) Expand all
3232 3263
3233 processStartTag(StartTagToken token) { 3264 processStartTag(StartTagToken token) {
3234 if (token.name == 'html') return startTagHtml(token); 3265 if (token.name == 'html') return startTagHtml(token);
3235 return startTagOther(token); 3266 return startTagOther(token);
3236 } 3267 }
3237 3268
3238 bool processEOF() => false; 3269 bool processEOF() => false;
3239 3270
3240 Token processComment(CommentToken token) { 3271 Token processComment(CommentToken token) {
3241 tree.insertComment(token, tree.document); 3272 tree.insertComment(token, tree.document);
3273 return null;
3242 } 3274 }
3243 3275
3244 Token processSpaceCharacters(SpaceCharactersToken token) { 3276 Token processSpaceCharacters(SpaceCharactersToken token) {
3245 return parser._inBodyPhase.processSpaceCharacters(token); 3277 return parser._inBodyPhase.processSpaceCharacters(token);
3246 } 3278 }
3247 3279
3248 Token processCharacters(CharactersToken token) { 3280 Token processCharacters(CharactersToken token) {
3249 parser.parseError(token.span, "expected-eof-but-got-char"); 3281 parser.parseError(token.span, "expected-eof-but-got-char");
3250 parser.phase = parser._inBodyPhase; 3282 parser.phase = parser._inBodyPhase;
3251 return token; 3283 return token;
(...skipping 26 matching lines...) Expand all
3278 case "html": return startTagHtml(token); 3310 case "html": return startTagHtml(token);
3279 case "noframes": return startTagNoFrames(token); 3311 case "noframes": return startTagNoFrames(token);
3280 default: return startTagOther(token); 3312 default: return startTagOther(token);
3281 } 3313 }
3282 } 3314 }
3283 3315
3284 bool processEOF() => false; 3316 bool processEOF() => false;
3285 3317
3286 Token processComment(CommentToken token) { 3318 Token processComment(CommentToken token) {
3287 tree.insertComment(token, tree.document); 3319 tree.insertComment(token, tree.document);
3320 return null;
3288 } 3321 }
3289 3322
3290 Token processSpaceCharacters(SpaceCharactersToken token) { 3323 Token processSpaceCharacters(SpaceCharactersToken token) {
3291 return parser._inBodyPhase.processSpaceCharacters(token); 3324 return parser._inBodyPhase.processSpaceCharacters(token);
3292 } 3325 }
3293 3326
3294 Token processCharacters(CharactersToken token) { 3327 Token processCharacters(CharactersToken token) {
3295 parser.parseError(token.span, "expected-eof-but-got-char"); 3328 parser.parseError(token.span, "expected-eof-but-got-char");
3329 return null;
3296 } 3330 }
3297 3331
3298 Token startTagHtml(StartTagToken token) { 3332 Token startTagHtml(StartTagToken token) {
3299 return parser._inBodyPhase.processStartTag(token); 3333 return parser._inBodyPhase.processStartTag(token);
3300 } 3334 }
3301 3335
3302 Token startTagNoFrames(StartTagToken token) { 3336 Token startTagNoFrames(StartTagToken token) {
3303 return parser._inHeadPhase.processStartTag(token); 3337 return parser._inHeadPhase.processStartTag(token);
3304 } 3338 }
3305 3339
3306 void startTagOther(StartTagToken token) { 3340 void startTagOther(StartTagToken token) {
3307 parser.parseError(token.span, "expected-eof-but-got-start-tag", 3341 parser.parseError(token.span, "expected-eof-but-got-start-tag",
3308 {"name": token.name}); 3342 {"name": token.name});
3309 } 3343 }
3310 3344
3311 Token processEndTag(EndTagToken token) { 3345 Token processEndTag(EndTagToken token) {
3312 parser.parseError(token.span, "expected-eof-but-got-end-tag", 3346 parser.parseError(token.span, "expected-eof-but-got-end-tag",
3313 {"name": token.name}); 3347 {"name": token.name});
3348 return null;
3314 } 3349 }
3315 } 3350 }
3316 3351
3317 3352
3318 /** Error in parsed document. */ 3353 /** Error in parsed document. */
3319 class ParseError implements Exception { 3354 class ParseError implements Exception {
3320 final String errorCode; 3355 final String errorCode;
3321 final Span span; 3356 final Span span;
3322 final Map data; 3357 final Map data;
3323 3358
(...skipping 11 matching lines...) Expand all
3335 * [span.getLocationMessage] will not show any source url information, but 3370 * [span.getLocationMessage] will not show any source url information, but
3336 * [toString] will include 'ParserError:' as a prefix. 3371 * [toString] will include 'ParserError:' as a prefix.
3337 */ 3372 */
3338 String get message => formatStr(errorMessages[errorCode], data); 3373 String get message => formatStr(errorMessages[errorCode], data);
3339 3374
3340 String toString() { 3375 String toString() {
3341 var res = span.getLocationMessage(message); 3376 var res = span.getLocationMessage(message);
3342 return span.sourceUrl == null ? 'ParserError$res' : res; 3377 return span.sourceUrl == null ? 'ParserError$res' : res;
3343 } 3378 }
3344 } 3379 }
OLDNEW
« no previous file with comments | « pkg/third_party/html5lib/lib/dom.dart ('k') | pkg/third_party/html5lib/lib/src/encoding_parser.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698