[Sie-announce] SIEコード [2039] text要素の修正を施した

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 10月 4日 (月) 23:22:50 JST


Revision: 2039
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=2039
Author:   dhrname
Date:     2010-10-04 23:22:50 +0900 (Mon, 04 Oct 2010)

Log Message:
-----------
text要素の修正を施した

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-04 14:22:39 UTC (rev 2038)
+++ branches/06x/061/org/w3c/dom/svg.js	2010-10-04 14:22:50 UTC (rev 2039)
@@ -3419,125 +3419,135 @@
   }, false);
   this.addEventListener("DOMNodeInserted", function(evt){
     if (evt.eventPhase === Event.BUBBLING_PHASE) {
-      var tar = evt.target, ti = tar.firstChild, tp = tar.parentNode;
-      if (!(tar instanceof SVGTextContentElement)) {
-        return;
+      var tar = evt.target, ttn = 2;
+      if ((tar.nodeType === Node.TEXT_NODE)) {
+        /*もし、仮にテキストノードであれば、以下のループ処理については、
+         *currentTargetの一回だけで済ますようにする
+         */
+        tar = evt.currentTarget;
+        ttn = 1;
       }
-      var x = 0, y = 0, n = 0; //現在のテキスト位置と順番
-      var style = tar.ownerDocument.defaultView.getComputedStyle(tar, null);
-      var isYokogaki = ((style.getPropertyValue("writing-mode")) === "lr-tb") ? true : false;
-      var fontSize = parseFloat(style.getPropertyValue("font-size"));
-      var tx = tar.x.baseVal, ty = tar.y.baseVal, tdx = tar.dx.baseVal, tdy = tar.dy.baseVal;
-      //親要素の属性も参照しておく
-      if ((tp.localName === "text") || (tp.localName === "tspan")) {
-        var ptx = tp.x.baseVal, pty = tp.y.baseVal, ptdx = tp.dx.baseVal, ptdy = tp.dy.baseVal;
-      } else {
-        var ptx = pty = ptdx = ptdy = {numberOfItems : 0};
-      }
-      var kern = "f ijltIr.,:;'-\"()", akern = "1234567890abcdeghknopquvxyz";
-      if (isYokogaki) {
-        y += fontSize * 0.2;
-      } else {
-        x -= fontSize * 0.5;
-      }
-      while (ti) {
-        if (ti.nodeType === Node.TEXT_NODE) {
-          var tt = ti._tars;
-          /*tspan要素のx属性で指定された座標の個数よりも、文字数が多い場合は、祖先(親)のx属性を
-           *使う。また、属性が指定されていないときも同様に祖先や親を使う。
-           *もし、仮に祖先や親がx属性を指定されていなければ、現在のテキスト位置(変数xに格納している)を使う。
-           *この処理はdx属性やdy、y属性でも同様とする
-           *参照資料SVG1.1 Text
-           *http://www.hcn.zaq.ne.jp/___/REC-SVG11-20030114/text.html
-           *
-           *注意:ここでは、tspan要素だけではなく、text要素にも適用しているが、本来はtspan要素のみに処理させること
-           */
-          for (var i=0, tli=tt.length;i<tli;++i) {
-            if (n < ptx.numberOfItems) {
-              x = ptx.getItem(n).value;
-              if (!isYokogaki) {
-                x -= fontSize * 0.5;
+      for (var k=0;k<ttn;++k) {
+        var  ti = tar.firstChild, tp = tar.parentNode;
+        tar._list = [];          //リストの初期化
+        var x = 0, y = 0, n = 0; //現在のテキスト位置と順番
+        var style = tar.ownerDocument.defaultView.getComputedStyle(tar, null);
+        var isYokogaki = ((style.getPropertyValue("writing-mode")) === "lr-tb") ? true : false;
+        var fontSize = parseFloat(style.getPropertyValue("font-size"));
+        var tx = tar.x.baseVal, ty = tar.y.baseVal, tdx = tar.dx.baseVal, tdy = tar.dy.baseVal;
+        /*親要素の属性も参照しておく*/
+        if (tp && ((tp.localName === "text")||(tp.localName === "tspan"))) {
+          var ptx = tp.x.baseVal, pty = tp.y.baseVal, ptdx = tp.dx.baseVal, ptdy = tp.dy.baseVal;
+        } else {
+          var ptx = pty = ptdx = ptdy = {numberOfItems : 0};
+        }
+        var kern = "f ijltIr.,:;'-\"()", akern = "1234567890abcdeghknopquvxyz";
+        if (isYokogaki) {
+          y += fontSize * 0.2;
+        } else {
+          x -= fontSize * 0.5;
+        }
+        while (ti) {
+          if (ti.nodeType === Node.TEXT_NODE) {
+            var tt = ti._tars;
+            /*tspan要素のx属性で指定された座標の個数よりも、文字数が多い場合は、祖先(親)のx属性を
+             *使う。また、属性が指定されていないときも同様に祖先や親を使う。
+             *もし、仮に祖先や親がx属性を指定されていなければ、現在のテキスト位置(変数xに格納している)を使う。
+             *この処理はdx属性やdy、y属性でも同様とする
+             *参照資料SVG1.1 Text
+             *http://www.hcn.zaq.ne.jp/___/REC-SVG11-20030114/text.html
+             *
+             *注意:ここでは、tspan要素だけではなく、text要素にも適用しているが、本来はtspan要素のみに処理させること
+             */
+            for (var i=0, tli=tt.length;i<tli;++i) {
+              if (n < ptx.numberOfItems) {
+                x = ptx.getItem(n).value;
+                if (!isYokogaki) {
+                  x -= fontSize * 0.5;
+                }
+              } else if (n < tx.numberOfItems) {
+                x = tx.getItem(n).value;
+                if (!isYokogaki) {
+                  x -= fontSize * 0.5;
+                }
               }
-            } else if (n < tx.numberOfItems) {
-              x = tx.getItem(n).value;
-              if (!isYokogaki) {
-                x -= fontSize * 0.5;
+              if (n < pty.numberOfItems) {
+                y = pty.getItem(n).value;
+                if (isYokogaki) {
+                  y += fontSize * 0.2;
+                }
+              } else if (n < ty.numberOfItems) {
+                y = ty.getItem(n).value;
+                if (isYokogaki) {
+                  y += fontSize * 0.2;
+                }
               }
-            }
-            if (n < pty.numberOfItems) {
-              y = pty.getItem(n).value;
-              if (isYokogaki) {
-                y += fontSize * 0.2;
+              if (n < ptdx.numberOfItems) {
+                x += ptdx.getItem(n).value;
+              } else if (n < tdx.numberOfItems) {
+                x += tdx.getItem(n).value;
               }
-            } else if (n < ty.numberOfItems) {
-              y = ty.getItem(n).value;
+              if (n < ptdy.numberOfItems) {
+                y += ptdy.getItem(n).value;
+              } else if (n < tdy.numberOfItems) {
+                y += tdy.getItem(n).value;
+              }
+              var alm = 0;
               if (isYokogaki) {
-                y += fontSize * 0.2;
+                //カーニングを求めて、字の幅を文字ごとに調整する
+                var tdc = ti.data.charAt(i);
+                if (kern.indexOf(tdc) > -1) {
+                  alm = fontSize * 0.68;
+                } else if (tdc === "s"){
+                  alm = fontSize * 0.52;
+                } else if ((tdc === "C") || (tdc === "D") || (tdc === "M") || (tdc === "W") || (tdc === "G") || (tdc === "m")){
+                  alm = fontSize * 0.2;
+                } else if (akern.indexOf(tdc) > -1){
+                  alm = fontSize * 0.45;
+                } else {
+                  alm = fontSize * 0.3;
+                }
+                var tcca = tdc.charCodeAt(0);
+                if ((12288 <= tcca) && (tcca <= 65533)) {
+                  alm = -fontSize * 0.01;
+                  if ((tdc === "う") || (tdc === "く") || (tdc === "し") || (tdc === "ち")) {
+                    alm += fontSize * 0.2;
+                  }
+                }
+                tcca = null;
               }
-            }
-            if (n < ptdx.numberOfItems) {
-              x += ptdx.getItem(n).value;
-            } else if (n < tdx.numberOfItems) {
-              x += tdx.getItem(n).value;
-            }
-            if (n < ptdy.numberOfItems) {
-              y += ptdy.getItem(n).value;
-            } else if (n < tdy.numberOfItems) {
-              y += tdy.getItem(n).value;
-            }
-            var alm = 0;
-            if (isYokogaki) {
-              //カーニングを求めて、字の幅を文字ごとに調整する
-              var tdc = ti.data.charAt(i);
-              if (kern.indexOf(tdc) > -1) {
-                alm = fontSize * 0.68;
-              } else if (tdc === "s"){
-                alm = fontSize * 0.52;
-              } else if ((tdc === "C") || (tdc === "D") || (tdc === "M") || (tdc === "W") || (tdc === "G") || (tdc === "m")){
-                alm = fontSize * 0.2;
-              } else if (akern.indexOf(tdc) > -1){
-                alm = fontSize * 0.45;
+              tar._list[tar._list.length] = x;
+              tar._list[tar._list.length] = y;
+              tar._list[tar._list.length] = fontSize - alm;
+              if (isYokogaki) {
+                x += fontSize;
+                x -= alm;
               } else {
-                alm = fontSize * 0.3;
+                y += fontSize;
               }
-              var tcca = tdc.charCodeAt(0);
-              if ((12288 <= tcca) && (tcca <= 65533)) {
-                alm = -fontSize * 0.01;
-                if ((tdc === "う") || (tdc === "く") || (tdc === "し") || (tdc === "ち")) {
-                  alm += fontSize * 0.2;
-                }
-              }
-              tcca = null;
+              ++n;
             }
-            tar._list[tar._list.length] = x;
-            tar._list[tar._list.length] = y;
-            tar._list[tar._list.length] = fontSize - alm;
-            if (isYokogaki) {
-              x += fontSize;
-              x -= alm;
-            } else {
-              y += fontSize;
+          } 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;
             }
-            ++n;
+            x = ti._list[ti._list.length-2];
+            y = ti._list[ti._list.length-1];
+            tar._list.concat(ti._list);
+            n += ti.getNumberOfChars();
           }
-        } 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();
+          ti = ti.nextSibling;
         }
-        ti = ti.nextSibling;
+        tar._isYokogaki = isYokogaki //getEndPositionOfCharメソッドなどで使う
+        tar = evt.currentTarget;
+        style = null;
       }
-      tar._isYokogaki = isYokogaki //getEndPositionOfCharメソッドなどで使う
-      evt = tar = style = null;
+      evt = tar = null;
     }
   }, false);
   return this;
@@ -3583,20 +3593,6 @@
     }
     tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
       var tar = evt.target, ti = tar.firstChild, ttp = tar._tar;
-      if ((tar.localName === "text") && (tar.namespaceURI === "http://www.w3.org/2000/svg")) {
-        /*先にDONNodeInsertedイベントの浮上フェーズだけを発火させる*/
-        var evtt = tar.ownerDocument.createEvent("MutationEvents");
-        evtt.initMutationEvent("DOMNodeInserted", true, false, this, null, null, null, null);
-        evtt.target = tar;
-        evtt.eventPhase = Event.BUBBLING_PHASE;
-        var tce = tar._capter; //tceは登録しておいたリスナーのリスト
-        for (var j=0,tcli=tce.length;j<tcli;++j){
-          if (tce[j]) {
-            tce[j].handleEvent(evtt);
-          }
-        }
-        evtt = tce = null;
-      }
       ttp.style.cssText = tar.style.cssText;
       var style = tar.ownerDocument.defaultView.getComputedStyle(tar, null);
       var n = parseFloat(style.getPropertyValue("font-size")) * Math.sqrt(Math.abs(tar.getScreenCTM()._determinant()));




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