@agile-team/mach-report 0.4.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 (85) hide show
  1. package/dist/builder/template-builder.d.ts +53 -0
  2. package/dist/builder/template-builder.js +153 -0
  3. package/dist/builder/template-builder.js.map +1 -0
  4. package/dist/compat/jh4j-template.d.ts +12 -0
  5. package/dist/compat/jh4j-template.js +196 -0
  6. package/dist/compat/jh4j-template.js.map +1 -0
  7. package/dist/defaults.d.ts +27 -0
  8. package/dist/defaults.js +28 -0
  9. package/dist/defaults.js.map +1 -0
  10. package/dist/index.d.ts +13 -0
  11. package/dist/index.js +14 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/layout/paginate.d.ts +51 -0
  14. package/dist/layout/paginate.js +197 -0
  15. package/dist/layout/paginate.js.map +1 -0
  16. package/dist/layout/textwrap.d.ts +36 -0
  17. package/dist/layout/textwrap.js +173 -0
  18. package/dist/layout/textwrap.js.map +1 -0
  19. package/dist/manager/api.d.ts +45 -0
  20. package/dist/manager/api.js +101 -0
  21. package/dist/manager/api.js.map +1 -0
  22. package/dist/manager/index.d.ts +2 -0
  23. package/dist/manager/index.js +3 -0
  24. package/dist/manager/index.js.map +1 -0
  25. package/dist/manager/types.d.ts +50 -0
  26. package/dist/manager/types.js +8 -0
  27. package/dist/manager/types.js.map +1 -0
  28. package/dist/manager.d.ts +5 -0
  29. package/dist/manager.js +6 -0
  30. package/dist/manager.js.map +1 -0
  31. package/dist/pdf/font-loader.d.ts +5 -0
  32. package/dist/pdf/font-loader.js +84 -0
  33. package/dist/pdf/font-loader.js.map +1 -0
  34. package/dist/pdf/index.d.ts +2 -0
  35. package/dist/pdf/index.js +3 -0
  36. package/dist/pdf/index.js.map +1 -0
  37. package/dist/pdf/render-pdf.d.ts +19 -0
  38. package/dist/pdf/render-pdf.js +284 -0
  39. package/dist/pdf/render-pdf.js.map +1 -0
  40. package/dist/pdf.d.ts +6 -0
  41. package/dist/pdf.js +7 -0
  42. package/dist/pdf.js.map +1 -0
  43. package/dist/render/canvas.d.ts +61 -0
  44. package/dist/render/canvas.js +402 -0
  45. package/dist/render/canvas.js.map +1 -0
  46. package/dist/render/dom.d.ts +10 -0
  47. package/dist/render/dom.js +311 -0
  48. package/dist/render/dom.js.map +1 -0
  49. package/dist/render/grid-geometry.d.ts +41 -0
  50. package/dist/render/grid-geometry.js +131 -0
  51. package/dist/render/grid-geometry.js.map +1 -0
  52. package/dist/render/style.d.ts +40 -0
  53. package/dist/render/style.js +39 -0
  54. package/dist/render/style.js.map +1 -0
  55. package/dist/render/window.d.ts +23 -0
  56. package/dist/render/window.js +58 -0
  57. package/dist/render/window.js.map +1 -0
  58. package/dist/schema/render-plan.d.ts +96 -0
  59. package/dist/schema/render-plan.js +25 -0
  60. package/dist/schema/render-plan.js.map +1 -0
  61. package/dist/schema/validate.d.ts +15 -0
  62. package/dist/schema/validate.js +129 -0
  63. package/dist/schema/validate.js.map +1 -0
  64. package/dist/sql/ast-check.d.ts +14 -0
  65. package/dist/sql/ast-check.js +44 -0
  66. package/dist/sql/ast-check.js.map +1 -0
  67. package/dist/sql/compile.d.ts +31 -0
  68. package/dist/sql/compile.js +145 -0
  69. package/dist/sql/compile.js.map +1 -0
  70. package/dist/sql/expr.d.ts +21 -0
  71. package/dist/sql/expr.js +123 -0
  72. package/dist/sql/expr.js.map +1 -0
  73. package/dist/sql/index.d.ts +4 -0
  74. package/dist/sql/index.js +5 -0
  75. package/dist/sql/index.js.map +1 -0
  76. package/dist/sql/tokenizer.d.ts +25 -0
  77. package/dist/sql/tokenizer.js +124 -0
  78. package/dist/sql/tokenizer.js.map +1 -0
  79. package/dist/sql.d.ts +5 -0
  80. package/dist/sql.js +6 -0
  81. package/dist/sql.js.map +1 -0
  82. package/dist/units.d.ts +11 -0
  83. package/dist/units.js +26 -0
  84. package/dist/units.js.map +1 -0
  85. package/package.json +42 -0
@@ -0,0 +1,53 @@
1
+ import type { ListColumn, ListComponent, ReportTemplate, TemplatePage } from "../layout/paginate";
2
+ import type { ComponentStyle, PlanComponent } from "../schema/render-plan";
3
+ import { PAPER_SIZES } from "../units";
4
+ type Geometry = Partial<Pick<PlanComponent, "leftMm" | "topMm" | "widthMm" | "heightMm">>;
5
+ /** 纸张预设名(对齐 PAPER_SIZES 表) */
6
+ export type PaperName = keyof typeof PAPER_SIZES;
7
+ export interface PageOptions {
8
+ /** 横向(宽高互换) */
9
+ landscape?: boolean;
10
+ margins?: Partial<Pick<TemplatePage, "marginTopMm" | "marginBottomMm" | "marginLeftMm" | "marginRightMm">>;
11
+ }
12
+ type PageMargins = Partial<Pick<TemplatePage, "marginTopMm" | "marginBottomMm" | "marginLeftMm" | "marginRightMm">>;
13
+ /** 解析纸张参数:数字按宽高使用;字符串查 PAPER_SIZES 预设;缺省 A4 纵向 */
14
+ export declare function resolvePaper(paper: PaperName | {
15
+ widthMm: number;
16
+ heightMm: number;
17
+ } | number, heightArg?: number, landscape?: boolean): {
18
+ widthMm: number;
19
+ heightMm: number;
20
+ };
21
+ export declare class TemplateBuilder {
22
+ readonly pages: TemplatePage[];
23
+ private pending;
24
+ /**
25
+ * 新建页。纸张支持三种写法:
26
+ * - 预设名:.page("a4", { landscape: true, margins: {...} })
27
+ * - 数字:.page(210, 297)(第三参数兼容旧 margins 对象或新 options)
28
+ * - 对象:.page({ widthMm: 210, heightMm: 297 })
29
+ */
30
+ page(paper?: PaperName | {
31
+ widthMm: number;
32
+ heightMm: number;
33
+ } | number, optionsOrHeight?: number | PageOptions, maybeOptions?: PageOptions | PageMargins): PageBuilder;
34
+ collect(): void;
35
+ build(): ReportTemplate;
36
+ }
37
+ export declare class PageBuilder {
38
+ private readonly parent;
39
+ private readonly page;
40
+ private components;
41
+ constructor(parent: TemplateBuilder, page: Omit<TemplatePage, "components">);
42
+ text(content: string, geometry?: Geometry, style?: ComponentStyle): this;
43
+ list(dataset: string, geometry: Partial<Pick<ListComponent, "leftMm" | "topMm" | "widthMm">>, columns: ListColumn[], options?: Partial<Omit<ListComponent, "kind" | "leftMm" | "topMm" | "widthMm" | "dataset" | "columns">>): this;
44
+ rect(geometry: Required<Pick<PlanComponent, "leftMm" | "topMm" | "widthMm" | "heightMm">>, style?: ComponentStyle): this;
45
+ line(leftMm: number, topMm: number, widthMm: number, style?: ComponentStyle): this;
46
+ barcode(content: string, geometry: Required<Geometry>): this;
47
+ qrcode(content: string, sizeMm: number, leftMm: number, topMm: number): this;
48
+ buildPage(): TemplatePage;
49
+ done(): TemplateBuilder;
50
+ build(): ReportTemplate;
51
+ }
52
+ export declare function createTemplate(): TemplateBuilder;
53
+ export {};
@@ -0,0 +1,153 @@
1
+ import { PAPER_SIZES } from "../units";
2
+ /** 解析纸张参数:数字按宽高使用;字符串查 PAPER_SIZES 预设;缺省 A4 纵向 */
3
+ export function resolvePaper(paper, heightArg, landscape) {
4
+ let widthMm;
5
+ let heightMm;
6
+ if (typeof paper === "string") {
7
+ const preset = PAPER_SIZES[paper];
8
+ if (!preset)
9
+ throw new Error(`未知纸张预设 "${paper}"(可用:${Object.keys(PAPER_SIZES).join("/")})`);
10
+ widthMm = preset.widthMm;
11
+ heightMm = preset.heightMm;
12
+ }
13
+ else if (typeof paper === "number") {
14
+ widthMm = paper;
15
+ heightMm = heightArg ?? 297;
16
+ }
17
+ else {
18
+ widthMm = paper.widthMm;
19
+ heightMm = paper.heightMm;
20
+ }
21
+ return landscape ? { widthMm: heightMm, heightMm: widthMm } : { widthMm, heightMm };
22
+ }
23
+ export class TemplateBuilder {
24
+ constructor() {
25
+ this.pages = [];
26
+ this.pending = null;
27
+ }
28
+ /**
29
+ * 新建页。纸张支持三种写法:
30
+ * - 预设名:.page("a4", { landscape: true, margins: {...} })
31
+ * - 数字:.page(210, 297)(第三参数兼容旧 margins 对象或新 options)
32
+ * - 对象:.page({ widthMm: 210, heightMm: 297 })
33
+ */
34
+ page(paper = "a4", optionsOrHeight = {}, maybeOptions) {
35
+ this.collect();
36
+ // 旧签名兼容:.page(w, h, { marginTopMm }) 的第三参数是 margins 本体
37
+ const legacyMargins = maybeOptions != null &&
38
+ !("margins" in maybeOptions) &&
39
+ !("landscape" in maybeOptions) &&
40
+ ("marginTopMm" in maybeOptions ||
41
+ "marginBottomMm" in maybeOptions ||
42
+ "marginLeftMm" in maybeOptions ||
43
+ "marginRightMm" in maybeOptions);
44
+ const options = legacyMargins
45
+ ? { margins: maybeOptions }
46
+ : (maybeOptions ?? {});
47
+ const { widthMm, heightMm } = resolvePaper(paper, typeof optionsOrHeight === "number" ? optionsOrHeight : undefined, options.landscape);
48
+ const margins = options.margins ?? {};
49
+ this.pending = new PageBuilder(this, {
50
+ widthMm,
51
+ heightMm,
52
+ marginTopMm: margins.marginTopMm ?? 10,
53
+ marginBottomMm: margins.marginBottomMm ?? 10,
54
+ marginLeftMm: margins.marginLeftMm ?? 10,
55
+ marginRightMm: margins.marginRightMm ?? 10
56
+ });
57
+ return this.pending;
58
+ }
59
+ collect() {
60
+ if (this.pending) {
61
+ this.pages.push(this.pending.buildPage());
62
+ this.pending = null;
63
+ }
64
+ }
65
+ build() {
66
+ this.collect();
67
+ if (this.pages.length === 0) {
68
+ throw new Error("模板至少需要一页:先调用 .page() 添加内容");
69
+ }
70
+ return { pages: this.pages };
71
+ }
72
+ }
73
+ export class PageBuilder {
74
+ constructor(parent, page) {
75
+ this.parent = parent;
76
+ this.page = page;
77
+ this.components = [];
78
+ }
79
+ text(content, geometry = {}, style = {}) {
80
+ this.components.push({
81
+ kind: "text",
82
+ leftMm: geometry.leftMm ?? 0,
83
+ topMm: geometry.topMm ?? 0,
84
+ widthMm: geometry.widthMm ?? 60,
85
+ heightMm: geometry.heightMm ?? 8,
86
+ text: content,
87
+ style
88
+ });
89
+ return this;
90
+ }
91
+ list(dataset, geometry, columns, options = {}) {
92
+ this.components.push({
93
+ kind: "list",
94
+ leftMm: geometry.leftMm ?? 10,
95
+ topMm: geometry.topMm ?? 30,
96
+ widthMm: geometry.widthMm ?? 180,
97
+ dataset,
98
+ columns,
99
+ ...options
100
+ });
101
+ return this;
102
+ }
103
+ rect(geometry, style = {}) {
104
+ this.components.push({ kind: "rect", ...geometry, style });
105
+ return this;
106
+ }
107
+ line(leftMm, topMm, widthMm, style = {}) {
108
+ this.components.push({
109
+ kind: "line",
110
+ leftMm,
111
+ topMm,
112
+ widthMm,
113
+ heightMm: 0.5,
114
+ style
115
+ });
116
+ return this;
117
+ }
118
+ barcode(content, geometry) {
119
+ this.components.push({
120
+ kind: "barcode",
121
+ leftMm: geometry.leftMm ?? 0,
122
+ topMm: geometry.topMm ?? 0,
123
+ widthMm: geometry.widthMm ?? 40,
124
+ heightMm: geometry.heightMm ?? 12,
125
+ fallbackText: content
126
+ });
127
+ return this;
128
+ }
129
+ qrcode(content, sizeMm, leftMm, topMm) {
130
+ this.components.push({
131
+ kind: "qrcode",
132
+ leftMm,
133
+ topMm,
134
+ widthMm: sizeMm,
135
+ heightMm: sizeMm,
136
+ fallbackText: content
137
+ });
138
+ return this;
139
+ }
140
+ buildPage() {
141
+ return { ...this.page, components: this.components };
142
+ }
143
+ done() {
144
+ return this.parent;
145
+ }
146
+ build() {
147
+ return this.done().build();
148
+ }
149
+ }
150
+ export function createTemplate() {
151
+ return new TemplateBuilder();
152
+ }
153
+ //# sourceMappingURL=template-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-builder.js","sourceRoot":"","sources":["../../src/builder/template-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ReportTemplate } from "../layout/paginate";
2
+ export interface Jh4jImportResult {
3
+ template: ReportTemplate;
4
+ warnings: string[];
5
+ }
6
+ type Raw = Record<string, unknown>;
7
+ /**
8
+ * jh4j 模板 content(exportBackendPrintConfig 产物,见 docs/reverse-findings.md §6)
9
+ * → MachReport ReportTemplate。单向转换,未知结构降级 + 告警,绝不抛错。
10
+ */
11
+ export declare function importJh4jTemplateContent(content: string | Raw): Jh4jImportResult;
12
+ export {};
@@ -0,0 +1,196 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jh4j-template.js","sourceRoot":"","sources":["../../src/compat/jh4j-template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
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";
@@ -0,0 +1,28 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,13 @@
1
+ export * from "./defaults";
2
+ export * from "./units";
3
+ export * from "./schema/render-plan";
4
+ export * from "./schema/validate";
5
+ export * from "./layout/textwrap";
6
+ export * from "./layout/paginate";
7
+ export * from "./render/grid-geometry";
8
+ export * from "./render/style";
9
+ export * from "./render/dom";
10
+ export * from "./render/canvas";
11
+ export * from "./render/window";
12
+ export * from "./compat/jh4j-template";
13
+ export * from "./builder/template-builder";
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ export * from "./defaults";
2
+ export * from "./units";
3
+ export * from "./schema/render-plan";
4
+ export * from "./schema/validate";
5
+ export * from "./layout/textwrap";
6
+ export * from "./layout/paginate";
7
+ export * from "./render/grid-geometry";
8
+ export * from "./render/style";
9
+ export * from "./render/dom";
10
+ export * from "./render/canvas";
11
+ export * from "./render/window";
12
+ export * from "./compat/jh4j-template";
13
+ export * from "./builder/template-builder";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,51 @@
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 };