// (and which close themselves)\r
closeSelf : {colgroup:1,dd:1,dt:1,li:1,options:1,p:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1}, // add tbody\r
\r
- // todo:\r
- plainText : { plaintext : 1, xmp : 1 },\r
-\r
sisters : {\r
th : { td : 1 },\r
td : { th : 1 },\r
fillAttrs : X.Dom.Attr.noValue, //{checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};\r
\r
// Special Elements (can contain anything)\r
- special : {script:1,style:1},\r
+ special : { script : 1, style : 1, plaintext : 1, xmp : 1, textarea : 1 },\r
\r
- start : function( html, handler, async ){\r
+ exec : function( html, handler, async ){\r
var special = X.Dom.Parser.special,\r
+ plainText = X.Dom.Parser.plainText,\r
startTime = async && X.getTime(),\r
_parseStartTag = X.Dom.Parser._parseStartTag,\r
_parseEndTag = X.Dom.Parser._parseEndTag,\r
\r
// Make sure we're not in a script or style element\r
if ( last && special[ last.toLowerCase() ] === 1 ) {\r
- if( 0 <= ( index = _parseEndTag( stack, handler, html ) ) ){\r
- //handler.chars( html.substring( 0, index ) );\r
- html = html.substring( index );\r
+ if( 0 <= ( index = html.toLowerCase().indexOf( '</' + last.toLowerCase() ) ) ){\r
+ handler.chars( html.substring( 0, index ) );\r
+ if( index = _parseEndTag( stack, handler, html ) ){\r
+ html = html.substring( index );\r
+ } else {\r
+ handler.chars( html );\r
+ html = '';\r
+ };\r
+ } else {\r
+ handler.chars( html );\r
+ html = '';\r
};\r
} else {\r
// Comment\r
\r
if( async && startTime + 15 <= X.getTime() && html ){\r
handler.progress( 1 - html.length / async[ 0 ] );\r
- X.Timer.once( 0, X.Dom.Parser.start, [ html, handler, async ] );\r
+ X.Timer.once( 0, X.Dom.Parser.exec, [ html, handler, async ] );\r
return;\r
};\r
\r
l = html.length,\r
i = 0,\r
attrs = [],\r
- tagName, empty,\r
+ tagName, empty = false,\r
chr, start, attrName, quot, escape;\r
\r
while( i < l && phase < 9 ){\r
( ( phase = 3 ) && saveAttr( attrs, attrName, html.substring( start, i ) ) ) :\r
( chr === '>' ) ?\r
( ( phase = 9 ) && saveAttr( attrs, attrName, html.substring( start, i ) ) ) :\r
- ( !escape && uri.indexOf( attrName ) === -1 && html.substr( i, 2 ) === '\/>' ) && // attr の val が uri で / で終わりかつ、未対応属性の場合\r
- ( empty = true );\r
+ !escape && !uri[ attrName ] && ( empty = html.substr( i, 2 ) === '/>' ) && // attr の val が uri で / で終わりかつ、未対応属性の場合\r
+ ( phase = 9 );\r
break;\r
};\r
escape = chr === '\\' && !escape; // \\\\ is not escape for "\r
++i;\r
};\r
if( phase === 9 ){\r
+ if( empty ) ++i;\r
if( X.Dom.Parser.parseStartTag( stack, last, handler, tagName, attrs, empty, i ) === false ) return false;\r
return i;\r
};\r
( chr === '>' ) && ( phase = 9 );\r
( phase !== 2 ) && ( tagName = html.substring( start, i ) );\r
break;\r
- case 3 : // 属性名の開始を待つ\r
+ case 3 : // タグの終了を待つ\r
chr === '>' && ( phase = 9 );\r
break;\r
};\r
};\r
};\r
X.Dom.Parser.closeSelf[ tagLower ] === 1 && ( last === tagName || ( sisters[ tagLower ] && sisters[ tagLower ][ last.toLowerCase() ] === 1 ) ) && parseEndTag( stack, handler, last );\r
- unary = X.Dom.Parser.empty[ tagLower ] === 1 || !!unary;\r
+ unary = unary || X.Dom.Parser.empty[ tagName.toUpperCase() ];\r
!unary && ( stack[ stack.length ] = tagName );\r
\r
return handler.start( tagName, attrs, unary, index );\r
worker.flat = [];\r
worker.nest.length = 0;\r
worker.ignoreError = ignoreError;\r
- X.Dom.Parser.start( html, worker );\r
+ X.Dom.Parser.exec( html, worker );\r
ret = worker.flat;\r
delete worker.flat;\r
return ret;\r
X.Dom._htmlStringToXNode.err( html );\r
this.asyncDispatch( 0, { type : X.Event.ERROR } );\r
},\r
- start : function( tagName, attrs, noChild, length ){\r
- X.Dom._htmlStringToXNode.start( tagName, attrs, noChild, length );\r
- },\r
- end : function(){\r
- X.Dom._htmlStringToXNode.end();\r
- },\r
- chars : function( text ){\r
- X.Dom._htmlStringToXNode.chars( text );\r
- },\r
+ start : X.Dom._htmlStringToXNode.start,\r
+ end : X.Dom._htmlStringToXNode.end,\r
+ chars : X.Dom._htmlStringToXNode.chars,\r
comment : X.emptyFunction,\r
\r
progress : function( pct ){\r
worker.flat = [];\r
worker.nest.length = 0;\r
worker.ignoreError = ignoreError;\r
- X.Dom.Parser.start( html, dispatcher, [ html.length, [] ] );\r
+ X.Dom.Parser.exec( html, dispatcher, [ html.length, [] ] );\r
return dispatcher;\r
};\r