sculp-js 1.13.3-beta.0 → 1.13.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/_virtual/_commonjsHelpers.js +3 -3
- package/dist/cjs/array.js +36 -46
- package/dist/cjs/async.js +41 -43
- package/dist/cjs/base64.js +77 -66
- package/dist/cjs/clipboard.js +54 -53
- package/dist/cjs/cloneDeep.js +90 -91
- package/dist/cjs/cookie.js +27 -30
- package/dist/cjs/date.js +101 -98
- package/dist/cjs/dom.js +114 -121
- package/dist/cjs/download.js +77 -78
- package/dist/cjs/easing.js +29 -32
- package/dist/cjs/file.js +147 -152
- package/dist/cjs/func.js +64 -78
- package/dist/cjs/index.js +1 -3
- package/dist/cjs/math.js +32 -38
- package/dist/cjs/node_modules/bezier-easing/src/index.js +35 -23
- package/dist/cjs/number.js +58 -61
- package/dist/cjs/object.js +112 -126
- package/dist/cjs/path.js +39 -43
- package/dist/cjs/qs.js +34 -41
- package/dist/cjs/random.js +31 -34
- package/dist/cjs/string.js +62 -63
- package/dist/cjs/tooltip.js +66 -69
- package/dist/cjs/tree.js +265 -263
- package/dist/cjs/type.js +42 -46
- package/dist/cjs/unique.js +39 -42
- package/dist/cjs/url.js +47 -48
- package/dist/cjs/validator.js +38 -38
- package/dist/cjs/variable.js +27 -21
- package/dist/cjs/watermark.js +78 -67
- package/dist/esm/array.js +36 -46
- package/dist/esm/async.js +41 -43
- package/dist/esm/base64.js +77 -66
- package/dist/esm/clipboard.js +55 -54
- package/dist/esm/cloneDeep.js +90 -91
- package/dist/esm/cookie.js +27 -30
- package/dist/esm/date.js +101 -98
- package/dist/esm/dom.js +114 -121
- package/dist/esm/download.js +78 -79
- package/dist/esm/easing.js +29 -32
- package/dist/esm/file.js +147 -152
- package/dist/esm/func.js +64 -78
- package/dist/esm/index.js +96 -8
- package/dist/esm/math.js +32 -38
- package/dist/esm/number.js +58 -61
- package/dist/esm/object.js +124 -127
- package/dist/esm/path.js +39 -43
- package/dist/esm/qs.js +34 -41
- package/dist/esm/random.js +31 -34
- package/dist/esm/string.js +74 -64
- package/dist/esm/tooltip.js +66 -69
- package/dist/esm/tree.js +265 -263
- package/dist/esm/type.js +68 -47
- package/dist/esm/unique.js +39 -42
- package/dist/esm/url.js +47 -48
- package/dist/esm/validator.js +56 -39
- package/dist/esm/variable.js +27 -21
- package/dist/esm/watermark.js +79 -68
- package/dist/types/array.d.ts +0 -1
- package/dist/types/async.d.ts +0 -1
- package/dist/types/base64.d.ts +0 -1
- package/dist/types/clipboard.d.ts +0 -1
- package/dist/types/cloneDeep.d.ts +0 -1
- package/dist/types/cookie.d.ts +0 -1
- package/dist/types/date.d.ts +0 -1
- package/dist/types/dom.d.ts +0 -1
- package/dist/types/download.d.ts +0 -1
- package/dist/types/easing.d.ts +0 -1
- package/dist/types/file.d.ts +0 -1
- package/dist/types/func.d.ts +0 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/math.d.ts +0 -1
- package/dist/types/number.d.ts +0 -1
- package/dist/types/object.d.ts +0 -1
- package/dist/types/path.d.ts +0 -1
- package/dist/types/qs.d.ts +0 -1
- package/dist/types/random.d.ts +0 -1
- package/dist/types/string.d.ts +0 -1
- package/dist/types/tooltip.d.ts +0 -1
- package/dist/types/tree.d.ts +2 -2
- package/dist/types/type.d.ts +0 -1
- package/dist/types/unique.d.ts +0 -1
- package/dist/types/url.d.ts +0 -1
- package/dist/types/validator.d.ts +0 -1
- package/dist/types/variable.d.ts +0 -1
- package/dist/types/watermark.d.ts +0 -1
- package/dist/umd/index.min.js +2 -2
- package/package.json +12 -6
- package/dist/types/array.d.ts.map +0 -1
- package/dist/types/async.d.ts.map +0 -1
- package/dist/types/base64.d.ts.map +0 -1
- package/dist/types/clipboard.d.ts.map +0 -1
- package/dist/types/cloneDeep.d.ts.map +0 -1
- package/dist/types/cookie.d.ts.map +0 -1
- package/dist/types/core-index.d.ts +0 -17
- package/dist/types/core-index.d.ts.map +0 -1
- package/dist/types/date.d.ts.map +0 -1
- package/dist/types/dom.d.ts.map +0 -1
- package/dist/types/download.d.ts.map +0 -1
- package/dist/types/easing.d.ts.map +0 -1
- package/dist/types/file.d.ts.map +0 -1
- package/dist/types/func.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -3278
- package/dist/types/math.d.ts.map +0 -1
- package/dist/types/number.d.ts.map +0 -1
- package/dist/types/object.d.ts.map +0 -1
- package/dist/types/path.d.ts.map +0 -1
- package/dist/types/qs.d.ts.map +0 -1
- package/dist/types/random.d.ts.map +0 -1
- package/dist/types/string.d.ts.map +0 -1
- package/dist/types/tooltip.d.ts.map +0 -1
- package/dist/types/tree.d.ts.map +0 -1
- package/dist/types/type.d.ts.map +0 -1
- package/dist/types/unique.d.ts.map +0 -1
- package/dist/types/url.d.ts.map +0 -1
- package/dist/types/validator.d.ts.map +0 -1
- package/dist/types/variable.d.ts.map +0 -1
- package/dist/types/watermark.d.ts.map +0 -1
package/dist/cjs/dom.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* sculp-js v1.13.
|
|
2
|
+
* sculp-js v1.13.6
|
|
3
3
|
* (c) 2023-present chandq
|
|
4
4
|
* Released under the MIT License.
|
|
5
5
|
*/
|
|
@@ -19,13 +19,12 @@ var type = require('./type.js');
|
|
|
19
19
|
* @returns {boolean}
|
|
20
20
|
*/
|
|
21
21
|
function hasClass(el, className) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return el.classList.contains(className);
|
|
22
|
+
if (className.indexOf(' ') !== -1) throw new Error('className should not contain space.');
|
|
23
|
+
return el.classList.contains(className);
|
|
25
24
|
}
|
|
26
25
|
const eachClassName = (classNames, func) => {
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
const classNameList = classNames.split(/\s+/g);
|
|
27
|
+
classNameList.forEach(func);
|
|
29
28
|
};
|
|
30
29
|
/**
|
|
31
30
|
* 给元素增加样式名
|
|
@@ -33,7 +32,7 @@ const eachClassName = (classNames, func) => {
|
|
|
33
32
|
* @param {string} classNames
|
|
34
33
|
*/
|
|
35
34
|
function addClass(el, classNames) {
|
|
36
|
-
|
|
35
|
+
eachClassName(classNames, className => el.classList.add(className));
|
|
37
36
|
}
|
|
38
37
|
/**
|
|
39
38
|
* 给元素移除样式名
|
|
@@ -41,7 +40,7 @@ function addClass(el, classNames) {
|
|
|
41
40
|
* @param {string} classNames
|
|
42
41
|
*/
|
|
43
42
|
function removeClass(el, classNames) {
|
|
44
|
-
|
|
43
|
+
eachClassName(classNames, className => el.classList.remove(className));
|
|
45
44
|
}
|
|
46
45
|
/**
|
|
47
46
|
* 设置元素样式
|
|
@@ -50,14 +49,13 @@ function removeClass(el, classNames) {
|
|
|
50
49
|
* @param {string} val
|
|
51
50
|
*/
|
|
52
51
|
const setStyle = (el, key, val) => {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
52
|
+
if (type.isObject(key)) {
|
|
53
|
+
object.objectEach(key, (val1, key1) => {
|
|
54
|
+
setStyle(el, key1, val1);
|
|
55
|
+
});
|
|
56
|
+
} else {
|
|
57
|
+
el.style.setProperty(string.stringKebabCase(key), val);
|
|
58
|
+
}
|
|
61
59
|
};
|
|
62
60
|
/**
|
|
63
61
|
* 获取元素样式
|
|
@@ -66,57 +64,54 @@ const setStyle = (el, key, val) => {
|
|
|
66
64
|
* @returns {string}
|
|
67
65
|
*/
|
|
68
66
|
function getStyle(el, key) {
|
|
69
|
-
|
|
67
|
+
return getComputedStyle(el).getPropertyValue(key);
|
|
70
68
|
}
|
|
71
69
|
function smoothScroll(options) {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
};
|
|
118
|
-
render();
|
|
119
|
-
});
|
|
70
|
+
return new Promise(resolve => {
|
|
71
|
+
const defaults = {
|
|
72
|
+
el: document,
|
|
73
|
+
to: 0,
|
|
74
|
+
duration: 567,
|
|
75
|
+
easing: 'ease'
|
|
76
|
+
};
|
|
77
|
+
const { el, to, duration, easing: easing$1 } = object.objectAssign(defaults, options);
|
|
78
|
+
const htmlEl = document.documentElement;
|
|
79
|
+
const bodyEl = document.body;
|
|
80
|
+
const globalMode = el === window || el === document || el === htmlEl || el === bodyEl;
|
|
81
|
+
const els = globalMode ? [htmlEl, bodyEl] : [el];
|
|
82
|
+
const query = () => {
|
|
83
|
+
let value = 0;
|
|
84
|
+
array.arrayEach(els, el => {
|
|
85
|
+
if ('scrollTop' in el) {
|
|
86
|
+
value = el.scrollTop;
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
return value;
|
|
91
|
+
};
|
|
92
|
+
const update = val => {
|
|
93
|
+
els.forEach(el => {
|
|
94
|
+
if ('scrollTop' in el) {
|
|
95
|
+
el.scrollTop = val;
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
let startTime;
|
|
100
|
+
const startValue = query();
|
|
101
|
+
const length = to - startValue;
|
|
102
|
+
const easingFn = easing.easingFunctional(easing$1);
|
|
103
|
+
const render = () => {
|
|
104
|
+
const now = performance.now();
|
|
105
|
+
const passingTime = startTime ? now - startTime : 0;
|
|
106
|
+
const t = passingTime / duration;
|
|
107
|
+
const p = easingFn(t);
|
|
108
|
+
if (!startTime) startTime = now;
|
|
109
|
+
update(startValue + length * p);
|
|
110
|
+
if (t >= 1) resolve();
|
|
111
|
+
else requestAnimationFrame(render);
|
|
112
|
+
};
|
|
113
|
+
render();
|
|
114
|
+
});
|
|
120
115
|
}
|
|
121
116
|
/**
|
|
122
117
|
* 获取元素样式属性的计算值
|
|
@@ -126,8 +121,8 @@ function smoothScroll(options) {
|
|
|
126
121
|
* @returns {string|number}
|
|
127
122
|
*/
|
|
128
123
|
function getComputedCssVal(el, property, reNumber = true) {
|
|
129
|
-
|
|
130
|
-
|
|
124
|
+
const originVal = getComputedStyle(el).getPropertyValue(property) ?? '';
|
|
125
|
+
return reNumber ? Number(originVal.replace(/([0-9]*)(.*)/g, '$1')) : originVal;
|
|
131
126
|
}
|
|
132
127
|
/**
|
|
133
128
|
* 字符串的像素宽度
|
|
@@ -137,31 +132,31 @@ function getComputedCssVal(el, property, reNumber = true) {
|
|
|
137
132
|
* @returns {*}
|
|
138
133
|
*/
|
|
139
134
|
function getStrWidthPx(str, fontSize = 14, isRemove = true) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
135
|
+
let strWidth = 0;
|
|
136
|
+
console.assert(type.isString(str), `${str} 不是有效的字符串`);
|
|
137
|
+
if (type.isString(str) && str.length > 0) {
|
|
138
|
+
const id = 'getStrWidth1494304949567';
|
|
139
|
+
let getEle = document.querySelector(`#${id}`);
|
|
140
|
+
if (!getEle) {
|
|
141
|
+
const _ele = document.createElement('span');
|
|
142
|
+
_ele.id = id;
|
|
143
|
+
_ele.style.fontSize = fontSize + 'px';
|
|
144
|
+
_ele.style.whiteSpace = 'nowrap';
|
|
145
|
+
_ele.style.visibility = 'hidden';
|
|
146
|
+
_ele.style.position = 'absolute';
|
|
147
|
+
_ele.style.top = '-9999px';
|
|
148
|
+
_ele.style.left = '-9999px';
|
|
149
|
+
_ele.textContent = str;
|
|
150
|
+
document.body.appendChild(_ele);
|
|
151
|
+
getEle = _ele;
|
|
152
|
+
}
|
|
153
|
+
getEle.textContent = str;
|
|
154
|
+
strWidth = getEle.offsetWidth;
|
|
155
|
+
if (isRemove) {
|
|
156
|
+
getEle.remove();
|
|
163
157
|
}
|
|
164
|
-
|
|
158
|
+
}
|
|
159
|
+
return strWidth;
|
|
165
160
|
}
|
|
166
161
|
/**
|
|
167
162
|
* Programmatically select the text of a HTML element
|
|
@@ -170,39 +165,37 @@ function getStrWidthPx(str, fontSize = 14, isRemove = true) {
|
|
|
170
165
|
* @returns
|
|
171
166
|
*/
|
|
172
167
|
function select(element) {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
168
|
+
let selectedText;
|
|
169
|
+
if (element.nodeName === 'SELECT') {
|
|
170
|
+
element.focus();
|
|
171
|
+
// @ts-ignore
|
|
172
|
+
selectedText = element.value;
|
|
173
|
+
} else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
|
|
174
|
+
const isReadOnly = element.hasAttribute('readonly');
|
|
175
|
+
if (!isReadOnly) {
|
|
176
|
+
element.setAttribute('readonly', '');
|
|
178
177
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
element.select();
|
|
186
|
-
// @ts-ignore
|
|
187
|
-
element.setSelectionRange(0, element.value.length);
|
|
188
|
-
if (!isReadOnly) {
|
|
189
|
-
element.removeAttribute('readonly');
|
|
190
|
-
}
|
|
191
|
-
// @ts-ignore
|
|
192
|
-
selectedText = element.value;
|
|
178
|
+
// @ts-ignore
|
|
179
|
+
element.select();
|
|
180
|
+
// @ts-ignore
|
|
181
|
+
element.setSelectionRange(0, element.value.length);
|
|
182
|
+
if (!isReadOnly) {
|
|
183
|
+
element.removeAttribute('readonly');
|
|
193
184
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
const range = document.createRange();
|
|
200
|
-
range.selectNodeContents(element);
|
|
201
|
-
selection.removeAllRanges();
|
|
202
|
-
selection.addRange(range);
|
|
203
|
-
selectedText = selection.toString();
|
|
185
|
+
// @ts-ignore
|
|
186
|
+
selectedText = element.value;
|
|
187
|
+
} else {
|
|
188
|
+
if (element.hasAttribute('contenteditable')) {
|
|
189
|
+
element.focus();
|
|
204
190
|
}
|
|
205
|
-
|
|
191
|
+
const selection = window.getSelection();
|
|
192
|
+
const range = document.createRange();
|
|
193
|
+
range.selectNodeContents(element);
|
|
194
|
+
selection.removeAllRanges();
|
|
195
|
+
selection.addRange(range);
|
|
196
|
+
selectedText = selection.toString();
|
|
197
|
+
}
|
|
198
|
+
return selectedText;
|
|
206
199
|
}
|
|
207
200
|
|
|
208
201
|
exports.addClass = addClass;
|
package/dist/cjs/download.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* sculp-js v1.13.
|
|
2
|
+
* sculp-js v1.13.6
|
|
3
3
|
* (c) 2023-present chandq
|
|
4
4
|
* Released under the MIT License.
|
|
5
5
|
*/
|
|
@@ -15,7 +15,7 @@ var url = require('./url.js');
|
|
|
15
15
|
* @param {LooseParams} params
|
|
16
16
|
*/
|
|
17
17
|
function downloadURL(url$1, params) {
|
|
18
|
-
|
|
18
|
+
window.open(params ? url.urlSetParams(url$1, params) : url$1);
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
21
|
* 通过 A 链接的方式下载
|
|
@@ -24,20 +24,20 @@ function downloadURL(url$1, params) {
|
|
|
24
24
|
* @param {Function} callback
|
|
25
25
|
*/
|
|
26
26
|
function downloadHref(href, filename, callback) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
27
|
+
let eleLink = document.createElement('a');
|
|
28
|
+
eleLink.download = filename;
|
|
29
|
+
eleLink.style.display = 'none';
|
|
30
|
+
eleLink.href = href;
|
|
31
|
+
document.body.appendChild(eleLink);
|
|
32
|
+
eleLink.click();
|
|
33
|
+
setTimeout(() => {
|
|
34
|
+
document.body.removeChild(eleLink);
|
|
35
|
+
// @ts-ignore
|
|
36
|
+
eleLink = null;
|
|
37
|
+
if (type.isFunction(callback)) {
|
|
38
|
+
callback();
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
41
|
}
|
|
42
42
|
/**
|
|
43
43
|
* 将大文件对象通过 A 链接的方式下载
|
|
@@ -46,14 +46,14 @@ function downloadHref(href, filename, callback) {
|
|
|
46
46
|
* @param {Function} callback
|
|
47
47
|
*/
|
|
48
48
|
function downloadBlob(blob, filename, callback) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
49
|
+
const objURL = URL.createObjectURL(blob);
|
|
50
|
+
downloadHref(objURL, filename);
|
|
51
|
+
setTimeout(() => {
|
|
52
|
+
URL.revokeObjectURL(objURL);
|
|
53
|
+
if (type.isFunction(callback)) {
|
|
54
|
+
callback();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
59
59
|
* 根据URL下载文件(解决跨域a.download不生效问题)
|
|
@@ -66,34 +66,36 @@ function downloadBlob(blob, filename, callback) {
|
|
|
66
66
|
* @param {CrossOriginDownloadParams} options
|
|
67
67
|
*/
|
|
68
68
|
function crossOriginDownload(url, filename, options) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
69
|
+
const {
|
|
70
|
+
successCode = 200,
|
|
71
|
+
successCallback,
|
|
72
|
+
failCallback
|
|
73
|
+
} = type.isNullOrUnDef(options) ? { successCode: 200, successCallback: void 0, failCallback: void 0 } : options;
|
|
74
|
+
const xhr = new XMLHttpRequest();
|
|
75
|
+
xhr.open('GET', url, true);
|
|
76
|
+
xhr.responseType = 'blob';
|
|
77
|
+
xhr.onload = function () {
|
|
78
|
+
if (xhr.status === successCode) downloadBlob(xhr.response, filename, successCallback);
|
|
79
|
+
else if (type.isFunction(failCallback)) {
|
|
80
|
+
const status = xhr.status;
|
|
81
|
+
const responseType = xhr.getResponseHeader('Content-Type');
|
|
82
|
+
if (type.isString(responseType) && responseType.includes('application/json')) {
|
|
83
|
+
const reader = new FileReader();
|
|
84
|
+
reader.onload = () => {
|
|
85
|
+
failCallback({ status, response: reader.result });
|
|
86
|
+
};
|
|
87
|
+
reader.readAsText(xhr.response);
|
|
88
|
+
} else {
|
|
89
|
+
failCallback(xhr);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
xhr.onerror = e => {
|
|
94
|
+
if (type.isFunction(failCallback)) {
|
|
95
|
+
failCallback({ status: 0, code: 'ERROR_CONNECTION_REFUSED' });
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
xhr.send();
|
|
97
99
|
}
|
|
98
100
|
/**
|
|
99
101
|
* 将指定数据格式通过 A 链接的方式下载
|
|
@@ -103,32 +105,29 @@ function crossOriginDownload(url, filename, options) {
|
|
|
103
105
|
* @param {string[]} [headers]
|
|
104
106
|
*/
|
|
105
107
|
function downloadData(data, fileType, filename, headers) {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
const href = 'data:' + MIMETypes[fileType] + ';charset=utf-8,\ufeff' + encodeURIComponent(headerStr + bodyStr);
|
|
130
|
-
downloadHref(href, filename);
|
|
131
|
-
}
|
|
108
|
+
filename = filename.replace(`.${fileType}`, '') + `.${fileType}`;
|
|
109
|
+
if (fileType === 'json') {
|
|
110
|
+
const blob = new Blob([JSON.stringify(data, null, 4)]);
|
|
111
|
+
downloadBlob(blob, filename);
|
|
112
|
+
} else {
|
|
113
|
+
// xlsx实际生成的也为csv,仅后缀名名不同
|
|
114
|
+
if (!headers || !headers.length) throw new Error('未传入表头数据');
|
|
115
|
+
if (!Array.isArray(data)) throw new Error('data error! expected array!');
|
|
116
|
+
const headerStr = headers.join(',') + '\n';
|
|
117
|
+
let bodyStr = '';
|
|
118
|
+
data.forEach(row => {
|
|
119
|
+
// \t防止数字被科学计数法显示
|
|
120
|
+
bodyStr += Object.values(row).join(',\t') + ',\n';
|
|
121
|
+
});
|
|
122
|
+
const MIMETypes = {
|
|
123
|
+
csv: 'text/csv',
|
|
124
|
+
xls: 'application/vnd.ms-excel',
|
|
125
|
+
xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
|
126
|
+
};
|
|
127
|
+
// encodeURIComponent解决中文乱码
|
|
128
|
+
const href = 'data:' + MIMETypes[fileType] + ';charset=utf-8,\ufeff' + encodeURIComponent(headerStr + bodyStr);
|
|
129
|
+
downloadHref(href, filename);
|
|
130
|
+
}
|
|
132
131
|
}
|
|
133
132
|
|
|
134
133
|
exports.crossOriginDownload = crossOriginDownload;
|
package/dist/cjs/easing.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* sculp-js v1.13.
|
|
2
|
+
* sculp-js v1.13.6
|
|
3
3
|
* (c) 2023-present chandq
|
|
4
4
|
* Released under the MIT License.
|
|
5
5
|
*/
|
|
@@ -11,11 +11,11 @@ var type = require('./type.js');
|
|
|
11
11
|
|
|
12
12
|
// @ref https://cubic-bezier.com/
|
|
13
13
|
const easingDefines = {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
linear: [0, 0, 1, 1],
|
|
15
|
+
ease: [0.25, 0.1, 0.25, 1],
|
|
16
|
+
'ease-in': [0.42, 0, 1, 1],
|
|
17
|
+
'ease-out': [0, 0, 0.58, 1],
|
|
18
|
+
'ease-in-out': [0.42, 0, 0.58, 1]
|
|
19
19
|
};
|
|
20
20
|
/**
|
|
21
21
|
* 设置缓存定义
|
|
@@ -23,12 +23,11 @@ const easingDefines = {
|
|
|
23
23
|
* @param {EasingDefine} define
|
|
24
24
|
*/
|
|
25
25
|
function setEasing(name, define) {
|
|
26
|
-
|
|
26
|
+
easingDefines[name] = define;
|
|
27
27
|
}
|
|
28
28
|
function getEasing(name) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return easingDefines;
|
|
29
|
+
if (name) return easingDefines[name];
|
|
30
|
+
return easingDefines;
|
|
32
31
|
}
|
|
33
32
|
/**
|
|
34
33
|
* 缓冲函数化,用于 js 计算缓冲进度
|
|
@@ -36,18 +35,17 @@ function getEasing(name) {
|
|
|
36
35
|
* @returns {EasingFunction}
|
|
37
36
|
*/
|
|
38
37
|
function easingFunctional(name) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
let fn;
|
|
39
|
+
if (type.isArray(name)) {
|
|
40
|
+
fn = index.default(...name);
|
|
41
|
+
} else {
|
|
42
|
+
const define = easingDefines[name];
|
|
43
|
+
if (!define) {
|
|
44
|
+
throw new Error(`${name} 缓冲函数未定义`);
|
|
42
45
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
throw new Error(`${name} 缓冲函数未定义`);
|
|
47
|
-
}
|
|
48
|
-
fn = index.default(...define);
|
|
49
|
-
}
|
|
50
|
-
return (input) => fn(Math.max(0, Math.min(input, 1)));
|
|
46
|
+
fn = index.default(...define);
|
|
47
|
+
}
|
|
48
|
+
return input => fn(Math.max(0, Math.min(input, 1)));
|
|
51
49
|
}
|
|
52
50
|
/**
|
|
53
51
|
* 缓冲字符化,用于 css 设置缓冲属性
|
|
@@ -55,18 +53,17 @@ function easingFunctional(name) {
|
|
|
55
53
|
* @returns {string}
|
|
56
54
|
*/
|
|
57
55
|
function easingStringify(name) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
throw new Error(`${name} 缓冲函数未定义`);
|
|
66
|
-
}
|
|
67
|
-
bezierDefine = define;
|
|
56
|
+
let bezierDefine;
|
|
57
|
+
if (type.isArray(name)) {
|
|
58
|
+
bezierDefine = name;
|
|
59
|
+
} else {
|
|
60
|
+
const define = easingDefines[name];
|
|
61
|
+
if (!define) {
|
|
62
|
+
throw new Error(`${name} 缓冲函数未定义`);
|
|
68
63
|
}
|
|
69
|
-
|
|
64
|
+
bezierDefine = define;
|
|
65
|
+
}
|
|
66
|
+
return `cubic-bezier(${bezierDefine.join(',')})`;
|
|
70
67
|
}
|
|
71
68
|
|
|
72
69
|
exports.easingFunctional = easingFunctional;
|