@visactor/vutils-extension 0.0.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.
Files changed (74) hide show
  1. package/README.md +11 -0
  2. package/cjs/algorithm/binary-search.d.ts +2 -0
  3. package/cjs/algorithm/binary-search.js +21 -0
  4. package/cjs/algorithm/binary-search.js.map +1 -0
  5. package/cjs/algorithm/index.d.ts +1 -0
  6. package/cjs/algorithm/index.js +21 -0
  7. package/cjs/algorithm/index.js.map +1 -0
  8. package/cjs/index.d.ts +4 -0
  9. package/cjs/index.js +21 -0
  10. package/cjs/index.js.map +1 -0
  11. package/cjs/transform/tick-data/config.d.ts +1 -0
  12. package/cjs/transform/tick-data/config.js +6 -0
  13. package/cjs/transform/tick-data/config.js.map +1 -0
  14. package/cjs/transform/tick-data/continuous.d.ts +3 -0
  15. package/cjs/transform/tick-data/continuous.js +57 -0
  16. package/cjs/transform/tick-data/continuous.js.map +1 -0
  17. package/cjs/transform/tick-data/discrete/linear.d.ts +6 -0
  18. package/cjs/transform/tick-data/discrete/linear.js +106 -0
  19. package/cjs/transform/tick-data/discrete/linear.js.map +1 -0
  20. package/cjs/transform/tick-data/discrete/polar-angle.d.ts +3 -0
  21. package/cjs/transform/tick-data/discrete/polar-angle.js +52 -0
  22. package/cjs/transform/tick-data/discrete/polar-angle.js.map +1 -0
  23. package/cjs/transform/tick-data/index.d.ts +6 -0
  24. package/cjs/transform/tick-data/index.js +41 -0
  25. package/cjs/transform/tick-data/index.js.map +1 -0
  26. package/cjs/transform/tick-data/interface.d.ts +37 -0
  27. package/cjs/transform/tick-data/interface.js +6 -0
  28. package/cjs/transform/tick-data/interface.js.map +1 -0
  29. package/cjs/transform/tick-data/util.d.ts +17 -0
  30. package/cjs/transform/tick-data/util.js +88 -0
  31. package/cjs/transform/tick-data/util.js.map +1 -0
  32. package/cjs/utils/polar.d.ts +5 -0
  33. package/cjs/utils/polar.js +23 -0
  34. package/cjs/utils/polar.js.map +1 -0
  35. package/cjs/utils/text.d.ts +4 -0
  36. package/cjs/utils/text.js +17 -0
  37. package/cjs/utils/text.js.map +1 -0
  38. package/es/algorithm/binary-search.d.ts +2 -0
  39. package/es/algorithm/binary-search.js +11 -0
  40. package/es/algorithm/binary-search.js.map +1 -0
  41. package/es/algorithm/index.d.ts +1 -0
  42. package/es/algorithm/index.js +2 -0
  43. package/es/algorithm/index.js.map +1 -0
  44. package/es/index.d.ts +4 -0
  45. package/es/index.js +7 -0
  46. package/es/index.js.map +1 -0
  47. package/es/transform/tick-data/config.d.ts +1 -0
  48. package/es/transform/tick-data/config.js +2 -0
  49. package/es/transform/tick-data/config.js.map +1 -0
  50. package/es/transform/tick-data/continuous.d.ts +3 -0
  51. package/es/transform/tick-data/continuous.js +56 -0
  52. package/es/transform/tick-data/continuous.js.map +1 -0
  53. package/es/transform/tick-data/discrete/linear.d.ts +6 -0
  54. package/es/transform/tick-data/discrete/linear.js +98 -0
  55. package/es/transform/tick-data/discrete/linear.js.map +1 -0
  56. package/es/transform/tick-data/discrete/polar-angle.d.ts +3 -0
  57. package/es/transform/tick-data/discrete/polar-angle.js +45 -0
  58. package/es/transform/tick-data/discrete/polar-angle.js.map +1 -0
  59. package/es/transform/tick-data/index.d.ts +6 -0
  60. package/es/transform/tick-data/index.js +23 -0
  61. package/es/transform/tick-data/index.js.map +1 -0
  62. package/es/transform/tick-data/interface.d.ts +37 -0
  63. package/es/transform/tick-data/interface.js +2 -0
  64. package/es/transform/tick-data/interface.js.map +1 -0
  65. package/es/transform/tick-data/util.d.ts +17 -0
  66. package/es/transform/tick-data/util.js +75 -0
  67. package/es/transform/tick-data/util.js.map +1 -0
  68. package/es/utils/polar.d.ts +5 -0
  69. package/es/utils/polar.js +16 -0
  70. package/es/utils/polar.js.map +1 -0
  71. package/es/utils/text.d.ts +4 -0
  72. package/es/utils/text.js +13 -0
  73. package/es/utils/text.js.map +1 -0
  74. package/package.json +68 -0
@@ -0,0 +1,37 @@
1
+ import { ITextGraphicAttribute } from '@visactor/vrender';
2
+ export type CoordinateType = 'cartesian' | 'polar' | 'geo' | 'none';
3
+ export type IOrientType = 'left' | 'top' | 'right' | 'bottom' | 'z';
4
+ export type IPolarOrientType = 'radius' | 'angle';
5
+ export interface ITickDataOpt {
6
+ sampling?: boolean;
7
+ tickCount?: number | ((option: ITickCallbackOption) => number);
8
+ forceTickCount?: number;
9
+ tickStep?: number;
10
+ tickMode?: 'average' | 'd3' | string;
11
+ noDecimals?: boolean;
12
+ coordinateType: CoordinateType;
13
+ axisOrientType: IOrientType | IPolarOrientType;
14
+ startAngle?: number;
15
+ labelFormatter?: (value: any) => string;
16
+ labelStyle: ITextGraphicAttribute;
17
+ labelGap?: number;
18
+ }
19
+ export interface ICartesianTickDataOpt extends ITickDataOpt {
20
+ axisOrientType: IOrientType;
21
+ labelLastVisible: boolean;
22
+ labelFlush: boolean;
23
+ }
24
+ export interface IPolarTickDataOpt extends ITickDataOpt {
25
+ axisOrientType: IPolarOrientType;
26
+ getRadius: () => number;
27
+ labelOffset: number;
28
+ }
29
+ export interface ITickData {
30
+ index: number;
31
+ value: number | string;
32
+ }
33
+ type ITickCallbackOption = {
34
+ axisLength?: number;
35
+ labelStyle?: ITextGraphicAttribute;
36
+ };
37
+ export {};
@@ -0,0 +1,2 @@
1
+ export { };
2
+ //# sourceMappingURL=interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/transform/tick-data/interface.ts"],"names":[],"mappings":"","file":"interface.js","sourcesContent":["import { ITextGraphicAttribute } from '@visactor/vrender';\n\nexport type CoordinateType = 'cartesian' | 'polar' | 'geo' | 'none';\nexport type IOrientType = 'left' | 'top' | 'right' | 'bottom' | 'z';\nexport type IPolarOrientType = 'radius' | 'angle';\n\nexport interface ITickDataOpt {\n /**\n * 是否进行轴采样\n */\n sampling?: boolean;\n tickCount?: number | ((option: ITickCallbackOption) => number);\n forceTickCount?: number;\n tickStep?: number;\n tickMode?: 'average' | 'd3' | string;\n noDecimals?: boolean;\n\n coordinateType: CoordinateType;\n axisOrientType: IOrientType | IPolarOrientType;\n startAngle?: number;\n\n labelFormatter?: (value: any) => string;\n labelStyle: ITextGraphicAttribute;\n labelGap?: number;\n}\n\nexport interface ICartesianTickDataOpt extends ITickDataOpt {\n axisOrientType: IOrientType;\n labelLastVisible: boolean;\n labelFlush: boolean;\n}\n\nexport interface IPolarTickDataOpt extends ITickDataOpt {\n axisOrientType: IPolarOrientType;\n getRadius: () => number;\n labelOffset: number;\n}\n\nexport interface ITickData {\n index: number;\n value: number | string;\n // label: string;\n}\n\ntype ITickCallbackOption = {\n /**\n * 坐标轴占据的画布大小。\n * 直角坐标系中为轴的宽度或高度。\n * 极坐标系中半径轴的长度。\n */\n axisLength?: number;\n /**\n * 轴标签的样式\n */\n labelStyle?: ITextGraphicAttribute;\n};\n"]}
@@ -0,0 +1,17 @@
1
+ import type { IBaseScale } from '@visactor/vscale';
2
+ import type { IBoundsLike } from '@visactor/vutils';
3
+ import { AABBBounds } from '@visactor/vutils';
4
+ import type { IGraphic } from '@visactor/vrender';
5
+ import type { ICartesianTickDataOpt, IOrientType, IPolarTickDataOpt, ITickData } from './interface';
6
+ export declare const convertDomainToTickData: (domain: any[]) => ITickData[];
7
+ export declare const labelOverlap: (prevLabel: AABBBounds, nextLabel: AABBBounds, gap?: number) => boolean;
8
+ export declare const labelDistance: (prevLabel: AABBBounds, nextLabel: AABBBounds) => [number, number];
9
+ export declare function intersect(a: IBoundsLike, b: IBoundsLike, sep: number): boolean;
10
+ export interface ILabelItem<T> extends Pick<IGraphic, 'AABBBounds'> {
11
+ value?: T;
12
+ }
13
+ export declare function hasOverlap<T>(items: ILabelItem<T>[], pad: number): boolean;
14
+ export declare const MIN_TICK_GAP = 12;
15
+ export declare const getCartesianLabelBounds: (scale: IBaseScale, domain: any[], op: ICartesianTickDataOpt) => AABBBounds[];
16
+ export declare const getPolarAngleLabelBounds: (scale: IBaseScale, domain: any[], op: IPolarTickDataOpt) => AABBBounds[];
17
+ export declare const isAxisHorizontal: (axisOrientType: IOrientType) => boolean;
@@ -0,0 +1,75 @@
1
+ import { AABBBounds, degreeToRadian, polarToCartesian } from "@visactor/vutils";
2
+
3
+ import { initTextMeasure } from "../../utils/text";
4
+
5
+ import { angleLabelOrientAttribute } from "../../utils/polar";
6
+
7
+ export const convertDomainToTickData = domain => domain.map(((t, index) => ({
8
+ index: index,
9
+ value: t
10
+ })));
11
+
12
+ export const labelOverlap = (prevLabel, nextLabel, gap = 0) => {
13
+ const prevBounds = new AABBBounds(prevLabel).expand(gap / 2), nextBounds = new AABBBounds(nextLabel).expand(gap / 2);
14
+ return prevBounds.intersects(nextBounds);
15
+ };
16
+
17
+ export const labelDistance = (prevLabel, nextLabel) => {
18
+ let horizontal = 0;
19
+ prevLabel.x2 < nextLabel.x1 ? horizontal = nextLabel.x1 - prevLabel.x2 : nextLabel.x2 < prevLabel.x1 && (horizontal = prevLabel.x1 - nextLabel.x2);
20
+ let vertical = 0;
21
+ return prevLabel.y2 < nextLabel.y1 ? vertical = nextLabel.y1 - prevLabel.y2 : nextLabel.y2 < prevLabel.y1 && (vertical = prevLabel.y1 - nextLabel.y2),
22
+ [ horizontal, vertical ];
23
+ };
24
+
25
+ export function intersect(a, b, sep) {
26
+ return sep > Math.max(b.x1 - a.x2, a.x1 - b.x2, b.y1 - a.y2, a.y1 - b.y2);
27
+ }
28
+
29
+ export function hasOverlap(items, pad) {
30
+ for (let b, i = 1, n = items.length, a = items[0]; i < n; a = b, ++i) if (b = items[i],
31
+ intersect(a.AABBBounds, b.AABBBounds, pad)) return !0;
32
+ return !1;
33
+ }
34
+
35
+ export const MIN_TICK_GAP = 12;
36
+
37
+ export const getCartesianLabelBounds = (scale, domain, op) => {
38
+ var _a;
39
+ const {labelStyle: labelStyle, axisOrientType: axisOrientType, labelFlush: labelFlush, labelFormatter: labelFormatter, startAngle: startAngle = 0} = op;
40
+ let labelAngle = null !== (_a = labelStyle.angle) && void 0 !== _a ? _a : 0;
41
+ "vertical" === labelStyle.direction && (labelAngle += degreeToRadian(90));
42
+ const isHorizontal = [ "bottom", "top" ].includes(axisOrientType), isVertical = [ "left", "right" ].includes(axisOrientType);
43
+ let orientAngle = startAngle;
44
+ isHorizontal ? orientAngle = 0 : isVertical && (orientAngle = degreeToRadian(-90));
45
+ const textMeasure = initTextMeasure(labelStyle), labelBoundsList = domain.map(((v, i) => {
46
+ var _a, _b;
47
+ const str = labelFormatter ? labelFormatter(v) : `${v}`, {width: width, height: height} = textMeasure.quickMeasure(str), textWidth = Math.max(width, 12), textHeight = Math.max(height, 12), pos = scale.scale(v), scaleX = Math.cos(orientAngle) * pos, scaleY = -Math.sin(orientAngle) * pos;
48
+ let align, baseline, textX = scaleX, textY = scaleY;
49
+ align = labelFlush && isHorizontal && 0 === i ? "left" : labelFlush && isHorizontal && i === domain.length - 1 ? "right" : null !== (_a = labelStyle.textAlign) && void 0 !== _a ? _a : "center",
50
+ "right" === align ? textX -= textWidth : "center" === align && (textX -= textWidth / 2),
51
+ baseline = labelFlush && isVertical && 0 === i ? "top" : labelFlush && isVertical && i === domain.length - 1 ? "bottom" : null !== (_b = labelStyle.textBaseline) && void 0 !== _b ? _b : "middle",
52
+ "bottom" === baseline ? textY -= textHeight : "middle" === baseline && (textY -= textHeight / 2);
53
+ return (new AABBBounds).set(textX, textY, textX + textWidth, textY + textHeight).rotate(labelAngle, scaleX, scaleY);
54
+ }));
55
+ return labelBoundsList;
56
+ };
57
+
58
+ export const getPolarAngleLabelBounds = (scale, domain, op) => {
59
+ var _a;
60
+ const {labelStyle: labelStyle, getRadius: getRadius, labelOffset: labelOffset, labelFormatter: labelFormatter} = op, radius = null == getRadius ? void 0 : getRadius(), labelAngle = null !== (_a = labelStyle.angle) && void 0 !== _a ? _a : 0, textMeasure = initTextMeasure(labelStyle);
61
+ return domain.map((v => {
62
+ const str = labelFormatter ? labelFormatter(v) : `${v}`, {width: width, height: height} = textMeasure.quickMeasure(str), textWidth = Math.max(width, 12), textHeight = Math.max(height, 12), angle = scale.scale(v);
63
+ let textX = 0, textY = 0;
64
+ const orient = angleLabelOrientAttribute(angle), {x: x, y: y} = polarToCartesian({
65
+ x: 0,
66
+ y: 0
67
+ }, radius + labelOffset, angle);
68
+ textX = x + ("right" === orient.align ? -textWidth : "center" === orient.align ? -textWidth / 2 : 0),
69
+ textY = y + ("bottom" === orient.baseline ? -textHeight : "middle" === orient.baseline ? -textHeight / 2 : 0);
70
+ return (new AABBBounds).set(textX, textY, textX + textWidth, textY + textHeight).rotate(labelAngle, textX + textWidth / 2, textY + textHeight / 2);
71
+ }));
72
+ };
73
+
74
+ export const isAxisHorizontal = axisOrientType => [ "bottom", "top", "z" ].includes(axisOrientType);
75
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/transform/tick-data/util.ts"],"names":[],"mappings":"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","file":"util.js","sourcesContent":["import type { IBaseScale } from '@visactor/vscale';\nimport type { IBoundsLike } from '@visactor/vutils';\n// eslint-disable-next-line no-duplicate-imports\nimport { AABBBounds, degreeToRadian, polarToCartesian } from '@visactor/vutils';\nimport type { IGraphic, TextAlignType, TextBaselineType } from '@visactor/vrender';\nimport { initTextMeasure } from '../../utils/text';\nimport { angleLabelOrientAttribute } from '../../utils/polar';\nimport type { ICartesianTickDataOpt, IOrientType, IPolarTickDataOpt, ITickData } from './interface';\n\nexport const convertDomainToTickData = (domain: any[]): ITickData[] => {\n const ticks = domain.map((t: number, index: number) => {\n return {\n index,\n value: t\n };\n });\n return ticks;\n};\n\n/** 判断两个label是否有重叠情况 */\nexport const labelOverlap = (prevLabel: AABBBounds, nextLabel: AABBBounds, gap = 0): boolean => {\n const prevBounds = new AABBBounds(prevLabel).expand(gap / 2);\n const nextBounds = new AABBBounds(nextLabel).expand(gap / 2);\n return prevBounds.intersects(nextBounds);\n};\n\n/** 判断两个不相交的label相隔的距离 */\nexport const labelDistance = (prevLabel: AABBBounds, nextLabel: AABBBounds): [number, number] => {\n let horizontal = 0;\n if (prevLabel.x2 < nextLabel.x1) {\n horizontal = nextLabel.x1 - prevLabel.x2;\n } else if (nextLabel.x2 < prevLabel.x1) {\n horizontal = prevLabel.x1 - nextLabel.x2;\n }\n\n let vertical = 0;\n if (prevLabel.y2 < nextLabel.y1) {\n vertical = nextLabel.y1 - prevLabel.y2;\n } else if (nextLabel.y2 < prevLabel.y1) {\n vertical = prevLabel.y1 - nextLabel.y2;\n }\n\n return [horizontal, vertical];\n};\n\nexport function intersect(a: IBoundsLike, b: IBoundsLike, sep: number) {\n return sep > Math.max(b.x1 - a.x2, a.x1 - b.x2, b.y1 - a.y2, a.y1 - b.y2);\n}\n\nexport interface ILabelItem<T> extends Pick<IGraphic, 'AABBBounds'> {\n value?: T;\n}\n\nexport function hasOverlap<T>(items: ILabelItem<T>[], pad: number): boolean {\n for (let i = 1, n = items.length, a = items[0], b; i < n; a = b, ++i) {\n b = items[i];\n if (intersect(a.AABBBounds, b.AABBBounds, pad)) {\n return true;\n }\n }\n return false;\n}\n\nexport const MIN_TICK_GAP = 12;\n\nexport const getCartesianLabelBounds = (scale: IBaseScale, domain: any[], op: ICartesianTickDataOpt): AABBBounds[] => {\n const { labelStyle, axisOrientType, labelFlush, labelFormatter, startAngle = 0 } = op;\n let labelAngle = labelStyle.angle ?? 0;\n if (labelStyle.direction === 'vertical') {\n labelAngle += degreeToRadian(90);\n }\n const isHorizontal = ['bottom', 'top'].includes(axisOrientType);\n const isVertical = ['left', 'right'].includes(axisOrientType);\n let orientAngle = startAngle;\n if (isHorizontal) {\n orientAngle = 0;\n } else if (isVertical) {\n orientAngle = degreeToRadian(-90);\n }\n\n const textMeasure = initTextMeasure(labelStyle);\n const labelBoundsList = domain.map((v: any, i: number) => {\n const str = labelFormatter ? labelFormatter(v) : `${v}`;\n\n // 估算文本宽高\n const { width, height } = textMeasure.quickMeasure(str);\n const textWidth = Math.max(width, MIN_TICK_GAP);\n const textHeight = Math.max(height, MIN_TICK_GAP);\n\n // 估算文本位置\n const pos = scale.scale(v);\n const scaleX = Math.cos(orientAngle) * pos;\n const scaleY = -Math.sin(orientAngle) * pos;\n let textX = scaleX;\n let textY = scaleY;\n\n let align: TextAlignType;\n if (labelFlush && isHorizontal && i === 0) {\n align = 'left';\n } else if (labelFlush && isHorizontal && i === domain.length - 1) {\n align = 'right';\n } else {\n align = labelStyle.textAlign ?? 'center';\n }\n if (align === 'right') {\n textX -= textWidth;\n } else if (align === 'center') {\n textX -= textWidth / 2;\n }\n\n let baseline: TextBaselineType;\n if (labelFlush && isVertical && i === 0) {\n baseline = 'top';\n } else if (labelFlush && isVertical && i === domain.length - 1) {\n baseline = 'bottom';\n } else {\n baseline = labelStyle.textBaseline ?? 'middle';\n }\n if (baseline === 'bottom') {\n textY -= textHeight;\n } else if (baseline === 'middle') {\n textY -= textHeight / 2;\n }\n\n // 计算 label 包围盒\n const bounds = new AABBBounds()\n .set(textX, textY, textX + textWidth, textY + textHeight)\n .rotate(labelAngle, scaleX, scaleY);\n return bounds;\n });\n\n return labelBoundsList;\n};\n\nexport const getPolarAngleLabelBounds = (scale: IBaseScale, domain: any[], op: IPolarTickDataOpt): AABBBounds[] => {\n const { labelStyle, getRadius, labelOffset, labelFormatter } = op;\n const radius = getRadius?.();\n const labelAngle = labelStyle.angle ?? 0;\n\n const textMeasure = initTextMeasure(labelStyle);\n const labelBoundsList = domain.map((v: any) => {\n const str = labelFormatter ? labelFormatter(v) : `${v}`;\n\n // 估算文本宽高\n const { width, height } = textMeasure.quickMeasure(str);\n const textWidth = Math.max(width, MIN_TICK_GAP);\n const textHeight = Math.max(height, MIN_TICK_GAP);\n\n // 估算文本位置\n const angle = scale.scale(v);\n let textX = 0;\n let textY = 0;\n const orient = angleLabelOrientAttribute(angle);\n const { x, y } = polarToCartesian({ x: 0, y: 0 }, radius + labelOffset, angle);\n textX = x + (orient.align === 'right' ? -textWidth : orient.align === 'center' ? -textWidth / 2 : 0);\n textY = y + (orient.baseline === 'bottom' ? -textHeight : orient.baseline === 'middle' ? -textHeight / 2 : 0);\n\n // 计算 label 包围盒\n const bounds = new AABBBounds()\n .set(textX, textY, textX + textWidth, textY + textHeight)\n .rotate(labelAngle, textX + textWidth / 2, textY + textHeight / 2);\n return bounds;\n });\n\n return labelBoundsList;\n};\n\nexport const isAxisHorizontal = (axisOrientType: IOrientType) => {\n return (['bottom', 'top', 'z'] as IOrientType[]).includes(axisOrientType);\n};\n"]}
@@ -0,0 +1,5 @@
1
+ export declare function normalizeAngle(angle: number): number;
2
+ export declare function angleLabelOrientAttribute(angle: number): {
3
+ align: "left" | "right" | "center";
4
+ baseline: "top" | "bottom" | "middle";
5
+ };
@@ -0,0 +1,16 @@
1
+ export function normalizeAngle(angle) {
2
+ for (;angle < 0; ) angle += 2 * Math.PI;
3
+ for (;angle >= 2 * Math.PI; ) angle -= 2 * Math.PI;
4
+ return angle;
5
+ }
6
+
7
+ export function angleLabelOrientAttribute(angle) {
8
+ let align = "center", baseline = "middle";
9
+ return align = (angle = normalizeAngle(angle)) >= Math.PI * (5 / 3) || angle <= Math.PI * (1 / 3) ? "left" : angle >= Math.PI * (2 / 3) && angle <= Math.PI * (4 / 3) ? "right" : "center",
10
+ baseline = angle >= Math.PI * (7 / 6) && angle <= Math.PI * (11 / 6) ? "bottom" : angle >= Math.PI * (1 / 6) && angle <= Math.PI * (5 / 6) ? "top" : "middle",
11
+ {
12
+ align: align,
13
+ baseline: baseline
14
+ };
15
+ }
16
+ //# sourceMappingURL=polar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/polar.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK,GAAG,CAAC,EAAE;QAChB,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;KACtB;IACD,OAAO,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE;QAC3B,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;KACtB;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAOD,MAAM,UAAU,yBAAyB,CAAC,KAAa;IACrD,IAAI,KAAK,GAAkB,QAAQ,CAAC;IACpC,IAAI,QAAQ,GAAqB,QAAQ,CAAC;IAE1C,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAG9B,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;QAC5D,KAAK,GAAG,MAAM,CAAC;KAChB;SAAM,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;QACnE,KAAK,GAAG,OAAO,CAAC;KACjB;SAAM;QACL,KAAK,GAAG,QAAQ,CAAC;KAClB;IAGD,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;QAC7D,QAAQ,GAAG,QAAQ,CAAC;KACrB;SAAM,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;QACnE,QAAQ,GAAG,KAAK,CAAC;KAClB;SAAM;QACL,QAAQ,GAAG,QAAQ,CAAC;KACrB;IAED,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC","file":"polar.js","sourcesContent":["import type { TextAlignType, TextBaselineType } from '@visactor/vrender';\n\n/**\n * 角度标准化处理\n * @param angle 弧度角\n */\nexport function normalizeAngle(angle: number): number {\n while (angle < 0) {\n angle += Math.PI * 2;\n }\n while (angle >= Math.PI * 2) {\n angle -= Math.PI * 2;\n }\n return angle;\n}\n\n/**\n * 计算对应角度下的角度轴标签定位属性\n * @param angle 弧度角,需要注意是逆时针计算的\n * @returns\n */\nexport function angleLabelOrientAttribute(angle: number) {\n let align: TextAlignType = 'center';\n let baseline: TextBaselineType = 'middle';\n\n angle = normalizeAngle(angle);\n\n // left: 5/3 - 1/3; right: 2/3 - 4/3; center: 5/3 - 1/3 & 2/3 - 4/3\n if (angle >= Math.PI * (5 / 3) || angle <= Math.PI * (1 / 3)) {\n align = 'left';\n } else if (angle >= Math.PI * (2 / 3) && angle <= Math.PI * (4 / 3)) {\n align = 'right';\n } else {\n align = 'center';\n }\n\n // bottom: 7/6 - 11/6; top: 1/6 - 5/6; middle: 11/6 - 1/6 & 5/6 - 7/6\n if (angle >= Math.PI * (7 / 6) && angle <= Math.PI * (11 / 6)) {\n baseline = 'bottom';\n } else if (angle >= Math.PI * (1 / 6) && angle <= Math.PI * (5 / 6)) {\n baseline = 'top';\n } else {\n baseline = 'middle';\n }\n\n return { align, baseline };\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ITextMeasureOption } from '@visactor/vutils';
2
+ import { TextMeasure } from '@visactor/vutils';
3
+ import { ITextGraphicAttribute } from '@visactor/vrender';
4
+ export declare const initTextMeasure: (textSpec?: Partial<ITextGraphicAttribute>, option?: Partial<ITextMeasureOption>, useNaiveCanvas?: boolean, defaultFontParams?: Partial<ITextGraphicAttribute>) => TextMeasure<ITextGraphicAttribute>;
@@ -0,0 +1,13 @@
1
+ import { TextMeasure } from "@visactor/vutils";
2
+
3
+ import { getTextBounds } from "@visactor/vrender";
4
+
5
+ export const initTextMeasure = (textSpec, option, useNaiveCanvas, defaultFontParams) => new TextMeasure(Object.assign({
6
+ defaultFontParams: Object.assign({
7
+ fontFamily: "PingFang SC,Helvetica Neue,Microsoft Yahei,system-ui,-apple-system,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol",
8
+ fontSize: 14
9
+ }, defaultFontParams),
10
+ getTextBounds: useNaiveCanvas ? void 0 : getTextBounds,
11
+ specialCharSet: "-/: .,@%'\"~" + TextMeasure.ALPHABET_CHAR_SET + TextMeasure.ALPHABET_CHAR_SET.toUpperCase()
12
+ }, null != option ? option : {}), textSpec);
13
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/text.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,QAAyC,EACzC,MAAoC,EACpC,cAAwB,EACxB,iBAAkD,EACd,EAAE;IACtC,OAAO,IAAI,WAAW,iBAElB,iBAAiB,kBACf,UAAU,EAER,gKAAgK,EAClK,QAAQ,EAAE,EAAE,IACT,iBAAiB,GAEtB,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EACzD,cAAc,EAAE,cAAc,GAAG,WAAW,CAAC,iBAAiB,GAAG,WAAW,CAAC,iBAAiB,CAAC,WAAW,EAAE,IACzG,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,GAEnB,QAAQ,CACT,CAAC;AACJ,CAAC,CAAC","file":"text.js","sourcesContent":["import type { ITextMeasureOption } from '@visactor/vutils';\n// eslint-disable-next-line no-duplicate-imports\nimport { TextMeasure } from '@visactor/vutils';\nimport { ITextGraphicAttribute } from '@visactor/vrender';\nimport { getTextBounds } from '@visactor/vrender';\n\nexport const initTextMeasure = (\n textSpec?: Partial<ITextGraphicAttribute>,\n option?: Partial<ITextMeasureOption>,\n useNaiveCanvas?: boolean,\n defaultFontParams?: Partial<ITextGraphicAttribute>\n): TextMeasure<ITextGraphicAttribute> => {\n return new TextMeasure<ITextGraphicAttribute>(\n {\n defaultFontParams: {\n fontFamily:\n // eslint-disable-next-line max-len\n 'PingFang SC,Helvetica Neue,Microsoft Yahei,system-ui,-apple-system,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol',\n fontSize: 14,\n ...defaultFontParams\n },\n getTextBounds: useNaiveCanvas ? undefined : getTextBounds,\n specialCharSet: '-/: .,@%\\'\"~' + TextMeasure.ALPHABET_CHAR_SET + TextMeasure.ALPHABET_CHAR_SET.toUpperCase(),\n ...(option ?? {})\n },\n textSpec\n );\n};\n"]}
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "@visactor/vutils-extension",
3
+ "version": "0.0.2",
4
+ "description": "The extension module for VUtil from VisActor",
5
+ "sideEffects": false,
6
+ "main": "cjs/index.js",
7
+ "module": "es/index.js",
8
+ "types": "es/index.d.ts",
9
+ "files": [
10
+ "cjs",
11
+ "es",
12
+ "dist"
13
+ ],
14
+ "dependencies": {
15
+ "@visactor/vutils": "~0.16.1",
16
+ "@visactor/vscale": "~0.16.1",
17
+ "@visactor/vrender": "~0.15.4"
18
+ },
19
+ "devDependencies": {
20
+ "@rushstack/eslint-patch": "~1.1.4",
21
+ "eslint": "~8.18.0",
22
+ "vite": "3.2.6",
23
+ "typescript": "4.9.5",
24
+ "@types/jest": "^26.0.0",
25
+ "@types/node": "*",
26
+ "@types/offscreencanvas": "2019.6.4",
27
+ "husky": "7.0.4",
28
+ "jest": "^26.0.0",
29
+ "jest-electron": "^0.1.12",
30
+ "lint-staged": "12.3.7",
31
+ "magic-string": "^0.25.7",
32
+ "prettier": "2.6.1",
33
+ "react-device-detect": "^2.2.2",
34
+ "ts-jest": "^26.0.0",
35
+ "ts-loader": "8.0.2",
36
+ "ts-node": "10.9.0",
37
+ "tslib": "2.3.1",
38
+ "tslint": "5.12.1",
39
+ "@internal/bundler": "0.0.1",
40
+ "@internal/ts-config": "0.0.1",
41
+ "@internal/eslint-config": "0.0.1"
42
+ },
43
+ "publishConfig": {
44
+ "access": "public"
45
+ },
46
+ "homepage": "https://www.visactor.io",
47
+ "bugs": "https://github.com/VisActor/VUtil/issues",
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "https://github.com/VisActor/VUtil.git",
51
+ "directory": "packages/vdataset-extension"
52
+ },
53
+ "author": {
54
+ "name": "VisActor",
55
+ "url": "https://www.visactor.io/"
56
+ },
57
+ "license": "MIT",
58
+ "scripts": {
59
+ "compile": "tsc --noEmit",
60
+ "eslint": "eslint --debug --fix src/",
61
+ "build": "bundle",
62
+ "dev": "bundle --clean -f es -w",
63
+ "test": "jest",
64
+ "test-cov": "jest -w 16 --coverage",
65
+ "test-live": "npm run test-watch __tests__/unit/",
66
+ "test-watch": "DEBUG_MODE=1 jest --watch"
67
+ }
68
+ }