175 lines
8.2 KiB
JavaScript
175 lines
8.2 KiB
JavaScript
/**
|
|
* SVGInjector v1.1.3 - Fast, caching, dynamic inline SVG DOM injection library
|
|
* https://github.com/iconic/SVGInjector
|
|
*
|
|
* Copyright (c) 2014-2015 Waybury <hello@waybury.com>
|
|
* @license MIT
|
|
*/
|
|
!(function (t, e) {
|
|
"use strict";
|
|
function r(t) {
|
|
t = t.split(" ");
|
|
for (var e = {}, r = t.length, n = []; r--; ) e.hasOwnProperty(t[r]) || ((e[t[r]] = 1), n.unshift(t[r]));
|
|
return n.join(" ");
|
|
}
|
|
var n = "file:" === t.location.protocol,
|
|
i = e.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"),
|
|
o =
|
|
Array.prototype.forEach ||
|
|
function (t, e) {
|
|
if (void 0 === this || null === this || "function" != typeof t) throw new TypeError();
|
|
var r,
|
|
n = this.length >>> 0;
|
|
for (r = 0; n > r; ++r) r in this && t.call(e, this[r], r, this);
|
|
},
|
|
a = {},
|
|
l = 0,
|
|
s = [],
|
|
u = [],
|
|
c = {},
|
|
f = function (t) {
|
|
return t.cloneNode(!0);
|
|
},
|
|
p = function (t, e) {
|
|
(u[t] = u[t] || []), u[t].push(e);
|
|
},
|
|
d = function (t) {
|
|
for (var e = 0, r = u[t].length; r > e; e++)
|
|
!(function (e) {
|
|
setTimeout(function () {
|
|
u[t][e](f(a[t]));
|
|
}, 0);
|
|
})(e);
|
|
},
|
|
v = function (e, r) {
|
|
if (void 0 !== a[e]) a[e] instanceof SVGSVGElement ? r(f(a[e])) : p(e, r);
|
|
else {
|
|
if (!t.XMLHttpRequest) return r("Browser does not support XMLHttpRequest"), !1;
|
|
(a[e] = {}), p(e, r);
|
|
var i = new XMLHttpRequest();
|
|
(i.onreadystatechange = function () {
|
|
if (4 === i.readyState) {
|
|
if (404 === i.status || null === i.responseXML)
|
|
return r("Unable to load SVG file: " + e), n && r("Note: SVG injection ajax calls do not work locally without adjusting security setting in your browser. Or consider using a local webserver."), r(), !1;
|
|
if (!(200 === i.status || (n && 0 === i.status))) return r("There was a problem injecting the SVG: " + i.status + " " + i.statusText), !1;
|
|
if (i.responseXML instanceof Document) a[e] = i.responseXML.documentElement;
|
|
else if (DOMParser && DOMParser instanceof Function) {
|
|
var t;
|
|
try {
|
|
var o = new DOMParser();
|
|
t = o.parseFromString(i.responseText, "text/xml");
|
|
} catch (l) {
|
|
t = void 0;
|
|
}
|
|
if (!t || t.getElementsByTagName("parsererror").length) return r("Unable to parse SVG file: " + e), !1;
|
|
a[e] = t.documentElement;
|
|
}
|
|
d(e);
|
|
}
|
|
}),
|
|
i.open("GET", e),
|
|
i.overrideMimeType && i.overrideMimeType("text/xml"),
|
|
i.send();
|
|
}
|
|
},
|
|
h = function (e, n, a, u) {
|
|
var f = e.getAttribute("data-src") || e.getAttribute("src");
|
|
if (!/\.svg/i.test(f)) return void u("Attempted to inject a file with a non-svg extension: " + f);
|
|
if (!i) {
|
|
var p = e.getAttribute("data-fallback") || e.getAttribute("data-png");
|
|
return void (p ? (e.setAttribute("src", p), u(null)) : a ? (e.setAttribute("src", a + "/" + f.split("/").pop().replace(".svg", ".png")), u(null)) : u("This browser does not support SVG and no PNG fallback was defined."));
|
|
}
|
|
-1 === s.indexOf(e) &&
|
|
(s.push(e),
|
|
e.setAttribute("src", ""),
|
|
v(f, function (i) {
|
|
if ("undefined" == typeof i || "string" == typeof i) return u(i), !1;
|
|
var a = e.getAttribute("id");
|
|
a && i.setAttribute("id", a);
|
|
var p = e.getAttribute("title");
|
|
p && i.setAttribute("title", p);
|
|
var d = [].concat(i.getAttribute("class") || [], "injected-svg", e.getAttribute("class") || []).join(" ");
|
|
i.setAttribute("class", r(d));
|
|
var v = e.getAttribute("style");
|
|
v && i.setAttribute("style", v);
|
|
var h = [].filter.call(e.attributes, function (t) {
|
|
return /^data-\w[\w\-]*$/.test(t.name);
|
|
});
|
|
o.call(h, function (t) {
|
|
t.name && t.value && i.setAttribute(t.name, t.value);
|
|
});
|
|
var g,
|
|
m,
|
|
b,
|
|
y,
|
|
A,
|
|
w = {
|
|
clipPath: ["clip-path"],
|
|
"color-profile": ["color-profile"],
|
|
cursor: ["cursor"],
|
|
filter: ["filter"],
|
|
linearGradient: ["fill", "stroke"],
|
|
marker: ["marker", "marker-start", "marker-mid", "marker-end"],
|
|
mask: ["mask"],
|
|
pattern: ["fill", "stroke"],
|
|
radialGradient: ["fill", "stroke"],
|
|
};
|
|
Object.keys(w).forEach(function (t) {
|
|
(g = t), (b = w[t]), (m = i.querySelectorAll("defs " + g + "[id]"));
|
|
for (var e = 0, r = m.length; r > e; e++) {
|
|
(y = m[e].id), (A = y + "-" + l);
|
|
var n;
|
|
o.call(b, function (t) {
|
|
n = i.querySelectorAll("[" + t + '*="' + y + '"]');
|
|
for (var e = 0, r = n.length; r > e; e++) n[e].setAttribute(t, "url(#" + A + ")");
|
|
}),
|
|
(m[e].id = A);
|
|
}
|
|
}),
|
|
i.removeAttribute("xmlns:a");
|
|
for (var x, S, k = i.querySelectorAll("script"), j = [], G = 0, T = k.length; T > G; G++)
|
|
(S = k[G].getAttribute("type")), (S && "application/ecmascript" !== S && "application/javascript" !== S) || ((x = k[G].innerText || k[G].textContent), j.push(x), i.removeChild(k[G]));
|
|
if (j.length > 0 && ("always" === n || ("once" === n && !c[f]))) {
|
|
for (var M = 0, V = j.length; V > M; M++) new Function(j[M])(t);
|
|
c[f] = !0;
|
|
}
|
|
var E = i.querySelectorAll("style");
|
|
o.call(E, function (t) {
|
|
t.textContent += "";
|
|
}),
|
|
e.parentNode.replaceChild(i, e),
|
|
delete s[s.indexOf(e)],
|
|
(e = null),
|
|
l++,
|
|
u(i);
|
|
}));
|
|
},
|
|
g = function (t, e, r) {
|
|
e = e || {};
|
|
var n = e.evalScripts || "always",
|
|
i = e.pngFallback || !1,
|
|
a = e.each;
|
|
if (void 0 !== t.length) {
|
|
var l = 0;
|
|
o.call(t, function (e) {
|
|
h(e, n, i, function (e) {
|
|
a && "function" == typeof a && a(e), r && t.length === ++l && r(l);
|
|
});
|
|
});
|
|
} else
|
|
t
|
|
? h(t, n, i, function (e) {
|
|
a && "function" == typeof a && a(e), r && r(1), (t = null);
|
|
})
|
|
: r && r(0);
|
|
};
|
|
"object" == typeof module && "object" == typeof module.exports
|
|
? (module.exports = exports = g)
|
|
: "function" == typeof define && define.amd
|
|
? define(function () {
|
|
return g;
|
|
})
|
|
: "object" == typeof t && (t.SVGInjector = g);
|
|
})(window, document);
|
|
//# sourceMappingURL=svg-injector.map.js
|