OSDN Git Service

Fix the bug of X.NodeAnime.
[pettanr/clientJs.git] / 0.6.x / js / 02_dom / 09_XHTMLParser.js
index 60b6d27..18cdc37 100644 (file)
@@ -8,7 +8,7 @@
 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
@@ -20,7 +20,7 @@ var X_HTMLParser_CHARS = {
        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
+       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
@@ -55,21 +55,19 @@ var X_HTMLParser_CHARS = {
                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
 \r
-               while ( html ) {\r
+               while( html ){\r
                        chars = true;\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
@@ -81,23 +79,23 @@ var X_HTMLParser_CHARS = {
                                };\r
                        } else {\r
                                // Comment\r
-                               if ( html.indexOf("<!--") === 0 ) {\r
-                                       if ( 0 < ( index = html.indexOf("-->") ) ) {\r
+                               if( html.indexOf("<!--") === 0 ){\r
+                                       if( 0 < ( index = html.indexOf("-->") ) ){\r
                                                handler.comment( html.substring( 4, index ) );\r
                                                html = html.substring( index + 3 );\r
                                                chars = false;\r
                                        };\r
        \r
                                // end tag\r
-                               } else if ( html.indexOf("</") === 0 ) {\r
-                                       if ( 2 < ( index = _parseEndTag( stack, handler, html ) ) ) {\r
+                               } else if( html.indexOf("</") === 0 ){\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
+                               } else if( html.indexOf("<") === 0 ){\r
+                                       if( index = X_HTMLParser__parseStartTag( stack, last, handler, html ) ){\r
                                                html  = html.substring( index );\r
                                                chars = false;\r
                                        } else\r
@@ -106,7 +104,7 @@ var X_HTMLParser_CHARS = {
                                        };\r
                                };\r
 \r
-                               if ( chars ) {\r
+                               if( chars ){\r
                                        index = html.indexOf("<");\r
                                        \r
                                        text = index < 0 ? html : html.substring( 0, index );\r
@@ -122,7 +120,7 @@ var X_HTMLParser_CHARS = {
                                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
                                return;\r
@@ -134,7 +132,7 @@ var X_HTMLParser_CHARS = {
                // 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
@@ -147,7 +145,7 @@ var X_HTMLParser_CHARS = {
                        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
@@ -173,14 +171,16 @@ var X_HTMLParser_CHARS = {
                                case 4 : // 属性名の終わりを待つ\r
                                        chr === '=' ?\r
                                                ( ( phase = 6 ) && ( attrName = html.substring( start, i ) ) ) :\r
-                                       ( whiteSpace[ chr ] & 16 ) &&\r
-                                               ( ( phase = 5 ) && ( attrName = html.substring( start, i ) ) );\r
+                                       ( whiteSpace[ chr ] & 16 ) ?\r
+                                               ( ( phase = 5 ) && ( attrName = html.substring( start, i ) ) ) :\r
+                                       ( chr === '>' || ( empty = html.substr( i, 2 ) === '/>' ) ) &&\r
+                                               ( ( phase = 9 ) && ( attrs[ attrs.length ] = 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
+                                               ( ( phase = 3 ) && ( attrs[ attrs.length ] = attrName ) && ( start = i ) ) : // <textarea readonly>\r
                                        chr === '=' ?\r
                                                ( phase = 6 ) :\r
                                        ( chr === '>' || ( empty = html.substr( i, 2 ) === '/>' ) ) &&\r
@@ -201,7 +201,7 @@ var X_HTMLParser_CHARS = {
                                        ( chr === '>' ) ?\r
                                                ( ( phase = 9 ) && saveAttr( attrs, attrName, html.substring( start, i ) ) ) :\r
                                        !escape && !uri[ attrName ] && ( empty = html.substr( i, 2 ) === '/>' ) && // attr の val が uri で / で終わりかつ、未対応属性の場合\r
-                                               ( phase = 9 );\r
+                                               ( ( phase = 9 ) && saveAttr( attrs, attrName, html.substring( start, i ) ) );\r
                                        break;\r
                        };\r
                        escape = chr === '\\' && !escape; // \\\\ is not escape for "\r
@@ -209,7 +209,24 @@ var X_HTMLParser_CHARS = {
                };\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
@@ -245,7 +262,7 @@ var X_HTMLParser_CHARS = {
                        ++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
@@ -255,32 +272,15 @@ var X_HTMLParser_CHARS = {
                name  = name.toLowerCase();\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_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
@@ -294,7 +294,7 @@ var X_HTMLParser_CHARS = {
                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
@@ -304,11 +304,12 @@ var X_HTMLParser_CHARS = {
 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
@@ -328,7 +329,7 @@ var X_HTMLParser_htmlStringToXNode = {
                                                name = attr;\r
                                                _attrs[ name ] = true;\r
                                        } else {\r
-                                               name = attr.name;\r
+                                               name = attr.attName;\r
                                                _attrs[ name ] = attr.escaped;\r
                                        };\r
                                };\r
@@ -336,7 +337,7 @@ var X_HTMLParser_htmlStringToXNode = {
                        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
@@ -361,19 +362,20 @@ function X_HtmlParser_parse( html, ignoreError ){
 };\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
        },\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
        },\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