OSDN Git Service

Version 0.6.41, fix for Opera8 & NN7.2+.
[pettanr/clientJs.git] / 0.6.x / js / dom / 19_XDomParser.js
index 18eb8cf..db0c897 100644 (file)
@@ -22,9 +22,6 @@ X.Dom.Parser = {
        // (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
@@ -47,10 +44,11 @@ X.Dom.Parser = {
        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
@@ -64,9 +62,17 @@ X.Dom.Parser = {
                        \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
@@ -113,7 +119,7 @@ X.Dom.Parser = {
                        \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
@@ -135,7 +141,7 @@ X.Dom.Parser = {
                        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
@@ -189,14 +195,15 @@ X.Dom.Parser = {
                                                ( ( 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
@@ -226,7 +233,7 @@ X.Dom.Parser = {
                                        ( 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
@@ -264,7 +271,7 @@ X.Dom.Parser = {
                        };\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
@@ -345,7 +352,7 @@ X.Dom.parse = function( html, ignoreError ){
        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
@@ -356,15 +363,9 @@ X.Dom._asyncHtmlStringToXNode = {
                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
@@ -384,6 +385,6 @@ X.Dom.asyncParse = function( html, ignoreError ){
        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