WEB-8731 HTML parser breaks with unquoted complex attributes

This commit is contained in:
Fedor Korotkov
2013-09-08 20:56:12 +04:00
parent 482c517f0d
commit 134a7faa4f
2 changed files with 109 additions and 114 deletions
@@ -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;
}
<ATTRIBUTE_VALUE_START> ([^ \n\r\t\f'\"\>]|(\/[^\>]))* { yybegin(TAG_ATTRIBUTES); return XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN; }
<ATTRIBUTE_VALUE_START> [^ \n\r\t\f'\"\>]([^ \n\r\t\f\>]|(\/[^\>]))* { yybegin(TAG_ATTRIBUTES); return XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN; }
<ATTRIBUTE_VALUE_START> "\"" { yybegin(ATTRIBUTE_VALUE_DQ); return XmlTokenType.XML_ATTRIBUTE_VALUE_START_DELIMITER; }
<ATTRIBUTE_VALUE_START> "'" { yybegin(ATTRIBUTE_VALUE_SQ); return XmlTokenType.XML_ATTRIBUTE_VALUE_START_DELIMITER; }
@@ -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
* <a href="http://www.jflex.de/">JFlex</a> 1.4.1
* on 01.06.09 13:59 from the specification file
* <tt>C:/Trunk/tools/lexer/_HtmlLexer.flex</tt>
* <a href="http://www.jflex.de/">JFlex</a> 1.4.3
* on 9/8/13 3:03 PM from the specification file
* <tt>/Users/fedorkorotkov/workspaces/idea/community/xml/xml-psi-impl/src/com/intellij/lexer/_HtmlLexer.flex</tt>
*/
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;