adv / Document-Editor--master /client /src /paginationEngine.ts
Ericsonv12's picture
Upload 36 files
9e7159f verified
Raw
History Blame Contribute Delete
2.1 kB
import { PAGE_CONFIG, ContentBlock, Page, Line } from './types';
import { TextMeasurer } from './textMeasurer';
export class PaginationEngine {
private measurer: TextMeasurer;
constructor() {
this.measurer = new TextMeasurer();
}
private getContentWidth(): number {
return PAGE_CONFIG.width - PAGE_CONFIG.marginLeft - PAGE_CONFIG.marginRight;
}
private getContentHeight(): number {
return PAGE_CONFIG.height - PAGE_CONFIG.marginTop - PAGE_CONFIG.marginBottom;
}
paginate(blocks: ContentBlock[]): Page[] {
const pages: Page[] = [];
let currentPage: Page = { pageNumber: 1, lines: [] };
let currentY = PAGE_CONFIG.marginTop;
for (const block of blocks) {
// Handle completely empty blocks
if (block.text.length === 0) {
const lineHeight = PAGE_CONFIG.lineHeight;
if (currentY + lineHeight > PAGE_CONFIG.height - PAGE_CONFIG.marginBottom) {
pages.push(currentPage);
currentPage = { pageNumber: pages.length + 1, lines: [] };
currentY = PAGE_CONFIG.marginTop;
}
currentPage.lines.push({
text: '',
y: currentY,
blockId: block.id
});
currentY += lineHeight;
continue;
}
// Break text into lines (preserving whitespace)
const lines = this.measurer.breakIntoLines(
block.text,
this.getContentWidth()
);
for (const lineText of lines) {
const lineHeight = PAGE_CONFIG.lineHeight;
// Check if line fits on current page
if (currentY + lineHeight > PAGE_CONFIG.height - PAGE_CONFIG.marginBottom) {
pages.push(currentPage);
currentPage = { pageNumber: pages.length + 1, lines: [] };
currentY = PAGE_CONFIG.marginTop;
}
currentPage.lines.push({
text: lineText,
y: currentY,
blockId: block.id
});
currentY += lineHeight;
}
}
// Push last page
if (currentPage.lines.length > 0) {
pages.push(currentPage);
}
return pages;
}
}