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