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()));