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