@agile-team/mach-report 0.4.0 → 0.5.0

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 (94) hide show
  1. package/dist/index.cjs +1663 -0
  2. package/dist/index.d.cts +344 -0
  3. package/dist/index.d.ts +344 -13
  4. package/dist/index.js +1611 -14
  5. package/dist/manager.cjs +122 -0
  6. package/dist/{manager/api.d.ts → manager.d.cts} +55 -3
  7. package/dist/manager.d.ts +97 -5
  8. package/dist/manager.js +119 -6
  9. package/dist/pdf.cjs +52530 -0
  10. package/dist/pdf.d.cts +33 -0
  11. package/dist/pdf.d.ts +31 -4
  12. package/dist/pdf.js +52527 -7
  13. package/dist/sql.cjs +45207 -0
  14. package/dist/sql.d.cts +95 -0
  15. package/dist/sql.d.ts +93 -3
  16. package/dist/sql.js +45194 -6
  17. package/dist/textwrap-DWzM7pt1.d.cts +135 -0
  18. package/dist/textwrap-DWzM7pt1.d.ts +135 -0
  19. package/package.json +44 -15
  20. package/dist/builder/template-builder.d.ts +0 -53
  21. package/dist/builder/template-builder.js +0 -153
  22. package/dist/builder/template-builder.js.map +0 -1
  23. package/dist/compat/jh4j-template.d.ts +0 -12
  24. package/dist/compat/jh4j-template.js +0 -196
  25. package/dist/compat/jh4j-template.js.map +0 -1
  26. package/dist/defaults.d.ts +0 -27
  27. package/dist/defaults.js +0 -28
  28. package/dist/defaults.js.map +0 -1
  29. package/dist/index.js.map +0 -1
  30. package/dist/layout/paginate.d.ts +0 -51
  31. package/dist/layout/paginate.js +0 -197
  32. package/dist/layout/paginate.js.map +0 -1
  33. package/dist/layout/textwrap.d.ts +0 -36
  34. package/dist/layout/textwrap.js +0 -173
  35. package/dist/layout/textwrap.js.map +0 -1
  36. package/dist/manager/api.js +0 -101
  37. package/dist/manager/api.js.map +0 -1
  38. package/dist/manager/index.d.ts +0 -2
  39. package/dist/manager/index.js +0 -3
  40. package/dist/manager/index.js.map +0 -1
  41. package/dist/manager/types.d.ts +0 -50
  42. package/dist/manager/types.js +0 -8
  43. package/dist/manager/types.js.map +0 -1
  44. package/dist/manager.js.map +0 -1
  45. package/dist/pdf/font-loader.d.ts +0 -5
  46. package/dist/pdf/font-loader.js +0 -84
  47. package/dist/pdf/font-loader.js.map +0 -1
  48. package/dist/pdf/index.d.ts +0 -2
  49. package/dist/pdf/index.js +0 -3
  50. package/dist/pdf/index.js.map +0 -1
  51. package/dist/pdf/render-pdf.d.ts +0 -19
  52. package/dist/pdf/render-pdf.js +0 -284
  53. package/dist/pdf/render-pdf.js.map +0 -1
  54. package/dist/pdf.js.map +0 -1
  55. package/dist/render/canvas.d.ts +0 -61
  56. package/dist/render/canvas.js +0 -402
  57. package/dist/render/canvas.js.map +0 -1
  58. package/dist/render/dom.d.ts +0 -10
  59. package/dist/render/dom.js +0 -311
  60. package/dist/render/dom.js.map +0 -1
  61. package/dist/render/grid-geometry.d.ts +0 -41
  62. package/dist/render/grid-geometry.js +0 -131
  63. package/dist/render/grid-geometry.js.map +0 -1
  64. package/dist/render/style.d.ts +0 -40
  65. package/dist/render/style.js +0 -39
  66. package/dist/render/style.js.map +0 -1
  67. package/dist/render/window.d.ts +0 -23
  68. package/dist/render/window.js +0 -58
  69. package/dist/render/window.js.map +0 -1
  70. package/dist/schema/render-plan.d.ts +0 -96
  71. package/dist/schema/render-plan.js +0 -25
  72. package/dist/schema/render-plan.js.map +0 -1
  73. package/dist/schema/validate.d.ts +0 -15
  74. package/dist/schema/validate.js +0 -129
  75. package/dist/schema/validate.js.map +0 -1
  76. package/dist/sql/ast-check.d.ts +0 -14
  77. package/dist/sql/ast-check.js +0 -44
  78. package/dist/sql/ast-check.js.map +0 -1
  79. package/dist/sql/compile.d.ts +0 -31
  80. package/dist/sql/compile.js +0 -145
  81. package/dist/sql/compile.js.map +0 -1
  82. package/dist/sql/expr.d.ts +0 -21
  83. package/dist/sql/expr.js +0 -123
  84. package/dist/sql/expr.js.map +0 -1
  85. package/dist/sql/index.d.ts +0 -4
  86. package/dist/sql/index.js +0 -5
  87. package/dist/sql/index.js.map +0 -1
  88. package/dist/sql/tokenizer.d.ts +0 -25
  89. package/dist/sql/tokenizer.js +0 -124
  90. package/dist/sql/tokenizer.js.map +0 -1
  91. package/dist/sql.js.map +0 -1
  92. package/dist/units.d.ts +0 -11
  93. package/dist/units.js +0 -26
  94. package/dist/units.js.map +0 -1
@@ -1,196 +0,0 @@
1
- function num(v, fallback) {
2
- return typeof v === "number" && Number.isFinite(v) ? v : fallback;
3
- }
4
- function str(v, fallback = "") {
5
- return typeof v === "string" ? v : fallback;
6
- }
7
- function isRaw(v) {
8
- return typeof v === "object" && v !== null && !Array.isArray(v);
9
- }
10
- function mapAlign(h) {
11
- if (h === "Center")
12
- return "center";
13
- if (h === "Right")
14
- return "right";
15
- return "left";
16
- }
17
- function mapVAlign(v) {
18
- if (v === "Center")
19
- return "middle";
20
- if (v === "Bottom")
21
- return "bottom";
22
- return "top";
23
- }
24
- function baseStyle(node) {
25
- const fontSize = parseFloat(str(node["FontSize"], "10.5"));
26
- return {
27
- fontSize: Number.isFinite(fontSize) ? fontSize : 10.5,
28
- fontFamily: str(node["FontFamily"], "黑体") || undefined,
29
- bold: str(node["FontWeight"]) === "bold" || undefined,
30
- italic: str(node["FontStyle"]) === "italic" || undefined,
31
- underline: node["Underline"] === true || undefined,
32
- color: str(node["FontColor"]) || undefined,
33
- backgroundColor: str(node["BackgroundColor"]) || undefined,
34
- align: mapAlign(str(node["HorAlignment"], "Left")),
35
- verticalAlign: mapVAlign(str(node["VertAlignment"], "Top")),
36
- lineHeight: (() => {
37
- const lh = parseFloat(str(node["RowSpace"], "1"));
38
- return Number.isFinite(lh) && lh !== 1 ? lh : undefined;
39
- })(),
40
- borderColor: str(node["BorderColor"]) || undefined,
41
- borderTop: node["BorderTop"] !== false,
42
- borderRight: node["BorderRight"] !== false,
43
- borderBottom: node["BorderBottom"] !== false,
44
- borderLeft: node["BorderLeft"] !== false
45
- };
46
- }
47
- function convertElement(node, warnings) {
48
- const uitype = str(node["uitype"]);
49
- const comp = {
50
- kind: "text",
51
- leftMm: num(node["left"], 0),
52
- topMm: num(node["top"], 0),
53
- widthMm: num(node["width"], 40),
54
- heightMm: num(node["height"], 8),
55
- nid: str(node["nid"]) || undefined,
56
- style: baseStyle(node)
57
- };
58
- switch (uitype) {
59
- case "text": {
60
- comp.kind = "text";
61
- const text = node["Text"] ?? node["text"] ?? node["Value"];
62
- comp.text = text == null ? "" : String(text);
63
- const lines = node["Lines"] ?? node["lines"];
64
- if (Array.isArray(lines)) {
65
- comp.lines = lines.map((l) => String(l));
66
- }
67
- return comp;
68
- }
69
- case "richtext":
70
- comp.kind = "text";
71
- comp.text = str(node["Text"]);
72
- warnings.push(`富文本 ${comp.nid ?? ""} 导入为纯文本(版式细节可能损失)`);
73
- return comp;
74
- case "image":
75
- case "barcode":
76
- case "qrcode":
77
- case "chart":
78
- comp.kind = uitype === "image" ? "image" : uitype;
79
- comp.fallbackText = `[${uitype}]`;
80
- warnings.push(`图片类组件 ${comp.nid ?? ""} 需运行时数据(imageData),已导入为占位`);
81
- return comp;
82
- case "table": {
83
- comp.kind = "rect";
84
- const cellsRaw = node["Cells"] ?? node["cells"];
85
- if (Array.isArray(cellsRaw)) {
86
- const grid = {
87
- cells: cellsRaw.map((row) => Array.isArray(row)
88
- ? row.map((cell) => ({
89
- text: isRaw(cell) ? str(cell["Text"] ?? cell["text"]) : "",
90
- colSpan: isRaw(cell) ? num(cell["ColSpan"], 1) : 1
91
- }))
92
- : [])
93
- };
94
- comp.grid = grid;
95
- }
96
- else {
97
- comp.fallbackText = "[table]";
98
- warnings.push(`表格 ${comp.nid ?? ""} 缺少 Cells,导入为空框`);
99
- }
100
- return comp;
101
- }
102
- case "subreport":
103
- warnings.push(`子报表 ${comp.nid ?? ""} 暂不支持导入,已跳过`);
104
- return null;
105
- default: {
106
- if (str(node["ShapeType"]) === "hline" || uitype === "hline") {
107
- comp.kind = "line";
108
- return comp;
109
- }
110
- if (uitype === "vline") {
111
- comp.kind = "line";
112
- return comp;
113
- }
114
- if (uitype === "rect" || uitype === "oval" || uitype === "shape") {
115
- comp.kind = uitype === "oval" ? "ellipse" : "rect";
116
- return comp;
117
- }
118
- warnings.push(`未知组件类型 ${uitype},已跳过`);
119
- return null;
120
- }
121
- }
122
- }
123
- /**
124
- * jh4j 模板 content(exportBackendPrintConfig 产物,见 docs/reverse-findings.md §6)
125
- * → MachReport ReportTemplate。单向转换,未知结构降级 + 告警,绝不抛错。
126
- */
127
- export function importJh4jTemplateContent(content) {
128
- const warnings = [];
129
- let root = null;
130
- if (typeof content === "string") {
131
- try {
132
- const parsed = JSON.parse(content);
133
- if (isRaw(parsed))
134
- root = parsed;
135
- }
136
- catch {
137
- return {
138
- template: { pages: [] },
139
- warnings: ["content 不是合法 JSON"]
140
- };
141
- }
142
- }
143
- else if (isRaw(content)) {
144
- root = content;
145
- }
146
- if (!root) {
147
- return { template: { pages: [] }, warnings: ["content 为空"] };
148
- }
149
- const globalConfig = isRaw(root["GlobalConfig"]) ? root["GlobalConfig"] : {};
150
- const defaultWidth = num(globalConfig["paperWidthMm"], 210);
151
- const defaultHeight = num(globalConfig["paperHeightMm"], 297);
152
- const defaultMargins = {
153
- top: num(globalConfig["marginTop"], 10),
154
- bottom: num(globalConfig["marginBottom"], 10),
155
- left: num(globalConfig["marginLeft"], 10),
156
- right: num(globalConfig["marginRight"], 10)
157
- };
158
- const pageNodes = Array.isArray(root["children"])
159
- ? root["children"].filter((c) => isRaw(c) && str(c["uitype"]) === "page")
160
- : [];
161
- if (pageNodes.length === 0) {
162
- warnings.push("content 中没有 uitype=page 的页节点");
163
- }
164
- const pages = pageNodes.map((raw) => {
165
- const node = raw;
166
- const elements = Array.isArray(node["children"]) ? node["children"] : [];
167
- const components = [];
168
- for (const el of elements) {
169
- if (!isRaw(el))
170
- continue;
171
- const converted = convertElement(el, warnings);
172
- if (converted)
173
- components.push(converted);
174
- }
175
- return {
176
- widthMm: num(node["width"], defaultWidth),
177
- heightMm: num(node["DesignHeight"], defaultHeight),
178
- marginTopMm: num(node["MarginTop"], defaultMargins.top),
179
- marginBottomMm: num(node["MarginBottom"], defaultMargins.bottom),
180
- marginLeftMm: num(node["MarginLeft"], defaultMargins.left),
181
- marginRightMm: num(node["MarginRight"], defaultMargins.right),
182
- components
183
- };
184
- });
185
- if (pages.length === 0) {
186
- warnings.push("转换结果为空页,已回退一张空白页");
187
- pages.push({
188
- widthMm: defaultWidth,
189
- heightMm: defaultHeight,
190
- ...defaultMargins,
191
- components: []
192
- });
193
- }
194
- return { template: { pages }, warnings };
195
- }
196
- //# sourceMappingURL=jh4j-template.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jh4j-template.js","sourceRoot":"","sources":["../../src/compat/jh4j-template.ts"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- /**
2
- * 全引擎共享默认值(唯一真相源)。
3
- *
4
- * 修改这里的任何常量前请注意消费方:
5
- * - LINE_HEIGHT:分页行高估算 / Canvas / PDF 三处换算必须一致
6
- * - DEFAULT_FONT_PT / DEFAULT_BORDER_PT:三后端默认字号与线宽
7
- * - SCHEMA_VERSION_*:RenderPlan 版本标识(adapter 产出侧使用)
8
- *
9
- * 历史:这些值曾散落在 paginate/canvas/pdf/dom 四个文件中各写一份,
10
- * 是三后端漂移的温床,收敛于此。
11
- */
12
- /** 默认行高倍数(基线距 = 字号 × 该系数,与 jh4j 打印口径一致) */
13
- export declare const LINE_HEIGHT = 1.35;
14
- /** 默认字号(pt),对齐 jh4j 模板缺省值 */
15
- export declare const DEFAULT_FONT_PT = 10.5;
16
- /** 默认边框线宽(pt) */
17
- export declare const DEFAULT_BORDER_PT = 0.75;
18
- /** 默认描边色(#333 与 jh4j 网格线一致) */
19
- export declare const DEFAULT_STROKE_COLOR = "#333333";
20
- /** 默认文本色 */
21
- export declare const DEFAULT_TEXT_COLOR = "#000000";
22
- /** RenderPlan 正式 schema 版本(core 分页引擎产出) */
23
- export declare const SCHEMA_VERSION_MACH = "1.0.0-mach";
24
- /** 本地渲染适配器产出版本标识(vue/createLocalFetcher) */
25
- export declare const SCHEMA_VERSION_LOCAL = "mach-local";
26
- /** jh4j gridPlan 兼容数据标识(vue/createJh4jGridPlanFetcher) */
27
- export declare const SCHEMA_VERSION_JH4J = "jh4j-compatible";
package/dist/defaults.js DELETED
@@ -1,28 +0,0 @@
1
- /**
2
- * 全引擎共享默认值(唯一真相源)。
3
- *
4
- * 修改这里的任何常量前请注意消费方:
5
- * - LINE_HEIGHT:分页行高估算 / Canvas / PDF 三处换算必须一致
6
- * - DEFAULT_FONT_PT / DEFAULT_BORDER_PT:三后端默认字号与线宽
7
- * - SCHEMA_VERSION_*:RenderPlan 版本标识(adapter 产出侧使用)
8
- *
9
- * 历史:这些值曾散落在 paginate/canvas/pdf/dom 四个文件中各写一份,
10
- * 是三后端漂移的温床,收敛于此。
11
- */
12
- /** 默认行高倍数(基线距 = 字号 × 该系数,与 jh4j 打印口径一致) */
13
- export const LINE_HEIGHT = 1.35;
14
- /** 默认字号(pt),对齐 jh4j 模板缺省值 */
15
- export const DEFAULT_FONT_PT = 10.5;
16
- /** 默认边框线宽(pt) */
17
- export const DEFAULT_BORDER_PT = 0.75;
18
- /** 默认描边色(#333 与 jh4j 网格线一致) */
19
- export const DEFAULT_STROKE_COLOR = "#333333";
20
- /** 默认文本色 */
21
- export const DEFAULT_TEXT_COLOR = "#000000";
22
- /** RenderPlan 正式 schema 版本(core 分页引擎产出) */
23
- export const SCHEMA_VERSION_MACH = "1.0.0-mach";
24
- /** 本地渲染适配器产出版本标识(vue/createLocalFetcher) */
25
- export const SCHEMA_VERSION_LOCAL = "mach-local";
26
- /** jh4j gridPlan 兼容数据标识(vue/createJh4jGridPlanFetcher) */
27
- export const SCHEMA_VERSION_JH4J = "jh4j-compatible";
28
- //# sourceMappingURL=defaults.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,2CAA2C;AAC3C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC;AAEhC,6BAA6B;AAC7B,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC,iBAAiB;AACjB,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAEtC,+BAA+B;AAC/B,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAE9C,YAAY;AACZ,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAE5C,2CAA2C;AAC3C,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAAC;AAEhD,4CAA4C;AAC5C,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;AAEjD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC"}
@@ -1,51 +0,0 @@
1
- import type { ComponentStyle, PlanComponent, RenderPlan } from "../schema/render-plan";
2
- import { measureTextMm, wrapText, type TextMeasurer } from "./textwrap";
3
- export interface ListColumn {
4
- header: string;
5
- field: string;
6
- widthMm: number;
7
- style?: ComponentStyle;
8
- }
9
- export interface ListComponent {
10
- kind: "list";
11
- id?: string;
12
- leftMm: number;
13
- topMm: number;
14
- widthMm: number;
15
- dataset: string;
16
- columns: ListColumn[];
17
- fontSizePt?: number;
18
- headerBold?: boolean;
19
- rowHeightMm?: number;
20
- paddingMm?: number;
21
- headerEveryPage?: boolean;
22
- headerBackgroundColor?: string;
23
- border?: boolean;
24
- }
25
- export type TemplateComponent = PlanComponent | ListComponent;
26
- export interface TemplatePage {
27
- widthMm: number;
28
- heightMm: number;
29
- marginTopMm?: number;
30
- marginBottomMm?: number;
31
- marginLeftMm?: number;
32
- marginRightMm?: number;
33
- components: TemplateComponent[];
34
- }
35
- export interface ReportTemplate {
36
- schemaVersion?: string;
37
- pages: TemplatePage[];
38
- }
39
- export type DatasetRows = Record<string, Record<string, unknown>[]>;
40
- export interface PaginateOptions {
41
- /** 每行额外占高(mm),压测专用钩子 */
42
- mmPerRow?: number;
43
- /** 文本测量器(默认启发式;浏览器端可注入 canvas 测量校准) */
44
- measurer?: TextMeasurer;
45
- }
46
- export interface PaginateResult {
47
- plan: RenderPlan;
48
- warnings: string[];
49
- }
50
- export declare function paginateTemplate(template: ReportTemplate, datasets: DatasetRows, optionsOrMmPerRow?: number | PaginateOptions): PaginateResult;
51
- export { measureTextMm, wrapText };
@@ -1,197 +0,0 @@
1
- import { RENDER_PLAN_SCHEMA_VERSION } from "../schema/render-plan";
2
- import { DEFAULT_FONT_PT, LINE_HEIGHT } from "../defaults";
3
- import { heuristicMeasurer, measureTextMm, wrapText } from "./textwrap";
4
- function makeWorkingPage(page) {
5
- return {
6
- widthMm: page.widthMm,
7
- heightMm: page.heightMm,
8
- marginTopMm: page.marginTopMm ?? 0,
9
- marginBottomMm: page.marginBottomMm ?? 0,
10
- marginLeftMm: page.marginLeftMm ?? 0,
11
- marginRightMm: page.marginRightMm ?? 0,
12
- components: []
13
- };
14
- }
15
- function toContentBottom(page, wp) {
16
- return wp.heightMm - (page.marginBottomMm ?? wp.marginBottomMm);
17
- }
18
- function estRowHeightMm(list, lines) {
19
- const fontSizePt = list.fontSizePt ?? DEFAULT_FONT_PT;
20
- const lineMm = (fontSizePt * LINE_HEIGHT * 25.4) / 72;
21
- const padding = (list.paddingMm ?? 1) * 2;
22
- return Math.max(list.rowHeightMm ?? 0, lines * lineMm + padding);
23
- }
24
- function cellText(value) {
25
- if (value == null)
26
- return "";
27
- if (typeof value === "string")
28
- return value;
29
- if (typeof value === "number")
30
- return String(value);
31
- if (typeof value === "boolean")
32
- return value ? "是" : "否";
33
- if (value instanceof Date)
34
- return value.toISOString().slice(0, 10);
35
- try {
36
- return JSON.stringify(value);
37
- }
38
- catch {
39
- return String(value);
40
- }
41
- }
42
- function interList(list, measurer) {
43
- const fontSizePt = list.fontSizePt ?? DEFAULT_FONT_PT;
44
- const paddingMm = list.paddingMm ?? 1;
45
- // 每列单元格样式只构造一次:{ align, verticalAlign, ...col.style }
46
- const cellStyles = list.columns.map((col) => col.style
47
- ? { align: "left", verticalAlign: "middle", ...col.style }
48
- : { align: "left", verticalAlign: "middle" });
49
- // 表头单元格样式(含底色/加粗),同样驻留
50
- const headerCellStyles = list.columns.map((col) => ({
51
- bold: list.headerBold ?? true,
52
- align: "center",
53
- verticalAlign: "middle",
54
- backgroundColor: list.headerBackgroundColor,
55
- ...(col.style || {})
56
- }));
57
- const headerTexts = list.columns.map((col) => col.header);
58
- const headerLines = headerTexts.map((text, i) => wrapText(text, list.columns[i].widthMm - paddingMm * 2, { fontSizePt, bold: list.headerBold ?? true }, measurer));
59
- const maxLines = Math.max(...headerLines.map((l) => l.length), 1);
60
- const headerHeight = estRowHeightMm(list, maxLines);
61
- const headerCells = headerTexts.map((text, i) => ({
62
- text,
63
- style: headerCellStyles[i]
64
- }));
65
- // border:false → 四边全关(下游 resolveBoxBorders 据此不画内外线)
66
- const borderStyle = list.border === false
67
- ? { borderTop: false, borderRight: false, borderBottom: false, borderLeft: false }
68
- : { borderBottom: true, borderLeft: true, borderRight: true, borderTop: true };
69
- return {
70
- fontSizePt,
71
- paddingMm,
72
- cellStyles,
73
- borderStyle,
74
- headerHeightMm: headerHeight,
75
- headerGrid: { cells: [headerCells], rowHeightsMm: [headerHeight] },
76
- columns: list.columns
77
- };
78
- }
79
- /** 单行 → 网格(复用驻留样式,无逐格对象分配) */
80
- function buildRowGridFast(inter, row, measurer) {
81
- const columns = inter.columns;
82
- const texts = new Array(columns.length);
83
- let maxLines = 1;
84
- for (let i = 0; i < columns.length; i++) {
85
- texts[i] = cellText(row[columns[i].field]);
86
- }
87
- // 折行只需算一次行数(宽度/字号同列恒定)
88
- const lines = new Array(columns.length);
89
- for (let i = 0; i < columns.length; i++) {
90
- const wrapped = wrapText(texts[i], columns[i].widthMm - inter.paddingMm * 2, { fontSizePt: inter.fontSizePt }, measurer);
91
- lines[i] = wrapped;
92
- if (wrapped.length > maxLines)
93
- maxLines = wrapped.length;
94
- }
95
- const lineMm = (inter.fontSizePt * LINE_HEIGHT * 25.4) / 72;
96
- const height = Math.max(inter.rowHeightFloorMm, maxLines * lineMm + inter.paddingMm * 2);
97
- const cells = new Array(columns.length);
98
- for (let i = 0; i < columns.length; i++) {
99
- cells[i] = { text: texts[i], style: inter.cellStyles[i] };
100
- }
101
- return { grid: { cells: [cells], rowHeightsMm: [height] }, heightMm: height };
102
- }
103
- export function paginateTemplate(template, datasets, optionsOrMmPerRow = {}) {
104
- // 兼容旧签名 paginateTemplate(tpl, data, mmPerRow: number)
105
- const options = typeof optionsOrMmPerRow === "number" ? { mmPerRow: optionsOrMmPerRow } : optionsOrMmPerRow;
106
- const mmPerRow = options.mmPerRow ?? 0;
107
- const measurer = options.measurer ?? heuristicMeasurer;
108
- const warnings = [];
109
- const pages = [];
110
- let seq = 0;
111
- const nextId = (prefix) => `${prefix}_${(++seq).toString(36)}`;
112
- for (const tplPage of template.pages) {
113
- const current = makeWorkingPage(tplPage);
114
- const contentBottom = () => toContentBottom(tplPage, current);
115
- const contentTop = current.marginTopMm;
116
- const pushCurrent = () => {
117
- pages.push({
118
- pageWidthMm: current.widthMm,
119
- pageHeightMm: current.heightMm,
120
- marginTopMm: current.marginTopMm,
121
- marginBottomMm: current.marginBottomMm,
122
- marginLeftMm: current.marginLeftMm,
123
- marginRightMm: current.marginRightMm,
124
- components: current.components
125
- });
126
- };
127
- for (const comp of tplPage.components) {
128
- if (comp.kind !== "list") {
129
- current.components.push(comp);
130
- continue;
131
- }
132
- const list = comp;
133
- const rows = datasets[list.dataset];
134
- if (!Array.isArray(rows)) {
135
- warnings.push(`数据集 ${list.dataset} 未提供数据,列表 ${list.id ?? ""} 输出为空`);
136
- }
137
- const dataRows = Array.isArray(rows) ? rows : [];
138
- const columnsWidth = list.columns.reduce((s, c) => s + c.widthMm, 0);
139
- const scale = columnsWidth > list.widthMm ? list.widthMm / columnsWidth : 1;
140
- const scaledList = scale === 1 ? list : { ...list, columns: list.columns.map((c) => ({ ...c, widthMm: c.widthMm * scale })) };
141
- const inter = {
142
- ...interList(scaledList, measurer),
143
- rowHeightFloorMm: scaledList.rowHeightMm ?? 0
144
- };
145
- const headerComp = {
146
- kind: "rect",
147
- leftMm: list.leftMm,
148
- topMm: 0,
149
- widthMm: list.widthMm,
150
- heightMm: inter.headerHeightMm,
151
- grid: inter.headerGrid,
152
- nid: nextId("listh"),
153
- style: inter.borderStyle
154
- };
155
- let y = list.topMm;
156
- const placeHeader = (target, topMm) => {
157
- target.components.push({ ...headerComp, topMm });
158
- };
159
- placeHeader(current, y);
160
- y += inter.headerHeightMm + mmPerRow;
161
- for (let i = 0; i < dataRows.length; i++) {
162
- const rowGrid = buildRowGridFast(inter, dataRows[i], measurer);
163
- if (y + rowGrid.heightMm > contentBottom()) {
164
- pushCurrent();
165
- const next = makeWorkingPage(tplPage);
166
- current.components = next.components;
167
- current.heightMm = next.heightMm;
168
- if (scaledList.headerEveryPage !== false) {
169
- placeHeader(current, list.topMm);
170
- y = list.topMm + inter.headerHeightMm;
171
- }
172
- else {
173
- y = contentTop;
174
- }
175
- }
176
- current.components.push({
177
- kind: "rect",
178
- leftMm: list.leftMm,
179
- topMm: y,
180
- widthMm: list.widthMm,
181
- heightMm: rowGrid.heightMm,
182
- grid: rowGrid.grid,
183
- nid: nextId("listr"),
184
- style: inter.borderStyle
185
- });
186
- y += rowGrid.heightMm;
187
- }
188
- }
189
- pushCurrent();
190
- }
191
- return {
192
- plan: { schemaVersion: RENDER_PLAN_SCHEMA_VERSION, pages },
193
- warnings
194
- };
195
- }
196
- export { measureTextMm, wrapText };
197
- //# sourceMappingURL=paginate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"paginate.js","sourceRoot":"","sources":["../../src/layout/paginate.ts"],"names":[],"mappings":"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"}
@@ -1,36 +0,0 @@
1
- /**
2
- * 文本测量与折行(分页/Canvas/PDF 共用的唯一折行真相源)。
3
- *
4
- * 测量模型可注入(TextMeasurer):
5
- * - 默认 createHeuristicMeasurer():CJK/拉丁宽度启发式(零依赖、Node 可用)
6
- * - 浏览器端可注入 createCanvasMeasurer()(真字体 metrics,消除三端折行差异)
7
- */
8
- export interface TextMeasureOptions {
9
- fontSizePt: number;
10
- bold?: boolean;
11
- letterSpacingPt?: number;
12
- }
13
- /** 宽度测量接口:返回文本在给定字号下的宽度(mm)。实现必须无副作用、可缓存。 */
14
- export interface TextMeasurer {
15
- measureMm(text: string, options: TextMeasureOptions): number;
16
- }
17
- export declare function charWidthEm(ch: string): number;
18
- /** 启发式测量器:宽度模型与 jh4j 近似口径一致(默认实现) */
19
- export declare const heuristicMeasurer: TextMeasurer;
20
- /** 兼容旧 API:默认启发式测量 */
21
- export declare function createHeuristicMeasurer(): TextMeasurer;
22
- export declare function measureTextMm(text: string, options: TextMeasureOptions): number;
23
- /**
24
- * 浏览器 Canvas 测量器:用真实字体 metrics 校准宽度(可选注入)。
25
- * 无 2D 环境时自动回退启发式(Node/SSR 安全)。
26
- */
27
- export declare function createCanvasMeasurer(getCtx2d: () => CanvasRenderingContext2D | null): TextMeasurer;
28
- /**
29
- * 文本折行:
30
- * - CJK 字符任意位置可断(与既有行为一致)
31
- * - 连续拉丁/数字串视为一个词,仅在词间(空格/CJK 边界)断行;
32
- * 单词本身超宽时按字符硬拆(兜底,不无限溢出)
33
- * - 换行符强制断行;行首不保留折行产生的空格
34
- * - 可注入 TextMeasurer(默认启发式)
35
- */
36
- export declare function wrapText(text: string, maxWidthMm: number, options: TextMeasureOptions, measurer?: TextMeasurer): string[];