@@ -46,7 +46,7 @@ export const build = (statics) => {
4646 let quote = '' ;
4747 let fallbackPropValue = true ;
4848 let current = [ ] ;
49- let char , propName ;
49+ let char , propName , idx ;
5050
5151 const commit = field => {
5252 if ( mode === MODE_TEXT ) {
@@ -86,61 +86,56 @@ export const build = (statics) => {
8686 for ( let j = 0 ; j < statics [ i ] . length ; j ++ ) {
8787 char = statics [ i ] . charAt ( j ) ;
8888
89- if ( mode === MODE_TEXT ) {
90- if ( char === '<' ) {
91- // commit buffer
92- commit ( ) ;
93- current = [ current ] ;
94- mode = MODE_TAGNAME ;
95- continue ;
96- }
97- }
98- else if ( quote === char ) {
99- quote = '' ;
100- continue ;
89+ if ( mode === MODE_TEXT && char === '<' ) {
90+ // commit buffer
91+ commit ( ) ;
92+ current = [ current ] ;
93+ mode = MODE_TAGNAME ;
10194 }
102- else if ( ! quote ) {
103- switch ( char ) {
104- case '"' :
105- case "'" :
106- quote = char ;
107- continue ;
108- case '>' :
109- commit ( ) ;
95+ else if ( mode !== MODE_TEXT && ( idx = '\'">=/\t\n\r ' . indexOf ( char ) ) >= 0 && char . indexOf ( quote ) >= 0 ) {
96+ if ( idx < 2 ) {
97+ // char is a quote && (quote === char || quote is empty)
98+ quote = quote ? '' : char ;
99+ }
100+ else if ( idx === 2 ) {
101+ // char === '>'
102+ commit ( ) ;
110103
111- if ( ! mode ) {
112- if ( current . length === 1 ) {
113- current = current [ 0 ] ;
114- }
115- current [ 0 ] . push ( 0 , current , CHILD_RECURSE ) ;
104+ if ( ! mode ) {
105+ // encountered a slash in current tag
106+
107+ if ( current . length === 1 ) {
108+ // no tag name or attributes before the slash
116109 current = current [ 0 ] ;
117110 }
118- mode = MODE_TEXT ;
119- continue ;
120- case '=' :
121- if ( mode ) {
122- mode = MODE_ATTRIBUTE ;
123- propName = buffer ;
124- buffer = fallbackPropValue = '' ;
125- }
126- continue ;
127- case '/' :
128- commit ( ) ;
129- mode = MODE_SLASH ;
130- continue ;
131- case '\t' :
132- case '\r' :
133- case '\n' :
134- case ' ' :
135- if ( mode ) {
136- // <a disabled>
137- commit ( ) ;
138- mode = MODE_WHITESPACE ;
139- }
140- continue ;
111+ current [ 0 ] . push ( 0 , current , CHILD_RECURSE ) ;
112+ current = current [ 0 ] ;
113+ }
114+ mode = MODE_TEXT ;
115+ }
116+ else if ( idx === 3 ) {
117+ // char === '='
118+ if ( mode ) {
119+ mode = MODE_ATTRIBUTE ;
120+ propName = buffer ;
121+ buffer = fallbackPropValue = '' ;
122+ }
123+ }
124+ else if ( idx === 4 ) {
125+ // char === '/'
126+ commit ( ) ;
127+ mode = MODE_SLASH ;
141128 }
129+ else if ( mode ) {
130+ // char is a whitespace
131+ // <a disabled>
132+ commit ( ) ;
133+ mode = MODE_WHITESPACE ;
134+ }
135+ }
136+ else {
137+ buffer += char ;
142138 }
143- buffer += char ;
144139 }
145140 }
146141 commit ( ) ;
0 commit comments