svnno****@sourc*****
svnno****@sourc*****
2009年 11月 12日 (木) 22:53:42 JST
Revision: 1404
http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1404
Author: dhrname
Date: 2009-11-12 22:53:42 +0900 (Thu, 12 Nov 2009)
Log Message:
-----------
0.53統合
Modified Paths:
--------------
trunk/sie.js
Property Changed:
----------------
trunk/sie.js
Modified: trunk/sie.js
===================================================================
--- trunk/sie.js 2009-11-12 13:49:19 UTC (rev 1403)
+++ trunk/sie.js 2009-11-12 13:53:42 UTC (rev 1404)
@@ -44,6 +44,9 @@
//これを頭に付けたら、内部処理用
var NAIBU = {};
+SIE = {
+ version : 0.53
+};
//documentを速くするために
/*@cc_on _d=document;eval('var document=_d')@*/
//bookmarkletから呼び出されたらtrue
@@ -88,13 +91,16 @@
document.body.appendChild(oba);
NAIBU.STObject.next();
success = true;
- } else if (/a/[-1] === 'a'){ //Firefoxだったらtrueを返す
- NAIBU.STObject.ffnext();
+ } else {
+ if (/a/[-1] === 'a'){ //Firefoxだったらtrueを返す
+ NAIBU.STObject.ffnext();
+ _noie_svgfont();
+ }
}
}
//他のページに移動する際に起動
function unsvgtovml() {
- NAIBU = stlog = STLog = null;
+ NAIBU = stlog = STLog = SIE = null;
}
//vmlの名前空間をセット(必須)
@@ -120,7 +126,7 @@
} else {
window['on'+evt] = lis;
}
-}
+};
NAIBU.addEvent("load",svgtovml);
NAIBU.addEvent("unload",unsvgtovml);
@@ -138,7 +144,7 @@
if (this.jo) {
this.p.innerHTML += "<p>"+code+":"+e.message+"</p>";
}
-}
+};
//SVGtoVML 本体。SVGDocumentの代わりを担う
//object要素の幅と高さがwとh(単位はpxに統一)。svg要素の幅と高さがswi.valueとshi.value。svg要素にwidth属性が指定されていない場合、swi.value=wである。
@@ -156,7 +162,7 @@
var mat = this.vi.set(sw, sh, ob); //返り値はMatrix型
this.chset(this.rootElement, mat, sw, sh);
} catch(n) {stlog.add(n,109);}
-}
+};
SVGtoVML.prototype.getObject = function stvgetob( /*string*/ tag, /*object*/ st, /*string*/nodes, /*float*/w, h) {
try {
var li = this.rootElement.getElementsByTagName(tag);
@@ -167,7 +173,7 @@
this[nodes] = la;
li = null;
} catch(e) {stlog.add(e,129);}
-}
+};
SVGtoVML.prototype.set = function stvset(ob) {
var w = this.w, h = this.h, c = this.children;
var sw = this.swi.value, sh = this.shi.value;
@@ -221,19 +227,19 @@
}
}
} catch(e) {stlog.add(e,138);}
-}
+};
SVGtoVML.prototype.setObject = function stvsetob( /*SVGElement*/ arr, /*float*/ sw, /*float*/ sh) {
try {
for (var i=0,arri=arr.length;i<arri;++i) {
arr[i].set(sw,sh);
}
} catch(e) {stlog.add(e,170);}
-}
+};
//chset childNodesで要素を作成していく
SVGtoVML.prototype.chset = function _s_chset( /*element*/ ele, /*Matrix*/ matrix, /*float*/w, /*float*/h){
var nods = ele.childNodes, s = null;
- var name = "group|shape|defs|STOP|fill|stroke|DIV|SPAN|A|image|rect|USE", gname = "DIV|group"; //要素名に合致させる文字列
+ var name = "group|shape|defs|STOP|fill|stroke|DIV|SPAN|A|image|rect|USE|FONTFACEURI", gname = "DIV|group"; //要素名に合致させる文字列
var cmatrix = matrix; //子要素に継がせるCTM
var te = nods[0];
if (te !== void 0) {
@@ -294,7 +300,7 @@
} while (te);
}
nods = name = gname = matrix = cmatrix = w = h = null;
-}
+};
//object要素とembed要素の取得を総括して行う
function Objectembeds(){
@@ -318,9 +324,10 @@
getURL(this.emd[n].src,ca,this.emd,n+1);
} catch(e) {stlog.add(e,185);this.next();}
} else { //全要素の読み込みが終われば
+ _ie_svgfont();
}
} catch(e) {stlog.add(e,293);this.onumber++;this.next();}
-}
+};
//embed要素をobject要素に変える(Firefoxのみ)
Objectembeds.prototype.ffnext = function(){
try{
@@ -332,10 +339,10 @@
var tep = tei.parentNode;
tep.insertBefore(s,tei);
tep.removeChild(tei);
- teli--;
+ teli--;
}
} catch(e) {stlog.add(e,294);}
-}
+};
//g要素の処理
function STGroupElement( /*element*/ g, /*Matrix*/ matrix, /*float*/w, h) {
@@ -353,7 +360,7 @@
try{
stvsetob(this.children,sw,sh);
this.children = this.transformable = null;
- } catch(e){stlog.addd(e,3145)}
+ } catch(e){stlog.addd(e,3145);}
};
STGroupElement.prototype.chset = SVGtoVML.prototype.chset;
@@ -379,7 +386,7 @@
txts.top = "0px";
txts.textDecoration = "none";
} catch(e) {stlog.add(e,204);}
-}
+};
//text要素の処理
function STText( /*element*/ te, /*Matrix*/ matrix, /*float*/w, h) {
@@ -406,6 +413,8 @@
var ttm = this.transformable;
var p = new Point(this.x.value,this.y.value);
var ptm = p.matrixTransform(ttm);
+ this.tar.w = w;
+ this.tar.h = h;
var tts = this.tar.style;
tts.position = "absolute";
var ttp = this.tar.parentNode;
@@ -469,7 +478,7 @@
} catch(e) {stlog.add(e,2831);}
p = ptm = tancx = tancy = null;
this.textLength = textLength;
-}
+};
//fontset フォントの大きさを幅と高さを使ってpx単位に変換
function fontset( /*float*/ f, /*float*/ w, /*float*/ h, /*Matrix*/ ttm) {
try {
@@ -509,9 +518,9 @@
}
p = ptm = w = h = null;
//ずれの値を返す
- return {dx : parseFloat(tts.left), dy : parseFloat(tts.top)}
+ return {dx : parseFloat(tts.left), dy : parseFloat(tts.top)};
} catch(e) {stlog.add(e,304);}
-}
+};
//line要素の処理
function STLine( /*element*/ li, /*Matrix*/ matrix, /*float*/w, h) {
@@ -537,7 +546,7 @@
this.paint.set(w, h, ttm);
list = pl = plm = dat = this.paint = ttm = this.transformable = w = h = null;
} catch(e) {stlog.add(e,257);}
-}
+};
//path要素の処理
function STPath( /*element*/ ele, /*Matrix*/ matrix) {
@@ -655,7 +664,7 @@
x = x2; y = y2;
}
return F;
-}
+};
//前回の座標を反転させる。それを挿入
NAIBU.nst = function ( /*int*/ skip, /*Array*/ F, /*float*/ x1, /*float*/ y1) {
@@ -666,7 +675,7 @@
F.splice(i, 0, x1, y1);
}
return F;
-}
+};
//相対座標を絶対座標に変換
NAIBU.reltoabs = function (/*float*/ x, /*float*/ y, /*Array*/ F) {
@@ -683,7 +692,7 @@
}
}
return F;
-}
+};
//polygon要素を処理
function STPolygon( /*element*/ ele, /*Matrix*/ matrix) {
@@ -709,7 +718,7 @@
ele.coordsize = w + " " + h;
this.paint.set(w, h, ttm);
} catch(e) {stlog.add(e,406);}
-}
+};
//polyline要素を処理
function STPolyline( /*element*/ ele, /*Matrix*/ matrix) {
@@ -735,7 +744,7 @@
ele.coordsize = w + " " + h;
this.paint.set(w, h, ttm);
} catch(e) {stlog.add(e,440);}
-}
+};
//circle要素を処理
function STCircle( /*element*/ ele, /*Matrix*/ matrix, /*float*/w, h) {
@@ -769,7 +778,7 @@
this.paint.set(w, h, ttm);
dat = list = pl = plm = this.paint = ttm = this.transformable = w = h = null; //解放
} catch(e) {stlog.add(e,479);}
-}
+};
//ellipse要素を処理
function STEllipse( /*element*/ ele, /*Matrix*/ matrix, /*float*/w, h) {
@@ -803,7 +812,7 @@
this.paint.set(w, h, ttm);
dat = list = pl = plm = this.paint = ttm = this.transformable = w = h = null; //解放
} catch(e) {stlog.add(e,519);}
-}
+};
//rect要素を処理
function STRectElement( /*element*/ rect, /*Matrix*/ matrix, /*float*/ w, h) {
@@ -854,7 +863,7 @@
this.paint.set(w, h, ttm);
dat = list = pl = plm = this.paint = ttm = this.transformable = w = h = null; //解放
} catch(ee) {stlog.add(ee,576);}
-}
+};
//image要素の処理
function STImage( /*element*/ ele, /*Matrix*/ matrix, /*float*/w, h){
@@ -867,7 +876,7 @@
this.xlink = new NAIBU.XLink(ele);
this.paint = new NAIBU.PaintColor(ele);
this.transformable = NAIBU.transformToCTM(ele,matrix);
- w = h = null
+ w = h = null;
return this;
}
STImage.prototype.set = function imagesets(w,h){
@@ -896,13 +905,13 @@
this.xlink.set();
dat = pt = this.xlink = this.paint = ttm = this.transformable = w = h = null; //解放
} catch(e) {stlog.set(e,21896);}
-}
+};
/*use要素の処理*/
function STUseElement( /*element*/ ele, /*float*/w, h){
this.tar = ele;
var tns = ele.nextSibling;
- tns.setAttribute("xlink:show", "embed")
+ tns.setAttribute("xlink:show", "embed");
this.x = new STLength((tns.getAttribute("x") || 0), w);
this.y = new STLength((tns.getAttribute("y") || 0), h);
this.width = new STLength(tns.getAttribute("svgwidth"), w);
@@ -923,7 +932,7 @@
this.paint.setStyle();
this.paint = this.xlink = null;
} catch(e) {stlog.add(e,85436);}
-}
+};
//色のキーワード
//PaintColor 色、線などをすべてコントロール
@@ -1002,7 +1011,7 @@
//内部プロパティを、styleに設定する
NAIBU.PaintColor.prototype.setStyle = function() {
try {
- var tst = this.tar
+ var tst = this.tar;
for (var i in this) {
if ((typeof this[i]) === "string") { //string型以外は除く
tst.style[i] = this[i];
@@ -1359,7 +1368,7 @@
td["text-anchor"] = "start";
NAIBU.PaintColor.apply(this,arguments);
return this;
-}
+};
NAIBU.FontStyle.prototype = new NAIBU.PaintColor(false);
//キャッシュ用
NAIBU.FontStyle.prototype.cache = {};
@@ -1377,12 +1386,12 @@
}
} catch(e){stlog.add(e,1179);}
return cache[id];
-}
+};
//内部プロパティを、styleに設定する
NAIBU.FontStyle.prototype.setStyle = function() {
try {
- var tst = this.tar
+ var tst = this.tar;
for (var i in this) {
var ti = this[i];
if ((typeof ti) === "string") { //string型以外は除く
@@ -1396,7 +1405,7 @@
}
}
} catch(e) {stlog.add(e,1396); return "";}
-}
+};
NAIBU.FontStyle.prototype.fset = function( /*float*/ w, /*float*/ h, /*Matrix*/ matrix) {
try{
this.setStyle();
@@ -1411,9 +1420,9 @@
this.writingMode = tts.writingMode;
tts.marginTop = (this.writingMode === "tb-rl") ? "0px" : -parseFloat(tts.fontSize)+ "px";
tts.textIndent = "0px";
- tts.lineHeight = this.fontSize+ "px"
+ tts.lineHeight = this.fontSize+ "px";
} catch(e){stlog.add(e,1185);}
-}
+};
//NAIBU.transformToCTM transform属性を処理。Matrix型に変換
//あらかじめ正規表現オブジェクトを生成しておく
@@ -1502,7 +1511,7 @@
}
var s = new PList(F);
return s;
-}
+};
//SVGMatrixを参照。行列
function Matrix(a,b,c,d,e,f) { //引数はすべてNumber型
@@ -1620,7 +1629,7 @@
var m = new Matrix(xr, 0, 0, yr, 0, 0);
return m;
} catch(e) {stlog.add(e,1031);}
-}
+};
//SVGRectを参照
function STRect(x,y,w,h) { //引数はすべてNumber型
@@ -1644,19 +1653,19 @@
s.D = plst.matrixTransform(matrix).list;
plst = null;
return s;
-}
+};
//2つの点から角度を算出
STArc.prototype.CVAngle = function starccvangle(ux,uy,vx,vy) {
var rad = Math.atan2(vy, vx) - Math.atan2(uy, ux);
return (rad >= 0) ? rad : 2 * Math.PI + rad;
-}
+};
//弧をベジェ曲線に変換
STArc.prototype.set = function starcset(x1,y1,rx,ry,psai,fA,fS,x4,y4) {
- var fS = parseFloat(fS), rx = parseFloat(rx), ry = parseFloat(ry), psai = parseFloat(psai), x1 = parseFloat(x1), x4 = parseFloat(x4), y1 = parseFloat(y1), y4 = parseFloat(y4);
+ var fS = parseFloat(fS), rx = parseFloat(rx), ry = parseFloat(ry), psai = parseFloat(psai), x1 = parseFloat(x1), x4 = parseFloat(x4), y1 = parseFloat(y1), y4 = parseFloat(y4);
if (rx === 0 || ry === 0) {throw "line";}
rx = Math.abs(rx); ry = Math.abs(ry);
var ccx = (x1 - x4) / 2, ccy = (y1 - y4) / 2;
- var cpsi = Math.cos(psai*Math.PI/180), spsi = Math.sin(psai*Math.PI/180);
+ var cpsi = Math.cos(psai*Math.PI/180), spsi = Math.sin(psai*Math.PI/180);
var x1d = cpsi*ccx + spsi*ccy, y1d = -1*spsi*ccx + cpsi*ccy;
var x1dd = x1d * x1d, y1dd = y1d * y1d;
var rxx = rx * rx, ryy = ry * ry;
@@ -1675,8 +1684,8 @@
}
var cxd = sds*rx*y1d / ry, cyd = -1 * sds*ry*x1d / rx;
var cx = cpsi*cxd - spsi*cyd + (x1+x4)/2, cy = spsi*cxd + cpsi*cyd + (y1+y4)/2;
- var s1 = this.CVAngle(1,0,(x1d-cxd)/rx,(y1d-cyd)/ry);
- var dr = this.CVAngle((x1d-cxd)/rx,(y1d-cyd)/ry,(-x1d-cxd)/rx,(-y1d-cyd)/ry);
+ var s1 = this.CVAngle(1,0,(x1d-cxd)/rx, (y1d-cyd)/ry);
+ var dr = this.CVAngle((x1d-cxd)/rx, (y1d-cyd)/ry, (-x1d-cxd)/rx, (-y1d-cyd)/ry);
if (!fS && dr > 0) {
dr -= 2*Math.PI;
} else if (fS && dr < 0) {
@@ -1687,22 +1696,17 @@
var segr = dr / seg;
var nea = [];
var t = 8/3 * Math.sin(segr/4) * Math.sin(segr/4) / Math.sin(segr/2);
- var cpsirx = cpsi * rx;
- var cpsiry = cpsi * ry;
- var spsirx = spsi * rx;
- var spsiry = spsi * ry;
+ var cpsirx = cpsi * rx, cpsiry = cpsi * ry;
+ var spsirx = spsi * rx, spsiry = spsi * ry;
var mc = Math.cos(s1);
var ms = Math.sin(s1);
- var x2 = x1 - t * (cpsirx * ms + spsiry * mc);
- var y2 = y1 - t * (spsirx * ms - cpsiry * mc);
+ var x2 = x1 - t * (cpsirx * ms + spsiry * mc), y2 = y1 - t * (spsirx * ms - cpsiry * mc);
for (var i = 0; i < seg; ++i) {
s1 += segr;
mc = Math.cos(s1);
ms = Math.sin(s1);
- var x3 = cpsirx * mc - spsiry * ms + cx;
- var y3 = spsirx * mc + cpsiry * ms + cy;
- var dx = -t * (cpsirx * ms + spsiry * mc);
- var dy = -t * (spsirx * ms - cpsiry * mc);
+ var x3 = cpsirx * mc - spsiry * ms + cx, y3 = spsirx * mc + cpsiry * ms + cy;
+ var dx = -t * (cpsirx * ms + spsiry * mc), dy = -t * (spsirx * ms - cpsiry * mc);
nea = nea.concat([x2, y2, x3 - dx, y3 - dy, x3, y3]);
x2 = x3 + dx;
y2 = y3 + dy;
@@ -1710,14 +1714,14 @@
this.D = (this.D ? this.D.concat(nea) : nea);
nea = null;
return true;
-}
+};
//setをできるだけ繰り返す
STArc.prototype.sset = function starcsset( /*float*/ nox, /*float*/ noy, /*array*/ f, /*float*/ rx, /*float*/ ry) {
for (var i=1,fli=f.length;i<fli+1;i+=7){
this.set(nox,noy,f[i],f[i+1],f[i+2],f[i+3],f[i+4],f[i+5]+rx,f[i+6]+ry);
nox = f[i+5]+rx; noy = f[i+6]+ry;
}
-}
+};
//SVGLengthを参照
function STLength( /*string or number*/ d, /*float*/ wort, /*float*/ f) {
@@ -1742,7 +1746,7 @@
d = wort = f = v = tani = ut = null; //解放
} catch(e) {stlog.add(e,1133); this.value = 1000;}
return this;
-}
+};
STLength.prototype._dR = /\D+$/; //RegExpオブジェクトをあらかじめ生成
STLength.prototype._n = [1, 0.01, 1, 1, 1, 35.43307, 3.543307, 90, 1.25, 15]; //利用単位への変換値
STLength.prototype._tani = { //単位に番号を振る
@@ -1755,7 +1759,7 @@
"ex": 4,
"px": 5,
"%": 2
-}
+};
STLength.prototype.newValueSpecifiedUnits = function ( /*number*/ ut, /*number*/ value) {
this.unitType = ut;
this.value = value * this._n[ut-1];
@@ -1802,7 +1806,7 @@
this.href = null;
}
return this;
-}
+};
NAIBU.XLink.prototype.set = function() {
try {
if (this.href) {
@@ -1836,8 +1840,165 @@
}
}
} catch(e) {stlog.add(e,17155);}
-}
+};
+function _ie_svgfont() {
+ try {
+ var tsrc = document.getElementsByTagName("FONTFACEURI");
+ for (var i=0;i<tsrc.length;++i) {
+ var src = tsrc[i].getAttribute("xlink:href"), ids = src.substring(src.indexOf("#")+1, src.length);
+ getURL(src.replace(/#.+$/, ""), _ie_font, [ {id : ids, style:{}} ], 1);
+ }
+ } catch (e) {stlog.add(e,1847);}
+};
+NAIBU.svgNameSpace = "http://www.w3.org/2000/svg";
+function _ie_font(data) {
+ if (data.success) {
+ //responsXMLはDTD処理を行う可能性があるため、ここでは使わない
+ var doc = new ActiveXObject("MSXML2.DomDocument");
+ str = data.content.replace(/!DOCTYPE/,"!--").replace(/(dtd">|\]>)/,"-->");
+ doc.loadXML(str);
+ //getElementByIdは使えないので注意(DTDでの指定が必要)
+ var font = doc.getElementsByTagName("font").item(0);
+ var familyName = font.getElementsByTagName("font-face").item(0).getAttribute("font-family");
+ if (familyName && font.getAttribute("id") === data.obj[0].id) {
+ var textElements = document.getElementsByTagName("div");
+ for (var i=0,tli=textElements.length;i<tli;++i) {
+ var ti = textElements[i], ts = ti.style, tsff = (!!ts.fontFamily) ? ts.fontFamily : "serif";
+ if (tsff.indexOf(familyName) > -1) {
+ NAIBU._ie_createFont(ti, font);
+ }
+ }
+ }
+ }
+};
+NAIBU._ie_createFont = function(/*Element*/ ti, /*Element*/ font) {
+ var node = ti.firstChild, data, glyphs = font.getElementsByTagName("glyph"), em = parseFloat(font.getElementsByTagName("font-face").item(0).getAttribute("units-per-em") || 0);
+ var advX = parseFloat(font.getAttribute("horiz-adv-x")), originX = parseFloat(font.getAttribute("horiz-origin-x") || 0), originY = parseFloat(font.getAttribute("horiz-origin-y") || 0); //字幅とフォントの原点の設定
+ var dx = parseFloat(ti.style.left), fontSize = parseFloat(ti.style.fontSize), dy = parseFloat(ti.style.top) - fontSize * 0.25, fe = fontSize / em; //0.25はディセンダの調整をあらかじめしているため
+ while(node) {
+ data = node.data;
+ if (data !== void 0) { //dataがある場合
+ var advanceX = [], glyphData = [];
+ for (var i=0,gli=glyphs.length;i<gli;++i) {
+ //indexは該当する文字が何番目にあるかの数字
+ var index = data.indexOf(glyphs[i].getAttribute("unicode"));
+ if (index > -1) {
+ advanceX[index] = parseFloat(glyphs[i].getAttribute("horiz-adv-x") || advX); //字幅を収納
+ glyphData[index] = glyphs[i].getAttribute("d");
+ }
+ }
+ for (var i=0,adv=0;i<data.length;++i) {
+ if (advanceX[i] !== void 0) { //配列に含まれていれば
+ var path = document.createElement("v:shape");
+ //advance、すなわち字幅の長さ分、ずらしていく
+ var x = dx + adv*fe;
+ ti.parentNode.insertBefore(path, ti);
+ path.style.cssText = ti.style.cssText;
+ NAIBU.pathData(glyphData[i], path, true, ti.w, ti.h, (new Matrix(fe, 0, 0, -fe, x, dy)));
+ adv += advanceX[i];
+ }
+ }
+ advanceX = glyphData = null;
+ } else {
+ NAIBU._ie_createFont(node, font);
+ }
+ node = node.nextSibling;
+ }
+ ti.style.visibility = "hidden";
+};
+//IE以外、Firefox用
+function _noie_svgfont() {
+ var obj = document.getElementsByTagName("object");
+ for (var i=0;i<obj.length;++i) {
+ var s, obji = obj[i];
+ if (obji.getSVGDocument !== void 0 && window.opera === void 0) { //Operaでなければ、かつ、void 0はundefinedのこと
+ if (obji.contentDocument !== void 0) { //Firefoxの場合
+ s = obji.contentDocument;
+ } else {
+ s = obji.getSVGDocument();
+ }
+ NAIBU._fontSearchURI(s);
+ }
+ NAIBU._fontSearchURI(document);
+ }
+};
+//font-face-uri要素に書かれたuriを手がかりに、Ajaxを使ってファイルを読み込む
+NAIBU._fontSearchURI = function(doc){
+ var tsrc = doc.getElementsByTagNameNS(NAIBU.svgNameSpace, "font-face-uri");
+ for (var i=0;i<tsrc.length;++i) {
+ var src = tsrc[i].getAttributeNS("http://www.w3.org/1999/xlink", "href"), ids = src.substring(src.indexOf("#")+1, src.length);
+ getURL(src.replace(/#.+$/, ""), _noie_font, [ {id : ids, style : {}, docu : doc} ], 1);
+ }
+};
+function _noie_font(data) {
+ if (data.success) {
+ var doc = (new DOMParser()).parseFromString(data.content, "text/xml");
+ //getElementByIdは使えないので注意(DTDでの指定が必要)
+ var font = doc.getElementsByTagNameNS(NAIBU.svgNameSpace, "font").item(0);
+ var familyName = font.getElementsByTagNameNS(NAIBU.svgNameSpace, "font-face").item(0).getAttributeNS(null, "font-family");
+ if (familyName && font.getAttributeNS(null, "id") === data.obj[0].id) {
+ var textElements = data.obj[0].docu.getElementsByTagNameNS(NAIBU.svgNameSpace, "text");
+ for (var i=0,tli=textElements.length;i<tli;++i) {
+ var ti = textElements[i], style = data.obj[0].docu.defaultView.getComputedStyle(ti, '');
+ if (style.fontFamily.indexOf(familyName) > -1) {
+ NAIBU._noie_createFont(ti, font);
+ }
+ }
+ }
+ doc = data = null;
+ }
+};
+NAIBU._noie_createFont = function(/*Element*/ ti, /*Element*/ font) {
+ var style = ti.ownerDocument.defaultView.getComputedStyle(ti, '')
+ var node = ti.firstChild, data, glyphs = font.getElementsByTagNameNS(NAIBU.svgNameSpace, "glyph"), em = parseFloat(font.getElementsByTagNameNS(NAIBU.svgNameSpace, "font-face").item(0).getAttribute("units-per-em") || 0);
+ var advX = parseFloat(font.getAttributeNS(null, "horiz-adv-x")), originX = parseFloat(font.getAttributeNS(null, "horiz-origin-x") || 0), originY = parseFloat(font.getAttributeNS(null, "horiz-origin-y") || 0); //字幅とフォントの原点の設定
+ var dx = parseFloat(ti.getAttributeNS(null, "x") || 0), fontSize = parseFloat(style.fontSize), dy = parseFloat(ti.getAttributeNS(null, "y") || 0), fe = fontSize / em;
+ while(node) {
+ data = node.data;
+ if (data !== void 0) { //dataがある場合
+ var advanceX = [], glyphData = [];
+ for (var i=0,gli=glyphs.length;i<gli;++i) {
+ //indexは該当する文字が何番目にあるかの数字
+ var index = data.indexOf(glyphs[i].getAttributeNS(null, "unicode"));
+ if (index > -1) {
+ advanceX[index] = parseFloat(glyphs[i].getAttributeNS(null, "horiz-adv-x") || advX); //字幅を収納
+ glyphData[index] = glyphs[i].getAttributeNS(null, "d");
+ }
+ }
+ for (var i=0,adv=0;i<data.length;++i) {
+ if (advanceX[i] !== void 0) { //配列に含まれていれば
+ var path = ti.ownerDocument.createElementNS(NAIBU.svgNameSpace, "path");
+ //advance、すなわち字幅の長さ分、ずらしていく
+ var x = dx + adv*fe;
+ ti.parentNode.insertBefore(path, ti);
+ path.style.cssText = style.cssText;
+ NAIBU.pathData(glyphData[i], path, false, 0, 0, (new Matrix(fe, 0, 0, -fe, x, dy)));
+ adv += advanceX[i];
+ }
+ }
+ advanceX = glyphData = null;
+ } else {
+ NAIBU._noie_createFont(node, font);
+ }
+ node = node.nextSibling;
+ }
+ ti.style.opacity = "0";
+};
+NAIBU.pathData = function(/*string*/ data, /*Element*/ p, /*boolean*/ t, /*float*/ w, h, /*Matrix*/ matrix) {
+ //CTMでフォントを移動させておく
+ if (t) { //IEならば
+ var s = new STPath(p, matrix);
+ s.d = data;
+ s.set(w,h);
+ s = null;
+ } else {
+ p.setAttributeNS(null, "transform", "matrix(" +matrix.a+ "," +matrix.b+ "," +matrix.c+ "," +matrix.d+ "," +matrix.e+ "," +matrix.f+ ")");
+ p.setAttributeNS(null, "d", data);
+ }
+ matrix = data = null;
+};
+
function utf16( /*string*/ s) {
return unescape(s);
}
@@ -1940,7 +2101,9 @@
.replace(/<use\s/g, "<use /><v:group ")
.replace(/\/use>/g, "/v:group>")
.replace(/<defs(?=\s|>)/g, "<dn:defs")
- .replace(/\/defs>/g, "/dn:defs>");
+ .replace(/\/defs>/g, "/dn:defs>")
+ .replace(/<font-face-?/g, "<fontface")
+ .replace(/<\/font-face-?/g, "</fontface");
var ob = document.createElement("v:group");
var obst = ob.style;
ob.innerHTML = dc;
@@ -1977,7 +2140,7 @@
fn({success:true,content:xmlhttp.responseText,obj:ob,num:n});
xmlhttp = null;
}
- }
+ };
xmlhttp.send(null);
} else {
fn({success:false});
Property changes on: trunk/sie.js
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/04x/040/sie.js:812-829
/branches/04x/041/sie.js:891-923
/branches/04x/042/sie.js:927-967
/branches/04x/043/sie.js:969-1013
/branches/04x/044/sie.js:1015-1067
/branches/04x/045/sie.js:1069-1078
/branches/04x/046/sie.js:1080-1129
/branches/04x/047/sie.js:1131-1164
/branches/04x/048/sie.js:1166-1180
/branches/04x/sie.js:830-1181
/branches/05x/050/sie.js:1183-1201
/branches/05x/051/sie.js:1207-1323
/branches/05x/052/sie.js:1325-1352
/branches/05x/sie.js:1183-1355
+ /branches/04x/040/sie.js:812-829
/branches/04x/041/sie.js:891-923
/branches/04x/042/sie.js:927-967
/branches/04x/043/sie.js:969-1013
/branches/04x/044/sie.js:1015-1067
/branches/04x/045/sie.js:1069-1078
/branches/04x/046/sie.js:1080-1129
/branches/04x/047/sie.js:1131-1164
/branches/04x/048/sie.js:1166-1180
/branches/04x/sie.js:830-1181
/branches/05x/050/sie.js:1183-1201
/branches/05x/051/sie.js:1207-1323
/branches/05x/052/sie.js:1325-1352
/branches/05x/053/sie.js:1354-1400
/branches/05x/sie.js:1183-1403