前述のとおりsieはhtmlに埋め込まれたsvg記述のグラフィック出力に対応している.実際にこの機能を利用するにはかなりの試行錯誤が必要となる.ここではできる限りクロスブラウザでのsvg表示を容易にする方法を紹介するので,これをベースに各自カスタマイズして欲しい.
更に,次のスクリプトを文字コードutf-8でjsファイルに保存し,(例えばファイル名を「sie-inline.js」として)サーバーにアップロードしておこう.このページで使っているものはこちら.
/*
sie用インラインsvg表示スクリプト
by defghi1977
*/
//http://ejohn.org/blog/html5-shiv/
document.createElement("svg");
window.onload = function(){
//svg要素名称のマッピング
var elementNameMap = {
"A" : "a",
"ALTGLYPH" : "altGlyph",
"ALTGLYPHDEF" : "altGlyphDef",
"ALTGLYPHITEM" : "altGlyphItem",
"ANIMATE" : "animate",
"ANIMATECOLOR" : "animateColor",
"ANIMATEMOTION" : "animateMotion",
"ANIMATETRANSFORM" : "animateTransform",
"CIRCLE" : "circle",
"CLIPPATH" : "clipPath",
"COLOR-PROFILE" : "color-profile",
"CURSOR" : "cursor",
"DEFS" : "defs",
"DESC" : "desc",
"ELLIPSE" : "ellipse",
"FEBLEND" : "feBlend",
"FECOLORMATRIX" : "feColorMatrix",
"FECOMPONENTTRANSFER" : "feComponentTransfer",
"FECOMPOSITE" : "feComposite",
"FECONVOLVEMATRIX" : "feConvolveMatrix",
"FEDIFFUSELIGHTING" : "feDiffuseLighting",
"FEDISPLACEMENTMAP" : "feDisplacementMap",
"FEDISTANTLIGHT" : "feDistantLight",
"FEFLOOD" : "feFlood",
"FEFUNCA" : "feFuncA",
"FEFUNCB" : "feFuncB",
"FEFUNCG" : "feFuncG",
"FEFUNCR" : "feFuncR",
"FEGAUSSIANBLUR" : "feGaussianBlur",
"FEIMAGE" : "feImage",
"FEMERGE" : "feMerge",
"FEMERGENODE" : "feMergeNode",
"FEMORPHOLOGY" : "feMorphology",
"FEOFFSET" : "feOffset",
"FEPOINTLIGHT" : "fePointLight",
"FESPECULARLIGHTING" : "feSpecularLighting",
"FESPOTLIGHT" : "feSpotLight",
"FETILE" : "feTile",
"FETURBULENCE" : "feTurbulence",
"FILTER" : "filter",
"FONT" : "font",
"FONT-FACE" : "font-face",
"FONT-FACE-FORMAT" : "font-face-format",
"FONT-FACE-NAME" : "font-face-name",
"FONT-FACE-SRC" : "font-face-src",
"FONT-FACE-URI" : "font-face-uri",
"FOREIGNOBJECT" : "foreignObject",
"G" : "g",
"GLYPH" : "glyph",
"GLYPHREF" : "glyphRef",
"HKERN" : "hkern",
"IMAGE" : "image",
"LINE" : "line",
"LINEARGRADIENT" : "linearGradient",
"MARKER" : "marker",
"MASK" : "mask",
"METADATA" : "metadata",
"MISSING-GLYPH" : "missing-glyph",
"MPATH" : "mpath",
"PATH" : "path",
"PATTERN" : "pattern",
"POLYGON" : "polygon",
"POLYLINE" : "polyline",
"RADIALGRADIENT" : "radialGradient",
"RECT" : "rect",
"SCRIPT" : "script",
"SET" : "set",
"STOP" : "stop",
"STYLE" : "style",
"SVG" : "svg",
"SWITCH" : "switch",
"SYMBOL" : "symbol",
"TEXT" : "text",
"TEXTPATH" : "textPath",
"TITLE" : "title",
"TREF" : "tref",
"TSPAN" : "tspan",
"USE" : "use",
"VIEW" : "view",
"VKERN" : "vkern"
};
var svgs = document.getElementsByTagName("svg");
for(var i = 0, len = svgs.length; i<len; i++){
var svg = svgs[0];
var source
= "<svg"
+ toAttributesNotation(svg)
+ ' xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">'
+ fixHTML(svg.innerHTML)
+ "</svg>";
var script = document.createElement("script");
script.type = "image/svg+xml";
script.text = source;
var parent = svg.parentNode;
parent.replaceChild(script, svg);
}
//svg要素の属性を属性記述に変換する.
function toAttributesNotation(svg){
var attrs = svg.attributes;
var result = "";
for(var i=0, len=attrs.length; i<len; i++){
var attr = attrs[i];
if(attr.value == "null"){
continue;
}
result += (" " + attr.name + '="' + attr.value + '"');
}
return result;
}
//勝手に変えられてしまったinnerHTMLを元に戻す.
function fixHTML(html){
var result = html;
//属性の値を二重引用符で囲む.
result = result.replace(/\s([a-z|A-Z|0-9|-]+?)=([^"]+?)([\s|>])/g,' $1="$2"$3');
//大文字に変換されてしまった要素名を正しいものに直す.
result = fixTagName(result);
return result;
}
//タグの名称を修正する.
function fixTagName(text){
var result = text;
var regex = /<([A-Z|-]+?)[\s|>]/;
var match;
while((match = result.match(regex)) != null){
var tag = match[1];
var fixed = elementNameMap[tag];
if(!fixed){
fixed = tag.toLowerCase();
}
result = result.replace("<" + tag, "<" + elementNameMap[tag]);
result = result.replace("</" + tag + ">", "</" + elementNameMap[tag] +">");
}
return result;
}
}
同様の機能を提供するスクリプトとしてはsie標準添付の「svginhtml.js」もあるが,body要素内部の構造が変化してしまうので,レイアウトの崩れにつながる可能性がある.また,動作機構が幾分かトリッキーであるため,筆者としてはお勧めできない.