} else if ((eph === /*Event.CAPTURING_PHASE*/ 1) && (tar.nodeType === /*Node.ELEMENT_NODE*/ 1)\r
&& (tar.localName !== "tspan") && (tar.localName !== "text")) {\r
/*a要素などテキスト関連要素以外の要素が入っている場合を処理*/\r
+ var evtt = tar.ownerDocument.createEvent("MutationEvents");\r
+ evtt.initMutationEvent("DOMNodeInserted", true, false, tar.parentNode, null, null, null, null);\r
var f = function(ta) {\r
- var evtt = ta.ownerDocument.createEvent("MutationEvents");\r
- evtt.initMutationEvent("DOMNodeInserted", true, false, this, null, null, null, null);\r
while (ta) {\r
if ((ta.nodeType === /*Node.TEXT_NODE*/ 3) && !ta._tars) {\r
ta.dispatchEvent(evtt);\r
throw (new DOMException(/*DOMException.INDEX_SIZE_ERR*/ 1));\r
} else {\r
var tar = this,\r
- ti = tar.firstChild,\r
tp = tar.parentNode;\r
if (!!!tar._list) {\r
tar._list = [];\r
} else if (isText){\r
x -= hfsize;\r
}\r
- while (ti) {\r
- if (ti.nodeType === /*Node.TEXT_NODE*/ 3) {\r
- tt = ti._tars;\r
- /*tspan(tref)要素のx属性で指定された座標の個数よりも、文字数が多い場合は、祖先(親)のx属性を\r
- *使う。また、属性が指定されていないときも同様に祖先や親を使う。\r
- *もし、仮に祖先や親がx属性を指定されていなければ、現在のテキスト位置(変数xに格納している)を使う。\r
- *この処理はdx属性やdy、y属性でも同様とする\r
- *参照資料SVG1.1 Text\r
- *http://www.hcn.zaq.ne.jp/___/REC-SVG11-20030114/text.html\r
- *\r
- *注意:ここでは、tspan要素だけではなく、text要素にも適用しているが、本来はtspan要素のみに処理させること\r
- */\r
- for (var i=0, tli=tt.length;i<tli;++i) {\r
- if (n < ptx.numberOfItems - chars) {\r
- x = ptx.getItem(n).value;\r
- if (!isYokogaki) {\r
- x -= hfsize;\r
+ var f = function(ti) {\r
+ while (ti) {\r
+ if (ti.nodeType === /*Node.TEXT_NODE*/ 3) {\r
+ tt = ti._tars;\r
+ /*tspan(tref)要素のx属性で指定された座標の個数よりも、文字数が多い場合は、祖先(親)のx属性を\r
+ *使う。また、属性が指定されていないときも同様に祖先や親を使う。\r
+ *もし、仮に祖先や親がx属性を指定されていなければ、現在のテキスト位置(変数xに格納している)を使う。\r
+ *この処理はdx属性やdy、y属性でも同様とする\r
+ *参照資料SVG1.1 Text\r
+ *http://www.hcn.zaq.ne.jp/___/REC-SVG11-20030114/text.html\r
+ *\r
+ *注意:ここでは、tspan要素だけではなく、text要素にも適用しているが、本来はtspan要素のみに処理させること\r
+ */\r
+ for (var i=0, tli=tt.length;i<tli;++i) {\r
+ if (n < ptx.numberOfItems - chars) {\r
+ x = ptx.getItem(n).value;\r
+ if (!isYokogaki) {\r
+ x -= hfsize;\r
+ }\r
+ } else if (n < tx.numberOfItems) {\r
+ x = tx.getItem(n).value;\r
+ if (!isYokogaki) {\r
+ x -= hfsize;\r
+ }\r
}\r
- } else if (n < tx.numberOfItems) {\r
- x = tx.getItem(n).value;\r
- if (!isYokogaki) {\r
- x -= hfsize;\r
+ if (n < pty.numberOfItems - chars) {\r
+ y = pty.getItem(n).value;\r
+ if (isYokogaki) {\r
+ y += qfsize;\r
+ }\r
+ } else if (n < ty.numberOfItems) {\r
+ y = ty.getItem(n).value;\r
+ if (isYokogaki) {\r
+ y += qfsize;\r
+ }\r
}\r
- }\r
- if (n < pty.numberOfItems - chars) {\r
- y = pty.getItem(n).value;\r
- if (isYokogaki) {\r
- y += qfsize;\r
+ if (n < ptdx.numberOfItems - chars) {\r
+ x += ptdx.getItem(n).value;\r
+ } else if (n < tdx.numberOfItems) {\r
+ x += tdx.getItem(n).value;\r
+ }\r
+ if (n < ptdy.numberOfItems - chars) {\r
+ y += ptdy.getItem(n).value;\r
+ } else if (n < tdy.numberOfItems) {\r
+ y += tdy.getItem(n).value;\r
}\r
- } else if (n < ty.numberOfItems) {\r
- y = ty.getItem(n).value;\r
+ alm = 0;\r
if (isYokogaki) {\r
- y += qfsize;\r
+ //カーニングを求めて、字の幅を文字ごとに調整する\r
+ tdc = ti.data.charAt(i);\r
+ if (kern.indexOf(tdc) > -1) {\r
+ alm = fontSize * 0.68;\r
+ } else if (tdc === "s"){\r
+ alm = fontSize * 0.52;\r
+ } else if ((tdc === "C") || (tdc === "D") || (tdc === "M") || (tdc === "W") || (tdc === "G") || (tdc === "m")){\r
+ alm = qfsize;\r
+ } else if (akern.indexOf(tdc) > -1){\r
+ alm = fontSize * 0.45;\r
+ } else {\r
+ alm = fontSize * 0.3;\r
+ }\r
}\r
- }\r
- if (n < ptdx.numberOfItems - chars) {\r
- x += ptdx.getItem(n).value;\r
- } else if (n < tdx.numberOfItems) {\r
- x += tdx.getItem(n).value;\r
- }\r
- if (n < ptdy.numberOfItems - chars) {\r
- y += ptdy.getItem(n).value;\r
- } else if (n < tdy.numberOfItems) {\r
- y += tdy.getItem(n).value;\r
- }\r
- alm = 0;\r
- if (isYokogaki) {\r
- //カーニングを求めて、字の幅を文字ごとに調整する\r
- tdc = ti.data.charAt(i);\r
- if (kern.indexOf(tdc) > -1) {\r
- alm = fontSize * 0.68;\r
- } else if (tdc === "s"){\r
- alm = fontSize * 0.52;\r
- } else if ((tdc === "C") || (tdc === "D") || (tdc === "M") || (tdc === "W") || (tdc === "G") || (tdc === "m")){\r
- alm = qfsize;\r
- } else if (akern.indexOf(tdc) > -1){\r
- alm = fontSize * 0.45;\r
+ tlist = tar._list;\r
+ tlist[tlist.length] = x;\r
+ tlist[tlist.length] = y;\r
+ tlist[tlist.length] = fontSize - alm;\r
+ if (isYokogaki) {\r
+ x += fontSize;\r
+ x -= alm;\r
} else {\r
- alm = fontSize * 0.3;\r
+ y += fontSize;\r
}\r
+ ++n;\r
}\r
- tlist = tar._list;\r
- tlist[tlist.length] = x;\r
- tlist[tlist.length] = y;\r
- tlist[tlist.length] = fontSize - alm;\r
+ chars += tli;\r
+ ti = ti.nextSibling;\r
+ } else if (((ti.localName === "tspan") || (ti.localName === "tref"))\r
+ && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firstChild) {\r
+ /*現在のテキスト位置(x,y)の分だけ、tspan (tref)要素をずらしておく。\r
+ *さらに、現在のテキスト位置を更新する\r
+ */\r
+ ti._stx = x;\r
+ ti._sty = y;\r
+ ti._chars = chars;\r
+ p = ti.getStartPositionOfChar(ti.getNumberOfChars());\r
+ almx = almy = 0;\r
+ tlist = ti._list;\r
if (isYokogaki) {\r
- x += fontSize;\r
- x -= alm;\r
+ almx = tlist[tlist.length-1];\r
} else {\r
- y += fontSize;\r
+ almy = tlist[tlist.length-1];\r
}\r
- ++n;\r
- }\r
- chars += tli;\r
- if (ti.parentNode && (ti.parentNode.localName === "a")\r
- && !ti.nextSibling) { //a要素が親であり、かつ、テキストノード以外のノードを含まない場合は、tiを親に戻しておく\r
- ti = ti.parentNode;\r
- }\r
- ti = ti.nextSibling;\r
- } else if (((ti.localName === "tspan") || (ti.localName === "tref"))\r
- && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firstChild) {\r
- /*現在のテキスト位置(x,y)の分だけ、tspan (tref)要素をずらしておく。\r
- *さらに、現在のテキスト位置を更新する\r
- */\r
- ti._stx = x;\r
- ti._sty = y;\r
- ti._chars = chars;\r
- p = ti.getStartPositionOfChar(ti.getNumberOfChars());\r
- almx = almy = 0;\r
- tlist = ti._list;\r
- if (isYokogaki) {\r
- almx = tlist[tlist.length-1];\r
+ x = tlist[tlist.length-3] + almx;\r
+ y = tlist[tlist.length-2] + almy;\r
+ tar._list = tar._list.concat(tlist);\r
+ tg = ti.getNumberOfChars();\r
+ n += tg;\r
+ chars += tg;\r
+ ti = ti.nextSibling;\r
+ } else if ((ti.nodeType === /*Node.ELEMENT_NODE*/ 1)\r
+ && ((ti.localName !== "tspan") && (ti.localName !== "tref"))\r
+ && ti.firstChild) {\r
+ /*text関連要素以外の要素の内部にあるテキストノードも処理する*/\r
+ f(ti.firstChild);\r
+ ti = ti.nextSibling;\r
} else {\r
- almy = tlist[tlist.length-1];\r
+ ti = ti.nextSibling;\r
}\r
- x = tlist[tlist.length-3] + almx;\r
- y = tlist[tlist.length-2] + almy;\r
- tar._list = tar._list.concat(tlist);\r
- tg = ti.getNumberOfChars();\r
- n += tg;\r
- chars += tg;\r
- ti = ti.nextSibling;\r
- } else if ((ti.localName === "a") && (ti.namespaceURI === "http://www.w3.org/2000/svg") && ti.firstChild) {\r
- /*a要素のテキストノードも処理する*/\r
- ti = ti.firstChild;\r
- } else {\r
- ti = ti.nextSibling;\r
}\r
- }\r
+ };\r
+ f(tar.firstChild);\r
tar._isYokogaki = isYokogaki; //getEndPositionOfCharメソッドなどで使う\r
}\r
- tar = ti = isText = hfsize = qfsize = tp = ptx = pty = tx = ty = chars = style = x = y = isYokogaki = kern = akern = tt = alm = tdc = p = almx = almy = tlist = tg = void 0;\r
+ f = tar = isText = hfsize = qfsize = tp = ptx = pty = tx = ty = chars = style = x = y = isYokogaki = kern = akern = tt = alm = tdc = p = almx = almy = tlist = tg = void 0;\r
var s = this.ownerDocument.documentElement.createSVGPoint();\r
s.x = this._list[charnum*3];\r
s.y = this._list[charnum*3 + 1];\r