var X_HTMLParser_CHARS = {\r
'A':1,'B':1,'C':1,'D':1,'E':1,'F':1,'G':1,'H':1,'I':1,'J':1,'K':1,'L':1,'M':1,'N':1,'O':1,'P':1,'Q':1,'R':1,'S':1,'T':1,'U':1,'V':1,'W':1,'X':1,'Y':1,'Z':1,\r
'a':2,'b':2,'c':2,'d':2,'e':2,'f':2,'g':2,'h':2,'i':2,'j':2,'k':2,'l':2,'m':2,'n':2,'o':2,'p':2,'q':2,'r':2,'s':2,'t':2,'u':2,'v':2,'w':2,'x':2,'y':2,'z':2,\r
- // "0" ': 4, "1" : 4, "2" : 4, "3" : 4, "4" : 4, "5" : 4, "6" : 4, "7" : 4, "8" : 4, "9" : 4, closure compiler で minify すると ie4 で error、eval使う\r
+ '!':1,// "0" ': 4, "1" : 4, "2" : 4, "3" : 4, "4" : 4, "5" : 4, "6" : 4, "7" : 4, "8" : 4, "9" : 4, closure compiler で minify すると ie4 で error、eval使う\r
\r
'\t' : 16, '\r\n' : 16, '\r' : 16, '\n' : 16, '\f' : 16, '\b' : 16, ' ' : 16\r
},\r
var special = X_HTMLParser_special,\r
//plainText = X_HTMLParser_plainText,\r
startTime = async && X_Timer_now(),\r
- _parseStartTag = X_HTMLParser__parseStartTag,\r
- _parseEndTag = X_HTMLParser__parseEndTag,\r
stack = async ? async[ 1 ] : [],\r
lastHtml = html,\r
chars, last, text, index;\r
last = stack[ stack.length - 1 ];\r
\r
// Make sure we're not in a script or style element\r
- if ( last && special[ last ] === 1 ) {\r
- if( 0 <= ( index = html.toUpperCase().indexOf( '</' + last ) ) ){\r
+ if ( last && special[ handler.isXML ? last.toUpperCase() : last ] === 1 ) {\r
+ if( 0 <= ( index = html.toUpperCase().indexOf( '</' + ( handler.isXML ? last.toUpperCase() : last ) ) ) ){\r
handler.chars( html.substring( 0, index ) );\r
- if( index = _parseEndTag( stack, handler, html ) ){\r
+ if( index = X_HTMLParser__parseEndTag( stack, handler, html ) ){\r
html = html.substring( index );\r
} else {\r
handler.chars( html );\r
\r
// end tag\r
} else if ( html.indexOf("</") === 0 ) {\r
- if ( 2 < ( index = _parseEndTag( stack, handler, html ) ) ) {\r
+ if ( 2 < ( index = X_HTMLParser__parseEndTag( stack, handler, html ) ) ) {\r
html = html.substring( index );\r
chars = false;\r
};\r
\r
// start tag\r
} else if ( html.indexOf("<") === 0 ) {\r
- if( index = _parseStartTag( stack, last, handler, html ) ){\r
+ if( index = X_HTMLParser__parseStartTag( stack, last, handler, html ) ){\r
html = html.substring( index );\r
chars = false;\r
} else\r
i = 0,\r
attrs = [],\r
tagName, empty = false,\r
- chr, start, attrName, quot, escape;\r
+ chr, start, attrName, quot, escape, tagUpper;\r
\r
while( i < l && phase < 9 ){\r
chr = html.charAt( i );\r
};\r
if( phase === 9 ){\r
if( empty ) ++i;\r
- if( X_HTMLParser_parseStartTag( stack, last, handler, tagName.toUpperCase(), attrs, empty, i ) === false ) return false;\r
+ //if( X_HTMLParser_parseStartTag( stack, last, handler, tagName, attrs, empty, i ) === false ) return false;\r
+ \r
+ tagUpper = tagName.toUpperCase();\r
+ \r
+ if( !X_HTMLParser_skipFixNesting && X_HTMLParser_block[ tagUpper ] === 1 ){\r
+ while( last && X_HTMLParser_inline[ handler.isXML ? last.toUpperCase() : last ] === 1 ){\r
+ X_HTMLParser_parseEndTag( stack, handler, last );\r
+ last = stack[ stack.length - 1 ];\r
+ };\r
+ };\r
+ last && X_HTMLParser_closeSelf[ tagUpper ] === 1 &&\r
+ ( last === tagName || ( X_HTMLParser_sisters[ tagUpper ] && X_HTMLParser_sisters[ tagUpper ][ handler.isXML ? last.toUpperCase() : last ] === 1 ) ) &&\r
+ X_HTMLParser_parseEndTag( stack, handler, last );\r
+ empty = empty || X_Dom_DTD_EMPTY[ tagUpper ];\r
+ !empty && ( stack[ stack.length ] = handler.isXML ? tagName : tagUpper );\r
+ \r
+ if( handler.start( handler.isXML ? tagName : tagUpper, attrs, empty, i ) === false ) return false;\r
+ \r
return i;\r
};\r
return 0; // error\r
++i;\r
};\r
if( phase === 9 ){\r
- X_HTMLParser_parseEndTag( stack, handler, tagName.toUpperCase() );\r
+ X_HTMLParser_parseEndTag( stack, handler, handler.isXML ? tagName : tagName.toUpperCase() );\r
return i;\r
};\r
return 0; // error\r
};\r
};\r
\r
- function X_HTMLParser_parseStartTag( stack, last, handler, tagName, attrs, empty, index ) {\r
- var inline = X_HTMLParser_inline,\r
- parseEndTag = X_HTMLParser_parseEndTag,\r
- sisters = X_HTMLParser_sisters;\r
- if( !X_HTMLParser_skipFixNesting && X_HTMLParser_block[ tagName ] === 1 ){\r
- while( last && inline[ last ] === 1 ){\r
- parseEndTag( stack, handler, last );\r
- last = stack[ stack.length - 1 ];\r
- };\r
- };\r
- last && X_HTMLParser_closeSelf[ tagName ] === 1 && ( last === tagName || ( sisters[ tagName ] && sisters[ tagName ][ last ] === 1 ) ) && parseEndTag( stack, handler, last );\r
- empty = empty || X_Dom_DTD_EMPTY[ tagName ];\r
- !empty && ( stack[ stack.length ] = tagName );\r
- \r
- return handler.start( tagName, attrs, empty, index );\r
- };\r
-\r
function X_HTMLParser_parseEndTag( stack, handler, tagName ) {\r
var pos = 0, i = stack.length;\r
// If no tag name is provided, clean shop\r
var X_HTMLParser_htmlStringToXNode = {\r
flat : null,\r
nest : [],\r
+ isXML : false,\r
err : function( html ){\r
X_HTMLParser_htmlStringToXNode.flat.length = 0;\r
!X_HTMLParser_htmlStringToXNode.ignoreError && X.Logger.warn( 'X_Dom_Parser() error ' + html );\r
};\r
\r
var X_HTMLParser_asyncHtmlStringToXNode = {\r
+ isXML : false,\r
err : function( html ){\r
X_HTMLParser_htmlStringToXNode.err( html );\r
this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r