@retikz/core 0.1.0-alpha.5 → 0.1.0-beta.1
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/es/compile/compile.d.ts +17 -0
- package/dist/es/compile/compile.d.ts.map +1 -1
- package/dist/es/compile/compile.js +40 -15
- package/dist/es/compile/index.d.ts +1 -1
- package/dist/es/compile/index.d.ts.map +1 -1
- package/dist/es/compile/node.d.ts +3 -3
- package/dist/es/compile/node.d.ts.map +1 -1
- package/dist/es/compile/node.js +1 -1
- package/dist/es/compile/path/anchor.d.ts +19 -0
- package/dist/es/compile/path/anchor.d.ts.map +1 -0
- package/dist/es/compile/path/anchor.js +54 -0
- package/dist/es/compile/{path.d.ts → path/index.d.ts} +18 -7
- package/dist/es/compile/path/index.d.ts.map +1 -0
- package/dist/es/compile/path/index.js +308 -0
- package/dist/es/compile/path/label.d.ts +18 -0
- package/dist/es/compile/path/label.d.ts.map +1 -0
- package/dist/es/compile/path/label.js +102 -0
- package/dist/es/compile/path/relative.d.ts +8 -0
- package/dist/es/compile/path/relative.d.ts.map +1 -0
- package/dist/es/compile/path/relative.js +48 -0
- package/dist/es/compile/path/shrink.d.ts +24 -0
- package/dist/es/compile/path/shrink.d.ts.map +1 -0
- package/dist/es/compile/path/shrink.js +136 -0
- package/dist/es/compile/path/split.d.ts +15 -0
- package/dist/es/compile/path/split.d.ts.map +1 -0
- package/dist/es/compile/path/split.js +46 -0
- package/dist/es/compile/text-metrics.d.ts +4 -1
- package/dist/es/compile/text-metrics.d.ts.map +1 -1
- package/dist/es/compile/text-metrics.js +11 -5
- package/dist/es/geometry/_transform.d.ts +21 -0
- package/dist/es/geometry/_transform.d.ts.map +1 -0
- package/dist/es/geometry/_transform.js +27 -0
- package/dist/es/geometry/bend.d.ts +1 -1
- package/dist/es/geometry/bend.js +1 -1
- package/dist/es/geometry/circle.d.ts +2 -3
- package/dist/es/geometry/circle.d.ts.map +1 -1
- package/dist/es/geometry/circle.js +1 -16
- package/dist/es/geometry/diamond.d.ts +2 -3
- package/dist/es/geometry/diamond.d.ts.map +1 -1
- package/dist/es/geometry/diamond.js +1 -16
- package/dist/es/geometry/ellipse.d.ts +2 -3
- package/dist/es/geometry/ellipse.d.ts.map +1 -1
- package/dist/es/geometry/ellipse.js +1 -16
- package/dist/es/geometry/polar.d.ts +2 -2
- package/dist/es/geometry/polar.d.ts.map +1 -1
- package/dist/es/geometry/polar.js +2 -6
- package/dist/es/geometry/rect.d.ts.map +1 -1
- package/dist/es/geometry/rect.js +1 -18
- package/dist/es/geometry/segment.d.ts +5 -1
- package/dist/es/geometry/segment.d.ts.map +1 -1
- package/dist/es/index.d.ts +10 -6
- package/dist/es/index.d.ts.map +1 -1
- package/dist/es/index.js +4 -2
- package/dist/es/ir/font.d.ts +21 -0
- package/dist/es/ir/font.d.ts.map +1 -0
- package/dist/es/ir/font.js +15 -0
- package/dist/es/ir/index.d.ts +2 -0
- package/dist/es/ir/index.d.ts.map +1 -1
- package/dist/es/ir/node.d.ts +28 -139
- package/dist/es/ir/node.d.ts.map +1 -1
- package/dist/es/ir/node.js +6 -30
- package/dist/es/ir/path/arrow.d.ts +12 -12
- package/dist/es/ir/path/path.d.ts +16 -16
- package/dist/es/ir/path/path.js +4 -4
- package/dist/es/ir/path/step.d.ts +1 -1
- package/dist/es/ir/path/step.d.ts.map +1 -1
- package/dist/es/ir/path/step.js +8 -8
- package/dist/es/ir/position/offset-position.js +1 -1
- package/dist/es/ir/position/polar-position.d.ts.map +1 -1
- package/dist/es/ir/position/polar-position.js +2 -2
- package/dist/es/ir/position/position.d.ts.map +1 -1
- package/dist/es/ir/position/position.js +1 -1
- package/dist/es/ir/scene.d.ts +112 -112
- package/dist/es/ir/text.d.ts +96 -0
- package/dist/es/ir/text.d.ts.map +1 -0
- package/dist/es/ir/text.js +20 -0
- package/dist/es/parsers/parseTargetSugar.d.ts +4 -0
- package/dist/es/parsers/parseTargetSugar.d.ts.map +1 -1
- package/dist/es/parsers/parseTargetSugar.js +3 -2
- package/dist/es/primitive/ellipse.d.ts +2 -2
- package/dist/es/primitive/group.d.ts +23 -7
- package/dist/es/primitive/group.d.ts.map +1 -1
- package/dist/es/primitive/path.d.ts +51 -11
- package/dist/es/primitive/path.d.ts.map +1 -1
- package/dist/es/primitive/rect.d.ts +2 -2
- package/dist/es/primitive/rect.d.ts.map +1 -1
- package/dist/es/primitive/text.d.ts +10 -3
- package/dist/es/primitive/text.d.ts.map +1 -1
- package/dist/es/primitive/view-box.d.ts +1 -1
- package/dist/es/primitive/view-box.d.ts.map +1 -1
- package/dist/es/types.d.ts +8 -0
- package/dist/es/types.d.ts.map +1 -1
- package/dist/lib/compile/compile.cjs +40 -15
- package/dist/lib/compile/compile.d.ts +17 -0
- package/dist/lib/compile/compile.d.ts.map +1 -1
- package/dist/lib/compile/index.d.ts +1 -1
- package/dist/lib/compile/index.d.ts.map +1 -1
- package/dist/lib/compile/node.cjs +1 -1
- package/dist/lib/compile/node.d.ts +3 -3
- package/dist/lib/compile/node.d.ts.map +1 -1
- package/dist/lib/compile/path/anchor.cjs +58 -0
- package/dist/lib/compile/path/anchor.d.ts +19 -0
- package/dist/lib/compile/path/anchor.d.ts.map +1 -0
- package/dist/lib/compile/path/index.cjs +308 -0
- package/dist/lib/compile/{path.d.ts → path/index.d.ts} +18 -7
- package/dist/lib/compile/path/index.d.ts.map +1 -0
- package/dist/lib/compile/path/label.cjs +103 -0
- package/dist/lib/compile/path/label.d.ts +18 -0
- package/dist/lib/compile/path/label.d.ts.map +1 -0
- package/dist/lib/compile/path/relative.cjs +48 -0
- package/dist/lib/compile/path/relative.d.ts +8 -0
- package/dist/lib/compile/path/relative.d.ts.map +1 -0
- package/dist/lib/compile/path/shrink.cjs +138 -0
- package/dist/lib/compile/path/shrink.d.ts +24 -0
- package/dist/lib/compile/path/shrink.d.ts.map +1 -0
- package/dist/lib/compile/path/split.cjs +46 -0
- package/dist/lib/compile/path/split.d.ts +15 -0
- package/dist/lib/compile/path/split.d.ts.map +1 -0
- package/dist/lib/compile/text-metrics.cjs +11 -5
- package/dist/lib/compile/text-metrics.d.ts +4 -1
- package/dist/lib/compile/text-metrics.d.ts.map +1 -1
- package/dist/lib/geometry/_transform.cjs +28 -0
- package/dist/lib/geometry/_transform.d.ts +21 -0
- package/dist/lib/geometry/_transform.d.ts.map +1 -0
- package/dist/lib/geometry/bend.cjs +1 -1
- package/dist/lib/geometry/bend.d.ts +1 -1
- package/dist/lib/geometry/circle.cjs +5 -20
- package/dist/lib/geometry/circle.d.ts +2 -3
- package/dist/lib/geometry/circle.d.ts.map +1 -1
- package/dist/lib/geometry/diamond.cjs +5 -20
- package/dist/lib/geometry/diamond.d.ts +2 -3
- package/dist/lib/geometry/diamond.d.ts.map +1 -1
- package/dist/lib/geometry/ellipse.cjs +5 -20
- package/dist/lib/geometry/ellipse.d.ts +2 -3
- package/dist/lib/geometry/ellipse.d.ts.map +1 -1
- package/dist/lib/geometry/polar.cjs +2 -6
- package/dist/lib/geometry/polar.d.ts +2 -2
- package/dist/lib/geometry/polar.d.ts.map +1 -1
- package/dist/lib/geometry/rect.cjs +5 -22
- package/dist/lib/geometry/rect.d.ts.map +1 -1
- package/dist/lib/geometry/segment.d.ts +5 -1
- package/dist/lib/geometry/segment.d.ts.map +1 -1
- package/dist/lib/index.cjs +5 -3
- package/dist/lib/index.d.ts +10 -6
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/ir/font.cjs +15 -0
- package/dist/lib/ir/font.d.ts +21 -0
- package/dist/lib/ir/font.d.ts.map +1 -0
- package/dist/lib/ir/index.d.ts +2 -0
- package/dist/lib/ir/index.d.ts.map +1 -1
- package/dist/lib/ir/node.cjs +7 -34
- package/dist/lib/ir/node.d.ts +28 -139
- package/dist/lib/ir/node.d.ts.map +1 -1
- package/dist/lib/ir/path/arrow.d.ts +12 -12
- package/dist/lib/ir/path/path.cjs +4 -4
- package/dist/lib/ir/path/path.d.ts +16 -16
- package/dist/lib/ir/path/step.cjs +8 -8
- package/dist/lib/ir/path/step.d.ts +1 -1
- package/dist/lib/ir/path/step.d.ts.map +1 -1
- package/dist/lib/ir/position/offset-position.cjs +1 -1
- package/dist/lib/ir/position/polar-position.cjs +2 -2
- package/dist/lib/ir/position/polar-position.d.ts.map +1 -1
- package/dist/lib/ir/position/position.cjs +1 -1
- package/dist/lib/ir/position/position.d.ts.map +1 -1
- package/dist/lib/ir/scene.d.ts +112 -112
- package/dist/lib/ir/text.cjs +21 -0
- package/dist/lib/ir/text.d.ts +96 -0
- package/dist/lib/ir/text.d.ts.map +1 -0
- package/dist/lib/parsers/parseTargetSugar.cjs +3 -2
- package/dist/lib/parsers/parseTargetSugar.d.ts +4 -0
- package/dist/lib/parsers/parseTargetSugar.d.ts.map +1 -1
- package/dist/lib/primitive/ellipse.d.ts +2 -2
- package/dist/lib/primitive/group.d.ts +23 -7
- package/dist/lib/primitive/group.d.ts.map +1 -1
- package/dist/lib/primitive/path.d.ts +51 -11
- package/dist/lib/primitive/path.d.ts.map +1 -1
- package/dist/lib/primitive/rect.d.ts +2 -2
- package/dist/lib/primitive/rect.d.ts.map +1 -1
- package/dist/lib/primitive/text.d.ts +10 -3
- package/dist/lib/primitive/text.d.ts.map +1 -1
- package/dist/lib/primitive/view-box.d.ts +1 -1
- package/dist/lib/primitive/view-box.d.ts.map +1 -1
- package/dist/lib/types.d.ts +8 -0
- package/dist/lib/types.d.ts.map +1 -1
- package/package.json +13 -4
- package/dist/es/compile/path.d.ts.map +0 -1
- package/dist/es/compile/path.js +0 -636
- package/dist/lib/compile/path.cjs +0 -636
- package/dist/lib/compile/path.d.ts.map +0 -1
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* 单行文本规格:纯字符串走块级默认,对象形式可覆盖 fill/opacity/font
|
|
4
|
+
* @description 行级覆盖只生效于本行;font 子字段未填则继承块级;align/lineHeight 不可被行覆盖
|
|
5
|
+
*/
|
|
6
|
+
export declare const LineSpecSchema: z.ZodUnion<[z.ZodString, z.ZodObject<{
|
|
7
|
+
text: z.ZodString;
|
|
8
|
+
fill: z.ZodOptional<z.ZodString>;
|
|
9
|
+
opacity: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
font: z.ZodOptional<z.ZodObject<{
|
|
11
|
+
family: z.ZodOptional<z.ZodString>;
|
|
12
|
+
size: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
weight: z.ZodOptional<z.ZodUnion<[z.ZodEnum<["normal", "bold"]>, z.ZodNumber]>>;
|
|
14
|
+
style: z.ZodOptional<z.ZodEnum<["normal", "italic", "oblique"]>>;
|
|
15
|
+
}, "strip", z.ZodTypeAny, {
|
|
16
|
+
family?: string | undefined;
|
|
17
|
+
size?: number | undefined;
|
|
18
|
+
weight?: number | "normal" | "bold" | undefined;
|
|
19
|
+
style?: "normal" | "italic" | "oblique" | undefined;
|
|
20
|
+
}, {
|
|
21
|
+
family?: string | undefined;
|
|
22
|
+
size?: number | undefined;
|
|
23
|
+
weight?: number | "normal" | "bold" | undefined;
|
|
24
|
+
style?: "normal" | "italic" | "oblique" | undefined;
|
|
25
|
+
}>>;
|
|
26
|
+
}, "strip", z.ZodTypeAny, {
|
|
27
|
+
text: string;
|
|
28
|
+
fill?: string | undefined;
|
|
29
|
+
opacity?: number | undefined;
|
|
30
|
+
font?: {
|
|
31
|
+
family?: string | undefined;
|
|
32
|
+
size?: number | undefined;
|
|
33
|
+
weight?: number | "normal" | "bold" | undefined;
|
|
34
|
+
style?: "normal" | "italic" | "oblique" | undefined;
|
|
35
|
+
} | undefined;
|
|
36
|
+
}, {
|
|
37
|
+
text: string;
|
|
38
|
+
fill?: string | undefined;
|
|
39
|
+
opacity?: number | undefined;
|
|
40
|
+
font?: {
|
|
41
|
+
family?: string | undefined;
|
|
42
|
+
size?: number | undefined;
|
|
43
|
+
weight?: number | "normal" | "bold" | undefined;
|
|
44
|
+
style?: "normal" | "italic" | "oblique" | undefined;
|
|
45
|
+
} | undefined;
|
|
46
|
+
}>]>;
|
|
47
|
+
/** 行规格 IR 类型 */
|
|
48
|
+
export type IRLineSpec = z.infer<typeof LineSpecSchema>;
|
|
49
|
+
/**
|
|
50
|
+
* 文本块:单字符串或非空多行 LineSpec 数组
|
|
51
|
+
* @description 选数组而非 `\n` 字符串:JSON 友好无 escape,行级覆盖天然落字段;通用文本结构,Node text / 未来 Step.label 等共用
|
|
52
|
+
*/
|
|
53
|
+
export declare const TextBlockSchema: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodObject<{
|
|
54
|
+
text: z.ZodString;
|
|
55
|
+
fill: z.ZodOptional<z.ZodString>;
|
|
56
|
+
opacity: z.ZodOptional<z.ZodNumber>;
|
|
57
|
+
font: z.ZodOptional<z.ZodObject<{
|
|
58
|
+
family: z.ZodOptional<z.ZodString>;
|
|
59
|
+
size: z.ZodOptional<z.ZodNumber>;
|
|
60
|
+
weight: z.ZodOptional<z.ZodUnion<[z.ZodEnum<["normal", "bold"]>, z.ZodNumber]>>;
|
|
61
|
+
style: z.ZodOptional<z.ZodEnum<["normal", "italic", "oblique"]>>;
|
|
62
|
+
}, "strip", z.ZodTypeAny, {
|
|
63
|
+
family?: string | undefined;
|
|
64
|
+
size?: number | undefined;
|
|
65
|
+
weight?: number | "normal" | "bold" | undefined;
|
|
66
|
+
style?: "normal" | "italic" | "oblique" | undefined;
|
|
67
|
+
}, {
|
|
68
|
+
family?: string | undefined;
|
|
69
|
+
size?: number | undefined;
|
|
70
|
+
weight?: number | "normal" | "bold" | undefined;
|
|
71
|
+
style?: "normal" | "italic" | "oblique" | undefined;
|
|
72
|
+
}>>;
|
|
73
|
+
}, "strip", z.ZodTypeAny, {
|
|
74
|
+
text: string;
|
|
75
|
+
fill?: string | undefined;
|
|
76
|
+
opacity?: number | undefined;
|
|
77
|
+
font?: {
|
|
78
|
+
family?: string | undefined;
|
|
79
|
+
size?: number | undefined;
|
|
80
|
+
weight?: number | "normal" | "bold" | undefined;
|
|
81
|
+
style?: "normal" | "italic" | "oblique" | undefined;
|
|
82
|
+
} | undefined;
|
|
83
|
+
}, {
|
|
84
|
+
text: string;
|
|
85
|
+
fill?: string | undefined;
|
|
86
|
+
opacity?: number | undefined;
|
|
87
|
+
font?: {
|
|
88
|
+
family?: string | undefined;
|
|
89
|
+
size?: number | undefined;
|
|
90
|
+
weight?: number | "normal" | "bold" | undefined;
|
|
91
|
+
style?: "normal" | "italic" | "oblique" | undefined;
|
|
92
|
+
} | undefined;
|
|
93
|
+
}>]>, "many">]>;
|
|
94
|
+
/** 文本块 IR 类型(单字符串或多行 LineSpec 数组) */
|
|
95
|
+
export type IRTextBlock = z.infer<typeof TextBlockSchema>;
|
|
96
|
+
//# sourceMappingURL=text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/ir/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAsBxB,CAAC;AAEJ,gBAAgB;AAChB,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAExD;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAIzB,CAAC;AAEJ,qCAAqC;AACrC,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { FontSchema } from "./font.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
//#region src/ir/text.ts
|
|
4
|
+
/**
|
|
5
|
+
* 单行文本规格:纯字符串走块级默认,对象形式可覆盖 fill/opacity/font
|
|
6
|
+
* @description 行级覆盖只生效于本行;font 子字段未填则继承块级;align/lineHeight 不可被行覆盖
|
|
7
|
+
*/
|
|
8
|
+
var LineSpecSchema = z.union([z.string(), z.object({
|
|
9
|
+
text: z.string().describe("Line content"),
|
|
10
|
+
fill: z.string().optional().describe("Per-line text color; overrides block default"),
|
|
11
|
+
opacity: z.number().min(0).max(1).optional().describe("Per-line opacity 0..1"),
|
|
12
|
+
font: FontSchema.optional().describe("Per-line font overrides; missing fields inherit from block-level `font`")
|
|
13
|
+
})]).describe("Single line of text: bare string for default styling, or an object with per-line `fill` / `opacity` / `font` overrides.");
|
|
14
|
+
/**
|
|
15
|
+
* 文本块:单字符串或非空多行 LineSpec 数组
|
|
16
|
+
* @description 选数组而非 `\n` 字符串:JSON 友好无 escape,行级覆盖天然落字段;通用文本结构,Node text / 未来 Step.label 等共用
|
|
17
|
+
*/
|
|
18
|
+
var TextBlockSchema = z.union([z.string(), z.array(LineSpecSchema).min(1)]).describe("Text block: a single string for one line, or a non-empty array of line specs (string for default, object for per-line overrides).");
|
|
19
|
+
//#endregion
|
|
20
|
+
export { LineSpecSchema, TextBlockSchema };
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import { IRTarget } from '../ir';
|
|
2
|
+
/**
|
|
3
|
+
* Sugar 字符串解析:TikZ 风格相对偏移字面量 → IR 对象
|
|
4
|
+
* @description `'+dx,dy'` → `{relative:[dx,dy]}`(TikZ `+`,不更新 prevEnd);`'++dx,dy'` → `{relativeAccumulate:[dx,dy]}`(TikZ `++`,累积);其他形态(节点 id、笛卡尔 / 极坐标、已是 relative 对象)原样返回。纯函数无 nodeIndex 依赖,react adapter 与 Draw DSL 共用
|
|
5
|
+
*/
|
|
2
6
|
export declare const parseTargetSugar: (input: unknown) => IRTarget;
|
|
3
7
|
//# sourceMappingURL=parseTargetSugar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseTargetSugar.d.ts","sourceRoot":"","sources":["../../../src/parsers/parseTargetSugar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"parseTargetSugar.d.ts","sourceRoot":"","sources":["../../../src/parsers/parseTargetSugar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAKtC;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,QAWjD,CAAC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
//#region src/parsers/parseTargetSugar.ts
|
|
2
|
+
/** TikZ 风格相对偏移字面量正则:捕获 `+` / `++` 前缀 + dx / dy 数值 */
|
|
3
|
+
var RELATIVE_OFFSET_RE = /^(\+{1,2})\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)$/;
|
|
2
4
|
/**
|
|
3
5
|
* Sugar 字符串解析:TikZ 风格相对偏移字面量 → IR 对象
|
|
4
|
-
* @description `'+dx,dy'` → `{relative:[dx,dy]}`(TikZ `+`,不更新 prevEnd);`'++dx,dy'` → `{relativeAccumulate:[dx,dy]}`(TikZ `++`,累积);其他形态(节点 id
|
|
6
|
+
* @description `'+dx,dy'` → `{relative:[dx,dy]}`(TikZ `+`,不更新 prevEnd);`'++dx,dy'` → `{relativeAccumulate:[dx,dy]}`(TikZ `++`,累积);其他形态(节点 id、笛卡尔 / 极坐标、已是 relative 对象)原样返回。纯函数无 nodeIndex 依赖,react adapter 与 Draw DSL 共用
|
|
5
7
|
*/
|
|
6
|
-
var RELATIVE_OFFSET_RE = /^(\+{1,2})\s*(-?\d+(?:\.\d+)?)\s*,\s*(-?\d+(?:\.\d+)?)$/;
|
|
7
8
|
var parseTargetSugar = (input) => {
|
|
8
9
|
if (typeof input !== "string") return input;
|
|
9
10
|
const match = input.match(RELATIVE_OFFSET_RE);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* @description 圆形(rx=ry)复用同一 prim 单 case 处理;rotate
|
|
2
|
+
* 椭圆原语(cx/cy 圆心,rx/ry 半径)
|
|
3
|
+
* @description 圆形(rx=ry)复用同一 prim 单 case 处理;rotate 度数绕中心,非零时由 renderer 在 emit 阶段应用旋转变换
|
|
4
4
|
*/
|
|
5
5
|
export type EllipsePrim = {
|
|
6
6
|
type: 'ellipse';
|
|
@@ -1,22 +1,38 @@
|
|
|
1
1
|
import { ScenePrimitive } from './scene';
|
|
2
|
-
/**
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*/
|
|
6
|
-
export type Transform = {
|
|
2
|
+
/** Translate transform:沿 x / y 平移(user units) */
|
|
3
|
+
export type TranslateTransform = {
|
|
4
|
+
/** 鉴别字面量 */
|
|
7
5
|
kind: 'translate';
|
|
6
|
+
/** x 方向位移 */
|
|
8
7
|
x: number;
|
|
8
|
+
/** y 方向位移(屏幕 y-down) */
|
|
9
9
|
y: number;
|
|
10
|
-
}
|
|
10
|
+
};
|
|
11
|
+
/** Rotate transform:按角度旋转,可指定旋转中心;中心缺省 = 绕原点 (0, 0) */
|
|
12
|
+
export type RotateTransform = {
|
|
13
|
+
/** 鉴别字面量 */
|
|
11
14
|
kind: 'rotate';
|
|
15
|
+
/** 旋转角度(度,正向 = 屏幕 y-down 下的视觉顺时针) */
|
|
12
16
|
degrees: number;
|
|
17
|
+
/** 旋转中心 x(缺省 0) */
|
|
13
18
|
cx?: number;
|
|
19
|
+
/** 旋转中心 y(缺省 0) */
|
|
14
20
|
cy?: number;
|
|
15
|
-
}
|
|
21
|
+
};
|
|
22
|
+
/** Scale transform:等比 / 非等比缩放;y 缺省 = x(等比) */
|
|
23
|
+
export type ScaleTransform = {
|
|
24
|
+
/** 鉴别字面量 */
|
|
16
25
|
kind: 'scale';
|
|
26
|
+
/** x 轴缩放因子 */
|
|
17
27
|
x: number;
|
|
28
|
+
/** y 轴缩放因子;缺省 = x(等比缩放) */
|
|
18
29
|
y?: number;
|
|
19
30
|
};
|
|
31
|
+
/**
|
|
32
|
+
* Group transform:结构化变换(3 分支 discriminated union)
|
|
33
|
+
* @description 按数组顺序应用(与 SVG transform 多操作列表语义一致);角度=度,缩放 y 缺省等比 x,rotate cx/cy 缺省绕原点。每个 kind 有对应 named type export。
|
|
34
|
+
*/
|
|
35
|
+
export type Transform = TranslateTransform | RotateTransform | ScaleTransform;
|
|
20
36
|
/** 编组:把若干 primitive 用结构化 transforms 包起来 */
|
|
21
37
|
export type GroupPrim = {
|
|
22
38
|
/** 类型判别符 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../../src/primitive/group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C
|
|
1
|
+
{"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../../src/primitive/group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,iDAAiD;AACjD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY;IACZ,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa;IACb,CAAC,EAAE,MAAM,CAAC;IACV,wBAAwB;IACxB,CAAC,EAAE,MAAM,CAAC;CACX,CAAC;AAEF,uDAAuD;AACvD,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mBAAmB;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,8CAA8C;AAC9C,MAAM,MAAM,cAAc,GAAG;IAC3B,YAAY;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,cAAc;IACd,CAAC,EAAE,MAAM,CAAC;IACV,2BAA2B;IAC3B,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,SAAS,GACjB,kBAAkB,GAClB,eAAe,GACf,cAAc,CAAC;AAEnB,2CAA2C;AAC3C,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,2CAA2C;IAC3C,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9B,YAAY;IACZ,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;CACjC,CAAC"}
|
|
@@ -1,42 +1,82 @@
|
|
|
1
1
|
import { ArrowShape } from '../ir/path/arrow';
|
|
2
|
-
/**
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*/
|
|
6
|
-
export type PathCommand = {
|
|
2
|
+
/** Move command:移动游标到目标点,不绘制 */
|
|
3
|
+
export type MovePathCommand = {
|
|
4
|
+
/** 鉴别字面量 */
|
|
7
5
|
kind: 'move';
|
|
6
|
+
/** 目标点 [x, y] */
|
|
8
7
|
to: [number, number];
|
|
9
|
-
}
|
|
8
|
+
};
|
|
9
|
+
/** Line command:从游标到目标点画直线 */
|
|
10
|
+
export type LinePathCommand = {
|
|
11
|
+
/** 鉴别字面量 */
|
|
10
12
|
kind: 'line';
|
|
13
|
+
/** 终点 [x, y] */
|
|
11
14
|
to: [number, number];
|
|
12
|
-
}
|
|
15
|
+
};
|
|
16
|
+
/** Quad command:二次贝塞尔,一个控制点 */
|
|
17
|
+
export type QuadPathCommand = {
|
|
18
|
+
/** 鉴别字面量 */
|
|
13
19
|
kind: 'quad';
|
|
20
|
+
/** 控制点 [x, y] */
|
|
14
21
|
control: [number, number];
|
|
22
|
+
/** 终点 [x, y] */
|
|
15
23
|
to: [number, number];
|
|
16
|
-
}
|
|
24
|
+
};
|
|
25
|
+
/** Cubic command:三次贝塞尔,两个控制点 */
|
|
26
|
+
export type CubicPathCommand = {
|
|
27
|
+
/** 鉴别字面量 */
|
|
17
28
|
kind: 'cubic';
|
|
29
|
+
/** 第一控制点 [x, y](影响起点切线) */
|
|
18
30
|
control1: [number, number];
|
|
31
|
+
/** 第二控制点 [x, y](影响终点切线) */
|
|
19
32
|
control2: [number, number];
|
|
33
|
+
/** 终点 [x, y] */
|
|
20
34
|
to: [number, number];
|
|
21
|
-
}
|
|
35
|
+
};
|
|
36
|
+
/** Arc command:以 center 为圆心、给定半径与起末角度的圆弧(center-parameterization) */
|
|
37
|
+
export type ArcPathCommand = {
|
|
38
|
+
/** 鉴别字面量 */
|
|
22
39
|
kind: 'arc';
|
|
40
|
+
/** 圆心 [x, y] */
|
|
23
41
|
center: [number, number];
|
|
42
|
+
/** 半径(user units) */
|
|
24
43
|
radius: number;
|
|
44
|
+
/** 起始角度(度,0° = +x、90° = +y screen-down) */
|
|
25
45
|
startAngle: number;
|
|
46
|
+
/** 终止角度(度) */
|
|
26
47
|
endAngle: number;
|
|
48
|
+
/** 是否逆时针扫描;缺省 / `false` = CW(屏幕坐标系正向) */
|
|
27
49
|
counterClockwise?: boolean;
|
|
28
|
-
}
|
|
50
|
+
};
|
|
51
|
+
/** EllipseArc command:以 center 为圆心、给定 x/y 半径与起末角度的椭圆弧;可选 rotation */
|
|
52
|
+
export type EllipseArcPathCommand = {
|
|
53
|
+
/** 鉴别字面量 */
|
|
29
54
|
kind: 'ellipseArc';
|
|
55
|
+
/** 圆心 [x, y] */
|
|
30
56
|
center: [number, number];
|
|
57
|
+
/** x 轴半径 */
|
|
31
58
|
radiusX: number;
|
|
59
|
+
/** y 轴半径 */
|
|
32
60
|
radiusY: number;
|
|
61
|
+
/** 椭圆整体旋转角度(度),缺省 0 */
|
|
33
62
|
rotation?: number;
|
|
63
|
+
/** 起始角度(度) */
|
|
34
64
|
startAngle: number;
|
|
65
|
+
/** 终止角度(度) */
|
|
35
66
|
endAngle: number;
|
|
67
|
+
/** 是否逆时针扫描;缺省 / `false` = CW */
|
|
36
68
|
counterClockwise?: boolean;
|
|
37
|
-
}
|
|
69
|
+
};
|
|
70
|
+
/** Close command:闭合当前子路径回最近一次 move 起点 */
|
|
71
|
+
export type ClosePathCommand = {
|
|
72
|
+
/** 鉴别字面量;无其他字段 */
|
|
38
73
|
kind: 'close';
|
|
39
74
|
};
|
|
75
|
+
/**
|
|
76
|
+
* Path 命令:结构化路径绘制操作(7 分支 discriminated union)
|
|
77
|
+
* @description discriminated union 按 kind 分发;坐标 / 角度均使用 user units(角度=度,0=+x、90=+y/视觉下、CW=正)。各 adapter 自行翻译为原生 API:SVG 拼 `d` 字符串、Canvas 调 ctx.moveTo/lineTo/arc 等。每个 kind 有对应 named type export,便于 wrapper / `Pick<>` 派生。
|
|
78
|
+
*/
|
|
79
|
+
export type PathCommand = MovePathCommand | LinePathCommand | QuadPathCommand | CubicPathCommand | ArcPathCommand | EllipseArcPathCommand | ClosePathCommand;
|
|
40
80
|
/**
|
|
41
81
|
* 端点级解析后的箭头视觉规格(Scene primitive 层)
|
|
42
82
|
* @description compile/path.ts 把 IR `arrowDetail` 顶层 + start/end merge 后产出此结构。`shape` 必填、其余视觉字段全 optional:缺省字段交给 renderer 走 context-stroke / 硬编码 fallback,保持向后兼容
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/primitive/path.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/primitive/path.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,11 +16,11 @@ export type RectPrim = {
|
|
|
16
16
|
fillOpacity?: number;
|
|
17
17
|
/** 描边色 */
|
|
18
18
|
stroke?: string;
|
|
19
|
-
/** 描边透明度 0~1
|
|
19
|
+
/** 描边透明度 0~1 */
|
|
20
20
|
strokeOpacity?: number;
|
|
21
21
|
/** 描边宽度 */
|
|
22
22
|
strokeWidth?: number;
|
|
23
|
-
/** SVG stroke-dasharray
|
|
23
|
+
/** 描边 dash 模式(如 '4 2',与 SVG/CSS `stroke-dasharray` 同格式) */
|
|
24
24
|
strokeDasharray?: string;
|
|
25
25
|
/** 圆角半径(同时作用于 rx/ry) */
|
|
26
26
|
cornerRadius?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rect.d.ts","sourceRoot":"","sources":["../../../src/primitive/rect.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,MAAM,MAAM,QAAQ,GAAG;IACrB,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,aAAa;IACb,CAAC,EAAE,MAAM,CAAC;IACV,aAAa;IACb,CAAC,EAAE,MAAM,CAAC;IACV,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,
|
|
1
|
+
{"version":3,"file":"rect.d.ts","sourceRoot":"","sources":["../../../src/primitive/rect.ts"],"names":[],"mappings":"AAAA,WAAW;AACX,MAAM,MAAM,QAAQ,GAAG;IACrB,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,aAAa;IACb,CAAC,EAAE,MAAM,CAAC;IACV,aAAa;IACb,CAAC,EAAE,MAAM,CAAC;IACV,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wBAAwB;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC"}
|
|
@@ -1,16 +1,23 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** 行级字段(每行可独立指定),未填走块级 TextPrim 默认 */
|
|
2
2
|
export type TextLine = {
|
|
3
|
+
/** 行文字内容 */
|
|
3
4
|
text: string;
|
|
5
|
+
/** 行级字号 override(user units);缺省走块级 TextPrim.fontSize */
|
|
4
6
|
fontSize?: number;
|
|
7
|
+
/** 行级字体族 override(CSS font-family);缺省走块级 */
|
|
5
8
|
fontFamily?: string;
|
|
9
|
+
/** 行级字重 override(CSS font-weight);缺省走块级 */
|
|
6
10
|
fontWeight?: string | number;
|
|
11
|
+
/** 行级字形 override;缺省走块级 */
|
|
7
12
|
fontStyle?: 'normal' | 'italic' | 'oblique';
|
|
13
|
+
/** 行级文字颜色 override;缺省走块级 TextPrim.fill */
|
|
8
14
|
fill?: string;
|
|
15
|
+
/** 行级透明度 0..1 override;缺省走块级 */
|
|
9
16
|
opacity?: number;
|
|
10
17
|
};
|
|
11
18
|
/**
|
|
12
19
|
* 文本原语(measuredWidth/Height 由 Scene 编译阶段算好)
|
|
13
|
-
* @description 多行 lines 至少 1 行;renderer
|
|
20
|
+
* @description 多行 lines 至少 1 行;renderer 按 lineHeight 堆叠每行、按 baseline 在 (x,y) 锚点上下对齐。顶层属性是块级默认,单行 TextLine 可覆盖
|
|
14
21
|
*/
|
|
15
22
|
export type TextPrim = {
|
|
16
23
|
type: 'text';
|
|
@@ -26,7 +33,7 @@ export type TextPrim = {
|
|
|
26
33
|
fontStyle?: 'normal' | 'italic' | 'oblique';
|
|
27
34
|
align: 'start' | 'middle' | 'end';
|
|
28
35
|
baseline: 'top' | 'middle' | 'bottom' | 'alphabetic';
|
|
29
|
-
/**
|
|
36
|
+
/** 行高,多行下相邻行的垂直距离 */
|
|
30
37
|
lineHeight: number;
|
|
31
38
|
/** 编译期算好的整块文字宽度 = max line width */
|
|
32
39
|
measuredWidth: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/primitive/text.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/primitive/text.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,MAAM,MAAM,QAAQ,GAAG;IACrB,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,0BAA0B;IAC1B,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5C,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,+BAA+B;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,0CAA0C;IAC1C,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5C,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAAC;IACrD,qBAAqB;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-box.d.ts","sourceRoot":"","sources":["../../../src/primitive/view-box.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"view-box.d.ts","sourceRoot":"","sources":["../../../src/primitive/view-box.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,MAAM,MAAM,OAAO,GAAG;IACpB,eAAe;IACf,CAAC,EAAE,MAAM,CAAC;IACV,eAAe;IACf,CAAC,EAAE,MAAM,CAAC;IACV,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC"}
|
package/dist/es/types.d.ts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
/** 获取对象所有值的联合类型,等价于 (typeof T)[keyof typeof T] */
|
|
2
2
|
export type ValueOf<T extends object> = T[keyof T];
|
|
3
|
+
/**
|
|
4
|
+
* 类型层等价检查工具(internal idiom,公开 API 不导出)
|
|
5
|
+
* @description 当 A、B 完全等价时类型为 `true`,否则为 `false`——配合 `as const satisfies` 实现"字段表必须完备覆盖类型 key 集合"的互锁;漏字段或多字段 TS 编译期报错
|
|
6
|
+
* @example
|
|
7
|
+
* const NODE_FIELDS = ['id', 'shape'] as const satisfies ReadonlyArray<keyof IRNode>;
|
|
8
|
+
* type _Check = AssertEqual<typeof NODE_FIELDS[number], keyof IRNode>;
|
|
9
|
+
*/
|
|
10
|
+
export type AssertEqual<TActual, TExpected> = [TActual] extends [TExpected] ? [TExpected] extends [TActual] ? true : false : false;
|
|
3
11
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/es/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAEnD;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,CAAC,OAAO,EAAE,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,GACvE,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,GAC3B,IAAI,GACJ,KAAK,GACP,KAAK,CAAC"}
|
|
@@ -2,7 +2,7 @@ const require_rect = require("../geometry/rect.cjs");
|
|
|
2
2
|
const require_position = require("./position.cjs");
|
|
3
3
|
const require_node = require("./node.cjs");
|
|
4
4
|
const require_text_metrics = require("./text-metrics.cjs");
|
|
5
|
-
const
|
|
5
|
+
const require_index = require("./path/index.cjs");
|
|
6
6
|
const require_precision = require("./precision.cjs");
|
|
7
7
|
const require_view_box = require("./view-box.cjs");
|
|
8
8
|
//#region src/compile/compile.ts
|
|
@@ -29,6 +29,14 @@ var coordinateAsLayout = (id, center) => ({
|
|
|
29
29
|
fontSize: 0
|
|
30
30
|
});
|
|
31
31
|
/**
|
|
32
|
+
* 默认 warn dispatcher:dev 模式 console.warn、生产静默
|
|
33
|
+
* @description 用户传 onWarn 时使用用户的;不传走此 fallback
|
|
34
|
+
*/
|
|
35
|
+
var defaultWarnDispatcher = (warning) => {
|
|
36
|
+
if (typeof process !== "undefined" && process.env.NODE_ENV === "production") return;
|
|
37
|
+
console.warn(`[retikz] ${warning.code} at ${warning.path}: ${warning.message}`);
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
32
40
|
* IR → Scene 纯函数转换,所有 adapter 共享
|
|
33
41
|
* @description Pass 1 处理 Node/coordinate 并注册 nodeIndex、发 primitive、累积 bbox;Pass 2 解析 Path 端点写 d 字符串;末端按 precision 折算 viewBox
|
|
34
42
|
*/
|
|
@@ -37,24 +45,41 @@ var compileToScene = (ir, options = {}) => {
|
|
|
37
45
|
const viewBoxPadding = options.padding ?? 10;
|
|
38
46
|
const round = require_precision.makeRound(options.precision ?? 2);
|
|
39
47
|
const nodeDistance = options.nodeDistance;
|
|
48
|
+
const onWarn = options.onWarn ?? defaultWarnDispatcher;
|
|
40
49
|
const primitives = [];
|
|
41
50
|
const nodeIndex = /* @__PURE__ */ new Map();
|
|
42
51
|
const allPoints = [];
|
|
43
|
-
for (
|
|
44
|
-
const
|
|
45
|
-
if (child.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
+
for (let i = 0; i < ir.children.length; i++) {
|
|
53
|
+
const child = ir.children[i];
|
|
54
|
+
if (child.type === "node") {
|
|
55
|
+
const layout = require_node.layoutNode(child, measureText, nodeIndex, nodeDistance);
|
|
56
|
+
if (child.id) nodeIndex.set(child.id, layout);
|
|
57
|
+
for (const prim of require_node.emitNodePrimitives(layout, round)) primitives.push(prim);
|
|
58
|
+
allPoints.push(require_rect.rect.anchor(layout.rect, "north-west"), require_rect.rect.anchor(layout.rect, "north-east"), require_rect.rect.anchor(layout.rect, "south-west"), require_rect.rect.anchor(layout.rect, "south-east"));
|
|
59
|
+
} else if (child.type === "coordinate") {
|
|
60
|
+
const center = require_position.resolvePosition(child.position, nodeIndex, nodeDistance);
|
|
61
|
+
if (!center) {
|
|
62
|
+
onWarn({
|
|
63
|
+
code: "POLAR_ORIGIN_UNRESOLVED",
|
|
64
|
+
message: `Cannot resolve position for coordinate '${child.id}'; polar.origin or at.of may reference an undefined node`,
|
|
65
|
+
path: `children[${i}].coordinate.position`
|
|
66
|
+
});
|
|
67
|
+
throw new Error(`Cannot resolve position for coordinate ${child.id}; polar.origin or at.of may reference an undefined node`);
|
|
68
|
+
}
|
|
69
|
+
nodeIndex.set(child.id, coordinateAsLayout(child.id, center));
|
|
70
|
+
}
|
|
52
71
|
}
|
|
53
|
-
for (
|
|
54
|
-
const
|
|
55
|
-
if (
|
|
56
|
-
|
|
57
|
-
|
|
72
|
+
for (let i = 0; i < ir.children.length; i++) {
|
|
73
|
+
const child = ir.children[i];
|
|
74
|
+
if (child.type === "path") {
|
|
75
|
+
const result = require_index.emitPathPrimitive(child, nodeIndex, round, measureText, {
|
|
76
|
+
onWarn,
|
|
77
|
+
irPath: `children[${i}].path`
|
|
78
|
+
});
|
|
79
|
+
if (result) {
|
|
80
|
+
for (const prim of result.primitives) primitives.push(prim);
|
|
81
|
+
for (const p of result.points) allPoints.push(p);
|
|
82
|
+
}
|
|
58
83
|
}
|
|
59
84
|
}
|
|
60
85
|
return {
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import { IR } from '../ir';
|
|
2
2
|
import { Scene } from '../primitive';
|
|
3
3
|
import { TextMeasurer } from './text-metrics';
|
|
4
|
+
/** 编译期警告:path / position 解析失败时通过 `CompileOptions.onWarn` 发出,不影响编译产物 */
|
|
5
|
+
export type CompileWarning = {
|
|
6
|
+
/**
|
|
7
|
+
* 警告类型代码(机器可读)
|
|
8
|
+
* @description 用户可按 code 分支处理;未来 alpha 加新 code 不破坏调用方
|
|
9
|
+
*/
|
|
10
|
+
code: 'UNRESOLVED_NODE_REFERENCE' | 'PATH_TOO_SHORT' | 'ANCHOR_RESOLUTION_FAILED' | 'OFFSET_BASE_UNRESOLVED' | 'POLAR_ORIGIN_UNRESOLVED' | 'AT_TARGET_UNRESOLVED' | 'RELATIVE_INITIAL_NO_PREV_END' | 'BBOX_EXTREME_INPUT' | (string & {});
|
|
11
|
+
/** 人类可读消息(英文) */
|
|
12
|
+
message: string;
|
|
13
|
+
/** IR locator 路径(jq-like,如 `'children[3].path.children[1].to'`) */
|
|
14
|
+
path: string;
|
|
15
|
+
};
|
|
4
16
|
/** compileToScene 的可选参数 */
|
|
5
17
|
export type CompileOptions = {
|
|
6
18
|
/** 注入文字度量函数;不传则用 fallback(不准但可跑) */
|
|
@@ -17,6 +29,11 @@ export type CompileOptions = {
|
|
|
17
29
|
* @description `Node.position` 为 `{ direction, of }` 且未自带 `distance` 时取此值;未配回退到 1
|
|
18
30
|
*/
|
|
19
31
|
nodeDistance?: number;
|
|
32
|
+
/**
|
|
33
|
+
* 编译期警告收集器
|
|
34
|
+
* @description path / position 解析失败时按 IR locator + code + message 同步触发;不传时 dev 模式(`process.env.NODE_ENV !== 'production'`)默认 `console.warn`、生产静默
|
|
35
|
+
*/
|
|
36
|
+
onWarn?: (warning: CompileWarning) => void;
|
|
20
37
|
};
|
|
21
38
|
/**
|
|
22
39
|
* IR → Scene 纯函数转换,所有 adapter 共享
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../src/compile/compile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,OAAO,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAkB,MAAM,cAAc,CAAC;AAK1D,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAuBrE,2BAA2B;AAC3B,MAAM,MAAM,cAAc,GAAG;IAC3B,oCAAoC;IACpC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../src/compile/compile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAc,MAAM,OAAO,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAkB,MAAM,cAAc,CAAC;AAK1D,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAuBrE,uEAAuE;AACvE,MAAM,MAAM,cAAc,GAAG;IAC3B;;;OAGG;IACH,IAAI,EACA,2BAA2B,GAC3B,gBAAgB,GAChB,0BAA0B,GAC1B,wBAAwB,GACxB,yBAAyB,GACzB,sBAAsB,GACtB,8BAA8B,GAC9B,oBAAoB,GACpB,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAClB,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,2BAA2B;AAC3B,MAAM,MAAM,cAAc,GAAG;IAC3B,oCAAoC;IACpC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;CAC5C,CAAC;AAWF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,EAAE,EAAE,UAAS,cAAmB,KAAG,KAkErE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/compile/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/compile/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
|
|
@@ -21,7 +21,7 @@ var resolveDashArray = (dashArray, dashed, dotted) => {
|
|
|
21
21
|
if (dashed) return DASHED_PATTERN;
|
|
22
22
|
if (dotted) return DOTTED_PATTERN;
|
|
23
23
|
};
|
|
24
|
-
/** IR align →
|
|
24
|
+
/** IR align → 文字对齐锚点(start / middle / end) */
|
|
25
25
|
var alignToTextAnchor = (a) => a === "left" ? "start" : a === "right" ? "end" : "middle";
|
|
26
26
|
/** 从 layout 构造 Rect(带 margin 扩张) */
|
|
27
27
|
var rectOf = (layout, marginAdd) => ({
|
|
@@ -13,7 +13,7 @@ export type NodeLayout = {
|
|
|
13
13
|
* @description rectangle: rect 本身;circle: width=height=2×radius;ellipse: 2×rx,2×ry;diamond: 2×halfA,2×halfB。x,y 是几何中心,rotate 弧度
|
|
14
14
|
*/
|
|
15
15
|
rect: Rect;
|
|
16
|
-
/** IR 原始旋转角(度数),供 emit
|
|
16
|
+
/** IR 原始旋转角(度数),供 emit 阶段写入 GroupPrim 的 rotate transform */
|
|
17
17
|
rotateDeg: number;
|
|
18
18
|
/** 外边距(≥ 0),path 附着到外扩 margin 的虚拟边界 */
|
|
19
19
|
margin: number;
|
|
@@ -26,7 +26,7 @@ export type NodeLayout = {
|
|
|
26
26
|
textWidth: number;
|
|
27
27
|
/** 文本块高度 ≈ lines × lineHeight */
|
|
28
28
|
textHeight: number;
|
|
29
|
-
/**
|
|
29
|
+
/** 文本对齐(start / middle / end 三态) */
|
|
30
30
|
align: 'start' | 'middle' | 'end';
|
|
31
31
|
/** 行高(已应用默认值) */
|
|
32
32
|
lineHeight: number;
|
|
@@ -48,7 +48,7 @@ export type NodeLayout = {
|
|
|
48
48
|
strokeOpacity?: number;
|
|
49
49
|
/** 边框宽度,emit 时 1 兜底 */
|
|
50
50
|
strokeWidth?: number;
|
|
51
|
-
/** SVG stroke-dasharray
|
|
51
|
+
/** 描边 dash 模式(与 SVG/CSS `stroke-dasharray` 同格式),已把 dashed/dotted 预设解析为具体 pattern */
|
|
52
52
|
strokeDasharray?: string;
|
|
53
53
|
/** rectangle 圆角半径(非 rect shape 无效) */
|
|
54
54
|
roundedCorners?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/compile/node.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,EAAe,SAAS,EAAE,MAAM,OAAO,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAgCnD,MAAM,MAAM,UAAU,GAAG;IACvB,qBAAqB;IACrB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,KAAK,EAAE,SAAS,CAAC;IACjB;;;OAGG;IACH,IAAI,EAAE,IAAI,CAAC;IACX,
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/compile/node.ts"],"names":[],"mappings":"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"}
|