@retikz/core 0.2.0 → 0.3.0-alpha.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/README.md +41 -0
- package/dist/es/compile/compile.d.ts +13 -1
- package/dist/es/compile/compile.d.ts.map +1 -1
- package/dist/es/compile/compile.js +8 -2
- package/dist/es/compile/lowerComposites.d.ts +19 -0
- package/dist/es/compile/lowerComposites.d.ts.map +1 -0
- package/dist/es/compile/lowerComposites.js +64 -0
- package/dist/es/compile/node.d.ts.map +1 -1
- package/dist/es/compile/node.js +9 -6
- package/dist/es/compile/path/label.d.ts.map +1 -1
- package/dist/es/compile/path/label.js +5 -3
- package/dist/es/compile/text-baseline.d.ts +28 -0
- package/dist/es/compile/text-baseline.d.ts.map +1 -0
- package/dist/es/compile/text-baseline.js +40 -0
- package/dist/es/compile/text-metrics.d.ts +1 -1
- package/dist/es/composites/index.d.ts +3 -0
- package/dist/es/composites/index.d.ts.map +1 -0
- package/dist/es/composites/types.d.ts +21 -0
- package/dist/es/composites/types.d.ts.map +1 -0
- package/dist/es/composites/types.js +9 -0
- package/dist/es/index.d.ts +5 -3
- package/dist/es/index.d.ts.map +1 -1
- package/dist/es/index.js +3 -1
- package/dist/es/ir/composite.d.ts +37 -0
- package/dist/es/ir/composite.d.ts.map +1 -0
- package/dist/es/ir/composite.js +19 -0
- package/dist/es/ir/index.d.ts +1 -0
- package/dist/es/ir/index.d.ts.map +1 -1
- package/dist/es/ir/scene.d.ts +7 -5
- package/dist/es/ir/scene.d.ts.map +1 -1
- package/dist/es/ir/scene.js +7 -5
- package/dist/es/ir/scope.d.ts +2 -1
- package/dist/es/ir/scope.d.ts.map +1 -1
- package/dist/lib/compile/compile.cjs +8 -2
- package/dist/lib/compile/compile.d.ts +13 -1
- package/dist/lib/compile/compile.d.ts.map +1 -1
- package/dist/lib/compile/lowerComposites.cjs +64 -0
- package/dist/lib/compile/lowerComposites.d.ts +19 -0
- package/dist/lib/compile/lowerComposites.d.ts.map +1 -0
- package/dist/lib/compile/node.cjs +9 -6
- package/dist/lib/compile/node.d.ts.map +1 -1
- package/dist/lib/compile/path/label.cjs +5 -3
- package/dist/lib/compile/path/label.d.ts.map +1 -1
- package/dist/lib/compile/text-baseline.cjs +40 -0
- package/dist/lib/compile/text-baseline.d.ts +28 -0
- package/dist/lib/compile/text-baseline.d.ts.map +1 -0
- package/dist/lib/compile/text-metrics.d.ts +1 -1
- package/dist/lib/composites/index.d.ts +3 -0
- package/dist/lib/composites/index.d.ts.map +1 -0
- package/dist/lib/composites/types.cjs +9 -0
- package/dist/lib/composites/types.d.ts +21 -0
- package/dist/lib/composites/types.d.ts.map +1 -0
- package/dist/lib/index.cjs +4 -0
- package/dist/lib/index.d.ts +5 -3
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/ir/composite.cjs +20 -0
- package/dist/lib/ir/composite.d.ts +37 -0
- package/dist/lib/ir/composite.d.ts.map +1 -0
- package/dist/lib/ir/index.d.ts +1 -0
- package/dist/lib/ir/index.d.ts.map +1 -1
- package/dist/lib/ir/scene.cjs +7 -5
- package/dist/lib/ir/scene.d.ts +7 -5
- package/dist/lib/ir/scene.d.ts.map +1 -1
- package/dist/lib/ir/scope.d.ts +2 -1
- package/dist/lib/ir/scope.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# @retikz/core
|
|
2
|
+
|
|
3
|
+
Framework-agnostic core of [retikz](https://pionpill.github.io/retikz/) — a TikZ-inspired diagramming library. Provides the zod-typed **IR**, the **`compileToScene`** compiler, pure **parsers**, geometry helpers, and the shape / arrow / pattern / path-generator registries.
|
|
4
|
+
|
|
5
|
+
零框架核心:retikz 的中间表示(IR)、`compileToScene` 编译器、纯解析器、几何工具与形状 / 箭头 / 图案 / 路径生成器注册面。**零 React、零 DOM**,运行时依赖只有 `zod`,IR 100% 可 JSON 序列化。
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm add @retikz/core
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
`@retikz/core` is renderer-agnostic: it turns an IR into a serializable `Scene`. A backend (`@retikz/render`) or runtime (`@retikz/react` / `@retikz/vanilla`) then renders that Scene.
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import { compileToScene } from '@retikz/core';
|
|
19
|
+
|
|
20
|
+
const scene = compileToScene(ir);
|
|
21
|
+
// optional: compileToScene(ir, { measureText, shapes, arrows, padding, ... })
|
|
22
|
+
// hand `scene` to @retikz/render/svg, @retikz/render/canvas, or a runtime
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Most users consume core indirectly through [`@retikz/react`](https://www.npmjs.com/package/@retikz/react) or [`@retikz/vanilla`](https://www.npmjs.com/package/@retikz/vanilla). Use core directly when you build IR programmatically, persist/transport scenes, or write a custom renderer.
|
|
26
|
+
|
|
27
|
+
## Exports
|
|
28
|
+
|
|
29
|
+
- `compileToScene` / `computeLayout` / `fallbackMeasurer` — IR → `Scene`
|
|
30
|
+
- IR & `Scene` zod schemas + inferred types
|
|
31
|
+
- `parseWay` / `parseNodeTarget` / `parseTargetSugar` — pure parsers
|
|
32
|
+
- `point` / `rect` / `circle` / `ellipse` / `diamond` / `polar` — geometry
|
|
33
|
+
- `BUILTIN_SHAPES` / `BUILTIN_ARROWS` / `BUILTIN_PATTERNS` + `ShapeDefinition` / `ArrowDefinition` / `PatternDefinition` / `definePathGenerator` — registries
|
|
34
|
+
|
|
35
|
+
## Docs
|
|
36
|
+
|
|
37
|
+
<https://pionpill.github.io/retikz/>
|
|
38
|
+
|
|
39
|
+
## License
|
|
40
|
+
|
|
41
|
+
MIT
|
|
@@ -4,6 +4,7 @@ import { ShapeDefinition } from '../shapes';
|
|
|
4
4
|
import { ArrowDefinition } from '../arrows';
|
|
5
5
|
import { PatternDefinition } from '../patterns';
|
|
6
6
|
import { PathGeneratorDefinition } from '../pathGenerators';
|
|
7
|
+
import { CompositeDefinition } from '../composites';
|
|
7
8
|
import { TextMeasurer } from './text-metrics';
|
|
8
9
|
/** 编译期警告:path / position 解析失败时通过 `CompileOptions.onWarn` 发出,不影响编译产物 */
|
|
9
10
|
export type CompileWarning = {
|
|
@@ -11,7 +12,7 @@ export type CompileWarning = {
|
|
|
11
12
|
* 警告类型代码(机器可读)
|
|
12
13
|
* @description 用户可按 code 分支处理;未来 alpha 加新 code 不破坏调用方
|
|
13
14
|
*/
|
|
14
|
-
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' | 'DUPLICATE_NODE_ID' | 'SHAPE_OVERRIDES_BUILTIN' | 'ARROW_OVERRIDES_BUILTIN' | 'PATTERN_OVERRIDES_BUILTIN' | (string & {});
|
|
15
|
+
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' | 'DUPLICATE_NODE_ID' | 'SHAPE_OVERRIDES_BUILTIN' | 'ARROW_OVERRIDES_BUILTIN' | 'PATTERN_OVERRIDES_BUILTIN' | 'COMPOSITE_NOT_REGISTERED' | (string & {});
|
|
15
16
|
/** 人类可读消息(英文) */
|
|
16
17
|
message: string;
|
|
17
18
|
/** IR locator 路径(jq-like,如 `'children[3].path.children[1].to'`) */
|
|
@@ -66,6 +67,17 @@ export type CompileOptions = {
|
|
|
66
67
|
* `generator.name` 仍是字符串;generator 函数本身只在此运行时注入面、不进 IR。
|
|
67
68
|
*/
|
|
68
69
|
pathGenerators?: Record<string, PathGeneratorDefinition>;
|
|
70
|
+
/**
|
|
71
|
+
* 运行时注入的 Tier 2 composite 展开逻辑(不进 IR)
|
|
72
|
+
* @description compileToScene 第一步据各 def 的 schema 提取的 `${namespace}.${type}` 把 IR 里的 composite
|
|
73
|
+
* 节点展开成 Tier 1;core 无内置。未注册 namespace/type → `onWarn(COMPOSITE_NOT_REGISTERED)` + 跳过该节点。
|
|
74
|
+
*/
|
|
75
|
+
composites?: Array<CompositeDefinition>;
|
|
76
|
+
/**
|
|
77
|
+
* composite 嵌套展开的最大深度(防环 / 防失控递归)
|
|
78
|
+
* @description 默认 32;composite 展开出 composite 时累加,超限或环 throw。
|
|
79
|
+
*/
|
|
80
|
+
maxCompositeDepth?: number;
|
|
69
81
|
};
|
|
70
82
|
/**
|
|
71
83
|
* 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,EAAwC,MAAM,OAAO,CAAC;AACtE,OAAO,KAAK,EAAa,KAAK,EAA6B,MAAM,cAAc,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../src/compile/compile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAwC,MAAM,OAAO,CAAC;AACtE,OAAO,KAAK,EAAa,KAAK,EAA6B,MAAM,cAAc,CAAC;AAEhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAwBzD,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AA4CrE,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,mBAAmB,GACnB,yBAAyB,GACzB,yBAAyB,GACzB,2BAA2B,GAC3B,0BAA0B,GAC1B,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,qCAAqC;IACrC,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;IAC3C;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC7C;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IACzD;;;;OAIG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACxC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AA+HF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,EAAE,EAAE,UAAS,cAAmB,KAAG,KAiWrE,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { rect } from "../geometry/rect.js";
|
|
|
2
2
|
import { BUILTIN_SHAPES } from "../shapes/index.js";
|
|
3
3
|
import { BUILTIN_ARROWS } from "../arrows/index.js";
|
|
4
4
|
import { BUILTIN_PATTERNS } from "../patterns/index.js";
|
|
5
|
+
import { lowerComposites } from "./lowerComposites.js";
|
|
5
6
|
import { NameStack } from "./name-stack.js";
|
|
6
7
|
import { applyTransformChain, computeScopeBoundingBox, lowerScopeTransforms, projectLayoutToGlobal, registerScopeAsLayout } from "./scope.js";
|
|
7
8
|
import { resolvePosition } from "./position.js";
|
|
@@ -125,6 +126,10 @@ var compileToScene = (ir, options = {}) => {
|
|
|
125
126
|
const round = makeRound(options.precision ?? 2);
|
|
126
127
|
const nodeDistance = options.nodeDistance;
|
|
127
128
|
const onWarn = options.onWarn ?? defaultWarnDispatcher;
|
|
129
|
+
const loweredIr = lowerComposites(ir, options.composites ?? [], {
|
|
130
|
+
onWarn,
|
|
131
|
+
maxDepth: options.maxCompositeDepth
|
|
132
|
+
});
|
|
128
133
|
const effectiveShapes = options.shapes ? {
|
|
129
134
|
...BUILTIN_SHAPES,
|
|
130
135
|
...options.shapes
|
|
@@ -235,6 +240,7 @@ var compileToScene = (ir, options = {}) => {
|
|
|
235
240
|
const processChildren = (children, chain, sink, locatorPrefix, layoutsAccumulator, pathsAccumulator, styleStack) => {
|
|
236
241
|
for (let i = 0; i < children.length; i++) {
|
|
237
242
|
const child = children[i];
|
|
243
|
+
if ("namespace" in child) throw new Error(`Unexpected composite node '${child.namespace}.${child.type}' reached compile; composites must be lowered via lowerComposites first.`);
|
|
238
244
|
if (child.type === "node") {
|
|
239
245
|
const layout = layoutNode(resolveNodeStyle(child, styleStack), measureText, nameStack, nodeDistance, chain, resolveLabelDefault(styleStack), effectiveShapes, refPointOfTarget);
|
|
240
246
|
const globalLayout = chain.length === 0 ? layout : projectLayoutToGlobal(layout, chain);
|
|
@@ -323,7 +329,7 @@ var compileToScene = (ir, options = {}) => {
|
|
|
323
329
|
}
|
|
324
330
|
};
|
|
325
331
|
const rootPaths = [];
|
|
326
|
-
processChildren(
|
|
332
|
+
processChildren(loweredIr.children, [], primitives, "", [], rootPaths, []);
|
|
327
333
|
resolvePendingPaths(rootPaths);
|
|
328
334
|
if (placeholderBalance !== 0) {
|
|
329
335
|
const detail = typeof process !== "undefined" && process.env.NODE_ENV !== "production" ? ` at ${collectPlaceholderLocators(primitives).join(", ")}` : "";
|
|
@@ -332,7 +338,7 @@ var compileToScene = (ir, options = {}) => {
|
|
|
332
338
|
const resources = [...paint.resources(), ...clip.resources()];
|
|
333
339
|
return {
|
|
334
340
|
primitives: stableSortByZIndex(sealSink(primitives)),
|
|
335
|
-
layout:
|
|
341
|
+
layout: loweredIr.viewBox !== void 0 ? viewBoxToLayout(loweredIr.viewBox, round) : computeLayout(allPoints, layoutPadding, round),
|
|
336
342
|
...resources.length > 0 ? { resources } : {}
|
|
337
343
|
};
|
|
338
344
|
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CompositeDefinition } from '../composites';
|
|
2
|
+
import { IR } from '../ir';
|
|
3
|
+
import { CompileWarning } from './compile';
|
|
4
|
+
/** composite 嵌套展开的默认最大深度(防环 / 防失控递归);可经 CompileOptions.maxCompositeDepth 覆盖 */
|
|
5
|
+
export declare const DEFAULT_MAX_COMPOSITE_DEPTH = 32;
|
|
6
|
+
type LowerOptions = {
|
|
7
|
+
onWarn: (warning: CompileWarning) => void;
|
|
8
|
+
maxDepth?: number;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Tier 2 lowering:把 IR 里的 composite 节点据注册表展开成 Tier 1
|
|
12
|
+
* @description compileToScene 第一步调用。DFS 遍历,`'namespace' in node` → tier2(据 `${namespace}.${type}`
|
|
13
|
+
* 查表 → `schema.parse(node)` 精确校验 + 强类型 → `expand` → 递归展开产物 fixpoint),否则 tier1(scope 递归
|
|
14
|
+
* children)。未注册 → `onWarn(COMPOSITE_NOT_REGISTERED)` + 跳过该节点(不进 Scene),继续编译其余;
|
|
15
|
+
* 环 / 超 `maxDepth` → throw(死循环防护)。无 tier2 节点时等价于原样返回。
|
|
16
|
+
*/
|
|
17
|
+
export declare const lowerComposites: (ir: IR, composites: Array<CompositeDefinition>, options: LowerOptions) => IR;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=lowerComposites.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lowerComposites.d.ts","sourceRoot":"","sources":["../../../src/compile/lowerComposites.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,EAAE,EAAW,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAoBF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAC1B,IAAI,EAAE,EACN,YAAY,KAAK,CAAC,mBAAmB,CAAC,EACtC,SAAS,YAAY,KACpB,EA8CF,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* 从注册项的 schema 提取 `namespace` / `type` 的 literal 值(建表 key)
|
|
4
|
+
* @description schema 须是 extend `CompositeBaseSchema` 的 ZodObject,且 namespace / type 为 z.literal;
|
|
5
|
+
* 否则注册期抛清晰错(不重复写 namespace / type 的代价是 schema 形态约束)。
|
|
6
|
+
*/
|
|
7
|
+
var extractKey = (schema) => {
|
|
8
|
+
if (!(schema instanceof z.ZodObject)) throw new Error("Composite schema must be a ZodObject extending CompositeBaseSchema.");
|
|
9
|
+
const shape = schema.shape;
|
|
10
|
+
const namespace = shape.namespace;
|
|
11
|
+
const type = shape.type;
|
|
12
|
+
if (!(namespace instanceof z.ZodLiteral) || !(type instanceof z.ZodLiteral)) throw new Error("Composite schema must declare `namespace` and `type` as z.literal(...).");
|
|
13
|
+
return {
|
|
14
|
+
namespace: String(namespace.value),
|
|
15
|
+
type: String(type.value)
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Tier 2 lowering:把 IR 里的 composite 节点据注册表展开成 Tier 1
|
|
20
|
+
* @description compileToScene 第一步调用。DFS 遍历,`'namespace' in node` → tier2(据 `${namespace}.${type}`
|
|
21
|
+
* 查表 → `schema.parse(node)` 精确校验 + 强类型 → `expand` → 递归展开产物 fixpoint),否则 tier1(scope 递归
|
|
22
|
+
* children)。未注册 → `onWarn(COMPOSITE_NOT_REGISTERED)` + 跳过该节点(不进 Scene),继续编译其余;
|
|
23
|
+
* 环 / 超 `maxDepth` → throw(死循环防护)。无 tier2 节点时等价于原样返回。
|
|
24
|
+
*/
|
|
25
|
+
var lowerComposites = (ir, composites, options) => {
|
|
26
|
+
const { onWarn, maxDepth = 32 } = options;
|
|
27
|
+
const registry = /* @__PURE__ */ new Map();
|
|
28
|
+
for (const definition of composites) {
|
|
29
|
+
const { namespace, type } = extractKey(definition.schema);
|
|
30
|
+
const key = `${namespace}.${type}`;
|
|
31
|
+
if (registry.has(key)) throw new Error(`Duplicate composite registration: '${key}'`);
|
|
32
|
+
registry.set(key, definition);
|
|
33
|
+
}
|
|
34
|
+
const expandList = (children, depth, path) => children.flatMap((child, index) => expandChild(child, depth, `${path}[${index}]`));
|
|
35
|
+
const expandChild = (child, depth, path) => {
|
|
36
|
+
if ("namespace" in child) {
|
|
37
|
+
const key = `${child.namespace}.${child.type}`;
|
|
38
|
+
const definition = registry.get(key);
|
|
39
|
+
if (!definition) {
|
|
40
|
+
onWarn({
|
|
41
|
+
code: "COMPOSITE_NOT_REGISTERED",
|
|
42
|
+
message: `No composite registered for '${key}'; the node is skipped.`,
|
|
43
|
+
path
|
|
44
|
+
});
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
if (depth >= maxDepth) throw new Error(`COMPOSITE_NEST_TOO_DEEP: composite expansion exceeded ${maxDepth} levels at ${path} (cyclic or runaway expand?)`);
|
|
48
|
+
const parsed = definition.schema.parse(child);
|
|
49
|
+
const produced = definition.expand(parsed);
|
|
50
|
+
return expandList(Array.isArray(produced) ? produced : [produced], depth + 1, path);
|
|
51
|
+
}
|
|
52
|
+
if (child.type === "scope") return [{
|
|
53
|
+
...child,
|
|
54
|
+
children: expandList(child.children, depth, `${path}.children`)
|
|
55
|
+
}];
|
|
56
|
+
return [child];
|
|
57
|
+
};
|
|
58
|
+
return {
|
|
59
|
+
...ir,
|
|
60
|
+
children: expandList(ir.children, 0, "children")
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
//#endregion
|
|
64
|
+
export { lowerComposites };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/compile/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAc,MAAM,EAAe,WAAW,EAAE,MAAM,OAAO,CAAC;AACvG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,KAAK,EAAa,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEnF,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,WAAW,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,KAAK,oBAAoB,EAAmB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/compile/node.ts"],"names":[],"mappings":"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"}
|
package/dist/es/compile/node.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BUILTIN_SHAPES } from "../shapes/index.js";
|
|
2
2
|
import { resolvePosition } from "./position.js";
|
|
3
|
+
import { toAlphabeticBaselineY } from "./text-baseline.js";
|
|
3
4
|
//#region src/compile/node.ts
|
|
4
5
|
var DEFAULT_FONT_SIZE = 14;
|
|
5
6
|
var DEFAULT_PADDING = 8;
|
|
@@ -383,18 +384,19 @@ var emitNodePrimitives = (layout, round, resolveFill) => {
|
|
|
383
384
|
if (layout.lines) {
|
|
384
385
|
const halfBlockW = layout.textWidth / 2;
|
|
385
386
|
const xOffset = layout.align === "start" ? -halfBlockW : layout.align === "end" ? halfBlockW : 0;
|
|
387
|
+
const lineHeight = round(layout.lineHeight);
|
|
386
388
|
inner.push({
|
|
387
389
|
type: "text",
|
|
388
390
|
x: round(layout.rect.x + xOffset),
|
|
389
|
-
y: round(layout.rect.y),
|
|
391
|
+
y: round(toAlphabeticBaselineY(layout.rect.y, "middle", layout.lines.length, lineHeight, layout.fontSize)),
|
|
390
392
|
lines: layout.lines,
|
|
391
393
|
fontSize: layout.fontSize,
|
|
392
394
|
fontFamily: layout.fontFamily,
|
|
393
395
|
fontWeight: layout.fontWeight,
|
|
394
396
|
fontStyle: layout.fontStyle,
|
|
395
397
|
align: layout.align,
|
|
396
|
-
baseline: "
|
|
397
|
-
lineHeight
|
|
398
|
+
baseline: "alphabetic",
|
|
399
|
+
lineHeight,
|
|
398
400
|
fill: layout.textColor ?? "currentColor",
|
|
399
401
|
opacity: layout.opacity,
|
|
400
402
|
measuredWidth: round(layout.textWidth),
|
|
@@ -426,18 +428,19 @@ var emitNodePrimitives = (layout, round, resolveFill) => {
|
|
|
426
428
|
opacity: lab.opacity ?? layout.opacity
|
|
427
429
|
});
|
|
428
430
|
}
|
|
431
|
+
const labLineHeight = round(lab.fontSize * DEFAULT_LINE_HEIGHT_FACTOR);
|
|
429
432
|
const textPrim = {
|
|
430
433
|
type: "text",
|
|
431
434
|
x: round(lx),
|
|
432
|
-
y: round(ly),
|
|
435
|
+
y: round(toAlphabeticBaselineY(ly, "middle", 1, labLineHeight, lab.fontSize)),
|
|
433
436
|
lines: [{ text: lab.text }],
|
|
434
437
|
fontSize: lab.fontSize,
|
|
435
438
|
fontFamily: lab.fontFamily,
|
|
436
439
|
fontWeight: lab.fontWeight,
|
|
437
440
|
fontStyle: lab.fontStyle,
|
|
438
441
|
align: "middle",
|
|
439
|
-
baseline: "
|
|
440
|
-
lineHeight:
|
|
442
|
+
baseline: "alphabetic",
|
|
443
|
+
lineHeight: labLineHeight,
|
|
441
444
|
fill: lab.textColor ?? "currentColor",
|
|
442
445
|
opacity: lab.opacity ?? layout.opacity,
|
|
443
446
|
measuredWidth: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/label.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAY,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/label.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAY,MAAM,iBAAiB,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAmBpD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,KAAK,WAAW,CAAC,UAAU,CAAC,KAAG,MAIhE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,WAAW,EAClB,QAAQ,aAAa,EACrB,aAAa,YAAY,EACzB,OAAO,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAC5B,cAAc,MAAM,KACnB;IAAE,SAAS,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;CAmGxD,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { toAlphabeticBaselineY } from "../text-baseline.js";
|
|
1
2
|
//#region src/compile/path/label.ts
|
|
2
3
|
/** 边标注默认字号 / 偏移量 */
|
|
3
4
|
var LABEL_FONT_SIZE = 14;
|
|
@@ -60,15 +61,16 @@ var emitLabelPrimitive = (label, sample, measureText, round, hostOpacity) => {
|
|
|
60
61
|
x += LABEL_SIDE_OFFSET;
|
|
61
62
|
align = "start";
|
|
62
63
|
} else baseline = "bottom";
|
|
64
|
+
const emittedLineHeight = round(lineHeight);
|
|
63
65
|
const text = {
|
|
64
66
|
type: "text",
|
|
65
67
|
x: round(x),
|
|
66
|
-
y: round(y),
|
|
68
|
+
y: round(toAlphabeticBaselineY(y, baseline, 1, emittedLineHeight, fontSize)),
|
|
67
69
|
lines: [{ text: label.text }],
|
|
68
70
|
fontSize,
|
|
69
71
|
align,
|
|
70
|
-
baseline,
|
|
71
|
-
lineHeight:
|
|
72
|
+
baseline: "alphabetic",
|
|
73
|
+
lineHeight: emittedLineHeight,
|
|
72
74
|
measuredWidth: round(measuredWidth),
|
|
73
75
|
measuredHeight: round(measuredHeight),
|
|
74
76
|
fill: label.textColor ?? "currentColor"
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文本垂直定位归一:任意 baseline 锚点 → 首行 alphabetic 基线 y
|
|
3
|
+
* @description canvas 的 `textBaseline` 与 SVG 的 `dominant-baseline` 是两套同名异义的关键字
|
|
4
|
+
* (`top/middle/bottom` 各按「em 方块」与「字体 ascent/descent」两种不同参照线解释),
|
|
5
|
+
* 只有 `alphabetic`(拉丁字母坐的底线)在两套模型、各浏览器里定义一致。故 core 在编译期把
|
|
6
|
+
* 所有文本的垂直锚点统一折算成首行 alphabetic 基线、emit `baseline: 'alphabetic'`,让 adapter
|
|
7
|
+
* 只渲染这一条无歧义的基线 —— 跨后端像素一致,垂直定位逻辑收口到 renderer-agnostic 的 core。
|
|
8
|
+
*
|
|
9
|
+
* 无字体测量器时用下方 ascent/descent 近似(占一个 em,asc 8 : desc 2 拆分),renderer-agnostic
|
|
10
|
+
* 且两后端一致;接入精确测量器后只需替换 asc/desc 来源,折算公式不变。
|
|
11
|
+
*/
|
|
12
|
+
/** ascent 近似占 fontSize 比例(基线之上) */
|
|
13
|
+
export declare const ASCENT_FACTOR = 0.8;
|
|
14
|
+
/** descent 近似占 fontSize 比例(基线之下) */
|
|
15
|
+
export declare const DESCENT_FACTOR = 0.2;
|
|
16
|
+
/**
|
|
17
|
+
* 把按 `baseline` 解释的垂直锚点 `y` 折算成首行 alphabetic 基线 y
|
|
18
|
+
* @description 多行文本首行基线在上、后续行按 lineHeight 向下堆叠;折算保持「关键字所指的块边界
|
|
19
|
+
* (top=块顶 ascent 线 / bottom=块底 descent 线 / middle=视觉中心 / alphabetic=首行基线)落在 y」。
|
|
20
|
+
* @param y - 原垂直锚点(含义由 baseline 决定)
|
|
21
|
+
* @param baseline - 锚点语义
|
|
22
|
+
* @param lineCount - 文本行数(≥1)
|
|
23
|
+
* @param lineHeight - 行高(相邻行基线间距)
|
|
24
|
+
* @param fontSize - 字号(算 ascent/descent 用)
|
|
25
|
+
* @returns 首行 alphabetic 基线 y
|
|
26
|
+
*/
|
|
27
|
+
export declare const toAlphabeticBaselineY: (y: number, baseline: "top" | "middle" | "bottom" | "alphabetic", lineCount: number, lineHeight: number, fontSize: number) => number;
|
|
28
|
+
//# sourceMappingURL=text-baseline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-baseline.d.ts","sourceRoot":"","sources":["../../../src/compile/text-baseline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,mCAAmC;AACnC,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC,oCAAoC;AACpC,eAAO,MAAM,cAAc,MAAM,CAAC;AAElC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,GAChC,GAAG,MAAM,EACT,UAAU,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,EACpD,WAAW,MAAM,EACjB,YAAY,MAAM,EAClB,UAAU,MAAM,KACf,MAcF,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
//#region src/compile/text-baseline.ts
|
|
2
|
+
/**
|
|
3
|
+
* 文本垂直定位归一:任意 baseline 锚点 → 首行 alphabetic 基线 y
|
|
4
|
+
* @description canvas 的 `textBaseline` 与 SVG 的 `dominant-baseline` 是两套同名异义的关键字
|
|
5
|
+
* (`top/middle/bottom` 各按「em 方块」与「字体 ascent/descent」两种不同参照线解释),
|
|
6
|
+
* 只有 `alphabetic`(拉丁字母坐的底线)在两套模型、各浏览器里定义一致。故 core 在编译期把
|
|
7
|
+
* 所有文本的垂直锚点统一折算成首行 alphabetic 基线、emit `baseline: 'alphabetic'`,让 adapter
|
|
8
|
+
* 只渲染这一条无歧义的基线 —— 跨后端像素一致,垂直定位逻辑收口到 renderer-agnostic 的 core。
|
|
9
|
+
*
|
|
10
|
+
* 无字体测量器时用下方 ascent/descent 近似(占一个 em,asc 8 : desc 2 拆分),renderer-agnostic
|
|
11
|
+
* 且两后端一致;接入精确测量器后只需替换 asc/desc 来源,折算公式不变。
|
|
12
|
+
*/
|
|
13
|
+
/** ascent 近似占 fontSize 比例(基线之上) */
|
|
14
|
+
var ASCENT_FACTOR = .8;
|
|
15
|
+
/** descent 近似占 fontSize 比例(基线之下) */
|
|
16
|
+
var DESCENT_FACTOR = .2;
|
|
17
|
+
/**
|
|
18
|
+
* 把按 `baseline` 解释的垂直锚点 `y` 折算成首行 alphabetic 基线 y
|
|
19
|
+
* @description 多行文本首行基线在上、后续行按 lineHeight 向下堆叠;折算保持「关键字所指的块边界
|
|
20
|
+
* (top=块顶 ascent 线 / bottom=块底 descent 线 / middle=视觉中心 / alphabetic=首行基线)落在 y」。
|
|
21
|
+
* @param y - 原垂直锚点(含义由 baseline 决定)
|
|
22
|
+
* @param baseline - 锚点语义
|
|
23
|
+
* @param lineCount - 文本行数(≥1)
|
|
24
|
+
* @param lineHeight - 行高(相邻行基线间距)
|
|
25
|
+
* @param fontSize - 字号(算 ascent/descent 用)
|
|
26
|
+
* @returns 首行 alphabetic 基线 y
|
|
27
|
+
*/
|
|
28
|
+
var toAlphabeticBaselineY = (y, baseline, lineCount, lineHeight, fontSize) => {
|
|
29
|
+
const asc = fontSize * ASCENT_FACTOR;
|
|
30
|
+
const desc = fontSize * DESCENT_FACTOR;
|
|
31
|
+
const span = (lineCount - 1) * lineHeight;
|
|
32
|
+
switch (baseline) {
|
|
33
|
+
case "top": return y + asc;
|
|
34
|
+
case "bottom": return y - span - desc;
|
|
35
|
+
case "middle": return y - span / 2 + (asc - desc) / 2;
|
|
36
|
+
case "alphabetic": return y;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
//#endregion
|
|
40
|
+
export { toAlphabeticBaselineY };
|
|
@@ -22,7 +22,7 @@ export type TextMetrics = {
|
|
|
22
22
|
};
|
|
23
23
|
/**
|
|
24
24
|
* 文字度量函数接口(编译期由 adapter 注入)
|
|
25
|
-
* @description @retikz/react: canvas measureText;@retikz/ssr: opentype.js/fontkit;@retikz/canvas: ctx.measureText
|
|
25
|
+
* @description @retikz/react: canvas measureText;@retikz/ssr: opentype.js/fontkit;@retikz/render/canvas: ctx.measureText
|
|
26
26
|
*/
|
|
27
27
|
export type TextMeasurer = (text: string, font: FontSpec) => TextMetrics;
|
|
28
28
|
/**
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/composites/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ZodType } from 'zod';
|
|
2
|
+
import { IRChild } from '../ir';
|
|
3
|
+
/**
|
|
4
|
+
* Tier 2 composite 注册项
|
|
5
|
+
* @description domain 包注册一个 Tier 2 type 的全部契约。`schema` 是完整节点 schema(extend `CompositeBaseSchema`,
|
|
6
|
+
* 含 namespace / type literal + 字段 + describe);`expand` 收 `schema.parse` 后的强类型节点、产 Tier 1。
|
|
7
|
+
* namespace / type 由 core 从 schema 的 literal 提取,不在此重复写。配 `defineComposite` 获得强类型 `expand`。
|
|
8
|
+
*/
|
|
9
|
+
export type CompositeDefinition<T = unknown> = {
|
|
10
|
+
/** 完整节点 schema(extend CompositeBaseSchema;namespace / type 为 literal) */
|
|
11
|
+
schema: ZodType<T>;
|
|
12
|
+
/** 把该 composite 节点展开成 Tier 1 IR 的纯函数;据节点字段不同产不同子树 */
|
|
13
|
+
expand: (node: T) => IRChild | Array<IRChild>;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* 注册一个 Tier 2 composite(保留 `expand` 的强类型节点参数)
|
|
17
|
+
* @description domain 包用它注册:`expand` 的 node 自动推断为 `z.infer<typeof schema>`;返回值擦除泛型,
|
|
18
|
+
* 可放进 `CompileOptions.composites: Array<CompositeDefinition>`。对齐 `definePathGenerator`。
|
|
19
|
+
*/
|
|
20
|
+
export declare const defineComposite: <T>(definition: CompositeDefinition<T>) => CompositeDefinition;
|
|
21
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/composites/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAErC;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,GAAG,OAAO,IAAI;IAC7C,yEAAyE;IACzE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,qDAAqD;IACrD,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;CAC/C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,YAAY,mBAAmB,CAAC,CAAC,CAAC,KAAG,mBACrC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/composites/types.ts
|
|
2
|
+
/**
|
|
3
|
+
* 注册一个 Tier 2 composite(保留 `expand` 的强类型节点参数)
|
|
4
|
+
* @description domain 包用它注册:`expand` 的 node 自动推断为 `z.infer<typeof schema>`;返回值擦除泛型,
|
|
5
|
+
* 可放进 `CompileOptions.composites: Array<CompositeDefinition>`。对齐 `definePathGenerator`。
|
|
6
|
+
*/
|
|
7
|
+
var defineComposite = (definition) => definition;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { defineComposite };
|
package/dist/es/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @retikz/core 公开 API
|
|
3
|
-
* @description 任何 framework adapter(@retikz/react、@retikz/vue、@retikz/canvas、@retikz/ssr)只能 import 本文件导出内容,不准走子路径。本包零 React/零 DOM 依赖
|
|
3
|
+
* @description 任何 framework adapter(@retikz/react、@retikz/vue、@retikz/render/canvas、@retikz/ssr)只能 import 本文件导出内容,不准走子路径。本包零 React/零 DOM 依赖
|
|
4
4
|
*/
|
|
5
|
-
export { PositionSchema, PolarPositionSchema, AtPositionSchema, OffsetPositionSchema, AT_DIRECTIONS, TargetSchema, AnchorRefSchema, NodeTargetSchema, RelativeTargetSchema, RelativeAccumulateTargetSchema, AbsoluteTargetSchema, BetweenPositionSchema, MoveStepSchema, LineStepSchema, FoldStepSchema, CycleStepSchema, CurveStepSchema, CubicStepSchema, BendStepSchema, ArcStepSchema, CirclePathStepSchema, EllipsePathStepSchema, RectangleStepSchema, GeneratorStepSchema, ControlPointSchema, StepLabelSchema, StepSchema, NodeSchema, NodeLabelSchema, CoordinateSchema, FontSchema, TextBlockSchema, LineSpecSchema, PathSchema, ArrowDetailSchema, ArrowEndDetailSchema, ScopeSchema, NodeDefaultSchema, PathDefaultSchema, LabelDefaultSchema, ArrowDefaultSchema, TransformSchema, ChildSchema, SceneSchema, CURRENT_IR_VERSION, PaintSpecSchema, GradientStopSchema, JsonValueSchema, JsonObjectSchema, ClipSpecSchema, ViewBoxSchema, } from './ir';
|
|
6
|
-
export type { IRPosition, IRAtPosition, IROffsetPosition, AtDirection, IRTarget, IRAnchorRef, IRNodeTarget, IRRelativeTarget, IRRelativeAccumulateTarget, IRAbsoluteTarget, IRBetweenPosition, IRMoveStep, IRLineStep, IRFoldStep, IRCycleStep, IRCurveStep, IRCubicStep, IRBendStep, IRArcStep, IRCirclePathStep, IREllipsePathStep, IRRectangleStep, IRGeneratorStep, IRControlPoint, IRStepLabel, IRStep, IRNode, IRNodeLabel, IRCoordinate, IRFont, IRLineSpec, IRTextBlock, IRPath, IRScope, IRNodeDefault, IRPathDefault, IRLabelDefault, IRArrowDefault, StyleChannel, IRTransform, IRTranslateTransform, IRPolarTranslateTransform, IRAtTranslateTransform, IROffsetTranslateTransform, IRRotateTransform, IRScaleTransform, IRChild, IR, ArrowShape, BuiltinArrowName, ArrowShapeName, IRArrowDetail, IRArrowEndDetail, NodeShape, BuiltinShapeName, NodeTextAlign, PatternShapeName, BuiltinPatternName, IRPaintSpec, IRGradientStop, JsonValue, IRJsonObject, IRClipSpec, IRViewBox, } from './ir';
|
|
5
|
+
export { PositionSchema, PolarPositionSchema, AtPositionSchema, OffsetPositionSchema, AT_DIRECTIONS, TargetSchema, AnchorRefSchema, NodeTargetSchema, RelativeTargetSchema, RelativeAccumulateTargetSchema, AbsoluteTargetSchema, BetweenPositionSchema, MoveStepSchema, LineStepSchema, FoldStepSchema, CycleStepSchema, CurveStepSchema, CubicStepSchema, BendStepSchema, ArcStepSchema, CirclePathStepSchema, EllipsePathStepSchema, RectangleStepSchema, GeneratorStepSchema, ControlPointSchema, StepLabelSchema, StepSchema, NodeSchema, NodeLabelSchema, CoordinateSchema, FontSchema, TextBlockSchema, LineSpecSchema, PathSchema, ArrowDetailSchema, ArrowEndDetailSchema, ScopeSchema, CompositeBaseSchema, NodeDefaultSchema, PathDefaultSchema, LabelDefaultSchema, ArrowDefaultSchema, TransformSchema, ChildSchema, SceneSchema, CURRENT_IR_VERSION, PaintSpecSchema, GradientStopSchema, JsonValueSchema, JsonObjectSchema, ClipSpecSchema, ViewBoxSchema, } from './ir';
|
|
6
|
+
export type { IRPosition, IRAtPosition, IROffsetPosition, AtDirection, IRTarget, IRAnchorRef, IRNodeTarget, IRRelativeTarget, IRRelativeAccumulateTarget, IRAbsoluteTarget, IRBetweenPosition, IRMoveStep, IRLineStep, IRFoldStep, IRCycleStep, IRCurveStep, IRCubicStep, IRBendStep, IRArcStep, IRCirclePathStep, IREllipsePathStep, IRRectangleStep, IRGeneratorStep, IRControlPoint, IRStepLabel, IRStep, IRNode, IRNodeLabel, IRCoordinate, IRFont, IRLineSpec, IRTextBlock, IRPath, IRScope, IRComposite, IRNodeDefault, IRPathDefault, IRLabelDefault, IRArrowDefault, StyleChannel, IRTransform, IRTranslateTransform, IRPolarTranslateTransform, IRAtTranslateTransform, IROffsetTranslateTransform, IRRotateTransform, IRScaleTransform, IRChild, IR, ArrowShape, BuiltinArrowName, ArrowShapeName, IRArrowDetail, IRArrowEndDetail, NodeShape, BuiltinShapeName, NodeTextAlign, PatternShapeName, BuiltinPatternName, IRPaintSpec, IRGradientStop, JsonValue, IRJsonObject, IRClipSpec, IRViewBox, } from './ir';
|
|
7
7
|
export { ARROW_SHAPES, DEFAULT_ARROW_SHAPE, HOLLOW_ARROW_SHAPES, ARROW_MARKER_DEFAULT_SIZE, ARROW_MARKER_HOLLOW_DEFAULT_LINE_WIDTH, NODE_SHAPES, NODE_TEXT_ALIGNS, PATTERN_SHAPES, } from './ir';
|
|
8
8
|
export type { ScenePrimitive, RectPrim, EllipsePrim, TextPrim, TextLine, PathPrim, PathCommand,
|
|
9
9
|
/** 7 个 named PathCommand 分支(便于 wrapper / Pick<>) */
|
|
@@ -30,5 +30,7 @@ export type { PatternDefinition, PatternEmitContext } from './patterns';
|
|
|
30
30
|
export { BUILTIN_PATTERNS } from './patterns';
|
|
31
31
|
export type { PathGeneratorDefinition, PathGeneratorContext } from './pathGenerators';
|
|
32
32
|
export { definePathGenerator } from './pathGenerators';
|
|
33
|
+
export type { CompositeDefinition } from './composites';
|
|
34
|
+
export { defineComposite } from './composites';
|
|
33
35
|
export type { ValueOf, AssertEqual } from './types';
|
|
34
36
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/es/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/es/index.js
CHANGED
|
@@ -18,6 +18,7 @@ import { NODE_SHAPES, NODE_TEXT_ALIGNS, NodeLabelSchema, NodeSchema } from "./ir
|
|
|
18
18
|
import { CoordinateSchema } from "./ir/coordinate.js";
|
|
19
19
|
import { TransformSchema } from "./ir/transform.js";
|
|
20
20
|
import { ArrowDefaultSchema, LabelDefaultSchema, NodeDefaultSchema, PathDefaultSchema, ScopeSchema } from "./ir/scope.js";
|
|
21
|
+
import { CompositeBaseSchema } from "./ir/composite.js";
|
|
21
22
|
import { CURRENT_IR_VERSION, ChildSchema, SceneSchema, ViewBoxSchema } from "./ir/scene.js";
|
|
22
23
|
import { circle } from "./geometry/circle.js";
|
|
23
24
|
import { ellipse } from "./geometry/ellipse.js";
|
|
@@ -34,4 +35,5 @@ import { DrawWay, parseWay } from "./parsers/parseWay.js";
|
|
|
34
35
|
import { polar } from "./geometry/polar.js";
|
|
35
36
|
import { point } from "./geometry/point.js";
|
|
36
37
|
import { definePathGenerator } from "./pathGenerators/define.js";
|
|
37
|
-
|
|
38
|
+
import { defineComposite } from "./composites/types.js";
|
|
39
|
+
export { ARROW_MARKER_DEFAULT_SIZE, ARROW_MARKER_HOLLOW_DEFAULT_LINE_WIDTH, ARROW_SHAPES, AT_DIRECTIONS, AbsoluteTargetSchema, AnchorRefSchema, ArcStepSchema, ArrowDefaultSchema, ArrowDetailSchema, ArrowEndDetailSchema, AtPositionSchema, BUILTIN_ARROWS, BUILTIN_PATTERNS, BUILTIN_SHAPES, BendStepSchema, BetweenPositionSchema, CURRENT_IR_VERSION, ChildSchema, CirclePathStepSchema, ClipSpecSchema, CompositeBaseSchema, ControlPointSchema, CoordinateSchema, CubicStepSchema, CurveStepSchema, CycleStepSchema, DEFAULT_ARROW_SHAPE, DrawWay, EllipsePathStepSchema, FoldStepSchema, FontSchema, GeneratorStepSchema, GradientStopSchema, HOLLOW_ARROW_SHAPES, JsonObjectSchema, JsonValueSchema, LabelDefaultSchema, LineSpecSchema, LineStepSchema, MoveStepSchema, NODE_SHAPES, NODE_TEXT_ALIGNS, NodeDefaultSchema, NodeLabelSchema, NodeSchema, NodeTargetSchema, OffsetPositionSchema, PATTERN_SHAPES, PaintSpecSchema, PathDefaultSchema, PathSchema, PolarPositionSchema, PositionSchema, RECT_ANCHORS, RectangleStepSchema, RelativeAccumulateTargetSchema, RelativeTargetSchema, SceneSchema, ScopeSchema, StepLabelSchema, StepSchema, TargetSchema, TextBlockSchema, TransformSchema, ViewBoxSchema, circle, compileToScene, computeLayout, defineComposite, definePathGenerator, diamond, ellipse, fallbackMeasurer, localToWorld, parseNodeTarget, parseTargetSugar, parseWay, point, polar, rect, worldToLocal };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Tier 2 节点基础 schema:定义所有 composite 必填的 namespace / type
|
|
4
|
+
* @description domain 包用 zod `.extend()` 继承本 schema,把 namespace / type 收窄为 literal 并加领域字段,
|
|
5
|
+
* 产出像 Node 一样字段一等、每字段带 describe 的完整节点 schema。core 据 namespace + type 的 literal 路由展开。
|
|
6
|
+
*/
|
|
7
|
+
export declare const CompositeBaseSchema: z.ZodObject<{
|
|
8
|
+
namespace: z.ZodString;
|
|
9
|
+
type: z.ZodString;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
type: string;
|
|
12
|
+
namespace: string;
|
|
13
|
+
}, {
|
|
14
|
+
type: string;
|
|
15
|
+
namespace: string;
|
|
16
|
+
}>;
|
|
17
|
+
/**
|
|
18
|
+
* core 静态校验所有 tier2 节点的开放 schema
|
|
19
|
+
* @description 只校验「有 namespace + type」(passthrough 放行领域字段);精确字段校验在 compile 期由
|
|
20
|
+
* `lowerComposites` 用注册的领域 schema `.parse(node)` 完成。tier1 节点无 namespace,与 tier2 互斥分流。
|
|
21
|
+
*/
|
|
22
|
+
export declare const CompositeNodeSchema: z.ZodObject<{
|
|
23
|
+
namespace: z.ZodString;
|
|
24
|
+
type: z.ZodString;
|
|
25
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
26
|
+
namespace: z.ZodString;
|
|
27
|
+
type: z.ZodString;
|
|
28
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
29
|
+
namespace: z.ZodString;
|
|
30
|
+
type: z.ZodString;
|
|
31
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
32
|
+
/** Tier 2 开放节点 IR 类型(宽松;精确类型由各 domain schema 的 z.infer 给出) */
|
|
33
|
+
export type IRComposite = {
|
|
34
|
+
namespace: string;
|
|
35
|
+
type: string;
|
|
36
|
+
} & Record<string, unknown>;
|
|
37
|
+
//# sourceMappingURL=composite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composite.d.ts","sourceRoot":"","sources":["../../../src/ir/composite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;EAS9B,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;gCAAoC,CAAC;AAErE,8DAA8D;AAC9D,MAAM,MAAM,WAAW,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
//#region src/ir/composite.ts
|
|
3
|
+
/**
|
|
4
|
+
* Tier 2 节点基础 schema:定义所有 composite 必填的 namespace / type
|
|
5
|
+
* @description domain 包用 zod `.extend()` 继承本 schema,把 namespace / type 收窄为 literal 并加领域字段,
|
|
6
|
+
* 产出像 Node 一样字段一等、每字段带 describe 的完整节点 schema。core 据 namespace + type 的 literal 路由展开。
|
|
7
|
+
*/
|
|
8
|
+
var CompositeBaseSchema = z.object({
|
|
9
|
+
namespace: z.string().min(1).describe("Tier 2 domain namespace (e.g. \"plot\") routing which registered definition expands this node."),
|
|
10
|
+
type: z.string().min(1).describe("Composite type name within the namespace (e.g. \"axis\"); analogous to a Tier 1 node type.")
|
|
11
|
+
});
|
|
12
|
+
/**
|
|
13
|
+
* core 静态校验所有 tier2 节点的开放 schema
|
|
14
|
+
* @description 只校验「有 namespace + type」(passthrough 放行领域字段);精确字段校验在 compile 期由
|
|
15
|
+
* `lowerComposites` 用注册的领域 schema `.parse(node)` 完成。tier1 节点无 namespace,与 tier2 互斥分流。
|
|
16
|
+
*/
|
|
17
|
+
var CompositeNodeSchema = CompositeBaseSchema.passthrough();
|
|
18
|
+
//#endregion
|
|
19
|
+
export { CompositeBaseSchema, CompositeNodeSchema };
|
package/dist/es/ir/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ir/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ir/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
|