OSDN Git Service

a要素間r年のバグを修正
authordhrname <dhrname@users.sourceforge.jp>
Sat, 18 Jan 2014 13:09:22 +0000 (22:09 +0900)
committerdhrname <dhrname@users.sourceforge.jp>
Sat, 18 Jan 2014 13:09:22 +0000 (22:09 +0900)
org/w3c/dom/svg.js

index 1f8a8e3..904ef26 100644 (file)
@@ -3869,9 +3869,9 @@ function SVGTextContentElement(_doc) {
     } else if ((eph === /*Event.CAPTURING_PHASE*/ 1) && (tar.nodeType === /*Node.ELEMENT_NODE*/ 1)\r
         && (tar.localName !== "tspan") && (tar.localName !== "text")) {\r
       /*a要素などテキスト関連要素以外の要素が入っている場合を処理*/\r
+      var evtt = tar.ownerDocument.createEvent("MutationEvents");\r
+      evtt.initMutationEvent("DOMNodeInserted", true, false, tar.parentNode, null, null, null, null);\r
       var f = function(ta) {\r
-        var evtt = ta.ownerDocument.createEvent("MutationEvents");\r
-        evtt.initMutationEvent("DOMNodeInserted", true, false, this, null, null, null, null);\r
         while (ta) {\r
           if ((ta.nodeType === /*Node.TEXT_NODE*/ 3) && !ta._tars) {\r
             ta.dispatchEvent(evtt);\r
@@ -3980,7 +3980,6 @@ function SVGTextContentElement(_doc) {
     throw (new DOMException(/*DOMException.INDEX_SIZE_ERR*/ 1));\r
   } else {\r
     var tar = this,\r
-        ti = tar.firstChild,\r
         tp = tar.parentNode;\r
     if (!!!tar._list) {\r
       tar._list = [];\r
@@ -4010,118 +4009,120 @@ function SVGTextContentElement(_doc) {
       } else if (isText){\r
         x -= hfsize;\r
       }\r
-      while (ti) {\r
-        if (ti.nodeType === /*Node.TEXT_NODE*/ 3) {\r
-          tt = ti._tars;\r
-          /*tspan(tref)要素のx属性で指定された座標の個数よりも、文字数が多い場合は、祖先(親)のx属性を\r
-           *使う。また、属性が指定されていないときも同様に祖先や親を使う。\r
-           *もし、仮に祖先や親がx属性を指定されていなければ、現在のテキスト位置(変数xに格納している)を使う。\r
-           *この処理はdx属性やdy、y属性でも同様とする\r
-           *参照資料SVG1.1 Text\r
-           *http://www.hcn.zaq.ne.jp/___/REC-SVG11-20030114/text.html\r
-           *\r
-           *注意:ここでは、tspan要素だけではなく、text要素にも適用しているが、本来はtspan要素のみに処理させること\r
-           */\r
-          for (var i=0, tli=tt.length;i<tli;++i) {\r
-            if (n < ptx.numberOfItems - chars) {\r
-              x = ptx.getItem(n).value;\r
-              if (!isYokogaki) {\r
-                x -= hfsize;\r
+      var f = function(ti) {\r
+        while (ti) {\r
+          if (ti.nodeType === /*Node.TEXT_NODE*/ 3) {\r
+            tt = ti._tars;\r
+            /*tspan(tref)要素のx属性で指定された座標の個数よりも、文字数が多い場合は、祖先(親)のx属性を\r
+             *使う。また、属性が指定されていないときも同様に祖先や親を使う。\r
+             *もし、仮に祖先や親がx属性を指定されていなければ、現在のテキスト位置(変数xに格納している)を使う。\r
+             *この処理はdx属性やdy、y属性でも同様とする\r
+             *参照資料SVG1.1 Text\r
+             *http://www.hcn.zaq.ne.jp/___/REC-SVG11-20030114/text.html\r
+             *\r
+             *注意:ここでは、tspan要素だけではなく、text要素にも適用しているが、本来はtspan要素のみに処理させること\r
+             */\r
+            for (var i=0, tli=tt.length;i<tli;++i) {\r
+              if (n < ptx.numberOfItems - chars) {\r
+                x = ptx.getItem(n).value;\r
+                if (!isYokogaki) {\r
+                  x -= hfsize;\r
+                }\r
+              } else if (n < tx.numberOfItems) {\r
+                x = tx.getItem(n).value;\r
+                if (!isYokogaki) {\r
+                  x -= hfsize;\r
+                }\r
               }\r
-            } else if (n < tx.numberOfItems) {\r
-              x = tx.getItem(n).value;\r
-              if (!isYokogaki) {\r
-                x -= hfsize;\r
+              if (n < pty.numberOfItems - chars) {\r
+                y = pty.getItem(n).value;\r
+                if (isYokogaki) {\r
+                  y += qfsize;\r
+                }\r
+              } else if (n < ty.numberOfItems) {\r
+                y = ty.getItem(n).value;\r
+                if (isYokogaki) {\r
+                  y += qfsize;\r
+                }\r
               }\r
-            }\r
-            if (n < pty.numberOfItems - chars) {\r
-              y = pty.getItem(n).value;\r
-              if (isYokogaki) {\r
-                y += qfsize;\r
+              if (n < ptdx.numberOfItems - chars) {\r
+                x += ptdx.getItem(n).value;\r
+              } else if (n < tdx.numberOfItems) {\r
+                x += tdx.getItem(n).value;\r
+              }\r
+              if (n < ptdy.numberOfItems - chars) {\r
+                y += ptdy.getItem(n).value;\r
+              } else if (n < tdy.numberOfItems) {\r
+                y += tdy.getItem(n).value;\r
               }\r
-            } else if (n < ty.numberOfItems) {\r
-              y = ty.getItem(n).value;\r
+              alm = 0;\r
               if (isYokogaki) {\r
-                y += qfsize;\r
+                //カーニングを求めて、字の幅を文字ごとに調整する\r
+                tdc = ti.data.charAt(i);\r
+                if (kern.indexOf(tdc) > -1) {\r
+                  alm = fontSize * 0.68;\r
+                } else if (tdc === "s"){\r
+                  alm = fontSize * 0.52;\r
+                } else if ((tdc === "C") || (tdc === "D") || (tdc === "M") || (tdc === "W") || (tdc === "G") || (tdc === "m")){\r
+                  alm = qfsize;\r
+                } else if (akern.indexOf(tdc) > -1){\r
+                  alm = fontSize * 0.45;\r
+                } else {\r
+                  alm = fontSize * 0.3;\r
+                }\r
               }\r
-            }\r
-            if (n < ptdx.numberOfItems - chars) {\r
-              x += ptdx.getItem(n).value;\r
-            } else if (n < tdx.numberOfItems) {\r
-              x += tdx.getItem(n).value;\r
-            }\r
-            if (n < ptdy.numberOfItems - chars) {\r
-              y += ptdy.getItem(n).value;\r
-            } else if (n < tdy.numberOfItems) {\r
-              y += tdy.getItem(n).value;\r
-            }\r
-            alm = 0;\r
-            if (isYokogaki) {\r
-              //カーニングを求めて、字の幅を文字ごとに調整する\r
-              tdc = ti.data.charAt(i);\r
-              if (kern.indexOf(tdc) > -1) {\r
-                alm = fontSize * 0.68;\r
-              } else if (tdc === "s"){\r
-                alm = fontSize * 0.52;\r
-              } else if ((tdc === "C") || (tdc === "D") || (tdc === "M") || (tdc === "W") || (tdc === "G") || (tdc === "m")){\r
-                alm = qfsize;\r
-              } else if (akern.indexOf(tdc) > -1){\r
-                alm = fontSize * 0.45;\r
+              tlist = tar._list;\r
+              tlist[tlist.length] = x;\r
+              tlist[tlist.length] = y;\r
+              tlist[tlist.length] = fontSize - alm;\r
+              if (isYokogaki) {\r
+                x += fontSize;\r
+                x -= alm;\r
               } else {\r
-                alm = fontSize * 0.3;\r
+                y += fontSize;\r
               }\r
+              ++n;\r
             }\r
-            tlist = tar._list;\r
-            tlist[tlist.length] = x;\r
-            tlist[tlist.length] = y;\r
-            tlist[tlist.length] = fontSize - alm;\r
+            chars += tli;\r
+            ti = ti.nextSibling;\r
+          } else if (((ti.localName === "tspan") || (ti.localName === "tref"))\r
+              && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firstChild) {\r
+            /*現在のテキスト位置(x,y)の分だけ、tspan (tref)要素をずらしておく。\r
+             *さらに、現在のテキスト位置を更新する\r
+             */\r
+            ti._stx = x;\r
+            ti._sty = y;\r
+            ti._chars = chars;\r
+            p = ti.getStartPositionOfChar(ti.getNumberOfChars());\r
+            almx = almy = 0;\r
+            tlist = ti._list;\r
             if (isYokogaki) {\r
-              x += fontSize;\r
-              x -= alm;\r
+              almx = tlist[tlist.length-1];\r
             } else {\r
-              y += fontSize;\r
+              almy = tlist[tlist.length-1];\r
             }\r
-            ++n;\r
-          }\r
-          chars += tli;\r
-          if (ti.parentNode && (ti.parentNode.localName === "a")\r
-               && !ti.nextSibling) { //a要素が親であり、かつ、テキストノード以外のノードを含まない場合は、tiを親に戻しておく\r
-            ti = ti.parentNode;\r
-          }\r
-          ti = ti.nextSibling;\r
-        } else if (((ti.localName === "tspan") || (ti.localName === "tref"))\r
-            && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firstChild) {\r
-          /*現在のテキスト位置(x,y)の分だけ、tspan (tref)要素をずらしておく。\r
-           *さらに、現在のテキスト位置を更新する\r
-           */\r
-          ti._stx = x;\r
-          ti._sty = y;\r
-          ti._chars = chars;\r
-          p = ti.getStartPositionOfChar(ti.getNumberOfChars());\r
-          almx = almy = 0;\r
-          tlist = ti._list;\r
-          if (isYokogaki) {\r
-            almx = tlist[tlist.length-1];\r
+            x = tlist[tlist.length-3] + almx;\r
+            y = tlist[tlist.length-2] + almy;\r
+            tar._list = tar._list.concat(tlist);\r
+            tg = ti.getNumberOfChars();\r
+            n += tg;\r
+            chars += tg;\r
+            ti = ti.nextSibling;\r
+          } else if ((ti.nodeType === /*Node.ELEMENT_NODE*/ 1)\r
+              && ((ti.localName !== "tspan") && (ti.localName !== "tref"))\r
+              && ti.firstChild) {\r
+            /*text関連要素以外の要素の内部にあるテキストノードも処理する*/\r
+            f(ti.firstChild);\r
+            ti = ti.nextSibling;\r
           } else {\r
-            almy = tlist[tlist.length-1];\r
+            ti = ti.nextSibling;\r
           }\r
-          x = tlist[tlist.length-3] + almx;\r
-          y = tlist[tlist.length-2] + almy;\r
-          tar._list = tar._list.concat(tlist);\r
-          tg = ti.getNumberOfChars();\r
-          n += tg;\r
-          chars += tg;\r
-          ti = ti.nextSibling;\r
-        } else if ((ti.localName === "a") && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firstChild) {\r
-          /*a要素のテキストノードも処理する*/\r
-          ti = ti.firstChild;\r
-        } else {\r
-          ti = ti.nextSibling;\r
         }\r
-      }\r
+      };\r
+      f(tar.firstChild);\r
       tar._isYokogaki = isYokogaki; //getEndPositionOfCharメソッドなどで使う\r
     }\r
-    tar = ti = isText = hfsize = qfsize = tp = ptx = pty = tx = ty = chars = style = x = y = isYokogaki = kern = akern = tt = alm = tdc = p = almx = almy = tlist = tg = void 0;\r
+    f = tar = isText = hfsize = qfsize = tp = ptx = pty = tx = ty = chars = style = x = y = isYokogaki = kern = akern = tt = alm = tdc = p = almx = almy = tlist = tg = void 0;\r
     var s = this.ownerDocument.documentElement.createSVGPoint();\r
     s.x = this._list[charnum*3];\r
     s.y = this._list[charnum*3 + 1];\r