5.0.210版本发布
parent
2c37775502
commit
5574747cde
|
@ -0,0 +1,14 @@
|
||||||
|
#(安全测评需要开启)
|
||||||
|
# enabled true 启用/false 不启用;
|
||||||
|
# includes:需要处理的url标志字符串 逗号隔开 ,默认为空则是全部要处理;
|
||||||
|
# excludes:不需要处理的url标志字符串 逗号隔开 默认为空;
|
||||||
|
# urlPatterns: 需要xss过滤器处理的url 逗号隔开 默认是 :/*
|
||||||
|
# excludeUrl: 某个url无需xss的过滤
|
||||||
|
#
|
||||||
|
security:
|
||||||
|
xss:
|
||||||
|
# enabled: true
|
||||||
|
includes:
|
||||||
|
excludes: img
|
||||||
|
urlPatterns: /*
|
||||||
|
excludeUrl: /manager/coremodeldesign/modify,/manager/coredatasource/post,/manager/coredatasource/processModel
|
|
@ -0,0 +1,311 @@
|
||||||
|
|
||||||
|
layui.define(function (exports) {
|
||||||
|
var $ = layui.$,
|
||||||
|
layer = layui.layer,
|
||||||
|
element = layui.element,
|
||||||
|
setter = layui.setter,
|
||||||
|
message = new Messenger('index', 'kdayunmanager');
|
||||||
|
var common = {
|
||||||
|
/**
|
||||||
|
* 抛出一个异常错误信息
|
||||||
|
* @param {String} msg
|
||||||
|
*/
|
||||||
|
throwError: function (msg) {
|
||||||
|
throw new Error(msg);
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 弹出一个错误提示
|
||||||
|
* @param {String} msg
|
||||||
|
*/
|
||||||
|
msgError: function (msg) {
|
||||||
|
layer.msg(msg, {
|
||||||
|
icon: 5
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 给url增加参数
|
||||||
|
* @param {*} url url
|
||||||
|
* @param {*} obj 参数对象
|
||||||
|
* @param {*} exclude 排除的属性名的正则表达式
|
||||||
|
* @returns 返回url
|
||||||
|
*/
|
||||||
|
setUrlParamObj: function (url, obj, exclude) {
|
||||||
|
for (var pro in obj) {
|
||||||
|
if (exclude) {
|
||||||
|
if (!exclude.test(pro)) {
|
||||||
|
url = common.setUrlParam(url, pro, obj[pro]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
url = common.setUrlParam(url, pro, obj[pro]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return url;
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 给url增加参数
|
||||||
|
* @param {*} url URL
|
||||||
|
* @param {*} name 参数名
|
||||||
|
* @param {*} value 参数值
|
||||||
|
* @returns 返回url
|
||||||
|
*/
|
||||||
|
setUrlParam: function (url, name, value) {
|
||||||
|
var localUrl = url;
|
||||||
|
if (value != null) {
|
||||||
|
//增加或修改url参数
|
||||||
|
//判断URL是否带有?号
|
||||||
|
if (localUrl.indexOf("?") < 0) {
|
||||||
|
//判断url是否有#
|
||||||
|
var a = localUrl.indexOf("#");
|
||||||
|
if (a < 0) {
|
||||||
|
return localUrl + "?" + name + "=" + value;
|
||||||
|
} else {
|
||||||
|
return localUrl.substring(0, a) + "?" + name + "=" + value + localUrl.substring(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
var regex = new RegExp("([\\?&]" + name + "=)[^&#]*");
|
||||||
|
if (regex.test(localUrl)) {
|
||||||
|
return localUrl.replace(regex, "$1" + value);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var a = localUrl.indexOf("#");
|
||||||
|
if (a < 0) {
|
||||||
|
return localUrl + "&" + name + "=" + value;
|
||||||
|
} else {
|
||||||
|
return localUrl.substring(0, a) + "&" + name + "=" + value + localUrl.substring(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//删除url的参数
|
||||||
|
var regex = new RegExp("([\\?&])" + name + "=[^&#]*(&?)");
|
||||||
|
if (regex.test(localUrl)) {
|
||||||
|
return localUrl.replace(regex, function (m, p1, p2) {
|
||||||
|
if (p1 == "?") {
|
||||||
|
return p2 == "&" ? "?" : "";
|
||||||
|
} else {
|
||||||
|
return p2;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return localUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
tabsPage: {},
|
||||||
|
|
||||||
|
setPrevAndNext: function () {
|
||||||
|
var $li = $('.layui-tab-title').children('li')
|
||||||
|
, sumwidth = 0
|
||||||
|
, totalwidth = $('.layui-tab-title').width();
|
||||||
|
for (var i = 0; i < $li.length; i++) {
|
||||||
|
sumwidth = sumwidth + $li.eq(i).outerWidth();
|
||||||
|
}
|
||||||
|
if (sumwidth > totalwidth) {
|
||||||
|
$('.layadmin-pagetabs').css({ "padding-left": "40px", "padding-right": "80px" });
|
||||||
|
$('.layui-icon-prev').show();
|
||||||
|
$('.layui-icon-next').show();
|
||||||
|
} else {
|
||||||
|
$('.layadmin-pagetabs').css({ "padding-left": "0px", "padding-right": "40px" });
|
||||||
|
$('.layui-icon-prev').hide();
|
||||||
|
$('.layui-icon-next').hide();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 打开tab标签页
|
||||||
|
* @param {*} url 页签的URL
|
||||||
|
* @param {*} text 页签的标题
|
||||||
|
* @param {*} resid 资源id
|
||||||
|
* @param {*} param 传递的参数
|
||||||
|
* @param {*} callback 完成回调
|
||||||
|
*/
|
||||||
|
openTabsPage: function (url, text, resid, param, callback) {
|
||||||
|
//遍历页签选项卡
|
||||||
|
var matchTo, tabs = $('#LAY_app_tabsheader>li'),
|
||||||
|
path = url.replace(/(^http(s*):)|(\?[\s\S]*$)/g, ''),
|
||||||
|
tempresid = resid ? resid : url;
|
||||||
|
if (url.indexOf('isnewtab=1') > -1) {
|
||||||
|
window.open(url, "_blank");
|
||||||
|
callback && callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
url = common.setUrlParamObj(url, param, /tokenId/)
|
||||||
|
|
||||||
|
tabs.each(function (index) {
|
||||||
|
var li = $(this),
|
||||||
|
layid = li.attr('lay-id');
|
||||||
|
if (layid === tempresid) {
|
||||||
|
matchTo = true;
|
||||||
|
common.tabsPage.index = index;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
var APP_BODY = '#LAY_app_body',
|
||||||
|
FILTER_TAB_TBAS = 'layadmin-layout-tabs',
|
||||||
|
text = text || '新标签页';
|
||||||
|
//如果未在选项卡中匹配到,则追加选项卡
|
||||||
|
if (!matchTo) {
|
||||||
|
$(APP_BODY).append([
|
||||||
|
'<div class="layadmin-tabsbody-item layui-show">',
|
||||||
|
'<iframe src="' + url + '" frameborder="0" menuid=' + resid + ' class="layadmin-iframe" name="layadmin-iframe"></iframe>',
|
||||||
|
'</div>'
|
||||||
|
].join(''));
|
||||||
|
common.tabsPage.index = tabs.length;
|
||||||
|
element.tabAdd(FILTER_TAB_TBAS, {
|
||||||
|
title: '<span>' + text + '</span>',
|
||||||
|
id: resid ? resid : url,
|
||||||
|
attr: path
|
||||||
|
});
|
||||||
|
common.setPrevAndNext();
|
||||||
|
$('.layadmin-tabsbody-shade').show();
|
||||||
|
}
|
||||||
|
var $iframe
|
||||||
|
if (path.indexOf('/coremodelshow') != -1 && resid) {
|
||||||
|
$iframe = $(APP_BODY).find('iframe[menuid="' + resid + '"]');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$iframe = $(APP_BODY).find('iframe[src="' + url + '"]');
|
||||||
|
}
|
||||||
|
$iframe && !$iframe.attr('loaded') && ($('.layadmin-tabsbody-shade').show()) && $iframe.load(function () {
|
||||||
|
// $('.layadmin-tabsbody-shade').fadeOut('600');
|
||||||
|
$iframe.attr('loaded', 'true')
|
||||||
|
});
|
||||||
|
callback && callback();
|
||||||
|
|
||||||
|
//执行 {setter.MOD_NAME}.tabsPage 下的事件
|
||||||
|
layui.event.call(this, setter.MOD_NAME, 'tabsPage({*})', {
|
||||||
|
url: tempresid,
|
||||||
|
text: text
|
||||||
|
});
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* xss 转义
|
||||||
|
* @param {*} html
|
||||||
|
*/
|
||||||
|
escape: function (html) {
|
||||||
|
return String(html || '').replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&')
|
||||||
|
.replace(/</g, '<').replace(/>/g, '>')
|
||||||
|
.replace(/'/g, ''').replace(/"/g, '"');
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 打开Layer页
|
||||||
|
* @param {*} pageCoinfg
|
||||||
|
* @param {*} params
|
||||||
|
* @param {*} successCallback 页面完成打开回调
|
||||||
|
*/
|
||||||
|
openLayerPage: function (pageCoinfg, params, successCallback) {
|
||||||
|
var pageId = params.__pageId;
|
||||||
|
//页面创建加载完成
|
||||||
|
pageId && common.onForm(pageId, 'onPageLoad', function (msg) {
|
||||||
|
let iframes = top.window.document.getElementsByTagName("iframe");
|
||||||
|
for (var i = 0; i < iframes.length; i++) {
|
||||||
|
var iframe = iframes[i];
|
||||||
|
if (iframe.contentWindow.location.href.indexOf('=' + pageId) != -1) {
|
||||||
|
common.sendTo(pageId, 'onSuccess')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
var p = $.extend(pageCoinfg, {
|
||||||
|
type: 2,
|
||||||
|
area: pageCoinfg.area || ['420px', '240px'],
|
||||||
|
success: () => {
|
||||||
|
successCallback && successCallback();
|
||||||
|
}
|
||||||
|
, yes: () => {
|
||||||
|
pageId && common.sendTo(pageId, 'onYes')
|
||||||
|
}
|
||||||
|
, no: () => {
|
||||||
|
pageId && common.sendTo(pageId, 'onCancel')
|
||||||
|
}
|
||||||
|
, end: () => {
|
||||||
|
pageId && common.sendTo(pageId, 'onEnd')
|
||||||
|
}
|
||||||
|
, onCanClose: () => {
|
||||||
|
return pageId && common.sendTo(pageId, 'onCanClose')
|
||||||
|
}
|
||||||
|
, onClosed: () => {
|
||||||
|
pageId && common.sendTo(pageId, 'onClosed')
|
||||||
|
}, full: () => {
|
||||||
|
pageId && common.sendTo(pageId, 'onFull')
|
||||||
|
}, min: () => {
|
||||||
|
pageId && common.sendTo(pageId, 'onMin')
|
||||||
|
}, resizing: () => {
|
||||||
|
pageId && common.sendTo(pageId, 'onResizing')
|
||||||
|
}, moveEnd: () => {
|
||||||
|
pageId && common.sendTo(pageId, 'onMoveEnd')
|
||||||
|
}, restore: () => {
|
||||||
|
pageId && common.sendTo(pageId, 'onRestore')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
layer.open(p);
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 监听消息(不管来源哪里)
|
||||||
|
* @param {*} msg 消息标识常量
|
||||||
|
* @param {*} callback 回调 callback(msg)
|
||||||
|
*/
|
||||||
|
on: function (msg, callback) {
|
||||||
|
return message.on(msg, callback)
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 监听消息(只管来源fromHandle 的消息)
|
||||||
|
* @param fromHandle 消息来源目标的句柄全局唯一
|
||||||
|
* @param {*} msg 消息标识常量
|
||||||
|
* @param {*} callback 回调 callback(msg)
|
||||||
|
*/
|
||||||
|
onForm: function (fromHandle, msg, callback) {
|
||||||
|
if (!fromHandle) {
|
||||||
|
throw new Error("fromHandle参数不允许为空")
|
||||||
|
}
|
||||||
|
return message.onFrom(fromHandle, msg, callback)
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 给具体的目标发送消息
|
||||||
|
* @param {*} toHandle 目标句柄全局唯一
|
||||||
|
* @param {*} msg 消息标识常量
|
||||||
|
* @param {*} params 附带的消息信息
|
||||||
|
*/
|
||||||
|
sendTo: function (toHandle, msg, params) {
|
||||||
|
if (!toHandle) {
|
||||||
|
throw new Error("toHandle参数不允许为空")
|
||||||
|
}
|
||||||
|
return message.sendTo(toHandle, msg, params);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 本iframe内给所有的目标发送消息
|
||||||
|
* @param {*} msg 消息标识常量
|
||||||
|
* @param {*} params 附带的消息信息
|
||||||
|
*/
|
||||||
|
send: function (msg, params) {
|
||||||
|
var msgobj = {
|
||||||
|
msg: msg,
|
||||||
|
params: params
|
||||||
|
}
|
||||||
|
return message.send(msgobj);
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* 跨iframe给所有的目标发送消息
|
||||||
|
* @param {*} msg 消息标识常量
|
||||||
|
* @param {*} params 附带的消息信息
|
||||||
|
*/
|
||||||
|
broadcast: function (msg, params) {
|
||||||
|
var msgobj = {
|
||||||
|
msg: msg,
|
||||||
|
params: params
|
||||||
|
}
|
||||||
|
return message.broadcast(msgobj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//对外暴露的接口
|
||||||
|
exports('common', common);
|
||||||
|
});
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1651567902828" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2067" width="32" height="32" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
|
||||||
|
</style></defs><path d="M384 912h496c17.7 0 32-14.3 32-32V340H384v572zM880 112H384v164h528V144c0-17.7-14.3-32-32-32zM112 144v736c0 17.7 14.3 32 32 32h176V112H144c-17.7 0-32 14.3-32 32z" p-id="2068"></path></svg>
|
After Width: | Height: | Size: 877 B |
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1651568047924" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6840" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
|
||||||
|
</style></defs><path d="M938.666667 426.666667v426.666666a42.666667 42.666667 0 0 1-42.666667 42.666667H128a42.666667 42.666667 0 0 1-42.666667-42.666667V426.666667h853.333334z m-42.666667-298.666667a42.666667 42.666667 0 0 1 42.666667 42.666667v170.666666H85.333333V170.666667a42.666667 42.666667 0 0 1 42.666667-42.666667h768z" p-id="6841"></path></svg>
|
After Width: | Height: | Size: 1021 B |
|
@ -0,0 +1,18 @@
|
||||||
|
!function(t,n){"object"==typeof exports?module.exports=exports=n():"function"==typeof define&&define.amd?define([],n):t.CryptoJS=n()}(this,function(){var t=t||function(t,n){var i=Object.create||function(){function t(){}return function(n){var i;return t.prototype=n,i=new t,t.prototype=null,i}}(),e={},r=e.lib={},o=r.Base=function(){return{extend:function(t){var n=i(this);return t&&n.mixIn(t),n.hasOwnProperty("init")&&this.init!==n.init||(n.init=function(){n.$super.init.apply(this,arguments)}),n.init.prototype=n,n.$super=this,n},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var n in t)t.hasOwnProperty(n)&&(this[n]=t[n]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}}}(),s=r.WordArray=o.extend({init:function(t,i){t=this.words=t||[],i!=n?this.sigBytes=i:this.sigBytes=4*t.length},toString:function(t){return(t||c).stringify(this)},concat:function(t){var n=this.words,i=t.words,e=this.sigBytes,r=t.sigBytes;if(this.clamp(),e%4)for(var o=0;o<r;o++){var s=i[o>>>2]>>>24-o%4*8&255;n[e+o>>>2]|=s<<24-(e+o)%4*8}else for(var o=0;o<r;o+=4)n[e+o>>>2]=i[o>>>2];return this.sigBytes+=r,this},clamp:function(){var n=this.words,i=this.sigBytes;n[i>>>2]&=4294967295<<32-i%4*8,n.length=t.ceil(i/4)},clone:function(){var t=o.clone.call(this);return t.words=this.words.slice(0),t},random:function(n){for(var i,e=[],r=function(n){var n=n,i=987654321,e=4294967295;return function(){i=36969*(65535&i)+(i>>16)&e,n=18e3*(65535&n)+(n>>16)&e;var r=(i<<16)+n&e;return r/=4294967296,r+=.5,r*(t.random()>.5?1:-1)}},o=0;o<n;o+=4){var a=r(4294967296*(i||t.random()));i=987654071*a(),e.push(4294967296*a()|0)}return new s.init(e,n)}}),a=e.enc={},c=a.Hex={stringify:function(t){for(var n=t.words,i=t.sigBytes,e=[],r=0;r<i;r++){var o=n[r>>>2]>>>24-r%4*8&255;e.push((o>>>4).toString(16)),e.push((15&o).toString(16))}return e.join("")},parse:function(t){for(var n=t.length,i=[],e=0;e<n;e+=2)i[e>>>3]|=parseInt(t.substr(e,2),16)<<24-e%8*4;return new s.init(i,n/2)}},u=a.Latin1={stringify:function(t){for(var n=t.words,i=t.sigBytes,e=[],r=0;r<i;r++){var o=n[r>>>2]>>>24-r%4*8&255;e.push(String.fromCharCode(o))}return e.join("")},parse:function(t){for(var n=t.length,i=[],e=0;e<n;e++)i[e>>>2]|=(255&t.charCodeAt(e))<<24-e%4*8;return new s.init(i,n)}},f=a.Utf8={stringify:function(t){try{return decodeURIComponent(escape(u.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return u.parse(unescape(encodeURIComponent(t)))}},h=r.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new s.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=f.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(n){var i=this._data,e=i.words,r=i.sigBytes,o=this.blockSize,a=4*o,c=r/a;c=n?t.ceil(c):t.max((0|c)-this._minBufferSize,0);var u=c*o,f=t.min(4*u,r);if(u){for(var h=0;h<u;h+=o)this._doProcessBlock(e,h);var p=e.splice(0,u);i.sigBytes-=f}return new s.init(p,f)},clone:function(){var t=o.clone.call(this);return t._data=this._data.clone(),t},_minBufferSize:0}),p=(r.Hasher=h.extend({cfg:o.extend(),init:function(t){this.cfg=this.cfg.extend(t),this.reset()},reset:function(){h.reset.call(this),this._doReset()},update:function(t){return this._append(t),this._process(),this},finalize:function(t){t&&this._append(t);var n=this._doFinalize();return n},blockSize:16,_createHelper:function(t){return function(n,i){return new t.init(i).finalize(n)}},_createHmacHelper:function(t){return function(n,i){return new p.HMAC.init(t,i).finalize(n)}}}),e.algo={});return e}(Math);return t});
|
||||||
|
//# sourceMappingURL=core.min.js.map
|
||||||
|
!function(e,t,i){"object"==typeof exports?module.exports=exports=t(require("./core.min"),require("./sha1.min"),require("./hmac.min")):"function"==typeof define&&define.amd?define(["./core.min","./sha1.min","./hmac.min"],t):t(e.CryptoJS)}(this,function(e){return function(){var t=e,i=t.lib,r=i.Base,n=i.WordArray,o=t.algo,a=o.MD5,c=o.EvpKDF=r.extend({cfg:r.extend({keySize:4,hasher:a,iterations:1}),init:function(e){this.cfg=this.cfg.extend(e)},compute:function(e,t){for(var i=this.cfg,r=i.hasher.create(),o=n.create(),a=o.words,c=i.keySize,f=i.iterations;a.length<c;){s&&r.update(s);var s=r.update(e).finalize(t);r.reset();for(var u=1;u<f;u++)s=r.finalize(s),r.reset();o.concat(s)}return o.sigBytes=4*c,o}});t.EvpKDF=function(e,t,i){return c.create(i).compute(e,t)}}(),e.EvpKDF});
|
||||||
|
//# sourceMappingURL=evpkdf.min.js.map
|
||||||
|
!function(r,e){"object"==typeof exports?module.exports=exports=e(require("./core.min")):"function"==typeof define&&define.amd?define(["./core.min"],e):e(r.CryptoJS)}(this,function(r){return function(){function e(r,e,t){for(var n=[],i=0,o=0;o<e;o++)if(o%4){var f=t[r.charCodeAt(o-1)]<<o%4*2,c=t[r.charCodeAt(o)]>>>6-o%4*2;n[i>>>2]|=(f|c)<<24-i%4*8,i++}return a.create(n,i)}var t=r,n=t.lib,a=n.WordArray,i=t.enc;i.Base64={stringify:function(r){var e=r.words,t=r.sigBytes,n=this._map;r.clamp();for(var a=[],i=0;i<t;i+=3)for(var o=e[i>>>2]>>>24-i%4*8&255,f=e[i+1>>>2]>>>24-(i+1)%4*8&255,c=e[i+2>>>2]>>>24-(i+2)%4*8&255,s=o<<16|f<<8|c,h=0;h<4&&i+.75*h<t;h++)a.push(n.charAt(s>>>6*(3-h)&63));var p=n.charAt(64);if(p)for(;a.length%4;)a.push(p);return a.join("")},parse:function(r){var t=r.length,n=this._map,a=this._reverseMap;if(!a){a=this._reverseMap=[];for(var i=0;i<n.length;i++)a[n.charCodeAt(i)]=i}var o=n.charAt(64);if(o){var f=r.indexOf(o);f!==-1&&(t=f)}return e(r,t,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}}(),r.enc.Base64});
|
||||||
|
//# sourceMappingURL=enc-base64.min.js.map
|
||||||
|
!function(e,t,r){"object"==typeof exports?module.exports=exports=t(require("./core.min"),require("./evpkdf.min")):"function"==typeof define&&define.amd?define(["./core.min","./evpkdf.min"],t):t(e.CryptoJS)}(this,function(e){e.lib.Cipher||function(t){var r=e,i=r.lib,n=i.Base,c=i.WordArray,o=i.BufferedBlockAlgorithm,s=r.enc,a=(s.Utf8,s.Base64),f=r.algo,p=f.EvpKDF,d=i.Cipher=o.extend({cfg:n.extend(),createEncryptor:function(e,t){return this.create(this._ENC_XFORM_MODE,e,t)},createDecryptor:function(e,t){return this.create(this._DEC_XFORM_MODE,e,t)},init:function(e,t,r){this.cfg=this.cfg.extend(r),this._xformMode=e,this._key=t,this.reset()},reset:function(){o.reset.call(this),this._doReset()},process:function(e){return this._append(e),this._process()},finalize:function(e){e&&this._append(e);var t=this._doFinalize();return t},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){function e(e){return"string"==typeof e?B:x}return function(t){return{encrypt:function(r,i,n){return e(i).encrypt(t,r,i,n)},decrypt:function(r,i,n){return e(i).decrypt(t,r,i,n)}}}}()}),h=(i.StreamCipher=d.extend({_doFinalize:function(){var e=this._process(!0);return e},blockSize:1}),r.mode={}),u=i.BlockCipherMode=n.extend({createEncryptor:function(e,t){return this.Encryptor.create(e,t)},createDecryptor:function(e,t){return this.Decryptor.create(e,t)},init:function(e,t){this._cipher=e,this._iv=t}}),l=h.CBC=function(){function e(e,r,i){var n=this._iv;if(n){var c=n;this._iv=t}else var c=this._prevBlock;for(var o=0;o<i;o++)e[r+o]^=c[o]}var r=u.extend();return r.Encryptor=r.extend({processBlock:function(t,r){var i=this._cipher,n=i.blockSize;e.call(this,t,r,n),i.encryptBlock(t,r),this._prevBlock=t.slice(r,r+n)}}),r.Decryptor=r.extend({processBlock:function(t,r){var i=this._cipher,n=i.blockSize,c=t.slice(r,r+n);i.decryptBlock(t,r),e.call(this,t,r,n),this._prevBlock=c}}),r}(),_=r.pad={},v=_.Pkcs7={pad:function(e,t){for(var r=4*t,i=r-e.sigBytes%r,n=i<<24|i<<16|i<<8|i,o=[],s=0;s<i;s+=4)o.push(n);var a=c.create(o,i);e.concat(a)},unpad:function(e){var t=255&e.words[e.sigBytes-1>>>2];e.sigBytes-=t}},y=(i.BlockCipher=d.extend({cfg:d.cfg.extend({mode:l,padding:v}),reset:function(){d.reset.call(this);var e=this.cfg,t=e.iv,r=e.mode;if(this._xformMode==this._ENC_XFORM_MODE)var i=r.createEncryptor;else{var i=r.createDecryptor;this._minBufferSize=1}this._mode&&this._mode.__creator==i?this._mode.init(this,t&&t.words):(this._mode=i.call(r,this,t&&t.words),this._mode.__creator=i)},_doProcessBlock:function(e,t){this._mode.processBlock(e,t)},_doFinalize:function(){var e=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){e.pad(this._data,this.blockSize);var t=this._process(!0)}else{var t=this._process(!0);e.unpad(t)}return t},blockSize:4}),i.CipherParams=n.extend({init:function(e){this.mixIn(e)},toString:function(e){return(e||this.formatter).stringify(this)}})),m=r.format={},k=m.OpenSSL={stringify:function(e){var t=e.ciphertext,r=e.salt;if(r)var i=c.create([1398893684,1701076831]).concat(r).concat(t);else var i=t;return i.toString(a)},parse:function(e){var t=a.parse(e),r=t.words;if(1398893684==r[0]&&1701076831==r[1]){var i=c.create(r.slice(2,4));r.splice(0,4),t.sigBytes-=16}return y.create({ciphertext:t,salt:i})}},x=i.SerializableCipher=n.extend({cfg:n.extend({format:k}),encrypt:function(e,t,r,i){i=this.cfg.extend(i);var n=e.createEncryptor(r,i),c=n.finalize(t),o=n.cfg;return y.create({ciphertext:c,key:r,iv:o.iv,algorithm:e,mode:o.mode,padding:o.padding,blockSize:e.blockSize,formatter:i.format})},decrypt:function(e,t,r,i){i=this.cfg.extend(i),t=this._parse(t,i.format);var n=e.createDecryptor(r,i).finalize(t.ciphertext);return n},_parse:function(e,t){return"string"==typeof e?t.parse(e,this):e}}),g=r.kdf={},S=g.OpenSSL={execute:function(e,t,r,i){i||(i=c.random(8));var n=p.create({keySize:t+r}).compute(e,i),o=c.create(n.words.slice(t),4*r);return n.sigBytes=4*t,y.create({key:n,iv:o,salt:i})}},B=i.PasswordBasedCipher=x.extend({cfg:x.cfg.extend({kdf:S}),encrypt:function(e,t,r,i){i=this.cfg.extend(i);var n=i.kdf.execute(r,e.keySize,e.ivSize);i.iv=n.iv;var c=x.encrypt.call(this,e,t,n.key,i);return c.mixIn(n),c},decrypt:function(e,t,r,i){i=this.cfg.extend(i),t=this._parse(t,i.format);var n=i.kdf.execute(r,e.keySize,e.ivSize,t.salt);i.iv=n.iv;var c=x.decrypt.call(this,e,t,n.key,i);return c}})}()});
|
||||||
|
//# sourceMappingURL=cipher-core.min.js.map
|
||||||
|
!function(e,i){"object"==typeof exports?module.exports=exports=i(require("./core.min")):"function"==typeof define&&define.amd?define(["./core.min"],i):i(e.CryptoJS)}(this,function(e){!function(){var i=e,t=i.lib,n=t.Base,s=i.enc,r=s.Utf8,o=i.algo;o.HMAC=n.extend({init:function(e,i){e=this._hasher=new e.init,"string"==typeof i&&(i=r.parse(i));var t=e.blockSize,n=4*t;i.sigBytes>n&&(i=e.finalize(i)),i.clamp();for(var s=this._oKey=i.clone(),o=this._iKey=i.clone(),a=s.words,f=o.words,c=0;c<t;c++)a[c]^=1549556828,f[c]^=909522486;s.sigBytes=o.sigBytes=n,this.reset()},reset:function(){var e=this._hasher;e.reset(),e.update(this._iKey)},update:function(e){return this._hasher.update(e),this},finalize:function(e){var i=this._hasher,t=i.finalize(e);i.reset();var n=i.finalize(this._oKey.clone().concat(t));return n}})}()});
|
||||||
|
//# sourceMappingURL=hmac.min.js.map
|
||||||
|
!function(e,o,r){"object"==typeof exports?module.exports=exports=o(require("./core.min"),require("./cipher-core.min")):"function"==typeof define&&define.amd?define(["./core.min","./cipher-core.min"],o):o(e.CryptoJS)}(this,function(e){return e.mode.ECB=function(){var o=e.lib.BlockCipherMode.extend();return o.Encryptor=o.extend({processBlock:function(e,o){this._cipher.encryptBlock(e,o)}}),o.Decryptor=o.extend({processBlock:function(e,o){this._cipher.decryptBlock(e,o)}}),o}(),e.mode.ECB});
|
||||||
|
//# sourceMappingURL=mode-ecb.min.js.map
|
||||||
|
!function(e,r,i){"object"==typeof exports?module.exports=exports=r(require("./core.min"),require("./cipher-core.min")):"function"==typeof define&&define.amd?define(["./core.min","./cipher-core.min"],r):r(e.CryptoJS)}(this,function(e){return e.pad.Pkcs7});
|
||||||
|
//# sourceMappingURL=pad-pkcs7.min.js.map
|
||||||
|
!function(e,r,i){"object"==typeof exports?module.exports=exports=r(require("./core.min"),require("./enc-base64.min"),require("./md5.min"),require("./evpkdf.min"),require("./cipher-core.min")):"function"==typeof define&&define.amd?define(["./core.min","./enc-base64.min","./md5.min","./evpkdf.min","./cipher-core.min"],r):r(e.CryptoJS)}(this,function(e){return function(){var r=e,i=r.lib,n=i.BlockCipher,o=r.algo,t=[],c=[],s=[],f=[],a=[],d=[],u=[],v=[],h=[],y=[];!function(){for(var e=[],r=0;r<256;r++)r<128?e[r]=r<<1:e[r]=r<<1^283;for(var i=0,n=0,r=0;r<256;r++){var o=n^n<<1^n<<2^n<<3^n<<4;o=o>>>8^255&o^99,t[i]=o,c[o]=i;var p=e[i],l=e[p],_=e[l],k=257*e[o]^16843008*o;s[i]=k<<24|k>>>8,f[i]=k<<16|k>>>16,a[i]=k<<8|k>>>24,d[i]=k;var k=16843009*_^65537*l^257*p^16843008*i;u[o]=k<<24|k>>>8,v[o]=k<<16|k>>>16,h[o]=k<<8|k>>>24,y[o]=k,i?(i=p^e[e[e[_^p]]],n^=e[e[n]]):i=n=1}}();var p=[0,1,2,4,8,16,32,64,128,27,54],l=o.AES=n.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var e=this._keyPriorReset=this._key,r=e.words,i=e.sigBytes/4,n=this._nRounds=i+6,o=4*(n+1),c=this._keySchedule=[],s=0;s<o;s++)if(s<i)c[s]=r[s];else{var f=c[s-1];s%i?i>6&&s%i==4&&(f=t[f>>>24]<<24|t[f>>>16&255]<<16|t[f>>>8&255]<<8|t[255&f]):(f=f<<8|f>>>24,f=t[f>>>24]<<24|t[f>>>16&255]<<16|t[f>>>8&255]<<8|t[255&f],f^=p[s/i|0]<<24),c[s]=c[s-i]^f}for(var a=this._invKeySchedule=[],d=0;d<o;d++){var s=o-d;if(d%4)var f=c[s];else var f=c[s-4];d<4||s<=4?a[d]=f:a[d]=u[t[f>>>24]]^v[t[f>>>16&255]]^h[t[f>>>8&255]]^y[t[255&f]]}}},encryptBlock:function(e,r){this._doCryptBlock(e,r,this._keySchedule,s,f,a,d,t)},decryptBlock:function(e,r){var i=e[r+1];e[r+1]=e[r+3],e[r+3]=i,this._doCryptBlock(e,r,this._invKeySchedule,u,v,h,y,c);var i=e[r+1];e[r+1]=e[r+3],e[r+3]=i},_doCryptBlock:function(e,r,i,n,o,t,c,s){for(var f=this._nRounds,a=e[r]^i[0],d=e[r+1]^i[1],u=e[r+2]^i[2],v=e[r+3]^i[3],h=4,y=1;y<f;y++){var p=n[a>>>24]^o[d>>>16&255]^t[u>>>8&255]^c[255&v]^i[h++],l=n[d>>>24]^o[u>>>16&255]^t[v>>>8&255]^c[255&a]^i[h++],_=n[u>>>24]^o[v>>>16&255]^t[a>>>8&255]^c[255&d]^i[h++],k=n[v>>>24]^o[a>>>16&255]^t[d>>>8&255]^c[255&u]^i[h++];a=p,d=l,u=_,v=k}var p=(s[a>>>24]<<24|s[d>>>16&255]<<16|s[u>>>8&255]<<8|s[255&v])^i[h++],l=(s[d>>>24]<<24|s[u>>>16&255]<<16|s[v>>>8&255]<<8|s[255&a])^i[h++],_=(s[u>>>24]<<24|s[v>>>16&255]<<16|s[a>>>8&255]<<8|s[255&d])^i[h++],k=(s[v>>>24]<<24|s[a>>>16&255]<<16|s[d>>>8&255]<<8|s[255&u])^i[h++];e[r]=p,e[r+1]=l,e[r+2]=_,e[r+3]=k},keySize:8});r.AES=n._createHelper(l)}(),e.AES});
|
||||||
|
//# sourceMappingURL=aes.min.js.map
|
||||||
|
!function(e,n){"object"==typeof exports?module.exports=exports=n(require("./core.min")):"function"==typeof define&&define.amd?define(["./core.min"],n):n(e.CryptoJS)}(this,function(e){return e.enc.Utf8});
|
||||||
|
//# sourceMappingURL=enc-utf8.min.js.map
|
|
@ -0,0 +1,697 @@
|
||||||
|
/**
|
||||||
|
* SVGInject - Version 1.2.3
|
||||||
|
* A tiny, intuitive, robust, caching solution for injecting SVG files inline into the DOM.
|
||||||
|
*
|
||||||
|
* https://github.com/iconfu/svg-inject
|
||||||
|
*
|
||||||
|
* Copyright (c) 2018 INCORS, the creators of iconfu.com
|
||||||
|
* @license MIT License - https://github.com/iconfu/svg-inject/blob/master/LICENSE
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function(window, document) {
|
||||||
|
// constants for better minification
|
||||||
|
var _CREATE_ELEMENT_ = 'createElement';
|
||||||
|
var _GET_ELEMENTS_BY_TAG_NAME_ = 'getElementsByTagName';
|
||||||
|
var _LENGTH_ = 'length';
|
||||||
|
var _STYLE_ = 'style';
|
||||||
|
var _TITLE_ = 'title';
|
||||||
|
var _UNDEFINED_ = 'undefined';
|
||||||
|
var _SET_ATTRIBUTE_ = 'setAttribute';
|
||||||
|
var _GET_ATTRIBUTE_ = 'getAttribute';
|
||||||
|
|
||||||
|
var NULL = null;
|
||||||
|
|
||||||
|
// constants
|
||||||
|
var __SVGINJECT = '__svgInject';
|
||||||
|
var ID_SUFFIX = '--inject-';
|
||||||
|
var ID_SUFFIX_REGEX = new RegExp(ID_SUFFIX + '\\d+', "g");
|
||||||
|
var LOAD_FAIL = 'LOAD_FAIL';
|
||||||
|
var SVG_NOT_SUPPORTED = 'SVG_NOT_SUPPORTED';
|
||||||
|
var SVG_INVALID = 'SVG_INVALID';
|
||||||
|
var ATTRIBUTE_EXCLUSION_NAMES = ['src', 'alt', 'onload', 'onerror'];
|
||||||
|
var A_ELEMENT = document[_CREATE_ELEMENT_]('a');
|
||||||
|
var IS_SVG_SUPPORTED = typeof SVGRect != _UNDEFINED_;
|
||||||
|
var DEFAULT_OPTIONS = {
|
||||||
|
useCache: true,
|
||||||
|
copyAttributes: true,
|
||||||
|
makeIdsUnique: true
|
||||||
|
};
|
||||||
|
// Map of IRI referenceable tag names to properties that can reference them. This is defined in
|
||||||
|
// https://www.w3.org/TR/SVG11/linking.html#processingIRI
|
||||||
|
var IRI_TAG_PROPERTIES_MAP = {
|
||||||
|
clipPath: ['clip-path'],
|
||||||
|
'color-profile': NULL,
|
||||||
|
cursor: NULL,
|
||||||
|
filter: NULL,
|
||||||
|
linearGradient: ['fill', 'stroke'],
|
||||||
|
marker: ['marker', 'marker-end', 'marker-mid', 'marker-start'],
|
||||||
|
mask: NULL,
|
||||||
|
pattern: ['fill', 'stroke'],
|
||||||
|
radialGradient: ['fill', 'stroke']
|
||||||
|
};
|
||||||
|
var INJECTED = 1;
|
||||||
|
var FAIL = 2;
|
||||||
|
|
||||||
|
var uniqueIdCounter = 1;
|
||||||
|
var xmlSerializer;
|
||||||
|
var domParser;
|
||||||
|
|
||||||
|
|
||||||
|
// creates an SVG document from an SVG string
|
||||||
|
function svgStringToSvgDoc(svgStr) {
|
||||||
|
domParser = domParser || new DOMParser();
|
||||||
|
return domParser.parseFromString(svgStr, 'text/xml');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// searializes an SVG element to an SVG string
|
||||||
|
function svgElemToSvgString(svgElement) {
|
||||||
|
xmlSerializer = xmlSerializer || new XMLSerializer();
|
||||||
|
return xmlSerializer.serializeToString(svgElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Returns the absolute url for the specified url
|
||||||
|
function getAbsoluteUrl(url) {
|
||||||
|
A_ELEMENT.href = url;
|
||||||
|
return A_ELEMENT.href;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Load svg with an XHR request
|
||||||
|
function loadSvg(url, callback, errorCallback) {
|
||||||
|
if (url) {
|
||||||
|
var req = new XMLHttpRequest();
|
||||||
|
req.onreadystatechange = function() {
|
||||||
|
if (req.readyState == 4) {
|
||||||
|
// readyState is DONE
|
||||||
|
var status = req.status;
|
||||||
|
if (status == 200) {
|
||||||
|
// request status is OK
|
||||||
|
callback(req.responseXML, req.responseText.trim());
|
||||||
|
} else if (status >= 400) {
|
||||||
|
// request status is error (4xx or 5xx)
|
||||||
|
errorCallback();
|
||||||
|
} else if (status == 0) {
|
||||||
|
// request status 0 can indicate a failed cross-domain call
|
||||||
|
errorCallback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
req.open('GET', url, true);
|
||||||
|
req.send();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Copy attributes from img element to svg element
|
||||||
|
function copyAttributes(imgElem, svgElem) {
|
||||||
|
var attribute;
|
||||||
|
var attributeName;
|
||||||
|
var attributeValue;
|
||||||
|
var attributes = imgElem.attributes;
|
||||||
|
for (var i = 0; i < attributes[_LENGTH_]; i++) {
|
||||||
|
attribute = attributes[i];
|
||||||
|
attributeName = attribute.name;
|
||||||
|
// Only copy attributes not explicitly excluded from copying
|
||||||
|
if (ATTRIBUTE_EXCLUSION_NAMES.indexOf(attributeName) == -1) {
|
||||||
|
attributeValue = attribute.value;
|
||||||
|
// If img attribute is "title", insert a title element into SVG element
|
||||||
|
if (attributeName == _TITLE_) {
|
||||||
|
var titleElem;
|
||||||
|
var firstElementChild = svgElem.firstElementChild;
|
||||||
|
if (firstElementChild && firstElementChild.localName.toLowerCase() == _TITLE_) {
|
||||||
|
// If the SVG element's first child is a title element, keep it as the title element
|
||||||
|
titleElem = firstElementChild;
|
||||||
|
} else {
|
||||||
|
// If the SVG element's first child element is not a title element, create a new title
|
||||||
|
// ele,emt and set it as the first child
|
||||||
|
titleElem = document[_CREATE_ELEMENT_ + 'NS']('http://www.w3.org/2000/svg', _TITLE_);
|
||||||
|
svgElem.insertBefore(titleElem, firstElementChild);
|
||||||
|
}
|
||||||
|
// Set new title content
|
||||||
|
titleElem.textContent = attributeValue;
|
||||||
|
} else {
|
||||||
|
// Set img attribute to svg element
|
||||||
|
svgElem[_SET_ATTRIBUTE_](attributeName, attributeValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// This function appends a suffix to IDs of referenced elements in the <defs> in order to to avoid ID collision
|
||||||
|
// between multiple injected SVGs. The suffix has the form "--inject-X", where X is a running number which is
|
||||||
|
// incremented with each injection. References to the IDs are adjusted accordingly.
|
||||||
|
// We assume tha all IDs within the injected SVG are unique, therefore the same suffix can be used for all IDs of one
|
||||||
|
// injected SVG.
|
||||||
|
// If the onlyReferenced argument is set to true, only those IDs will be made unique that are referenced from within the SVG
|
||||||
|
function makeIdsUnique(svgElem, onlyReferenced) {
|
||||||
|
var idSuffix = ID_SUFFIX + uniqueIdCounter++;
|
||||||
|
// Regular expression for functional notations of an IRI references. This will find occurences in the form
|
||||||
|
// url(#anyId) or url("#anyId") (for Internet Explorer) and capture the referenced ID
|
||||||
|
var funcIriRegex = /url\("?#([a-zA-Z][\w:.-]*)"?\)/g;
|
||||||
|
// Get all elements with an ID. The SVG spec recommends to put referenced elements inside <defs> elements, but
|
||||||
|
// this is not a requirement, therefore we have to search for IDs in the whole SVG.
|
||||||
|
var idElements = svgElem.querySelectorAll('[id]');
|
||||||
|
var idElem;
|
||||||
|
// An object containing referenced IDs as keys is used if only referenced IDs should be uniquified.
|
||||||
|
// If this object does not exist, all IDs will be uniquified.
|
||||||
|
var referencedIds = onlyReferenced ? [] : NULL;
|
||||||
|
var tagName;
|
||||||
|
var iriTagNames = {};
|
||||||
|
var iriProperties = [];
|
||||||
|
var changed = false;
|
||||||
|
var i, j;
|
||||||
|
|
||||||
|
if (idElements[_LENGTH_]) {
|
||||||
|
// Make all IDs unique by adding the ID suffix and collect all encountered tag names
|
||||||
|
// that are IRI referenceable from properities.
|
||||||
|
for (i = 0; i < idElements[_LENGTH_]; i++) {
|
||||||
|
tagName = idElements[i].localName; // Use non-namespaced tag name
|
||||||
|
// Make ID unique if tag name is IRI referenceable
|
||||||
|
if (tagName in IRI_TAG_PROPERTIES_MAP) {
|
||||||
|
iriTagNames[tagName] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Get all properties that are mapped to the found IRI referenceable tags
|
||||||
|
for (tagName in iriTagNames) {
|
||||||
|
(IRI_TAG_PROPERTIES_MAP[tagName] || [tagName]).forEach(function (mappedProperty) {
|
||||||
|
// Add mapped properties to array of iri referencing properties.
|
||||||
|
// Use linear search here because the number of possible entries is very small (maximum 11)
|
||||||
|
if (iriProperties.indexOf(mappedProperty) < 0) {
|
||||||
|
iriProperties.push(mappedProperty);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (iriProperties[_LENGTH_]) {
|
||||||
|
// Add "style" to properties, because it may contain references in the form 'style="fill:url(#myFill)"'
|
||||||
|
iriProperties.push(_STYLE_);
|
||||||
|
}
|
||||||
|
// Run through all elements of the SVG and replace IDs in references.
|
||||||
|
// To get all descending elements, getElementsByTagName('*') seems to perform faster than querySelectorAll('*').
|
||||||
|
// Since svgElem.getElementsByTagName('*') does not return the svg element itself, we have to handle it separately.
|
||||||
|
var descElements = svgElem[_GET_ELEMENTS_BY_TAG_NAME_]('*');
|
||||||
|
var element = svgElem;
|
||||||
|
var propertyName;
|
||||||
|
var value;
|
||||||
|
var newValue;
|
||||||
|
for (i = -1; element != NULL;) {
|
||||||
|
if (element.localName == _STYLE_) {
|
||||||
|
// If element is a style element, replace IDs in all occurences of "url(#anyId)" in text content
|
||||||
|
value = element.textContent;
|
||||||
|
newValue = value && value.replace(funcIriRegex, function(match, id) {
|
||||||
|
if (referencedIds) {
|
||||||
|
referencedIds[id] = 1;
|
||||||
|
}
|
||||||
|
return 'url(#' + id + idSuffix + ')';
|
||||||
|
});
|
||||||
|
if (newValue !== value) {
|
||||||
|
element.textContent = newValue;
|
||||||
|
}
|
||||||
|
} else if (element.hasAttributes()) {
|
||||||
|
// Run through all property names for which IDs were found
|
||||||
|
for (j = 0; j < iriProperties[_LENGTH_]; j++) {
|
||||||
|
propertyName = iriProperties[j];
|
||||||
|
value = element[_GET_ATTRIBUTE_](propertyName);
|
||||||
|
newValue = value && value.replace(funcIriRegex, function(match, id) {
|
||||||
|
if (referencedIds) {
|
||||||
|
referencedIds[id] = 1;
|
||||||
|
}
|
||||||
|
return 'url(#' + id + idSuffix + ')';
|
||||||
|
});
|
||||||
|
if (newValue !== value) {
|
||||||
|
element[_SET_ATTRIBUTE_](propertyName, newValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Replace IDs in xlink:ref and href attributes
|
||||||
|
['xlink:href', 'href'].forEach(function(refAttrName) {
|
||||||
|
var iri = element[_GET_ATTRIBUTE_](refAttrName);
|
||||||
|
if (/^\s*#/.test(iri)) { // Check if iri is non-null and internal reference
|
||||||
|
iri = iri.trim();
|
||||||
|
element[_SET_ATTRIBUTE_](refAttrName, iri + idSuffix);
|
||||||
|
if (referencedIds) {
|
||||||
|
// Add ID to referenced IDs
|
||||||
|
referencedIds[iri.substring(1)] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
element = descElements[++i];
|
||||||
|
}
|
||||||
|
for (i = 0; i < idElements[_LENGTH_]; i++) {
|
||||||
|
idElem = idElements[i];
|
||||||
|
// If set of referenced IDs exists, make only referenced IDs unique,
|
||||||
|
// otherwise make all IDs unique.
|
||||||
|
if (!referencedIds || referencedIds[idElem.id]) {
|
||||||
|
// Add suffix to element's ID
|
||||||
|
idElem.id += idSuffix;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// return true if SVG element has changed
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// For cached SVGs the IDs are made unique by simply replacing the already inserted unique IDs with a
|
||||||
|
// higher ID counter. This is much more performant than a call to makeIdsUnique().
|
||||||
|
function makeIdsUniqueCached(svgString) {
|
||||||
|
return svgString.replace(ID_SUFFIX_REGEX, ID_SUFFIX + uniqueIdCounter++);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Inject SVG by replacing the img element with the SVG element in the DOM
|
||||||
|
function inject(imgElem, svgElem, absUrl, options) {
|
||||||
|
if (svgElem) {
|
||||||
|
svgElem[_SET_ATTRIBUTE_]('data-inject-url', absUrl);
|
||||||
|
var parentNode = imgElem.parentNode;
|
||||||
|
if (parentNode) {
|
||||||
|
if (options.copyAttributes) {
|
||||||
|
copyAttributes(imgElem, svgElem);
|
||||||
|
}
|
||||||
|
// Invoke beforeInject hook if set
|
||||||
|
var beforeInject = options.beforeInject;
|
||||||
|
var injectElem = (beforeInject && beforeInject(imgElem, svgElem)) || svgElem;
|
||||||
|
// Replace img element with new element. This is the actual injection.
|
||||||
|
parentNode.replaceChild(injectElem, imgElem);
|
||||||
|
// Mark img element as injected
|
||||||
|
imgElem[__SVGINJECT] = INJECTED;
|
||||||
|
removeOnLoadAttribute(imgElem);
|
||||||
|
// Invoke afterInject hook if set
|
||||||
|
var afterInject = options.afterInject;
|
||||||
|
if (afterInject) {
|
||||||
|
afterInject(imgElem, injectElem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
svgInvalid(imgElem, options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Merges any number of options objects into a new object
|
||||||
|
function mergeOptions() {
|
||||||
|
var mergedOptions = {};
|
||||||
|
var args = arguments;
|
||||||
|
// Iterate over all specified options objects and add all properties to the new options object
|
||||||
|
for (var i = 0; i < args[_LENGTH_]; i++) {
|
||||||
|
var argument = args[i];
|
||||||
|
for (var key in argument) {
|
||||||
|
if (argument.hasOwnProperty(key)) {
|
||||||
|
mergedOptions[key] = argument[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mergedOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Adds the specified CSS to the document's <head> element
|
||||||
|
function addStyleToHead(css) {
|
||||||
|
var head = document[_GET_ELEMENTS_BY_TAG_NAME_]('head')[0];
|
||||||
|
if (head) {
|
||||||
|
var style = document[_CREATE_ELEMENT_](_STYLE_);
|
||||||
|
style.type = 'text/css';
|
||||||
|
style.appendChild(document.createTextNode(css));
|
||||||
|
head.appendChild(style);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Builds an SVG element from the specified SVG string
|
||||||
|
function buildSvgElement(svgStr, verify) {
|
||||||
|
if (verify) {
|
||||||
|
var svgDoc;
|
||||||
|
try {
|
||||||
|
// Parse the SVG string with DOMParser
|
||||||
|
svgDoc = svgStringToSvgDoc(svgStr);
|
||||||
|
} catch(e) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (svgDoc[_GET_ELEMENTS_BY_TAG_NAME_]('parsererror')[_LENGTH_]) {
|
||||||
|
// DOMParser does not throw an exception, but instead puts parsererror tags in the document
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return svgDoc.documentElement;
|
||||||
|
} else {
|
||||||
|
var div = document.createElement('div');
|
||||||
|
div.innerHTML = svgStr;
|
||||||
|
return div.firstElementChild;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function removeOnLoadAttribute(imgElem) {
|
||||||
|
// Remove the onload attribute. Should only be used to remove the unstyled image flash protection and
|
||||||
|
// make the element visible, not for removing the event listener.
|
||||||
|
imgElem.removeAttribute('onload');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function errorMessage(msg) {
|
||||||
|
console.error('SVGInject: ' + msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function fail(imgElem, status, options) {
|
||||||
|
imgElem[__SVGINJECT] = FAIL;
|
||||||
|
if (options.onFail) {
|
||||||
|
options.onFail(imgElem, status);
|
||||||
|
} else {
|
||||||
|
errorMessage(status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function svgInvalid(imgElem, options) {
|
||||||
|
removeOnLoadAttribute(imgElem);
|
||||||
|
fail(imgElem, SVG_INVALID, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function svgNotSupported(imgElem, options) {
|
||||||
|
removeOnLoadAttribute(imgElem);
|
||||||
|
fail(imgElem, SVG_NOT_SUPPORTED, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function loadFail(imgElem, options) {
|
||||||
|
fail(imgElem, LOAD_FAIL, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function removeEventListeners(imgElem) {
|
||||||
|
imgElem.onload = NULL;
|
||||||
|
imgElem.onerror = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function imgNotSet(msg) {
|
||||||
|
errorMessage('no img element');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function createSVGInject(globalName, options) {
|
||||||
|
var defaultOptions = mergeOptions(DEFAULT_OPTIONS, options);
|
||||||
|
var svgLoadCache = {};
|
||||||
|
|
||||||
|
if (IS_SVG_SUPPORTED) {
|
||||||
|
// If the browser supports SVG, add a small stylesheet that hides the <img> elements until
|
||||||
|
// injection is finished. This avoids showing the unstyled SVGs before style is applied.
|
||||||
|
addStyleToHead('img[onload^="' + globalName + '("]{visibility:hidden;}');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SVGInject
|
||||||
|
*
|
||||||
|
* Injects the SVG specified in the `src` attribute of the specified `img` element or array of `img`
|
||||||
|
* elements. Returns a Promise object which resolves if all passed in `img` elements have either been
|
||||||
|
* injected or failed to inject (Only if a global Promise object is available like in all modern browsers
|
||||||
|
* or through a polyfill).
|
||||||
|
*
|
||||||
|
* Options:
|
||||||
|
* useCache: If set to `true` the SVG will be cached using the absolute URL. Default value is `true`.
|
||||||
|
* copyAttributes: If set to `true` the attributes will be copied from `img` to `svg`. Dfault value
|
||||||
|
* is `true`.
|
||||||
|
* makeIdsUnique: If set to `true` the ID of elements in the `<defs>` element that can be references by
|
||||||
|
* property values (for example 'clipPath') are made unique by appending "--inject-X", where X is a
|
||||||
|
* running number which increases with each injection. This is done to avoid duplicate IDs in the DOM.
|
||||||
|
* beforeLoad: Hook before SVG is loaded. The `img` element is passed as a parameter. If the hook returns
|
||||||
|
* a string it is used as the URL instead of the `img` element's `src` attribute.
|
||||||
|
* afterLoad: Hook after SVG is loaded. The loaded `svg` element and `svg` string are passed as a
|
||||||
|
* parameters. If caching is active this hook will only get called once for injected SVGs with the
|
||||||
|
* same absolute path. Changes to the `svg` element in this hook will be applied to all injected SVGs
|
||||||
|
* with the same absolute path. It's also possible to return an `svg` string or `svg` element which
|
||||||
|
* will then be used for the injection.
|
||||||
|
* beforeInject: Hook before SVG is injected. The `img` and `svg` elements are passed as parameters. If
|
||||||
|
* any html element is returned it gets injected instead of applying the default SVG injection.
|
||||||
|
* afterInject: Hook after SVG is injected. The `img` and `svg` elements are passed as parameters.
|
||||||
|
* onAllFinish: Hook after all `img` elements passed to an SVGInject() call have either been injected or
|
||||||
|
* failed to inject.
|
||||||
|
* onFail: Hook after injection fails. The `img` element and a `status` string are passed as an parameter.
|
||||||
|
* The `status` can be either `'SVG_NOT_SUPPORTED'` (the browser does not support SVG),
|
||||||
|
* `'SVG_INVALID'` (the SVG is not in a valid format) or `'LOAD_FAILED'` (loading of the SVG failed).
|
||||||
|
*
|
||||||
|
* @param {HTMLImageElement} img - an img element or an array of img elements
|
||||||
|
* @param {Object} [options] - optional parameter with [options](#options) for this injection.
|
||||||
|
*/
|
||||||
|
function SVGInject(img, options) {
|
||||||
|
options = mergeOptions(defaultOptions, options);
|
||||||
|
|
||||||
|
var run = function(resolve) {
|
||||||
|
var allFinish = function() {
|
||||||
|
var onAllFinish = options.onAllFinish;
|
||||||
|
if (onAllFinish) {
|
||||||
|
onAllFinish();
|
||||||
|
}
|
||||||
|
resolve && resolve();
|
||||||
|
};
|
||||||
|
|
||||||
|
if (img && typeof img[_LENGTH_] != _UNDEFINED_) {
|
||||||
|
// an array like structure of img elements
|
||||||
|
var injectIndex = 0;
|
||||||
|
var injectCount = img[_LENGTH_];
|
||||||
|
|
||||||
|
if (injectCount == 0) {
|
||||||
|
allFinish();
|
||||||
|
} else {
|
||||||
|
var finish = function() {
|
||||||
|
if (++injectIndex == injectCount) {
|
||||||
|
allFinish();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var i = 0; i < injectCount; i++) {
|
||||||
|
SVGInjectElement(img[i], options, finish);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// only one img element
|
||||||
|
SVGInjectElement(img, options, allFinish);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// return a Promise object if globally available
|
||||||
|
return typeof Promise == _UNDEFINED_ ? run() : new Promise(run);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Injects a single svg element. Options must be already merged with the default options.
|
||||||
|
function SVGInjectElement(imgElem, options, callback) {
|
||||||
|
if (imgElem) {
|
||||||
|
var svgInjectAttributeValue = imgElem[__SVGINJECT];
|
||||||
|
if (!svgInjectAttributeValue) {
|
||||||
|
removeEventListeners(imgElem);
|
||||||
|
|
||||||
|
if (!IS_SVG_SUPPORTED) {
|
||||||
|
svgNotSupported(imgElem, options);
|
||||||
|
callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Invoke beforeLoad hook if set. If the beforeLoad returns a value use it as the src for the load
|
||||||
|
// URL path. Else use the imgElem's src attribute value.
|
||||||
|
var beforeLoad = options.beforeLoad;
|
||||||
|
var src = (beforeLoad && beforeLoad(imgElem)) || imgElem[_GET_ATTRIBUTE_]('src');
|
||||||
|
|
||||||
|
if (!src) {
|
||||||
|
// If no image src attribute is set do no injection. This can only be reached by using javascript
|
||||||
|
// because if no src attribute is set the onload and onerror events do not get called
|
||||||
|
if (src === '') {
|
||||||
|
loadFail(imgElem, options);
|
||||||
|
}
|
||||||
|
callback();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set array so later calls can register callbacks
|
||||||
|
var onFinishCallbacks = [];
|
||||||
|
imgElem[__SVGINJECT] = onFinishCallbacks;
|
||||||
|
|
||||||
|
var onFinish = function() {
|
||||||
|
callback();
|
||||||
|
onFinishCallbacks.forEach(function(onFinishCallback) {
|
||||||
|
onFinishCallback();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
var absUrl = getAbsoluteUrl(src);
|
||||||
|
var useCacheOption = options.useCache;
|
||||||
|
var makeIdsUniqueOption = options.makeIdsUnique;
|
||||||
|
|
||||||
|
var setSvgLoadCacheValue = function(val) {
|
||||||
|
if (useCacheOption) {
|
||||||
|
svgLoadCache[absUrl].forEach(function(svgLoad) {
|
||||||
|
svgLoad(val);
|
||||||
|
});
|
||||||
|
svgLoadCache[absUrl] = val;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (useCacheOption) {
|
||||||
|
var svgLoad = svgLoadCache[absUrl];
|
||||||
|
|
||||||
|
var handleLoadValue = function(loadValue) {
|
||||||
|
if (loadValue === LOAD_FAIL) {
|
||||||
|
loadFail(imgElem, options);
|
||||||
|
} else if (loadValue === SVG_INVALID) {
|
||||||
|
svgInvalid(imgElem, options);
|
||||||
|
} else {
|
||||||
|
var hasUniqueIds = loadValue[0];
|
||||||
|
var svgString = loadValue[1];
|
||||||
|
var uniqueIdsSvgString = loadValue[2];
|
||||||
|
var svgElem;
|
||||||
|
|
||||||
|
if (makeIdsUniqueOption) {
|
||||||
|
if (hasUniqueIds === NULL) {
|
||||||
|
// IDs for the SVG string have not been made unique before. This may happen if previous
|
||||||
|
// injection of a cached SVG have been run with the option makedIdsUnique set to false
|
||||||
|
svgElem = buildSvgElement(svgString, false);
|
||||||
|
hasUniqueIds = makeIdsUnique(svgElem, false);
|
||||||
|
|
||||||
|
loadValue[0] = hasUniqueIds;
|
||||||
|
loadValue[2] = hasUniqueIds && svgElemToSvgString(svgElem);
|
||||||
|
} else if (hasUniqueIds) {
|
||||||
|
// Make IDs unique for already cached SVGs with better performance
|
||||||
|
svgString = makeIdsUniqueCached(uniqueIdsSvgString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
svgElem = svgElem || buildSvgElement(svgString, false);
|
||||||
|
|
||||||
|
inject(imgElem, svgElem, absUrl, options);
|
||||||
|
}
|
||||||
|
onFinish();
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof svgLoad != _UNDEFINED_) {
|
||||||
|
// Value for url exists in cache
|
||||||
|
if (svgLoad.isCallbackQueue) {
|
||||||
|
// Same url has been cached, but value has not been loaded yet, so add to callbacks
|
||||||
|
svgLoad.push(handleLoadValue);
|
||||||
|
} else {
|
||||||
|
handleLoadValue(svgLoad);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
var svgLoad = [];
|
||||||
|
// set property isCallbackQueue to Array to differentiate from array with cached loaded values
|
||||||
|
svgLoad.isCallbackQueue = true;
|
||||||
|
svgLoadCache[absUrl] = svgLoad;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load the SVG because it is not cached or caching is disabled
|
||||||
|
loadSvg(absUrl, function(svgXml, svgString) {
|
||||||
|
// Use the XML from the XHR request if it is an instance of Document. Otherwise
|
||||||
|
// (for example of IE9), create the svg document from the svg string.
|
||||||
|
var svgElem = svgXml instanceof Document ? svgXml.documentElement : buildSvgElement(svgString, true);
|
||||||
|
|
||||||
|
var afterLoad = options.afterLoad;
|
||||||
|
if (afterLoad) {
|
||||||
|
// Invoke afterLoad hook which may modify the SVG element. After load may also return a new
|
||||||
|
// svg element or svg string
|
||||||
|
var svgElemOrSvgString = afterLoad(svgElem, svgString) || svgElem;
|
||||||
|
if (svgElemOrSvgString) {
|
||||||
|
// Update svgElem and svgString because of modifications to the SVG element or SVG string in
|
||||||
|
// the afterLoad hook, so the modified SVG is also used for all later cached injections
|
||||||
|
var isString = typeof svgElemOrSvgString == 'string';
|
||||||
|
svgString = isString ? svgElemOrSvgString : svgElemToSvgString(svgElem);
|
||||||
|
svgElem = isString ? buildSvgElement(svgElemOrSvgString, true) : svgElemOrSvgString;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (svgElem instanceof SVGElement) {
|
||||||
|
var hasUniqueIds = NULL;
|
||||||
|
if (makeIdsUniqueOption) {
|
||||||
|
hasUniqueIds = makeIdsUnique(svgElem, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (useCacheOption) {
|
||||||
|
var uniqueIdsSvgString = hasUniqueIds && svgElemToSvgString(svgElem);
|
||||||
|
// set an array with three entries to the load cache
|
||||||
|
setSvgLoadCacheValue([hasUniqueIds, svgString, uniqueIdsSvgString]);
|
||||||
|
}
|
||||||
|
|
||||||
|
inject(imgElem, svgElem, absUrl, options);
|
||||||
|
} else {
|
||||||
|
svgInvalid(imgElem, options);
|
||||||
|
setSvgLoadCacheValue(SVG_INVALID);
|
||||||
|
}
|
||||||
|
onFinish();
|
||||||
|
}, function() {
|
||||||
|
loadFail(imgElem, options);
|
||||||
|
setSvgLoadCacheValue(LOAD_FAIL);
|
||||||
|
onFinish();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
if (Array.isArray(svgInjectAttributeValue)) {
|
||||||
|
// svgInjectAttributeValue is an array. Injection is not complete so register callback
|
||||||
|
svgInjectAttributeValue.push(callback);
|
||||||
|
} else {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
imgNotSet();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the default [options](#options) for SVGInject.
|
||||||
|
*
|
||||||
|
* @param {Object} [options] - default [options](#options) for an injection.
|
||||||
|
*/
|
||||||
|
SVGInject.setOptions = function(options) {
|
||||||
|
defaultOptions = mergeOptions(defaultOptions, options);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Create a new instance of SVGInject
|
||||||
|
SVGInject.create = createSVGInject;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used in onerror Event of an `<img>` element to handle cases when the loading the original src fails
|
||||||
|
* (for example if file is not found or if the browser does not support SVG). This triggers a call to the
|
||||||
|
* options onFail hook if available. The optional second parameter will be set as the new src attribute
|
||||||
|
* for the img element.
|
||||||
|
*
|
||||||
|
* @param {HTMLImageElement} img - an img element
|
||||||
|
* @param {String} [fallbackSrc] - optional parameter fallback src
|
||||||
|
*/
|
||||||
|
SVGInject.err = function(img, fallbackSrc) {
|
||||||
|
if (img) {
|
||||||
|
if (img[__SVGINJECT] != FAIL) {
|
||||||
|
removeEventListeners(img);
|
||||||
|
|
||||||
|
if (!IS_SVG_SUPPORTED) {
|
||||||
|
svgNotSupported(img, defaultOptions);
|
||||||
|
} else {
|
||||||
|
removeOnLoadAttribute(img);
|
||||||
|
loadFail(img, defaultOptions);
|
||||||
|
}
|
||||||
|
if (fallbackSrc) {
|
||||||
|
removeOnLoadAttribute(img);
|
||||||
|
img.src = fallbackSrc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
imgNotSet();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window[globalName] = SVGInject;
|
||||||
|
|
||||||
|
return SVGInject;
|
||||||
|
}
|
||||||
|
|
||||||
|
var SVGInjectInstance = createSVGInject('SVGInject');
|
||||||
|
|
||||||
|
if (typeof module == 'object' && typeof module.exports == 'object') {
|
||||||
|
module.exports = SVGInjectInstance;
|
||||||
|
}
|
||||||
|
})(window, document);
|
|
@ -0,0 +1,10 @@
|
||||||
|
!function(o,l){var r,a,s="createElement",g="getElementsByTagName",b="length",E="style",d="title",y="undefined",k="setAttribute",w="getAttribute",x=null,A="__svgInject",C="--inject-",S=new RegExp(C+"\\d+","g"),I="LOAD_FAIL",t="SVG_NOT_SUPPORTED",L="SVG_INVALID",v=["src","alt","onload","onerror"],j=l[s]("a"),G=typeof SVGRect!=y,f={useCache:!0,copyAttributes:!0,makeIdsUnique:!0},N={clipPath:["clip-path"],"color-profile":x,cursor:x,filter:x,linearGradient:["fill","stroke"],marker:["marker",
|
||||||
|
"marker-end","marker-mid","marker-start"],mask:x,pattern:["fill","stroke"],radialGradient:["fill","stroke"]},u=1,c=2,O=1;function T(e){return(r=r||new XMLSerializer).serializeToString(e)}function P(e,r){var t,n,i,o,a=C+O++,f=/url\("?#([a-zA-Z][\w:.-]*)"?\)/g,u=e.querySelectorAll("[id]"),c=r?[]:x,l={},s=[],d=!1;if(u[b]){for(i=0;i<u[b];i++)(n=u[i].localName)in N&&(l[n]=1);for(n in l)(N[n]||[n]).forEach(function(e){s.indexOf(e)<0&&s.push(e)});s[b]&&s.push(E);var v,p,m,h=e[g]("*"),y=e;for(i=-1;y!=x;
|
||||||
|
){if(y.localName==E)(m=(p=y.textContent)&&p.replace(f,function(e,r){return c&&(c[r]=1),"url(#"+r+a+")"}))!==p&&(y.textContent=m);else if(y.hasAttributes()){for(o=0;o<s[b];o++)v=s[o],(m=(p=y[w](v))&&p.replace(f,function(e,r){return c&&(c[r]=1),"url(#"+r+a+")"}))!==p&&y[k](v,m);["xlink:href","href"].forEach(function(e){var r=y[w](e);/^\s*#/.test(r)&&(r=r.trim(),y[k](e,r+a),c&&(c[r.substring(1)]=1))})}y=h[++i]}for(i=0;i<u[b];i++)t=u[i],c&&!c[t.id]||(t.id+=a,d=!0)}return d}function V(e,r,t,n){if(r){
|
||||||
|
r[k]("data-inject-url",t);var i=e.parentNode;if(i){n.copyAttributes&&function c(e,r){for(var t,n,i,o=e.attributes,a=0;a<o[b];a++)if(n=(t=o[a]).name,-1==v.indexOf(n))if(i=t.value,n==d){var f,u=r.firstElementChild;u&&u.localName.toLowerCase()==d?f=u:(f=l[s+"NS"]("http://www.w3.org/2000/svg",d),r.insertBefore(f,u)),f.textContent=i}else r[k](n,i)}(e,r);var o=n.beforeInject,a=o&&o(e,r)||r;i.replaceChild(a,e),e[A]=u,m(e);var f=n.afterInject;f&&f(e,a)}}else D(e,n)}function p(){for(var e={},r=arguments,
|
||||||
|
t=0;t<r[b];t++){var n=r[t];for(var i in n)n.hasOwnProperty(i)&&(e[i]=n[i])}return e}function _(e,r){if(r){var t;try{t=function i(e){return(a=a||new DOMParser).parseFromString(e,"text/xml")}(e)}catch(o){return x}return t[g]("parsererror")[b]?x:t.documentElement}var n=l.createElement("div");return n.innerHTML=e,n.firstElementChild}function m(e){e.removeAttribute("onload")}function n(e){console.error("SVGInject: "+e)}function i(e,r,t){e[A]=c,t.onFail?t.onFail(e,r):n(r)}function D(e,r){m(e),i(e,L,r)
|
||||||
|
}function F(e,r){m(e),i(e,t,r)}function M(e,r){i(e,I,r)}function q(e){e.onload=x,e.onerror=x}function R(e){n("no img element")}var e=function z(e,r){var t=p(f,r),h={};function n(a,f){f=p(t,f);var e=function(r){var e=function(){var e=f.onAllFinish;e&&e(),r&&r()};if(a&&typeof a[b]!=y){var t=0,n=a[b];if(0==n)e();else for(var i=function(){++t==n&&e()},o=0;o<n;o++)u(a[o],f,i)}else u(a,f,e)};return typeof Promise==y?e():new Promise(e)}function u(u,c,e){if(u){var r=u[A];if(r)Array.isArray(r)?r.push(e
|
||||||
|
):e();else{if(q(u),!G)return F(u,c),void e();var t=c.beforeLoad,n=t&&t(u)||u[w]("src");if(!n)return""===n&&M(u,c),void e();var i=[];u[A]=i;var l=function(){e(),i.forEach(function(e){e()})},s=function f(e){return j.href=e,j.href}(n),d=c.useCache,v=c.makeIdsUnique,p=function(r){d&&(h[s].forEach(function(e){e(r)}),h[s]=r)};if(d){var o,a=function(e){if(e===I)M(u,c);else if(e===L)D(u,c);else{var r,t=e[0],n=e[1],i=e[2];v&&(t===x?(t=P(r=_(n,!1),!1),e[0]=t,e[2]=t&&T(r)):t&&(n=function o(e){
|
||||||
|
return e.replace(S,C+O++)}(i))),r=r||_(n,!1),V(u,r,s,c)}l()};if(typeof(o=h[s])!=y)return void(o.isCallbackQueue?o.push(a):a(o));(o=[]).isCallbackQueue=!0,h[s]=o}!function m(e,r,t){if(e){var n=new XMLHttpRequest;n.onreadystatechange=function(){if(4==n.readyState){var e=n.status;200==e?r(n.responseXML,n.responseText.trim()):400<=e?t():0==e&&t()}},n.open("GET",e,!0),n.send()}}(s,function(e,r){var t=e instanceof Document?e.documentElement:_(r,!0),n=c.afterLoad;if(n){var i=n(t,r)||t;if(i){
|
||||||
|
var o="string"==typeof i;r=o?i:T(t),t=o?_(i,!0):i}}if(t instanceof SVGElement){var a=x;if(v&&(a=P(t,!1)),d){var f=a&&T(t);p([a,r,f])}V(u,t,s,c)}else D(u,c),p(L);l()},function(){M(u,c),p(I),l()})}}else R()}return G&&function i(e){var r=l[g]("head")[0];if(r){var t=l[s](E);t.type="text/css",t.appendChild(l.createTextNode(e)),r.appendChild(t)}}('img[onload^="'+e+'("]{visibility:hidden;}'),n.setOptions=function(e){t=p(t,e)},n.create=z,n.err=function(e,r){e?e[A]!=c&&(q(e),G?(m(e),M(e,t)):F(e,t),r&&(m(
|
||||||
|
e),e.src=r)):R()},o[e]=n}("SVGInject");"object"==typeof module&&"object"==typeof module.exports&&(module.exports=e)}(window,document);
|
2
pom.xml
2
pom.xml
|
@ -76,7 +76,7 @@
|
||||||
<ehcache-web.version>2.0.4</ehcache-web.version>
|
<ehcache-web.version>2.0.4</ehcache-web.version>
|
||||||
|
|
||||||
<!-- Shiro 版本号 -->
|
<!-- Shiro 版本号 -->
|
||||||
<shiro.version>1.2.0</shiro.version>
|
<shiro.version>1.9.0</shiro.version>
|
||||||
|
|
||||||
<!-- POI 版本号 -->
|
<!-- POI 版本号 -->
|
||||||
<poi.version>3.15</poi.version>
|
<poi.version>3.15</poi.version>
|
||||||
|
|
Loading…
Reference in New Issue