@visactor/vutils-extension 1.11.2-alpha.5 → 1.11.2
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/cjs/index.d.ts +0 -2
- package/cjs/index.js +1 -2
- package/cjs/index.js.map +1 -1
- package/cjs/spec/clone-deep.js +2 -2
- package/cjs/spec/clone-deep.js.map +1 -1
- package/cjs/spec/index.d.ts +0 -1
- package/cjs/spec/index.js +1 -2
- package/cjs/spec/index.js.map +1 -1
- package/cjs/utils/index.d.ts +0 -2
- package/cjs/utils/index.js +1 -2
- package/cjs/utils/index.js.map +1 -1
- package/es/index.d.ts +0 -2
- package/es/index.js +0 -4
- package/es/index.js.map +1 -1
- package/es/spec/clone-deep.js +2 -2
- package/es/spec/clone-deep.js.map +1 -1
- package/es/spec/index.d.ts +0 -1
- package/es/spec/index.js +0 -2
- package/es/spec/index.js.map +1 -1
- package/es/utils/index.d.ts +0 -2
- package/es/utils/index.js +0 -4
- package/es/utils/index.js.map +1 -1
- package/package.json +5 -12
- package/cjs/algorithm/binary-search.d.ts +0 -2
- package/cjs/algorithm/binary-search.js +0 -21
- package/cjs/algorithm/binary-search.js.map +0 -1
- package/cjs/algorithm/index.d.ts +0 -1
- package/cjs/algorithm/index.js +0 -21
- package/cjs/algorithm/index.js.map +0 -1
- package/cjs/spec/common.d.ts +0 -3
- package/cjs/spec/common.js +0 -23
- package/cjs/spec/common.js.map +0 -1
- package/cjs/transform/tick-data/config.d.ts +0 -1
- package/cjs/transform/tick-data/config.js +0 -6
- package/cjs/transform/tick-data/config.js.map +0 -1
- package/cjs/transform/tick-data/continuous.d.ts +0 -3
- package/cjs/transform/tick-data/continuous.js +0 -57
- package/cjs/transform/tick-data/continuous.js.map +0 -1
- package/cjs/transform/tick-data/discrete/linear.d.ts +0 -6
- package/cjs/transform/tick-data/discrete/linear.js +0 -100
- package/cjs/transform/tick-data/discrete/linear.js.map +0 -1
- package/cjs/transform/tick-data/discrete/polar-angle.d.ts +0 -3
- package/cjs/transform/tick-data/discrete/polar-angle.js +0 -53
- package/cjs/transform/tick-data/discrete/polar-angle.js.map +0 -1
- package/cjs/transform/tick-data/index.d.ts +0 -6
- package/cjs/transform/tick-data/index.js +0 -41
- package/cjs/transform/tick-data/index.js.map +0 -1
- package/cjs/transform/tick-data/interface.d.ts +0 -38
- package/cjs/transform/tick-data/interface.js +0 -6
- package/cjs/transform/tick-data/interface.js.map +0 -1
- package/cjs/transform/tick-data/util.d.ts +0 -17
- package/cjs/transform/tick-data/util.js +0 -91
- package/cjs/transform/tick-data/util.js.map +0 -1
- package/cjs/transform/tick-data/utils/polar-label-position.d.ts +0 -8
- package/cjs/transform/tick-data/utils/polar-label-position.js +0 -20
- package/cjs/transform/tick-data/utils/polar-label-position.js.map +0 -1
- package/cjs/utils/polar.d.ts +0 -5
- package/cjs/utils/polar.js +0 -23
- package/cjs/utils/polar.js.map +0 -1
- package/cjs/utils/text.d.ts +0 -4
- package/cjs/utils/text.js +0 -17
- package/cjs/utils/text.js.map +0 -1
- package/es/algorithm/binary-search.d.ts +0 -2
- package/es/algorithm/binary-search.js +0 -11
- package/es/algorithm/binary-search.js.map +0 -1
- package/es/algorithm/index.d.ts +0 -1
- package/es/algorithm/index.js +0 -2
- package/es/algorithm/index.js.map +0 -1
- package/es/spec/common.d.ts +0 -3
- package/es/spec/common.js +0 -15
- package/es/spec/common.js.map +0 -1
- package/es/transform/tick-data/config.d.ts +0 -1
- package/es/transform/tick-data/config.js +0 -2
- package/es/transform/tick-data/config.js.map +0 -1
- package/es/transform/tick-data/continuous.d.ts +0 -3
- package/es/transform/tick-data/continuous.js +0 -56
- package/es/transform/tick-data/continuous.js.map +0 -1
- package/es/transform/tick-data/discrete/linear.d.ts +0 -6
- package/es/transform/tick-data/discrete/linear.js +0 -91
- package/es/transform/tick-data/discrete/linear.js.map +0 -1
- package/es/transform/tick-data/discrete/polar-angle.d.ts +0 -3
- package/es/transform/tick-data/discrete/polar-angle.js +0 -45
- package/es/transform/tick-data/discrete/polar-angle.js.map +0 -1
- package/es/transform/tick-data/index.d.ts +0 -6
- package/es/transform/tick-data/index.js +0 -23
- package/es/transform/tick-data/index.js.map +0 -1
- package/es/transform/tick-data/interface.d.ts +0 -38
- package/es/transform/tick-data/interface.js +0 -2
- package/es/transform/tick-data/interface.js.map +0 -1
- package/es/transform/tick-data/util.d.ts +0 -17
- package/es/transform/tick-data/util.js +0 -80
- package/es/transform/tick-data/util.js.map +0 -1
- package/es/transform/tick-data/utils/polar-label-position.d.ts +0 -8
- package/es/transform/tick-data/utils/polar-label-position.js +0 -12
- package/es/transform/tick-data/utils/polar-label-position.js.map +0 -1
- package/es/utils/polar.d.ts +0 -5
- package/es/utils/polar.js +0 -16
- package/es/utils/polar.js.map +0 -1
- package/es/utils/text.d.ts +0 -4
- package/es/utils/text.js +0 -13
- package/es/utils/text.js.map +0 -1
package/cjs/index.d.ts
CHANGED
package/cjs/index.js
CHANGED
|
@@ -17,5 +17,4 @@ var __createBinding = this && this.__createBinding || (Object.create ? function(
|
|
|
17
17
|
|
|
18
18
|
Object.defineProperty(exports, "__esModule", {
|
|
19
19
|
value: !0
|
|
20
|
-
}), __exportStar(require("./
|
|
21
|
-
__exportStar(require("./algorithm"), exports), __exportStar(require("./spec"), exports);
|
|
20
|
+
}), __exportStar(require("./utils"), exports), __exportStar(require("./spec"), exports);
|
package/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,yCAAuB","file":"index.js","sourcesContent":["export * from './utils';\nexport * from './spec';\n"]}
|
package/cjs/spec/clone-deep.js
CHANGED
|
@@ -4,13 +4,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: !0
|
|
5
5
|
}), exports.cloneDeepSpec = void 0;
|
|
6
6
|
|
|
7
|
-
const vutils_1 = require("@visactor/vutils"),
|
|
7
|
+
const vutils_1 = require("@visactor/vutils"), vdataset_1 = require("@visactor/vdataset");
|
|
8
8
|
|
|
9
9
|
function cloneDeepSpec(spec, excludeKeys = [ "data" ]) {
|
|
10
10
|
const value = spec;
|
|
11
11
|
let result;
|
|
12
12
|
if (!(0, vutils_1.isValid)(value) || "object" != typeof value) return value;
|
|
13
|
-
if ((0,
|
|
13
|
+
if ((0, vdataset_1.isDataView)(value) || (0, vutils_1.isHTMLElement)(value)) return value;
|
|
14
14
|
const isArr = (0, vutils_1.isArray)(value), length = value.length;
|
|
15
15
|
result = isArr ? new Array(length) : "object" == typeof value ? {} : (0, vutils_1.isBoolean)(value) || (0,
|
|
16
16
|
vutils_1.isNumber)(value) || (0, vutils_1.isString)(value) ? value : (0, vutils_1.isDate)(value) ? new Date(+value) : void 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/spec/clone-deep.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"sources":["../src/spec/clone-deep.ts"],"names":[],"mappings":";;;AAAA,6CAA0G;AAC1G,iDAAgD;AAMhD,SAAgB,aAAa,CAAC,IAAS,EAAE,cAAwB,CAAC,MAAM,CAAC;IACvE,MAAM,KAAK,GAAG,IAAI,CAAC;IAEnB,IAAI,MAAM,CAAC;IACX,IAAI,CAAC,IAAA,gBAAO,EAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAChD,OAAO,KAAK,CAAC;KACd;IAGD,IAAI,IAAA,qBAAU,EAAC,KAAK,CAAC,IAAI,IAAA,sBAAa,EAAC,KAAK,CAAC,EAAE;QAC7C,OAAO,KAAK,CAAC;KACd;IAED,MAAM,KAAK,GAAG,IAAA,gBAAO,EAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAE5B,IAAI,KAAK,EAAE;QACT,MAAM,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;KAC5B;SAEI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAClC,MAAM,GAAG,EAAE,CAAC;KACb;SAEI,IAAI,IAAA,kBAAS,EAAC,KAAK,CAAC,IAAI,IAAA,iBAAQ,EAAC,KAAK,CAAC,IAAI,IAAA,iBAAQ,EAAC,KAAK,CAAC,EAAE;QAC/D,MAAM,GAAG,KAAK,CAAC;KAChB;SAAM,IAAI,IAAA,eAAM,EAAC,KAAK,CAAC,EAAE;QACxB,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;KAC3B;SAEI;QACH,MAAM,GAAG,SAAS,CAAC;KACpB;IAKD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAE7D,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IACf,IAAI,MAAM,EAAE;QACV,OAAO,EAAE,KAAK,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE;YACxC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE;gBACzC,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;aACxB;iBAAM;gBACL,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;aACpD;SACF;KACF;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AArDD,sCAqDC","file":"clone-deep.js","sourcesContent":["import { isArray, isBoolean, isDate, isNumber, isString, isValid, isHTMLElement } from '@visactor/vutils';\nimport { isDataView } from '@visactor/vdataset';\n\n/**\n * 深拷贝 spec,为避免循环引用,DataView 维持原有引用\n * @param spec 原spec\n */\nexport function cloneDeepSpec(spec: any, excludeKeys: string[] = ['data']) {\n const value = spec;\n\n let result;\n if (!isValid(value) || typeof value !== 'object') {\n return value;\n }\n\n // 判断是不是不能深拷贝的对象\n if (isDataView(value) || isHTMLElement(value)) {\n return value;\n }\n\n const isArr = isArray(value);\n const length = value.length;\n // 不考虑特殊数组的额外处理\n if (isArr) {\n result = new Array(length);\n }\n // 不考虑 buffer / arguments 类型的处理以及 prototype 的额外处理\n else if (typeof value === 'object') {\n result = {};\n }\n // 不建议使用作为 Boolean / Number / String 作为构造器\n else if (isBoolean(value) || isNumber(value) || isString(value)) {\n result = value;\n } else if (isDate(value)) {\n result = new Date(+value);\n }\n // 不考虑 ArrayBuffer / DataView / TypedArray / map / set / regexp / symbol 类型\n else {\n result = undefined;\n }\n\n // 不考虑 map / set / TypedArray 类型的赋值\n\n // 不考虑对象的 symbol 属性\n const props = isArr ? undefined : Object.keys(Object(value));\n\n let index = -1;\n if (result) {\n while (++index < (props || value).length) {\n const key = props ? props[index] : index;\n const subValue = value[key];\n if (excludeKeys?.includes(key.toString())) {\n result[key] = subValue;\n } else {\n result[key] = cloneDeepSpec(subValue, excludeKeys);\n }\n }\n }\n\n return result;\n}\n"]}
|
package/cjs/spec/index.d.ts
CHANGED
package/cjs/spec/index.js
CHANGED
|
@@ -17,6 +17,5 @@ var __createBinding = this && this.__createBinding || (Object.create ? function(
|
|
|
17
17
|
|
|
18
18
|
Object.defineProperty(exports, "__esModule", {
|
|
19
19
|
value: !0
|
|
20
|
-
}), __exportStar(require("./clone-deep"), exports), __exportStar(require("./
|
|
21
|
-
__exportStar(require("./merge-spec"), exports);
|
|
20
|
+
}), __exportStar(require("./clone-deep"), exports), __exportStar(require("./merge-spec"), exports);
|
|
22
21
|
//# sourceMappingURL=index.js.map
|
package/cjs/spec/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/spec/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B
|
|
1
|
+
{"version":3,"sources":["../src/spec/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,+CAA6B","file":"index.js","sourcesContent":["export * from './clone-deep';\nexport * from './merge-spec';\n"]}
|
package/cjs/utils/index.d.ts
CHANGED
package/cjs/utils/index.js
CHANGED
|
@@ -17,6 +17,5 @@ var __createBinding = this && this.__createBinding || (Object.create ? function(
|
|
|
17
17
|
|
|
18
18
|
Object.defineProperty(exports, "__esModule", {
|
|
19
19
|
value: !0
|
|
20
|
-
}), __exportStar(require("./object"), exports)
|
|
21
|
-
__exportStar(require("./text"), exports);
|
|
20
|
+
}), __exportStar(require("./object"), exports);
|
|
22
21
|
//# sourceMappingURL=index.js.map
|
package/cjs/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB
|
|
1
|
+
{"version":3,"sources":["../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB","file":"index.js","sourcesContent":["export * from './object';\n"]}
|
package/es/index.d.ts
CHANGED
package/es/index.js
CHANGED
package/es/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC","file":"index.js","sourcesContent":["export * from './utils';\nexport * from './spec';\n"]}
|
package/es/spec/clone-deep.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { isArray, isBoolean, isDate, isNumber, isString, isValid } from "@visactor/vutils";
|
|
1
|
+
import { isArray, isBoolean, isDate, isNumber, isString, isValid, isHTMLElement } from "@visactor/vutils";
|
|
2
2
|
|
|
3
|
-
import { isDataView
|
|
3
|
+
import { isDataView } from "@visactor/vdataset";
|
|
4
4
|
|
|
5
5
|
export function cloneDeepSpec(spec, excludeKeys = [ "data" ]) {
|
|
6
6
|
const value = spec;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/spec/clone-deep.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/spec/clone-deep.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC1G,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAMhD,MAAM,UAAU,aAAa,CAAC,IAAS,EAAE,cAAwB,CAAC,MAAM,CAAC;IACvE,MAAM,KAAK,GAAG,IAAI,CAAC;IAEnB,IAAI,MAAM,CAAC;IACX,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAChD,OAAO,KAAK,CAAC;KACd;IAGD,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE;QAC7C,OAAO,KAAK,CAAC;KACd;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAE5B,IAAI,KAAK,EAAE;QACT,MAAM,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;KAC5B;SAEI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAClC,MAAM,GAAG,EAAE,CAAC;KACb;SAEI,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;QAC/D,MAAM,GAAG,KAAK,CAAC;KAChB;SAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;QACxB,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;KAC3B;SAEI;QACH,MAAM,GAAG,SAAS,CAAC;KACpB;IAKD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAE7D,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IACf,IAAI,MAAM,EAAE;QACV,OAAO,EAAE,KAAK,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE;YACxC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE;gBACzC,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;aACxB;iBAAM;gBACL,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;aACpD;SACF;KACF;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","file":"clone-deep.js","sourcesContent":["import { isArray, isBoolean, isDate, isNumber, isString, isValid, isHTMLElement } from '@visactor/vutils';\nimport { isDataView } from '@visactor/vdataset';\n\n/**\n * 深拷贝 spec,为避免循环引用,DataView 维持原有引用\n * @param spec 原spec\n */\nexport function cloneDeepSpec(spec: any, excludeKeys: string[] = ['data']) {\n const value = spec;\n\n let result;\n if (!isValid(value) || typeof value !== 'object') {\n return value;\n }\n\n // 判断是不是不能深拷贝的对象\n if (isDataView(value) || isHTMLElement(value)) {\n return value;\n }\n\n const isArr = isArray(value);\n const length = value.length;\n // 不考虑特殊数组的额外处理\n if (isArr) {\n result = new Array(length);\n }\n // 不考虑 buffer / arguments 类型的处理以及 prototype 的额外处理\n else if (typeof value === 'object') {\n result = {};\n }\n // 不建议使用作为 Boolean / Number / String 作为构造器\n else if (isBoolean(value) || isNumber(value) || isString(value)) {\n result = value;\n } else if (isDate(value)) {\n result = new Date(+value);\n }\n // 不考虑 ArrayBuffer / DataView / TypedArray / map / set / regexp / symbol 类型\n else {\n result = undefined;\n }\n\n // 不考虑 map / set / TypedArray 类型的赋值\n\n // 不考虑对象的 symbol 属性\n const props = isArr ? undefined : Object.keys(Object(value));\n\n let index = -1;\n if (result) {\n while (++index < (props || value).length) {\n const key = props ? props[index] : index;\n const subValue = value[key];\n if (excludeKeys?.includes(key.toString())) {\n result[key] = subValue;\n } else {\n result[key] = cloneDeepSpec(subValue, excludeKeys);\n }\n }\n }\n\n return result;\n}\n"]}
|
package/es/spec/index.d.ts
CHANGED
package/es/spec/index.js
CHANGED
package/es/spec/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/spec/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,
|
|
1
|
+
{"version":3,"sources":["../src/spec/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC","file":"index.js","sourcesContent":["export * from './clone-deep';\nexport * from './merge-spec';\n"]}
|
package/es/utils/index.d.ts
CHANGED
package/es/utils/index.js
CHANGED
package/es/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC
|
|
1
|
+
{"version":3,"sources":["../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC","file":"index.js","sourcesContent":["export * from './object';\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@visactor/vutils-extension",
|
|
3
|
-
"version": "1.11.2
|
|
3
|
+
"version": "1.11.2",
|
|
4
4
|
"description": "The extension module for VUtil from VisActor",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "cjs/index.js",
|
|
@@ -11,18 +11,11 @@
|
|
|
11
11
|
"es",
|
|
12
12
|
"dist"
|
|
13
13
|
],
|
|
14
|
-
"peerDependencies": {
|
|
15
|
-
"@visactor/vrender-core": ">=0.18",
|
|
16
|
-
"@visactor/vrender-components": ">=0.18"
|
|
17
|
-
},
|
|
18
14
|
"dependencies": {
|
|
19
|
-
"@visactor/vutils": "~0.18.
|
|
20
|
-
"@visactor/vdataset": "~0.18.
|
|
21
|
-
"@visactor/vscale": "~0.18.6"
|
|
15
|
+
"@visactor/vutils": "~0.18.9",
|
|
16
|
+
"@visactor/vdataset": "~0.18.9"
|
|
22
17
|
},
|
|
23
18
|
"devDependencies": {
|
|
24
|
-
"@visactor/vrender-core": "0.19.4",
|
|
25
|
-
"@visactor/vrender-components": "0.19.4",
|
|
26
19
|
"@rushstack/eslint-patch": "~1.1.4",
|
|
27
20
|
"eslint": "~8.18.0",
|
|
28
21
|
"vite": "3.2.6",
|
|
@@ -43,8 +36,8 @@
|
|
|
43
36
|
"tslib": "2.3.1",
|
|
44
37
|
"tslint": "5.12.1",
|
|
45
38
|
"@internal/bundler": "0.0.1",
|
|
46
|
-
"@internal/
|
|
47
|
-
"@internal/
|
|
39
|
+
"@internal/eslint-config": "0.0.1",
|
|
40
|
+
"@internal/ts-config": "0.0.1"
|
|
48
41
|
},
|
|
49
42
|
"publishConfig": {
|
|
50
43
|
"access": "public"
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: !0
|
|
5
|
-
}), exports.binaryFuzzySearchInNumberRange = exports.binaryFuzzySearch = void 0;
|
|
6
|
-
|
|
7
|
-
const binaryFuzzySearch = (arr, compareFn) => (0, exports.binaryFuzzySearchInNumberRange)(0, arr.length, (value => compareFn(arr[value])));
|
|
8
|
-
|
|
9
|
-
exports.binaryFuzzySearch = binaryFuzzySearch;
|
|
10
|
-
|
|
11
|
-
const binaryFuzzySearchInNumberRange = (x1, x2, compareFn) => {
|
|
12
|
-
let left = x1, right = x2;
|
|
13
|
-
for (;left < right; ) {
|
|
14
|
-
const mid = Math.floor((left + right) / 2);
|
|
15
|
-
compareFn(mid) >= 0 ? right = mid : left = mid + 1;
|
|
16
|
-
}
|
|
17
|
-
return left;
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
exports.binaryFuzzySearchInNumberRange = binaryFuzzySearchInNumberRange;
|
|
21
|
-
//# sourceMappingURL=binary-search.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/algorithm/binary-search.ts"],"names":[],"mappings":";;;AAKO,MAAM,iBAAiB,GAAG,CAAI,GAAQ,EAAE,SAA+B,EAAE,EAAE;IAChF,OAAO,IAAA,sCAA8B,EAAC,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACvF,CAAC,CAAC;AAFW,QAAA,iBAAiB,qBAE5B;AAQK,MAAM,8BAA8B,GAAG,CAAC,EAAU,EAAE,EAAU,EAAE,SAAoC,EAAE,EAAE;IAC7G,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,OAAO,IAAI,GAAG,KAAK,EAAE;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACvB,KAAK,GAAG,GAAG,CAAC;SACb;aAAM;YACL,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;SAChB;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAZW,QAAA,8BAA8B,kCAYzC","file":"binary-search.js","sourcesContent":["/**\n * 二分靠近框架,返回数组中第一个大于等于目标值的数的索引\n * @param arr 数组\n * @param compareFn 比较函数,返回(当前值-目标值)\n */\nexport const binaryFuzzySearch = <T>(arr: T[], compareFn: (value: T) => number) => {\n return binaryFuzzySearchInNumberRange(0, arr.length, value => compareFn(arr[value]));\n};\n\n/**\n * 二分靠近框架,返回数字区间中第一个大于等于目标值的数字\n * @param x1 区间上界\n * @param x2 区间下界(不包含)\n * @param compareFn 比较函数,返回(当前值-目标值)\n */\nexport const binaryFuzzySearchInNumberRange = (x1: number, x2: number, compareFn: (value: number) => number) => {\n let left = x1;\n let right = x2;\n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n if (compareFn(mid) >= 0) {\n right = mid; // 第一个大于等于目标值的数\n } else {\n left = mid + 1;\n }\n }\n return left;\n};\n"]}
|
package/cjs/algorithm/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './binary-search';
|
package/cjs/algorithm/index.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var __createBinding = this && this.__createBinding || (Object.create ? function(o, m, k, k2) {
|
|
4
|
-
void 0 === k2 && (k2 = k);
|
|
5
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
-
desc && !("get" in desc ? !m.__esModule : desc.writable || desc.configurable) || (desc = {
|
|
7
|
-
enumerable: !0,
|
|
8
|
-
get: function() {
|
|
9
|
-
return m[k];
|
|
10
|
-
}
|
|
11
|
-
}), Object.defineProperty(o, k2, desc);
|
|
12
|
-
} : function(o, m, k, k2) {
|
|
13
|
-
void 0 === k2 && (k2 = k), o[k2] = m[k];
|
|
14
|
-
}), __exportStar = this && this.__exportStar || function(m, exports) {
|
|
15
|
-
for (var p in m) "default" === p || Object.prototype.hasOwnProperty.call(exports, p) || __createBinding(exports, m, p);
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
Object.defineProperty(exports, "__esModule", {
|
|
19
|
-
value: !0
|
|
20
|
-
}), __exportStar(require("./binary-search"), exports);
|
|
21
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/algorithm/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC","file":"index.js","sourcesContent":["export * from './binary-search';\n"]}
|
package/cjs/spec/common.d.ts
DELETED
package/cjs/spec/common.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: !0
|
|
5
|
-
}), exports.isHTMLElement = exports.isDataView = void 0;
|
|
6
|
-
|
|
7
|
-
const vdataset_1 = require("@visactor/vdataset");
|
|
8
|
-
|
|
9
|
-
function isDataView(obj) {
|
|
10
|
-
return obj instanceof vdataset_1.DataView;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
function isHTMLElement(obj) {
|
|
14
|
-
try {
|
|
15
|
-
return obj instanceof Element;
|
|
16
|
-
} catch (_a) {
|
|
17
|
-
const htmlElementKeys = [ "children", "innerHTML", "classList", "setAttribute", "tagName", "getBoundingClientRect" ], keys = Object.keys(obj);
|
|
18
|
-
return htmlElementKeys.every((key => keys.includes(key)));
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
exports.isDataView = isDataView, exports.isHTMLElement = isHTMLElement;
|
|
23
|
-
//# sourceMappingURL=common.js.map
|
package/cjs/spec/common.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/spec/common.ts"],"names":[],"mappings":";;;AAAA,iDAA8C;AAE9C,SAAgB,UAAU,CAAC,GAAQ;IACjC,OAAO,GAAG,YAAY,mBAAQ,CAAC;AACjC,CAAC;AAFD,gCAEC;AAED,SAAgB,aAAa,CAAC,GAAQ;IACpC,IAAI;QACF,OAAO,GAAG,YAAY,OAAO,CAAC;KAC/B;IAAC,WAAM;QAEN,MAAM,eAAe,GAAsB;YACzC,UAAU;YACV,WAAW;YACX,WAAW;YACX,cAAc;YACd,SAAS;YACT,uBAAuB;SACxB,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;KACzD;AACH,CAAC;AAhBD,sCAgBC","file":"common.js","sourcesContent":["import { DataView } from '@visactor/vdataset';\n\nexport function isDataView(obj: any): obj is DataView {\n return obj instanceof DataView;\n}\n\nexport function isHTMLElement(obj: any): obj is Element {\n try {\n return obj instanceof Element;\n } catch {\n // 跨端 plan B\n const htmlElementKeys: (keyof Element)[] = [\n 'children',\n 'innerHTML',\n 'classList',\n 'setAttribute',\n 'tagName',\n 'getBoundingClientRect'\n ];\n const keys = Object.keys(obj);\n return htmlElementKeys.every(key => keys.includes(key));\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const DEFAULT_CONTINUOUS_TICK_COUNT = 5;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transform/tick-data/config.ts"],"names":[],"mappings":";;;AACa,QAAA,6BAA6B,GAAG,CAAC,CAAC","file":"config.js","sourcesContent":["/** 连续轴默认 tick 数量 */\nexport const DEFAULT_CONTINUOUS_TICK_COUNT = 5;\n"]}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: !0
|
|
5
|
-
}), exports.continuousTicks = void 0;
|
|
6
|
-
|
|
7
|
-
const vscale_1 = require("@visactor/vscale"), vutils_1 = require("@visactor/vutils"), config_1 = require("./config"), util_1 = require("./util"), continuousTicks = (scale, op) => {
|
|
8
|
-
if (!(0, vscale_1.isContinuous)(scale.type)) return (0, util_1.convertDomainToTickData)(scale.domain());
|
|
9
|
-
const range = scale.range(), rangeSize = Math.abs(range[range.length - 1] - range[0]);
|
|
10
|
-
if (rangeSize < 2) return (0, util_1.convertDomainToTickData)([ scale.domain()[0] ]);
|
|
11
|
-
const {tickCount: tickCount, forceTickCount: forceTickCount, tickStep: tickStep, noDecimals: noDecimals = !1, labelStyle: labelStyle} = op;
|
|
12
|
-
let scaleTicks;
|
|
13
|
-
if ((0, vutils_1.isValid)(tickStep)) scaleTicks = scale.stepTicks(tickStep); else if ((0,
|
|
14
|
-
vutils_1.isValid)(forceTickCount)) scaleTicks = scale.forceTicks(forceTickCount); else if ("d3" === op.tickMode) {
|
|
15
|
-
const count = (0, vutils_1.isFunction)(tickCount) ? tickCount({
|
|
16
|
-
axisLength: rangeSize,
|
|
17
|
-
labelStyle: labelStyle
|
|
18
|
-
}) : tickCount;
|
|
19
|
-
scaleTicks = scale.d3Ticks(null != count ? count : config_1.DEFAULT_CONTINUOUS_TICK_COUNT, {
|
|
20
|
-
noDecimals: noDecimals
|
|
21
|
-
});
|
|
22
|
-
} else {
|
|
23
|
-
const count = (0, vutils_1.isFunction)(tickCount) ? tickCount({
|
|
24
|
-
axisLength: rangeSize,
|
|
25
|
-
labelStyle: labelStyle
|
|
26
|
-
}) : tickCount;
|
|
27
|
-
scaleTicks = scale.ticks(null != count ? count : config_1.DEFAULT_CONTINUOUS_TICK_COUNT, {
|
|
28
|
-
noDecimals: noDecimals
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
if (op.sampling && ("cartesian" === op.coordinateType || "polar" === op.coordinateType && "radius" === op.axisOrientType)) {
|
|
32
|
-
const {labelGap: labelGap = 4, labelFlush: labelFlush} = op;
|
|
33
|
-
let items = (0, util_1.getCartesianLabelBounds)(scale, scaleTicks, op).map(((bounds, i) => ({
|
|
34
|
-
AABBBounds: bounds,
|
|
35
|
-
value: scaleTicks[i]
|
|
36
|
-
})));
|
|
37
|
-
for (;items.length >= 3 && (0, util_1.hasOverlap)(items, labelGap); ) items = methods.parity(items);
|
|
38
|
-
const ticks = items.map((item => item.value));
|
|
39
|
-
ticks.length < 3 && labelFlush && (ticks.length > 1 && ticks.pop(), (0, vutils_1.last)(ticks) !== (0,
|
|
40
|
-
vutils_1.last)(scaleTicks) && ticks.push((0, vutils_1.last)(scaleTicks))), scaleTicks = ticks;
|
|
41
|
-
}
|
|
42
|
-
return (0, util_1.convertDomainToTickData)(scaleTicks);
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
exports.continuousTicks = continuousTicks;
|
|
46
|
-
|
|
47
|
-
const methods = {
|
|
48
|
-
parity: function(items) {
|
|
49
|
-
return items.filter(((item, i) => i % 2 == 0));
|
|
50
|
-
},
|
|
51
|
-
greedy: function(items, sep) {
|
|
52
|
-
let a;
|
|
53
|
-
return items.filter(((b, i) => (!i || !(0, util_1.intersect)(a.AABBBounds, b.AABBBounds, sep)) && (a = b,
|
|
54
|
-
!0)));
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
//# sourceMappingURL=continuous.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transform/tick-data/continuous.ts"],"names":[],"mappings":"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","file":"continuous.js","sourcesContent":["import type { LinearScale, ContinuousScale } from '@visactor/vscale';\n// eslint-disable-next-line no-duplicate-imports\nimport { isContinuous } from '@visactor/vscale';\nimport { isFunction, isValid, last } from '@visactor/vutils';\nimport { DEFAULT_CONTINUOUS_TICK_COUNT } from './config';\nimport type { ICartesianTickDataOpt, ITickData, ITickDataOpt } from './interface';\nimport type { ILabelItem } from './util';\n// eslint-disable-next-line no-duplicate-imports\nimport { convertDomainToTickData, getCartesianLabelBounds, hasOverlap, intersect } from './util';\n\n/**\n * 对于连续轴:\n * - 如果spec配了tickCount、forceTickCount、tickStep,则直接输出LinearScale的ticks()、forceTicks()、stepTicks()结果;\n * - 默认输出tickCount为10的ticks()结果。\n *\n * @param scale\n * @param op\n * @returns\n */\nexport const continuousTicks = (scale: ContinuousScale, op: ITickDataOpt): ITickData[] => {\n if (!isContinuous(scale.type)) {\n return convertDomainToTickData(scale.domain());\n }\n // if range is so small\n const range = scale.range();\n const rangeSize = Math.abs(range[range.length - 1] - range[0]);\n if (rangeSize < 2) {\n return convertDomainToTickData([scale.domain()[0]]);\n }\n\n const { tickCount, forceTickCount, tickStep, noDecimals = false, labelStyle } = op;\n\n let scaleTicks: number[];\n if (isValid(tickStep)) {\n scaleTicks = (scale as LinearScale).stepTicks(tickStep);\n } else if (isValid(forceTickCount)) {\n scaleTicks = (scale as LinearScale).forceTicks(forceTickCount);\n } else if (op.tickMode === 'd3') {\n const count = isFunction(tickCount) ? tickCount({ axisLength: rangeSize, labelStyle }) : tickCount;\n scaleTicks = (scale as LinearScale).d3Ticks(count ?? DEFAULT_CONTINUOUS_TICK_COUNT, { noDecimals });\n } else {\n const count = isFunction(tickCount) ? tickCount({ axisLength: rangeSize, labelStyle }) : tickCount;\n scaleTicks = (scale as LinearScale).ticks(count ?? DEFAULT_CONTINUOUS_TICK_COUNT, { noDecimals });\n }\n\n if (op.sampling) {\n // 判断重叠\n if (op.coordinateType === 'cartesian' || (op.coordinateType === 'polar' && op.axisOrientType === 'radius')) {\n const { labelGap = 4, labelFlush } = op as ICartesianTickDataOpt;\n let items = getCartesianLabelBounds(scale, scaleTicks, op as ICartesianTickDataOpt).map(\n (bounds, i) =>\n ({\n AABBBounds: bounds,\n value: scaleTicks[i]\n } as ILabelItem<number>)\n );\n while (items.length >= 3 && hasOverlap(items, labelGap)) {\n items = methods.parity(items);\n }\n const ticks = items.map(item => item.value);\n\n if (ticks.length < 3 && labelFlush) {\n if (ticks.length > 1) {\n ticks.pop();\n }\n if (last(ticks) !== last(scaleTicks)) {\n ticks.push(last(scaleTicks));\n }\n }\n\n scaleTicks = ticks;\n }\n }\n\n return convertDomainToTickData(scaleTicks);\n};\n\nconst methods = {\n parity: function <T>(items: ILabelItem<T>[]) {\n return items.filter((item, i) => i % 2 === 0);\n },\n greedy: function <T>(items: ILabelItem<T>[], sep: number) {\n let a: ILabelItem<T>;\n return items.filter((b, i) => {\n if (!i || !intersect(a.AABBBounds, b.AABBBounds, sep)) {\n a = b;\n return true;\n }\n return false;\n });\n }\n};\n"]}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { BandScale } from '@visactor/vscale';
|
|
2
|
-
import type { ICartesianTickDataOpt, ITickData } from '../interface';
|
|
3
|
-
type OneDimensionalBounds = [number, number, number];
|
|
4
|
-
export declare const boundsDistance: (prevBounds: OneDimensionalBounds, nextBounds: OneDimensionalBounds) => number;
|
|
5
|
-
export declare const linearDiscreteTicks: (scale: BandScale, op: ICartesianTickDataOpt) => ITickData[];
|
|
6
|
-
export {};
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: !0
|
|
5
|
-
}), exports.linearDiscreteTicks = exports.boundsDistance = void 0;
|
|
6
|
-
|
|
7
|
-
const vutils_1 = require("@visactor/vutils"), util_1 = require("../util"), algorithm_1 = require("../../../algorithm"), getOneDimensionalLabelBounds = (scale, domain, op, isHorizontal) => (0,
|
|
8
|
-
util_1.getCartesianLabelBounds)(scale, domain, op).map((bounds => isHorizontal ? [ bounds.x1, bounds.x2, bounds.width() ] : [ bounds.y1, bounds.y2, bounds.height() ])), boundsOverlap = (prevBounds, nextBounds, gap = 0) => Math.max(prevBounds[0], nextBounds[0]) - gap / 2 <= Math.min(prevBounds[1], nextBounds[1]) + gap / 2, boundsDistance = (prevBounds, nextBounds) => prevBounds[1] < nextBounds[0] ? nextBounds[0] - prevBounds[1] : nextBounds[1] < prevBounds[0] ? prevBounds[0] - nextBounds[1] : 0;
|
|
9
|
-
|
|
10
|
-
exports.boundsDistance = boundsDistance;
|
|
11
|
-
|
|
12
|
-
const linearDiscreteTicks = (scale, op) => {
|
|
13
|
-
var _a;
|
|
14
|
-
const domain = scale.domain();
|
|
15
|
-
if (!domain.length) return [];
|
|
16
|
-
const {tickCount: tickCount, forceTickCount: forceTickCount, tickStep: tickStep, labelGap: labelGap = 4, axisOrientType: axisOrientType, labelStyle: labelStyle} = op, isHorizontal = (0,
|
|
17
|
-
util_1.isAxisHorizontal)(axisOrientType), range = scale.range(), rangeSize = scale.calculateWholeRangeSize();
|
|
18
|
-
if (rangeSize < 2) return op.labelLastVisible ? (0, util_1.convertDomainToTickData)([ domain[domain.length - 1] ]) : (0,
|
|
19
|
-
util_1.convertDomainToTickData)([ domain[0] ]);
|
|
20
|
-
let scaleTicks;
|
|
21
|
-
if ((0, vutils_1.isValid)(tickStep)) scaleTicks = scale.stepTicks(tickStep); else if ((0,
|
|
22
|
-
vutils_1.isValid)(forceTickCount)) scaleTicks = scale.forceTicks(forceTickCount); else if ((0,
|
|
23
|
-
vutils_1.isValid)(tickCount)) {
|
|
24
|
-
const count = (0, vutils_1.isFunction)(tickCount) ? tickCount({
|
|
25
|
-
axisLength: rangeSize,
|
|
26
|
-
labelStyle: labelStyle
|
|
27
|
-
}) : tickCount;
|
|
28
|
-
scaleTicks = scale.ticks(count);
|
|
29
|
-
} else if (op.sampling) {
|
|
30
|
-
const fontSize = (null !== (_a = op.labelStyle.fontSize) && void 0 !== _a ? _a : 12) + 2, rangeStart = (0,
|
|
31
|
-
vutils_1.minInArray)(range), rangeEnd = (0, vutils_1.maxInArray)(range);
|
|
32
|
-
if (domain.length <= rangeSize / fontSize) {
|
|
33
|
-
const incrementUnit = (rangeEnd - rangeStart) / domain.length, labelBoundsList = getOneDimensionalLabelBounds(scale, domain, op, isHorizontal), minBoundsLength = Math.min(...labelBoundsList.map((bounds => bounds[2]))), stepResult = getStep(domain, labelBoundsList, labelGap, op.labelLastVisible, Math.floor(minBoundsLength / incrementUnit), !1);
|
|
34
|
-
scaleTicks = scale.stepTicks(stepResult.step), op.labelLastVisible && (stepResult.delCount && (scaleTicks = scaleTicks.slice(0, scaleTicks.length - stepResult.delCount)),
|
|
35
|
-
scaleTicks.push(domain[domain.length - 1]));
|
|
36
|
-
} else {
|
|
37
|
-
const tempDomain = [ domain[0], domain[Math.floor(domain.length / 2)], domain[domain.length - 1] ], tempList = getOneDimensionalLabelBounds(scale, tempDomain, op, isHorizontal);
|
|
38
|
-
let maxBounds = null;
|
|
39
|
-
tempList.forEach((current => {
|
|
40
|
-
maxBounds ? maxBounds[2] < current[2] && (maxBounds = current) : maxBounds = current;
|
|
41
|
-
}));
|
|
42
|
-
const step = rangeEnd - rangeStart - labelGap > 0 ? Math.ceil(domain.length * (labelGap + maxBounds[2]) / (rangeEnd - rangeStart - labelGap)) : domain.length - 1;
|
|
43
|
-
scaleTicks = scale.stepTicks(step), !op.labelLastVisible || scaleTicks.length && scaleTicks[scaleTicks.length - 1] === domain[domain.length - 1] || (scaleTicks.length && Math.abs(scale.scale(scaleTicks[scaleTicks.length - 1]) - scale.scale(domain[domain.length - 1])) < maxBounds[2] && (scaleTicks = scaleTicks.slice(0, -1)),
|
|
44
|
-
scaleTicks.push(domain[domain.length - 1]));
|
|
45
|
-
}
|
|
46
|
-
} else scaleTicks = scale.domain();
|
|
47
|
-
return (0, util_1.convertDomainToTickData)(scaleTicks);
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
exports.linearDiscreteTicks = linearDiscreteTicks;
|
|
51
|
-
|
|
52
|
-
const getStep = (domain, labelBoundsList, labelGap, labelLastVisible, defaultStep, areAllBoundsSame) => {
|
|
53
|
-
let resultDelCount = 0, resultStep = 0, resultTickCount = -1, minDiff = Number.MAX_VALUE;
|
|
54
|
-
const validateStep = step => {
|
|
55
|
-
let success = !0, ptr = 0;
|
|
56
|
-
do {
|
|
57
|
-
ptr + step < domain.length && boundsOverlap(labelBoundsList[ptr], labelBoundsList[ptr + step], labelGap) && (success = !1),
|
|
58
|
-
ptr += step;
|
|
59
|
-
} while (success && ptr < domain.length);
|
|
60
|
-
return success;
|
|
61
|
-
}, minValidStep = (0, algorithm_1.binaryFuzzySearchInNumberRange)(defaultStep, domain.length, (step => validateStep(step) ? 1 : -1));
|
|
62
|
-
let step = minValidStep;
|
|
63
|
-
do {
|
|
64
|
-
if (step > minValidStep && !areAllBoundsSame && !validateStep(step)) step++; else {
|
|
65
|
-
if (!labelLastVisible) {
|
|
66
|
-
resultStep = step;
|
|
67
|
-
break;
|
|
68
|
-
}
|
|
69
|
-
{
|
|
70
|
-
const lastIndex = domain.length - 1;
|
|
71
|
-
let ptr, delCount = 0;
|
|
72
|
-
ptr = domain.length % step > 0 ? domain.length - domain.length % step + step : domain.length;
|
|
73
|
-
do {
|
|
74
|
-
if (ptr -= step, ptr !== lastIndex && !boundsOverlap(labelBoundsList[ptr], labelBoundsList[lastIndex], labelGap)) break;
|
|
75
|
-
delCount++;
|
|
76
|
-
} while (ptr > 0);
|
|
77
|
-
if (ptr === lastIndex) {
|
|
78
|
-
resultStep = step, resultDelCount = delCount;
|
|
79
|
-
break;
|
|
80
|
-
}
|
|
81
|
-
{
|
|
82
|
-
const tickCount = Math.floor(domain.length / step) - delCount + 1;
|
|
83
|
-
if (tickCount < resultTickCount) break;
|
|
84
|
-
{
|
|
85
|
-
resultTickCount = tickCount;
|
|
86
|
-
const distance1 = (0, exports.boundsDistance)(labelBoundsList[ptr], labelBoundsList[lastIndex]), distance2 = ptr - step >= 0 ? (0,
|
|
87
|
-
exports.boundsDistance)(labelBoundsList[ptr - step], labelBoundsList[ptr]) : distance1, diff = Math.abs(distance1 - distance2);
|
|
88
|
-
if (diff < minDiff && (minDiff = diff, resultStep = step, resultDelCount = delCount),
|
|
89
|
-
distance1 <= distance2) break;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
step++;
|
|
94
|
-
}
|
|
95
|
-
} while (step <= domain.length);
|
|
96
|
-
return {
|
|
97
|
-
step: resultStep,
|
|
98
|
-
delCount: resultDelCount
|
|
99
|
-
};
|
|
100
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transform/tick-data/discrete/linear.ts"],"names":[],"mappings":"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","file":"linear.js","sourcesContent":["import type { BandScale, IBaseScale } from '@visactor/vscale';\nimport { isFunction, isValid, maxInArray, minInArray } from '@visactor/vutils';\nimport type { ICartesianTickDataOpt, ITickData } from '../interface';\nimport { convertDomainToTickData, getCartesianLabelBounds, isAxisHorizontal } from '../util';\nimport { binaryFuzzySearchInNumberRange } from '../../../algorithm';\n\n/** x1, x2, length */\ntype OneDimensionalBounds = [number, number, number];\n\nconst getOneDimensionalLabelBounds = (\n scale: IBaseScale,\n domain: any[],\n op: ICartesianTickDataOpt,\n isHorizontal: boolean\n): OneDimensionalBounds[] => {\n const labelBoundsList = getCartesianLabelBounds(scale, domain, op);\n return labelBoundsList.map(bounds => {\n if (isHorizontal) {\n return [bounds.x1, bounds.x2, bounds.width()];\n } else {\n return [bounds.y1, bounds.y2, bounds.height()];\n }\n });\n};\n\n/** 判断两个 bounds 是否有重叠情况 */\nconst boundsOverlap = (prevBounds: OneDimensionalBounds, nextBounds: OneDimensionalBounds, gap = 0): boolean => {\n return Math.max(prevBounds[0], nextBounds[0]) - gap / 2 <= Math.min(prevBounds[1], nextBounds[1]) + gap / 2;\n};\n\n/** 判断两个不相交的 bounds 相隔的距离 */\nexport const boundsDistance = (prevBounds: OneDimensionalBounds, nextBounds: OneDimensionalBounds): number => {\n if (prevBounds[1] < nextBounds[0]) {\n return nextBounds[0] - prevBounds[1];\n } else if (nextBounds[1] < prevBounds[0]) {\n return prevBounds[0] - nextBounds[1];\n }\n return 0;\n};\n\n/**\n * 对于离散轴:\n * - 如果spec配了tickCount、forceTickCount、tickStep,则直接输出BandScale的ticks()、forceTicks()、stepTicks()结果;\n * - 估算所有轴label的宽度(或高度,在竖轴的情况下)并存为数组domainLengthList;\n * - 通过循环来寻找最小的step,使:如果在这个step下采样,轴标签互不遮挡(此处用到domainLengthList和scale.range());\n * - 如果用户配置了spec.label.lastVisible,则处理右边界:强制采样最后一个tick数据,并删掉这个tick的label所覆盖的那些tick数据。\n *\n * @param scale\n * @param op\n * @returns\n */\nexport const linearDiscreteTicks = (scale: BandScale, op: ICartesianTickDataOpt): ITickData[] => {\n const domain = scale.domain();\n if (!domain.length) {\n return [];\n }\n const { tickCount, forceTickCount, tickStep, labelGap = 4, axisOrientType, labelStyle } = op;\n const isHorizontal = isAxisHorizontal(axisOrientType);\n const range = scale.range();\n\n // if range is so small\n const rangeSize = scale.calculateWholeRangeSize();\n if (rangeSize < 2) {\n if (op.labelLastVisible) {\n return convertDomainToTickData([domain[domain.length - 1]]);\n }\n return convertDomainToTickData([domain[0]]);\n }\n\n let scaleTicks;\n if (isValid(tickStep)) {\n scaleTicks = scale.stepTicks(tickStep);\n } else if (isValid(forceTickCount)) {\n scaleTicks = scale.forceTicks(forceTickCount);\n } else if (isValid(tickCount)) {\n const count = isFunction(tickCount) ? tickCount({ axisLength: rangeSize, labelStyle }) : tickCount;\n scaleTicks = scale.ticks(count);\n } else if (op.sampling) {\n const fontSize = (op.labelStyle.fontSize ?? 12) + 2;\n const rangeStart = minInArray(range);\n const rangeEnd = maxInArray(range);\n\n if (domain.length <= rangeSize / fontSize) {\n const incrementUnit = (rangeEnd - rangeStart) / domain.length;\n const labelBoundsList = getOneDimensionalLabelBounds(scale, domain, op, isHorizontal);\n const minBoundsLength = Math.min(...labelBoundsList.map(bounds => bounds[2]));\n\n const stepResult = getStep(\n domain,\n labelBoundsList,\n labelGap,\n op.labelLastVisible,\n Math.floor(minBoundsLength / incrementUnit), // 给step赋上合适的初值,有效改善外层循环次数\n false\n );\n\n scaleTicks = (scale as BandScale).stepTicks(stepResult.step);\n if (op.labelLastVisible) {\n if (stepResult.delCount) {\n scaleTicks = scaleTicks.slice(0, scaleTicks.length - stepResult.delCount);\n }\n scaleTicks.push(domain[domain.length - 1]);\n }\n } else {\n // only check first middle last, use the max size to sampling\n const tempDomain = [domain[0], domain[Math.floor(domain.length / 2)], domain[domain.length - 1]];\n const tempList = getOneDimensionalLabelBounds(scale, tempDomain, op, isHorizontal);\n let maxBounds: OneDimensionalBounds = null;\n tempList.forEach(current => {\n if (!maxBounds) {\n maxBounds = current;\n return;\n }\n if (maxBounds[2] < current[2]) {\n maxBounds = current;\n }\n });\n\n const step =\n rangeEnd - rangeStart - labelGap > 0\n ? Math.ceil((domain.length * (labelGap + maxBounds[2])) / (rangeEnd - rangeStart - labelGap))\n : domain.length - 1;\n\n scaleTicks = (scale as BandScale).stepTicks(step);\n\n if (\n op.labelLastVisible &&\n (!scaleTicks.length || scaleTicks[scaleTicks.length - 1] !== domain[domain.length - 1])\n ) {\n if (\n scaleTicks.length &&\n Math.abs(scale.scale(scaleTicks[scaleTicks.length - 1]) - scale.scale(domain[domain.length - 1])) <\n maxBounds[2]\n ) {\n scaleTicks = scaleTicks.slice(0, -1);\n }\n scaleTicks.push(domain[domain.length - 1]);\n }\n }\n } else {\n scaleTicks = scale.domain();\n }\n\n return convertDomainToTickData(scaleTicks);\n};\n\n/** 计算合适的step */\nconst getStep = (\n domain: any[],\n labelBoundsList: OneDimensionalBounds[],\n labelGap: number,\n labelLastVisible: boolean,\n defaultStep: number,\n areAllBoundsSame: boolean\n) => {\n let resultDelCount = 0;\n let resultStep = 0;\n let resultTickCount = -1;\n let minDiff = Number.MAX_VALUE;\n\n /** 验证在当前 step 下是否会产生重叠 */\n const validateStep = (step: number) => {\n let success = true;\n let ptr = 0;\n do {\n if (ptr + step < domain.length && boundsOverlap(labelBoundsList[ptr], labelBoundsList[ptr + step], labelGap)) {\n success = false;\n }\n ptr += step;\n } while (success && ptr < domain.length);\n return success;\n };\n\n // 通过二分来寻找最小的step,使:如果在这个step下采样,轴标签互不遮挡\n const minValidStep = binaryFuzzySearchInNumberRange(defaultStep, domain.length, step =>\n validateStep(step) ? 1 : -1\n );\n\n // 对 step 进行微调\n let step = minValidStep;\n do {\n if (step > minValidStep && !areAllBoundsSame) {\n if (!validateStep(step)) {\n step++;\n continue;\n }\n }\n if (labelLastVisible) {\n const lastIndex = domain.length - 1;\n let delCount = 0;\n let ptr;\n if (domain.length % step > 0) {\n ptr = domain.length - (domain.length % step) + step;\n } else {\n ptr = domain.length;\n }\n do {\n ptr -= step; // 获取最后一个label位置\n if (ptr === lastIndex || boundsOverlap(labelBoundsList[ptr], labelBoundsList[lastIndex], labelGap)) {\n delCount++;\n } else {\n break;\n }\n } while (ptr > 0);\n if (ptr === lastIndex) {\n // 采到的最后的一个 label 刚好是最后一项,直接退出\n resultStep = step;\n resultDelCount = delCount;\n break;\n } else {\n // 尝试获取最均匀的结果,防止倒数第二项和最后一项有大的空档\n const tickCount = Math.floor(domain.length / step) - delCount + 1;\n if (tickCount < resultTickCount) {\n break;\n } else {\n resultTickCount = tickCount;\n const distance1 = boundsDistance(labelBoundsList[ptr], labelBoundsList[lastIndex]); // 倒数第2项和最后一项的距离\n const distance2 =\n ptr - step >= 0 ? boundsDistance(labelBoundsList[ptr - step], labelBoundsList[ptr]) : distance1; // 倒数第3项和倒数第2项的距离\n const diff = Math.abs(distance1 - distance2);\n if (diff < minDiff) {\n minDiff = diff;\n resultStep = step; // 记录最均匀的 step\n resultDelCount = delCount;\n }\n if (distance1 <= distance2) {\n break;\n }\n }\n }\n } else {\n resultStep = step;\n break;\n }\n step++;\n } while (step <= domain.length);\n\n return {\n step: resultStep,\n delCount: resultDelCount\n };\n};\n"]}
|