*/\r
\r
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
+ '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
+ '!':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
- X_HTMLParser_alphabets = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\r
- X_HTMLParser_whiteSpace = '\t\r\n\f\b ',\r
\r
// Empty Elements - HTML 4.01\r
- X_HTMLParser_empty = X_Dom_DTD_EMPTY,\r
+ // X_Dom_DTD_EMPTY\r
\r
// Block Elements - HTML 4.01\r
- X_HTMLParser_block = {ADDRESS:1,APPLET:1,BLOCKQUOTE:1,BUTTON:1,CENTER:1,DD:1,DEL:1,DIR:1,DIV:1,DL:1,DT:1,FIELDSET:1,FORM:1,FRAMESET:1,HR:1,IFRAME:1,INS:1,\r
- ISINDEX:1,LI:1,MAP:1,MENU:1,NOFRAMES:1,NOSCRIPT:1,OBJECT:1,OL:1,P:1,PRE:1,SCRIPT:1,TABLE:1,TBODY:1,TD:1,TFOOT:1,TH:1,THEAD:1,TR:1,UL:1 },\r
+ X_HTMLParser_block = {'ADDRESS':1,'APPLET':1,'BLOCKQUOTE':1,'BUTTON':1,'CENTER':1,'DD':1,'DEL':1,'DIR':1,'DIV':1,'DL':1,'DT':1,'FIELDSET':1,'FORM':1,'FRAMESET':1,'HR':1,'IFRAME':1,'INS':1,\r
+ 'ISINDEX':1,'LI':1,'MAP':1,'MENU':1,'NOFRAMES':1,'NOSCRIPT':1,'OBJECT':1,'OL':1,'P':1,'PRE':1,'SCRIPT':1,'TABLE':1,'TBODY':1,'TD':1,'TFOOT':1,'TH':1,'THEAD':1,'TR':1,'UL':1 },\r
// Inline Elements - HTML 4.01\r
- X_HTMLParser_inline = {A:1,ABBR:1,ACRONYM:1,APPLET:1,B:1,BASEFONT:1,BDO:1,BIG:1,BR:1,BUTTON:1,CITE:1,CODE:1,DEL:1,DFN:1,EM:1,FONT:1,I:1,IFRAME:1,IMG:1,\r
- INPUT:1,INS:1,KBD:1,LABEL:1,MAP:1,OBJECT:1,Q:1,S:1,SAMP:1,SCRIPT:1,SELECT:1,SMALL:1,SPAN:1,STRIKE:1,STRONG:1,SUB:1,SUP:1,TEXTAREA:1,TT:1,U:1,VAR:1},\r
- // Elements that you can, intentionally, leave open\r
+ X_HTMLParser_inline = {/*'A':1,*/'ABBR':1,'ACRONYM':1,'APPLET':1,'B':1,'BASEFONT':1,'BDO':1,'BIG':1,'BR':1,'BUTTON':1,'CITE':1,'CODE':1,'DEL':1,'DFN':1,'EM':1,'FONT':1,'I':1,'IFRAME':1,'IMG':1,\r
+ 'INPUT':1,'INS':1,'KBD':1,'LABEL':1,'MAP':1,'OBJECT':1,'Q':1,'S':1,'SAMP':1,'SCRIPT':1,'SELECT':1,'SMALL':1,'SPAN':1,'STRIKE':1,'STRONG':1,'SUB':1,'SUP':1,'TEXTAREA':1,'TT':1,'U':1,'VAR':1},\r
+ // Elements that you can,' intentionally,' leave open\r
// (and which close themselves)\r
- X_HTMLParser_closeSelf = {OLGROUP: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
+ X_HTMLParser_closeSelf = {'OLGROUP':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
X_HTMLParser_sisters = {\r
- TH : { TD : 1 },\r
- TD : { TH : 1 },\r
- DT : { DD : 1 },\r
- DD : { DT : 1 },\r
- COLGROUP : { CAPTION : 1 },\r
- THEAD : { CAPTION : 1, COLGROUP : 1 },\r
- TFOOT : { CAPTION : 1, COLGROUP : 1, THEAD : 1, TBODY : 1 },\r
- TBODY : { CAPTION : 1, COLGROUP : 1, THEAD : 1, TFOOT : 1 }\r
+ 'TH' : { 'TD' : 1 },\r
+ 'TD' : { 'TH' : 1 },\r
+ 'DT' : { 'DD' : 1 },\r
+ 'DD' : { 'DT' : 1 },\r
+ 'COLGROUP' : { 'CAPTION' : 1 },\r
+ 'THEAD' : { 'CAPTION' : 1, 'COLGROUP' : 1 },\r
+ 'TFOOT' : { 'CAPTION' : 1, 'COLGROUP' : 1, 'THEAD' : 1, 'TBODY' : 1 },\r
+ 'TBODY' : { 'CAPTION' : 1, 'COLGROUP' : 1, 'THEAD' : 1, 'TFOOT' : 1 }\r
},\r
/*\r
* http://www.tohoho-web.com/html/tbody.htm\r
*/\r
\r
// Attributes that have their values filled in disabled="disabled"\r
- X_HTMLParser_fillAttrs = X_Node_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
- X_HTMLParser_special = { SCRIPT : 1, STYLE : 1, PLAINTEXT : 1, XMP : 1, TEXTAREA : 1 };\r
+ X_HTMLParser_special = { 'SCRIPT' : 1, 'STYLE' : 1, 'PLAINTEXT' : 1, 'XMP' : 1, 'TEXTAREA' : 1 },\r
+ \r
+ X_HTMLParser_skipFixNesting = false;\r
\r
function X_HTMLParser_exec( html, handler, async ){\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
return;\r
};\r
\r
- if( async && startTime + 15 <= X_Timer_now() && html ){\r
+ if( async && startTime + X_Timer_INTERVAL_TIME <= X_Timer_now() && html ){\r
handler.progress( 1 - html.length / async[ 0 ] );\r
- X.Timer.once( 0, X_HTMLParser_exec, [ html, handler, async ] );\r
+ X_Timer_once( 0, X_HTMLParser_exec, [ html, handler, async ] );\r
return;\r
};\r
\r
// Clean up any remaining tags\r
X_HTMLParser_parseEndTag( stack, handler );\r
\r
- async && handler.complete();\r
+ async && handler.asyncComplete();\r
};\r
\r
function X_HTMLParser__parseStartTag( stack, last, handler, html ){\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
( ( phase = 5 ) && ( attrName = html.substring( start, i ) ) );\r
break;\r
case 5 : // 属性の = または次の属性または htmlタグの閉じ\r
- ( whiteSpace[ chr ] & 16 ) ?// ie4 未対応の属性には cite = http:// となる\r
- 1 :\r
+ !( whiteSpace[ chr ] & 16 ) &&// ie4 未対応の属性には cite = http:// となる\r
+ // 1 :\r
( alphabets[ chr ] & 3 ) ?\r
( ( phase = 4 ) && ( attrs[ attrs.length ] = attrName ) && ( start = i ) ) :\r
chr === '=' ?\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.tagStart( 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
function X_HTMLParser_saveAttr( attrs, name, value ){\r
name = name.toLowerCase();\r
- value = X_HTMLParser_fillAttrs[ name ] === 1 ? name : value;\r
+ value = X_Node_Attr_noValue[ name ] === 1 ? name : value;\r
attrs[ attrs.length ] = {\r
- name : name,\r
- value : value,\r
- escaped :\r
+ attName : name,\r
+ // attrValue : value,\r
+ escaped :\r
value.indexOf( '"' ) !== -1 ?\r
value.split( '"' ).join( '\\"' ).split( '\\\\"' ).join( '\\"' ) :\r
value\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_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_HTMLParser_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
if ( 0 <= pos ) {\r
// Close all the open elements, up the stack\r
for ( ; pos < i; )\r
- handler.end( stack[ --i ] );\r
+ handler.tagEnd( stack[ --i ] );\r
\r
// Remove the open elements from the stack\r
stack.length = pos;\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
- start : function( tagName, attrs, noChild, length ){\r
+ tagStart : function( tagName, attrs, noChild, length ){\r
var xnode,\r
nest = X_HTMLParser_htmlStringToXNode.nest,\r
flat = X_HTMLParser_htmlStringToXNode.flat,\r
l = nest.length,\r
attr, name, i, _attrs; //, toIndex;\r
if( l ){\r
- xnode = nest[ l - 1 ].create( tagName );\r
+ xnode = nest[ l - 1 ][ 'create' ]( tagName );\r
} else {\r
xnode = flat[ flat.length ] = X_Doc_create( tagName );\r
};\r
_attrs = {};\r
for( ; i; ){\r
if( attr = attrs[ --i ] ){\r
- if( X.Type.isString( attr ) ){\r
+ if( X_Type_isString( attr ) ){\r
name = attr;\r
_attrs[ name ] = true;\r
} else {\r
- name = attr.name;\r
+ name = attr.attName;\r
_attrs[ name ] = attr.escaped;\r
};\r
};\r
};\r
- xnode.attr( _attrs );\r
+ xnode[ 'attr' ]( _attrs );\r
};\r
},\r
- end : function(){\r
+ tagEnd : function(){\r
0 < X_HTMLParser_htmlStringToXNode.nest.length && ( --X_HTMLParser_htmlStringToXNode.nest.length );\r
},\r
chars : function( text ){\r
if( X_HTMLParser_htmlStringToXNode.nest.length ){\r
- X_HTMLParser_htmlStringToXNode.nest[ X_HTMLParser_htmlStringToXNode.nest.length - 1 ].createText( text );\r
+ X_HTMLParser_htmlStringToXNode.nest[ X_HTMLParser_htmlStringToXNode.nest.length - 1 ][ 'createText' ]( text );\r
} else {\r
X_HTMLParser_htmlStringToXNode.flat[ X_HTMLParser_htmlStringToXNode.flat.length ] = X_Doc_createText( text );\r
};\r
},\r
- comment : X.emptyFunction\r
+ comment : X_emptyFunction\r
};\r
\r
function X_HtmlParser_parse( html, ignoreError ){\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
+ this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
},\r
- start : X_HTMLParser_htmlStringToXNode.start,\r
- end : X_HTMLParser_htmlStringToXNode.end,\r
- chars : X_HTMLParser_htmlStringToXNode.chars,\r
- comment : X.emptyFunction,\r
+ tagStart : X_HTMLParser_htmlStringToXNode.tagStart,\r
+ tagEnd : X_HTMLParser_htmlStringToXNode.tagEnd,\r
+ chars : X_HTMLParser_htmlStringToXNode.chars,\r
+ comment : X_emptyFunction,\r
\r
progress : function( pct ){\r
- this.asyncDispatch( { type : X.Event.PROGRESS, percent : pct } );\r
+ this[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, percent : pct } );\r
},\r
- complete : function(){\r
+ asyncComplete : function(){\r
var ret = X_HTMLParser_htmlStringToXNode.flat;\r
delete X_HTMLParser_htmlStringToXNode.flat;\r
- this.asyncDispatch( { type : X.Event.SUCCESS, xnodes : ret } );\r
+ this[ 'asyncDispatch' ]( { type : X_EVENT_SUCCESS, xnodes : ret } );\r
}\r
};\r
\r
function X_HTMLParser_asyncParse( html, ignoreError ){\r
- var dispatcher = X_Class_override( new X.EventDispatcher(), X_HTMLParser_asyncHtmlStringToXNode ),\r
+ var dispatcher = X_Class_override( X_EventDispatcher(), X_HTMLParser_asyncHtmlStringToXNode ),\r
worker = X_HTMLParser_htmlStringToXNode;\r
- dispatcher.listenOnce( X.Event.SUCCESS, dispatcher, dispatcher.kill );\r
+ dispatcher[ 'listenOnce' ]( X_EVENT_SUCCESS, dispatcher, dispatcher[ 'kill' ] );\r
worker.flat = [];\r
worker.nest.length = 0;\r
worker.ignoreError = ignoreError;\r