[Sie-announce] SIEコード [1376]

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2009年 10月 28日 (水) 23:39:41 JST


Revision: 1376
          http://sourceforge.jp/projects/sie/svn/view?view=rev&revision=1376
Author:   dhrname
Date:     2009-10-28 23:39:41 +0900 (Wed, 28 Oct 2009)

Log Message:
-----------


Modified Paths:
--------------
    branches/05x/053/sie.js

Modified: branches/05x/053/sie.js
===================================================================
--- branches/05x/053/sie.js	2009-10-28 11:53:27 UTC (rev 1375)
+++ branches/05x/053/sie.js	2009-10-28 14:39:41 UTC (rev 1376)
@@ -1832,24 +1832,28 @@
   }
   } catch(e) {stlog.add(e,17155);}
 };
+
 function _ie_svgfont() {
-  var tsrc = document.getEelmentsByTagName("font-face-uri");
+  var tsrc = document.getEelmentsByTagName("FONT-FACE-URI");
   for (var i=0;i<tsrc.length;++i) {
     var src = fsrc[i].getAttribute("xlink:href");
     getURL(src, _ie_font, [ {id : src.substring(src.indexOf("#"), src.length-1)} ], 1);
   }
 };
+NAIBU.svgNameSpace = "http://www.w3.org/2000/svg"
 function _ie_font(data) {
   if (data.sucesse) {
-    var s = new DOMParser();
-    var doc = s.pareseFromString(data.content);
-    font = doc.getElementById(data.obj[0].id);
-    familyName = font.getElementsByTagNameNS("http://www.w3.org/2000/svg", "font-face").item(0).getAttribute("font-family");
+    //responsXMLはDTD処理を行う可能性があるため、ここでは使わない
+    var doc = new ActiveXObject("MSXML2.DomDocument");
+    str = data.content.replace(/!DOCTYPE/,"!--").replace(/(dtd">|\]>)/,"-->");
+    doc.loadXML(str);
+    var font = doc.getElementById(data.obj[0].id);
+    var familyName = font.getElementsByTagNameNS(NAIBU.svgNameSpace, "font-face").item(0).getAttribute("font-family");
     if (familyName) {
       var textElements = document.getElementByTagName("div");
       for (var i=0,tli=textElements.length;i<tli;++i) {
-        var ti = textElements[i];
-        if (ti.style.fontFamily.indexOf(familyName) > -1) {
+        var ti = textElements[i], ts = ti.style, tsff = (!!ts.fontFamily) ? ts.fontFamily : "serif";
+        if (tsff.indexOf(familyName) > -1) {
           NAIBU._ie_createFont(ti, font);
         }
       }
@@ -1864,12 +1868,70 @@
     if (data !== void 0) { //dataがある場合
       for (var i=0,gli=glyphs.length;i<gli;++i) {
         var index = data.indexOf(glyphs[i].getAttribute("unicode")), path = document.createElement("v:shape");
-        /*カーニング処理について(To DO)
-         *カーニングに該当する文字を検索して、ずらしたい長さだけ、以降のxとyから引く必要がある
-         */
-        var x = dx * fontSize * index, y = dy * fontSize * index;
+        if (index > -1) {
+          //fontSizeと文字数をかけた長さ分、ずらしていく
+          var x = dx + fontSize * index, y = dy + fontSize * index;
+          ti.insertBefore(path);
+          NAIBU.pathData(glyphs[i].getAttribute("d"), path, true, x, y);
+        }
+      }
+    } else {
+      NAIBU._ie_createFont(node, font);
+    }
+    node = node.nextSibling;
+  }
+};
+//IE以外のブラウザ用
+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) { //void 0はundefinedのこと
+      if (obji.contentDocument !== void 0) { //Firefoxの場合
+        s = obji.contentDocument;
+      } else {
+        s = obji.getSVGDocument();
+      }
+    }
+    NAIBU._fontSearchURI(s);
+    NAIBU._fontSearchURI(document);
+  }
+};
+NAIBU._fontSearchURI = function(doc){
+  var tsrc = doc.getElementsByTagNameNS(NAIBU.svgNameSpace, "font-face-uri");
+  for (var i=0;i<tsrc.length;++i) {
+    var src = fsrc[i].getAttributeNS("http://www.w3.org/1999/xlink", "xlink:href");
+    getURL(src, _noie_font, [ {id : src.substring(src.indexOf("#"), src.length-1)} ], 1);
+  }
+};
+function _noie_font(data) {
+  if (data.sucesse) {
+    var doc = (new DOMParser()).parseFromString(data.content);
+    var font = doc.getElementById(data.obj[0].id);
+    var familyName = font.getElementsByTagNameNS(NAIBU.svgNameSpace, "font-face").item(0).getAttributeNS(null, "font-family");
+    if (familyName) {
+      var textElements = document.getElementByTagNameNS(NAIBU.svgNameSpace, "text");
+      for (var i=0,tli=textElements.length;i<tli;++i) {
+        var ti = textElements[i];
+        if ((ti.getProperty("font-family") || "serif").indexOf(familyName) > -1) {
+          NAIBU._ie_createFont(ti, font);
+        }
+      }
+    }
+  }
+};
+NAIBU._noie_createFont = function(/*Element*/ ti, /*Element*/ font) {
+  var node = ti.firstChild, data, glyphs = font.getElementsByTagNameNS(NAIBU.svgNameSpace, "glyph");
+  var dx = parseFloat((ti.getAttributeNS(null, "x") || 0)), dy = parseFloat((ti.getAttributeNS(null, "y") || 0)), fontSize = parseFloat((ti.getProperty("font-size") || 12));
+  while(node) {
+    data = node.data;
+    if (data !== void 0) { //dataがある場合
+      for (var i=0,gli=glyphs.length;i<gli;++i) {
+        var index = data.indexOf(glyphs[i].getAttributeNS(null, "unicode")), path = document.createElementNS(NAIBU.svgNameSpace, "path");
+        //fontSizeと文字数をかけた長さ分、ずらしていく
+        var x = dx + fontSize * index, y = dy + fontSize * index;
         ti.insertBefore(path);
-        NAIBU.pathData(glyphs[i].getAttribute("d"), path, true, x, y);
+        NAIBU.pathData(glyphs[i].getAttributeNS(null, "d"), path, false, x, y);
       }
     } else {
       NAIBU._ie_createFont(node, font);
@@ -1886,7 +1948,8 @@
     s.set(w,h);
   } else {
     p.setAttributeNS(null, "transform", "matrix(" +matrix.a+ "," +matrix.b+ "," +matrix.c+ "," +matrix.d+ "," +matrix.e+ "," +matrix.f+ ")");
-   }
+    p.setAttributeNS(null, "d", data);
+  }
   fe = matrix = null;
 };
 




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