From 134a7faa4f5d0f60f2a999337c85df5380c1f912 Mon Sep 17 00:00:00 2001 From: Fedor Korotkov Date: Sun, 8 Sep 2013 20:53:58 +0400 Subject: [PATCH] WEB-8731 HTML parser breaks with unquoted complex attributes --- .../src/com/intellij/lexer/_HtmlLexer.flex | 4 +- .../src/com/intellij/lexer/_HtmlLexer.java | 219 +++++++++--------- 2 files changed, 109 insertions(+), 114 deletions(-) diff --git a/xml/xml-psi-impl/src/com/intellij/lexer/_HtmlLexer.flex b/xml/xml-psi-impl/src/com/intellij/lexer/_HtmlLexer.flex index 8def2be62dfb..275c4c957d7e 100644 --- a/xml/xml-psi-impl/src/com/intellij/lexer/_HtmlLexer.flex +++ b/xml/xml-psi-impl/src/com/intellij/lexer/_HtmlLexer.flex @@ -25,7 +25,7 @@ import com.intellij.psi.xml.*; %class _HtmlLexer %public -%implements FlexLexer,ELHostLexer +%implements FlexLexer %function advance %type IElementType %eof{ return; @@ -124,7 +124,7 @@ CONDITIONAL_COMMENT_CONDITION=({ALPHA})({ALPHA}|{WHITE_SPACE_CHARS}|{DIGIT}|"."| return elTokenType2; } - ([^ \n\r\t\f'\"\>]|(\/[^\>]))* { yybegin(TAG_ATTRIBUTES); return XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN; } + [^ \n\r\t\f'\"\>]([^ \n\r\t\f\>]|(\/[^\>]))* { yybegin(TAG_ATTRIBUTES); return XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN; } "\"" { yybegin(ATTRIBUTE_VALUE_DQ); return XmlTokenType.XML_ATTRIBUTE_VALUE_START_DELIMITER; } "'" { yybegin(ATTRIBUTE_VALUE_SQ); return XmlTokenType.XML_ATTRIBUTE_VALUE_START_DELIMITER; } diff --git a/xml/xml-psi-impl/src/com/intellij/lexer/_HtmlLexer.java b/xml/xml-psi-impl/src/com/intellij/lexer/_HtmlLexer.java index e35b5b91c502..d1e78a6d366a 100644 --- a/xml/xml-psi-impl/src/com/intellij/lexer/_HtmlLexer.java +++ b/xml/xml-psi-impl/src/com/intellij/lexer/_HtmlLexer.java @@ -1,54 +1,50 @@ -/* - * Copyright 2000-2009 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* The following code was generated by JFlex 1.4.1 on 01.06.09 13:59 */ +/* The following code was generated by JFlex 1.4.3 on 9/8/13 3:03 PM */ /* It's an automatically generated code. Do not modify it. */ package com.intellij.lexer; import com.intellij.psi.tree.IElementType; -import com.intellij.psi.xml.XmlTokenType; +import com.intellij.psi.*; +import com.intellij.psi.xml.*; /** * This class is a scanner generated by - * JFlex 1.4.1 - * on 01.06.09 13:59 from the specification file - * C:/Trunk/tools/lexer/_HtmlLexer.flex + * JFlex 1.4.3 + * on 9/8/13 3:03 PM from the specification file + * /Users/fedorkorotkov/workspaces/idea/community/xml/xml-psi-impl/src/com/intellij/lexer/_HtmlLexer.flex */ public class _HtmlLexer implements FlexLexer { /** initial size of the lookahead buffer */ private static final int ZZ_BUFFERSIZE = 16384; /** lexical states */ - public static final int PROCESSING_INSTRUCTION = 9; - public static final int C_COMMENT_END = 14; - public static final int END_TAG_NAME = 4; - public static final int START_TAG_NAME = 3; - public static final int ATTRIBUTE_VALUE_SQ = 8; - public static final int DOC_TYPE = 1; - public static final int ATTRIBUTE_VALUE_DQ = 7; + public static final int PROCESSING_INSTRUCTION = 18; + public static final int C_COMMENT_END = 28; + public static final int END_TAG_NAME = 8; + public static final int START_TAG_NAME = 6; + public static final int ATTRIBUTE_VALUE_SQ = 16; + public static final int DOC_TYPE = 2; + public static final int ATTRIBUTE_VALUE_DQ = 14; public static final int YYINITIAL = 0; - public static final int TAG_CHARACTERS = 12; - public static final int START_TAG_NAME2 = 10; - public static final int TAG_ATTRIBUTES = 5; - public static final int COMMENT = 2; - public static final int ATTRIBUTE_VALUE_START = 6; - public static final int C_COMMENT_START = 13; - public static final int END_TAG_NAME2 = 11; + public static final int TAG_CHARACTERS = 24; + public static final int START_TAG_NAME2 = 20; + public static final int TAG_ATTRIBUTES = 10; + public static final int COMMENT = 4; + public static final int ATTRIBUTE_VALUE_START = 12; + public static final int C_COMMENT_START = 26; + public static final int END_TAG_NAME2 = 22; + + /** + * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l + * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l + * at the beginning of a line + * l is of the form l = 2*k, k a non negative integer + */ + private static final int ZZ_LEXSTATE[] = { + 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, + 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14 + }; /** * Translates characters to character classes @@ -129,15 +125,15 @@ public class _HtmlLexer implements FlexLexer { private static final int [] ZZ_ACTION = zzUnpackAction(); private static final String ZZ_ACTION_PACKED_0 = - "\1\1\5\0\1\2\2\0\1\3\5\0\1\1\1\4"+ - "\5\1\1\5\1\6\4\5\1\7\1\5\4\10\1\11"+ - "\1\12\1\13\1\14\2\12\1\15\1\16\1\12\1\17"+ - "\1\2\1\20\1\21\2\2\1\22\1\23\4\22\1\3"+ - "\1\24\1\5\1\25\3\26\1\27\1\10\3\27\1\30"+ - "\1\31\1\32\1\0\1\33\1\34\15\0\1\34\1\35"+ - "\2\2\3\0\1\36\2\0\1\37\1\40\1\41\1\42"+ - "\11\0\1\43\1\44\1\0\1\45\1\2\1\45\1\46"+ - "\1\0\1\47\3\0\1\15\3\0\1\50\2\0\1\51"; + "\1\1\10\0\1\2\5\0\1\1\1\3\5\1\1\4"+ + "\1\5\4\4\1\6\1\4\4\7\1\10\1\11\1\12"+ + "\1\13\2\11\1\14\1\15\1\11\1\16\1\17\1\20"+ + "\1\21\2\17\1\22\1\23\4\22\1\2\1\24\1\4"+ + "\1\25\3\26\1\27\1\7\3\27\1\30\1\31\1\32"+ + "\1\0\1\33\1\34\15\0\1\34\1\35\2\17\3\0"+ + "\1\36\2\0\1\37\1\40\1\41\1\42\11\0\1\43"+ + "\1\44\1\0\1\45\1\17\1\45\1\46\1\0\1\47"+ + "\3\0\1\14\3\0\1\50\2\0\1\51"; private static int [] zzUnpackAction() { int [] result = new int[129]; @@ -239,49 +235,48 @@ public class _HtmlLexer implements FlexLexer { "\33\0\2\123\47\0\2\124\50\0\1\125\70\0\1\126"+ "\51\0\2\45\1\0\3\45\5\0\24\45\15\0\7\45"+ "\47\0\1\127\15\0\2\51\1\0\3\51\5\0\24\51"+ - "\15\0\7\51\43\0\1\130\20\0\3\55\1\0\4\55"+ - "\2\0\31\55\1\0\3\55\1\131\17\55\1\0\4\55"+ - "\2\0\27\55\1\132\1\55\1\0\3\55\1\131\57\55"+ - "\1\130\3\55\1\131\14\55\41\0\1\133\62\0\1\62"+ - "\64\0\1\134\22\0\43\70\1\0\2\70\1\135\60\70"+ - "\1\71\20\70\1\0\2\73\1\0\3\73\5\0\24\73"+ - "\15\0\7\73\1\0\3\100\1\0\1\100\5\0\25\100"+ - "\4\0\2\100\7\0\7\100\43\0\1\136\21\0\2\105"+ - "\1\0\3\105\5\0\24\105\15\0\7\105\1\0\2\106"+ - "\1\0\3\106\5\0\24\106\15\0\7\106\6\0\1\137"+ - "\5\0\1\140\50\0\1\141\2\0\1\141\2\0\1\142"+ - "\4\0\24\141\15\0\7\141\42\112\1\143\21\112\1\0"+ - "\2\113\1\0\3\113\5\0\24\113\14\0\1\144\7\113"+ - "\2\0\1\145\57\0\1\146\2\0\2\113\1\0\3\113"+ - "\5\0\5\113\1\147\16\113\14\0\1\144\7\113\1\0"+ - "\2\113\1\0\3\113\5\0\10\113\1\150\3\113\1\151"+ - "\7\113\14\0\1\144\7\113\1\0\2\113\1\0\3\113"+ - "\5\0\20\113\1\152\3\113\14\0\1\144\7\113\1\0"+ - "\2\113\1\0\3\113\5\0\22\113\1\153\1\113\14\0"+ - "\1\144\7\113\35\0\2\154\54\0\2\155\36\0\1\125"+ - "\37\0\1\156\70\0\1\157\13\0\43\55\1\0\3\55"+ - "\1\131\14\55\3\132\1\160\4\132\2\160\30\132\1\161"+ - "\1\160\3\132\1\162\14\132\10\133\1\0\31\133\1\163"+ - "\21\133\11\134\1\0\30\134\1\163\21\134\43\70\1\0"+ - "\20\70\6\0\1\164\72\0\2\165\46\0\2\141\1\0"+ - "\3\141\5\0\24\141\15\0\7\141\1\0\2\142\1\0"+ - "\3\142\5\0\24\142\15\0\7\142\2\0\1\145\51\0"+ - "\1\166\11\0\1\167\11\0\1\167\2\0\1\167\5\0"+ - "\1\167\7\0\2\167\17\0\1\167\4\0\1\167\1\0"+ - "\2\113\1\0\3\113\5\0\24\113\14\0\1\166\7\113"+ - "\1\0\2\113\1\0\3\113\5\0\2\113\1\170\21\113"+ - "\14\0\1\144\7\113\1\0\2\113\1\0\3\113\5\0"+ - "\10\113\1\147\13\113\14\0\1\144\7\113\1\0\2\113"+ - "\1\0\3\113\5\0\2\113\1\115\21\113\14\0\1\144"+ - "\7\113\1\0\2\113\1\0\3\113\5\0\24\113\14\0"+ - "\1\144\2\113\1\151\4\113\31\0\2\171\62\0\2\172"+ - "\31\0\42\160\1\163\21\160\42\132\1\161\1\160\3\132"+ - "\1\162\14\132\17\0\1\173\46\0\1\167\11\0\1\167"+ - "\2\0\1\167\5\0\1\167\7\0\2\167\15\0\1\166"+ - "\1\0\1\167\4\0\1\167\1\0\2\113\1\0\3\113"+ - "\5\0\24\113\14\0\1\144\2\113\1\147\4\113\37\0"+ - "\1\174\44\0\2\175\61\0\1\176\66\0\1\177\64\0"+ - "\2\200\64\0\1\201\36\0"; + "\15\0\7\51\43\0\1\130\20\0\3\55\1\0\37\55"+ + "\1\0\3\55\1\131\17\55\1\0\35\55\1\132\1\55"+ + "\1\0\3\55\1\131\17\55\1\0\37\55\1\130\3\55"+ + "\1\131\14\55\41\0\1\133\62\0\1\62\64\0\1\134"+ + "\22\0\43\70\1\0\2\70\1\135\60\70\1\71\20\70"+ + "\1\0\2\73\1\0\3\73\5\0\24\73\15\0\7\73"+ + "\1\0\3\100\1\0\1\100\5\0\25\100\4\0\2\100"+ + "\7\0\7\100\43\0\1\136\21\0\2\105\1\0\3\105"+ + "\5\0\24\105\15\0\7\105\1\0\2\106\1\0\3\106"+ + "\5\0\24\106\15\0\7\106\6\0\1\137\5\0\1\140"+ + "\50\0\1\141\2\0\1\141\2\0\1\142\4\0\24\141"+ + "\15\0\7\141\42\112\1\143\21\112\1\0\2\113\1\0"+ + "\3\113\5\0\24\113\14\0\1\144\7\113\2\0\1\145"+ + "\57\0\1\146\2\0\2\113\1\0\3\113\5\0\5\113"+ + "\1\147\16\113\14\0\1\144\7\113\1\0\2\113\1\0"+ + "\3\113\5\0\10\113\1\150\3\113\1\151\7\113\14\0"+ + "\1\144\7\113\1\0\2\113\1\0\3\113\5\0\20\113"+ + "\1\152\3\113\14\0\1\144\7\113\1\0\2\113\1\0"+ + "\3\113\5\0\22\113\1\153\1\113\14\0\1\144\7\113"+ + "\35\0\2\154\54\0\2\155\36\0\1\125\37\0\1\156"+ + "\70\0\1\157\13\0\43\55\1\0\3\55\1\131\14\55"+ + "\3\132\1\160\36\132\1\161\1\160\3\132\1\162\14\132"+ + "\10\133\1\0\31\133\1\163\21\133\11\134\1\0\30\134"+ + "\1\163\21\134\43\70\1\0\20\70\6\0\1\164\72\0"+ + "\2\165\46\0\2\141\1\0\3\141\5\0\24\141\15\0"+ + "\7\141\1\0\2\142\1\0\3\142\5\0\24\142\15\0"+ + "\7\142\2\0\1\145\51\0\1\166\11\0\1\167\11\0"+ + "\1\167\2\0\1\167\5\0\1\167\7\0\2\167\17\0"+ + "\1\167\4\0\1\167\1\0\2\113\1\0\3\113\5\0"+ + "\24\113\14\0\1\166\7\113\1\0\2\113\1\0\3\113"+ + "\5\0\2\113\1\170\21\113\14\0\1\144\7\113\1\0"+ + "\2\113\1\0\3\113\5\0\10\113\1\147\13\113\14\0"+ + "\1\144\7\113\1\0\2\113\1\0\3\113\5\0\2\113"+ + "\1\115\21\113\14\0\1\144\7\113\1\0\2\113\1\0"+ + "\3\113\5\0\24\113\14\0\1\144\2\113\1\151\4\113"+ + "\31\0\2\171\62\0\2\172\31\0\42\160\1\163\21\160"+ + "\42\132\1\161\1\160\3\132\1\162\14\132\17\0\1\173"+ + "\46\0\1\167\11\0\1\167\2\0\1\167\5\0\1\167"+ + "\7\0\2\167\15\0\1\166\1\0\1\167\4\0\1\167"+ + "\1\0\2\113\1\0\3\113\5\0\24\113\14\0\1\144"+ + "\2\113\1\147\4\113\37\0\1\174\44\0\2\175\61\0"+ + "\1\176\66\0\1\177\64\0\2\200\64\0\1\201\36\0"; private static int [] zzUnpackTrans() { int [] result = new int[4576]; @@ -325,14 +320,14 @@ public class _HtmlLexer implements FlexLexer { private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\1\1\5\0\1\1\2\0\1\1\5\0\2\1\1\11"+ - "\4\1\1\11\5\1\1\11\1\1\1\11\3\1\2\11"+ - "\1\1\1\11\3\1\1\11\1\1\1\11\1\1\2\11"+ - "\2\1\2\11\5\1\1\11\2\1\1\11\2\1\1\11"+ - "\4\1\1\11\2\1\1\0\1\11\1\1\15\0\2\11"+ - "\2\1\3\0\1\11\2\0\2\1\2\11\11\0\2\11"+ - "\1\0\2\1\2\11\1\0\1\11\3\0\1\11\3\0"+ - "\1\11\2\0\1\11"; + "\1\1\10\0\1\1\5\0\2\1\1\11\4\1\1\11"+ + "\5\1\1\11\1\1\1\11\3\1\2\11\1\1\1\11"+ + "\3\1\1\11\1\1\1\11\1\1\2\11\2\1\2\11"+ + "\5\1\1\11\2\1\1\11\2\1\1\11\4\1\1\11"+ + "\2\1\1\0\1\11\1\1\15\0\2\11\2\1\3\0"+ + "\1\11\2\0\2\1\2\11\11\0\2\11\1\0\2\1"+ + "\2\11\1\0\1\11\3\0\1\11\3\0\1\11\2\0"+ + "\1\11"; private static int [] zzUnpackAttribute() { int [] result = new int[129]; @@ -605,14 +600,14 @@ public class _HtmlLexer implements FlexLexer { zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; - zzState = zzLexicalState; + zzState = ZZ_LEXSTATE[zzLexicalState]; zzForAction: { while (true) { if (zzCurrentPosL < zzEndReadL) - zzInput = zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++]:zzBufferL.charAt(zzCurrentPosL++); + zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++)); else if (zzAtEOF) { zzInput = YYEOF; break zzForAction; @@ -632,7 +627,7 @@ public class _HtmlLexer implements FlexLexer { break zzForAction; } else { - zzInput = zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++]:zzBufferL.charAt(zzCurrentPosL++); + zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++)); } } int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; @@ -665,7 +660,7 @@ public class _HtmlLexer implements FlexLexer { { return XmlTokenType.XML_TAG_CHARACTERS; } case 44: break; - case 15: + case 14: { yybegin(ATTRIBUTE_VALUE_START); return XmlTokenType.XML_EQ; } case 45: break; @@ -673,7 +668,7 @@ public class _HtmlLexer implements FlexLexer { { return elTokenType; } case 46: break; - case 13: + case 12: { return XmlTokenType.XML_NAME; } case 47: break; @@ -681,7 +676,7 @@ public class _HtmlLexer implements FlexLexer { { yybegin(TAG_ATTRIBUTES); return XmlTokenType.XML_ATTRIBUTE_VALUE_END_DELIMITER; } case 48: break; - case 10: + case 9: { yybegin(YYINITIAL); yypushback(1); break; } case 49: break; @@ -693,7 +688,7 @@ public class _HtmlLexer implements FlexLexer { { yybegin(COMMENT); return XmlTokenType.XML_COMMENT_START; } case 51: break; - case 4: + case 3: { return XmlTokenType.XML_REAL_WHITE_SPACE; } case 52: break; @@ -713,11 +708,11 @@ public class _HtmlLexer implements FlexLexer { { yybegin(END_TAG_NAME2); yypushback(yylength()); } case 56: break; - case 5: + case 4: { return XmlTokenType.XML_BAD_CHARACTER; } case 57: break; - case 14: + case 13: { yybegin(YYINITIAL); return XmlTokenType.XML_TAG_END; } case 58: break; @@ -737,7 +732,7 @@ public class _HtmlLexer implements FlexLexer { { yybegin(DOC_TYPE); return XmlTokenType.XML_DOCTYPE_START; } case 62: break; - case 3: + case 2: { return XmlTokenType.XML_PI_TARGET; } case 63: break; @@ -753,7 +748,7 @@ public class _HtmlLexer implements FlexLexer { { yybegin(PROCESSING_INSTRUCTION); return XmlTokenType.XML_PI_START; } case 66: break; - case 9: + case 8: { yybegin(C_COMMENT_START); return XmlTokenType.XML_CONDITIONAL_COMMENT_START; } case 67: break; @@ -761,7 +756,7 @@ public class _HtmlLexer implements FlexLexer { { yybegin(TAG_CHARACTERS); return XmlTokenType.XML_NAME; } case 68: break; - case 7: + case 6: { yybegin(YYINITIAL); return XmlTokenType.XML_DOCTYPE_END; } case 69: break; @@ -769,11 +764,11 @@ public class _HtmlLexer implements FlexLexer { { return XmlTokenType.XML_CHAR_ENTITY_REF; } case 70: break; - case 12: + case 11: { return XmlTokenType.XML_START_TAG_START; } case 71: break; - case 6: + case 5: { return XmlTokenType.XML_WHITE_SPACE; } case 72: break; @@ -801,7 +796,7 @@ public class _HtmlLexer implements FlexLexer { { yybegin(ATTRIBUTE_VALUE_SQ); return XmlTokenType.XML_ATTRIBUTE_VALUE_START_DELIMITER; } case 78: break; - case 11: + case 10: { yybegin(TAG_ATTRIBUTES); return XmlTokenType.XML_NAME; } case 79: break; @@ -809,11 +804,11 @@ public class _HtmlLexer implements FlexLexer { { yybegin(START_TAG_NAME2); yypushback(yylength()); } case 80: break; - case 2: + case 15: { yybegin(TAG_ATTRIBUTES); return XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN; } case 81: break; - case 8: + case 7: { return XmlTokenType.XML_COMMENT_CHARACTERS; } case 82: break;