@sme.up/doc-alchemist 1.7.0-SNAPSHOT-20251218155723 → 1.7.0-SNAPSHOT-20251224094418
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/gfx-data.d.ts +1 -0
- package/dist/assets/gfx-data.js +2 -1
- package/dist/assets/gfx-data.js.map +1 -1
- package/dist/converters/images/charts-converter.d.ts +1 -1
- package/dist/converters/images/charts-converter.js.map +1 -1
- package/dist/converters/images/charts-data-converter.d.ts +1 -1
- package/dist/converters/images/charts-data-converter.js +8 -8
- package/dist/converters/images/charts-data-converter.js.map +1 -1
- package/dist/converters/pdf/pdfmake/adapters/box/box-adapter.d.ts +28 -0
- package/dist/converters/pdf/pdfmake/adapters/box/box-adapter.js +164 -0
- package/dist/converters/pdf/pdfmake/adapters/box/box-adapter.js.map +1 -0
- package/dist/converters/pdf/pdfmake/adapters/box/box-layouts.d.ts +6 -0
- package/dist/converters/pdf/pdfmake/adapters/box/box-layouts.js +147 -0
- package/dist/converters/pdf/pdfmake/adapters/box/box-layouts.js.map +1 -0
- package/dist/converters/pdf/pdfmake/adapters/{chart-adapter.d.ts → chart/chart-adapter.d.ts} +1 -1
- package/dist/converters/pdf/pdfmake/adapters/{chart-adapter.js → chart/chart-adapter.js} +2 -2
- package/dist/converters/pdf/pdfmake/adapters/chart/chart-adapter.js.map +1 -0
- package/dist/converters/pdf/pdfmake/adapters/helpers.d.ts +3 -0
- package/dist/converters/pdf/pdfmake/adapters/helpers.js +18 -0
- package/dist/converters/pdf/pdfmake/adapters/helpers.js.map +1 -0
- package/dist/converters/pdf/pdfmake/adapters/{image-adapter.d.ts → image/image-adapter.d.ts} +1 -1
- package/dist/converters/pdf/pdfmake/adapters/{image-adapter.js → image/image-adapter.js} +19 -12
- package/dist/converters/pdf/pdfmake/adapters/image/image-adapter.js.map +1 -0
- package/dist/converters/pdf/pdfmake/adapters/{layout-adapter.d.ts → layout/layout-adapter.d.ts} +1 -1
- package/dist/converters/pdf/pdfmake/adapters/layout/layout-adapter.js.map +1 -0
- package/dist/converters/pdf/pdfmake/adapters/{page-element-adapter.d.ts → page-alement/page-element-adapter.d.ts} +1 -1
- package/dist/converters/pdf/pdfmake/adapters/{page-element-adapter.js → page-alement/page-element-adapter.js} +1 -1
- package/dist/converters/pdf/pdfmake/adapters/page-alement/page-element-adapter.js.map +1 -0
- package/dist/converters/pdf/pdfmake/adapters/{table-adapter.d.ts → table/table-adapter.d.ts} +1 -1
- package/dist/converters/pdf/pdfmake/adapters/{table-adapter.js → table/table-adapter.js} +16 -8
- package/dist/converters/pdf/pdfmake/adapters/table/table-adapter.js.map +1 -0
- package/dist/converters/pdf/pdfmake/pdfmake.types.d.ts +2 -3
- package/dist/converters/pdf/pdfmake/pdfmake.types.js.map +1 -1
- package/dist/converters/pdf-converter.js +7 -5
- package/dist/converters/pdf-converter.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/types/component.d.ts +34 -0
- package/dist/types/component.js +8 -1
- package/dist/types/component.js.map +1 -1
- package/dist/utils/cells-utility.d.ts +2 -0
- package/dist/utils/cells-utility.js +10 -0
- package/dist/utils/cells-utility.js.map +1 -0
- package/dist/utils/filters-utility.js +0 -1
- package/dist/utils/filters-utility.js.map +1 -1
- package/dist/utils/objects-utility.d.ts +1 -0
- package/dist/utils/objects-utility.js +7 -1
- package/dist/utils/objects-utility.js.map +1 -1
- package/package.json +1 -1
- package/dist/converters/images/charts-converter-types.d.ts +0 -15
- package/dist/converters/images/charts-converter-types.js +0 -11
- package/dist/converters/images/charts-converter-types.js.map +0 -1
- package/dist/converters/pdf/pdfmake/adapters/chart-adapter.js.map +0 -1
- package/dist/converters/pdf/pdfmake/adapters/image-adapter.js.map +0 -1
- package/dist/converters/pdf/pdfmake/adapters/layout-adapter.js.map +0 -1
- package/dist/converters/pdf/pdfmake/adapters/page-element-adapter.js.map +0 -1
- package/dist/converters/pdf/pdfmake/adapters/table-adapter.js.map +0 -1
- /package/dist/converters/pdf/pdfmake/adapters/{layout-adapter.js → layout/layout-adapter.js} +0 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ...
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.boxAdapter = exports.boxDataAdapter = exports.boxFunAdapter = void 0;
|
|
5
|
+
const smeupDataStructure_1 = require("../../../../../types/data-structures/smeupDataStructure");
|
|
6
|
+
const box_layouts_1 = require("./box-layouts");
|
|
7
|
+
const adapter_processor_1 = require("../../adapter-processor");
|
|
8
|
+
const hasSmeupBoxData = (element) => {
|
|
9
|
+
const box = element
|
|
10
|
+
?.box;
|
|
11
|
+
const data = box?.smeup?.data;
|
|
12
|
+
return (data?.type === smeupDataStructure_1.SmeupDataStructureType.SmeupDataTable &&
|
|
13
|
+
Array.isArray(data?.rows) &&
|
|
14
|
+
Array.isArray(data?.columns));
|
|
15
|
+
};
|
|
16
|
+
const hasSmeupBox = (element) => {
|
|
17
|
+
const box = element
|
|
18
|
+
?.box;
|
|
19
|
+
const fun = box?.smeup?.fun;
|
|
20
|
+
return typeof fun === "string" && fun.length > 0;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Adapter function for converting a box element with a `fun` property to a Smeup box structure.
|
|
24
|
+
*
|
|
25
|
+
* This function returns an asynchronous converter that checks if the provided element contains
|
|
26
|
+
* a box with a `fun` property. If present, it uses the `getSmeupDataStructure` function from
|
|
27
|
+
* the context to fetch the box data corresponding to the `fun` string, and replaces the original
|
|
28
|
+
* box's `fun` property with the fetched data under the `data` property. All other properties
|
|
29
|
+
* of the box are preserved.
|
|
30
|
+
*
|
|
31
|
+
* @returns An asynchronous function that takes an element and a context, and returns the adapted element.
|
|
32
|
+
*
|
|
33
|
+
* @throws If the context does not provide a `getSmeupDataStructure` function when the `fun` property is used.
|
|
34
|
+
*
|
|
35
|
+
* @param element - The input element to be adapted.
|
|
36
|
+
* @param context - The conversion context, which must provide `getSmeupDataStructure` if the `fun` property is present.
|
|
37
|
+
*/
|
|
38
|
+
const boxFunAdapter = () => {
|
|
39
|
+
return async (element, context) => {
|
|
40
|
+
if (!hasSmeupBox(element)) {
|
|
41
|
+
return element;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
if (!context.getSmeupDataStructure) {
|
|
45
|
+
throw new Error("getSmeupDataStructure function is required in context when the fun property is used");
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const elementWithBox = element;
|
|
49
|
+
const funStr = elementWithBox.box.smeup.fun;
|
|
50
|
+
const boxData = (await context.getSmeupDataStructure(funStr));
|
|
51
|
+
// Extract all properties except 'fun' from the smeup object
|
|
52
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
53
|
+
const { fun, ...smeupRest } = elementWithBox.box.smeup;
|
|
54
|
+
// Extract all properties except 'smeup' from the box object
|
|
55
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
56
|
+
const { smeup, ...boxRest } = elementWithBox.box;
|
|
57
|
+
return {
|
|
58
|
+
...elementWithBox,
|
|
59
|
+
box: {
|
|
60
|
+
...boxRest,
|
|
61
|
+
smeup: {
|
|
62
|
+
...smeupRest,
|
|
63
|
+
data: boxData,
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
exports.boxFunAdapter = boxFunAdapter;
|
|
72
|
+
/**
|
|
73
|
+
* Adapts a Smeup box structure to PDFMake columns with cards.
|
|
74
|
+
*
|
|
75
|
+
* This adapter function checks if the provided element contains a box with data.
|
|
76
|
+
* If so, it generates columns containing cards from the data rows and replaces the box
|
|
77
|
+
* object with column structures. The number of columns and which data columns to display
|
|
78
|
+
* are determined by the options.
|
|
79
|
+
*
|
|
80
|
+
* @returns A function that takes an element and returns the adapted element for PDFMake,
|
|
81
|
+
* or the original element if it does not contain a valid box with data.
|
|
82
|
+
* @throws If options.Columns is missing or empty.
|
|
83
|
+
*/
|
|
84
|
+
// Map of available layout builders
|
|
85
|
+
const layoutBuilders = {
|
|
86
|
+
"1": box_layouts_1.buildLayout1,
|
|
87
|
+
"2": box_layouts_1.buildLayout2,
|
|
88
|
+
"5": box_layouts_1.buildLayout5,
|
|
89
|
+
};
|
|
90
|
+
const boxDataAdapter = () => {
|
|
91
|
+
return async (element, context) => {
|
|
92
|
+
if (!hasSmeupBoxData(element)) {
|
|
93
|
+
return element;
|
|
94
|
+
}
|
|
95
|
+
const elementWithBox = element;
|
|
96
|
+
const data = elementWithBox.box.smeup.data;
|
|
97
|
+
const options = elementWithBox.box.smeup.options;
|
|
98
|
+
// Validate that options.Columns exists
|
|
99
|
+
if (!options?.Columns || options.Columns.trim().length === 0) {
|
|
100
|
+
throw new Error("options.Columns is required for box adapter");
|
|
101
|
+
}
|
|
102
|
+
// Parse column names from options.Columns (pipe-separated)
|
|
103
|
+
const columnNames = options.Columns.split("|")
|
|
104
|
+
.map(name => name.trim())
|
|
105
|
+
.filter(name => name.length > 0);
|
|
106
|
+
// Parse number of columns (default to 1)
|
|
107
|
+
const numCols = options.Cols ? parseInt(options.Cols, 10) : 1;
|
|
108
|
+
const cols = isNaN(numCols) || numCols < 1 ? 1 : numCols;
|
|
109
|
+
// Distribute rows horizontally across columns
|
|
110
|
+
const rows = data.rows;
|
|
111
|
+
const columnsArray = [];
|
|
112
|
+
// Select the appropriate layout builder (default: layout 1)
|
|
113
|
+
const buildLayout = layoutBuilders[options.LayoutNbr || "1"] || box_layouts_1.buildLayout1;
|
|
114
|
+
// Calculate how many complete rows of columns we'll have
|
|
115
|
+
let rowIndex = 0;
|
|
116
|
+
while (rowIndex < rows.length) {
|
|
117
|
+
const columnsInThisRow = [];
|
|
118
|
+
// Fill this row with up to 'cols' cards
|
|
119
|
+
for (let colIndex = 0; colIndex < cols && rowIndex < rows.length; colIndex++) {
|
|
120
|
+
const card = buildLayout(rows[rowIndex], data.columns, columnNames, context, options);
|
|
121
|
+
columnsInThisRow.push(card);
|
|
122
|
+
rowIndex++;
|
|
123
|
+
}
|
|
124
|
+
// Fill with empty objects to ensure the number of columns is always a multiple of cols
|
|
125
|
+
while (columnsInThisRow.length < cols) {
|
|
126
|
+
columnsInThisRow.push({});
|
|
127
|
+
}
|
|
128
|
+
// Add this row of columns to the array
|
|
129
|
+
columnsArray.push({
|
|
130
|
+
columns: columnsInThisRow,
|
|
131
|
+
columnGap: 10,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
// Extract all properties except 'box' from the element
|
|
135
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
136
|
+
const { box, ...elementRest } = elementWithBox;
|
|
137
|
+
let processedValue = columnsArray;
|
|
138
|
+
if (context._adapters) {
|
|
139
|
+
processedValue = await (0, adapter_processor_1.processDocument)(columnsArray, context._adapters, context);
|
|
140
|
+
}
|
|
141
|
+
// Return the element with columns array replacing the box
|
|
142
|
+
return {
|
|
143
|
+
...elementRest,
|
|
144
|
+
stack: processedValue,
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
};
|
|
148
|
+
exports.boxDataAdapter = boxDataAdapter;
|
|
149
|
+
/**
|
|
150
|
+
* Main box adapter that chains all box transformation adapters.
|
|
151
|
+
*
|
|
152
|
+
* This adapter first converts a `fun` property to box data using boxFunAdapter,
|
|
153
|
+
* then transforms the box data to columns with cards using boxDataAdapter.
|
|
154
|
+
*
|
|
155
|
+
* @returns An asynchronous function that applies all box adapters in sequence.
|
|
156
|
+
*/
|
|
157
|
+
const boxAdapter = () => {
|
|
158
|
+
return async (element, context) => {
|
|
159
|
+
const adaptedElement = await (0, exports.boxFunAdapter)()(element, context);
|
|
160
|
+
return (0, exports.boxDataAdapter)()(adaptedElement, context);
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
exports.boxAdapter = boxAdapter;
|
|
164
|
+
//# sourceMappingURL=box-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box-adapter.js","sourceRoot":"","sources":["../../../../../../src/converters/pdf/pdfmake/adapters/box/box-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["// ...\n\nimport { PdfMakeConverterContext } from \"../../pdfmake.types\";\n\nimport { SmeupDataStructureType } from \"../../../../../types/data-structures/smeupDataStructure\";\nimport { SmeupDataTable } from \"../../../../../types/data-structures/smeupDataTable\";\nimport { BoxOptions } from \"../../../../../types/component\";\nimport { buildLayout1, buildLayout2, buildLayout5 } from \"./box-layouts\";\nimport { processDocument } from \"../../adapter-processor\";\n\ninterface ContentBoxExtension {\n box: {\n smeup?: {\n data?: SmeupDataTable;\n fun?: string;\n options?: BoxOptions;\n };\n };\n}\n\ninterface ElementWithBoxExtension {\n box: ContentBoxExtension[\"box\"];\n [key: string]: unknown;\n}\n\nconst hasSmeupBoxData = (\n element: unknown,\n): element is ElementWithBoxExtension => {\n const box = (element as Record<string, unknown>)\n ?.box as ContentBoxExtension[\"box\"];\n const data = box?.smeup?.data as SmeupDataTable | undefined;\n return (\n data?.type === SmeupDataStructureType.SmeupDataTable &&\n Array.isArray(data?.rows) &&\n Array.isArray(data?.columns)\n );\n};\n\nconst hasSmeupBox = (element: unknown): element is ElementWithBoxExtension => {\n const box = (element as Record<string, unknown>)\n ?.box as ContentBoxExtension[\"box\"];\n const fun = box?.smeup?.fun;\n return typeof fun === \"string\" && fun.length > 0;\n};\n\n/**\n * Adapter function for converting a box element with a `fun` property to a Smeup box structure.\n *\n * This function returns an asynchronous converter that checks if the provided element contains\n * a box with a `fun` property. If present, it uses the `getSmeupDataStructure` function from\n * the context to fetch the box data corresponding to the `fun` string, and replaces the original\n * box's `fun` property with the fetched data under the `data` property. All other properties\n * of the box are preserved.\n *\n * @returns An asynchronous function that takes an element and a context, and returns the adapted element.\n *\n * @throws If the context does not provide a `getSmeupDataStructure` function when the `fun` property is used.\n *\n * @param element - The input element to be adapted.\n * @param context - The conversion context, which must provide `getSmeupDataStructure` if the `fun` property is present.\n */\nexport const boxFunAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<unknown> => {\n if (!hasSmeupBox(element)) {\n return element;\n } else {\n if (!context.getSmeupDataStructure) {\n throw new Error(\n \"getSmeupDataStructure function is required in context when the fun property is used\",\n );\n } else {\n const elementWithBox = element as ElementWithBoxExtension;\n const funStr = elementWithBox.box.smeup!.fun!;\n const boxData = (await context.getSmeupDataStructure(\n funStr,\n )) as SmeupDataTable;\n\n // Extract all properties except 'fun' from the smeup object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { fun, ...smeupRest } = elementWithBox.box.smeup!;\n // Extract all properties except 'smeup' from the box object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { smeup, ...boxRest } = elementWithBox.box;\n\n return {\n ...elementWithBox,\n box: {\n ...boxRest,\n smeup: {\n ...smeupRest,\n data: boxData,\n },\n },\n };\n }\n }\n };\n};\n\n/**\n * Adapts a Smeup box structure to PDFMake columns with cards.\n *\n * This adapter function checks if the provided element contains a box with data.\n * If so, it generates columns containing cards from the data rows and replaces the box\n * object with column structures. The number of columns and which data columns to display\n * are determined by the options.\n *\n * @returns A function that takes an element and returns the adapted element for PDFMake,\n * or the original element if it does not contain a valid box with data.\n * @throws If options.Columns is missing or empty.\n */\n// Map of available layout builders\nconst layoutBuilders: Record<string, typeof buildLayout1> = {\n \"1\": buildLayout1,\n \"2\": buildLayout2,\n \"5\": buildLayout5,\n};\n\nexport const boxDataAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<unknown> => {\n if (!hasSmeupBoxData(element)) {\n return element;\n }\n\n const elementWithBox = element as ElementWithBoxExtension;\n const data = elementWithBox.box.smeup!.data!;\n const options = elementWithBox.box.smeup!.options as BoxOptions | undefined;\n\n // Validate that options.Columns exists\n if (!options?.Columns || options.Columns.trim().length === 0) {\n throw new Error(\"options.Columns is required for box adapter\");\n }\n\n // Parse column names from options.Columns (pipe-separated)\n const columnNames = options.Columns.split(\"|\")\n .map(name => name.trim())\n .filter(name => name.length > 0);\n\n // Parse number of columns (default to 1)\n const numCols = options.Cols ? parseInt(options.Cols, 10) : 1;\n const cols = isNaN(numCols) || numCols < 1 ? 1 : numCols;\n\n // Distribute rows horizontally across columns\n const rows = data.rows;\n const columnsArray: unknown[] = [];\n\n // Select the appropriate layout builder (default: layout 1)\n const buildLayout =\n layoutBuilders[options.LayoutNbr || \"1\"] || buildLayout1;\n\n // Calculate how many complete rows of columns we'll have\n let rowIndex = 0;\n\n while (rowIndex < rows.length) {\n const columnsInThisRow: unknown[] = [];\n\n // Fill this row with up to 'cols' cards\n for (\n let colIndex = 0;\n colIndex < cols && rowIndex < rows.length;\n colIndex++\n ) {\n const card = buildLayout(\n rows[rowIndex],\n data.columns,\n columnNames,\n context,\n options,\n );\n columnsInThisRow.push(card);\n rowIndex++;\n }\n\n // Fill with empty objects to ensure the number of columns is always a multiple of cols\n while (columnsInThisRow.length < cols) {\n columnsInThisRow.push({});\n }\n\n // Add this row of columns to the array\n columnsArray.push({\n columns: columnsInThisRow,\n columnGap: 10,\n });\n }\n\n // Extract all properties except 'box' from the element\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { box, ...elementRest } = elementWithBox;\n\n let processedValue: unknown = columnsArray;\n if (context._adapters) {\n processedValue = await processDocument(\n columnsArray,\n context._adapters,\n context,\n );\n }\n\n // Return the element with columns array replacing the box\n return {\n ...elementRest,\n stack: processedValue,\n };\n };\n};\n\n/**\n * Main box adapter that chains all box transformation adapters.\n *\n * This adapter first converts a `fun` property to box data using boxFunAdapter,\n * then transforms the box data to columns with cards using boxDataAdapter.\n *\n * @returns An asynchronous function that applies all box adapters in sequence.\n */\nexport const boxAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<unknown> => {\n const adaptedElement = await boxFunAdapter()(element, context);\n return boxDataAdapter()(adaptedElement, context);\n };\n};\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { SmeupDataRow, SmeupDataColumn } from "../../../../../types/data-structures/smeupDataTable";
|
|
2
|
+
import { PdfMakeConverterContext } from "../../pdfmake.types";
|
|
3
|
+
import { BoxOptions } from "../../../../../types/component";
|
|
4
|
+
export declare const buildLayout1: (row: SmeupDataRow, columns: SmeupDataColumn[], columnNames: string[], context: PdfMakeConverterContext, options: BoxOptions) => unknown;
|
|
5
|
+
export declare const buildLayout2: (row: SmeupDataRow, columns: SmeupDataColumn[], columnNames: string[], context: PdfMakeConverterContext, options: BoxOptions) => unknown;
|
|
6
|
+
export declare const buildLayout5: (row: SmeupDataRow, columns: SmeupDataColumn[], columnNames: string[], context: PdfMakeConverterContext, options: BoxOptions) => unknown;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildLayout5 = exports.buildLayout2 = exports.buildLayout1 = void 0;
|
|
4
|
+
const types_1 = require("../../../../../types");
|
|
5
|
+
const commons_utility_1 = require("../../../../../utils/commons-utility");
|
|
6
|
+
const cells_utility_1 = require("../../../../../utils/cells-utility");
|
|
7
|
+
const helpers_1 = require("../helpers");
|
|
8
|
+
const buildLayout1 = (row, columns, columnNames, context, options) => {
|
|
9
|
+
return buildTwoColumnLayout(row, columns, columnNames, context, options, {}, { bold: true });
|
|
10
|
+
};
|
|
11
|
+
exports.buildLayout1 = buildLayout1;
|
|
12
|
+
const buildLayout2 = (row, columns, columnNames, context, options) => {
|
|
13
|
+
return buildTwoColumnLayout(row, columns, columnNames, context, options, {}, { bold: true, alignment: "right" });
|
|
14
|
+
};
|
|
15
|
+
exports.buildLayout2 = buildLayout2;
|
|
16
|
+
const buildLayout5 = (row, columns, columnNames, context, options) => {
|
|
17
|
+
const body = [];
|
|
18
|
+
// Check if there's an image cell
|
|
19
|
+
let imageCell = null;
|
|
20
|
+
const dataCells = [];
|
|
21
|
+
for (const columnName of columnNames) {
|
|
22
|
+
// Find the column definition
|
|
23
|
+
const columnDef = columns.find(col => col.name === columnName);
|
|
24
|
+
if (!columnDef) {
|
|
25
|
+
console.warn(`Column "${columnName}" not found in data columns`);
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
// Get the label (title with fallback to name)
|
|
29
|
+
const label = columnDef.title || columnDef.name;
|
|
30
|
+
// Get the cell
|
|
31
|
+
const cell = row.cells?.[columnName] ?? {
|
|
32
|
+
value: "",
|
|
33
|
+
obj: { t: "", p: "", k: "" },
|
|
34
|
+
};
|
|
35
|
+
// Check if this is an image cell
|
|
36
|
+
if ((0, cells_utility_1.cellIsImage)(cell) && !imageCell) {
|
|
37
|
+
imageCell = cell;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
const value = (0, commons_utility_1.calculateCellValue)(cell, types_1.SupportedExportFormats.PDF, context.webupManagerData);
|
|
41
|
+
dataCells.push({ label, value });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Build the table body
|
|
45
|
+
const hasImage = imageCell !== null;
|
|
46
|
+
for (let i = 0; i < dataCells.length; i++) {
|
|
47
|
+
const { label, value } = dataCells[i];
|
|
48
|
+
const labelCell = {
|
|
49
|
+
text: label,
|
|
50
|
+
style: "box__label",
|
|
51
|
+
alignment: "right",
|
|
52
|
+
bold: false,
|
|
53
|
+
};
|
|
54
|
+
const valueCell = {
|
|
55
|
+
text: value,
|
|
56
|
+
style: "box__value",
|
|
57
|
+
bold: true,
|
|
58
|
+
};
|
|
59
|
+
const row = [];
|
|
60
|
+
// Add image column if present
|
|
61
|
+
if (hasImage) {
|
|
62
|
+
if (i === 0) {
|
|
63
|
+
// First row: include image with rowspan
|
|
64
|
+
row.push((0, helpers_1.buildImageCell)(imageCell, options, dataCells.length));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// Subsequent rows: empty cell (handled by rowspan)
|
|
68
|
+
row.push({});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
row.push(labelCell, valueCell);
|
|
72
|
+
body.push(row);
|
|
73
|
+
}
|
|
74
|
+
return buildCard({
|
|
75
|
+
table: {
|
|
76
|
+
widths: hasImage ? ["33%", "*", "*"] : ["*", "*"],
|
|
77
|
+
body: body,
|
|
78
|
+
},
|
|
79
|
+
layout: "noBorders",
|
|
80
|
+
padding: [10, 10, 10, 10],
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
exports.buildLayout5 = buildLayout5;
|
|
84
|
+
const buildTwoColumnLayout = (row, columns, columnNames, context, options, labelInnerStyle, valueInnerStyle) => {
|
|
85
|
+
const body = [];
|
|
86
|
+
for (const columnName of columnNames) {
|
|
87
|
+
// Find the column definition
|
|
88
|
+
const columnDef = columns.find(col => col.name === columnName);
|
|
89
|
+
if (!columnDef) {
|
|
90
|
+
console.warn(`Column "${columnName}" not found in data columns`);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
// Get the label (title with fallback to name)
|
|
94
|
+
const label = columnDef.title || columnDef.name;
|
|
95
|
+
// Get the cell value (empty string if missing)
|
|
96
|
+
const cell = row.cells?.[columnName] ?? {
|
|
97
|
+
value: "",
|
|
98
|
+
obj: { t: "", p: "", k: "" },
|
|
99
|
+
};
|
|
100
|
+
const value = (0, commons_utility_1.calculateCellValue)(cell, types_1.SupportedExportFormats.PDF, context.webupManagerData);
|
|
101
|
+
body.push([
|
|
102
|
+
{
|
|
103
|
+
text: [{ text: label, ...labelInnerStyle }],
|
|
104
|
+
style: "box__label",
|
|
105
|
+
},
|
|
106
|
+
(0, cells_utility_1.cellIsImage)(cell)
|
|
107
|
+
? (0, helpers_1.buildImageCell)(cell, options)
|
|
108
|
+
: {
|
|
109
|
+
text: [{ text: value, ...valueInnerStyle }],
|
|
110
|
+
style: "box__value",
|
|
111
|
+
},
|
|
112
|
+
]);
|
|
113
|
+
}
|
|
114
|
+
return buildCard({
|
|
115
|
+
table: {
|
|
116
|
+
widths: ["*", "*"],
|
|
117
|
+
body: body,
|
|
118
|
+
},
|
|
119
|
+
layout: "noBorders",
|
|
120
|
+
padding: [10, 10, 10, 10],
|
|
121
|
+
});
|
|
122
|
+
};
|
|
123
|
+
const buildCard = (content) => {
|
|
124
|
+
return {
|
|
125
|
+
table: {
|
|
126
|
+
widths: ["*"],
|
|
127
|
+
body: [[content]],
|
|
128
|
+
},
|
|
129
|
+
layout: {
|
|
130
|
+
hLineWidth: function (_i, _node) {
|
|
131
|
+
return 1;
|
|
132
|
+
},
|
|
133
|
+
vLineWidth: function (_i, _node) {
|
|
134
|
+
return 1;
|
|
135
|
+
},
|
|
136
|
+
hLineColor: function (_i, _node) {
|
|
137
|
+
return "#CCCCCC";
|
|
138
|
+
},
|
|
139
|
+
vLineColor: function (_i, _node) {
|
|
140
|
+
return "#CCCCCC";
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
margin: [0, 0, 0, 10],
|
|
144
|
+
unbreakable: true,
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
//# sourceMappingURL=box-layouts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box-layouts.js","sourceRoot":"","sources":["../../../../../../src/converters/pdf/pdfmake/adapters/box/box-layouts.ts"],"names":[],"mappings":"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","sourcesContent":["import { Content, Style } from \"pdfmake/interfaces\";\nimport { SupportedExportFormats } from \"../../../../../types\";\nimport {\n SmeupDataRow,\n SmeupDataColumn,\n SmeupDataCell,\n} from \"../../../../../types/data-structures/smeupDataTable\";\nimport { calculateCellValue } from \"../../../../../utils/commons-utility\";\nimport { PdfMakeConverterContext } from \"../../pdfmake.types\";\nimport { BoxOptions } from \"../../../../../types/component\";\nimport { cellIsImage } from \"../../../../../utils/cells-utility\";\nimport { buildImageCell } from \"../helpers\";\n\nexport const buildLayout1 = (\n row: SmeupDataRow,\n columns: SmeupDataColumn[],\n columnNames: string[],\n context: PdfMakeConverterContext,\n options: BoxOptions,\n): unknown => {\n return buildTwoColumnLayout(\n row,\n columns,\n columnNames,\n context,\n options,\n {},\n { bold: true },\n );\n};\n\nexport const buildLayout2 = (\n row: SmeupDataRow,\n columns: SmeupDataColumn[],\n columnNames: string[],\n context: PdfMakeConverterContext,\n options: BoxOptions,\n): unknown => {\n return buildTwoColumnLayout(\n row,\n columns,\n columnNames,\n context,\n options,\n {},\n { bold: true, alignment: \"right\" },\n );\n};\n\nexport const buildLayout5 = (\n row: SmeupDataRow,\n columns: SmeupDataColumn[],\n columnNames: string[],\n context: PdfMakeConverterContext,\n options: BoxOptions,\n): unknown => {\n const body: unknown[][] = [];\n\n // Check if there's an image cell\n let imageCell: SmeupDataCell | null = null;\n const dataCells: Array<{ label: string; value: string }> = [];\n\n for (const columnName of columnNames) {\n // Find the column definition\n const columnDef = columns.find(col => col.name === columnName);\n\n if (!columnDef) {\n console.warn(`Column \"${columnName}\" not found in data columns`);\n continue;\n }\n\n // Get the label (title with fallback to name)\n const label = columnDef.title || columnDef.name;\n\n // Get the cell\n const cell = (row.cells?.[columnName] as SmeupDataCell) ?? {\n value: \"\",\n obj: { t: \"\", p: \"\", k: \"\" },\n };\n\n // Check if this is an image cell\n if (cellIsImage(cell) && !imageCell) {\n imageCell = cell;\n } else {\n const value = calculateCellValue(\n cell,\n SupportedExportFormats.PDF,\n context.webupManagerData,\n ) as string;\n dataCells.push({ label, value });\n }\n }\n\n // Build the table body\n const hasImage = imageCell !== null;\n\n for (let i = 0; i < dataCells.length; i++) {\n const { label, value } = dataCells[i];\n\n const labelCell = {\n text: label,\n style: \"box__label\",\n alignment: \"right\",\n bold: false,\n };\n\n const valueCell = {\n text: value,\n style: \"box__value\",\n bold: true,\n };\n\n const row: unknown[] = [];\n\n // Add image column if present\n if (hasImage) {\n if (i === 0) {\n // First row: include image with rowspan\n row.push(buildImageCell(imageCell!, options, dataCells.length));\n } else {\n // Subsequent rows: empty cell (handled by rowspan)\n row.push({});\n }\n }\n\n row.push(labelCell, valueCell);\n body.push(row);\n }\n\n return buildCard({\n table: {\n widths: hasImage ? [\"33%\", \"*\", \"*\"] : [\"*\", \"*\"],\n body: body,\n },\n layout: \"noBorders\",\n padding: [10, 10, 10, 10],\n } as Content);\n};\n\nconst buildTwoColumnLayout = (\n row: SmeupDataRow,\n columns: SmeupDataColumn[],\n columnNames: string[],\n context: PdfMakeConverterContext,\n options: BoxOptions,\n labelInnerStyle: Style,\n valueInnerStyle: Style,\n): unknown => {\n const body: unknown[] = [];\n\n for (const columnName of columnNames) {\n // Find the column definition\n const columnDef = columns.find(col => col.name === columnName);\n\n if (!columnDef) {\n console.warn(`Column \"${columnName}\" not found in data columns`);\n continue;\n }\n\n // Get the label (title with fallback to name)\n const label = columnDef.title || columnDef.name;\n\n // Get the cell value (empty string if missing)\n const cell = (row.cells?.[columnName] as SmeupDataCell) ?? {\n value: \"\",\n obj: { t: \"\", p: \"\", k: \"\" },\n };\n const value = calculateCellValue(\n cell,\n SupportedExportFormats.PDF,\n context.webupManagerData,\n );\n\n body.push([\n {\n text: [{ text: label, ...labelInnerStyle }],\n style: \"box__label\",\n },\n cellIsImage(cell)\n ? buildImageCell(cell, options)\n : {\n text: [{ text: value, ...valueInnerStyle }],\n style: \"box__value\",\n },\n ]);\n }\n\n return buildCard({\n table: {\n widths: [\"*\", \"*\"],\n body: body,\n },\n layout: \"noBorders\",\n padding: [10, 10, 10, 10],\n } as Content);\n};\n\nconst buildCard = (content: Content): unknown => {\n return {\n table: {\n widths: [\"*\"],\n body: [[content]],\n },\n layout: {\n hLineWidth: function (_i: number, _node: unknown) {\n return 1;\n },\n vLineWidth: function (_i: number, _node: unknown) {\n return 1;\n },\n hLineColor: function (_i: number, _node: unknown) {\n return \"#CCCCCC\";\n },\n vLineColor: function (_i: number, _node: unknown) {\n return \"#CCCCCC\";\n },\n },\n margin: [0, 0, 0, 10],\n unbreakable: true,\n };\n};\n"]}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
// ...
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.chartAdapter = exports.funToSmeupChartAdapter = exports.smeupChartToPdfMakeSvgAdapter = void 0;
|
|
5
|
-
const smeupDataStructure_1 = require("
|
|
6
|
-
const charts_converter_1 = require("
|
|
5
|
+
const smeupDataStructure_1 = require("../../../../../types/data-structures/smeupDataStructure");
|
|
6
|
+
const charts_converter_1 = require("../../../../images/charts-converter");
|
|
7
7
|
const hasChartWithData = (element) => {
|
|
8
8
|
const chart = element
|
|
9
9
|
?.chart;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-adapter.js","sourceRoot":"","sources":["../../../../../../src/converters/pdf/pdfmake/adapters/chart/chart-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["// ...\n\nimport {\n PdfMakeConverterContext,\n ContentChartExtension,\n ElementWithChartExtension,\n} from \"../../pdfmake.types\";\n\nimport { SmeupDataStructureType } from \"../../../../../types/data-structures/smeupDataStructure\";\nimport { SmeupDataTable } from \"../../../../../types/data-structures/smeupDataTable\";\nimport { dataTableToChart } from \"../../../../images/charts-converter\";\nimport { ChartOptions } from \"../../../../../types/component\";\n\nconst hasChartWithData = (\n element: unknown,\n): element is ElementWithChartExtension => {\n const chart = (element as Record<string, unknown>)\n ?.chart as ContentChartExtension;\n const data = chart?.smeup?.data as SmeupDataTable | undefined;\n return (\n data?.type === SmeupDataStructureType.SmeupDataTable &&\n Array.isArray(data?.rows) &&\n Array.isArray(data?.columns)\n );\n};\n\nconst hasChartWithFun = (\n element: unknown,\n): element is ElementWithChartExtension => {\n const chart = (element as Record<string, unknown>)\n ?.chart as ContentChartExtension;\n const fun = chart?.smeup?.fun;\n return typeof fun === \"string\" && fun.length > 0;\n};\n\n/**\n * Adapts a Smeup chart structure to the PDFMake SVG format.\n *\n * This adapter function checks if the provided element contains a chart with data.\n * If so, it generates an SVG representation from the chart data and replaces the chart\n * object with an svg property. All properties of the original chart except `data` are preserved.\n *\n * @returns A function that takes an element and returns the adapted element for PDFMake,\n * or the original element if it does not contain a valid chart with data.\n */\nexport const smeupChartToPdfMakeSvgAdapter = () => {\n return async (\n element: unknown,\n _context: PdfMakeConverterContext,\n ): Promise<ElementWithChartExtension> => {\n if (!hasChartWithData(element)) {\n return element as ElementWithChartExtension;\n }\n\n const elementWithChart = element as ElementWithChartExtension;\n const options = elementWithChart.chart.smeup!.options as ChartOptions;\n\n let mergedOptions;\n\n const svg = await dataTableToChart(\n elementWithChart.chart.smeup!.data!,\n options,\n (merged: ChartOptions) => {\n mergedOptions = merged;\n },\n );\n\n const width = mergedOptions!.ForceWidth;\n const height = mergedOptions!.ForceHeight;\n\n return {\n ...elementWithChart,\n svg: svg,\n ...width,\n ...height,\n } as ElementWithChartExtension;\n };\n};\n\n/**\n * Adapter function for converting a chart element with a `fun` property to a Smeup chart structure.\n *\n * This function returns an asynchronous converter that checks if the provided element contains\n * a chart with a `fun` property. If present, it uses the `getSmeupDataStructure` function from\n * the context to fetch the chart data corresponding to the `fun` string, and replaces the original\n * chart's `fun` property with the fetched data under the `data` property. All other properties\n * of the chart are preserved.\n *\n * @returns An asynchronous function that takes an element and a context, and returns the adapted element.\n *\n * @throws If the context does not provide a `getSmeupDataStructure` function when the `fun` property is used.\n *\n * @param element - The input element to be adapted.\n * @param context - The conversion context, which must provide `getSmeupDataStructure` if the `fun` property is present.\n */\nexport const funToSmeupChartAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<ElementWithChartExtension> => {\n if (!hasChartWithFun(element)) {\n return element as ElementWithChartExtension;\n } else {\n if (!context.getSmeupDataStructure) {\n throw new Error(\n \"getSmeupDataStructure function is required in context when the fun property is used\",\n );\n } else {\n const elementWithChart = element as ElementWithChartExtension;\n const funStr = elementWithChart.chart.smeup!.fun!;\n const chartData = (await context.getSmeupDataStructure(\n funStr,\n )) as SmeupDataTable;\n\n // Extract all properties except 'fun' from the smeup object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { fun, ...smeupRest } = elementWithChart.chart.smeup!;\n // Extract all properties except 'smeup' from the chart object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { smeup, ...chartRest } = elementWithChart.chart;\n\n return {\n ...elementWithChart,\n chart: {\n ...chartRest,\n smeup: {\n ...smeupRest,\n data: chartData,\n },\n },\n };\n }\n }\n };\n};\n\n/**\n * Main chart adapter that chains all chart transformation adapters.\n *\n * This adapter first converts a `fun` property to chart data using funToSmeupChartAdapter,\n * then transforms the chart data to an SVG format using smeupChartToPdfMakeSvgAdapter.\n *\n * @returns An asynchronous function that applies all chart adapters in sequence.\n */\nexport const chartAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<ElementWithChartExtension> => {\n const adaptedElement = await funToSmeupChartAdapter()(element, context);\n return (await smeupChartToPdfMakeSvgAdapter()(\n adaptedElement,\n context,\n )) as ElementWithChartExtension;\n };\n};\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { BoxOptions } from "../../../../types/component";
|
|
2
|
+
import { SmeupDataCell } from "../../../../types/data-structures/smeupDataTable";
|
|
3
|
+
export declare const buildImageCell: (imageCell: SmeupDataCell, options: BoxOptions, rowSpan?: number, alignment?: "center" | "left" | "right") => unknown;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildImageCell = void 0;
|
|
4
|
+
const objects_utility_1 = require("../../../../utils/objects-utility");
|
|
5
|
+
const buildImageCell = (imageCell, options, rowSpan = 1, alignment = "left") => {
|
|
6
|
+
const fit = options.ImageFit ? parseInt(options.ImageFit) : 60;
|
|
7
|
+
const imageProvider = (0, objects_utility_1.objectsIsURL)(imageCell.obj)
|
|
8
|
+
? { url: imageCell.obj.k }
|
|
9
|
+
: { obj: { ...imageCell.obj } };
|
|
10
|
+
return {
|
|
11
|
+
image: { smeup: imageProvider },
|
|
12
|
+
fit: [fit, fit],
|
|
13
|
+
alignment: alignment,
|
|
14
|
+
rowSpan: rowSpan,
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
exports.buildImageCell = buildImageCell;
|
|
18
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../../src/converters/pdf/pdfmake/adapters/helpers.ts"],"names":[],"mappings":";;;AAEA,uEAAiE;AAE1D,MAAM,cAAc,GAAG,CAC5B,SAAwB,EACxB,OAAmB,EACnB,UAAkB,CAAC,EACnB,YAAyC,MAAM,EACtC,EAAE;IACX,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,MAAM,aAAa,GAAG,IAAA,8BAAY,EAAC,SAAS,CAAC,GAAG,CAAC;QAC/C,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,GAAI,CAAC,CAAC,EAAE;QAC3B,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC;IAClC,OAAO;QACL,KAAK,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;QAC/B,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;QACf,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,OAAO;KACjB,CAAC;AACJ,CAAC,CAAC;AAhBW,QAAA,cAAc,kBAgBzB","sourcesContent":["import { BoxOptions } from \"../../../../types/component\";\nimport { SmeupDataCell } from \"../../../../types/data-structures/smeupDataTable\";\nimport { objectsIsURL } from \"../../../../utils/objects-utility\";\n\nexport const buildImageCell = (\n imageCell: SmeupDataCell,\n options: BoxOptions,\n rowSpan: number = 1,\n alignment: \"center\" | \"left\" | \"right\" = \"left\",\n): unknown => {\n const fit = options.ImageFit ? parseInt(options.ImageFit) : 60;\n const imageProvider = objectsIsURL(imageCell.obj)\n ? { url: imageCell.obj!.k }\n : { obj: { ...imageCell.obj } };\n return {\n image: { smeup: imageProvider },\n fit: [fit, fit],\n alignment: alignment,\n rowSpan: rowSpan,\n };\n};\n"]}
|
package/dist/converters/pdf/pdfmake/adapters/{image-adapter.d.ts → image/image-adapter.d.ts}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ContentImageExtension, ElementWithImageExtension, PdfMakeConverterContext } from "
|
|
1
|
+
import { ContentImageExtension, ElementWithImageExtension, PdfMakeConverterContext } from "../../pdfmake.types";
|
|
2
2
|
/**
|
|
3
3
|
* Adapts a Smeup image structure to the PDFMake image format.
|
|
4
4
|
*
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.imageAdapter = exports.objectToUrlAdapter = exports.urlToImageAdapter = void 0;
|
|
4
|
+
const gfx_data_1 = require("../../../../../assets/gfx-data");
|
|
4
5
|
const hasSmeupUrl = (element) => {
|
|
5
6
|
const image = element
|
|
6
7
|
.image;
|
|
@@ -23,20 +24,26 @@ function hasSmeupObject(element) {
|
|
|
23
24
|
* @throws If the download fails, content-type is not an image, or network error occurs
|
|
24
25
|
*/
|
|
25
26
|
const downloadImageAsDataUrl = async (url, fetchData) => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
try {
|
|
28
|
+
const response = await fetchData(url);
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
throw new Error(`Failed to download image from ${url}: ${response.status} ${response.statusText}`);
|
|
31
|
+
}
|
|
32
|
+
// Extract content-type from headers
|
|
33
|
+
const contentType = response.headers.get("content-type") || "image/jpeg";
|
|
34
|
+
// Validate that content-type is an image
|
|
35
|
+
if (!contentType.startsWith("image/")) {
|
|
36
|
+
throw new Error(`Invalid content-type for image: expected image/*, got ${contentType}`);
|
|
37
|
+
}
|
|
38
|
+
// Get image data and convert to base64
|
|
39
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
40
|
+
const base64 = Buffer.from(arrayBuffer).toString("base64");
|
|
41
|
+
return `data:${contentType};base64,${base64}`;
|
|
29
42
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if (!contentType.startsWith("image/")) {
|
|
34
|
-
throw new Error(`Invalid content-type for image: expected image/*, got ${contentType}`);
|
|
43
|
+
catch (error) {
|
|
44
|
+
console.error(error);
|
|
45
|
+
return gfx_data_1.brokenImage;
|
|
35
46
|
}
|
|
36
|
-
// Get image data and convert to base64
|
|
37
|
-
const arrayBuffer = await response.arrayBuffer();
|
|
38
|
-
const base64 = Buffer.from(arrayBuffer).toString("base64");
|
|
39
|
-
return `data:${contentType};base64,${base64}`;
|
|
40
47
|
};
|
|
41
48
|
/**
|
|
42
49
|
* Adapts a Smeup image structure to the PDFMake image format.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-adapter.js","sourceRoot":"","sources":["../../../../../../src/converters/pdf/pdfmake/adapters/image/image-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { SmeupDataTree } from \"../../../../../types/data-structures/smeupDataTree\";\nimport {\n ContentImageExtension,\n ElementWithImageExtension,\n PdfMakeConverterContext,\n} from \"../../pdfmake.types\";\nimport { brokenImage } from \"../../../../../assets/gfx-data\";\n\nconst hasSmeupUrl = (element: unknown): boolean => {\n const image = (element as Record<string, unknown>)\n .image as ContentImageExtension;\n const url = image?.smeup?.url;\n return typeof url === \"string\" && url.length > 0;\n};\n\nfunction hasSmeupObject(element: unknown): boolean {\n const image = (element as Record<string, unknown>)\n .image as ContentImageExtension;\n const obj = image?.smeup?.obj;\n return typeof obj === \"object\" && obj !== null;\n}\n\n/**\n * Downloads an image from a URL and converts it to a data URL format.\n * Validates that the content-type is an image MIME type.\n *\n * @param url - The URL of the image to download\n * @param fetchData - Callback function to fetch the image data\n * @returns A data URL string in the format: data:image/jpeg;base64,<base64>\n * @throws If the download fails, content-type is not an image, or network error occurs\n */\nconst downloadImageAsDataUrl = async (\n url: string,\n fetchData: (url: string) => Promise<Response>,\n): Promise<string> => {\n try {\n const response = await fetchData(url);\n\n if (!response.ok) {\n throw new Error(\n `Failed to download image from ${url}: ${response.status} ${response.statusText}`,\n );\n }\n\n // Extract content-type from headers\n const contentType = response.headers.get(\"content-type\") || \"image/jpeg\";\n\n // Validate that content-type is an image\n if (!contentType.startsWith(\"image/\")) {\n throw new Error(\n `Invalid content-type for image: expected image/*, got ${contentType}`,\n );\n }\n\n // Get image data and convert to base64\n const arrayBuffer = await response.arrayBuffer();\n const base64 = Buffer.from(arrayBuffer).toString(\"base64\");\n\n return `data:${contentType};base64,${base64}`;\n } catch (error) {\n console.error(error);\n return brokenImage;\n }\n};\n\n/**\n * Adapts a Smeup image structure to the PDFMake image format.\n *\n * This adapter function checks if the provided element contains an image with a smeup URL.\n * If so, it downloads the image using the fetchData callback from context, validates the\n * content-type, and transforms it into a data URL format that PDFMake can use.\n * The data URL is stored in context.pdfDocument.images to avoid redundancy when the same\n * image is referenced multiple times.\n * All properties of the original image except `smeup` are preserved.\n *\n * @returns An async function that takes an element and returns the adapted element for PDFMake,\n * or the original element if it does not contain a valid smeup image.\n * @throws If the context does not provide a fetchData function when the smeup image is used.\n * @throws If the image download fails or the content-type is not a valid image MIME type.\n */\nexport const urlToImageAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<ContentImageExtension> => {\n if (!hasSmeupUrl(element)) {\n return element as ContentImageExtension;\n }\n\n if (!context.fetchData) {\n throw new Error(\n \"fetchData function is required in context when the smeup image property is used\",\n );\n }\n\n const elementImage = element as { image: { smeup: { url: string } } };\n const url = elementImage.image.smeup.url;\n\n // Ensure pdfDocument exists in context\n if (!context.pdfDocument) {\n throw new Error(\n \"pdfDocument is required in context when the smeup image property is used\",\n );\n }\n\n // Initialize images dictionary if not present\n if (!context.pdfDocument.images) {\n context.pdfDocument.images = {};\n }\n\n // Download and cache the image only if not already present\n if (!context.pdfDocument.images[url]) {\n const dataUrl = await downloadImageAsDataUrl(url, context.fetchData);\n context.pdfDocument.images[url] = dataUrl;\n }\n\n // Extract all properties except 'smeup' from the image object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { smeup, ...imageRest } = elementImage.image;\n\n return {\n ...elementImage,\n image: url,\n ...imageRest,\n };\n };\n};\n\nexport const objectToUrlAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<ElementWithImageExtension> => {\n if (!hasSmeupObject(element)) {\n return element as ElementWithImageExtension;\n }\n if (!context.getSmeupDataStructure || !context.damSvcEndpoint) {\n throw new Error(\n \"getSmeupDataStructure function and damSvcEndpoint prop are required in context when the smeup image obj property is used\",\n );\n } else {\n const elementImage = element as ElementWithImageExtension;\n const obj = elementImage.image.smeup?.obj;\n if (!obj || !obj.t || !obj.p || !obj.k) {\n throw new Error(\n \"Smeup object must have t, p, and k properties to build GET.PATH function\",\n );\n }\n const funToGetPATH = `F(TRE;JASER_12W;GET.PATH) 1(${obj.t};${obj.p};${obj.k})`;\n const dataTree = (await context.getSmeupDataStructure(\n funToGetPATH,\n )) as SmeupDataTree;\n if (dataTree.children?.length === 0) {\n throw new Error(`No data found for function ${funToGetPATH}`);\n } else {\n const pathNode = dataTree.children[0].value.replace(/\\\\/g, \"/\");\n const pathEncoded = encodeURIComponent(pathNode);\n const url = context.damSvcEndpoint + \"/\" + pathEncoded;\n\n // Extract all properties except 'smeup' from the image object\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { smeup, ...imageRest } = elementImage.image;\n\n return {\n ...elementImage,\n image: {\n smeup: {\n url,\n },\n ...imageRest,\n },\n };\n }\n }\n };\n};\n\nexport const imageAdapter = () => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<ContentImageExtension> => {\n try {\n const adaptedElement = await objectToUrlAdapter()(element, context);\n return await urlToImageAdapter()(adaptedElement, context);\n } catch (error) {\n console.error(error);\n const errorMessage = (error as Error).message;\n const cause = (error as Error & { cause?: Error }).cause;\n const causeMessage = cause ? `\\nCause: ${cause.message || cause}` : \"\";\n return {\n text: `Error loading image: ${errorMessage}${causeMessage}`,\n fontSize: 10,\n color: \"#8B0000\",\n } as unknown as ContentImageExtension;\n }\n };\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-adapter.js","sourceRoot":"","sources":["../../../../../../src/converters/pdf/pdfmake/adapters/layout/layout-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ElementWithLayout,\n Layout,\n LayoutColorFunction,\n LayoutLineFunction,\n PdfMakeConverterContext,\n} from \"../../pdfmake.types\";\n\nconst hasLayout = (element: unknown): boolean => {\n const layout = (element as Record<string, unknown>).layout;\n return typeof layout === \"object\" && layout !== null;\n};\n\nconst needsLayoutAdaptation = (element: unknown): boolean => {\n if (!hasLayout(element)) {\n return false;\n }\n\n const layout = (element as ElementWithLayout).layout!;\n\n // Check if any of the properties needs conversion\n const needsHLineWidthConversion =\n layout.hLineWidth !== undefined && typeof layout.hLineWidth !== \"function\";\n const needsVLineWidthConversion =\n layout.vLineWidth !== undefined && typeof layout.vLineWidth !== \"function\";\n const needsHLineColorConversion =\n layout.hLineColor !== undefined && typeof layout.hLineColor !== \"function\";\n const needsVLineColorConversion =\n layout.vLineColor !== undefined && typeof layout.vLineColor !== \"function\";\n\n return (\n needsHLineWidthConversion ||\n needsVLineWidthConversion ||\n needsHLineColorConversion ||\n needsVLineColorConversion\n );\n};\n\n/**\n * Adapts a layout object by converting static values to functions.\n *\n * This adapter function checks if the provided element contains a layout with static values\n * for hLineWidth, vLineWidth, hLineColor, and vLineColor properties.\n * If so, it converts them to functions as required by PDFMake:\n * - hLineWidth and vLineWidth (numbers) are converted to: function(i) { return value; }\n * - hLineColor and vLineColor (strings) are converted to: function(i) { return value; }\n *\n * All other properties of the layout are preserved.\n *\n * @returns A function that takes an element and returns the adapted element for PDFMake,\n * or the original element if it does not contain a layout that needs adaptation.\n */\nexport const layoutAdapter = () => {\n return async (\n element: unknown,\n _context: PdfMakeConverterContext,\n ): Promise<ElementWithLayout> => {\n if (!needsLayoutAdaptation(element)) {\n return element as ElementWithLayout;\n }\n\n const elementWithLayout = element as ElementWithLayout;\n const originalLayout = elementWithLayout.layout!;\n const adaptedLayout: Layout = { ...originalLayout };\n\n // Convert hLineWidth if it's a number\n if (\n originalLayout.hLineWidth !== undefined &&\n typeof originalLayout.hLineWidth === \"number\"\n ) {\n const value = originalLayout.hLineWidth;\n adaptedLayout.hLineWidth = ((_i: number) => value) as LayoutLineFunction;\n }\n\n // Convert vLineWidth if it's a number\n if (\n originalLayout.vLineWidth !== undefined &&\n typeof originalLayout.vLineWidth === \"number\"\n ) {\n const value = originalLayout.vLineWidth;\n adaptedLayout.vLineWidth = ((_i: number) => value) as LayoutLineFunction;\n }\n\n // Convert hLineColor if it's a string\n if (\n originalLayout.hLineColor !== undefined &&\n typeof originalLayout.hLineColor === \"string\"\n ) {\n const value = originalLayout.hLineColor;\n adaptedLayout.hLineColor = ((_i: number) => value) as LayoutColorFunction;\n }\n\n // Convert vLineColor if it's a string\n if (\n originalLayout.vLineColor !== undefined &&\n typeof originalLayout.vLineColor === \"string\"\n ) {\n const value = originalLayout.vLineColor;\n adaptedLayout.vLineColor = ((_i: number) => value) as LayoutColorFunction;\n }\n\n return {\n ...elementWithLayout,\n layout: adaptedLayout,\n };\n };\n};\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.footerAdapter = exports.headerAdapter = void 0;
|
|
4
|
-
const adapter_processor_1 = require("
|
|
4
|
+
const adapter_processor_1 = require("../../adapter-processor");
|
|
5
5
|
/**
|
|
6
6
|
* Type guard to check if an element has a specific property
|
|
7
7
|
*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-element-adapter.js","sourceRoot":"","sources":["../../../../../../src/converters/pdf/pdfmake/adapters/page-alement/page-element-adapter.ts"],"names":[],"mappings":";;;AACA,+DAA0D;AAG1D;;GAEG;AACH,MAAM,WAAW,GAAG,CAClB,OAAgB,EAChB,YAAe,EACiC,EAAE;IAClD,OAAO,CACL,OAAO,KAAK,IAAI;QAChB,OAAO,OAAO,KAAK,QAAQ;QAC3B,YAAY,IAAI,OAAO;QACtB,OAAmC,CAAC,YAAY,CAAC,KAAK,SAAS,CACjE,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,mBAAmB,GAAG,CAC1B,GAAY,EACZ,WAAmB,EACnB,SAAiB,EACR,EAAE;IACX,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,GAAG;aACP,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;aAChD,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,wBAAwB,GAAG,CAAC,YAAiC,EAAE,EAAE;IACrE,OAAO,KAAK,EACV,OAAgB,EAChB,OAAgC,EACd,EAAE;QACpB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC;YACxC,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QAE5C,oDAAoD;QACpD,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE,CAAC;YACxC,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,yEAAyE;QACzE,mFAAmF;QACnF,IAAI,cAAc,GAAY,aAAa,CAAC;QAC5C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,cAAc,GAAG,MAAM,IAAA,mCAAe,EACpC,aAAa,EACb,OAAO,CAAC,SAAS,EACjB,OAAO,CACR,CAAC;QACJ,CAAC;QAED,0FAA0F;QAC1F,MAAM,cAAc,GAAmB,CACrC,WAAW,EACX,SAAS,EACT,SAAS,EACT,EAAE;YACF,OAAO,mBAAmB,CACxB,cAAc,EACd,WAAW,EACX,SAAS,CACC,CAAC;QACf,CAAC,CAAC;QAEF,OAAO;YACL,GAAG,OAAO;YACV,CAAC,YAAY,CAAC,EAAE,cAAc;SAC/B,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACI,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;AAAzD,QAAA,aAAa,iBAA4C;AAEtE;;GAEG;AACI,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;AAAzD,QAAA,aAAa,iBAA4C","sourcesContent":["import { Content, DynamicContent } from \"pdfmake/interfaces\";\nimport { processDocument } from \"../../adapter-processor\";\nimport { PdfMakeConverterContext } from \"../../pdfmake.types\";\n\n/**\n * Type guard to check if an element has a specific property\n */\nconst hasProperty = <T extends string>(\n element: unknown,\n propertyName: T,\n): element is Record<T, Content | DynamicContent> => {\n return (\n element !== null &&\n typeof element === \"object\" &&\n propertyName in element &&\n (element as Record<string, unknown>)[propertyName] !== undefined\n );\n};\n\n/**\n * Recursively searches for [CurrentPage] and [PageCount] placeholders in an object\n * and replaces them with the actual values.\n *\n * @param obj - The object to process\n * @param currentPage - The current page number\n * @param pageCount - The total page count\n * @returns The processed object with replaced placeholders\n */\nconst replacePlaceholders = (\n obj: unknown,\n currentPage: number,\n pageCount: number,\n): unknown => {\n if (typeof obj === \"string\") {\n return obj\n .replace(/\\[CurrentPage\\]/g, String(currentPage))\n .replace(/\\[PageCount\\]/g, String(pageCount));\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => replacePlaceholders(item, currentPage, pageCount));\n }\n\n if (obj !== null && typeof obj === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = replacePlaceholders(value, currentPage, pageCount);\n }\n return result;\n }\n\n return obj;\n};\n\n/**\n * Adapts a header or footer to support dynamic page number placeholders.\n *\n * This adapter function checks if the provided element contains the specified property (header or footer).\n * - If the property is already a function, it leaves it unchanged.\n * - If the property is an object, it first recursively processes it with all registered adapters,\n * then wraps it in a function that replaces [CurrentPage] with the current page number and\n * [PageCount] with the total page count at rendering time.\n *\n * @param propertyName - The name of the property to adapt ('header' or 'footer')\n * @returns A function that takes an element and returns the adapted element for PDFMake,\n * or the original element if it does not contain the specified property.\n */\nconst createPageElementAdapter = (propertyName: \"header\" | \"footer\") => {\n return async (\n element: unknown,\n context: PdfMakeConverterContext,\n ): Promise<unknown> => {\n if (!hasProperty(element, propertyName)) {\n return element;\n }\n\n const propertyValue = element[propertyName];\n\n // If property is already a function, leave it as is\n if (typeof propertyValue === \"function\") {\n return element;\n }\n\n // First, recursively process the header/footer content with all adapters\n // This ensures nested elements (like tables with layouts) are properly transformed\n let processedValue: unknown = propertyValue;\n if (context._adapters) {\n processedValue = await processDocument(\n propertyValue,\n context._adapters,\n context,\n );\n }\n\n // Then wrap the processed content in a function that replaces placeholders at render time\n const dynamicContent: DynamicContent = (\n currentPage,\n pageCount,\n _pageSize,\n ) => {\n return replacePlaceholders(\n processedValue,\n currentPage,\n pageCount,\n ) as Content;\n };\n\n return {\n ...element,\n [propertyName]: dynamicContent,\n };\n };\n};\n\n/**\n * Adapter for header elements with page number placeholder support.\n */\nexport const headerAdapter = () => createPageElementAdapter(\"header\");\n\n/**\n * Adapter for footer elements with page number placeholder support.\n */\nexport const footerAdapter = () => createPageElementAdapter(\"footer\");\n"]}
|