svnno****@sourc*****
svnno****@sourc*****
2010年 4月 26日 (月) 23:45:26 JST
Revision: 1802
http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1802
Author: dhrname
Date: 2010-04-26 23:45:26 +0900 (Mon, 26 Apr 2010)
Log Message:
-----------
SVGTextContentElementの修正
Modified Paths:
--------------
branches/ufltima/dom/svg.js
Modified: branches/ufltima/dom/svg.js
===================================================================
--- branches/ufltima/dom/svg.js 2010-04-23 14:18:01 UTC (rev 1801)
+++ branches/ufltima/dom/svg.js 2010-04-26 14:45:26 UTC (rev 1802)
@@ -2617,8 +2617,91 @@
function SVGTextContentElement() {
SVGElement.apply(this, arguments);
+ this._tar = []; //div要素を格納しておくリスト
/*readonly SVGAnimatedLength*/ this.textLength = new SVGAnimatedLength();
/*readonly SVGAnimatedEnumeration*/ this.lengthAdjust = new SVGAnimatedEnumeration(SVGTextContentElement.LENGTHADJUST_UNKNOWN);
+ this.addEventListener("DOMNodeInserted", function(evt){
+ if (evt.eventPhase === Event.BUBBLING_PHASE) {
+ return; //強制終了させる
+ }
+ var tar = evt.target;
+ for (var i=0, tli=tar.getNumberOfChars();i<tli;++i) {
+ tar.parentNode._tar.appendChild(tar._tar[i]);
+ }
+ tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
+ var tar = evt.target, ti = tar.firstChild;
+ var x = y = n = 0; //現在のテキスト位置と順番
+ this._list = []; //文字の位置を格納しておくリスト
+ 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;
+ while (ti) {
+ if (ti.nodeType === Node.TEXT_NODE) {
+ var tt = ti._tar;
+ for (var i=0, tli=tt.length;i<tli;++i) {
+ if (n < tx.numberOfItems) {
+ x = tx.getItem(n).value;
+ }
+ if (n < ty.numberOfItems) {
+ y = ty.getItem(n).value;
+ }
+ if (n < tdx.numberOfItems) {
+ x += tdx.getItem(n).value;
+ }
+ if (n < tdy.numberOfItems) {
+ y += tdy.getItem(n).value;
+ }
+ if (isYokogaki) {
+ x += fontSize;
+ } else {
+ y += fontSize;
+ }
+ this._list[this._list.length] = x;
+ this._list[this._list.length] = y;
+ ++n;
+ }
+ } else if (ti.localName === "tspan" && ti.namespaceURI === "http://www.w3.org/2000/svg"){
+ var tstyle = this.ownerDocument.defaultView.getComputedStyle(ti, null);
+ var tisYokogaki = ((tstyle.getPropertyValue("writing-mode")) === "lr-tb") ? true : false;
+ var tfontSize = parseFloat(tstyle.getPropertyValue("font-size"));
+ var tt = ti._tar, ttx = tt.x.baseVal, tty = tt.y.baseVal, ttdx = tt.dx.baseVal, ttdy = tt.dy.baseVal;
+ for (var i=0, tli=tt.length;i<tli;++i) {
+ if (n < ttx.numberOfItems) {
+ x = ttx.getItem(n).value;
+ } else if (n < tx.numberOfItems) {
+ x = tx.getItem(n).value;
+ }
+ if (n < tty.numberOfItems) {
+ y = ttx.getItem(n).value;
+ } else if (n < ty.numberOfItems) {
+ y = ty.getItem(n).value;
+ }
+ if (n < ttdx.numberOfItems) {
+ x += ttdx.getItem(n).value;
+ } else if (n < tdx.numberOfItems) {
+ x += tdx.getItem(n).value;
+ }
+ if (n < ttdy.numberOfItems) {
+ y += ttdx.getItem(n).value;
+ } else if (n < tdy.numberOfItems) {
+ y += tdy.getItem(n).value;
+ }
+ if (tisYokogaki) {
+ x += tfontSize;
+ } else {
+ y += tfontSize;
+ }
+ this._list[this._list.length] = x;
+ this._list[this._list.length] = y;
+ ++n;
+ }
+ }
+ ti = ti.nextSibling;
+ }
+ }, false);
+ evt = tar = null;
+ }, false);
return this;
};
SVGTextContentElement.constructor = SVGElement;
@@ -2628,7 +2711,7 @@
/*unsigned short*/ SVGTextContentElement.LENGTHADJUST_SPACING = 1;
/*unsigned short*/ SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS = 2;
/*long*/ SVGTextContentElement.prototype.getNumberOfChars = function() {
- return (this._tar.innerText.length);
+ return (this._tar.length);
};
/*float*/ SVGTextContentElement.prototype.getComputedTextLength = function() {
this.getSubStringLength(0, this.getNumberOfChars());
@@ -2799,12 +2882,9 @@
/*readonly SVGAnimatedLengthList*/ this.dy = new SVGAnimatedLengthList();
/*readonly SVGAnimatedNumberList*/ this.rotate = new SVGAnimatedNumberList();
this.addEventListener("DOMAttrModified", function(evt){
- var tar = evt.target;
- if (evt.eventPhase === Event.BUBBLING_PHASE) {
- return; //強制終了させる
- }
- tar.x.baseVal.appendItem(tar.ownerDocument.documentElement.createSVGLength());
- tar.y.baseVal.appendItem(tar.ownerDocument.documentElement.createSVGLength());
+ var tar = evt.target, name = evt.attrName;
+ if ((name === "x") || (name === "y") || (name === "dx") || (name === "dy")) {
+ }
}, false);
return this;
};
@@ -2815,52 +2895,12 @@
SVGTextPositioningElement.apply(this, arguments);
this.addEventListener("DOMNodeInserted", function(evt){
if (evt.eventPhase === Event.BUBBLING_PHASE) {
+ if (evt.target.nodeType === Node.TEXT_NODE) {
+ }
return; //強制終了させる
}
var tar = evt.target;
- tar.parentNode._tar.appendChild(tar._tar);
- tar.addEventListener("DOMNodeInsertedIntoDocument", function(evt) {
- var tar = evt.target, ti = tar.firstChild;
- var x = y = n = 0; //現在のテキスト位置と順番
- var tx = tar.x.baseVal, ty = tar.y.baseVal;
- while (ti) {
- if (ti.nodeType === Node.TEXT_NODE) {
- var tt = ti._tar;
- for (var i=0, tli=tt.length;i<tli;++i) {
- if (n < tx.numberOfItems) {
- x = tx.getItem(n).value;
- }
- if (n < ty.numberOfItems) {
- y = ty.getItem(n).value;
- }
- var ts = tt[i].style;
- ts.left = x+"px";
- ts.top = y+"px";
- ++n;
- }
- } else if (ti.localName === "tspan" && ti.namespaceURI === "http://www.w3.org/2000/svg"){
- var tt = ti._tar, ttx = tt.x.baseVal, tty = tt.y.baseVal;
- for (var i=0, tli=tt.length;i<tli;++i) {
- if (n < ttx.numberOfItems) {
- x = ttx.getItem(n).value;
- } else if (n < tx.numberOfItems) {
- x = tx.getItem(n).value;
- }
- if (n < tty.numberOfItems) {
- y = ttx.getItem(n).value;
- } else if (n < ty.numberOfItems) {
- y = ty.getItem(n).value;
- }
- var ts = tt[i].style;
- ts.left = x+"px";
- ts.top = y+"px";
- ++n;
- }
- }
- }
- }, false);
- evt = tar = null;
- }, false);
+ },false);
return this;
};
SVGTextElement.constructor = SVGTextPositioningElement;