[Sie-announce] SIEコード [1404] 0. 53統合

Back to archive index

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




Sie-announce メーリングリストの案内
Back to archive index