@retikz/core 0.1.0-alpha.5 → 0.1.0-beta.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 (231) hide show
  1. package/dist/es/compile/compile.d.ts +20 -3
  2. package/dist/es/compile/compile.d.ts.map +1 -1
  3. package/dist/es/compile/compile.js +44 -19
  4. package/dist/es/compile/index.d.ts +2 -2
  5. package/dist/es/compile/index.d.ts.map +1 -1
  6. package/dist/es/compile/layout.d.ts +5 -0
  7. package/dist/es/compile/layout.d.ts.map +1 -0
  8. package/dist/es/compile/{view-box.js → layout.js} +4 -4
  9. package/dist/es/compile/node.d.ts +4 -4
  10. package/dist/es/compile/node.d.ts.map +1 -1
  11. package/dist/es/compile/node.js +7 -7
  12. package/dist/es/compile/path/anchor.d.ts +19 -0
  13. package/dist/es/compile/path/anchor.d.ts.map +1 -0
  14. package/dist/es/compile/path/anchor.js +54 -0
  15. package/dist/es/compile/path/arrow-geometry.d.ts +22 -0
  16. package/dist/es/compile/path/arrow-geometry.d.ts.map +1 -0
  17. package/dist/es/compile/path/arrow-geometry.js +40 -0
  18. package/dist/es/compile/{path.d.ts → path/index.d.ts} +18 -7
  19. package/dist/es/compile/path/index.d.ts.map +1 -0
  20. package/dist/es/compile/path/index.js +308 -0
  21. package/dist/es/compile/path/label.d.ts +18 -0
  22. package/dist/es/compile/path/label.d.ts.map +1 -0
  23. package/dist/es/compile/path/label.js +102 -0
  24. package/dist/es/compile/path/relative.d.ts +8 -0
  25. package/dist/es/compile/path/relative.d.ts.map +1 -0
  26. package/dist/es/compile/path/relative.js +48 -0
  27. package/dist/es/compile/path/shrink.d.ts +18 -0
  28. package/dist/es/compile/path/shrink.d.ts.map +1 -0
  29. package/dist/es/compile/path/shrink.js +126 -0
  30. package/dist/es/compile/path/split.d.ts +15 -0
  31. package/dist/es/compile/path/split.d.ts.map +1 -0
  32. package/dist/es/compile/path/split.js +46 -0
  33. package/dist/es/compile/text-metrics.d.ts +4 -1
  34. package/dist/es/compile/text-metrics.d.ts.map +1 -1
  35. package/dist/es/compile/text-metrics.js +11 -5
  36. package/dist/es/geometry/_transform.d.ts +21 -0
  37. package/dist/es/geometry/_transform.d.ts.map +1 -0
  38. package/dist/es/geometry/_transform.js +27 -0
  39. package/dist/es/geometry/bend.d.ts +1 -1
  40. package/dist/es/geometry/bend.js +1 -1
  41. package/dist/es/geometry/circle.d.ts +2 -3
  42. package/dist/es/geometry/circle.d.ts.map +1 -1
  43. package/dist/es/geometry/circle.js +1 -16
  44. package/dist/es/geometry/diamond.d.ts +2 -3
  45. package/dist/es/geometry/diamond.d.ts.map +1 -1
  46. package/dist/es/geometry/diamond.js +1 -16
  47. package/dist/es/geometry/ellipse.d.ts +2 -3
  48. package/dist/es/geometry/ellipse.d.ts.map +1 -1
  49. package/dist/es/geometry/ellipse.js +1 -16
  50. package/dist/es/geometry/polar.d.ts +2 -2
  51. package/dist/es/geometry/polar.d.ts.map +1 -1
  52. package/dist/es/geometry/polar.js +2 -6
  53. package/dist/es/geometry/rect.d.ts.map +1 -1
  54. package/dist/es/geometry/rect.js +1 -18
  55. package/dist/es/geometry/segment.d.ts +5 -1
  56. package/dist/es/geometry/segment.d.ts.map +1 -1
  57. package/dist/es/index.d.ts +11 -7
  58. package/dist/es/index.d.ts.map +1 -1
  59. package/dist/es/index.js +5 -2
  60. package/dist/es/ir/coordinate.d.ts +1 -1
  61. package/dist/es/ir/coordinate.js +1 -1
  62. package/dist/es/ir/font.d.ts +21 -0
  63. package/dist/es/ir/font.d.ts.map +1 -0
  64. package/dist/es/ir/font.js +15 -0
  65. package/dist/es/ir/index.d.ts +2 -0
  66. package/dist/es/ir/index.d.ts.map +1 -1
  67. package/dist/es/ir/node.d.ts +32 -143
  68. package/dist/es/ir/node.d.ts.map +1 -1
  69. package/dist/es/ir/node.js +7 -31
  70. package/dist/es/ir/path/arrow.d.ts +14 -14
  71. package/dist/es/ir/path/arrow.d.ts.map +1 -1
  72. package/dist/es/ir/path/arrow.js +5 -5
  73. package/dist/es/ir/path/path.d.ts +19 -19
  74. package/dist/es/ir/path/path.d.ts.map +1 -1
  75. package/dist/es/ir/path/path.js +4 -4
  76. package/dist/es/ir/path/step.d.ts +1 -1
  77. package/dist/es/ir/path/step.d.ts.map +1 -1
  78. package/dist/es/ir/path/step.js +8 -8
  79. package/dist/es/ir/position/at-position.js +1 -1
  80. package/dist/es/ir/position/offset-position.js +1 -1
  81. package/dist/es/ir/position/polar-position.d.ts.map +1 -1
  82. package/dist/es/ir/position/polar-position.js +2 -2
  83. package/dist/es/ir/position/position.d.ts.map +1 -1
  84. package/dist/es/ir/position/position.js +1 -1
  85. package/dist/es/ir/scene.d.ts +128 -128
  86. package/dist/es/ir/text.d.ts +96 -0
  87. package/dist/es/ir/text.d.ts.map +1 -0
  88. package/dist/es/ir/text.js +20 -0
  89. package/dist/es/parsers/parseTargetSugar.d.ts +4 -0
  90. package/dist/es/parsers/parseTargetSugar.d.ts.map +1 -1
  91. package/dist/es/parsers/parseTargetSugar.js +3 -2
  92. package/dist/es/primitive/ellipse.d.ts +3 -3
  93. package/dist/es/primitive/ellipse.d.ts.map +1 -1
  94. package/dist/es/primitive/group.d.ts +23 -7
  95. package/dist/es/primitive/group.d.ts.map +1 -1
  96. package/dist/es/primitive/index.d.ts +1 -1
  97. package/dist/es/primitive/index.d.ts.map +1 -1
  98. package/dist/es/primitive/layout.d.ts +12 -0
  99. package/dist/es/primitive/layout.d.ts.map +1 -0
  100. package/dist/es/primitive/path.d.ts +55 -15
  101. package/dist/es/primitive/path.d.ts.map +1 -1
  102. package/dist/es/primitive/rect.d.ts +3 -3
  103. package/dist/es/primitive/rect.d.ts.map +1 -1
  104. package/dist/es/primitive/scene.d.ts +4 -4
  105. package/dist/es/primitive/scene.d.ts.map +1 -1
  106. package/dist/es/primitive/text.d.ts +10 -3
  107. package/dist/es/primitive/text.d.ts.map +1 -1
  108. package/dist/es/types.d.ts +8 -0
  109. package/dist/es/types.d.ts.map +1 -1
  110. package/dist/lib/compile/compile.cjs +44 -19
  111. package/dist/lib/compile/compile.d.ts +20 -3
  112. package/dist/lib/compile/compile.d.ts.map +1 -1
  113. package/dist/lib/compile/index.d.ts +2 -2
  114. package/dist/lib/compile/index.d.ts.map +1 -1
  115. package/dist/lib/compile/{view-box.cjs → layout.cjs} +4 -4
  116. package/dist/lib/compile/layout.d.ts +5 -0
  117. package/dist/lib/compile/layout.d.ts.map +1 -0
  118. package/dist/lib/compile/node.cjs +7 -7
  119. package/dist/lib/compile/node.d.ts +4 -4
  120. package/dist/lib/compile/node.d.ts.map +1 -1
  121. package/dist/lib/compile/path/anchor.cjs +58 -0
  122. package/dist/lib/compile/path/anchor.d.ts +19 -0
  123. package/dist/lib/compile/path/anchor.d.ts.map +1 -0
  124. package/dist/lib/compile/path/arrow-geometry.cjs +41 -0
  125. package/dist/lib/compile/path/arrow-geometry.d.ts +22 -0
  126. package/dist/lib/compile/path/arrow-geometry.d.ts.map +1 -0
  127. package/dist/lib/compile/path/index.cjs +308 -0
  128. package/dist/lib/compile/{path.d.ts → path/index.d.ts} +18 -7
  129. package/dist/lib/compile/path/index.d.ts.map +1 -0
  130. package/dist/lib/compile/path/label.cjs +103 -0
  131. package/dist/lib/compile/path/label.d.ts +18 -0
  132. package/dist/lib/compile/path/label.d.ts.map +1 -0
  133. package/dist/lib/compile/path/relative.cjs +48 -0
  134. package/dist/lib/compile/path/relative.d.ts +8 -0
  135. package/dist/lib/compile/path/relative.d.ts.map +1 -0
  136. package/dist/lib/compile/path/shrink.cjs +128 -0
  137. package/dist/lib/compile/path/shrink.d.ts +18 -0
  138. package/dist/lib/compile/path/shrink.d.ts.map +1 -0
  139. package/dist/lib/compile/path/split.cjs +46 -0
  140. package/dist/lib/compile/path/split.d.ts +15 -0
  141. package/dist/lib/compile/path/split.d.ts.map +1 -0
  142. package/dist/lib/compile/text-metrics.cjs +11 -5
  143. package/dist/lib/compile/text-metrics.d.ts +4 -1
  144. package/dist/lib/compile/text-metrics.d.ts.map +1 -1
  145. package/dist/lib/geometry/_transform.cjs +28 -0
  146. package/dist/lib/geometry/_transform.d.ts +21 -0
  147. package/dist/lib/geometry/_transform.d.ts.map +1 -0
  148. package/dist/lib/geometry/bend.cjs +1 -1
  149. package/dist/lib/geometry/bend.d.ts +1 -1
  150. package/dist/lib/geometry/circle.cjs +5 -20
  151. package/dist/lib/geometry/circle.d.ts +2 -3
  152. package/dist/lib/geometry/circle.d.ts.map +1 -1
  153. package/dist/lib/geometry/diamond.cjs +5 -20
  154. package/dist/lib/geometry/diamond.d.ts +2 -3
  155. package/dist/lib/geometry/diamond.d.ts.map +1 -1
  156. package/dist/lib/geometry/ellipse.cjs +5 -20
  157. package/dist/lib/geometry/ellipse.d.ts +2 -3
  158. package/dist/lib/geometry/ellipse.d.ts.map +1 -1
  159. package/dist/lib/geometry/polar.cjs +2 -6
  160. package/dist/lib/geometry/polar.d.ts +2 -2
  161. package/dist/lib/geometry/polar.d.ts.map +1 -1
  162. package/dist/lib/geometry/rect.cjs +5 -22
  163. package/dist/lib/geometry/rect.d.ts.map +1 -1
  164. package/dist/lib/geometry/segment.d.ts +5 -1
  165. package/dist/lib/geometry/segment.d.ts.map +1 -1
  166. package/dist/lib/index.cjs +7 -3
  167. package/dist/lib/index.d.ts +11 -7
  168. package/dist/lib/index.d.ts.map +1 -1
  169. package/dist/lib/ir/coordinate.cjs +1 -1
  170. package/dist/lib/ir/coordinate.d.ts +1 -1
  171. package/dist/lib/ir/font.cjs +15 -0
  172. package/dist/lib/ir/font.d.ts +21 -0
  173. package/dist/lib/ir/font.d.ts.map +1 -0
  174. package/dist/lib/ir/index.d.ts +2 -0
  175. package/dist/lib/ir/index.d.ts.map +1 -1
  176. package/dist/lib/ir/node.cjs +8 -35
  177. package/dist/lib/ir/node.d.ts +32 -143
  178. package/dist/lib/ir/node.d.ts.map +1 -1
  179. package/dist/lib/ir/path/arrow.cjs +5 -5
  180. package/dist/lib/ir/path/arrow.d.ts +14 -14
  181. package/dist/lib/ir/path/arrow.d.ts.map +1 -1
  182. package/dist/lib/ir/path/path.cjs +4 -4
  183. package/dist/lib/ir/path/path.d.ts +19 -19
  184. package/dist/lib/ir/path/path.d.ts.map +1 -1
  185. package/dist/lib/ir/path/step.cjs +8 -8
  186. package/dist/lib/ir/path/step.d.ts +1 -1
  187. package/dist/lib/ir/path/step.d.ts.map +1 -1
  188. package/dist/lib/ir/position/at-position.cjs +1 -1
  189. package/dist/lib/ir/position/offset-position.cjs +1 -1
  190. package/dist/lib/ir/position/polar-position.cjs +2 -2
  191. package/dist/lib/ir/position/polar-position.d.ts.map +1 -1
  192. package/dist/lib/ir/position/position.cjs +1 -1
  193. package/dist/lib/ir/position/position.d.ts.map +1 -1
  194. package/dist/lib/ir/scene.d.ts +128 -128
  195. package/dist/lib/ir/text.cjs +21 -0
  196. package/dist/lib/ir/text.d.ts +96 -0
  197. package/dist/lib/ir/text.d.ts.map +1 -0
  198. package/dist/lib/parsers/parseTargetSugar.cjs +3 -2
  199. package/dist/lib/parsers/parseTargetSugar.d.ts +4 -0
  200. package/dist/lib/parsers/parseTargetSugar.d.ts.map +1 -1
  201. package/dist/lib/primitive/ellipse.d.ts +3 -3
  202. package/dist/lib/primitive/ellipse.d.ts.map +1 -1
  203. package/dist/lib/primitive/group.d.ts +23 -7
  204. package/dist/lib/primitive/group.d.ts.map +1 -1
  205. package/dist/lib/primitive/index.d.ts +1 -1
  206. package/dist/lib/primitive/index.d.ts.map +1 -1
  207. package/dist/lib/primitive/layout.d.ts +12 -0
  208. package/dist/lib/primitive/layout.d.ts.map +1 -0
  209. package/dist/lib/primitive/path.d.ts +55 -15
  210. package/dist/lib/primitive/path.d.ts.map +1 -1
  211. package/dist/lib/primitive/rect.d.ts +3 -3
  212. package/dist/lib/primitive/rect.d.ts.map +1 -1
  213. package/dist/lib/primitive/scene.d.ts +4 -4
  214. package/dist/lib/primitive/scene.d.ts.map +1 -1
  215. package/dist/lib/primitive/text.d.ts +10 -3
  216. package/dist/lib/primitive/text.d.ts.map +1 -1
  217. package/dist/lib/types.d.ts +8 -0
  218. package/dist/lib/types.d.ts.map +1 -1
  219. package/package.json +12 -4
  220. package/dist/es/compile/path.d.ts.map +0 -1
  221. package/dist/es/compile/path.js +0 -636
  222. package/dist/es/compile/view-box.d.ts +0 -5
  223. package/dist/es/compile/view-box.d.ts.map +0 -1
  224. package/dist/es/primitive/view-box.d.ts +0 -12
  225. package/dist/es/primitive/view-box.d.ts.map +0 -1
  226. package/dist/lib/compile/path.cjs +0 -636
  227. package/dist/lib/compile/path.d.ts.map +0 -1
  228. package/dist/lib/compile/view-box.d.ts +0 -5
  229. package/dist/lib/compile/view-box.d.ts.map +0 -1
  230. package/dist/lib/primitive/view-box.d.ts +0 -12
  231. package/dist/lib/primitive/view-box.d.ts.map +0 -1
@@ -1,15 +1,27 @@
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(不准但可跑) */
7
19
  measureText?: TextMeasurer;
8
- /** viewBox 周围的留白(user units),默认 10 */
20
+ /** layout 周围的留白(user units),默认 10 */
9
21
  padding?: number;
10
22
  /**
11
23
  * 输出坐标的小数位精度;默认 2
12
- * @description 仅作用于 Scene primitive / path d / viewBox;内部几何计算保持完整 double 精度
24
+ * @description 仅作用于 Scene primitive / path d / layout;内部几何计算保持完整 double 精度
13
25
  */
14
26
  precision?: number;
15
27
  /**
@@ -17,10 +29,15 @@ 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 共享
23
- * @description Pass 1 处理 Node/coordinate 并注册 nodeIndex、发 primitive、累积 bbox;Pass 2 解析 Path 端点写 d 字符串;末端按 precision 折算 viewBox
40
+ * @description Pass 1 处理 Node/coordinate 并注册 nodeIndex、发 primitive、累积 bbox;Pass 2 解析 Path 端点写 d 字符串;末端按 precision 折算 layout
24
41
  */
25
42
  export declare const compileToScene: (ir: IR, options?: CompileOptions) => Scene;
26
43
  //# sourceMappingURL=compile.d.ts.map
@@ -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;CACvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,EAAE,EAAE,UAAS,cAAmB,KAAG,KAsDrE,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,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;CAC5C,CAAC;AAWF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,EAAE,EAAE,UAAS,cAAmB,KAAG,KAkErE,CAAC"}
@@ -2,9 +2,9 @@ import { rect } from "../geometry/rect.js";
2
2
  import { resolvePosition } from "./position.js";
3
3
  import { emitNodePrimitives, layoutNode } from "./node.js";
4
4
  import { fallbackMeasurer } from "./text-metrics.js";
5
- import { emitPathPrimitive } from "./path.js";
5
+ import { emitPathPrimitive } from "./path/index.js";
6
6
  import { makeRound } from "./precision.js";
7
- import { computeViewBox } from "./view-box.js";
7
+ import { computeLayout } from "./layout.js";
8
8
  //#region src/compile/compile.ts
9
9
  /**
10
10
  * 把 coordinate 注册成 0×0 NodeLayout
@@ -29,37 +29,62 @@ 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
- * @description Pass 1 处理 Node/coordinate 并注册 nodeIndex、发 primitive、累积 bbox;Pass 2 解析 Path 端点写 d 字符串;末端按 precision 折算 viewBox
41
+ * @description Pass 1 处理 Node/coordinate 并注册 nodeIndex、发 primitive、累积 bbox;Pass 2 解析 Path 端点写 d 字符串;末端按 precision 折算 layout
34
42
  */
35
43
  var compileToScene = (ir, options = {}) => {
36
44
  const measureText = options.measureText ?? fallbackMeasurer;
37
- const viewBoxPadding = options.padding ?? 10;
45
+ const layoutPadding = options.padding ?? 10;
38
46
  const round = 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 (const child of ir.children) if (child.type === "node") {
44
- const layout = layoutNode(child, measureText, nodeIndex, nodeDistance);
45
- if (child.id) nodeIndex.set(child.id, layout);
46
- for (const prim of emitNodePrimitives(layout, round)) primitives.push(prim);
47
- allPoints.push(rect.anchor(layout.rect, "north-west"), rect.anchor(layout.rect, "north-east"), rect.anchor(layout.rect, "south-west"), rect.anchor(layout.rect, "south-east"));
48
- } else if (child.type === "coordinate") {
49
- const center = resolvePosition(child.position, nodeIndex, nodeDistance);
50
- if (!center) throw new Error(`Cannot resolve position for coordinate ${child.id}; polar.origin or at.of may reference an undefined node`);
51
- nodeIndex.set(child.id, coordinateAsLayout(child.id, center));
52
+ for (let i = 0; i < ir.children.length; i++) {
53
+ const child = ir.children[i];
54
+ if (child.type === "node") {
55
+ const layout = layoutNode(child, measureText, nodeIndex, nodeDistance);
56
+ if (child.id) nodeIndex.set(child.id, layout);
57
+ for (const prim of emitNodePrimitives(layout, round)) primitives.push(prim);
58
+ allPoints.push(rect.anchor(layout.rect, "north-west"), rect.anchor(layout.rect, "north-east"), rect.anchor(layout.rect, "south-west"), rect.anchor(layout.rect, "south-east"));
59
+ } else if (child.type === "coordinate") {
60
+ const center = 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 (const child of ir.children) if (child.type === "path") {
54
- const result = emitPathPrimitive(child, nodeIndex, round, measureText);
55
- if (result) {
56
- for (const prim of result.primitives) primitives.push(prim);
57
- for (const p of result.points) allPoints.push(p);
72
+ for (let i = 0; i < ir.children.length; i++) {
73
+ const child = ir.children[i];
74
+ if (child.type === "path") {
75
+ const result = 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 {
61
86
  primitives,
62
- viewBox: computeViewBox(allPoints, viewBoxPadding, round)
87
+ layout: computeLayout(allPoints, layoutPadding, round)
63
88
  };
64
89
  };
65
90
  //#endregion
@@ -1,9 +1,9 @@
1
1
  export * from './compile';
2
2
  export * from './node';
3
3
  export * from './parseTarget';
4
- export * from './path';
4
+ export * from './path/index';
5
5
  export * from './position';
6
6
  export * from './precision';
7
7
  export * from './text-metrics';
8
- export * from './view-box';
8
+ export * from './layout';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -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,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,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,UAAU,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { IRPosition } from '../ir';
2
+ import { Layout } from '../primitive';
3
+ /** 由所有 bbox 候选点算出布局边界(含 padding);points 为空时返回 100×100 兜底 */
4
+ export declare const computeLayout: (points: Array<IRPosition>, padding: number, round: (n: number) => number) => Layout;
5
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/compile/layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,4DAA4D;AAC5D,eAAO,MAAM,aAAa,GACxB,QAAQ,KAAK,CAAC,UAAU,CAAC,EACzB,SAAS,MAAM,EACf,OAAO,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,KAC3B,MAkBF,CAAC"}
@@ -1,6 +1,6 @@
1
- //#region src/compile/view-box.ts
2
- /** 由所有 bbox 候选点算出 viewBox(含 padding);points 为空时返回 100×100 兜底 */
3
- var computeViewBox = (points, padding, round) => {
1
+ //#region src/compile/layout.ts
2
+ /** 由所有 bbox 候选点算出布局边界(含 padding);points 为空时返回 100×100 兜底 */
3
+ var computeLayout = (points, padding, round) => {
4
4
  if (points.length === 0) return {
5
5
  x: 0,
6
6
  y: 0,
@@ -25,4 +25,4 @@ var computeViewBox = (points, padding, round) => {
25
25
  };
26
26
  };
27
27
  //#endregion
28
- export { computeViewBox };
28
+ export { computeLayout };
@@ -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 SVG transform */
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
- /** 文本对齐(已映射到 SVG textAnchor 三态) */
29
+ /** 文本对齐(start / middle / end 三态) */
30
30
  align: 'start' | 'middle' | 'end';
31
31
  /** 行高(已应用默认值) */
32
32
  lineHeight: number;
@@ -48,8 +48,8 @@ export type NodeLayout = {
48
48
  strokeOpacity?: number;
49
49
  /** 边框宽度,emit 时 1 兜底 */
50
50
  strokeWidth?: number;
51
- /** SVG stroke-dasharray,已把 dashed/dotted 预设解析为具体 pattern */
52
- strokeDasharray?: string;
51
+ /** 描边 dash pattern,已把 dashed/dotted 预设解析为具体 pattern */
52
+ dashPattern?: Array<number>;
53
53
  /** rectangle 圆角半径(非 rect shape 无效) */
54
54
  roundedCorners?: number;
55
55
  /** 文字颜色,emit 时 'currentColor' 兜底 */
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/compile/node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/compile/node.ts"],"names":[],"mappings":"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"}
@@ -12,16 +12,16 @@ var DEG_TO_RAD = Math.PI / 180;
12
12
  var DEFAULT_LABEL_DISTANCE = 4;
13
13
  var SQRT2 = Math.SQRT2;
14
14
  /** dashed 预设:4 px 实线 + 2 px 间隙循环 */
15
- var DASHED_PATTERN = "4 2";
15
+ var DASHED_PATTERN = [4, 2];
16
16
  /** dotted 预设:1 px 圆点 + 2 px 间隙 */
17
- var DOTTED_PATTERN = "1 2";
17
+ var DOTTED_PATTERN = [1, 2];
18
18
  /** dashed / dotted / dashArray 优先级:dashArray > dashed > dotted */
19
19
  var resolveDashArray = (dashArray, dashed, dotted) => {
20
20
  if (dashArray !== void 0) return dashArray;
21
21
  if (dashed) return DASHED_PATTERN;
22
22
  if (dotted) return DOTTED_PATTERN;
23
23
  };
24
- /** IR align → SVG textAnchor */
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) => ({
@@ -259,7 +259,7 @@ var layoutNode = (node, measureText, nodeIndex, nodeDistance) => {
259
259
  stroke: node.stroke,
260
260
  strokeOpacity: node.drawOpacity,
261
261
  strokeWidth: node.strokeWidth,
262
- strokeDasharray: resolveDashArray(node.dashArray, node.dashed, node.dotted),
262
+ dashPattern: resolveDashArray(node.dashArray, node.dashed, node.dotted),
263
263
  roundedCorners: node.roundedCorners,
264
264
  textColor: node.textColor,
265
265
  opacity: node.opacity,
@@ -281,7 +281,7 @@ var emitRectShape = (layout, round) => {
281
281
  stroke: layout.stroke ?? "currentColor",
282
282
  strokeOpacity: layout.strokeOpacity,
283
283
  strokeWidth: layout.strokeWidth ?? 1,
284
- strokeDasharray: layout.strokeDasharray,
284
+ dashPattern: layout.dashPattern,
285
285
  cornerRadius: layout.roundedCorners,
286
286
  opacity: layout.opacity
287
287
  };
@@ -298,7 +298,7 @@ var emitEllipseShape = (layout, round) => ({
298
298
  stroke: layout.stroke ?? "currentColor",
299
299
  strokeOpacity: layout.strokeOpacity,
300
300
  strokeWidth: layout.strokeWidth ?? 1,
301
- strokeDasharray: layout.strokeDasharray,
301
+ dashPattern: layout.dashPattern,
302
302
  opacity: layout.opacity
303
303
  });
304
304
  /** diamond → PathPrim(4 顶点 + close 闭合) */
@@ -334,7 +334,7 @@ var emitDiamondShape = (layout, round) => {
334
334
  stroke: layout.stroke ?? "currentColor",
335
335
  strokeOpacity: layout.strokeOpacity,
336
336
  strokeWidth: layout.strokeWidth ?? 1,
337
- strokeDasharray: layout.strokeDasharray,
337
+ dashPattern: layout.dashPattern,
338
338
  opacity: layout.opacity
339
339
  };
340
340
  };
@@ -0,0 +1,19 @@
1
+ import { IRPosition, IRTarget } from '../../ir';
2
+ import { NodeLayout } from '../node';
3
+ /**
4
+ * 求 step.to 的参考点(给 boundary clip 算方向 / 折角 corner 用)
5
+ * @description 三态:`'A'`(auto) 节点中心;`'A.<anchor>'`/`'A.<deg>'` 显式锚点 refPoint=endpoint 位置不随邻居变。直接坐标/极坐标解析为笛卡尔
6
+ */
7
+ export declare const refPointOfTarget: (target: IRTarget, nodeIndex: Map<string, NodeLayout>) => IRPosition | null;
8
+ /** 折角中间点:`-|` → (curr.x, prev.y);`|-` → (prev.x, curr.y) */
9
+ export declare const cornerOf: (prev: IRPosition, curr: IRPosition, via: "-|" | "|-") => IRPosition;
10
+ /**
11
+ * 在 toward 方向算 step.to 的实际绘制端点
12
+ * @description 节点 auto `'A'`:按 shape 走 boundaryPointOf 求中心→toward 射线交点;命名 anchor/角度:位置已定不受 toward 影响;直接坐标/极坐标:解析后返回;失败返回 null
13
+ */
14
+ export declare const clipForTarget: (target: IRTarget, toward: IRPosition, nodeIndex: Map<string, NodeLayout>) => IRPosition | null;
15
+ /** 两个 IRPosition 两分量精确相等(未 round) */
16
+ export declare const samePoint: (a: IRPosition | null, b: IRPosition | null) => boolean;
17
+ /** 把 p 朝 target 方向移动 dist */
18
+ export declare const shiftToward: (p: IRPosition, target: IRPosition, dist: number) => IRPosition;
19
+ //# sourceMappingURL=anchor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/anchor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,KAAK,UAAU,EAA8C,MAAM,SAAS,CAAC;AAItF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,QAAQ,EAChB,WAAW,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,KACjC,UAAU,GAAG,IAmBf,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,QAAQ,GACnB,MAAM,UAAU,EAChB,MAAM,UAAU,EAChB,KAAK,IAAI,GAAG,IAAI,KACf,UACqD,CAAC;AAEzD;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,QAAQ,QAAQ,EAChB,QAAQ,UAAU,EAClB,WAAW,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,KACjC,UAAU,GAAG,IAmBf,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,SAAS,GAAI,GAAG,UAAU,GAAG,IAAI,EAAE,GAAG,UAAU,GAAG,IAAI,KAAG,OACzB,CAAC;AAE/C,6BAA6B;AAC7B,eAAO,MAAM,WAAW,GAAI,GAAG,UAAU,EAAE,QAAQ,UAAU,EAAE,MAAM,MAAM,KAAG,UAM7E,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { resolvePosition } from "../position.js";
2
+ import { anchorOf, angleBoundaryOf, boundaryPointOf } from "../node.js";
3
+ import { parseNodeRef } from "../parseTarget.js";
4
+ //#region src/compile/path/anchor.ts
5
+ /**
6
+ * 求 step.to 的参考点(给 boundary clip 算方向 / 折角 corner 用)
7
+ * @description 三态:`'A'`(auto) 节点中心;`'A.<anchor>'`/`'A.<deg>'` 显式锚点 refPoint=endpoint 位置不随邻居变。直接坐标/极坐标解析为笛卡尔
8
+ */
9
+ var refPointOfTarget = (target, nodeIndex) => {
10
+ if (typeof target === "string") {
11
+ const ref = parseNodeRef(target);
12
+ const node = nodeIndex.get(ref.id);
13
+ if (!node) return null;
14
+ switch (ref.kind) {
15
+ case "node": return [node.rect.x, node.rect.y];
16
+ case "anchor": return anchorOf(node, ref.anchor);
17
+ case "angle": return angleBoundaryOf(node, ref.angle);
18
+ }
19
+ }
20
+ if (typeof target === "object" && !Array.isArray(target) && ("relative" in target || "relativeAccumulate" in target)) return null;
21
+ return resolvePosition(target, nodeIndex);
22
+ };
23
+ /** 折角中间点:`-|` → (curr.x, prev.y);`|-` → (prev.x, curr.y) */
24
+ var cornerOf = (prev, curr, via) => via === "-|" ? [curr[0], prev[1]] : [prev[0], curr[1]];
25
+ /**
26
+ * 在 toward 方向算 step.to 的实际绘制端点
27
+ * @description 节点 auto `'A'`:按 shape 走 boundaryPointOf 求中心→toward 射线交点;命名 anchor/角度:位置已定不受 toward 影响;直接坐标/极坐标:解析后返回;失败返回 null
28
+ */
29
+ var clipForTarget = (target, toward, nodeIndex) => {
30
+ if (typeof target === "string") {
31
+ const ref = parseNodeRef(target);
32
+ const node = nodeIndex.get(ref.id);
33
+ if (!node) return null;
34
+ switch (ref.kind) {
35
+ case "node": return boundaryPointOf(node, toward);
36
+ case "anchor": return anchorOf(node, ref.anchor);
37
+ case "angle": return angleBoundaryOf(node, ref.angle);
38
+ }
39
+ }
40
+ if (typeof target === "object" && !Array.isArray(target) && ("relative" in target || "relativeAccumulate" in target)) return null;
41
+ return resolvePosition(target, nodeIndex);
42
+ };
43
+ /** 两个 IRPosition 两分量精确相等(未 round) */
44
+ var samePoint = (a, b) => !!a && !!b && a[0] === b[0] && a[1] === b[1];
45
+ /** 把 p 朝 target 方向移动 dist */
46
+ var shiftToward = (p, target, dist) => {
47
+ const dx = target[0] - p[0];
48
+ const dy = target[1] - p[1];
49
+ const len = Math.sqrt(dx * dx + dy * dy);
50
+ if (len === 0 || dist === 0) return p;
51
+ return [p[0] + dx / len * dist, p[1] + dy / len * dist];
52
+ };
53
+ //#endregion
54
+ export { clipForTarget, cornerOf, refPointOfTarget, samePoint, shiftToward };
@@ -0,0 +1,22 @@
1
+ import { ArrowShape } from '../../ir';
2
+ import { ArrowEndSpec } from '../../primitive';
3
+ /** 箭头形状几何:供路径端点收缩计算使用 */
4
+ export type ArrowShapeGeometry = {
5
+ /** 标准局部坐标基准尺寸 */
6
+ baseSize: number;
7
+ /** 箭头尖端在标准局部坐标里的 x 位置 */
8
+ tipX: number;
9
+ /** 路径线段应接触箭头尾部或凹口的位置 */
10
+ lineContactX: number;
11
+ /** 默认箭头长度 */
12
+ defaultLength: number;
13
+ /** 默认箭头宽度 */
14
+ defaultWidth: number;
15
+ /** 空心箭头默认描边宽度 */
16
+ hollowLineWidth?: number;
17
+ };
18
+ /** 箭头形状是否为空心描边形状 */
19
+ export declare const isHollowArrowShape: (shape: ArrowShape) => boolean;
20
+ /** 解析端点箭头在标准局部坐标中的中性几何 */
21
+ export declare const resolveArrowShapeGeometry: (spec: ArrowEndSpec) => ArrowShapeGeometry;
22
+ //# sourceMappingURL=arrow-geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrow-geometry.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/arrow-geometry.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKpD,yBAAyB;AACzB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,kBAAkB,GAAI,OAAO,UAAU,KAAG,OACvB,CAAC;AAEjC,0BAA0B;AAC1B,eAAO,MAAM,yBAAyB,GAAI,MAAM,YAAY,KAAG,kBAgC9D,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { HOLLOW_ARROW_SHAPES } from "../../ir/path/arrow.js";
2
+ //#region src/compile/path/arrow-geometry.ts
3
+ /** 标准箭头局部坐标基准尺寸 */
4
+ var ARROW_GEOMETRY_BASE_SIZE = 10;
5
+ /** 箭头形状是否为空心描边形状 */
6
+ var isHollowArrowShape = (shape) => HOLLOW_ARROW_SHAPES.has(shape);
7
+ /** 解析端点箭头在标准局部坐标中的中性几何 */
8
+ var resolveArrowShapeGeometry = (spec) => {
9
+ const lineWidth = spec.lineWidth ?? 1.5;
10
+ const base = {
11
+ baseSize: ARROW_GEOMETRY_BASE_SIZE,
12
+ tipX: ARROW_GEOMETRY_BASE_SIZE,
13
+ lineContactX: 0,
14
+ defaultLength: 6,
15
+ defaultWidth: 6
16
+ };
17
+ switch (spec.shape) {
18
+ case "normal":
19
+ case "diamond":
20
+ case "circle": return base;
21
+ case "stealth": return {
22
+ ...base,
23
+ lineContactX: 3
24
+ };
25
+ case "open":
26
+ case "openDiamond": return {
27
+ ...base,
28
+ tipX: 9,
29
+ lineContactX: 1 - lineWidth / 2,
30
+ hollowLineWidth: lineWidth
31
+ };
32
+ case "openCircle": return {
33
+ ...base,
34
+ lineContactX: 0,
35
+ hollowLineWidth: lineWidth
36
+ };
37
+ }
38
+ };
39
+ //#endregion
40
+ export { isHollowArrowShape, resolveArrowShapeGeometry };
@@ -1,13 +1,24 @@
1
- import { IRPath, IRPosition } from '../ir';
2
- import { ScenePrimitive } from '../primitive';
3
- import { NodeLayout } from './node';
4
- import { TextMeasurer } from './text-metrics';
1
+ import { IRPath, IRPosition } from '../../ir';
2
+ import { ScenePrimitive } from '../../primitive';
3
+ import { NodeLayout } from '../node';
4
+ import { TextMeasurer } from '../text-metrics';
5
+ /** emitPathPrimitive 可选 warn 钩子 */
6
+ export type EmitPathWarnHook = {
7
+ /** 警告收集器(由 compileToScene 传入) */
8
+ onWarn?: (warning: {
9
+ code: string;
10
+ message: string;
11
+ path: string;
12
+ }) => void;
13
+ /** 当前 path 在 IR 中的 locator 前缀(如 `'children[3].path'`) */
14
+ irPath?: string;
15
+ };
5
16
  /**
6
17
  * IR Path → PathPrim
7
- * @description 每个绘制段独立用节点中心算两端 boundary clip——中段节点的入/出 boundary 点通常不同,path 在该节点可见"断开"(与 TikZ `\draw (A)--(B)--(C);` 段独立 clip 一致)。仍产一个 PathPrim:commands 用多组 move/line 表达 sub-path;段起点等于上段终点时复用 cursor 省 move。cycle 段闭回最近 move 起点,起点==lastEnd && 终点==subPathStart 时输出 close,否则显式画段 line。引用未定义节点/解析失败返回 null
18
+ * @description 每个绘制段独立用节点中心算两端 boundary clip——中段节点的入/出 boundary 点通常不同,path 在该节点可见"断开"(与 TikZ `\draw (A)--(B)--(C);` 段独立 clip 一致)。仍产一个 PathPrim:commands 用多组 move/line 表达 sub-path;段起点等于上段终点时复用 cursor 省 move。cycle 段闭回最近 move 起点,起点==lastEnd && 终点==subPathStart 时输出 close,否则显式画段 line。引用未定义节点/解析失败返回 null,并通过 `warnHook.onWarn` 同步触发 warning
8
19
  */
9
- export declare const emitPathPrimitive: (path: IRPath, nodeIndex: Map<string, NodeLayout>, round: (n: number) => number, measureText?: TextMeasurer) => {
20
+ export declare const emitPathPrimitive: (path: IRPath, nodeIndex: Map<string, NodeLayout>, round: (n: number) => number, measureText?: TextMeasurer, warnHook?: EmitPathWarnHook) => {
10
21
  primitives: Array<ScenePrimitive>;
11
22
  points: Array<IRPosition>;
12
23
  } | null;
13
- //# sourceMappingURL=path.d.ts.map
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/compile/path/index.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,MAAM,EACN,UAAU,EAGX,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAEV,cAAc,EACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AA8BtE,mCAAmC;AACnC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iCAAiC;IACjC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,KAAK,IAAI,CAAC;IACX,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,EACZ,WAAW,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAClC,OAAO,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EAC5B,cAAa,YAA+B,EAC5C,WAAU,gBAAqB,KAC9B;IAAE,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;CAAE,GAAG,IA0XrE,CAAC"}