@pdfme/schemas 6.1.2-dev.9 → 6.1.3-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{builtins-BB2DHceW.js → builtins-6irEILr7.js} +19 -16
- package/dist/{builtins-BB2DHceW.js.map → builtins-6irEILr7.js.map} +1 -1
- package/dist/builtins.js +1 -1
- package/dist/circleMark/index.d.ts +7 -0
- package/dist/dynamicLayout.js +4 -4
- package/dist/dynamicLayout.js.map +1 -1
- package/dist/{dynamicTemplate-C7MdZxPm.js → dynamicTemplate-B5BkzQ4n.js} +4 -4
- package/dist/{dynamicTemplate-C7MdZxPm.js.map → dynamicTemplate-B5BkzQ4n.js.map} +1 -1
- package/dist/{dynamicTemplate-B4GCNLF9.js → dynamicTemplate-CXBCt5wk.js} +6 -6
- package/dist/{dynamicTemplate-B4GCNLF9.js.map → dynamicTemplate-CXBCt5wk.js.map} +1 -1
- package/dist/{dynamicTemplate-BwzF9C1L.js → dynamicTemplate-DFzbqkhF.js} +2 -2
- package/dist/{dynamicTemplate-BwzF9C1L.js.map → dynamicTemplate-DFzbqkhF.js.map} +1 -1
- package/dist/{helper-CEme39Uo.js → helper-DvnX6Fyq.js} +3 -3
- package/dist/{helper-CEme39Uo.js.map → helper-DvnX6Fyq.js.map} +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +117 -9
- package/dist/index.js.map +1 -1
- package/dist/lists.js +2 -2
- package/dist/{measure-L5diay3k.js → measure-egCJqCr0.js} +2 -2
- package/dist/{measure-L5diay3k.js.map → measure-egCJqCr0.js.map} +1 -1
- package/dist/{splitRange-DmVDtmzO.js → splitRange-Dh3WRCAN.js} +1 -1
- package/dist/{splitRange-DmVDtmzO.js.map → splitRange-Dh3WRCAN.js.map} +1 -1
- package/dist/tables.js +2 -2
- package/dist/texts.js +3 -3
- package/dist/types.d.ts +1 -0
- package/dist/{utils-zDZkqBnX.js → utils-TWv_zwgS.js} +2 -2
- package/dist/{utils-zDZkqBnX.js.map → utils-TWv_zwgS.js.map} +1 -1
- package/dist/utils.js +2 -2
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamicTemplate-
|
|
1
|
+
{"version":3,"file":"dynamicTemplate-B5BkzQ4n.js","names":[],"sources":["../src/multiVariableText/dynamicTemplate.ts","../src/text/dynamicTemplate.ts"],"sourcesContent":["import type { DynamicLayoutArgs, DynamicLayoutResult } from '@pdfme/common';\nimport { TEXT_OVERFLOW_EXPAND } from '../text/constants.js';\nimport {\n getTextLineHeightsWithBox,\n getTextSplitBoxStyle,\n measureTextLines,\n sumLineHeights,\n} from '../text/measure.js';\nimport { isInlineMarkdownTextSchema } from '../text/richText.js';\nimport type { MultiVariableTextSchema } from './types.js';\nimport {\n substituteVariables,\n substituteVariablesAsInlineMarkdownLiterals,\n validateVariables,\n} from './helper.js';\nimport { createTextLineSplitRange } from '../splitRange.js';\n\nexport const getDynamicLayoutForMultiVariableText = async (\n value: string,\n args: DynamicLayoutArgs,\n): Promise<DynamicLayoutResult> => {\n if (args.schema.type !== 'multiVariableText') return { heights: [args.schema.height] };\n\n const schema = args.schema as MultiVariableTextSchema;\n if (schema.overflow !== TEXT_OVERFLOW_EXPAND) {\n return { heights: [schema.height] };\n }\n\n let renderValue = value;\n if (!schema.readOnly) {\n if (!validateVariables(value, schema)) {\n return { heights: [schema.height] };\n }\n\n renderValue = isInlineMarkdownTextSchema(schema)\n ? substituteVariablesAsInlineMarkdownLiterals(schema.text || '', value)\n : substituteVariables(schema.text || '', value);\n }\n const { lineHeights } = await measureTextLines({\n value: renderValue,\n schema,\n font: args.options.font,\n _cache: args._cache,\n // `expand` owns the height decision, so measuring against a shrink-to-fit font size\n // would make the field keep its original box instead of growing.\n ignoreDynamicFontSize: true,\n });\n const heights = getTextLineHeightsWithBox(lineHeights, schema);\n const measuredHeight = sumLineHeights(heights);\n\n if (measuredHeight <= schema.height || lineHeights.length === 0) {\n return {\n heights: [schema.height],\n patchSplitSchema: () => ({ dynamicFontSize: undefined }),\n };\n }\n\n return {\n heights: lineHeights.length === 1 ? [Math.max(schema.height, measuredHeight)] : heights,\n patchSplitSchema: ({ start, end, isSplit }) => ({\n dynamicFontSize: undefined,\n __splitRange: lineHeights.length === 1 ? undefined : createTextLineSplitRange(start, end),\n __isSplit: isSplit,\n ...getTextSplitBoxStyle(schema, { start, end }, lineHeights.length),\n }),\n };\n};\n","import type { DynamicLayoutArgs, DynamicLayoutResult } from '@pdfme/common';\nimport { TEXT_OVERFLOW_EXPAND } from './constants.js';\nimport {\n getTextLineHeightsWithBox,\n getTextSplitBoxStyle,\n measureTextLines,\n sumLineHeights,\n} from './measure.js';\nimport type { TextSchema } from './types.js';\nimport { createTextLineSplitRange } from '../splitRange.js';\n\nexport const getDynamicLayoutForText = async (\n value: string,\n args: DynamicLayoutArgs,\n): Promise<DynamicLayoutResult> => {\n if (args.schema.type !== 'text') return { heights: [args.schema.height] };\n\n const schema = args.schema as TextSchema;\n if (schema.overflow !== TEXT_OVERFLOW_EXPAND) {\n return { heights: [schema.height] };\n }\n\n const { lineHeights } = await measureTextLines({\n value,\n schema,\n font: args.options.font,\n _cache: args._cache,\n // `expand` owns the height decision, so measuring against a shrink-to-fit font size\n // would make the field keep its original box instead of growing.\n ignoreDynamicFontSize: true,\n });\n const heights = getTextLineHeightsWithBox(lineHeights, schema);\n const measuredHeight = sumLineHeights(heights);\n\n if (measuredHeight <= schema.height || lineHeights.length === 0) {\n return {\n heights: [schema.height],\n patchSplitSchema: () => ({ dynamicFontSize: undefined }),\n };\n }\n\n return {\n heights: lineHeights.length === 1 ? [Math.max(schema.height, measuredHeight)] : heights,\n patchSplitSchema: ({ start, end, isSplit }) => ({\n dynamicFontSize: undefined,\n __splitRange: lineHeights.length === 1 ? undefined : createTextLineSplitRange(start, end),\n __isSplit: isSplit,\n ...getTextSplitBoxStyle(schema, { start, end }, lineHeights.length),\n }),\n };\n};\n"],"mappings":";;;;AAiBA,IAAa,uCAAuC,OAClD,OACA,SACiC;CACjC,IAAI,KAAK,OAAO,SAAS,qBAAqB,OAAO,EAAE,SAAS,CAAC,KAAK,OAAO,MAAM,EAAE;CAErF,MAAM,SAAS,KAAK;CACpB,IAAI,OAAO,aAAA,UACT,OAAO,EAAE,SAAS,CAAC,OAAO,MAAM,EAAE;CAGpC,IAAI,cAAc;CAClB,IAAI,CAAC,OAAO,UAAU;EACpB,IAAI,CAAC,kBAAkB,OAAO,MAAM,GAClC,OAAO,EAAE,SAAS,CAAC,OAAO,MAAM,EAAE;EAGpC,cAAc,2BAA2B,MAAM,IAC3C,4CAA4C,OAAO,QAAQ,IAAI,KAAK,IACpE,oBAAoB,OAAO,QAAQ,IAAI,KAAK;CAClD;CACA,MAAM,EAAE,gBAAgB,MAAM,iBAAiB;EAC7C,OAAO;EACP;EACA,MAAM,KAAK,QAAQ;EACnB,QAAQ,KAAK;EAGb,uBAAuB;CACzB,CAAC;CACD,MAAM,UAAU,0BAA0B,aAAa,MAAM;CAC7D,MAAM,iBAAiB,eAAe,OAAO;CAE7C,IAAI,kBAAkB,OAAO,UAAU,YAAY,WAAW,GAC5D,OAAO;EACL,SAAS,CAAC,OAAO,MAAM;EACvB,yBAAyB,EAAE,iBAAiB,KAAA,EAAU;CACxD;CAGF,OAAO;EACL,SAAS,YAAY,WAAW,IAAI,CAAC,KAAK,IAAI,OAAO,QAAQ,cAAc,CAAC,IAAI;EAChF,mBAAmB,EAAE,OAAO,KAAK,eAAe;GAC9C,iBAAiB,KAAA;GACjB,cAAc,YAAY,WAAW,IAAI,KAAA,IAAY,yBAAyB,OAAO,GAAG;GACxF,WAAW;GACX,GAAG,qBAAqB,QAAQ;IAAE;IAAO;GAAI,GAAG,YAAY,MAAM;EACpE;CACF;AACF;;;ACvDA,IAAa,0BAA0B,OACrC,OACA,SACiC;CACjC,IAAI,KAAK,OAAO,SAAS,QAAQ,OAAO,EAAE,SAAS,CAAC,KAAK,OAAO,MAAM,EAAE;CAExE,MAAM,SAAS,KAAK;CACpB,IAAI,OAAO,aAAA,UACT,OAAO,EAAE,SAAS,CAAC,OAAO,MAAM,EAAE;CAGpC,MAAM,EAAE,gBAAgB,MAAM,iBAAiB;EAC7C;EACA;EACA,MAAM,KAAK,QAAQ;EACnB,QAAQ,KAAK;EAGb,uBAAuB;CACzB,CAAC;CACD,MAAM,UAAU,0BAA0B,aAAa,MAAM;CAC7D,MAAM,iBAAiB,eAAe,OAAO;CAE7C,IAAI,kBAAkB,OAAO,UAAU,YAAY,WAAW,GAC5D,OAAO;EACL,SAAS,CAAC,OAAO,MAAM;EACvB,yBAAyB,EAAE,iBAAiB,KAAA,EAAU;CACxD;CAGF,OAAO;EACL,SAAS,YAAY,WAAW,IAAI,CAAC,KAAK,IAAI,OAAO,QAAQ,cAAc,CAAC,IAAI;EAChF,mBAAmB,EAAE,OAAO,KAAK,eAAe;GAC9C,iBAAiB,KAAA;GACjB,cAAc,YAAY,WAAW,IAAI,KAAA,IAAY,yBAAyB,OAAO,GAAG;GACxF,WAAW;GACX,GAAG,qBAAqB,QAAQ;IAAE;IAAO;GAAI,GAAG,YAAY,MAAM;EACpE;CACF;AACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { $ as VERTICAL_ALIGN_MIDDLE, A as ALIGN_RIGHT, D as ALIGN_CENTER, F as DEFAULT_FONT_COLOR, N as DEFAULT_ALIGNMENT, Q as VERTICAL_ALIGN_BOTTOM, S as getBoxDimensionPropPanelSchema, b as createBoxDimension, h as getFontKitFont, k as ALIGN_LEFT, l as getTableBodyRange, o as createTableBodySplitRange, v as splitTextToSize, y as widthOfTextAtSize } from "./splitRange-
|
|
1
|
+
import { $ as VERTICAL_ALIGN_MIDDLE, A as ALIGN_RIGHT, D as ALIGN_CENTER, F as DEFAULT_FONT_COLOR, N as DEFAULT_ALIGNMENT, Q as VERTICAL_ALIGN_BOTTOM, S as getBoxDimensionPropPanelSchema, b as createBoxDimension, h as getFontKitFont, k as ALIGN_LEFT, l as getTableBodyRange, o as createTableBodySplitRange, v as splitTextToSize, y as widthOfTextAtSize } from "./splitRange-Dh3WRCAN.js";
|
|
2
2
|
import { cloneDeep, getDefaultFont, getFallbackFontName, isBlankPdf, mm2pt, pt2mm } from "@pdfme/common";
|
|
3
|
-
//#region \0@oxc-project+runtime@0.
|
|
3
|
+
//#region \0@oxc-project+runtime@0.132.0/helpers/typeof.js
|
|
4
4
|
function _typeof(o) {
|
|
5
5
|
"@babel/helpers - typeof";
|
|
6
6
|
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
|
|
@@ -10,7 +10,7 @@ function _typeof(o) {
|
|
|
10
10
|
}, _typeof(o);
|
|
11
11
|
}
|
|
12
12
|
//#endregion
|
|
13
|
-
//#region \0@oxc-project+runtime@0.
|
|
13
|
+
//#region \0@oxc-project+runtime@0.132.0/helpers/toPrimitive.js
|
|
14
14
|
function toPrimitive(t, r) {
|
|
15
15
|
if ("object" != _typeof(t) || !t) return t;
|
|
16
16
|
var e = t[Symbol.toPrimitive];
|
|
@@ -22,13 +22,13 @@ function toPrimitive(t, r) {
|
|
|
22
22
|
return ("string" === r ? String : Number)(t);
|
|
23
23
|
}
|
|
24
24
|
//#endregion
|
|
25
|
-
//#region \0@oxc-project+runtime@0.
|
|
25
|
+
//#region \0@oxc-project+runtime@0.132.0/helpers/toPropertyKey.js
|
|
26
26
|
function toPropertyKey(t) {
|
|
27
27
|
var i = toPrimitive(t, "string");
|
|
28
28
|
return "symbol" == _typeof(i) ? i : i + "";
|
|
29
29
|
}
|
|
30
30
|
//#endregion
|
|
31
|
-
//#region \0@oxc-project+runtime@0.
|
|
31
|
+
//#region \0@oxc-project+runtime@0.132.0/helpers/defineProperty.js
|
|
32
32
|
function _defineProperty(e, r, t) {
|
|
33
33
|
return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
|
|
34
34
|
value: t,
|
|
@@ -764,4 +764,4 @@ var getDynamicLayoutForTable = async (value, args) => {
|
|
|
764
764
|
//#endregion
|
|
765
765
|
export { getCellPropPanelSchema as a, HEX_COLOR_PATTERN as c, getBodyWithSchemaRange as i, createSingleTable as l, getDynamicLayoutForTable as n, getColumnStylesPropPanelSchema as o, getBody as r, getDefaultCellStyles as s, getDynamicHeightsForTable as t };
|
|
766
766
|
|
|
767
|
-
//# sourceMappingURL=dynamicTemplate-
|
|
767
|
+
//# sourceMappingURL=dynamicTemplate-CXBCt5wk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamicTemplate-B4GCNLF9.js","names":[],"sources":["../src/tables/classes.ts","../src/tables/tableHelper.ts","../src/constants.ts","../src/tables/helper.ts","../src/tables/dynamicTemplate.ts"],"sourcesContent":["import { Font, mm2pt, pt2mm } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport { splitTextToSize, getFontKitFont, widthOfTextAtSize } from '../text/helper.js';\nimport type { Styles, TableInput, Settings, Section, StylesProps } from './types.js';\n\ntype ContentSettings = { body: Row[]; head: Row[]; columns: Column[] };\n\nexport class Cell {\n raw: string;\n text: string[];\n styles: Styles;\n section: Section;\n contentHeight = 0;\n contentWidth = 0;\n wrappedWidth = 0;\n minReadableWidth = 0;\n minWidth = 0;\n\n width = 0;\n height = 0;\n x = 0;\n y = 0;\n\n constructor(raw: string, styles: Styles, section: Section) {\n this.styles = styles;\n this.section = section;\n this.raw = raw;\n const splitRegex = /\\r\\n|\\r|\\n/g;\n this.text = raw.split(splitRegex);\n }\n\n getContentHeight() {\n const lineCount = Array.isArray(this.text) ? this.text.length : 1;\n const lineHeight = pt2mm(this.styles.fontSize) * this.styles.lineHeight;\n const vPadding = this.padding('top') + this.padding('bottom');\n const height = lineCount * lineHeight + vPadding;\n return Math.max(height, this.styles.minCellHeight);\n }\n\n padding(name: 'top' | 'bottom' | 'left' | 'right') {\n return this.styles.cellPadding[name];\n }\n}\n\nexport class Column {\n index: number;\n wrappedWidth = 0;\n minReadableWidth = 0;\n minWidth = 0;\n width = 0;\n\n constructor(index: number) {\n this.index = index;\n }\n\n getMaxCustomCellWidth(table: Table) {\n let max = 0;\n for (const row of table.allRows()) {\n const cell: Cell = row.cells[this.index];\n max = Math.max(max, cell.styles.cellWidth);\n }\n return max;\n }\n}\n\nexport class Row {\n readonly raw: string[];\n readonly index: number;\n readonly section: Section;\n readonly cells: { [key: string]: Cell };\n\n height = 0;\n\n constructor(raw: string[], index: number, section: Section, cells: { [key: string]: Cell }) {\n this.raw = raw;\n this.index = index;\n this.section = section;\n this.cells = cells;\n }\n\n getMaxCellHeight(columns: Column[]) {\n return columns.reduce((acc, column) => Math.max(acc, this.cells[column.index]?.height || 0), 0);\n }\n\n getMinimumRowHeight(columns: Column[]) {\n return columns.reduce((acc: number, column: Column) => {\n const cell = this.cells[column.index];\n if (!cell) return 0;\n const vPadding = cell.padding('top') + cell.padding('bottom');\n const oneRowHeight = vPadding + cell.styles.lineHeight;\n return oneRowHeight > acc ? oneRowHeight : acc;\n }, 0);\n }\n}\n\nexport class Table {\n readonly settings: Settings;\n readonly styles: StylesProps;\n\n readonly columns: Column[];\n readonly head: Row[];\n readonly body: Row[];\n\n constructor(input: TableInput, content: ContentSettings) {\n this.settings = input.settings;\n this.styles = input.styles;\n\n this.columns = content.columns;\n this.head = content.head;\n this.body = content.body;\n }\n\n static async create(arg: {\n input: TableInput;\n content: ContentSettings;\n font: Font;\n _cache: Map<string | number, FontKitFont>;\n }) {\n const { input, content, font, _cache } = arg;\n const table = new Table(input, content);\n\n await calculateWidths({ table, font, _cache });\n\n return table;\n }\n\n getHeadHeight() {\n return this.head.reduce((acc, row) => acc + row.getMaxCellHeight(this.columns), 0);\n }\n\n getBodyHeight() {\n return this.body.reduce((acc, row) => acc + row.getMaxCellHeight(this.columns), 0);\n }\n\n allRows() {\n return this.head.concat(this.body);\n }\n\n getWidth() {\n return this.settings.tableWidth;\n }\n\n getHeight() {\n return (this.settings.showHead ? this.getHeadHeight() : 0) + this.getBodyHeight();\n }\n}\n\nasync function calculateWidths(arg: {\n table: Table;\n font: Font;\n _cache: Map<string | number, FontKitFont>;\n}) {\n const { table, font, _cache } = arg;\n\n const getFontKitFontByFontName = (fontName: string | undefined) =>\n getFontKitFont(fontName, font, _cache);\n\n await calculate(table, getFontKitFontByFontName);\n\n const resizableColumns: Column[] = [];\n let initialTableWidth = 0;\n\n table.columns.forEach((column) => {\n const customWidth = column.getMaxCustomCellWidth(table);\n if (customWidth) {\n // final column width\n column.width = customWidth;\n } else {\n // initial column width (will be resized)\n column.width = column.wrappedWidth;\n resizableColumns.push(column);\n }\n initialTableWidth += column.width;\n });\n\n // width difference that needs to be distributed\n let resizeWidth = table.getWidth() - initialTableWidth;\n\n // first resize attempt: with respect to minReadableWidth and minWidth\n if (resizeWidth) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, (column) =>\n Math.max(column.minReadableWidth, column.minWidth),\n );\n }\n\n // second resize attempt: ignore minReadableWidth but respect minWidth\n if (resizeWidth) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, (column) => column.minWidth);\n }\n\n resizeWidth = Math.abs(resizeWidth);\n\n applyColSpans(table);\n await fitContent(table, getFontKitFontByFontName);\n applyRowSpans(table);\n}\n\nfunction applyRowSpans(table: Table) {\n const rowSpanCells: {\n [key: string]: { cell: Cell; left: number; row: Row };\n } = {};\n let colRowSpansLeft = 1;\n const all = table.allRows();\n for (let rowIndex = 0; rowIndex < all.length; rowIndex++) {\n const row = all[rowIndex];\n for (const column of table.columns) {\n const data = rowSpanCells[column.index];\n if (colRowSpansLeft > 1) {\n colRowSpansLeft--;\n delete row.cells[column.index];\n } else if (data) {\n data.cell.height += row.height;\n colRowSpansLeft = 1;\n delete row.cells[column.index];\n data.left--;\n if (data.left <= 1) {\n delete rowSpanCells[column.index];\n }\n } else {\n const cell = row.cells[column.index];\n if (!cell) {\n continue;\n }\n cell.height = row.height;\n }\n }\n }\n}\n\nfunction applyColSpans(table: Table) {\n const all = table.allRows();\n for (let rowIndex = 0; rowIndex < all.length; rowIndex++) {\n const row = all[rowIndex];\n\n let colSpanCell = null;\n let combinedColSpanWidth = 0;\n let colSpansLeft = 0;\n for (let columnIndex = 0; columnIndex < table.columns.length; columnIndex++) {\n const column = table.columns[columnIndex];\n\n // Width and colspan\n colSpansLeft -= 1;\n if (colSpansLeft > 1 && table.columns[columnIndex + 1]) {\n combinedColSpanWidth += column.width;\n delete row.cells[column.index];\n } else if (colSpanCell) {\n const cell: Cell = colSpanCell;\n delete row.cells[column.index];\n colSpanCell = null;\n cell.width = column.width + combinedColSpanWidth;\n } else {\n const cell = row.cells[column.index];\n if (!cell) continue;\n colSpansLeft = 1;\n combinedColSpanWidth = 0;\n cell.width = column.width + combinedColSpanWidth;\n }\n }\n }\n}\n\nasync function fitContent(\n table: Table,\n getFontKitFontByFontName: (fontName: string | undefined) => Promise<FontKitFont>,\n) {\n const rowSpanHeight = { count: 0, height: 0 };\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell: Cell = row.cells[column.index];\n if (!cell) continue;\n\n const fontKitFont = await getFontKitFontByFontName(cell.styles.fontName);\n cell.text = splitTextToSize({\n value: cell.raw,\n characterSpacing: cell.styles.characterSpacing,\n boxWidthInPt: mm2pt(cell.width),\n fontSize: cell.styles.fontSize,\n fontKitFont,\n });\n\n cell.contentHeight = cell.getContentHeight();\n\n let realContentHeight = cell.contentHeight;\n if (rowSpanHeight && rowSpanHeight.count > 0) {\n if (rowSpanHeight.height > realContentHeight) {\n realContentHeight = rowSpanHeight.height;\n }\n }\n if (realContentHeight > row.height) {\n row.height = realContentHeight;\n }\n }\n rowSpanHeight.count--;\n }\n}\n\nfunction resizeColumns(\n columns: Column[],\n resizeWidth: number,\n getMinWidth: (column: Column) => number,\n) {\n const initialResizeWidth = resizeWidth;\n const sumWrappedWidth = columns.reduce((acc, column) => acc + column.wrappedWidth, 0);\n\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i];\n\n const ratio = column.wrappedWidth / sumWrappedWidth;\n const suggestedChange = initialResizeWidth * ratio;\n const suggestedWidth = column.width + suggestedChange;\n\n const minWidth = getMinWidth(column);\n const newWidth = suggestedWidth < minWidth ? minWidth : suggestedWidth;\n\n resizeWidth -= newWidth - column.width;\n column.width = newWidth;\n }\n\n resizeWidth = Math.round(resizeWidth * 1e10) / 1e10;\n\n // Run the resizer again if there's remaining width needs\n // to be distributed and there're columns that can be resized\n if (resizeWidth) {\n const resizableColumns = columns.filter((column) => {\n return resizeWidth < 0\n ? column.width > getMinWidth(column) // check if column can shrink\n : true; // check if column can grow\n });\n\n if (resizableColumns.length) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, getMinWidth);\n }\n }\n\n return resizeWidth;\n}\n\nasync function calculate(\n table: Table,\n getFontKitFontByFontName: (fontName: string | undefined) => Promise<FontKitFont>,\n) {\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell = row.cells[column.index];\n if (!cell) continue;\n\n const hPadding = cell.padding('right') + cell.padding('left');\n const fontKitFont = await getFontKitFontByFontName(cell.styles.fontName);\n\n cell.contentWidth = getStringWidth(cell, fontKitFont) + hPadding;\n\n const longestWordWidth = getStringWidth(\n Object.assign(cell, { text: cell.text.join(' ').split(/\\s+/) }),\n fontKitFont,\n );\n cell.minReadableWidth = longestWordWidth + hPadding;\n\n cell.minWidth = cell.styles.cellWidth;\n cell.wrappedWidth = cell.styles.cellWidth;\n }\n }\n\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell = row.cells[column.index];\n\n // For now we ignore the minWidth and wrappedWidth of colspan cells when calculating colspan widths.\n // Could probably be improved upon however.\n if (cell) {\n column.wrappedWidth = Math.max(column.wrappedWidth, cell.wrappedWidth);\n column.minWidth = Math.max(column.minWidth, cell.minWidth);\n column.minReadableWidth = Math.max(column.minReadableWidth, cell.minReadableWidth);\n } else {\n // Respect cellWidth set in columnStyles even if there is no cells for this column\n // or if the column only have colspan cells. Since the width of colspan cells\n // does not affect the width of columns, setting columnStyles cellWidth enables the\n // user to at least do it manually.\n\n // Note that this is not perfect for now since for example row and table styles are\n // not accounted for\n const columnStyles = table.styles.columnStyles[column.index] || {};\n const cellWidth = columnStyles.cellWidth || columnStyles.minCellWidth;\n if (cellWidth) {\n column.minWidth = cellWidth;\n column.wrappedWidth = cellWidth;\n }\n }\n }\n }\n}\n\nfunction getStringWidth(cell: Cell, fontKitFont: FontKitFont) {\n const text = cell.text;\n const textArr: string[] = Array.isArray(text) ? text : [text];\n const fontSize = cell.styles.fontSize;\n const characterSpacing = cell.styles.characterSpacing;\n const widestLineWidth = textArr\n .map((text) => widthOfTextAtSize(text, fontKitFont, fontSize, characterSpacing))\n .reduce((a, b) => Math.max(a, b), 0);\n\n return widestLineWidth;\n}\n","import {\n Schema,\n isBlankPdf,\n BasePdf,\n CommonOptions,\n getDefaultFont,\n getFallbackFontName,\n cloneDeep,\n} from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport type {\n TableSchema,\n CellStyle,\n Styles,\n Spacing,\n TableInput,\n StylesProps,\n Section,\n} from './types.js';\nimport { Cell, Column, Row, Table } from './classes.js';\nimport { getTableBodyRange } from '../splitRange.js';\n\ntype StyleProp = 'styles' | 'headStyles' | 'bodyStyles' | 'alternateRowStyles' | 'columnStyles';\n\ninterface CreateTableArgs {\n schema: Schema;\n basePdf: BasePdf;\n options: CommonOptions;\n _cache: Map<string | number, unknown>;\n}\n\ninterface UserOptions {\n startY: number;\n tableWidth: number;\n margin: Spacing;\n showHead: boolean;\n tableLineWidth?: number;\n tableLineColor?: string;\n head?: string[][];\n body?: string[][];\n\n styles?: Partial<Styles>;\n bodyStyles?: Partial<Styles>;\n headStyles?: Partial<Styles>;\n alternateRowStyles?: Partial<Styles>;\n columnStyles?: {\n [key: string]: Partial<Styles>;\n };\n}\n\nfunction parseSection(\n sectionName: Section,\n sectionRows: string[][],\n columns: Column[],\n styleProps: StylesProps,\n fallbackFontName: string,\n): Row[] {\n const rowSpansLeftForColumn: { [key: string]: { left: number; times: number } } = {};\n const result = sectionRows.map((rawRow, rowIndex) => {\n let skippedRowForRowSpans = 0;\n const cells: { [key: string]: Cell } = {};\n\n let colSpansAdded = 0;\n let columnSpansLeft = 0;\n for (const column of columns) {\n if (\n rowSpansLeftForColumn[column.index] == null ||\n rowSpansLeftForColumn[column.index].left === 0\n ) {\n if (columnSpansLeft === 0) {\n let rawCell;\n if (Array.isArray(rawRow)) {\n rawCell = rawRow[column.index - colSpansAdded - skippedRowForRowSpans];\n } else {\n rawCell = rawRow[column.index];\n }\n const styles = cellStyles(sectionName, column, rowIndex, styleProps, fallbackFontName);\n const cell = new Cell(rawCell, styles, sectionName);\n cells[column.index] = cell;\n\n columnSpansLeft = 0;\n rowSpansLeftForColumn[column.index] = {\n left: 0,\n times: columnSpansLeft,\n };\n } else {\n columnSpansLeft--;\n colSpansAdded++;\n }\n } else {\n rowSpansLeftForColumn[column.index].left--;\n columnSpansLeft = rowSpansLeftForColumn[column.index].times;\n skippedRowForRowSpans++;\n }\n }\n return new Row(rawRow, rowIndex, sectionName, cells);\n });\n return result;\n}\n\nfunction parseContent4Table(input: TableInput, fallbackFontName: string) {\n const content = input.content;\n const columns = content.columns.map((index) => new Column(index));\n const styles = input.styles;\n return {\n columns,\n head: parseSection('head', content.head, columns, styles, fallbackFontName),\n body: parseSection('body', content.body, columns, styles, fallbackFontName),\n };\n}\n\nfunction cellStyles(\n sectionName: Section,\n column: Column,\n rowIndex: number,\n styles: StylesProps,\n fallbackFontName: string,\n) {\n let sectionStyles;\n if (sectionName === 'head') {\n sectionStyles = styles.headStyles;\n } else if (sectionName === 'body') {\n sectionStyles = styles.bodyStyles;\n }\n const otherStyles = Object.assign({}, styles.styles, sectionStyles);\n\n const colStyles = styles.columnStyles[column.index] || {};\n\n const rowStyles =\n sectionName === 'body' && rowIndex % 2 === 0\n ? Object.assign({}, styles.alternateRowStyles)\n : {};\n\n const defaultStyle = {\n fontName: fallbackFontName,\n backgroundColor: '',\n textColor: '#000000',\n lineHeight: 1,\n characterSpacing: 0,\n alignment: 'left',\n verticalAlignment: 'middle',\n fontSize: 10,\n cellPadding: 5,\n lineColor: '#000000',\n lineWidth: 0,\n minCellHeight: 0,\n minCellWidth: 0,\n };\n return Object.assign(defaultStyle, otherStyles, rowStyles, colStyles) as Styles;\n}\n\nfunction mapCellStyle(style: CellStyle): Partial<Styles> {\n return {\n fontName: style.fontName,\n alignment: style.alignment,\n verticalAlignment: style.verticalAlignment,\n fontSize: style.fontSize,\n lineHeight: style.lineHeight,\n characterSpacing: style.characterSpacing,\n backgroundColor: style.backgroundColor,\n // ---\n textColor: style.fontColor,\n lineColor: style.borderColor,\n lineWidth: style.borderWidth,\n cellPadding: style.padding,\n };\n}\n\nfunction getTableOptions(schema: TableSchema, body: string[][]): UserOptions {\n const columnStylesWidth = schema.headWidthPercentages.reduce(\n (acc, cur, i) => ({ ...acc, [i]: { cellWidth: schema.width * (cur / 100) } }),\n {} as Record<number, Partial<Styles>>,\n );\n\n const columnStylesAlignment = Object.entries(schema.columnStyles.alignment || {}).reduce(\n (acc, [key, value]) => ({ ...acc, [key]: { alignment: value } }),\n {} as Record<number, Partial<Styles>>,\n );\n\n const allKeys = new Set([\n ...Object.keys(columnStylesWidth).map(Number),\n ...Object.keys(columnStylesAlignment).map(Number),\n ]);\n const columnStyles = Array.from(allKeys).reduce(\n (acc, key) => {\n const widthStyle = columnStylesWidth[key] || {};\n const alignmentStyle = columnStylesAlignment[key] || {};\n return { ...acc, [key]: { ...widthStyle, ...alignmentStyle } };\n },\n {} as Record<number, Partial<Styles>>,\n );\n\n return {\n head: [schema.head],\n body,\n showHead: schema.showHead,\n startY: schema.position.y,\n tableWidth: schema.width,\n tableLineColor: schema.tableStyles.borderColor,\n tableLineWidth: schema.tableStyles.borderWidth,\n headStyles: mapCellStyle(schema.headStyles),\n bodyStyles: mapCellStyle(schema.bodyStyles),\n alternateRowStyles: { backgroundColor: schema.bodyStyles.alternateBackgroundColor },\n columnStyles,\n margin: { top: 0, right: 0, left: schema.position.x, bottom: 0 },\n };\n}\n\nfunction parseStyles(cInput: UserOptions) {\n const styleOptions: StylesProps = {\n styles: {},\n headStyles: {},\n bodyStyles: {},\n alternateRowStyles: {},\n columnStyles: {},\n };\n for (const prop of Object.keys(styleOptions) as StyleProp[]) {\n if (prop === 'columnStyles') {\n const current = cInput[prop];\n styleOptions.columnStyles = Object.assign({}, current);\n } else {\n const allOptions = [cInput];\n const styles = allOptions.map((opts) => opts[prop] || {});\n styleOptions[prop] = Object.assign({}, styles[0], styles[1], styles[2]);\n }\n }\n return styleOptions;\n}\n\nfunction parseContent4Input(options: UserOptions) {\n const head = options.head || [];\n const body = options.body || [];\n const columns = (head[0] || body[0] || []).map((_, index) => index);\n return { columns, head, body };\n}\n\nfunction parseInput(schema: TableSchema, body: string[][]): TableInput {\n const options = getTableOptions(schema, body);\n const styles = parseStyles(options);\n const settings = {\n startY: options.startY,\n margin: options.margin,\n tableWidth: options.tableWidth,\n showHead: options.showHead,\n tableLineWidth: options.tableLineWidth ?? 0,\n tableLineColor: options.tableLineColor ?? '',\n };\n\n const content = parseContent4Input(options);\n\n return { content, styles, settings };\n}\n\nexport function createSingleTable(body: string[][], args: CreateTableArgs) {\n const { options, _cache, basePdf } = args;\n if (!isBlankPdf(basePdf)) {\n console.warn(\n '[@pdfme/schema/table]' +\n 'When specifying a custom PDF for basePdf, ' +\n 'you cannot use features such as page breaks or re-layout of other elements.' +\n 'To utilize these features, please define basePdf as follows:\\n' +\n '{ width: number; height: number; padding: [number, number, number, number]; }',\n );\n }\n\n const schema = cloneDeep(args.schema) as TableSchema;\n const { start } = getTableBodyRange(schema) || { start: 0 };\n if (start % 2 === 1) {\n const alternateBackgroundColor = schema.bodyStyles.alternateBackgroundColor;\n schema.bodyStyles.alternateBackgroundColor = schema.bodyStyles.backgroundColor;\n schema.bodyStyles.backgroundColor = alternateBackgroundColor;\n }\n schema.showHead =\n schema.showHead === false ? false : !schema.__isSplit || schema.repeatHead === true;\n\n const input = parseInput(schema, body);\n\n const font = options.font || getDefaultFont();\n\n const fallbackFontName = getFallbackFontName(font);\n\n const content = parseContent4Table(input, fallbackFontName);\n\n return Table.create({\n input,\n content,\n font,\n _cache: _cache as unknown as Map<string | number, FontKitFont>,\n });\n}\n","export const DEFAULT_OPACITY = 1;\nexport const HEX_COLOR_PATTERN = '^#(?:[A-Fa-f0-9]{6})$';\n","import {\n DEFAULT_ALIGNMENT,\n DEFAULT_FONT_SIZE,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_FONT_COLOR,\n ALIGN_RIGHT,\n ALIGN_CENTER,\n ALIGN_LEFT,\n VERTICAL_ALIGN_TOP,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_BOTTOM,\n} from '../text/constants.js';\nimport { HEX_COLOR_PATTERN } from '../constants.js';\nimport type { TableSchema } from './types.js';\nimport { getTableBodyRange } from '../splitRange.js';\nimport type { DynamicLayoutRange } from '@pdfme/common';\nimport { createBoxDimension, getBoxDimensionPropPanelSchema } from '../box.js';\n\nexport const getDefaultCellStyles = () => ({\n fontName: undefined,\n alignment: DEFAULT_ALIGNMENT,\n verticalAlignment: VERTICAL_ALIGN_MIDDLE,\n fontSize: DEFAULT_FONT_SIZE,\n lineHeight: DEFAULT_LINE_HEIGHT,\n characterSpacing: DEFAULT_CHARACTER_SPACING,\n fontColor: DEFAULT_FONT_COLOR,\n backgroundColor: '',\n borderColor: '#888888',\n borderWidth: createBoxDimension(0.1),\n padding: createBoxDimension(5),\n});\n\nexport const getCellPropPanelSchema = (arg: {\n i18n: (key: string) => string;\n fallbackFontName: string;\n fontNames: string[];\n isBody?: boolean;\n}) => {\n const { i18n, fallbackFontName, fontNames, isBody } = arg;\n\n return {\n fontName: {\n title: i18n('schemas.text.fontName'),\n type: 'string',\n widget: 'select',\n default: fallbackFontName,\n placeholder: fallbackFontName,\n props: { options: fontNames.map((name) => ({ label: name, value: name })) },\n span: 12,\n },\n fontSize: {\n title: i18n('schemas.text.size'),\n type: 'number',\n widget: 'inputNumber',\n props: { min: 0 },\n span: 6,\n },\n characterSpacing: {\n title: i18n('schemas.text.spacing'),\n type: 'number',\n widget: 'inputNumber',\n props: { min: 0 },\n span: 6,\n },\n alignment: {\n title: i18n('schemas.text.textAlign'),\n type: 'string',\n widget: 'select',\n props: {\n options: [\n { label: i18n('schemas.left'), value: ALIGN_LEFT },\n { label: i18n('schemas.center'), value: ALIGN_CENTER },\n { label: i18n('schemas.right'), value: ALIGN_RIGHT },\n ],\n },\n span: 8,\n },\n verticalAlignment: {\n title: i18n('schemas.text.verticalAlign'),\n type: 'string',\n widget: 'select',\n props: {\n options: [\n { label: i18n('schemas.top'), value: VERTICAL_ALIGN_TOP },\n { label: i18n('schemas.middle'), value: VERTICAL_ALIGN_MIDDLE },\n { label: i18n('schemas.bottom'), value: VERTICAL_ALIGN_BOTTOM },\n ],\n },\n span: 8,\n },\n lineHeight: {\n title: i18n('schemas.text.lineHeight'),\n type: 'number',\n widget: 'inputNumber',\n props: { step: 0.1, min: 0 },\n span: 8,\n },\n fontColor: {\n title: i18n('schemas.textColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n borderColor: {\n title: i18n('schemas.borderColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n backgroundColor: {\n title: i18n('schemas.backgroundColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n ...(isBody\n ? {\n alternateBackgroundColor: {\n title: i18n('schemas.table.alternateBackgroundColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n }\n : {}),\n '-': { type: 'void', widget: 'Divider' },\n borderWidth: {\n title: i18n('schemas.borderWidth'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionPropPanelSchema(0.1),\n },\n '--': { type: 'void', widget: 'Divider' },\n padding: {\n title: i18n('schemas.padding'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionPropPanelSchema(),\n },\n };\n};\n\nexport const getColumnStylesPropPanelSchema = ({\n head,\n i18n,\n}: {\n head: string[];\n i18n: (key: string) => string;\n}) => ({\n alignment: {\n type: 'object',\n widget: 'lineTitle',\n title: i18n('schemas.text.textAlign'),\n column: 3,\n properties: head.reduce(\n (acc, cur, i) =>\n Object.assign(acc, {\n [i]: {\n title: cur || 'Column ' + String(i + 1),\n type: 'string',\n widget: 'select',\n props: {\n options: [\n { label: i18n('schemas.left'), value: ALIGN_LEFT },\n { label: i18n('schemas.center'), value: ALIGN_CENTER },\n { label: i18n('schemas.right'), value: ALIGN_RIGHT },\n ],\n },\n },\n }),\n {},\n ),\n },\n});\n\nexport const getBody = (value: string | string[][]): string[][] => {\n if (typeof value === 'string') {\n return JSON.parse(value || '[]') as string[][];\n }\n return value || [];\n};\n\nexport const getBodyWithRange = (value: string | string[][], range?: DynamicLayoutRange) => {\n const body = getBody(value);\n if (!range) return body;\n return body.slice(range.start, range.end);\n};\n\nexport const getBodyWithSchemaRange = (\n value: string | string[][],\n schema: TableSchema,\n range = getTableBodyRange(schema),\n) => getBodyWithRange(value, range);\n","import {\n Schema,\n BasePdf,\n BlankPdf,\n CommonOptions,\n DynamicLayoutArgs,\n DynamicLayoutResult,\n isBlankPdf,\n} from '@pdfme/common';\nimport { createSingleTable } from './tableHelper.js';\nimport { getBodyWithRange, getBody } from './helper.js';\nimport { TableSchema } from './types.js';\nimport { createTableBodySplitRange, getTableBodyRange } from '../splitRange.js';\n\nexport const getDynamicHeightsForTable = async (\n value: string,\n args: {\n schema: Schema;\n basePdf: BasePdf;\n options: CommonOptions;\n _cache: Map<string | number, unknown>;\n },\n): Promise<number[]> => {\n if (args.schema.type !== 'table') return Promise.resolve([args.schema.height]);\n const schema = args.schema as TableSchema;\n const bodyRange = getTableBodyRange(schema);\n const body = bodyRange?.start === 0 ? getBody(value) : getBodyWithRange(value, bodyRange);\n const table = await createSingleTable(body, args);\n\n const baseHeights = schema.showHead\n ? table.allRows().map((row) => row.height)\n : [0].concat(table.body.map((row) => row.height));\n\n const headerHeight = schema.showHead ? table.getHeadHeight() : 0;\n const shouldRepeatHeader = schema.repeatHead && isBlankPdf(args.basePdf) && headerHeight > 0;\n\n if (!shouldRepeatHeader) {\n return baseHeights;\n }\n\n const basePdf = args.basePdf as BlankPdf;\n const [paddingTop, , paddingBottom] = basePdf.padding;\n const pageContentHeight = basePdf.height - paddingTop - paddingBottom;\n const getPageStartY = (pageIndex: number) => pageIndex * pageContentHeight + paddingTop;\n\n const initialPageIndex = Math.max(\n 0,\n Math.floor((schema.position.y - paddingTop) / pageContentHeight),\n );\n const headRowCount = schema.showHead ? table.head.length : 0;\n const SAFETY_MARGIN = 0.5;\n\n let currentPageIndex = initialPageIndex;\n let currentPageY = schema.position.y;\n let rowsOnCurrentPage = 0;\n\n const result: number[] = [];\n\n for (let i = 0; i < baseHeights.length; i++) {\n const isBodyRow = i >= headRowCount;\n const rowHeight = baseHeights[i];\n\n while (true) {\n const currentPageStartY = getPageStartY(currentPageIndex);\n const remainingHeight = currentPageStartY + pageContentHeight - currentPageY;\n const needsHeader =\n isBodyRow && rowsOnCurrentPage === 0 && currentPageIndex > initialPageIndex;\n const totalRowHeight = rowHeight + (needsHeader ? headerHeight : 0);\n\n if (totalRowHeight > remainingHeight - SAFETY_MARGIN) {\n if (rowsOnCurrentPage === 0 && Math.abs(currentPageY - currentPageStartY) < SAFETY_MARGIN) {\n result.push(totalRowHeight);\n currentPageY += totalRowHeight;\n rowsOnCurrentPage++;\n break;\n }\n currentPageIndex++;\n currentPageY = getPageStartY(currentPageIndex);\n rowsOnCurrentPage = 0;\n continue;\n }\n\n result.push(totalRowHeight);\n currentPageY += totalRowHeight;\n rowsOnCurrentPage++;\n\n if (currentPageY >= currentPageStartY + pageContentHeight - SAFETY_MARGIN) {\n currentPageIndex++;\n currentPageY = getPageStartY(currentPageIndex);\n rowsOnCurrentPage = 0;\n }\n break;\n }\n }\n\n return result;\n};\n\nexport const getDynamicLayoutForTable = async (\n value: string,\n args: DynamicLayoutArgs,\n): Promise<DynamicLayoutResult> => {\n const heights = await getDynamicHeightsForTable(value, args);\n\n return {\n heights,\n avoidFirstUnitOnly: true,\n patchSplitSchema: ({ start, end, isSplit }) => {\n const range = {\n start: start === 0 ? 0 : start - 1,\n end: end - 1,\n };\n return {\n __splitRange: createTableBodySplitRange(range.start, range.end),\n __isSplit: isSplit,\n };\n },\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,IAAa,OAAb,MAAkB;CAgBhB,YAAY,KAAa,QAAgB,SAAkB;wBAf3D,OAAA,KAAA,EAAA;wBACA,QAAA,KAAA,EAAA;wBACA,UAAA,KAAA,EAAA;wBACA,WAAA,KAAA,EAAA;wBACA,iBAAgB,EAAA;wBAChB,gBAAe,EAAA;wBACf,gBAAe,EAAA;wBACf,oBAAmB,EAAA;wBACnB,YAAW,EAAA;wBAEX,SAAQ,EAAA;wBACR,UAAS,EAAA;wBACT,KAAI,EAAA;wBACJ,KAAI,EAAA;AAGF,OAAK,SAAS;AACd,OAAK,UAAU;AACf,OAAK,MAAM;EACX,MAAM,aAAa;AACnB,OAAK,OAAO,IAAI,MAAM,WAAW;;CAGnC,mBAAmB;EACjB,MAAM,YAAY,MAAM,QAAQ,KAAK,KAAK,GAAG,KAAK,KAAK,SAAS;EAChE,MAAM,aAAa,MAAM,KAAK,OAAO,SAAS,GAAG,KAAK,OAAO;EAC7D,MAAM,WAAW,KAAK,QAAQ,MAAM,GAAG,KAAK,QAAQ,SAAS;EAC7D,MAAM,SAAS,YAAY,aAAa;AACxC,SAAO,KAAK,IAAI,QAAQ,KAAK,OAAO,cAAc;;CAGpD,QAAQ,MAA2C;AACjD,SAAO,KAAK,OAAO,YAAY;;;AAInC,IAAa,SAAb,MAAoB;CAOlB,YAAY,OAAe;wBAN3B,SAAA,KAAA,EAAA;wBACA,gBAAe,EAAA;wBACf,oBAAmB,EAAA;wBACnB,YAAW,EAAA;wBACX,SAAQ,EAAA;AAGN,OAAK,QAAQ;;CAGf,sBAAsB,OAAc;EAClC,IAAI,MAAM;AACV,OAAK,MAAM,OAAO,MAAM,SAAS,EAAE;GACjC,MAAM,OAAa,IAAI,MAAM,KAAK;AAClC,SAAM,KAAK,IAAI,KAAK,KAAK,OAAO,UAAU;;AAE5C,SAAO;;;AAIX,IAAa,MAAb,MAAiB;CAQf,YAAY,KAAe,OAAe,SAAkB,OAAgC;wBAP5F,OAAA,KAAA,EAAS;wBACT,SAAA,KAAA,EAAS;wBACT,WAAA,KAAA,EAAS;wBACT,SAAA,KAAA,EAAS;wBAET,UAAS,EAAA;AAGP,OAAK,MAAM;AACX,OAAK,QAAQ;AACb,OAAK,UAAU;AACf,OAAK,QAAQ;;CAGf,iBAAiB,SAAmB;AAClC,SAAO,QAAQ,QAAQ,KAAK,WAAW,KAAK,IAAI,KAAK,KAAK,MAAM,OAAO,QAAQ,UAAU,EAAE,EAAE,EAAE;;CAGjG,oBAAoB,SAAmB;AACrC,SAAO,QAAQ,QAAQ,KAAa,WAAmB;GACrD,MAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,OAAI,CAAC,KAAM,QAAO;GAElB,MAAM,eADW,KAAK,QAAQ,MAAM,GAAG,KAAK,QAAQ,SAAS,GAC7B,KAAK,OAAO;AAC5C,UAAO,eAAe,MAAM,eAAe;KAC1C,EAAE;;;AAIT,IAAa,QAAb,MAAa,MAAM;CAQjB,YAAY,OAAmB,SAA0B;wBAPzD,YAAA,KAAA,EAAS;wBACT,UAAA,KAAA,EAAS;wBAET,WAAA,KAAA,EAAS;wBACT,QAAA,KAAA,EAAS;wBACT,QAAA,KAAA,EAAS;AAGP,OAAK,WAAW,MAAM;AACtB,OAAK,SAAS,MAAM;AAEpB,OAAK,UAAU,QAAQ;AACvB,OAAK,OAAO,QAAQ;AACpB,OAAK,OAAO,QAAQ;;CAGtB,aAAa,OAAO,KAKjB;EACD,MAAM,EAAE,OAAO,SAAS,MAAM,WAAW;EACzC,MAAM,QAAQ,IAAI,MAAM,OAAO,QAAQ;AAEvC,QAAM,gBAAgB;GAAE;GAAO;GAAM;GAAQ,CAAC;AAE9C,SAAO;;CAGT,gBAAgB;AACd,SAAO,KAAK,KAAK,QAAQ,KAAK,QAAQ,MAAM,IAAI,iBAAiB,KAAK,QAAQ,EAAE,EAAE;;CAGpF,gBAAgB;AACd,SAAO,KAAK,KAAK,QAAQ,KAAK,QAAQ,MAAM,IAAI,iBAAiB,KAAK,QAAQ,EAAE,EAAE;;CAGpF,UAAU;AACR,SAAO,KAAK,KAAK,OAAO,KAAK,KAAK;;CAGpC,WAAW;AACT,SAAO,KAAK,SAAS;;CAGvB,YAAY;AACV,UAAQ,KAAK,SAAS,WAAW,KAAK,eAAe,GAAG,KAAK,KAAK,eAAe;;;AAIrF,eAAe,gBAAgB,KAI5B;CACD,MAAM,EAAE,OAAO,MAAM,WAAW;CAEhC,MAAM,4BAA4B,aAChC,eAAe,UAAU,MAAM,OAAO;AAExC,OAAM,UAAU,OAAO,yBAAyB;CAEhD,MAAM,mBAA6B,EAAE;CACrC,IAAI,oBAAoB;AAExB,OAAM,QAAQ,SAAS,WAAW;EAChC,MAAM,cAAc,OAAO,sBAAsB,MAAM;AACvD,MAAI,YAEF,QAAO,QAAQ;OACV;AAEL,UAAO,QAAQ,OAAO;AACtB,oBAAiB,KAAK,OAAO;;AAE/B,uBAAqB,OAAO;GAC5B;CAGF,IAAI,cAAc,MAAM,UAAU,GAAG;AAGrC,KAAI,YACF,eAAc,cAAc,kBAAkB,cAAc,WAC1D,KAAK,IAAI,OAAO,kBAAkB,OAAO,SAAS,CACnD;AAIH,KAAI,YACF,eAAc,cAAc,kBAAkB,cAAc,WAAW,OAAO,SAAS;AAGzF,eAAc,KAAK,IAAI,YAAY;AAEnC,eAAc,MAAM;AACpB,OAAM,WAAW,OAAO,yBAAyB;AACjD,eAAc,MAAM;;AAGtB,SAAS,cAAc,OAAc;CACnC,MAAM,eAEF,EAAE;CACN,IAAI,kBAAkB;CACtB,MAAM,MAAM,MAAM,SAAS;AAC3B,MAAK,IAAI,WAAW,GAAG,WAAW,IAAI,QAAQ,YAAY;EACxD,MAAM,MAAM,IAAI;AAChB,OAAK,MAAM,UAAU,MAAM,SAAS;GAClC,MAAM,OAAO,aAAa,OAAO;AACjC,OAAI,kBAAkB,GAAG;AACvB;AACA,WAAO,IAAI,MAAM,OAAO;cACf,MAAM;AACf,SAAK,KAAK,UAAU,IAAI;AACxB,sBAAkB;AAClB,WAAO,IAAI,MAAM,OAAO;AACxB,SAAK;AACL,QAAI,KAAK,QAAQ,EACf,QAAO,aAAa,OAAO;UAExB;IACL,MAAM,OAAO,IAAI,MAAM,OAAO;AAC9B,QAAI,CAAC,KACH;AAEF,SAAK,SAAS,IAAI;;;;;AAM1B,SAAS,cAAc,OAAc;CACnC,MAAM,MAAM,MAAM,SAAS;AAC3B,MAAK,IAAI,WAAW,GAAG,WAAW,IAAI,QAAQ,YAAY;EACxD,MAAM,MAAM,IAAI;EAEhB,IAAI,cAAc;EAClB,IAAI,uBAAuB;EAC3B,IAAI,eAAe;AACnB,OAAK,IAAI,cAAc,GAAG,cAAc,MAAM,QAAQ,QAAQ,eAAe;GAC3E,MAAM,SAAS,MAAM,QAAQ;AAG7B,mBAAgB;AAChB,OAAI,eAAe,KAAK,MAAM,QAAQ,cAAc,IAAI;AACtD,4BAAwB,OAAO;AAC/B,WAAO,IAAI,MAAM,OAAO;cACf,aAAa;IACtB,MAAM,OAAa;AACnB,WAAO,IAAI,MAAM,OAAO;AACxB,kBAAc;AACd,SAAK,QAAQ,OAAO,QAAQ;UACvB;IACL,MAAM,OAAO,IAAI,MAAM,OAAO;AAC9B,QAAI,CAAC,KAAM;AACX,mBAAe;AACf,2BAAuB;AACvB,SAAK,QAAQ,OAAO,QAAQ;;;;;AAMpC,eAAe,WACb,OACA,0BACA;CACA,MAAM,gBAAgB;EAAE,OAAO;EAAG,QAAQ;EAAG;AAC7C,MAAK,MAAM,OAAO,MAAM,SAAS,EAAE;AACjC,OAAK,MAAM,UAAU,MAAM,SAAS;GAClC,MAAM,OAAa,IAAI,MAAM,OAAO;AACpC,OAAI,CAAC,KAAM;GAEX,MAAM,cAAc,MAAM,yBAAyB,KAAK,OAAO,SAAS;AACxE,QAAK,OAAO,gBAAgB;IAC1B,OAAO,KAAK;IACZ,kBAAkB,KAAK,OAAO;IAC9B,cAAc,MAAM,KAAK,MAAM;IAC/B,UAAU,KAAK,OAAO;IACtB;IACD,CAAC;AAEF,QAAK,gBAAgB,KAAK,kBAAkB;GAE5C,IAAI,oBAAoB,KAAK;AAC7B,OAAI,iBAAiB,cAAc,QAAQ;QACrC,cAAc,SAAS,kBACzB,qBAAoB,cAAc;;AAGtC,OAAI,oBAAoB,IAAI,OAC1B,KAAI,SAAS;;AAGjB,gBAAc;;;AAIlB,SAAS,cACP,SACA,aACA,aACA;CACA,MAAM,qBAAqB;CAC3B,MAAM,kBAAkB,QAAQ,QAAQ,KAAK,WAAW,MAAM,OAAO,cAAc,EAAE;AAErF,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,SAAS,QAAQ;EAGvB,MAAM,kBAAkB,sBADV,OAAO,eAAe;EAEpC,MAAM,iBAAiB,OAAO,QAAQ;EAEtC,MAAM,WAAW,YAAY,OAAO;EACpC,MAAM,WAAW,iBAAiB,WAAW,WAAW;AAExD,iBAAe,WAAW,OAAO;AACjC,SAAO,QAAQ;;AAGjB,eAAc,KAAK,MAAM,cAAc,KAAK,GAAG;AAI/C,KAAI,aAAa;EACf,MAAM,mBAAmB,QAAQ,QAAQ,WAAW;AAClD,UAAO,cAAc,IACjB,OAAO,QAAQ,YAAY,OAAO,GAClC;IACJ;AAEF,MAAI,iBAAiB,OACnB,eAAc,cAAc,kBAAkB,aAAa,YAAY;;AAI3E,QAAO;;AAGT,eAAe,UACb,OACA,0BACA;AACA,MAAK,MAAM,OAAO,MAAM,SAAS,CAC/B,MAAK,MAAM,UAAU,MAAM,SAAS;EAClC,MAAM,OAAO,IAAI,MAAM,OAAO;AAC9B,MAAI,CAAC,KAAM;EAEX,MAAM,WAAW,KAAK,QAAQ,QAAQ,GAAG,KAAK,QAAQ,OAAO;EAC7D,MAAM,cAAc,MAAM,yBAAyB,KAAK,OAAO,SAAS;AAExE,OAAK,eAAe,eAAe,MAAM,YAAY,GAAG;AAMxD,OAAK,mBAJoB,eACvB,OAAO,OAAO,MAAM,EAAE,MAAM,KAAK,KAAK,KAAK,IAAI,CAAC,MAAM,MAAM,EAAE,CAAC,EAC/D,YAEsB,GAAmB;AAE3C,OAAK,WAAW,KAAK,OAAO;AAC5B,OAAK,eAAe,KAAK,OAAO;;AAIpC,MAAK,MAAM,OAAO,MAAM,SAAS,CAC/B,MAAK,MAAM,UAAU,MAAM,SAAS;EAClC,MAAM,OAAO,IAAI,MAAM,OAAO;AAI9B,MAAI,MAAM;AACR,UAAO,eAAe,KAAK,IAAI,OAAO,cAAc,KAAK,aAAa;AACtE,UAAO,WAAW,KAAK,IAAI,OAAO,UAAU,KAAK,SAAS;AAC1D,UAAO,mBAAmB,KAAK,IAAI,OAAO,kBAAkB,KAAK,iBAAiB;SAC7E;GAQL,MAAM,eAAe,MAAM,OAAO,aAAa,OAAO,UAAU,EAAE;GAClE,MAAM,YAAY,aAAa,aAAa,aAAa;AACzD,OAAI,WAAW;AACb,WAAO,WAAW;AAClB,WAAO,eAAe;;;;;AAOhC,SAAS,eAAe,MAAY,aAA0B;CAC5D,MAAM,OAAO,KAAK;CAClB,MAAM,UAAoB,MAAM,QAAQ,KAAK,GAAG,OAAO,CAAC,KAAK;CAC7D,MAAM,WAAW,KAAK,OAAO;CAC7B,MAAM,mBAAmB,KAAK,OAAO;AAKrC,QAJwB,QACrB,KAAK,SAAS,kBAAkB,MAAM,aAAa,UAAU,iBAAiB,CAAC,CAC/E,QAAQ,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,EAAE,EAE7B;;;;AC9VT,SAAS,aACP,aACA,aACA,SACA,YACA,kBACO;CACP,MAAM,wBAA4E,EAAE;AAwCpF,QAvCe,YAAY,KAAK,QAAQ,aAAa;EACnD,IAAI,wBAAwB;EAC5B,MAAM,QAAiC,EAAE;EAEzC,IAAI,gBAAgB;EACpB,IAAI,kBAAkB;AACtB,OAAK,MAAM,UAAU,QACnB,KACE,sBAAsB,OAAO,UAAU,QACvC,sBAAsB,OAAO,OAAO,SAAS,EAE7C,KAAI,oBAAoB,GAAG;GACzB,IAAI;AACJ,OAAI,MAAM,QAAQ,OAAO,CACvB,WAAU,OAAO,OAAO,QAAQ,gBAAgB;OAEhD,WAAU,OAAO,OAAO;GAE1B,MAAM,SAAS,WAAW,aAAa,QAAQ,UAAU,YAAY,iBAAiB;GACtF,MAAM,OAAO,IAAI,KAAK,SAAS,QAAQ,YAAY;AACnD,SAAM,OAAO,SAAS;AAEtB,qBAAkB;AAClB,yBAAsB,OAAO,SAAS;IACpC,MAAM;IACN,OAAO;IACR;SACI;AACL;AACA;;OAEG;AACL,yBAAsB,OAAO,OAAO;AACpC,qBAAkB,sBAAsB,OAAO,OAAO;AACtD;;AAGJ,SAAO,IAAI,IAAI,QAAQ,UAAU,aAAa,MAAM;GAE/C;;AAGT,SAAS,mBAAmB,OAAmB,kBAA0B;CACvE,MAAM,UAAU,MAAM;CACtB,MAAM,UAAU,QAAQ,QAAQ,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC;CACjE,MAAM,SAAS,MAAM;AACrB,QAAO;EACL;EACA,MAAM,aAAa,QAAQ,QAAQ,MAAM,SAAS,QAAQ,iBAAiB;EAC3E,MAAM,aAAa,QAAQ,QAAQ,MAAM,SAAS,QAAQ,iBAAiB;EAC5E;;AAGH,SAAS,WACP,aACA,QACA,UACA,QACA,kBACA;CACA,IAAI;AACJ,KAAI,gBAAgB,OAClB,iBAAgB,OAAO;UACd,gBAAgB,OACzB,iBAAgB,OAAO;CAEzB,MAAM,cAAc,OAAO,OAAO,EAAE,EAAE,OAAO,QAAQ,cAAc;CAEnE,MAAM,YAAY,OAAO,aAAa,OAAO,UAAU,EAAE;CAEzD,MAAM,YACJ,gBAAgB,UAAU,WAAW,MAAM,IACvC,OAAO,OAAO,EAAE,EAAE,OAAO,mBAAmB,GAC5C,EAAE;AAiBR,QAAO,OAAO,OAAO;EAdnB,UAAU;EACV,iBAAiB;EACjB,WAAW;EACX,YAAY;EACZ,kBAAkB;EAClB,WAAW;EACX,mBAAmB;EACnB,UAAU;EACV,aAAa;EACb,WAAW;EACX,WAAW;EACX,eAAe;EACf,cAAc;EAEK,EAAc,aAAa,WAAW,UAAU;;AAGvE,SAAS,aAAa,OAAmC;AACvD,QAAO;EACL,UAAU,MAAM;EAChB,WAAW,MAAM;EACjB,mBAAmB,MAAM;EACzB,UAAU,MAAM;EAChB,YAAY,MAAM;EAClB,kBAAkB,MAAM;EACxB,iBAAiB,MAAM;EAEvB,WAAW,MAAM;EACjB,WAAW,MAAM;EACjB,WAAW,MAAM;EACjB,aAAa,MAAM;EACpB;;AAGH,SAAS,gBAAgB,QAAqB,MAA+B;CAC3E,MAAM,oBAAoB,OAAO,qBAAqB,QACnD,KAAK,KAAK,OAAO;EAAE,GAAG;GAAM,IAAI,EAAE,WAAW,OAAO,SAAS,MAAM,MAAM;EAAE,GAC5E,EAAE,CACH;CAED,MAAM,wBAAwB,OAAO,QAAQ,OAAO,aAAa,aAAa,EAAE,CAAC,CAAC,QAC/E,KAAK,CAAC,KAAK,YAAY;EAAE,GAAG;GAAM,MAAM,EAAE,WAAW,OAAO;EAAE,GAC/D,EAAE,CACH;CAED,MAAM,UAAU,IAAI,IAAI,CACtB,GAAG,OAAO,KAAK,kBAAkB,CAAC,IAAI,OAAO,EAC7C,GAAG,OAAO,KAAK,sBAAsB,CAAC,IAAI,OAAO,CAClD,CAAC;CACF,MAAM,eAAe,MAAM,KAAK,QAAQ,CAAC,QACtC,KAAK,QAAQ;EACZ,MAAM,aAAa,kBAAkB,QAAQ,EAAE;EAC/C,MAAM,iBAAiB,sBAAsB,QAAQ,EAAE;AACvD,SAAO;GAAE,GAAG;IAAM,MAAM;IAAE,GAAG;IAAY,GAAG;IAAgB;GAAE;IAEhE,EAAE,CACH;AAED,QAAO;EACL,MAAM,CAAC,OAAO,KAAK;EACnB;EACA,UAAU,OAAO;EACjB,QAAQ,OAAO,SAAS;EACxB,YAAY,OAAO;EACnB,gBAAgB,OAAO,YAAY;EACnC,gBAAgB,OAAO,YAAY;EACnC,YAAY,aAAa,OAAO,WAAW;EAC3C,YAAY,aAAa,OAAO,WAAW;EAC3C,oBAAoB,EAAE,iBAAiB,OAAO,WAAW,0BAA0B;EACnF;EACA,QAAQ;GAAE,KAAK;GAAG,OAAO;GAAG,MAAM,OAAO,SAAS;GAAG,QAAQ;GAAG;EACjE;;AAGH,SAAS,YAAY,QAAqB;CACxC,MAAM,eAA4B;EAChC,QAAQ,EAAE;EACV,YAAY,EAAE;EACd,YAAY,EAAE;EACd,oBAAoB,EAAE;EACtB,cAAc,EAAE;EACjB;AACD,MAAK,MAAM,QAAQ,OAAO,KAAK,aAAa,CAC1C,KAAI,SAAS,gBAAgB;EAC3B,MAAM,UAAU,OAAO;AACvB,eAAa,eAAe,OAAO,OAAO,EAAE,EAAE,QAAQ;QACjD;EAEL,MAAM,SAAS,CADK,OACL,CAAW,KAAK,SAAS,KAAK,SAAS,EAAE,CAAC;AACzD,eAAa,QAAQ,OAAO,OAAO,EAAE,EAAE,OAAO,IAAI,OAAO,IAAI,OAAO,GAAG;;AAG3E,QAAO;;AAGT,SAAS,mBAAmB,SAAsB;CAChD,MAAM,OAAO,QAAQ,QAAQ,EAAE;CAC/B,MAAM,OAAO,QAAQ,QAAQ,EAAE;AAE/B,QAAO;EAAE,UADQ,KAAK,MAAM,KAAK,MAAM,EAAE,EAAE,KAAK,GAAG,UAAU,MACpD;EAAS;EAAM;EAAM;;AAGhC,SAAS,WAAW,QAAqB,MAA8B;CACrE,MAAM,UAAU,gBAAgB,QAAQ,KAAK;CAC7C,MAAM,SAAS,YAAY,QAAQ;CACnC,MAAM,WAAW;EACf,QAAQ,QAAQ;EAChB,QAAQ,QAAQ;EAChB,YAAY,QAAQ;EACpB,UAAU,QAAQ;EAClB,gBAAgB,QAAQ,kBAAkB;EAC1C,gBAAgB,QAAQ,kBAAkB;EAC3C;AAID,QAAO;EAAE,SAFO,mBAAmB,QAE1B;EAAS;EAAQ;EAAU;;AAGtC,SAAgB,kBAAkB,MAAkB,MAAuB;CACzE,MAAM,EAAE,SAAS,QAAQ,YAAY;AACrC,KAAI,CAAC,WAAW,QAAQ,CACtB,SAAQ,KACN,wRAKD;CAGH,MAAM,SAAS,UAAU,KAAK,OAAO;CACrC,MAAM,EAAE,UAAU,kBAAkB,OAAO,IAAI,EAAE,OAAO,GAAG;AAC3D,KAAI,QAAQ,MAAM,GAAG;EACnB,MAAM,2BAA2B,OAAO,WAAW;AACnD,SAAO,WAAW,2BAA2B,OAAO,WAAW;AAC/D,SAAO,WAAW,kBAAkB;;AAEtC,QAAO,WACL,OAAO,aAAa,QAAQ,QAAQ,CAAC,OAAO,aAAa,OAAO,eAAe;CAEjF,MAAM,QAAQ,WAAW,QAAQ,KAAK;CAEtC,MAAM,OAAO,QAAQ,QAAQ,gBAAgB;CAI7C,MAAM,UAAU,mBAAmB,OAFV,oBAAoB,KAEH,CAAiB;AAE3D,QAAO,MAAM,OAAO;EAClB;EACA;EACA;EACQ;EACT,CAAC;;;;AC/RJ,IAAa,oBAAoB;;;ACkBjC,IAAa,8BAA8B;CACzC,UAAU,KAAA;CACV,WAAW;CACX,mBAAmB;CACnB,UAAA;CACA,YAAA;CACA,kBAAA;CACA,WAAW;CACX,iBAAiB;CACjB,aAAa;CACb,aAAa,mBAAmB,GAAI;CACpC,SAAS,mBAAmB,EAAE;CAC/B;AAED,IAAa,0BAA0B,QAKjC;CACJ,MAAM,EAAE,MAAM,kBAAkB,WAAW,WAAW;AAEtD,QAAO;EACL,UAAU;GACR,OAAO,KAAK,wBAAwB;GACpC,MAAM;GACN,QAAQ;GACR,SAAS;GACT,aAAa;GACb,OAAO,EAAE,SAAS,UAAU,KAAK,UAAU;IAAE,OAAO;IAAM,OAAO;IAAM,EAAE,EAAE;GAC3E,MAAM;GACP;EACD,UAAU;GACR,OAAO,KAAK,oBAAoB;GAChC,MAAM;GACN,QAAQ;GACR,OAAO,EAAE,KAAK,GAAG;GACjB,MAAM;GACP;EACD,kBAAkB;GAChB,OAAO,KAAK,uBAAuB;GACnC,MAAM;GACN,QAAQ;GACR,OAAO,EAAE,KAAK,GAAG;GACjB,MAAM;GACP;EACD,WAAW;GACT,OAAO,KAAK,yBAAyB;GACrC,MAAM;GACN,QAAQ;GACR,OAAO,EACL,SAAS;IACP;KAAE,OAAO,KAAK,eAAe;KAAE,OAAO;KAAY;IAClD;KAAE,OAAO,KAAK,iBAAiB;KAAE,OAAO;KAAc;IACtD;KAAE,OAAO,KAAK,gBAAgB;KAAE,OAAO;KAAa;IACrD,EACF;GACD,MAAM;GACP;EACD,mBAAmB;GACjB,OAAO,KAAK,6BAA6B;GACzC,MAAM;GACN,QAAQ;GACR,OAAO,EACL,SAAS;IACP;KAAE,OAAO,KAAK,cAAc;KAAE,OAAA;KAA2B;IACzD;KAAE,OAAO,KAAK,iBAAiB;KAAE,OAAO;KAAuB;IAC/D;KAAE,OAAO,KAAK,iBAAiB;KAAE,OAAO;KAAuB;IAChE,EACF;GACD,MAAM;GACP;EACD,YAAY;GACV,OAAO,KAAK,0BAA0B;GACtC,MAAM;GACN,QAAQ;GACR,OAAO;IAAE,MAAM;IAAK,KAAK;IAAG;GAC5B,MAAM;GACP;EACD,WAAW;GACT,OAAO,KAAK,oBAAoB;GAChC,MAAM;GACN,QAAQ;GACR,OAAO,EACL,eAAe,MAChB;GACD,OAAO,CAAC;IAAE,SAAS;IAAmB,SAAS,KAAK,sBAAsB;IAAE,CAAC;GAC9E;EACD,aAAa;GACX,OAAO,KAAK,sBAAsB;GAClC,MAAM;GACN,QAAQ;GACR,OAAO,EACL,eAAe,MAChB;GACD,OAAO,CAAC;IAAE,SAAS;IAAmB,SAAS,KAAK,sBAAsB;IAAE,CAAC;GAC9E;EACD,iBAAiB;GACf,OAAO,KAAK,0BAA0B;GACtC,MAAM;GACN,QAAQ;GACR,OAAO,EACL,eAAe,MAChB;GACD,OAAO,CAAC;IAAE,SAAS;IAAmB,SAAS,KAAK,sBAAsB;IAAE,CAAC;GAC9E;EACD,GAAI,SACA,EACE,0BAA0B;GACxB,OAAO,KAAK,yCAAyC;GACrD,MAAM;GACN,QAAQ;GACR,OAAO,EACL,eAAe,MAChB;GACD,OAAO,CAAC;IAAE,SAAS;IAAmB,SAAS,KAAK,sBAAsB;IAAE,CAAC;GAC9E,EACF,GACD,EAAE;EACN,KAAK;GAAE,MAAM;GAAQ,QAAQ;GAAW;EACxC,aAAa;GACX,OAAO,KAAK,sBAAsB;GAClC,MAAM;GACN,QAAQ;GACR,MAAM;GACN,YAAY,+BAA+B,GAAI;GAChD;EACD,MAAM;GAAE,MAAM;GAAQ,QAAQ;GAAW;EACzC,SAAS;GACP,OAAO,KAAK,kBAAkB;GAC9B,MAAM;GACN,QAAQ;GACR,MAAM;GACN,YAAY,gCAAgC;GAC7C;EACF;;AAGH,IAAa,kCAAkC,EAC7C,MACA,YAIK,EACL,WAAW;CACT,MAAM;CACN,QAAQ;CACR,OAAO,KAAK,yBAAyB;CACrC,QAAQ;CACR,YAAY,KAAK,QACd,KAAK,KAAK,MACT,OAAO,OAAO,KAAK,GAChB,IAAI;EACH,OAAO,OAAO,YAAY,OAAO,IAAI,EAAE;EACvC,MAAM;EACN,QAAQ;EACR,OAAO,EACL,SAAS;GACP;IAAE,OAAO,KAAK,eAAe;IAAE,OAAO;IAAY;GAClD;IAAE,OAAO,KAAK,iBAAiB;IAAE,OAAO;IAAc;GACtD;IAAE,OAAO,KAAK,gBAAgB;IAAE,OAAO;IAAa;GACrD,EACF;EACF,EACF,CAAC,EACJ,EAAE,CACH;CACF,EACF;AAED,IAAa,WAAW,UAA2C;AACjE,KAAI,OAAO,UAAU,SACnB,QAAO,KAAK,MAAM,SAAS,KAAK;AAElC,QAAO,SAAS,EAAE;;AAGpB,IAAa,oBAAoB,OAA4B,UAA+B;CAC1F,MAAM,OAAO,QAAQ,MAAM;AAC3B,KAAI,CAAC,MAAO,QAAO;AACnB,QAAO,KAAK,MAAM,MAAM,OAAO,MAAM,IAAI;;AAG3C,IAAa,0BACX,OACA,QACA,QAAQ,kBAAkB,OAAO,KAC9B,iBAAiB,OAAO,MAAM;;;ACjMnC,IAAa,4BAA4B,OACvC,OACA,SAMsB;AACtB,KAAI,KAAK,OAAO,SAAS,QAAS,QAAO,QAAQ,QAAQ,CAAC,KAAK,OAAO,OAAO,CAAC;CAC9E,MAAM,SAAS,KAAK;CACpB,MAAM,YAAY,kBAAkB,OAAO;CAE3C,MAAM,QAAQ,MAAM,kBADP,WAAW,UAAU,IAAI,QAAQ,MAAM,GAAG,iBAAiB,OAAO,UAAU,EAC7C,KAAK;CAEjD,MAAM,cAAc,OAAO,WACvB,MAAM,SAAS,CAAC,KAAK,QAAQ,IAAI,OAAO,GACxC,CAAC,EAAE,CAAC,OAAO,MAAM,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC;CAEnD,MAAM,eAAe,OAAO,WAAW,MAAM,eAAe,GAAG;AAG/D,KAAI,EAFuB,OAAO,cAAc,WAAW,KAAK,QAAQ,IAAI,eAAe,GAGzF,QAAO;CAGT,MAAM,UAAU,KAAK;CACrB,MAAM,CAAC,cAAc,iBAAiB,QAAQ;CAC9C,MAAM,oBAAoB,QAAQ,SAAS,aAAa;CACxD,MAAM,iBAAiB,cAAsB,YAAY,oBAAoB;CAE7E,MAAM,mBAAmB,KAAK,IAC5B,GACA,KAAK,OAAO,OAAO,SAAS,IAAI,cAAc,kBAAkB,CACjE;CACD,MAAM,eAAe,OAAO,WAAW,MAAM,KAAK,SAAS;CAC3D,MAAM,gBAAgB;CAEtB,IAAI,mBAAmB;CACvB,IAAI,eAAe,OAAO,SAAS;CACnC,IAAI,oBAAoB;CAExB,MAAM,SAAmB,EAAE;AAE3B,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;EAC3C,MAAM,YAAY,KAAK;EACvB,MAAM,YAAY,YAAY;AAE9B,SAAO,MAAM;GACX,MAAM,oBAAoB,cAAc,iBAAiB;GACzD,MAAM,kBAAkB,oBAAoB,oBAAoB;GAGhE,MAAM,iBAAiB,aADrB,aAAa,sBAAsB,KAAK,mBAAmB,mBACX,eAAe;AAEjE,OAAI,iBAAiB,kBAAkB,eAAe;AACpD,QAAI,sBAAsB,KAAK,KAAK,IAAI,eAAe,kBAAkB,GAAG,eAAe;AACzF,YAAO,KAAK,eAAe;AAC3B,qBAAgB;AAChB;AACA;;AAEF;AACA,mBAAe,cAAc,iBAAiB;AAC9C,wBAAoB;AACpB;;AAGF,UAAO,KAAK,eAAe;AAC3B,mBAAgB;AAChB;AAEA,OAAI,gBAAgB,oBAAoB,oBAAoB,eAAe;AACzE;AACA,mBAAe,cAAc,iBAAiB;AAC9C,wBAAoB;;AAEtB;;;AAIJ,QAAO;;AAGT,IAAa,2BAA2B,OACtC,OACA,SACiC;AAGjC,QAAO;EACL,SAAA,MAHoB,0BAA0B,OAAO,KAAK;EAI1D,oBAAoB;EACpB,mBAAmB,EAAE,OAAO,KAAK,cAAc;GAC7C,MAAM,QAAQ;IACZ,OAAO,UAAU,IAAI,IAAI,QAAQ;IACjC,KAAK,MAAM;IACZ;AACD,UAAO;IACL,cAAc,0BAA0B,MAAM,OAAO,MAAM,IAAI;IAC/D,WAAW;IACZ;;EAEJ"}
|
|
1
|
+
{"version":3,"file":"dynamicTemplate-CXBCt5wk.js","names":[],"sources":["../src/tables/classes.ts","../src/tables/tableHelper.ts","../src/constants.ts","../src/tables/helper.ts","../src/tables/dynamicTemplate.ts"],"sourcesContent":["import { Font, mm2pt, pt2mm } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport { splitTextToSize, getFontKitFont, widthOfTextAtSize } from '../text/helper.js';\nimport type { Styles, TableInput, Settings, Section, StylesProps } from './types.js';\n\ntype ContentSettings = { body: Row[]; head: Row[]; columns: Column[] };\n\nexport class Cell {\n raw: string;\n text: string[];\n styles: Styles;\n section: Section;\n contentHeight = 0;\n contentWidth = 0;\n wrappedWidth = 0;\n minReadableWidth = 0;\n minWidth = 0;\n\n width = 0;\n height = 0;\n x = 0;\n y = 0;\n\n constructor(raw: string, styles: Styles, section: Section) {\n this.styles = styles;\n this.section = section;\n this.raw = raw;\n const splitRegex = /\\r\\n|\\r|\\n/g;\n this.text = raw.split(splitRegex);\n }\n\n getContentHeight() {\n const lineCount = Array.isArray(this.text) ? this.text.length : 1;\n const lineHeight = pt2mm(this.styles.fontSize) * this.styles.lineHeight;\n const vPadding = this.padding('top') + this.padding('bottom');\n const height = lineCount * lineHeight + vPadding;\n return Math.max(height, this.styles.minCellHeight);\n }\n\n padding(name: 'top' | 'bottom' | 'left' | 'right') {\n return this.styles.cellPadding[name];\n }\n}\n\nexport class Column {\n index: number;\n wrappedWidth = 0;\n minReadableWidth = 0;\n minWidth = 0;\n width = 0;\n\n constructor(index: number) {\n this.index = index;\n }\n\n getMaxCustomCellWidth(table: Table) {\n let max = 0;\n for (const row of table.allRows()) {\n const cell: Cell = row.cells[this.index];\n max = Math.max(max, cell.styles.cellWidth);\n }\n return max;\n }\n}\n\nexport class Row {\n readonly raw: string[];\n readonly index: number;\n readonly section: Section;\n readonly cells: { [key: string]: Cell };\n\n height = 0;\n\n constructor(raw: string[], index: number, section: Section, cells: { [key: string]: Cell }) {\n this.raw = raw;\n this.index = index;\n this.section = section;\n this.cells = cells;\n }\n\n getMaxCellHeight(columns: Column[]) {\n return columns.reduce((acc, column) => Math.max(acc, this.cells[column.index]?.height || 0), 0);\n }\n\n getMinimumRowHeight(columns: Column[]) {\n return columns.reduce((acc: number, column: Column) => {\n const cell = this.cells[column.index];\n if (!cell) return 0;\n const vPadding = cell.padding('top') + cell.padding('bottom');\n const oneRowHeight = vPadding + cell.styles.lineHeight;\n return oneRowHeight > acc ? oneRowHeight : acc;\n }, 0);\n }\n}\n\nexport class Table {\n readonly settings: Settings;\n readonly styles: StylesProps;\n\n readonly columns: Column[];\n readonly head: Row[];\n readonly body: Row[];\n\n constructor(input: TableInput, content: ContentSettings) {\n this.settings = input.settings;\n this.styles = input.styles;\n\n this.columns = content.columns;\n this.head = content.head;\n this.body = content.body;\n }\n\n static async create(arg: {\n input: TableInput;\n content: ContentSettings;\n font: Font;\n _cache: Map<string | number, FontKitFont>;\n }) {\n const { input, content, font, _cache } = arg;\n const table = new Table(input, content);\n\n await calculateWidths({ table, font, _cache });\n\n return table;\n }\n\n getHeadHeight() {\n return this.head.reduce((acc, row) => acc + row.getMaxCellHeight(this.columns), 0);\n }\n\n getBodyHeight() {\n return this.body.reduce((acc, row) => acc + row.getMaxCellHeight(this.columns), 0);\n }\n\n allRows() {\n return this.head.concat(this.body);\n }\n\n getWidth() {\n return this.settings.tableWidth;\n }\n\n getHeight() {\n return (this.settings.showHead ? this.getHeadHeight() : 0) + this.getBodyHeight();\n }\n}\n\nasync function calculateWidths(arg: {\n table: Table;\n font: Font;\n _cache: Map<string | number, FontKitFont>;\n}) {\n const { table, font, _cache } = arg;\n\n const getFontKitFontByFontName = (fontName: string | undefined) =>\n getFontKitFont(fontName, font, _cache);\n\n await calculate(table, getFontKitFontByFontName);\n\n const resizableColumns: Column[] = [];\n let initialTableWidth = 0;\n\n table.columns.forEach((column) => {\n const customWidth = column.getMaxCustomCellWidth(table);\n if (customWidth) {\n // final column width\n column.width = customWidth;\n } else {\n // initial column width (will be resized)\n column.width = column.wrappedWidth;\n resizableColumns.push(column);\n }\n initialTableWidth += column.width;\n });\n\n // width difference that needs to be distributed\n let resizeWidth = table.getWidth() - initialTableWidth;\n\n // first resize attempt: with respect to minReadableWidth and minWidth\n if (resizeWidth) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, (column) =>\n Math.max(column.minReadableWidth, column.minWidth),\n );\n }\n\n // second resize attempt: ignore minReadableWidth but respect minWidth\n if (resizeWidth) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, (column) => column.minWidth);\n }\n\n resizeWidth = Math.abs(resizeWidth);\n\n applyColSpans(table);\n await fitContent(table, getFontKitFontByFontName);\n applyRowSpans(table);\n}\n\nfunction applyRowSpans(table: Table) {\n const rowSpanCells: {\n [key: string]: { cell: Cell; left: number; row: Row };\n } = {};\n let colRowSpansLeft = 1;\n const all = table.allRows();\n for (let rowIndex = 0; rowIndex < all.length; rowIndex++) {\n const row = all[rowIndex];\n for (const column of table.columns) {\n const data = rowSpanCells[column.index];\n if (colRowSpansLeft > 1) {\n colRowSpansLeft--;\n delete row.cells[column.index];\n } else if (data) {\n data.cell.height += row.height;\n colRowSpansLeft = 1;\n delete row.cells[column.index];\n data.left--;\n if (data.left <= 1) {\n delete rowSpanCells[column.index];\n }\n } else {\n const cell = row.cells[column.index];\n if (!cell) {\n continue;\n }\n cell.height = row.height;\n }\n }\n }\n}\n\nfunction applyColSpans(table: Table) {\n const all = table.allRows();\n for (let rowIndex = 0; rowIndex < all.length; rowIndex++) {\n const row = all[rowIndex];\n\n let colSpanCell = null;\n let combinedColSpanWidth = 0;\n let colSpansLeft = 0;\n for (let columnIndex = 0; columnIndex < table.columns.length; columnIndex++) {\n const column = table.columns[columnIndex];\n\n // Width and colspan\n colSpansLeft -= 1;\n if (colSpansLeft > 1 && table.columns[columnIndex + 1]) {\n combinedColSpanWidth += column.width;\n delete row.cells[column.index];\n } else if (colSpanCell) {\n const cell: Cell = colSpanCell;\n delete row.cells[column.index];\n colSpanCell = null;\n cell.width = column.width + combinedColSpanWidth;\n } else {\n const cell = row.cells[column.index];\n if (!cell) continue;\n colSpansLeft = 1;\n combinedColSpanWidth = 0;\n cell.width = column.width + combinedColSpanWidth;\n }\n }\n }\n}\n\nasync function fitContent(\n table: Table,\n getFontKitFontByFontName: (fontName: string | undefined) => Promise<FontKitFont>,\n) {\n const rowSpanHeight = { count: 0, height: 0 };\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell: Cell = row.cells[column.index];\n if (!cell) continue;\n\n const fontKitFont = await getFontKitFontByFontName(cell.styles.fontName);\n cell.text = splitTextToSize({\n value: cell.raw,\n characterSpacing: cell.styles.characterSpacing,\n boxWidthInPt: mm2pt(cell.width),\n fontSize: cell.styles.fontSize,\n fontKitFont,\n });\n\n cell.contentHeight = cell.getContentHeight();\n\n let realContentHeight = cell.contentHeight;\n if (rowSpanHeight && rowSpanHeight.count > 0) {\n if (rowSpanHeight.height > realContentHeight) {\n realContentHeight = rowSpanHeight.height;\n }\n }\n if (realContentHeight > row.height) {\n row.height = realContentHeight;\n }\n }\n rowSpanHeight.count--;\n }\n}\n\nfunction resizeColumns(\n columns: Column[],\n resizeWidth: number,\n getMinWidth: (column: Column) => number,\n) {\n const initialResizeWidth = resizeWidth;\n const sumWrappedWidth = columns.reduce((acc, column) => acc + column.wrappedWidth, 0);\n\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i];\n\n const ratio = column.wrappedWidth / sumWrappedWidth;\n const suggestedChange = initialResizeWidth * ratio;\n const suggestedWidth = column.width + suggestedChange;\n\n const minWidth = getMinWidth(column);\n const newWidth = suggestedWidth < minWidth ? minWidth : suggestedWidth;\n\n resizeWidth -= newWidth - column.width;\n column.width = newWidth;\n }\n\n resizeWidth = Math.round(resizeWidth * 1e10) / 1e10;\n\n // Run the resizer again if there's remaining width needs\n // to be distributed and there're columns that can be resized\n if (resizeWidth) {\n const resizableColumns = columns.filter((column) => {\n return resizeWidth < 0\n ? column.width > getMinWidth(column) // check if column can shrink\n : true; // check if column can grow\n });\n\n if (resizableColumns.length) {\n resizeWidth = resizeColumns(resizableColumns, resizeWidth, getMinWidth);\n }\n }\n\n return resizeWidth;\n}\n\nasync function calculate(\n table: Table,\n getFontKitFontByFontName: (fontName: string | undefined) => Promise<FontKitFont>,\n) {\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell = row.cells[column.index];\n if (!cell) continue;\n\n const hPadding = cell.padding('right') + cell.padding('left');\n const fontKitFont = await getFontKitFontByFontName(cell.styles.fontName);\n\n cell.contentWidth = getStringWidth(cell, fontKitFont) + hPadding;\n\n const longestWordWidth = getStringWidth(\n Object.assign(cell, { text: cell.text.join(' ').split(/\\s+/) }),\n fontKitFont,\n );\n cell.minReadableWidth = longestWordWidth + hPadding;\n\n cell.minWidth = cell.styles.cellWidth;\n cell.wrappedWidth = cell.styles.cellWidth;\n }\n }\n\n for (const row of table.allRows()) {\n for (const column of table.columns) {\n const cell = row.cells[column.index];\n\n // For now we ignore the minWidth and wrappedWidth of colspan cells when calculating colspan widths.\n // Could probably be improved upon however.\n if (cell) {\n column.wrappedWidth = Math.max(column.wrappedWidth, cell.wrappedWidth);\n column.minWidth = Math.max(column.minWidth, cell.minWidth);\n column.minReadableWidth = Math.max(column.minReadableWidth, cell.minReadableWidth);\n } else {\n // Respect cellWidth set in columnStyles even if there is no cells for this column\n // or if the column only have colspan cells. Since the width of colspan cells\n // does not affect the width of columns, setting columnStyles cellWidth enables the\n // user to at least do it manually.\n\n // Note that this is not perfect for now since for example row and table styles are\n // not accounted for\n const columnStyles = table.styles.columnStyles[column.index] || {};\n const cellWidth = columnStyles.cellWidth || columnStyles.minCellWidth;\n if (cellWidth) {\n column.minWidth = cellWidth;\n column.wrappedWidth = cellWidth;\n }\n }\n }\n }\n}\n\nfunction getStringWidth(cell: Cell, fontKitFont: FontKitFont) {\n const text = cell.text;\n const textArr: string[] = Array.isArray(text) ? text : [text];\n const fontSize = cell.styles.fontSize;\n const characterSpacing = cell.styles.characterSpacing;\n const widestLineWidth = textArr\n .map((text) => widthOfTextAtSize(text, fontKitFont, fontSize, characterSpacing))\n .reduce((a, b) => Math.max(a, b), 0);\n\n return widestLineWidth;\n}\n","import {\n Schema,\n isBlankPdf,\n BasePdf,\n CommonOptions,\n getDefaultFont,\n getFallbackFontName,\n cloneDeep,\n} from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport type {\n TableSchema,\n CellStyle,\n Styles,\n Spacing,\n TableInput,\n StylesProps,\n Section,\n} from './types.js';\nimport { Cell, Column, Row, Table } from './classes.js';\nimport { getTableBodyRange } from '../splitRange.js';\n\ntype StyleProp = 'styles' | 'headStyles' | 'bodyStyles' | 'alternateRowStyles' | 'columnStyles';\n\ninterface CreateTableArgs {\n schema: Schema;\n basePdf: BasePdf;\n options: CommonOptions;\n _cache: Map<string | number, unknown>;\n}\n\ninterface UserOptions {\n startY: number;\n tableWidth: number;\n margin: Spacing;\n showHead: boolean;\n tableLineWidth?: number;\n tableLineColor?: string;\n head?: string[][];\n body?: string[][];\n\n styles?: Partial<Styles>;\n bodyStyles?: Partial<Styles>;\n headStyles?: Partial<Styles>;\n alternateRowStyles?: Partial<Styles>;\n columnStyles?: {\n [key: string]: Partial<Styles>;\n };\n}\n\nfunction parseSection(\n sectionName: Section,\n sectionRows: string[][],\n columns: Column[],\n styleProps: StylesProps,\n fallbackFontName: string,\n): Row[] {\n const rowSpansLeftForColumn: { [key: string]: { left: number; times: number } } = {};\n const result = sectionRows.map((rawRow, rowIndex) => {\n let skippedRowForRowSpans = 0;\n const cells: { [key: string]: Cell } = {};\n\n let colSpansAdded = 0;\n let columnSpansLeft = 0;\n for (const column of columns) {\n if (\n rowSpansLeftForColumn[column.index] == null ||\n rowSpansLeftForColumn[column.index].left === 0\n ) {\n if (columnSpansLeft === 0) {\n let rawCell;\n if (Array.isArray(rawRow)) {\n rawCell = rawRow[column.index - colSpansAdded - skippedRowForRowSpans];\n } else {\n rawCell = rawRow[column.index];\n }\n const styles = cellStyles(sectionName, column, rowIndex, styleProps, fallbackFontName);\n const cell = new Cell(rawCell, styles, sectionName);\n cells[column.index] = cell;\n\n columnSpansLeft = 0;\n rowSpansLeftForColumn[column.index] = {\n left: 0,\n times: columnSpansLeft,\n };\n } else {\n columnSpansLeft--;\n colSpansAdded++;\n }\n } else {\n rowSpansLeftForColumn[column.index].left--;\n columnSpansLeft = rowSpansLeftForColumn[column.index].times;\n skippedRowForRowSpans++;\n }\n }\n return new Row(rawRow, rowIndex, sectionName, cells);\n });\n return result;\n}\n\nfunction parseContent4Table(input: TableInput, fallbackFontName: string) {\n const content = input.content;\n const columns = content.columns.map((index) => new Column(index));\n const styles = input.styles;\n return {\n columns,\n head: parseSection('head', content.head, columns, styles, fallbackFontName),\n body: parseSection('body', content.body, columns, styles, fallbackFontName),\n };\n}\n\nfunction cellStyles(\n sectionName: Section,\n column: Column,\n rowIndex: number,\n styles: StylesProps,\n fallbackFontName: string,\n) {\n let sectionStyles;\n if (sectionName === 'head') {\n sectionStyles = styles.headStyles;\n } else if (sectionName === 'body') {\n sectionStyles = styles.bodyStyles;\n }\n const otherStyles = Object.assign({}, styles.styles, sectionStyles);\n\n const colStyles = styles.columnStyles[column.index] || {};\n\n const rowStyles =\n sectionName === 'body' && rowIndex % 2 === 0\n ? Object.assign({}, styles.alternateRowStyles)\n : {};\n\n const defaultStyle = {\n fontName: fallbackFontName,\n backgroundColor: '',\n textColor: '#000000',\n lineHeight: 1,\n characterSpacing: 0,\n alignment: 'left',\n verticalAlignment: 'middle',\n fontSize: 10,\n cellPadding: 5,\n lineColor: '#000000',\n lineWidth: 0,\n minCellHeight: 0,\n minCellWidth: 0,\n };\n return Object.assign(defaultStyle, otherStyles, rowStyles, colStyles) as Styles;\n}\n\nfunction mapCellStyle(style: CellStyle): Partial<Styles> {\n return {\n fontName: style.fontName,\n alignment: style.alignment,\n verticalAlignment: style.verticalAlignment,\n fontSize: style.fontSize,\n lineHeight: style.lineHeight,\n characterSpacing: style.characterSpacing,\n backgroundColor: style.backgroundColor,\n // ---\n textColor: style.fontColor,\n lineColor: style.borderColor,\n lineWidth: style.borderWidth,\n cellPadding: style.padding,\n };\n}\n\nfunction getTableOptions(schema: TableSchema, body: string[][]): UserOptions {\n const columnStylesWidth = schema.headWidthPercentages.reduce(\n (acc, cur, i) => ({ ...acc, [i]: { cellWidth: schema.width * (cur / 100) } }),\n {} as Record<number, Partial<Styles>>,\n );\n\n const columnStylesAlignment = Object.entries(schema.columnStyles.alignment || {}).reduce(\n (acc, [key, value]) => ({ ...acc, [key]: { alignment: value } }),\n {} as Record<number, Partial<Styles>>,\n );\n\n const allKeys = new Set([\n ...Object.keys(columnStylesWidth).map(Number),\n ...Object.keys(columnStylesAlignment).map(Number),\n ]);\n const columnStyles = Array.from(allKeys).reduce(\n (acc, key) => {\n const widthStyle = columnStylesWidth[key] || {};\n const alignmentStyle = columnStylesAlignment[key] || {};\n return { ...acc, [key]: { ...widthStyle, ...alignmentStyle } };\n },\n {} as Record<number, Partial<Styles>>,\n );\n\n return {\n head: [schema.head],\n body,\n showHead: schema.showHead,\n startY: schema.position.y,\n tableWidth: schema.width,\n tableLineColor: schema.tableStyles.borderColor,\n tableLineWidth: schema.tableStyles.borderWidth,\n headStyles: mapCellStyle(schema.headStyles),\n bodyStyles: mapCellStyle(schema.bodyStyles),\n alternateRowStyles: { backgroundColor: schema.bodyStyles.alternateBackgroundColor },\n columnStyles,\n margin: { top: 0, right: 0, left: schema.position.x, bottom: 0 },\n };\n}\n\nfunction parseStyles(cInput: UserOptions) {\n const styleOptions: StylesProps = {\n styles: {},\n headStyles: {},\n bodyStyles: {},\n alternateRowStyles: {},\n columnStyles: {},\n };\n for (const prop of Object.keys(styleOptions) as StyleProp[]) {\n if (prop === 'columnStyles') {\n const current = cInput[prop];\n styleOptions.columnStyles = Object.assign({}, current);\n } else {\n const allOptions = [cInput];\n const styles = allOptions.map((opts) => opts[prop] || {});\n styleOptions[prop] = Object.assign({}, styles[0], styles[1], styles[2]);\n }\n }\n return styleOptions;\n}\n\nfunction parseContent4Input(options: UserOptions) {\n const head = options.head || [];\n const body = options.body || [];\n const columns = (head[0] || body[0] || []).map((_, index) => index);\n return { columns, head, body };\n}\n\nfunction parseInput(schema: TableSchema, body: string[][]): TableInput {\n const options = getTableOptions(schema, body);\n const styles = parseStyles(options);\n const settings = {\n startY: options.startY,\n margin: options.margin,\n tableWidth: options.tableWidth,\n showHead: options.showHead,\n tableLineWidth: options.tableLineWidth ?? 0,\n tableLineColor: options.tableLineColor ?? '',\n };\n\n const content = parseContent4Input(options);\n\n return { content, styles, settings };\n}\n\nexport function createSingleTable(body: string[][], args: CreateTableArgs) {\n const { options, _cache, basePdf } = args;\n if (!isBlankPdf(basePdf)) {\n console.warn(\n '[@pdfme/schema/table]' +\n 'When specifying a custom PDF for basePdf, ' +\n 'you cannot use features such as page breaks or re-layout of other elements.' +\n 'To utilize these features, please define basePdf as follows:\\n' +\n '{ width: number; height: number; padding: [number, number, number, number]; }',\n );\n }\n\n const schema = cloneDeep(args.schema) as TableSchema;\n const { start } = getTableBodyRange(schema) || { start: 0 };\n if (start % 2 === 1) {\n const alternateBackgroundColor = schema.bodyStyles.alternateBackgroundColor;\n schema.bodyStyles.alternateBackgroundColor = schema.bodyStyles.backgroundColor;\n schema.bodyStyles.backgroundColor = alternateBackgroundColor;\n }\n schema.showHead =\n schema.showHead === false ? false : !schema.__isSplit || schema.repeatHead === true;\n\n const input = parseInput(schema, body);\n\n const font = options.font || getDefaultFont();\n\n const fallbackFontName = getFallbackFontName(font);\n\n const content = parseContent4Table(input, fallbackFontName);\n\n return Table.create({\n input,\n content,\n font,\n _cache: _cache as unknown as Map<string | number, FontKitFont>,\n });\n}\n","export const DEFAULT_OPACITY = 1;\nexport const HEX_COLOR_PATTERN = '^#(?:[A-Fa-f0-9]{6})$';\n","import {\n DEFAULT_ALIGNMENT,\n DEFAULT_FONT_SIZE,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_FONT_COLOR,\n ALIGN_RIGHT,\n ALIGN_CENTER,\n ALIGN_LEFT,\n VERTICAL_ALIGN_TOP,\n VERTICAL_ALIGN_MIDDLE,\n VERTICAL_ALIGN_BOTTOM,\n} from '../text/constants.js';\nimport { HEX_COLOR_PATTERN } from '../constants.js';\nimport type { TableSchema } from './types.js';\nimport { getTableBodyRange } from '../splitRange.js';\nimport type { DynamicLayoutRange } from '@pdfme/common';\nimport { createBoxDimension, getBoxDimensionPropPanelSchema } from '../box.js';\n\nexport const getDefaultCellStyles = () => ({\n fontName: undefined,\n alignment: DEFAULT_ALIGNMENT,\n verticalAlignment: VERTICAL_ALIGN_MIDDLE,\n fontSize: DEFAULT_FONT_SIZE,\n lineHeight: DEFAULT_LINE_HEIGHT,\n characterSpacing: DEFAULT_CHARACTER_SPACING,\n fontColor: DEFAULT_FONT_COLOR,\n backgroundColor: '',\n borderColor: '#888888',\n borderWidth: createBoxDimension(0.1),\n padding: createBoxDimension(5),\n});\n\nexport const getCellPropPanelSchema = (arg: {\n i18n: (key: string) => string;\n fallbackFontName: string;\n fontNames: string[];\n isBody?: boolean;\n}) => {\n const { i18n, fallbackFontName, fontNames, isBody } = arg;\n\n return {\n fontName: {\n title: i18n('schemas.text.fontName'),\n type: 'string',\n widget: 'select',\n default: fallbackFontName,\n placeholder: fallbackFontName,\n props: { options: fontNames.map((name) => ({ label: name, value: name })) },\n span: 12,\n },\n fontSize: {\n title: i18n('schemas.text.size'),\n type: 'number',\n widget: 'inputNumber',\n props: { min: 0 },\n span: 6,\n },\n characterSpacing: {\n title: i18n('schemas.text.spacing'),\n type: 'number',\n widget: 'inputNumber',\n props: { min: 0 },\n span: 6,\n },\n alignment: {\n title: i18n('schemas.text.textAlign'),\n type: 'string',\n widget: 'select',\n props: {\n options: [\n { label: i18n('schemas.left'), value: ALIGN_LEFT },\n { label: i18n('schemas.center'), value: ALIGN_CENTER },\n { label: i18n('schemas.right'), value: ALIGN_RIGHT },\n ],\n },\n span: 8,\n },\n verticalAlignment: {\n title: i18n('schemas.text.verticalAlign'),\n type: 'string',\n widget: 'select',\n props: {\n options: [\n { label: i18n('schemas.top'), value: VERTICAL_ALIGN_TOP },\n { label: i18n('schemas.middle'), value: VERTICAL_ALIGN_MIDDLE },\n { label: i18n('schemas.bottom'), value: VERTICAL_ALIGN_BOTTOM },\n ],\n },\n span: 8,\n },\n lineHeight: {\n title: i18n('schemas.text.lineHeight'),\n type: 'number',\n widget: 'inputNumber',\n props: { step: 0.1, min: 0 },\n span: 8,\n },\n fontColor: {\n title: i18n('schemas.textColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n borderColor: {\n title: i18n('schemas.borderColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n backgroundColor: {\n title: i18n('schemas.backgroundColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n ...(isBody\n ? {\n alternateBackgroundColor: {\n title: i18n('schemas.table.alternateBackgroundColor'),\n type: 'string',\n widget: 'color',\n props: {\n disabledAlpha: true,\n },\n rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],\n },\n }\n : {}),\n '-': { type: 'void', widget: 'Divider' },\n borderWidth: {\n title: i18n('schemas.borderWidth'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionPropPanelSchema(0.1),\n },\n '--': { type: 'void', widget: 'Divider' },\n padding: {\n title: i18n('schemas.padding'),\n type: 'object',\n widget: 'lineTitle',\n span: 24,\n properties: getBoxDimensionPropPanelSchema(),\n },\n };\n};\n\nexport const getColumnStylesPropPanelSchema = ({\n head,\n i18n,\n}: {\n head: string[];\n i18n: (key: string) => string;\n}) => ({\n alignment: {\n type: 'object',\n widget: 'lineTitle',\n title: i18n('schemas.text.textAlign'),\n column: 3,\n properties: head.reduce(\n (acc, cur, i) =>\n Object.assign(acc, {\n [i]: {\n title: cur || 'Column ' + String(i + 1),\n type: 'string',\n widget: 'select',\n props: {\n options: [\n { label: i18n('schemas.left'), value: ALIGN_LEFT },\n { label: i18n('schemas.center'), value: ALIGN_CENTER },\n { label: i18n('schemas.right'), value: ALIGN_RIGHT },\n ],\n },\n },\n }),\n {},\n ),\n },\n});\n\nexport const getBody = (value: string | string[][]): string[][] => {\n if (typeof value === 'string') {\n return JSON.parse(value || '[]') as string[][];\n }\n return value || [];\n};\n\nexport const getBodyWithRange = (value: string | string[][], range?: DynamicLayoutRange) => {\n const body = getBody(value);\n if (!range) return body;\n return body.slice(range.start, range.end);\n};\n\nexport const getBodyWithSchemaRange = (\n value: string | string[][],\n schema: TableSchema,\n range = getTableBodyRange(schema),\n) => getBodyWithRange(value, range);\n","import {\n Schema,\n BasePdf,\n BlankPdf,\n CommonOptions,\n DynamicLayoutArgs,\n DynamicLayoutResult,\n isBlankPdf,\n} from '@pdfme/common';\nimport { createSingleTable } from './tableHelper.js';\nimport { getBodyWithRange, getBody } from './helper.js';\nimport { TableSchema } from './types.js';\nimport { createTableBodySplitRange, getTableBodyRange } from '../splitRange.js';\n\nexport const getDynamicHeightsForTable = async (\n value: string,\n args: {\n schema: Schema;\n basePdf: BasePdf;\n options: CommonOptions;\n _cache: Map<string | number, unknown>;\n },\n): Promise<number[]> => {\n if (args.schema.type !== 'table') return Promise.resolve([args.schema.height]);\n const schema = args.schema as TableSchema;\n const bodyRange = getTableBodyRange(schema);\n const body = bodyRange?.start === 0 ? getBody(value) : getBodyWithRange(value, bodyRange);\n const table = await createSingleTable(body, args);\n\n const baseHeights = schema.showHead\n ? table.allRows().map((row) => row.height)\n : [0].concat(table.body.map((row) => row.height));\n\n const headerHeight = schema.showHead ? table.getHeadHeight() : 0;\n const shouldRepeatHeader = schema.repeatHead && isBlankPdf(args.basePdf) && headerHeight > 0;\n\n if (!shouldRepeatHeader) {\n return baseHeights;\n }\n\n const basePdf = args.basePdf as BlankPdf;\n const [paddingTop, , paddingBottom] = basePdf.padding;\n const pageContentHeight = basePdf.height - paddingTop - paddingBottom;\n const getPageStartY = (pageIndex: number) => pageIndex * pageContentHeight + paddingTop;\n\n const initialPageIndex = Math.max(\n 0,\n Math.floor((schema.position.y - paddingTop) / pageContentHeight),\n );\n const headRowCount = schema.showHead ? table.head.length : 0;\n const SAFETY_MARGIN = 0.5;\n\n let currentPageIndex = initialPageIndex;\n let currentPageY = schema.position.y;\n let rowsOnCurrentPage = 0;\n\n const result: number[] = [];\n\n for (let i = 0; i < baseHeights.length; i++) {\n const isBodyRow = i >= headRowCount;\n const rowHeight = baseHeights[i];\n\n while (true) {\n const currentPageStartY = getPageStartY(currentPageIndex);\n const remainingHeight = currentPageStartY + pageContentHeight - currentPageY;\n const needsHeader =\n isBodyRow && rowsOnCurrentPage === 0 && currentPageIndex > initialPageIndex;\n const totalRowHeight = rowHeight + (needsHeader ? headerHeight : 0);\n\n if (totalRowHeight > remainingHeight - SAFETY_MARGIN) {\n if (rowsOnCurrentPage === 0 && Math.abs(currentPageY - currentPageStartY) < SAFETY_MARGIN) {\n result.push(totalRowHeight);\n currentPageY += totalRowHeight;\n rowsOnCurrentPage++;\n break;\n }\n currentPageIndex++;\n currentPageY = getPageStartY(currentPageIndex);\n rowsOnCurrentPage = 0;\n continue;\n }\n\n result.push(totalRowHeight);\n currentPageY += totalRowHeight;\n rowsOnCurrentPage++;\n\n if (currentPageY >= currentPageStartY + pageContentHeight - SAFETY_MARGIN) {\n currentPageIndex++;\n currentPageY = getPageStartY(currentPageIndex);\n rowsOnCurrentPage = 0;\n }\n break;\n }\n }\n\n return result;\n};\n\nexport const getDynamicLayoutForTable = async (\n value: string,\n args: DynamicLayoutArgs,\n): Promise<DynamicLayoutResult> => {\n const heights = await getDynamicHeightsForTable(value, args);\n\n return {\n heights,\n avoidFirstUnitOnly: true,\n patchSplitSchema: ({ start, end, isSplit }) => {\n const range = {\n start: start === 0 ? 0 : start - 1,\n end: end - 1,\n };\n return {\n __splitRange: createTableBodySplitRange(range.start, range.end),\n __isSplit: isSplit,\n };\n },\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as createListItemSplitRange, h as getFontKitFont, v as splitTextToSize } from "./splitRange-
|
|
1
|
+
import { a as createListItemSplitRange, h as getFontKitFont, v as splitTextToSize } from "./splitRange-Dh3WRCAN.js";
|
|
2
2
|
import { getDefaultFont, mm2pt, pt2mm } from "@pdfme/common";
|
|
3
3
|
//#region src/list/constants.ts
|
|
4
4
|
var LIST_STYLE_BULLET = "bullet";
|
|
@@ -111,4 +111,4 @@ var getDynamicLayoutForList = async (value, args) => {
|
|
|
111
111
|
//#endregion
|
|
112
112
|
export { normalizeListItems as a, LIST_STYLE_BULLET as c, normalizeListItemEntries as i, LIST_STYLE_ORDERED as l, calculateListLayout as n, serializeListItems as o, getListMarkers as r, DEFAULT_LIST_STYLE as s, getDynamicLayoutForList as t };
|
|
113
113
|
|
|
114
|
-
//# sourceMappingURL=dynamicTemplate-
|
|
114
|
+
//# sourceMappingURL=dynamicTemplate-DFzbqkhF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamicTemplate-
|
|
1
|
+
{"version":3,"file":"dynamicTemplate-DFzbqkhF.js","names":[],"sources":["../src/list/constants.ts","../src/list/helper.ts","../src/list/dynamicTemplate.ts"],"sourcesContent":["import type { LIST_STYLE } from './types.js';\n\nexport const LIST_STYLE_BULLET = 'bullet' as LIST_STYLE;\nexport const LIST_STYLE_ORDERED = 'ordered' as LIST_STYLE;\nexport const DEFAULT_LIST_STYLE = LIST_STYLE_BULLET;\nexport const DEFAULT_MARKER = '\\u2022';\nexport const DEFAULT_MARKER_WIDTH = 6;\nexport const DEFAULT_MARKER_GAP = 2;\nexport const DEFAULT_INDENT_SIZE = 6;\nexport const DEFAULT_ITEM_SPACING = 1;\nexport const MAX_INDENT_LEVEL = 8;\n","import { CommonOptions, getDefaultFont, mm2pt, pt2mm } from '@pdfme/common';\nimport {\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_FONT_SIZE,\n DEFAULT_LINE_HEIGHT,\n} from '../text/constants.js';\nimport { getFontKitFont, splitTextToSize } from '../text/helper.js';\nimport type { ListItem, ListItemLayout, ListLayout, ListSchema } from './types.js';\nimport {\n DEFAULT_INDENT_SIZE,\n DEFAULT_ITEM_SPACING,\n DEFAULT_LIST_STYLE,\n DEFAULT_MARKER,\n DEFAULT_MARKER_GAP,\n DEFAULT_MARKER_WIDTH,\n LIST_STYLE_ORDERED,\n MAX_INDENT_LEVEL,\n} from './constants.js';\n\nexport const normalizeListItems = (value: unknown): string[] => {\n if (Array.isArray(value)) return value.map((item) => String(item));\n\n if (typeof value !== 'string') {\n return value == null ? [] : [String(value)];\n }\n\n const trimmed = value.trim();\n if (!trimmed) return [];\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (Array.isArray(parsed)) return parsed.map((item) => String(item));\n } catch {\n // Fall through to newline parsing.\n }\n\n return value.split(/\\r\\n|\\r|\\n/g);\n};\n\nexport const parseListItem = (value: string): ListItem => {\n const indent = value.match(/^\\t+/)?.[0].length ?? 0;\n return {\n level: Math.min(indent, MAX_INDENT_LEVEL),\n text: value.slice(indent),\n };\n};\n\nexport const normalizeListItemEntries = (value: unknown): ListItem[] =>\n normalizeListItems(value).map(parseListItem);\n\nconst formatListItem = (item: ListItem): string =>\n `${'\\t'.repeat(Math.max(0, item.level))}${item.text}`;\n\nexport const serializeListItems = (items: ListItem[]): string => {\n const lines = items.map(formatListItem);\n return JSON.stringify(lines);\n};\n\nexport const getListMarkers = (schema: ListSchema, items: string[]): string[] => {\n if ((schema.listStyle ?? DEFAULT_LIST_STYLE) !== LIST_STYLE_ORDERED) {\n return items.map(() => DEFAULT_MARKER);\n }\n\n const counters = Array.from({ length: MAX_INDENT_LEVEL + 1 }, () => 0);\n return items.map((rawItem) => {\n const { level } = parseListItem(rawItem);\n counters[level] += 1;\n counters.fill(0, level + 1);\n return `${counters[level]}.`;\n });\n};\n\nexport const calculateListLayout = async (arg: {\n schema: ListSchema;\n items: string[];\n markerItems?: string[];\n startIndex: number;\n options: CommonOptions;\n _cache: Map<string | number, unknown>;\n}): Promise<ListLayout> => {\n const { schema, items, markerItems, startIndex, options, _cache } = arg;\n const markerWidth = schema.markerWidth ?? DEFAULT_MARKER_WIDTH;\n const markerGap = schema.markerGap ?? DEFAULT_MARKER_GAP;\n const indentSize = schema.indentSize ?? DEFAULT_INDENT_SIZE;\n const font = options.font || getDefaultFont();\n const fontKitFont = await getFontKitFont(\n schema.fontName,\n font,\n _cache as Map<string | number, import('fontkit').Font>,\n );\n\n const fontSize = schema.fontSize ?? DEFAULT_FONT_SIZE;\n const lineHeight = schema.lineHeight ?? DEFAULT_LINE_HEIGHT;\n const characterSpacing = schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING;\n const itemSpacing = schema.itemSpacing ?? DEFAULT_ITEM_SPACING;\n const lineHeightMm = pt2mm(fontSize * lineHeight);\n const markers = markerItems\n ? getListMarkers(schema, markerItems).slice(startIndex, startIndex + items.length)\n : getListMarkers(schema, items);\n\n const layoutItems: ListItemLayout[] = items.map((rawItem, index) => {\n const item = parseListItem(rawItem);\n const markerX = item.level * indentSize;\n const bodyX = markerX + markerWidth + markerGap;\n const bodyWidth = Math.max(schema.width - bodyX, 0);\n const lines = splitTextToSize({\n value: item.text,\n characterSpacing,\n boxWidthInPt: mm2pt(Math.max(bodyWidth, 0.1)),\n fontSize,\n fontKitFont,\n });\n const height =\n Math.max(lines.length, 1) * lineHeightMm + (index === items.length - 1 ? 0 : itemSpacing);\n\n return {\n item: item.text,\n itemIndex: startIndex + index,\n level: item.level,\n marker: markers[index],\n lines,\n height,\n markerX,\n bodyX,\n bodyWidth,\n };\n });\n\n return {\n items: layoutItems,\n totalHeight: layoutItems.reduce((sum, item) => sum + item.height, 0),\n markerWidth,\n markerGap,\n indentSize,\n };\n};\n","import type { DynamicLayoutArgs, DynamicLayoutResult } from '@pdfme/common';\nimport type { ListSchema } from './types.js';\nimport { calculateListLayout, normalizeListItems } from './helper.js';\nimport { createListItemSplitRange } from '../splitRange.js';\n\nexport const getDynamicLayoutForList = async (\n value: string,\n args: DynamicLayoutArgs,\n): Promise<DynamicLayoutResult> => {\n if (args.schema.type !== 'list') return { heights: [args.schema.height] };\n\n const schema = args.schema as ListSchema;\n const items = normalizeListItems(value);\n if (items.length === 0) return { heights: [0] };\n\n const layout = await calculateListLayout({\n schema,\n items,\n startIndex: 0,\n options: args.options,\n _cache: args._cache,\n });\n\n return {\n heights: layout.items.map((item) => item.height),\n avoidFirstUnitOnly: false,\n patchSplitSchema: ({ start, end, isSplit }) => ({\n __splitRange: createListItemSplitRange(start, end),\n __isSplit: isSplit,\n }),\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { h as escapeInlineMarkdown } from "./measure-
|
|
1
|
+
import { h as escapeInlineMarkdown } from "./measure-egCJqCr0.js";
|
|
2
2
|
//#region src/multiVariableText/helper.ts
|
|
3
3
|
var substituteVariables = (text, variablesIn, valueMapper = (value) => value) => {
|
|
4
4
|
if (!text) return "";
|
|
@@ -28,7 +28,7 @@ var validateVariables = (value, schema) => {
|
|
|
28
28
|
} catch {
|
|
29
29
|
throw new SyntaxError(`[@pdfme/generator] invalid JSON string '${value}' for variables in field ${schema.name}`);
|
|
30
30
|
}
|
|
31
|
-
for (const variable of schema.variables) if (!values[variable]) {
|
|
31
|
+
for (const variable of schema.variables) if (!Object.prototype.hasOwnProperty.call(values, variable) || values[variable] === null || values[variable] === void 0) {
|
|
32
32
|
if (schema.required) throw new Error(`[@pdfme/generator] variable ${variable} is missing for field ${schema.name}`);
|
|
33
33
|
return false;
|
|
34
34
|
}
|
|
@@ -37,4 +37,4 @@ var validateVariables = (value, schema) => {
|
|
|
37
37
|
//#endregion
|
|
38
38
|
export { substituteVariablesAsInlineMarkdownLiterals as n, validateVariables as r, substituteVariables as t };
|
|
39
39
|
|
|
40
|
-
//# sourceMappingURL=helper-
|
|
40
|
+
//# sourceMappingURL=helper-DvnX6Fyq.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper-
|
|
1
|
+
{"version":3,"file":"helper-DvnX6Fyq.js","names":[],"sources":["../src/multiVariableText/helper.ts"],"sourcesContent":["import { MultiVariableTextSchema } from './types.js';\nimport { escapeInlineMarkdown } from '../text/inlineMarkdown.js';\n\nexport const substituteVariables = (\n text: string,\n variablesIn: string | Record<string, string>,\n valueMapper: (value: string, variableName: string) => string = (value) => value,\n): string => {\n if (!text) {\n return '';\n }\n\n let substitutedText = text;\n\n if (variablesIn) {\n let variables: Record<string, string>;\n try {\n variables =\n typeof variablesIn === 'string'\n ? (JSON.parse(variablesIn || '{}') as Record<string, string>)\n : variablesIn;\n } catch {\n throw new SyntaxError(`[@pdfme/schemas] MVT: invalid JSON string '${variablesIn as string}'`);\n }\n\n Object.keys(variables).forEach((variableName) => {\n // handle special characters in variable name\n const variableForRegex = variableName.replace(/[/\\-\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n const regex = new RegExp('\\\\{' + variableForRegex + '\\\\}', 'g');\n substitutedText = substitutedText.replace(\n regex,\n valueMapper(variables[variableName], variableName),\n );\n });\n }\n\n // Remove any variables that were not substituted from inputs\n substitutedText = substitutedText.replace(/{[^{}]+}/g, '');\n\n return substitutedText;\n};\n\nexport const substituteVariablesAsInlineMarkdownLiterals = (\n text: string,\n variablesIn: string | Record<string, string>,\n): string => substituteVariables(text, variablesIn, escapeInlineMarkdown);\n\nexport const validateVariables = (value: string, schema: MultiVariableTextSchema): boolean => {\n if (schema.variables.length === 0) {\n return true;\n }\n\n let values;\n try {\n values = value ? (JSON.parse(value) as Record<string, string>) : {};\n } catch {\n throw new SyntaxError(\n `[@pdfme/generator] invalid JSON string '${value}' for variables in field ${schema.name}`,\n );\n }\n\n for (const variable of schema.variables) {\n if (\n !Object.prototype.hasOwnProperty.call(values, variable) ||\n values[variable] === null ||\n values[variable] === undefined\n ) {\n if (schema.required) {\n throw new Error(\n `[@pdfme/generator] variable ${variable} is missing for field ${schema.name}`,\n );\n }\n // If not required, then simply don't render this field if an input is missing\n return false;\n }\n }\n\n return true;\n};\n"],"mappings":";;AAGA,IAAa,uBACX,MACA,aACA,eAAgE,UAAU,UAC/D;CACX,IAAI,CAAC,MACH,OAAO;CAGT,IAAI,kBAAkB;CAEtB,IAAI,aAAa;EACf,IAAI;EACJ,IAAI;GACF,YACE,OAAO,gBAAgB,WAClB,KAAK,MAAM,eAAe,IAAI,IAC/B;EACR,QAAQ;GACN,MAAM,IAAI,YAAY,8CAA8C,YAAsB,EAAE;EAC9F;EAEA,OAAO,KAAK,SAAS,EAAE,SAAS,iBAAiB;GAE/C,MAAM,mBAAmB,aAAa,QAAQ,0BAA0B,MAAM;GAC9E,MAAM,QAAQ,IAAI,OAAO,QAAQ,mBAAmB,OAAO,GAAG;GAC9D,kBAAkB,gBAAgB,QAChC,OACA,YAAY,UAAU,eAAe,YAAY,CACnD;EACF,CAAC;CACH;CAGA,kBAAkB,gBAAgB,QAAQ,aAAa,EAAE;CAEzD,OAAO;AACT;AAEA,IAAa,+CACX,MACA,gBACW,oBAAoB,MAAM,aAAa,oBAAoB;AAExE,IAAa,qBAAqB,OAAe,WAA6C;CAC5F,IAAI,OAAO,UAAU,WAAW,GAC9B,OAAO;CAGT,IAAI;CACJ,IAAI;EACF,SAAS,QAAS,KAAK,MAAM,KAAK,IAA+B,CAAC;CACpE,QAAQ;EACN,MAAM,IAAI,YACR,2CAA2C,MAAM,2BAA2B,OAAO,MACrF;CACF;CAEA,KAAK,MAAM,YAAY,OAAO,WAC5B,IACE,CAAC,OAAO,UAAU,eAAe,KAAK,QAAQ,QAAQ,KACtD,OAAO,cAAc,QACrB,OAAO,cAAc,KAAA,GACrB;EACA,IAAI,OAAO,UACT,MAAM,IAAI,MACR,+BAA+B,SAAS,wBAAwB,OAAO,MACzE;EAGF,OAAO;CACT;CAGF,OAAO;AACT"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,8 +14,9 @@ import time from './date/time.js';
|
|
|
14
14
|
import select from './select/index.js';
|
|
15
15
|
import radioGroup from './radioGroup/index.js';
|
|
16
16
|
import checkbox from './checkbox/index.js';
|
|
17
|
+
import circleMark from './circleMark/index.js';
|
|
17
18
|
export { builtInPlugins } from './builtins.js';
|
|
18
|
-
export { text, multiVariableText, list, image, signature, svg, table, barcodes, line, rectangle, ellipse, dateTime, date, time, select, radioGroup, checkbox, };
|
|
19
|
+
export { text, multiVariableText, list, image, signature, svg, table, barcodes, line, rectangle, ellipse, dateTime, date, time, select, radioGroup, checkbox, circleMark, };
|
|
19
20
|
export { getDynamicHeightsForTable, getDynamicLayoutForTable } from './tables.js';
|
|
20
21
|
export { getDynamicLayoutForList } from './lists.js';
|
|
21
22
|
export { BUILT_IN_DYNAMIC_LAYOUT_SPLIT_UNITS, LIST_ITEM_SPLIT_UNIT, TABLE_BODY_SPLIT_UNIT, TEXT_LINE_SPLIT_UNIT, createListItemSplitRange, createTableBodySplitRange, createTextLineSplitRange, getListItemRange, getTableBodyRange, getTextLineRange, type BuiltInDynamicLayoutSplitUnit, } from './splitRange.js';
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { $ as VERTICAL_ALIGN_MIDDLE, F as DEFAULT_FONT_COLOR, G as PLACEHOLDER_FONT_COLOR, K as SYNTHETIC_BOLD_CSS_TEXT_SHADOW, N as DEFAULT_ALIGNMENT, a as createListItemSplitRange, b as createBoxDimension, c as getListItemRange, h as getFontKitFont, i as TEXT_LINE_SPLIT_UNIT, j as CODE_BACKGROUND_COLOR, l as getTableBodyRange, n as LIST_ITEM_SPLIT_UNIT, o as createTableBodySplitRange, r as TABLE_BODY_SPLIT_UNIT, s as createTextLineSplitRange, t as BUILT_IN_DYNAMIC_LAYOUT_SPLIT_UNITS, u as getTextLineRange, x as getBoxContentArea } from "./splitRange-
|
|
2
|
-
import { a as measureTextLines, d as isInlineMarkdownTextSchema, g as parseInlineMarkdown, p as resolveFontVariant } from "./measure-
|
|
3
|
-
import { a as mapVerticalAlignToFlex, c as Formatter, i as makeElementPlainTextContentEditable, l as getExtraFormatterSchema, n as textSchema, o as uiRender$4, r as buildStyledTextContainer, s as propPanel$3, t as builtInPlugins, u as pdfRender$4 } from "./builtins-
|
|
4
|
-
import { a as getCellPropPanelSchema, c as HEX_COLOR_PATTERN, i as getBodyWithSchemaRange, l as createSingleTable, n as getDynamicLayoutForTable, o as getColumnStylesPropPanelSchema, r as getBody, s as getDefaultCellStyles, t as getDynamicHeightsForTable } from "./dynamicTemplate-
|
|
5
|
-
import { c as isEditable, d as countUniqueVariableNames, f as getVariableNames, i as createSvgStr, l as readFile, n as convertForPdfLayoutProps, o as hex2PrintingColor, p as visitVariables, r as createErrorElm, t as addAlphaToHex, u as rotatePoint } from "./utils-
|
|
6
|
-
import { a as normalizeListItems, c as LIST_STYLE_BULLET, i as normalizeListItemEntries, l as LIST_STYLE_ORDERED, n as calculateListLayout, o as serializeListItems, s as DEFAULT_LIST_STYLE, t as getDynamicLayoutForList } from "./dynamicTemplate-
|
|
7
|
-
import { n as substituteVariablesAsInlineMarkdownLiterals, r as validateVariables, t as substituteVariables } from "./helper-
|
|
1
|
+
import { $ as VERTICAL_ALIGN_MIDDLE, F as DEFAULT_FONT_COLOR, G as PLACEHOLDER_FONT_COLOR, K as SYNTHETIC_BOLD_CSS_TEXT_SHADOW, N as DEFAULT_ALIGNMENT, a as createListItemSplitRange, b as createBoxDimension, c as getListItemRange, h as getFontKitFont, i as TEXT_LINE_SPLIT_UNIT, j as CODE_BACKGROUND_COLOR, l as getTableBodyRange, n as LIST_ITEM_SPLIT_UNIT, o as createTableBodySplitRange, r as TABLE_BODY_SPLIT_UNIT, s as createTextLineSplitRange, t as BUILT_IN_DYNAMIC_LAYOUT_SPLIT_UNITS, u as getTextLineRange, x as getBoxContentArea } from "./splitRange-Dh3WRCAN.js";
|
|
2
|
+
import { a as measureTextLines, d as isInlineMarkdownTextSchema, g as parseInlineMarkdown, p as resolveFontVariant } from "./measure-egCJqCr0.js";
|
|
3
|
+
import { a as mapVerticalAlignToFlex, c as Formatter, i as makeElementPlainTextContentEditable, l as getExtraFormatterSchema, n as textSchema, o as uiRender$4, r as buildStyledTextContainer, s as propPanel$3, t as builtInPlugins, u as pdfRender$4 } from "./builtins-6irEILr7.js";
|
|
4
|
+
import { a as getCellPropPanelSchema, c as HEX_COLOR_PATTERN, i as getBodyWithSchemaRange, l as createSingleTable, n as getDynamicLayoutForTable, o as getColumnStylesPropPanelSchema, r as getBody, s as getDefaultCellStyles, t as getDynamicHeightsForTable } from "./dynamicTemplate-CXBCt5wk.js";
|
|
5
|
+
import { c as isEditable, d as countUniqueVariableNames, f as getVariableNames, i as createSvgStr, l as readFile, n as convertForPdfLayoutProps, o as hex2PrintingColor, p as visitVariables, r as createErrorElm, t as addAlphaToHex, u as rotatePoint } from "./utils-TWv_zwgS.js";
|
|
6
|
+
import { a as normalizeListItems, c as LIST_STYLE_BULLET, i as normalizeListItemEntries, l as LIST_STYLE_ORDERED, n as calculateListLayout, o as serializeListItems, s as DEFAULT_LIST_STYLE, t as getDynamicLayoutForList } from "./dynamicTemplate-DFzbqkhF.js";
|
|
7
|
+
import { n as substituteVariablesAsInlineMarkdownLiterals, r as validateVariables, t as substituteVariables } from "./helper-DvnX6Fyq.js";
|
|
8
8
|
import "./tables.js";
|
|
9
9
|
import "./lists.js";
|
|
10
10
|
import { DEFAULT_FONT_NAME, ZOOM, b64toUint8Array, getDefaultFont, getFallbackFontName, getInternalLinkTarget, mm2pt, normalizeLinkHref, px2mm } from "@pdfme/common";
|
|
@@ -2967,7 +2967,7 @@ var uiRender = async (arg) => {
|
|
|
2967
2967
|
const removeColumnButton = createButton({
|
|
2968
2968
|
width: buttonSize,
|
|
2969
2969
|
height: buttonSize,
|
|
2970
|
-
top:
|
|
2970
|
+
top: `-18px`,
|
|
2971
2971
|
left: `${offsetX - px2mm(buttonSize)}mm`,
|
|
2972
2972
|
text: "-",
|
|
2973
2973
|
ariaLabel: "Remove column",
|
|
@@ -6325,6 +6325,114 @@ var schema = {
|
|
|
6325
6325
|
icon: getCheckedIcon()
|
|
6326
6326
|
};
|
|
6327
6327
|
//#endregion
|
|
6328
|
-
|
|
6328
|
+
//#region src/circleMark/index.ts
|
|
6329
|
+
var HEX_COLOR_REGEXP = new RegExp(HEX_COLOR_PATTERN);
|
|
6330
|
+
var isSelected = (value) => value === "true";
|
|
6331
|
+
var hasRenderableStyle = (schema) => schema.width > 0 && schema.height > 0 && schema.borderWidth > 0 && typeof schema.color === "string" && HEX_COLOR_REGEXP.test(schema.color);
|
|
6332
|
+
var circleMark = {
|
|
6333
|
+
ui: (arg) => {
|
|
6334
|
+
const { schema, value, onChange, rootElement, mode } = arg;
|
|
6335
|
+
const selected = isSelected(value);
|
|
6336
|
+
const editable = isEditable(mode, schema);
|
|
6337
|
+
const shouldRenderMark = selected && hasRenderableStyle(schema);
|
|
6338
|
+
if (!editable && !shouldRenderMark) return;
|
|
6339
|
+
const container = document.createElement("div");
|
|
6340
|
+
container.style.width = "100%";
|
|
6341
|
+
container.style.height = "100%";
|
|
6342
|
+
container.style.boxSizing = "border-box";
|
|
6343
|
+
if (editable) {
|
|
6344
|
+
container.style.cursor = "pointer";
|
|
6345
|
+
container.addEventListener("click", () => {
|
|
6346
|
+
if (onChange) onChange({
|
|
6347
|
+
key: "content",
|
|
6348
|
+
value: selected ? "false" : "true"
|
|
6349
|
+
});
|
|
6350
|
+
});
|
|
6351
|
+
}
|
|
6352
|
+
if (shouldRenderMark) {
|
|
6353
|
+
const mark = document.createElement("div");
|
|
6354
|
+
mark.style.width = "100%";
|
|
6355
|
+
mark.style.height = "100%";
|
|
6356
|
+
mark.style.boxSizing = "border-box";
|
|
6357
|
+
mark.style.borderRadius = "50%";
|
|
6358
|
+
mark.style.borderWidth = `${schema.borderWidth}mm`;
|
|
6359
|
+
mark.style.borderStyle = "solid";
|
|
6360
|
+
mark.style.borderColor = schema.color;
|
|
6361
|
+
mark.style.pointerEvents = "none";
|
|
6362
|
+
container.appendChild(mark);
|
|
6363
|
+
}
|
|
6364
|
+
rootElement.appendChild(container);
|
|
6365
|
+
},
|
|
6366
|
+
pdf: (arg) => {
|
|
6367
|
+
const { schema, value, page, options } = arg;
|
|
6368
|
+
if (!isSelected(value) || !hasRenderableStyle(schema)) return;
|
|
6369
|
+
const borderWidth = mm2pt(schema.borderWidth);
|
|
6370
|
+
const cArg = {
|
|
6371
|
+
schema,
|
|
6372
|
+
pageHeight: page.getHeight()
|
|
6373
|
+
};
|
|
6374
|
+
const { width, height, rotate, opacity } = convertForPdfLayoutProps(cArg);
|
|
6375
|
+
const { position: { x, y } } = convertForPdfLayoutProps({
|
|
6376
|
+
...cArg,
|
|
6377
|
+
applyRotateTranslate: false
|
|
6378
|
+
});
|
|
6379
|
+
const xScale = width / 2 - borderWidth / 2;
|
|
6380
|
+
const yScale = height / 2 - borderWidth / 2;
|
|
6381
|
+
if (xScale <= 0 || yScale <= 0) return;
|
|
6382
|
+
page.drawEllipse({
|
|
6383
|
+
x: x + width / 2,
|
|
6384
|
+
y: y + height / 2,
|
|
6385
|
+
xScale,
|
|
6386
|
+
yScale,
|
|
6387
|
+
rotate,
|
|
6388
|
+
borderWidth,
|
|
6389
|
+
borderColor: hex2PrintingColor(schema.color, options.colorType),
|
|
6390
|
+
borderOpacity: opacity
|
|
6391
|
+
});
|
|
6392
|
+
},
|
|
6393
|
+
propPanel: {
|
|
6394
|
+
schema: ({ i18n }) => ({
|
|
6395
|
+
color: {
|
|
6396
|
+
title: i18n("schemas.color"),
|
|
6397
|
+
type: "string",
|
|
6398
|
+
widget: "color",
|
|
6399
|
+
props: { disabledAlpha: true },
|
|
6400
|
+
required: true,
|
|
6401
|
+
rules: [{
|
|
6402
|
+
pattern: HEX_COLOR_PATTERN,
|
|
6403
|
+
message: i18n("validation.hexColor")
|
|
6404
|
+
}]
|
|
6405
|
+
},
|
|
6406
|
+
borderWidth: {
|
|
6407
|
+
title: i18n("schemas.borderWidth"),
|
|
6408
|
+
type: "number",
|
|
6409
|
+
widget: "inputNumber",
|
|
6410
|
+
props: {
|
|
6411
|
+
min: 0,
|
|
6412
|
+
step: 1
|
|
6413
|
+
},
|
|
6414
|
+
required: true
|
|
6415
|
+
}
|
|
6416
|
+
}),
|
|
6417
|
+
defaultSchema: {
|
|
6418
|
+
name: "",
|
|
6419
|
+
type: "circleMark",
|
|
6420
|
+
content: "false",
|
|
6421
|
+
position: {
|
|
6422
|
+
x: 0,
|
|
6423
|
+
y: 0
|
|
6424
|
+
},
|
|
6425
|
+
width: 10,
|
|
6426
|
+
height: 10,
|
|
6427
|
+
rotate: 0,
|
|
6428
|
+
opacity: 1,
|
|
6429
|
+
color: "#000000",
|
|
6430
|
+
borderWidth: 1
|
|
6431
|
+
}
|
|
6432
|
+
},
|
|
6433
|
+
icon: createSvgStr(Circle)
|
|
6434
|
+
};
|
|
6435
|
+
//#endregion
|
|
6436
|
+
export { BUILT_IN_DYNAMIC_LAYOUT_SPLIT_UNITS, LIST_ITEM_SPLIT_UNIT, TABLE_BODY_SPLIT_UNIT, TEXT_LINE_SPLIT_UNIT, barcodes, builtInPlugins, schema as checkbox, circleMark, createListItemSplitRange, createTableBodySplitRange, createTextLineSplitRange, date_default as date, dateTime_default as dateTime, ellipse, getDynamicHeightsForTable, getDynamicLayoutForList, getDynamicLayoutForTable, getListItemRange, getTableBodyRange, getTextLineRange, imageSchema as image, lineSchema as line, listSchema as list, schema$1 as multiVariableText, schema$2 as radioGroup, rectangle, schema$3 as select, signature, svgSchema as svg, tableSchema as table, textSchema as text, time_default as time };
|
|
6329
6437
|
|
|
6330
6438
|
//# sourceMappingURL=index.js.map
|