[Sie-announce] SIEコード [2035] tspan要素に関する修正

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 10月 1日 (金) 23:51:52 JST


Revision: 2035
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2035
Author:   dhrname
Date:     2010-10-01 23:51:51 +0900 (Fri, 01 Oct 2010)

Log Message:
-----------
tspan要素に関する修正

Modified Paths:
--------------
    branches/06x/061/org/w3c/dom/svg.js

Modified: branches/06x/061/org/w3c/dom/svg.js
===================================================================
--- branches/06x/061/org/w3c/dom/svg.js	2010-10-01 13:51:06 UTC (rev 2034)
+++ branches/06x/061/org/w3c/dom/svg.js	2010-10-01 14:51:51 UTC (rev 2035)
@@ -3262,7 +3262,7 @@
      */
     if ((evt.eventPhase === Event.CAPTURING_PHASE) && (tar.nodeType === Node.TEXT_NODE) && !!!tar._tar) {
       /*Textノードにdiv要素を格納したリストをプロパティとして蓄えておく*/
-      tar._tar = [];
+      tar._tars = [];
       for (var i=0, tdli=tar.data.length;i<tdli;++i) {
         var d = document.createElement("div"), dstyle = d.style;
         dstyle.position = "absolute";
@@ -3273,9 +3273,9 @@
         dstyle.whiteSpace = "nowrap";
         dstyle.textIndent = "0px";
         d.appendChild(document.createTextNode(tar.data.charAt(i)));
-        tar._tar[tar._tar.length] = d;
+        tar._tars[tar._tars.length] = d;
       }
-      cur._length += tar._tar.length;
+      cur._length += tar._tars.length;
     } else if ((evt.eventPhase === Event.CAPTURING_PHASE) && (tar instanceof SVGTextContentElement) && !!!tar._tar) {
       cur._length += tar._length;
     }
@@ -3446,7 +3446,7 @@
       }
       while (ti) {
         if (ti.nodeType === Node.TEXT_NODE) {
-          var tt = ti._tar;
+          var tt = ti._tars;
           /*tspan要素のx属性で指定された座標の個数よりも、文字数が多い場合は、祖先(親)のx属性を
            *使う。また、属性が指定されていないときも同様に祖先や親を使う。
            *もし、仮に祖先や親がx属性を指定されていなければ、現在のテキスト位置(変数xに格納している)を使う。
@@ -3525,6 +3525,16 @@
             ++n;
           }
         } else if ((ti.localName === "tspan") && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firtChild) {
+          /*現在のテキスト位置(x,y)の分だけ、tspan要素をずらしておく。
+           *さらに、現在のテキスト位置を更新する
+           */
+          for (var j=0, ttls=ti._list.length;j<ttls;++j) {
+            ti._list[j] += x;
+            ++j;
+            ti._list[j] += y;
+          }
+          x = ti._list[ti._list.length-2];
+          y = ti._list[ti._list.length-1];
           tar._list.concat(ti._list);
           n += ti.getNumberOfChars();
         }
@@ -3599,10 +3609,11 @@
       ttp.style.fontFamily = style.getPropertyValue("font-family");
       var tod = tar.ownerDocument.documentElement;
       var tlen = tar.getComputedTextLength(), anchor = style.getPropertyValue("text-anchor");
+      /*ここでの変数jは前回ノードまでの総文字数*/
       for (var i=0, j=0, tli=tar.getNumberOfChars();i<tli;++i) {
-        if (ti && (ti.nodeType === Node.TEXT_NODE)) {
-          if (!!ti._tar) {
-            var sty = ti._tar[i].style, p = tar.getStartPositionOfChar(i-j);
+        if (ti) {
+          if (!!ti._tars) {
+            var sty = ti._tars[i-j].style, p = tar.getStartPositionOfChar(i);
             sty.position = "absolute";
             if (tar._isYokogaki) {
               if (anchor === "middle") {
@@ -3623,20 +3634,21 @@
             sty.height = "0px";
             sty.marginTop = tar._isYokogaki ? -n+ "px" : "0px";
             sty.lineHeight = n+ "px";
-            tar._tar.appendChild(ti._tar[i]);
+            tar._tar.appendChild(ti._tars[i]);
+            sty = p = null;
           }
           if (!!ti.data) {
-            if (ti.data.length <= i+1) {
+            if ((ti.data.length+j) <= i+1) {
               j = j + i + 1;
               ti = ti.nextSibling;
             }
           } else if (!!ti.getNumberOfChars) {
-              if (ti.getNumberOfChars() <= i+1) {
+              if ((ti.getNumberOfChars()+j) <= i+1) {
                 j = j + i + 1;
+                i += j;
                 ti = ti.nextSibling;
               }
           }
-          p = null;
         }
       }
       var color = style.getPropertyValue("fill");




Sie-announce メーリングリストの案内
Back to archive index