@ganttloom/gantt-export 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +109 -0
- package/dist/chunk-JB7HLLAI.js +113 -0
- package/dist/chunk-JB7HLLAI.js.map +1 -0
- package/dist/chunk-PXURNZ6Y.js +272 -0
- package/dist/chunk-PXURNZ6Y.js.map +1 -0
- package/dist/chunk-QPE3ABUG.js +229 -0
- package/dist/chunk-QPE3ABUG.js.map +1 -0
- package/dist/chunk-TYNGUB4V.js +434 -0
- package/dist/chunk-TYNGUB4V.js.map +1 -0
- package/dist/chunk-X5RULSWH.js +125 -0
- package/dist/chunk-X5RULSWH.js.map +1 -0
- package/dist/index.cjs +1167 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/paginate-Z2RycLzz.d.cts +73 -0
- package/dist/paginate-Z2RycLzz.d.ts +73 -0
- package/dist/pdf.cjs +671 -0
- package/dist/pdf.cjs.map +1 -0
- package/dist/pdf.d.cts +13 -0
- package/dist/pdf.d.ts +13 -0
- package/dist/pdf.js +11 -0
- package/dist/pdf.js.map +1 -0
- package/dist/pptx.cjs +827 -0
- package/dist/pptx.cjs.map +1 -0
- package/dist/pptx.d.cts +15 -0
- package/dist/pptx.d.ts +15 -0
- package/dist/pptx.js +12 -0
- package/dist/pptx.js.map +1 -0
- package/dist/xlsx.cjs +256 -0
- package/dist/xlsx.cjs.map +1 -0
- package/dist/xlsx.d.cts +22 -0
- package/dist/xlsx.d.ts +22 -0
- package/dist/xlsx.js +8 -0
- package/dist/xlsx.js.map +1 -0
- package/package.json +69 -0
package/dist/pdf.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pdf.ts","../src/paginate.ts","../src/geom.ts","../src/layout.ts","../src/pdf/writer.ts","../src/color.ts","../src/pdf/content.ts","../src/pdf/index.ts"],"sourcesContent":["export * from \"./pdf/index.js\";\n","import type { GanttRenderModel } from \"@ganttloom/gantt-core\";\n\n/**\n * Shared pagination math used by both the PDF and PPTX writers.\n *\n * A GanttRenderModel can be far taller (many rows) and wider (long date\n * range) than a single printed page/slide. We tile the full model into a\n * grid of (rowBand, colBand) pages: the grid panel (task list columns) is\n * repeated on every page, while the timeline (bars/links/ticks) is sliced\n * into vertical/horizontal bands so nothing is dropped or duplicated.\n */\n\nexport type PageSizeName = \"A4\" | \"Letter\" | \"A3\";\nexport type Orientation = \"portrait\" | \"landscape\";\n\nconst PAGE_SIZES_PT: Record<PageSizeName, { width: number; height: number }> = {\n // Values are the portrait (short-edge width x long-edge height) dimensions\n // in PDF/typographic points (72pt = 1in).\n A4: { width: 595.28, height: 841.89 },\n Letter: { width: 612, height: 792 },\n A3: { width: 841.89, height: 1190.55 },\n};\n\nexport interface Margins {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nexport interface PageSizeOption {\n name?: PageSizeName;\n orientation?: Orientation;\n /** escape hatch: exact page dimensions in points, overrides name/orientation */\n custom?: { widthPt: number; heightPt: number };\n}\n\nexport interface PaginationOptions {\n pageSize?: PageSizeOption;\n margins?: Partial<Margins>;\n /** px -> pt scale factor. Default 0.75 (96 CSS px/in -> 72pt/in). */\n scale?: number;\n /** override the auto-computed (sum of column widths) grid panel width, in px */\n gridPanelWidthPx?: number;\n}\n\nexport interface Band {\n start: number;\n end: number;\n}\n\nexport interface PageBand {\n rowBand: number;\n colBand: number;\n /** row slice bounds, in model px coordinates (model.rows[].y space) */\n rowStartY: number;\n rowEndY: number;\n /** timeline slice bounds, in model px coordinates (model.bars[].x space) */\n colStartX: number;\n colEndX: number;\n}\n\nexport interface PaginationLayout {\n pageWidthPt: number;\n pageHeightPt: number;\n margins: Margins;\n /** px -> pt scale factor in effect */\n scale: number;\n gridPanelWidthPx: number;\n gridPanelWidthPt: number;\n headerHeightPx: number;\n headerHeightPt: number;\n /** width of the timeline area available per page, in px (model space) */\n timelineWidthPxPerPage: number;\n /** height of the rows area available per page, in px (model space) */\n rowsHeightPxPerPage: number;\n rowBands: Band[];\n colBands: Band[];\n pages: PageBand[];\n rowCount: number;\n colCount: number;\n}\n\nconst DEFAULT_MARGIN_PT = 36; // 0.5in\nconst DEFAULT_SCALE = 0.75; // 96 css px/in -> 72pt/in\nconst MIN_TIMELINE_WIDTH_PT = 50;\nconst MIN_ROWS_HEIGHT_PT = 20;\n\nexport function resolvePageSize(opt?: PageSizeOption): { width: number; height: number } {\n if (opt?.custom) {\n return { width: opt.custom.widthPt, height: opt.custom.heightPt };\n }\n const name = opt?.name ?? \"A4\";\n const base = PAGE_SIZES_PT[name];\n const orientation = opt?.orientation ?? \"landscape\";\n const short = Math.min(base.width, base.height);\n const long = Math.max(base.width, base.height);\n return orientation === \"landscape\" ? { width: long, height: short } : { width: short, height: long };\n}\n\nfunction defaultGridPanelWidthPx(model: GanttRenderModel): number {\n const cols = model.columns ?? [];\n if (cols.length === 0) return 160; // fallback single \"task name\" column\n return cols.reduce((sum, c) => sum + (c.width ?? 120), 0);\n}\n\nexport function computePagination(\n model: GanttRenderModel,\n options: PaginationOptions = {},\n): PaginationLayout {\n const { width: pageWidthPt, height: pageHeightPt } = resolvePageSize(options.pageSize);\n const margins: Margins = {\n top: options.margins?.top ?? DEFAULT_MARGIN_PT,\n right: options.margins?.right ?? DEFAULT_MARGIN_PT,\n bottom: options.margins?.bottom ?? DEFAULT_MARGIN_PT,\n left: options.margins?.left ?? DEFAULT_MARGIN_PT,\n };\n const scale = options.scale ?? DEFAULT_SCALE;\n const gridPanelWidthPx = options.gridPanelWidthPx ?? defaultGridPanelWidthPx(model);\n const gridPanelWidthPt = gridPanelWidthPx * scale;\n const headerHeightPx = model.headerHeight;\n const headerHeightPt = headerHeightPx * scale;\n\n const contentWidthPt = pageWidthPt - margins.left - margins.right;\n const contentHeightPt = pageHeightPt - margins.top - margins.bottom;\n\n const timelineWidthPtPerPage = Math.max(contentWidthPt - gridPanelWidthPt, MIN_TIMELINE_WIDTH_PT);\n const rowsHeightPtPerPage = Math.max(contentHeightPt - headerHeightPt, MIN_ROWS_HEIGHT_PT);\n\n const timelineWidthPxPerPage = timelineWidthPtPerPage / scale;\n const rowsHeightPxPerPage = rowsHeightPtPerPage / scale;\n\n const totalHeightPx = Math.max(model.height, 1);\n const totalWidthPx = Math.max(model.width, 1);\n\n const rowCount = Math.max(1, Math.ceil(totalHeightPx / rowsHeightPxPerPage));\n const colCount = Math.max(1, Math.ceil(totalWidthPx / timelineWidthPxPerPage));\n\n const rowBands: Band[] = [];\n for (let i = 0; i < rowCount; i++) {\n rowBands.push({\n start: i * rowsHeightPxPerPage,\n end: Math.min(totalHeightPx, (i + 1) * rowsHeightPxPerPage),\n });\n }\n const colBands: Band[] = [];\n for (let i = 0; i < colCount; i++) {\n colBands.push({\n start: i * timelineWidthPxPerPage,\n end: Math.min(totalWidthPx, (i + 1) * timelineWidthPxPerPage),\n });\n }\n\n const pages: PageBand[] = [];\n for (let r = 0; r < rowCount; r++) {\n const rowBand = rowBands[r]!;\n for (let c = 0; c < colCount; c++) {\n const colBand = colBands[c]!;\n pages.push({\n rowBand: r,\n colBand: c,\n rowStartY: rowBand.start,\n rowEndY: rowBand.end,\n colStartX: colBand.start,\n colEndX: colBand.end,\n });\n }\n }\n\n return {\n pageWidthPt,\n pageHeightPt,\n margins,\n scale,\n gridPanelWidthPx,\n gridPanelWidthPt,\n headerHeightPx,\n headerHeightPt,\n timelineWidthPxPerPage,\n rowsHeightPxPerPage,\n rowBands,\n colBands,\n pages,\n rowCount,\n colCount,\n };\n}\n\nexport interface ClipRect {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n}\n\n/** Liang-Barsky line-segment clipping against an axis-aligned rectangle. */\nexport function clipSegment(\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n rect: ClipRect,\n): { x0: number; y0: number; x1: number; y1: number } | null {\n let t0 = 0;\n let t1 = 1;\n const dx = x1 - x0;\n const dy = y1 - y0;\n const checks: Array<[number, number]> = [\n [-dx, x0 - rect.x0],\n [dx, rect.x1 - x0],\n [-dy, y0 - rect.y0],\n [dy, rect.y1 - y0],\n ];\n for (const [p, q] of checks) {\n if (p === 0) {\n if (q < 0) return null;\n } else {\n const r = q / p;\n if (p < 0) {\n if (r > t1) return null;\n if (r > t0) t0 = r;\n } else {\n if (r < t0) return null;\n if (r < t1) t1 = r;\n }\n }\n }\n return { x0: x0 + t0 * dx, y0: y0 + t0 * dy, x1: x0 + t1 * dx, y1: y0 + t1 * dy };\n}\n\n/** Clip an axis-aligned rectangle against a band; null if fully outside. */\nexport function clipRect(\n x: number,\n y: number,\n w: number,\n h: number,\n rect: ClipRect,\n): { x: number; y: number; w: number; h: number } | null {\n const x0 = Math.max(x, rect.x0);\n const y0 = Math.max(y, rect.y0);\n const x1 = Math.min(x + w, rect.x1);\n const y1 = Math.min(y + h, rect.y1);\n if (x1 <= x0 || y1 <= y0) return null;\n return { x: x0, y: y0, w: x1 - x0, h: y1 - y0 };\n}\n","import type { GanttRenderBar } from \"@ganttloom/gantt-core\";\nimport { clipSegment, type ClipRect } from \"./paginate.js\";\n\n/**\n * Dependency-link geometry.\n *\n * NOTE on design choice: GanttRenderLink.path is an SVG path \"d\" string\n * produced by gantt-core for on-screen rendering. Rather than writing an SVG\n * path parser (and a bezier-vs-page-boundary clipper) we recompute a simple\n * orthogonal \"elbow\" polyline directly from the two bars' resolved geometry\n * (GanttRenderBar.x/y/width/height, looked up by taskId). This is simpler,\n * avoids a dependency-free SVG parser, and is trivial to clip correctly at\n * page/slide boundaries using straight-line (Liang-Barsky) clipping.\n */\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport function computeLinkPolyline(fromBar: GanttRenderBar, toBar: GanttRenderBar): Point[] {\n const x0 = fromBar.x + fromBar.width;\n const y0 = fromBar.y + fromBar.height / 2;\n const x1 = toBar.x;\n const y1 = toBar.y + toBar.height / 2;\n if (Math.abs(y1 - y0) < 0.01) {\n return [{ x: x0, y: y0 }, { x: x1, y: y1 }];\n }\n const midX = x0 + (x1 - x0) / 2;\n return [\n { x: x0, y: y0 },\n { x: midX, y: y0 },\n { x: midX, y: y1 },\n { x: x1, y: y1 },\n ];\n}\n\n/**\n * Clip a polyline against a rectangle, returning zero or more visible\n * sub-polylines (a link that dips outside the band and back in produces\n * multiple disjoint pieces; a fully-outside link produces none).\n */\nexport function clipPolylineToRect(points: Point[], rect: ClipRect): Point[][] {\n const segments: Point[][] = [];\n let current: Point[] = [];\n for (let i = 0; i < points.length - 1; i++) {\n const a = points[i]!;\n const b = points[i + 1]!;\n const clipped = clipSegment(a.x, a.y, b.x, b.y, rect);\n if (!clipped) {\n if (current.length > 1) segments.push(current);\n current = [];\n continue;\n }\n if (current.length === 0) {\n current.push({ x: clipped.x0, y: clipped.y0 });\n } else {\n const last = current[current.length - 1]!;\n if (Math.abs(last.x - clipped.x0) > 0.01 || Math.abs(last.y - clipped.y0) > 0.01) {\n if (current.length > 1) segments.push(current);\n current = [{ x: clipped.x0, y: clipped.y0 }];\n }\n }\n current.push({ x: clipped.x1, y: clipped.y1 });\n }\n if (current.length > 1) segments.push(current);\n return segments;\n}\n","import type { GanttColumn, GanttRenderModel, GanttTask } from \"@ganttloom/gantt-core\";\nimport type { PageBand, PaginationLayout } from \"./paginate.js\";\nimport { clipRect, type ClipRect } from \"./paginate.js\";\nimport { computeLinkPolyline, clipPolylineToRect, type Point } from \"./geom.js\";\n\n/**\n * Format-agnostic draw commands for one page/slide, in top-down point\n * coordinates relative to the full page (origin at the page's top-left\n * corner, y increasing downward — margins already baked in). Both the PDF\n * writer (which flips y to PDF's bottom-up space) and the PPTX writer\n * (which uses top-down EMUs natively) consume the same list, so the\n * row/column/link walking and clipping logic is written exactly once.\n */\n\nexport interface DrawRect {\n kind: \"rect\";\n x: number;\n y: number;\n w: number;\n h: number;\n fill?: string;\n stroke?: string;\n}\n\nexport interface DrawDiamond {\n kind: \"diamond\";\n cx: number;\n cy: number;\n r: number;\n fill?: string;\n stroke?: string;\n}\n\nexport interface DrawLine {\n kind: \"line\";\n points: Point[];\n stroke: string;\n}\n\nexport interface DrawText {\n kind: \"text\";\n x: number;\n y: number;\n w?: number;\n text: string;\n size: number;\n color: string;\n bold?: boolean;\n align?: \"left\" | \"center\" | \"right\";\n}\n\nexport type DrawCommand = DrawRect | DrawDiamond | DrawLine | DrawText;\n\nexport interface PageContent {\n widthPt: number;\n heightPt: number;\n commands: DrawCommand[];\n}\n\nfunction columnWidthsPt(model: GanttRenderModel, layout: PaginationLayout): { column: GanttColumn; widthPt: number }[] {\n const columns: GanttColumn[] =\n model.columns.length > 0 ? model.columns : [{ id: \"name\", title: \"Task\" }];\n const naturalTotal = columns.reduce((sum, c) => sum + (c.width ?? 120), 0) || 1;\n return columns.map((column) => ({\n column,\n widthPt: ((column.width ?? 120) / naturalTotal) * layout.gridPanelWidthPt,\n }));\n}\n\nfunction cellText(column: GanttColumn, task: GanttTask | undefined, depth: number): string {\n if (!task) return \"\";\n if (column.accessor) {\n const v = column.accessor(task);\n return v === null || v === undefined ? \"\" : String(v);\n }\n const indent = \" \".repeat(Math.max(0, depth));\n return `${indent}${task.name}`;\n}\n\nexport function buildPageContent(\n model: GanttRenderModel,\n tasks: GanttTask[],\n layout: PaginationLayout,\n page: PageBand,\n): PageContent {\n const { scale, gridPanelWidthPt, headerHeightPt, pageWidthPt, pageHeightPt, margins } = layout;\n const theme = model.theme;\n const tasksById = new Map(tasks.map((t) => [t.id, t]));\n const barsByTaskId = new Map(model.bars.map((b) => [b.taskId, b]));\n const rowsByTaskId = new Map(model.rows.map((r) => [r.taskId, r]));\n\n const commands: DrawCommand[] = [];\n const contentX0 = margins.left;\n const contentY0 = margins.top;\n\n const timelineRect: ClipRect = {\n x0: page.colStartX,\n y0: page.rowStartY,\n x1: page.colEndX,\n y1: page.rowEndY,\n };\n\n // page background\n commands.push({ kind: \"rect\", x: 0, y: 0, w: pageWidthPt, h: pageHeightPt, fill: theme.backgroundColor });\n\n const cols = columnWidthsPt(model, layout);\n\n // -- header row: grid panel column titles + timeline ticks --\n let colCursor = contentX0;\n for (const { column, widthPt } of cols) {\n commands.push({\n kind: \"text\",\n x: colCursor + 4,\n y: contentY0 + headerHeightPt / 2 - 5,\n w: widthPt - 8,\n text: column.title,\n size: 9,\n color: theme.textColor,\n bold: true,\n align: column.align ?? \"left\",\n });\n colCursor += widthPt;\n }\n commands.push({\n kind: \"rect\",\n x: contentX0,\n y: contentY0,\n w: gridPanelWidthPt + (page.colEndX - page.colStartX) * scale,\n h: headerHeightPt,\n stroke: theme.gridColor,\n });\n\n const timelineOriginX = contentX0 + gridPanelWidthPt;\n for (const tick of model.ticks) {\n if (tick.x < page.colStartX || tick.x > page.colEndX) continue;\n const px = timelineOriginX + (tick.x - page.colStartX) * scale;\n if (tick.isWeekend) {\n // faint full-height band is drawn by the caller per-row below; header tick line only here\n }\n commands.push({\n kind: \"line\",\n points: [\n { x: px, y: contentY0 },\n { x: px, y: pageHeightPt - margins.bottom },\n ],\n stroke: tick.isToday ? theme.todayColor : theme.gridColor,\n });\n commands.push({\n kind: \"text\",\n x: px + 2,\n y: contentY0 + headerHeightPt / 2 - 5,\n text: tick.label,\n size: 7,\n color: theme.textColor,\n align: \"left\",\n });\n }\n\n // -- rows: grid panel cells + timeline bars, clipped to this page's row band --\n const rowTop = (y: number) => contentY0 + headerHeightPt + (y - page.rowStartY) * scale;\n\n for (const row of model.rows) {\n if (row.y + row.height <= page.rowStartY || row.y >= page.rowEndY) continue;\n // clip the row's [y, y+height) span to this page's row band (1-D clip)\n const clippedRowY0 = Math.max(row.y, page.rowStartY);\n const clippedRowY1 = Math.min(row.y + row.height, page.rowEndY);\n const rowYTop = rowTop(clippedRowY0);\n const rowHPt = (clippedRowY1 - clippedRowY0) * scale;\n const task = tasksById.get(row.taskId);\n\n // grid panel row cells\n let cx = contentX0;\n for (const { column, widthPt } of cols) {\n commands.push({\n kind: \"text\",\n x: cx + 4,\n y: rowYTop + rowHPt / 2 - 4,\n w: widthPt - 8,\n text: cellText(column, task, row.depth),\n size: 8,\n color: theme.textColor,\n align: column.align ?? \"left\",\n });\n cx += widthPt;\n }\n commands.push({\n kind: \"rect\",\n x: contentX0,\n y: rowYTop,\n w: gridPanelWidthPt + (page.colEndX - page.colStartX) * scale,\n h: rowHPt,\n stroke: theme.gridColor,\n });\n\n // timeline bar for this row\n const bar = barsByTaskId.get(row.taskId);\n if (bar) {\n const clippedBar = clipRect(bar.x, bar.y, bar.width, bar.height, timelineRect);\n if (clippedBar) {\n const bx = timelineOriginX + (clippedBar.x - page.colStartX) * scale;\n const by = rowTop(clippedBar.y);\n const bw = clippedBar.w * scale;\n const bh = clippedBar.h * scale;\n\n if (bar.baseline) {\n const clippedBaseline = clipRect(bar.baseline.x, bar.y, bar.baseline.width, bar.height, timelineRect);\n if (clippedBaseline) {\n commands.push({\n kind: \"rect\",\n x: timelineOriginX + (clippedBaseline.x - page.colStartX) * scale,\n y: rowTop(clippedBaseline.y),\n w: clippedBaseline.w * scale,\n h: clippedBaseline.h * scale,\n fill: theme.baselineColor,\n });\n }\n }\n\n if (bar.isMilestone) {\n const r = bh / 2;\n commands.push({\n kind: \"diamond\",\n cx: bx + r,\n cy: by + r,\n r,\n fill: bar.isCritical ? theme.criticalColor : bar.color,\n stroke: theme.textColor,\n });\n if (bar.label) {\n commands.push({\n kind: \"text\",\n x: bx + bh + 4,\n y: by + bh / 2 - 4,\n text: bar.label,\n size: 8,\n color: theme.textColor,\n });\n }\n } else {\n commands.push({\n kind: \"rect\",\n x: bx,\n y: by,\n w: bw,\n h: bh,\n fill: bar.isCritical ? theme.criticalColor : bar.color,\n });\n if (bar.progressWidth > 0) {\n const clippedProgress = clipRect(bar.x, bar.y, bar.progressWidth, bar.height, timelineRect);\n if (clippedProgress) {\n commands.push({\n kind: \"rect\",\n x: timelineOriginX + (clippedProgress.x - page.colStartX) * scale,\n y: rowTop(clippedProgress.y),\n w: clippedProgress.w * scale,\n h: clippedProgress.h * scale,\n fill: bar.progressColor,\n });\n }\n }\n commands.push({\n kind: \"text\",\n x: bx + 3,\n y: by + bh / 2 - 4,\n text: bar.label,\n size: 8,\n color: theme.textColor,\n });\n }\n }\n }\n }\n\n // -- dependency links, recomputed & clipped per band --\n for (const link of model.links) {\n const fromBar = barsByTaskId.get(link.fromId);\n const toBar = barsByTaskId.get(link.toId);\n if (!fromBar || !toBar) continue;\n // skip entirely if neither endpoint's row is visible on this page at all\n const fromRow = rowsByTaskId.get(link.fromId);\n const toRow = rowsByTaskId.get(link.toId);\n if (!fromRow || !toRow) continue;\n const polyline = computeLinkPolyline(fromBar, toBar);\n const pieces = clipPolylineToRect(polyline, timelineRect);\n for (const piece of pieces) {\n commands.push({\n kind: \"line\",\n points: piece.map((p) => ({\n x: timelineOriginX + (p.x - page.colStartX) * scale,\n y: rowTop(p.y),\n })),\n stroke: link.isCritical ? theme.criticalColor : theme.linkColor,\n });\n }\n }\n\n return { widthPt: pageWidthPt, heightPt: pageHeightPt, commands };\n}\n","/**\n * Minimal from-scratch PDF object-model writer.\n *\n * Builds a PDF 1.4 file by appending raw bytes to a growing list of chunks\n * while recording the exact byte offset of every indirect object as it is\n * written, then emits a correct cross-reference (xref) table and trailer\n * pointing at those recorded offsets. No external PDF library is used.\n *\n * Object numbers may be reserved ahead of time (`reserveId`) and objects may\n * be appended to the byte stream in any order — the PDF spec only requires\n * the xref table's offsets to be correct, not that objects appear in\n * numeric order in the file body. This lets us, e.g., reserve the `/Pages`\n * object id before we know its `/Kids` array (which depends on how many\n * pages get created) and only serialize it once all pages are known.\n */\n\nconst encoder = new TextEncoder();\n\n/** Encode a JS string as single-byte Latin-1 (WinAnsi-compatible) bytes, replacing anything outside it with \"?\". */\nexport function encodeLatin1(str: string): Uint8Array {\n const out = new Uint8Array(str.length);\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n out[i] = code <= 255 ? code : 0x3f; // \"?\"\n }\n return out;\n}\n\n/** Escape a string for use inside a PDF literal string, e.g. `(...)`. */\nexport function escapePdfText(str: string): string {\n return str.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\(/g, \"\\\\(\").replace(/\\)/g, \"\\\\)\");\n}\n\n/** Build one xref subsection entry line — must be exactly 20 bytes. */\nfunction xrefLine(offset: number, generation: number, type: \"n\" | \"f\"): string {\n const line = `${String(offset).padStart(10, \"0\")} ${String(generation).padStart(5, \"0\")} ${type} \\n`;\n return line;\n}\n\nexport class PdfBuilder {\n private parts: Uint8Array[] = [];\n private length = 0;\n private offsetsById = new Map<number, number>();\n private nextId = 1;\n\n reserveId(): number {\n return this.nextId++;\n }\n\n private raw(bytes: Uint8Array): void {\n this.parts.push(bytes);\n this.length += bytes.length;\n }\n\n private text(s: string): void {\n this.raw(encoder.encode(s));\n }\n\n writeHeader(): void {\n this.text(\"%PDF-1.4\\n\");\n // Recommended binary-marker comment (bytes >= 0x80) so tools detect this\n // as a binary file rather than plain text.\n this.raw(new Uint8Array([0x25, 0xe2, 0xe3, 0xcf, 0xd3, 0x0a]));\n }\n\n /** Append a simple (non-stream) indirect object, e.g. a dictionary or array. */\n addObject(id: number, body: string): void {\n this.offsetsById.set(id, this.length);\n this.text(`${id} 0 obj\\n${body}\\nendobj\\n`);\n }\n\n /** Append a stream object; `dictExtra` is the dictionary content besides `/Length`. */\n addStreamObject(id: number, dictExtra: string, data: Uint8Array): void {\n this.offsetsById.set(id, this.length);\n this.text(`${id} 0 obj\\n<< ${dictExtra} /Length ${data.length} >>\\nstream\\n`);\n this.raw(data);\n this.text(\"\\nendstream\\nendobj\\n\");\n }\n\n /** Finalize the file: write the xref table, trailer, and startxref/%%EOF footer. */\n build(rootId: number): Uint8Array {\n const xrefOffset = this.length;\n const maxId = this.nextId - 1;\n let xref = `xref\\n0 ${maxId + 1}\\n`;\n xref += xrefLine(0, 65535, \"f\");\n for (let id = 1; id <= maxId; id++) {\n const off = this.offsetsById.get(id);\n if (off === undefined) {\n throw new Error(`PdfBuilder: object ${id} was reserved but never written`);\n }\n xref += xrefLine(off, 0, \"n\");\n }\n this.text(xref);\n this.text(`trailer\\n<< /Size ${maxId + 1} /Root ${rootId} 0 R >>\\nstartxref\\n${xrefOffset}\\n%%EOF`);\n\n const total = new Uint8Array(this.length);\n let o = 0;\n for (const p of this.parts) {\n total.set(p, o);\n o += p.length;\n }\n return total;\n }\n\n /** Byte offset an object was (or will be) written at — exposed for tests. */\n getOffset(id: number): number | undefined {\n return this.offsetsById.get(id);\n }\n}\n","/** Parse a CSS-ish color string into 0-1 RGB components. Falls back to black. */\nexport function parseColor(input: string | undefined | null): [number, number, number] {\n if (!input) return [0, 0, 0];\n const s = input.trim();\n const hex = s.match(/^#?([0-9a-fA-F]{6})$/) ?? s.match(/^#?([0-9a-fA-F]{3})$/);\n if (hex) {\n let h = hex[1]!;\n if (h.length === 3) {\n h = h\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n const r = parseInt(h.slice(0, 2), 16) / 255;\n const g = parseInt(h.slice(2, 4), 16) / 255;\n const b = parseInt(h.slice(4, 6), 16) / 255;\n return [r, g, b];\n }\n const rgb = s.match(/^rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/i);\n if (rgb) {\n return [Number(rgb[1]) / 255, Number(rgb[2]) / 255, Number(rgb[3]) / 255];\n }\n const named: Record<string, [number, number, number]> = {\n black: [0, 0, 0],\n white: [1, 1, 1],\n red: [1, 0, 0],\n green: [0, 0.5, 0],\n blue: [0, 0, 1],\n gray: [0.5, 0.5, 0.5],\n grey: [0.5, 0.5, 0.5],\n transparent: [1, 1, 1],\n };\n return named[s.toLowerCase()] ?? [0, 0, 0];\n}\n\nfunction toHexByte(v: number): string {\n return Math.round(Math.max(0, Math.min(1, v)) * 255)\n .toString(16)\n .padStart(2, \"0\");\n}\n\n/** Normalize any supported CSS-ish color string to a bare \"RRGGBB\" hex (for OOXML srgbClr). */\nexport function toHexRRGGBB(input: string | undefined | null): string {\n const [r, g, b] = parseColor(input);\n return `${toHexByte(r)}${toHexByte(g)}${toHexByte(b)}`.toUpperCase();\n}\n","import type { DrawCommand } from \"../layout.js\";\nimport { parseColor } from \"../color.js\";\nimport { encodeLatin1, escapePdfText } from \"./writer.js\";\n\nfunction num(n: number): string {\n // avoid -0 and excessive decimals in the content stream\n const r = Math.round(n * 1000) / 1000;\n return Object.is(r, -0) ? \"0\" : String(r);\n}\n\nfunction colorOp(color: string, op: \"rg\" | \"RG\"): string {\n const [r, g, b] = parseColor(color);\n return `${num(r)} ${num(g)} ${num(b)} ${op}\\n`;\n}\n\n/**\n * Render a page's format-agnostic draw commands into a PDF content stream.\n * PDF's coordinate system has its origin at the bottom-left with y\n * increasing upward, while our shared layout uses top-down coordinates —\n * so every emitted coordinate is flipped here: pdfY = pageHeightPt - y.\n */\nexport function buildContentStream(commands: DrawCommand[], pageHeightPt: number): Uint8Array {\n let s = \"q\\n\";\n for (const cmd of commands) {\n switch (cmd.kind) {\n case \"rect\": {\n const x = cmd.x;\n const yTop = pageHeightPt - (cmd.y + cmd.h);\n if (cmd.fill) s += colorOp(cmd.fill, \"rg\");\n if (cmd.stroke) s += colorOp(cmd.stroke, \"RG\");\n s += `${num(x)} ${num(yTop)} ${num(cmd.w)} ${num(cmd.h)} re\\n`;\n if (cmd.fill && cmd.stroke) s += \"B\\n\";\n else if (cmd.fill) s += \"f\\n\";\n else if (cmd.stroke) s += \"S\\n\";\n break;\n }\n case \"diamond\": {\n const pts = [\n { x: cmd.cx, y: cmd.cy - cmd.r },\n { x: cmd.cx + cmd.r, y: cmd.cy },\n { x: cmd.cx, y: cmd.cy + cmd.r },\n { x: cmd.cx - cmd.r, y: cmd.cy },\n ].map((p) => ({ x: p.x, y: pageHeightPt - p.y }));\n if (cmd.fill) s += colorOp(cmd.fill, \"rg\");\n if (cmd.stroke) s += colorOp(cmd.stroke, \"RG\");\n s += `${num(pts[0]!.x)} ${num(pts[0]!.y)} m\\n`;\n for (let i = 1; i < pts.length; i++) s += `${num(pts[i]!.x)} ${num(pts[i]!.y)} l\\n`;\n s += \"h\\n\";\n if (cmd.fill && cmd.stroke) s += \"B\\n\";\n else if (cmd.fill) s += \"f\\n\";\n else if (cmd.stroke) s += \"S\\n\";\n break;\n }\n case \"line\": {\n if (cmd.points.length < 2) break;\n s += colorOp(cmd.stroke, \"RG\");\n const p0 = cmd.points[0]!;\n s += `${num(p0.x)} ${num(pageHeightPt - p0.y)} m\\n`;\n for (let i = 1; i < cmd.points.length; i++) {\n const p = cmd.points[i]!;\n s += `${num(p.x)} ${num(pageHeightPt - p.y)} l\\n`;\n }\n s += \"S\\n\";\n break;\n }\n case \"text\": {\n if (!cmd.text) break;\n const font = cmd.bold ? \"/F2\" : \"/F1\";\n const baselineY = pageHeightPt - (cmd.y + cmd.size * 0.8);\n s += colorOp(cmd.color, \"rg\");\n s += \"BT\\n\";\n s += `${font} ${num(cmd.size)} Tf\\n`;\n s += `${num(cmd.x)} ${num(baselineY)} Td\\n`;\n s += `(${escapePdfText(latin1Safe(cmd.text))}) Tj\\n`;\n s += \"ET\\n\";\n break;\n }\n }\n }\n s += \"Q\\n\";\n return encodeLatin1(s);\n}\n\n// Text content (operator names, numbers, parens) is pure ASCII; only the\n// Tj string literal content can contain arbitrary task-label characters,\n// which are already reduced to Latin-1 by latin1Safe()/encodeLatin1 below.\nfunction latin1Safe(s: string): string {\n let out = \"\";\n for (const ch of s) {\n const code = ch.codePointAt(0)!;\n out += code <= 255 ? ch : \"?\";\n }\n return out;\n}\n","import type { GanttRenderModel, GanttTask } from \"@ganttloom/gantt-core\";\nimport { computePagination, type PaginationOptions } from \"../paginate.js\";\nimport { buildPageContent } from \"../layout.js\";\nimport { PdfBuilder } from \"./writer.js\";\nimport { buildContentStream } from \"./content.js\";\n\nexport type PdfExportOptions = PaginationOptions;\n\n/**\n * Render a GanttRenderModel to a native PDF file, built from scratch\n * (no external PDF library). Automatically paginates large charts across\n * multiple pages per `computePagination`.\n */\nexport function renderToPDF(\n model: GanttRenderModel,\n tasks: GanttTask[],\n options: PdfExportOptions = {},\n): Uint8Array {\n const layout = computePagination(model, options);\n const pdf = new PdfBuilder();\n pdf.writeHeader();\n\n const catalogId = pdf.reserveId();\n const pagesId = pdf.reserveId();\n const helveticaId = pdf.reserveId();\n const helveticaBoldId = pdf.reserveId();\n\n pdf.addObject(helveticaId, \"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >>\");\n pdf.addObject(\n helveticaBoldId,\n \"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >>\",\n );\n\n const pageIds: number[] = [];\n\n for (const page of layout.pages) {\n const content = buildPageContent(model, tasks, layout, page);\n const streamBytes = buildContentStream(content.commands, layout.pageHeightPt);\n\n const pageId = pdf.reserveId();\n const contentId = pdf.reserveId();\n\n pdf.addStreamObject(contentId, \"\", streamBytes);\n pdf.addObject(\n pageId,\n `<< /Type /Page /Parent ${pagesId} 0 R ` +\n `/MediaBox [0 0 ${num(layout.pageWidthPt)} ${num(layout.pageHeightPt)}] ` +\n `/Resources << /Font << /F1 ${helveticaId} 0 R /F2 ${helveticaBoldId} 0 R >> >> ` +\n `/Contents ${contentId} 0 R >>`,\n );\n pageIds.push(pageId);\n }\n\n pdf.addObject(\n pagesId,\n `<< /Type /Pages /Kids [${pageIds.map((id) => `${id} 0 R`).join(\" \")}] /Count ${pageIds.length} >>`,\n );\n pdf.addObject(catalogId, `<< /Type /Catalog /Pages ${pagesId} 0 R >>`);\n\n return pdf.build(catalogId);\n}\n\nfunction num(n: number): string {\n const r = Math.round(n * 1000) / 1000;\n return Object.is(r, -0) ? \"0\" : String(r);\n}\n\nexport { computePagination } from \"../paginate.js\";\nexport type { PaginationLayout, PageBand, PageSizeName, Orientation, Margins } from \"../paginate.js\";\n"],"mappings":"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","names":["num"]}
|
package/dist/pdf.d.cts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { GanttRenderModel, GanttTask } from '@ganttloom/gantt-core';
|
|
2
|
+
import { c as PaginationOptions } from './paginate-Z2RycLzz.cjs';
|
|
3
|
+
export { M as Margins, O as Orientation, P as PageBand, a as PageSizeName, b as PaginationLayout, d as computePagination } from './paginate-Z2RycLzz.cjs';
|
|
4
|
+
|
|
5
|
+
type PdfExportOptions = PaginationOptions;
|
|
6
|
+
/**
|
|
7
|
+
* Render a GanttRenderModel to a native PDF file, built from scratch
|
|
8
|
+
* (no external PDF library). Automatically paginates large charts across
|
|
9
|
+
* multiple pages per `computePagination`.
|
|
10
|
+
*/
|
|
11
|
+
declare function renderToPDF(model: GanttRenderModel, tasks: GanttTask[], options?: PdfExportOptions): Uint8Array;
|
|
12
|
+
|
|
13
|
+
export { type PdfExportOptions, renderToPDF };
|
package/dist/pdf.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { GanttRenderModel, GanttTask } from '@ganttloom/gantt-core';
|
|
2
|
+
import { c as PaginationOptions } from './paginate-Z2RycLzz.js';
|
|
3
|
+
export { M as Margins, O as Orientation, P as PageBand, a as PageSizeName, b as PaginationLayout, d as computePagination } from './paginate-Z2RycLzz.js';
|
|
4
|
+
|
|
5
|
+
type PdfExportOptions = PaginationOptions;
|
|
6
|
+
/**
|
|
7
|
+
* Render a GanttRenderModel to a native PDF file, built from scratch
|
|
8
|
+
* (no external PDF library). Automatically paginates large charts across
|
|
9
|
+
* multiple pages per `computePagination`.
|
|
10
|
+
*/
|
|
11
|
+
declare function renderToPDF(model: GanttRenderModel, tasks: GanttTask[], options?: PdfExportOptions): Uint8Array;
|
|
12
|
+
|
|
13
|
+
export { type PdfExportOptions, renderToPDF };
|
package/dist/pdf.js
ADDED
package/dist/pdf.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|