@paprize/core 0.0.5 → 0.0.7

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.
@@ -1 +1 @@
1
- {"version":3,"file":"paprize-core.umd.cjs","sources":["../src/constants.ts","../src/debugUtilities/debugMode.ts","../src/paginate/domUtilities.ts","../src/paginate/attributes.ts","../src/paginate/PaginationConfig.ts","../../../node_modules/loglevel/lib/loglevel.js","../src/logger.ts","../src/paginate/PaginationPlugin.ts","../src/paginate/PageNodes.ts","../src/paginate/DomState.ts","../src/paginate/Transaction.ts","../src/paginate/PageManager.ts","../src/paginate/SplitResult.ts","../src/paginate/paginateElement.ts","../src/paginate/paginateText.ts","../src/paginate/Paginator.ts","../src/report/EventDispatcher.ts","../src/report/pageConst.ts","../src/report/utils.ts","../src/report/reportStyles.ts","../src/report/sectionComponents.ts","../src/plugins/PageBreakPlugin.ts","../src/plugins/TablePlugin.ts","../src/plugins/defaultPlugins.ts","../src/plugins/debugPlugin.ts","../src/plugins/SectionTocPlugin.ts","../src/window.ts","../src/report/PromiseTracker.ts","../src/report/ReportBuilder.ts","../src/debugUtilities/loremIpsum.ts","../src/utils.ts"],"sourcesContent":["export const loggerName = 'paprize';\nexport const tempContainerClassName = 'pz-temp-container';\n\nexport const currentElementClassName = 'pz-current-element';\nexport const currentTextClassName = 'pz-current-text';\n\nexport const ignoredElementClassName = 'pz-ignored-element';\nexport const ignoredTextClassName = 'pz-ignored-text';\n\nexport const globalStyleId = 'paprize-global-style';\nexport const pageClassName = 'pz-page';\nexport const sectionClassName = 'pz-section';\nexport const previewClassName = 'pz-preview';\n\nexport const attributePrefix = 'data-pz-';\n","let debugMode = false;\n\nexport const enableDebugMode = () => {\n debugMode = true;\n};\n\nexport const isDebugMode = () => debugMode;\n","export function isElement(node: Node): node is Element {\n return node.nodeType === Node.ELEMENT_NODE;\n}\n\nexport function isTextNode(node: Node): node is Text {\n return node.nodeType === Node.TEXT_NODE;\n}\n\nexport function getVisibleHeight(element: Element): number {\n const rect = element.getBoundingClientRect();\n const computedStyle = getComputedStyle(element);\n\n const marginTop = parseFloat(computedStyle.marginTop) || 0;\n const marginBottom = parseFloat(computedStyle.marginBottom) || 0;\n\n return rect.height + marginTop + marginBottom;\n}\n\nexport function moveOffscreen(element: HTMLDivElement): void {\n element.style.visibility = 'hidden';\n element.style.position = 'absolute';\n element.style.left = '-9999px';\n element.style.top = '-9999px';\n}\n","import { attributePrefix } from '../constants';\n\nexport class AttributeValueDef<T> {\n public name: string;\n public defaultValue: T;\n\n private _reader: (value: string) => T;\n\n constructor(name: string, reader: (value: string) => T, defaultValue: T) {\n this.name = name;\n this._reader = reader;\n this.defaultValue = defaultValue;\n }\n\n public read(value: string): T {\n return this._reader(value);\n }\n\n public static createStr(\n name: string,\n defaultValue: string\n ): AttributeValueDef<string> {\n return new AttributeValueDef(name, (value) => value, defaultValue);\n }\n public static createBool(\n name: string,\n defaultValue: boolean\n ): AttributeValueDef<boolean> {\n return new AttributeValueDef(\n name,\n (value) => value === 'true',\n defaultValue\n );\n }\n}\n\nconst AttributeDef = {\n hyphen: AttributeValueDef.createStr('hyphen', '-'),\n keepOnSamePage: AttributeValueDef.createBool('keep-on-same-page', false),\n hyphenationEnabled: AttributeValueDef.createBool(\n 'hyphenation-enabled',\n true\n ),\n};\n\ntype AttributeKey = keyof typeof AttributeDef;\ntype AttributeValue<K extends AttributeKey> =\n (typeof AttributeDef)[K] extends AttributeValueDef<infer R> ? R : never;\n\nexport type ConfigAttribute = {\n [K in AttributeKey]?: AttributeValue<K>;\n};\n\nexport function configToAttributes(\n config: ConfigAttribute\n): Record<string, string> {\n const map: Record<string, string> = {};\n for (const key in config) {\n const value = config[key as AttributeKey];\n if (value !== undefined) {\n const def = AttributeDef[key as AttributeKey];\n map[`${attributePrefix}${def.name}`] = String(value);\n }\n }\n return map;\n}\n\nexport const defaultConfigAttribute: Required<ConfigAttribute> =\n Object.fromEntries(\n Object.entries(AttributeDef).map(([key, configValue]) => [\n key,\n configValue.defaultValue,\n ])\n ) as Required<ConfigAttribute>;\n\nconst attributeCache = new WeakMap<Node, ConfigAttribute>();\n\nexport function getNodeConfigAttribute(node: Node | null): ConfigAttribute {\n if (!node) {\n return {};\n }\n\n if (!(node instanceof Element)) {\n return getNodeConfigAttribute(node?.parentNode);\n }\n\n const attributes: Record<string, unknown> = {};\n for (const key in AttributeDef) {\n const valueDef = AttributeDef[key as AttributeKey];\n const attrName = `${attributePrefix}${valueDef.name}`;\n const value = node.getAttribute(attrName);\n if (value !== null) {\n attributes[key] = valueDef.read(value);\n }\n }\n\n // each node inherits attributes from its ancestors\n // since the DOM tree is traversed from top to bottom,\n // the parent attributes have already been read.\n const parentAttributes = node.parentNode\n ? attributeCache.get(node.parentNode)\n : undefined;\n\n const result = { ...parentAttributes, ...attributes };\n attributeCache.set(node, result);\n\n return result;\n}\n","import type { PaginationPlugin } from './PaginationPlugin';\nimport {\n getNodeConfigAttribute,\n defaultConfigAttribute,\n type ConfigAttribute,\n} from './attributes';\n\nexport type PaginationConfig = Required<ConfigAttribute> & {\n id: string;\n plugins: PaginationPlugin[];\n};\n\nexport const defaultConfig: PaginationConfig = {\n id: 'default',\n plugins: [],\n ...defaultConfigAttribute,\n};\n\nexport function getConfigFromAttributes(\n node: Node | null,\n globalConfig?: PaginationConfig\n): PaginationConfig {\n const attributes = getNodeConfigAttribute(node);\n\n return { ...defaultConfig, ...globalConfig, ...attributes };\n}\n","/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n var _loggersByName = {};\n var defaultLogger = null;\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods() {\n /*jshint validthis:true */\n var level = this.getLevel();\n\n // Replace the actual methods.\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, this.name);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n\n // Return any important warnings.\n if (typeof console === undefinedType && level < this.levels.SILENT) {\n return \"No console available for logging\";\n }\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, _level, _loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, factory) {\n // Private instance variables.\n var self = this;\n /**\n * The level inherited from a parent logger (or a global default). We\n * cache this here rather than delegating to the parent so that it stays\n * in sync with the actual logging methods that we have installed (the\n * parent could change levels but we might not have rebuilt the loggers\n * in this child yet).\n * @type {number}\n */\n var inheritedLevel;\n /**\n * The default level for this logger, if any. If set, this overrides\n * `inheritedLevel`.\n * @type {number|null}\n */\n var defaultLevel;\n /**\n * A user-specific level for this logger. If set, this overrides\n * `defaultLevel`.\n * @type {number|null}\n */\n var userLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var cookieName = encodeURIComponent(storageKey);\n var location = cookie.indexOf(cookieName + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(\n cookie.slice(location + cookieName.length + 1)\n )[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n function normalizeLevel(input) {\n var level = input;\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n return level;\n } else {\n throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n }\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n if (userLevel != null) {\n return userLevel;\n } else if (defaultLevel != null) {\n return defaultLevel;\n } else {\n return inheritedLevel;\n }\n };\n\n self.setLevel = function (level, persist) {\n userLevel = normalizeLevel(level);\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(userLevel);\n }\n\n // NOTE: in v2, this should call rebuild(), which updates children.\n return replaceLoggingMethods.call(self);\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = normalizeLevel(level);\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n userLevel = null;\n clearPersistedLevel();\n replaceLoggingMethods.call(self);\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n self.rebuild = function () {\n if (defaultLogger !== self) {\n inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n }\n replaceLoggingMethods.call(self);\n\n if (defaultLogger === self) {\n for (var childName in _loggersByName) {\n _loggersByName[childName].rebuild();\n }\n }\n };\n\n // Initialize all the internal levels.\n inheritedLevel = normalizeLevel(\n defaultLogger ? defaultLogger.getLevel() : \"WARN\"\n );\n var initialLevel = getPersistedLevel();\n if (initialLevel != null) {\n userLevel = normalizeLevel(initialLevel);\n }\n replaceLoggingMethods.call(self);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n defaultLogger = new Logger();\n\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name,\n defaultLogger.methodFactory\n );\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n","import loglevel from 'loglevel';\nimport { loggerName } from './constants';\n\nconst logger = loglevel.getLogger(loggerName);\nlogger.setDefaultLevel('info');\n\nexport default logger;\n","import type { PageManager } from './PageManager';\nimport type { PageElement, PageText } from './PageNodes';\nimport type { SplitResult } from './SplitResult';\nimport logger from '../logger';\nimport type { DomState } from './DomState';\n\nconst logPrefix = '\\x1b[46mPLUGIN\\x1b[0m';\n\nexport interface VisitContext {\n result?: SplitResult;\n}\n\nexport interface PaginationPlugin {\n readonly name: string;\n readonly order: number;\n onVisitText?: (\n id: string,\n domState: DomState & { currentNode: PageText },\n pageManager: PageManager,\n context: VisitContext\n ) => void;\n onVisitElement?: (\n id: string,\n domState: DomState & { currentNode: PageElement },\n pageManager: PageManager,\n context: VisitContext\n ) => void;\n afterVisitNode?: (\n id: string,\n result: SplitResult,\n domState: DomState,\n pageManager: PageManager\n ) => void;\n onNewPage?: (id: string, pageManager: PageManager) => void;\n onClone?: (id: string, source: Element, cloned: PageElement) => void;\n}\n\ntype PluginKeys = {\n [K in keyof PaginationPlugin]: PaginationPlugin[K] extends\n | ((...args: never[]) => unknown)\n | undefined\n ? K\n : never;\n}[keyof PaginationPlugin];\n\ntype PluginHookNames = NonNullable<PluginKeys>;\n\nexport function callPluginHook<T extends PluginHookNames>(\n plugins: PaginationPlugin[],\n hookName: T,\n ...args: Parameters<NonNullable<PaginationPlugin[T]>>\n): void {\n plugins\n .sort((a, b) => a.order - b.order)\n .forEach((plugin) => {\n const hook = plugin[hookName];\n if (!hook) {\n return;\n }\n\n logger.debug(\n logPrefix,\n `executing plugin ${plugin.name}:${String(hookName)} (${String()})`,\n args\n );\n\n try {\n (hook as (...args: unknown[]) => void)(...args);\n logger.debug(\n logPrefix,\n `plugin ${plugin.name}:${String(hookName)} executed`,\n args\n );\n } catch (error) {\n logger.debug(\n logPrefix,\n `plugin ${plugin.name}:${String(hookName)} failed`,\n error\n );\n }\n });\n}\n","import { getVisibleHeight, isElement, isTextNode } from './domUtilities';\nimport { type PaginationConfig } from './PaginationConfig';\nimport { callPluginHook } from './PaginationPlugin';\nimport type { Transaction } from './Transaction';\n\nexport type SafeElement = Omit<\n Element,\n 'removeChild' | 'appendChild' | 'replaceChild' | 'remove'\n>;\n\nexport type SafeText = Omit<Text, 'remove'>;\n\nexport const PageNodeType = {\n Element: 'element',\n Text: 'text',\n} as const;\n\nexport class PageElement {\n private readonly _node: Element;\n\n public config: PaginationConfig;\n\n public readonly type: 'element' = PageNodeType.Element;\n public readonly transaction: Transaction;\n public readonly clonedFrom?: PageElement;\n public readonly cloneCount: number;\n\n constructor(\n element: Element,\n transaction: Transaction,\n config: PaginationConfig,\n clonedFrom?: PageElement\n ) {\n this._node = element;\n this.transaction = transaction;\n this.config = config;\n this.clonedFrom = clonedFrom;\n this.cloneCount = clonedFrom ? clonedFrom.cloneCount + 1 : 0;\n }\n\n getOriginalNode(): Node | undefined {\n let current: PageElement | undefined = this.clonedFrom;\n while (current?.clonedFrom) {\n current = current.clonedFrom;\n }\n return current?._node;\n }\n\n appendChild(node: PageNode): void {\n if (this.transaction.isActive) {\n this.transaction.addRollbackCallback(() => {\n this._node.removeChild(node.getNode() as Node);\n });\n }\n\n this._node.appendChild(node.getNode() as Node);\n }\n\n clone(withChildren?: boolean): PageElement {\n const clonedElement = this._node.cloneNode(withChildren) as Element;\n const clonedPageElement = new PageElement(\n clonedElement,\n this.transaction,\n this.config,\n this\n );\n\n callPluginHook(\n this.config.plugins,\n 'onClone',\n this.config.id,\n this._node,\n clonedPageElement\n );\n\n return clonedPageElement;\n }\n\n getHeight(): number {\n return getVisibleHeight(this._node);\n }\n\n remove(): void {\n this.transaction.addCommitCallback(() => {\n this._node.remove();\n });\n }\n\n isEmpty(): boolean {\n return this._node.innerHTML === '';\n }\n\n getChildrenCount(): number {\n return this._node.childNodes.length;\n }\n\n getNode(): SafeElement {\n return this._node;\n }\n}\n\nexport class PageText {\n private readonly _node: Text;\n\n public readonly type: 'text' = PageNodeType.Text;\n public readonly transaction: Transaction;\n\n public config: PaginationConfig;\n\n constructor(\n text: Text,\n transaction: Transaction,\n config: PaginationConfig\n ) {\n this._node = text;\n this.transaction = transaction;\n this.config = config;\n }\n\n get textContent(): string {\n return this._node.textContent ?? '';\n }\n\n set textContent(value: string) {\n this._node.textContent = value;\n }\n\n remove(): void {\n this.transaction.addCommitCallback(() => {\n this._node.remove();\n });\n }\n\n getNode(): SafeText {\n return this._node;\n }\n}\n\nexport type PageNode = PageElement | PageText;\n\nexport function createPageNode(\n node: Element,\n transaction: Transaction,\n config: PaginationConfig\n): PageElement;\nexport function createPageNode(\n node: Text,\n transaction: Transaction,\n config: PaginationConfig\n): PageText;\nexport function createPageNode(\n node: Node,\n transaction: Transaction,\n config: PaginationConfig\n): PageNode;\nexport function createPageNode(\n node: Node,\n transaction: Transaction,\n config: PaginationConfig\n): PageNode {\n if (isTextNode(node)) {\n return new PageText(node, transaction, config);\n } else if (isElement(node)) {\n return new PageElement(node, transaction, config);\n }\n\n throw new Error('Unsupported node type');\n}\n","import {\n markCurrentNode,\n unmarkCurrentNode,\n} from '../debugUtilities/pageNodeMarker';\nimport { type PageNode, createPageNode } from './PageNodes';\nimport {\n getConfigFromAttributes,\n type PaginationConfig,\n} from './PaginationConfig';\nimport type { Transaction } from './Transaction';\nimport logger from '../logger';\n\nconst logPrefix = '\\x1b[106mDOM\\x1b[0m';\n\nexport class DomState {\n private readonly _transaction: Transaction;\n private readonly _treeWalker: TreeWalker;\n private readonly _config: PaginationConfig;\n\n private _completed: boolean = false;\n private _currentNode: PageNode | null = null;\n private _previousNode: PageNode | null = null;\n\n constructor(\n root: Element,\n transaction: Transaction,\n config: PaginationConfig\n ) {\n this._transaction = transaction;\n this._config = config;\n this._treeWalker = document.createTreeWalker(\n root,\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT\n );\n }\n\n public get completed(): boolean {\n return this._completed;\n }\n public get currentNode(): PageNode | null {\n return this._currentNode;\n }\n public get previousNode(): PageNode | null {\n return this._previousNode;\n }\n\n public goToNextNode() {\n const result = this._treeWalker.nextNode();\n if (!result) {\n this._completed = true;\n }\n\n logger.debug(logPrefix, 'moving to next node');\n\n this.setState();\n }\n\n public goToNextSiblingOrParentSibling(): { parentsTraversed: number } {\n let parentsTraversed = 0;\n\n if (this._treeWalker.nextSibling()) {\n logger.debug(logPrefix, 'moving to next sibling node');\n\n this.setState();\n return { parentsTraversed };\n }\n\n // no sibling found, traverse up the tree to find the next available node\n while (this._treeWalker.parentNode()) {\n parentsTraversed++;\n\n if (this._treeWalker.nextSibling()) {\n logger.debug(\n logPrefix,\n 'moving to parent sibling node, traversed:',\n parentsTraversed\n );\n\n this.setState();\n return { parentsTraversed };\n }\n }\n\n this._completed = true;\n return { parentsTraversed };\n }\n\n public goToFirstChildOrNextNode(): { parentsTraversed: number } {\n if (this._treeWalker.firstChild()) {\n logger.debug(logPrefix, 'moving to first child node');\n this.setState();\n return { parentsTraversed: 1 };\n }\n\n this.goToNextNode();\n return { parentsTraversed: 0 };\n }\n\n private setState() {\n this._previousNode = this._currentNode;\n this._currentNode = createPageNode(\n this._treeWalker.currentNode,\n this._transaction,\n getConfigFromAttributes(this._treeWalker.currentNode, this._config)\n );\n\n DEV: markCurrentNode(this._currentNode);\n DEV: unmarkCurrentNode(this._previousNode);\n\n logger.debug(logPrefix, 'moved to node', {\n currentNode: this._currentNode,\n previousNode: this._previousNode,\n });\n }\n}\n","export class Transaction {\n private _onRollback: (() => void)[];\n private _onCommit: (() => void)[];\n public isActive: boolean;\n\n constructor() {\n this._onRollback = [];\n this._onCommit = [];\n this.isActive = false;\n }\n\n start = () => {\n if (this.isActive) {\n throw new Error('Transaction already in progress');\n }\n this.isActive = true;\n this._onRollback = [];\n this._onCommit = [];\n };\n\n addRollbackCallback = (callback: () => void) => {\n this._onRollback.push(callback);\n };\n\n addCommitCallback = (callback: () => void) => {\n if (!this.isActive) {\n callback();\n return;\n }\n this._onCommit.push(callback);\n };\n\n rollback = () => {\n if (!this.isActive) return;\n this.isActive = false;\n this._onRollback.forEach((func) => func());\n };\n\n commit = () => {\n if (!this.isActive) return;\n this.isActive = false;\n this._onCommit.forEach((func) => func());\n };\n}\n","import {\n createPageNode,\n PageNodeType,\n type PageElement,\n type PageNode,\n type PageText,\n} from './PageNodes';\nimport { Transaction } from './Transaction';\nimport type { PageSize } from './PageSize';\nimport { unmarkCurrentNode } from '../debugUtilities/pageNodeMarker';\nimport logger from '../logger';\nimport { type PaginationConfig } from './PaginationConfig';\nimport { callPluginHook } from './PaginationPlugin';\n\nconst logPrefix = '\\x1b[102mPAGE\\x1b[0m';\n\nexport class PageState {\n public currentPage: PageElement;\n public activeElement: PageNode | null;\n public currentElement: PageElement;\n public parentStack: PageElement[];\n public pageIsFull: boolean;\n public pageIndex: number;\n public pageHeight: number;\n\n constructor(\n currentPage: PageElement,\n activeElement: PageNode | null,\n currentElement: PageElement,\n parentStack: PageElement[],\n pageIsFull: boolean,\n pageIndex: number,\n pageHeight: number\n ) {\n this.currentPage = currentPage;\n this.activeElement = activeElement;\n this.currentElement = currentElement;\n this.parentStack = parentStack;\n this.pageIsFull = pageIsFull;\n this.pageIndex = pageIndex;\n this.pageHeight = pageHeight;\n }\n\n public static create(\n currentPage: PageElement,\n parentStack: PageElement[],\n pageIndex: number,\n pageHeight: number\n ) {\n return new PageState(\n currentPage,\n null,\n currentPage,\n parentStack,\n false,\n pageIndex,\n pageHeight\n );\n }\n\n public clone = (): PageState => {\n return new PageState(\n this.currentPage,\n this.activeElement,\n this.currentElement,\n [...this.parentStack],\n this.pageIsFull,\n this.pageIndex,\n this.pageHeight\n );\n };\n}\n\nexport class PageManager {\n private _pageState: PageState;\n\n private readonly _transaction: Transaction;\n private readonly _tempContainer: Element;\n private readonly _config: PaginationConfig;\n\n public constructor(\n tempContainer: Element,\n pageSize: PageSize,\n transaction: Transaction,\n config: PaginationConfig\n ) {\n this._tempContainer = tempContainer;\n this._config = config;\n this._transaction = transaction;\n\n const pageHtmlElement = PageManager.createPageHtmlElement(\n pageSize.width\n );\n\n const page = this.createNewPage(pageHtmlElement);\n this._pageState = PageState.create(page, [], 0, pageSize.height);\n callPluginHook(this._config.plugins, 'onNewPage', config.id, this);\n }\n\n public nextPage(): void {\n const page = this.createNewPage(\n this._pageState.currentPage.getNode().cloneNode(false) as Element\n );\n\n const newPageState = PageState.create(\n page,\n [],\n this._pageState.pageIndex + 1,\n this._pageState.pageHeight\n );\n\n // add uncompleted parents elements to the new page\n this.cloneParentStackToNewPage(newPageState);\n this.cleanupEmptyParent();\n\n this._pageState = newPageState;\n callPluginHook(\n this._config.plugins,\n 'onNewPage',\n this._config.id,\n this\n );\n }\n\n private cloneParentStackToNewPage(newPageState: PageState): void {\n for (const parent of this._pageState.parentStack) {\n const clonedParent = parent.clone(false);\n newPageState.currentElement.appendChild(clonedParent);\n newPageState.currentElement = clonedParent;\n newPageState.parentStack.push(clonedParent);\n }\n }\n\n private cleanupEmptyParent(): void {\n const parentStack = [...this._pageState.parentStack];\n\n const cleanup = () => {\n // iterate backwards to check the element in order\n for (let i = parentStack.length - 1; i >= 0; i--) {\n const parent = parentStack[i];\n if (parent.isEmpty()) {\n parent.remove();\n }\n }\n };\n\n this._transaction.addCommitCallback(cleanup);\n }\n\n public enterElement(): void {\n if (\n !this._pageState.activeElement ||\n this._pageState.activeElement.type !== PageNodeType.Element\n ) {\n throw new Error('Invalid state: activeElement is not an Element');\n }\n\n logger.debug(\n logPrefix,\n 'entering an element',\n this._pageState.activeElement\n );\n this._pageState.currentElement = this._pageState.activeElement;\n this._pageState.parentStack.push(this._pageState.activeElement);\n }\n\n public leaveElement(): void {\n this._pageState.activeElement = null;\n\n // remove last parent as we are leaving it\n const popped = this._pageState.parentStack.pop();\n logger.debug(logPrefix, 'leaving a parent element', popped);\n\n // find the original parent\n const parent = this._pageState.parentStack.at(-1);\n this._pageState.currentElement = parent ?? this._pageState.currentPage;\n }\n\n private static createPageHtmlElement(pageWidth: number): Element {\n const page = document.createElement('div');\n page.style.width = `${pageWidth}px`;\n page.style.maxWidth = `${pageWidth}px`;\n\n return page;\n }\n\n private createNewPage(pageHtmlElement: Element): PageElement {\n this._tempContainer.appendChild(pageHtmlElement);\n\n if (this._transaction.isActive) {\n this._transaction.addRollbackCallback(() => {\n this._tempContainer.removeChild(pageHtmlElement);\n });\n }\n\n return createPageNode(pageHtmlElement, this._transaction, this._config);\n }\n\n public startTransaction(): { rollback: () => void; commit: () => void } {\n this._transaction.start();\n\n const state = this._pageState.clone();\n this._transaction.addRollbackCallback(() => {\n this._pageState = state;\n });\n\n return this._transaction;\n }\n\n public hasEmptySpace(elementHeight?: number): boolean {\n return (\n !this._pageState.pageIsFull &&\n this._pageState.currentPage.getHeight() +\n (elementHeight || 0.0001) <=\n this._pageState.pageHeight\n );\n }\n\n public isOverFlow(): boolean {\n return (\n this._pageState.currentPage.getHeight() > this._pageState.pageHeight\n );\n }\n\n public markPageAsFull(): void {\n this._pageState.pageIsFull = true;\n }\n\n public appendChild(node: PageElement, withChildren: boolean): PageElement {\n const clonedNode = node.clone(withChildren);\n\n DEV: unmarkCurrentNode(clonedNode);\n\n this._pageState.currentElement.appendChild(clonedNode);\n this._pageState.activeElement = clonedNode;\n\n return clonedNode;\n }\n\n public addTextNode(text: string): PageText {\n if (this._pageState.activeElement?.type === PageNodeType.Text) {\n return this._pageState.activeElement;\n }\n\n const textNode = document.createTextNode(text);\n const newTextNode = createPageNode(\n textNode,\n this._transaction,\n this._config\n );\n\n this._pageState.currentElement.appendChild(newTextNode);\n this._pageState.activeElement = newTextNode;\n\n return newTextNode;\n }\n\n public getPageState(): PageState {\n return this._pageState;\n }\n}\n","export const SplitResult = {\n None: 0, // The node fits completely on the page, no further splitting required.\n FullNodePlaced: 1, // The entire node was placed on the page, continue with the next sibling or element.\n SplitChildren: 2, // The node is too large for the page, and its children must be paginated individually.\n} as const;\n\nexport type SplitResult = (typeof SplitResult)[keyof typeof SplitResult];\n","import logger from '../logger';\nimport { type PageManager } from './PageManager';\nimport { SplitResult } from './SplitResult';\nimport type { PageElement } from './PageNodes';\n\n/**\n * Tries to split the given element across pages by first attempting to place it\n * (with its entire subtree) on the current page, then (if needed) on the next page.\n * Falls back to partial (without children) placement when allowed.\n */\nexport function paginateElementAcrossPages(\n currentNode: PageElement,\n pageManager: PageManager\n): SplitResult {\n // try on current page\n const result = tryPlaceElement(currentNode, pageManager);\n if (result !== SplitResult.None) {\n return result;\n }\n\n // try on next page (transactional)\n const { rollback, commit } = pageManager.startTransaction();\n pageManager.nextPage();\n\n const nextPageResult = tryPlaceElement(currentNode, pageManager);\n if (nextPageResult !== SplitResult.None) {\n commit();\n return nextPageResult;\n }\n\n rollback();\n logger.debug('Element is too big to fit on a page', currentNode);\n return SplitResult.None;\n}\n\n/**\n * Attempts to place the node (first with children, then without if allowed).\n * Returns the achieved SplitResult or None if not possible.\n */\nfunction tryPlaceElement(\n currentNode: PageElement,\n pageManager: PageManager\n): SplitResult {\n // fast path: try full subtree if height suggests it could fit\n if (pageManager.hasEmptySpace(currentNode.getHeight())) {\n // copy the next node and sub tree of it to the current page\n const clonedNode = pageManager.appendChild(currentNode, true);\n if (pageManager.isOverFlow()) {\n // If overflow after optimistic append, we removed it and continue to partial logic\n clonedNode.remove();\n } else {\n return SplitResult.FullNodePlaced;\n }\n }\n\n if (\n currentNode.config.keepOnSamePage ||\n currentNode.getChildrenCount() === 0\n ) {\n // cannot (or not allowed to) split from its children\n return SplitResult.None;\n }\n\n // Try placing only the element shell (children will render later)\n const clonedNode = pageManager.appendChild(currentNode, false);\n if (pageManager.isOverFlow()) {\n clonedNode.remove();\n return SplitResult.None;\n }\n\n return SplitResult.SplitChildren;\n}\n","import logger from '../logger';\nimport type { PageManager } from './PageManager';\nimport type { PageText } from './PageNodes';\nimport { SplitResult } from './SplitResult';\nimport type { PaginationConfig } from './PaginationConfig';\n\n/**\n * Splits text across pages by whole words; falls back to character splitting\n * only when a single word cannot fit on an empty page.\n *\n * Algorithm:\n * 1. Tokenize into words + whitespace (preserve spacing).\n * 2. Try appending each token to the current text node.\n * 3. On overflow: revert, try the whole token at top of a new page inside a transaction.\n * 4. If it still overflows on an empty page, rollback and split by character\n * starting in the current (previous) page\n */\nexport function paginateTextByWord(\n text: PageText,\n pageManager: PageManager\n): SplitResult {\n let splitResult: SplitResult = SplitResult.FullNodePlaced;\n\n const tokens = text.textContent\n .split(/(\\s+)/)\n .filter((token) => token !== '');\n\n let pendingToken: string | undefined;\n let tokenIndex = 0;\n\n while (pendingToken || tokenIndex < tokens.length) {\n const currentToken = pendingToken ?? tokens[tokenIndex];\n const result = processToken(currentToken, pageManager, text.config);\n\n if (!result.completed) {\n splitResult = SplitResult.None;\n }\n\n if (result.pendingToken) {\n pendingToken = result.pendingToken;\n } else {\n pendingToken = undefined;\n tokenIndex++;\n }\n }\n\n return splitResult;\n}\n\nfunction processToken(\n token: string,\n pageManager: PageManager,\n config: PaginationConfig\n): {\n completed: boolean;\n pendingToken?: string;\n} {\n if (!pageManager.hasEmptySpace()) {\n pageManager.nextPage();\n }\n const textNode = pageManager.addTextNode('');\n\n // tentatively append\n const originalContent = textNode.textContent;\n textNode.textContent += token;\n\n if (!pageManager.isOverFlow()) {\n // token fits on new page\n return {\n completed: true,\n };\n }\n\n // overflow: revert append\n textNode.textContent = originalContent;\n\n const overflowResult = handleTokenOverflow(token, pageManager, config);\n return {\n pendingToken: overflowResult.leftovers,\n completed: overflowResult.completed,\n };\n}\n\nfunction handleTokenOverflow(\n token: string,\n pageManager: PageManager,\n config: PaginationConfig\n): {\n completed: boolean;\n leftovers?: string;\n} {\n // try on a fresh page within a transaction\n const { rollback, commit } = pageManager.startTransaction();\n pageManager.nextPage();\n pageManager.addTextNode(token);\n\n if (!pageManager.isOverFlow()) {\n // token fits entirely on the new page\n commit();\n\n return {\n completed: true,\n };\n }\n\n // still doesn't fit - rollback to previous state split the token by character (hyphenation)\n rollback();\n\n if (!config.hyphenationEnabled) {\n // If hyphenation is not enabled and the token is too long, we need to skip the token\n\n logger.warn('Hyphenation disabled, skipping oversized token:', token);\n\n return {\n completed: false,\n };\n }\n\n const leftovers = hyphenation(token, config.hyphen, pageManager);\n return {\n completed: true,\n leftovers: leftovers && leftovers.length > 0 ? leftovers : undefined,\n };\n}\n\nexport function hyphenation(\n word: string,\n hyphen: string,\n pageManager: PageManager\n): string | null {\n const textNode = pageManager.addTextNode('');\n let appended = '';\n\n for (let i = 0; i < word.length; i++) {\n const char = word[i];\n\n // tentatively add the character with hyphen\n const tentative = appended + char;\n textNode.textContent = tentative + hyphen;\n\n if (!pageManager.hasEmptySpace()) {\n // overflow: revert to previous appended\n textNode.textContent = appended ? appended + hyphen : '';\n\n pageManager.markPageAsFull();\n\n // return leftover starting from the char that did not fit\n return word.slice(i);\n }\n\n appended = tentative;\n }\n\n // all characters consumed; no leftovers\n return null;\n}\n","import { DomState } from './DomState';\nimport { PageManager } from './PageManager';\nimport type { PageSize } from './PageSize';\nimport { PageElement, PageNodeType, PageText } from './PageNodes';\nimport { paginateElementAcrossPages } from './paginateElement';\nimport { paginateTextByWord } from './paginateText';\nimport { SplitResult } from './SplitResult';\nimport { Transaction } from './Transaction';\nimport logger from 'loglevel';\nimport { defaultConfig, type PaginationConfig } from './PaginationConfig';\nimport { markIgnoredNode } from '../debugUtilities/pageNodeMarker';\nimport { callPluginHook, type VisitContext } from './PaginationPlugin';\nimport { attributePrefix, tempContainerClassName } from '../constants';\nimport { isDebugMode } from '../debugUtilities/debugMode';\nimport { isElement, moveOffscreen } from './domUtilities';\n\nconst logPrefix = '\\x1b[103mPAGINATOR\\x1b[0m';\n\nexport type PaginateResult = string[];\n\nexport class Paginator {\n private readonly _domState: DomState;\n private readonly _pageManager: PageManager;\n private readonly _transaction: Transaction;\n private readonly _tempContainer: Element;\n private readonly _config: PaginationConfig;\n\n private constructor(\n root: Element,\n pageSize: PageSize,\n config?: Partial<PaginationConfig>\n ) {\n this._config = { ...defaultConfig, ...config };\n this._tempContainer = Paginator.createTempContainer(this._config.id);\n this._transaction = new Transaction();\n this._domState = new DomState(root, this._transaction, this._config);\n this._pageManager = new PageManager(\n this._tempContainer,\n pageSize,\n this._transaction,\n this._config\n );\n }\n\n private static createTempContainer(id: string): Element {\n const tempContainer = document.createElement('div');\n tempContainer.style.display = 'flex'; // to avoid margin collapsing between pages\n tempContainer.style.flexDirection = 'column';\n tempContainer.style.gap = '20px';\n tempContainer.setAttribute(`${attributePrefix}-section-id`, id);\n\n tempContainer.classList.add(tempContainerClassName);\n DEV: if (!isDebugMode()) {\n moveOffscreen(tempContainer);\n }\n document.body.appendChild(tempContainer);\n return tempContainer;\n }\n\n public static paginate(\n root: Element,\n pageSize: PageSize,\n config?: Partial<PaginationConfig>\n ): PaginateResult {\n const paginator = new Paginator(root, pageSize, config);\n paginator.processAllNodes();\n\n const result = Array.from(paginator._tempContainer.childNodes)\n .filter((x) => isElement(x))\n .map((x) => x.innerHTML);\n\n DEV: if (!isDebugMode()) {\n paginator._tempContainer.remove();\n }\n\n return result;\n }\n\n private processAllNodes(): void {\n this._domState.goToNextNode();\n\n do {\n logger.debug(\n logPrefix,\n 'paginating node',\n this._domState.currentNode\n );\n const result = this.processCurrentNode();\n\n callPluginHook(\n this._config.plugins,\n 'afterVisitNode',\n this._config.id,\n result,\n this._domState,\n this._pageManager\n );\n\n switch (result) {\n case SplitResult.None:\n this.handleNodeSkipped();\n break;\n\n case SplitResult.FullNodePlaced:\n this.handleFullNodePlaced();\n break;\n\n case SplitResult.SplitChildren:\n this.handleChildrenSplit();\n break;\n }\n } while (this._domState.completed === false);\n\n logger.debug(logPrefix, 'pagination completed');\n }\n\n private handleNodeSkipped(): void {\n logger.debug(logPrefix, \"node skipped - couldn't paginate\");\n\n DEV: markIgnoredNode(this._domState.currentNode);\n this._domState.goToNextNode();\n }\n\n private handleFullNodePlaced(): void {\n logger.debug(logPrefix, 'node fully paginated');\n\n const { parentsTraversed } =\n this._domState.goToNextSiblingOrParentSibling();\n for (let i = 0; i < parentsTraversed; i++) {\n this._pageManager.leaveElement();\n }\n }\n\n private handleChildrenSplit(): void {\n logger.debug(\n logPrefix,\n 'node partially paginated - splitting children'\n );\n\n if (\n this._domState.goToFirstChildOrNextNode().parentsTraversed === 1 &&\n this._domState.previousNode?.type === PageNodeType.Element\n ) {\n this._pageManager.enterElement();\n }\n }\n\n private processCurrentNode(): SplitResult {\n if (!this._domState.currentNode) {\n return SplitResult.None;\n }\n\n if (this._domState.currentNode.type === PageNodeType.Element) {\n // call plugins ...\n const ctx: VisitContext = {};\n callPluginHook(\n this._config.plugins,\n 'onVisitElement',\n this._config.id,\n this._domState as DomState & { currentNode: PageElement },\n this._pageManager,\n ctx\n );\n if (ctx.result !== undefined) {\n return ctx.result;\n }\n // ... plugins called\n\n return paginateElementAcrossPages(\n this._domState.currentNode,\n this._pageManager\n );\n } else {\n // call plugins ...\n const ctx: VisitContext = {};\n callPluginHook(\n this._config.plugins,\n 'onVisitText',\n this._config.id,\n this._domState as DomState & { currentNode: PageText },\n this._pageManager,\n ctx\n );\n if (ctx.result !== undefined) {\n return ctx.result;\n }\n // ... plugins called\n\n return paginateTextByWord(\n this._domState.currentNode,\n this._pageManager\n );\n }\n }\n}\n","type EventHandler<TKey extends keyof TEvents, TEvents> = TEvents[TKey] extends (\n ...args: infer TArgs\n) => infer TReturn\n ? (...args: TArgs) => TReturn\n : never;\n\nexport class EventDispatcher<TEvents> {\n private registry = new Map<\n keyof TEvents,\n Set<(...args: unknown[]) => void>\n >();\n\n public addEventListener<T extends keyof TEvents>(\n name: T,\n handler: EventHandler<T, TEvents>\n ) {\n const { registry } = this;\n const listeners = new Set(registry.get(name));\n\n listeners.add(handler);\n registry.set(name, listeners);\n\n return () => this.removeEventListener(name, handler);\n }\n\n public removeEventListener<T extends keyof TEvents>(\n name: T,\n handler: EventHandler<T, TEvents>\n ) {\n const { registry } = this;\n const listeners = new Set(registry.get(name));\n\n listeners.delete(handler);\n registry.set(name, listeners);\n }\n\n public dispatch<T extends keyof TEvents>(\n name: T,\n ...args: Parameters<EventHandler<T, TEvents>>\n ) {\n const { registry } = this;\n const listeners = registry.get(name);\n\n if (!listeners) {\n return;\n }\n\n for (const listener of listeners) {\n listener(...args);\n }\n }\n}\n\nexport type Monitor<TEvents> = Omit<EventDispatcher<TEvents>, 'dispatch'>;\n","import type { PageDimension, PageMargin } from './pageTypes';\n\nconst _pageSize = {\n A1: { height: '841mm', width: '594mm' },\n A2: { height: '594mm', width: '420mm' },\n A3: { height: '420mm', width: '297mm' },\n A4: { height: '297mm', width: '210mm' },\n A5: { height: '210mm', width: '148mm' },\n A6: { height: '148mm', width: '105mm' },\n B3: { height: '500mm', width: '353mm' },\n B4: { height: '353mm', width: '250mm' },\n B5: { height: '250mm', width: '176mm' },\n Letter: { height: '8.5in', width: '11in' },\n Legal: { height: '11in', width: '8.5in' },\n Tabloid: { height: '11in', width: '17in' },\n};\n\nconst _pageMargin = {\n Normal: { top: '1in', right: '1in', bottom: '1in', left: '1in' },\n Narrow: { top: '0.4in', right: '0.6in', bottom: '0.6in', left: '0.6in' },\n Wide: { top: '0.5in', right: '2in', bottom: '0.5in', left: '2in' },\n None: { top: '0in', right: '0in', bottom: '0in', left: '0in' },\n};\n\nexport const pageSize = _pageSize as Record<\n keyof typeof _pageSize,\n PageDimension\n>;\n\nexport const pageMargin = _pageMargin as Record<\n keyof typeof _pageMargin,\n PageMargin\n>;\n","import { getVisibleHeight } from '../paginate/domUtilities';\nimport type { PaginationPlugin } from '../paginate/PaginationPlugin';\nimport type { PageMargin } from './pageTypes';\n\nexport function getVisibleSize(element: Element) {\n const rect = element.getBoundingClientRect();\n const computedStyle = getComputedStyle(element);\n\n const marginLeft = parseFloat(computedStyle.marginLeft) || 0;\n const marginRight = parseFloat(computedStyle.marginRight) || 0;\n\n return {\n height: getVisibleHeight(element),\n width: rect.width + marginLeft + marginRight,\n };\n}\n\nexport function calculatePageDimensions(\n current: HTMLElement,\n sectionHeader: HTMLElement | null,\n sectionFooter: HTMLElement | null\n): {\n height: number;\n width: number;\n sectionHeaderHeight: number;\n sectionFooterHeight: number;\n} {\n const { height, width } = getVisibleSize(current);\n const sectionHeaderHeight = sectionHeader\n ? getVisibleHeight(sectionHeader)\n : 0;\n const sectionFooterHeight = sectionFooter\n ? getVisibleHeight(sectionFooter)\n : 0;\n\n return { height, width, sectionHeaderHeight, sectionFooterHeight };\n}\n\nexport function createSectionPageHeightPlugin(\n height: number,\n sectionHeaderHeight: number,\n sectionFooterHeight: number\n): PaginationPlugin {\n return {\n name: 'sectionPageHeight',\n order: 1,\n afterVisitNode: (_id, _result, domState, pageManager) => {\n const lastPage = domState.completed;\n if (!lastPage || sectionFooterHeight <= 0) return;\n\n // if there is no empty space for the section footer, create a new page for it\n if (!pageManager.hasEmptySpace(sectionFooterHeight)) {\n pageManager.nextPage();\n }\n },\n onNewPage: (_, pageManager) => {\n const pageState = pageManager.getPageState();\n if (pageState.pageIndex === 0) {\n pageState.pageHeight = height + sectionFooterHeight; // reserve sectionHeaderHeight\n } else {\n pageState.pageHeight =\n height + sectionHeaderHeight + sectionFooterHeight;\n }\n },\n };\n}\n\nexport function shorthand(margin?: PageMargin) {\n return margin\n ? `${margin.top} ${margin.right} ${margin.bottom} ${margin.left}`\n : '0';\n}\n","import type * as CSS from 'csstype';\nimport {\n pageClassName,\n previewClassName,\n sectionClassName,\n} from '../constants';\nimport type { PageDimension, PageMargin } from './pageTypes';\nimport { shorthand } from './utils';\n\nexport const globalStyle = `\n html {\n box-sizing: border-box;\n }\n\n *,\n *:before,\n *:after {\n box-sizing: inherit;\n }\n\n :root {\n --paprize-page-background-color: #ffffff;\n --paprize-page-margin-bottom: 10px;\n --paprize-page-box-shadow: rgb(142 138 138) -1px 3px 5px 2px;\n --paprize-section-margin-bottom: 10px;\n --paprize-preview-background-color: rgb(218 220 224);\n --paprize-preview-padding: 30px 10px;\n }\n\n body {\n margin: 0;\n }\n \n @media screen {\n .${previewClassName} {\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n background-color: var(--paprize-preview-background-color);\n padding: var(--paprize-preview-padding);\n }\n\n .${pageClassName} {\n box-shadow: var(--paprize-page-box-shadow);\n margin-bottom: var(--paprize-page-margin-bottom);\n background-color: var(--paprize-page-background-color);\n }\n\n .${sectionClassName} {\n margin-bottom: var(--paprize-section-margin-bottom);\n }\n }\n\n @media print {\n html:has(.${previewClassName}) *:not(.${previewClassName}):not(.${previewClassName} *):not(:has(.${previewClassName})) {\n display: none !important;\n }\n } \n `;\n\nexport type CSSProperties = CSS.Properties<string | number>;\n\nconst component: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n};\n\nconst outOfScreen: CSSProperties = {\n position: 'absolute',\n left: '-9999px',\n top: '-9999px',\n visibility: 'hidden',\n};\n\nconst page = (\n pageDimension: PageDimension,\n pageMargin: PageMargin\n): CSSProperties => ({\n display: 'flex',\n flexDirection: 'column',\n width: pageDimension.width,\n height: pageDimension.height,\n maxHeight: pageDimension.height,\n position: 'relative',\n padding: shorthand(pageMargin),\n zIndex: '1',\n});\n\nconst pageContent: CSSProperties = {\n overflow: 'hidden',\n width: '100%',\n height: '100%',\n};\n\nconst overlay: CSSProperties = {\n position: 'absolute',\n width: '100%',\n height: '100%',\n left: 0,\n top: 0,\n};\n\nconst section = (sectionId: string): CSSProperties => ({\n page: `section-${sectionId}`,\n});\n\nfunction sectionPageMedia(sectionId: string, dimension: PageDimension): string {\n return `@page section-${sectionId} {\n margin: none; \n size:${dimension.width} ${dimension.height}; \n width:${dimension.width};\n height:${dimension.height};\n }`;\n}\n\nexport const reportStyles = {\n globalStyle,\n component,\n outOfScreen,\n page,\n overlay,\n pageContent,\n sectionPageMedia,\n section,\n};\n","export interface SectionComponents {\n sectionHeader: HTMLElement | null;\n sectionFooter: HTMLElement | null;\n pageHeader: HTMLElement | null;\n pageFooter: HTMLElement | null;\n pageContent: HTMLElement;\n}\n\nfunction cloneElement<T extends HTMLElement | null>(element?: T): T {\n return (element?.cloneNode(true) ?? null) as T;\n}\n\nexport function cloneComponents(\n components: SectionComponents\n): SectionComponents {\n return {\n sectionHeader: cloneElement(components.sectionHeader),\n sectionFooter: cloneElement(components.sectionFooter),\n pageHeader: cloneElement(components.pageHeader),\n pageFooter: cloneElement(components.pageFooter),\n pageContent: cloneElement(components.pageContent),\n };\n}\n","import type { DomState } from '../paginate/DomState';\nimport type { PageManager } from '../paginate/PageManager';\nimport type { PageElement } from '../paginate/PageNodes';\nimport type {\n PaginationPlugin,\n VisitContext,\n} from '../paginate/PaginationPlugin';\nimport { SplitResult } from '../paginate/SplitResult';\n\nexport const pageBreakAttributeName = 'data-pz-page-break';\n\nexport class PageBreakPlugin implements PaginationPlugin {\n public name = 'pageBreak';\n public order = 1;\n\n onVisitElement = (\n _id: string,\n domState: DomState & { currentNode: PageElement },\n pageManager: PageManager,\n context: VisitContext\n ) => {\n if (\n domState.currentNode\n .getNode()\n .getAttribute(pageBreakAttributeName) === 'true'\n ) {\n pageManager.markPageAsFull();\n\n // ignore the page break node itself\n context.result = SplitResult.FullNodePlaced;\n }\n };\n}\n","import type { PageManager } from '../paginate/PageManager';\nimport {\n createPageNode,\n PageElement,\n type SafeElement,\n} from '../paginate/PageNodes';\nimport type { PaginationPlugin } from '../paginate/PaginationPlugin';\n\nexport interface TablePluginOptions {\n /**\n * If true, the table header (thead) will be cloned on each page.\n */\n cloneHeader?: boolean;\n /**\n * If true, the table footer (tfoot) will be cloned on each page.\n */\n cloneFooter?: boolean;\n /**\n * When true, tables containing only a header (no body rows) will not be removed.\n */\n includeHeaderOnlyTables?: boolean;\n}\n\nexport class TablePlugin implements PaginationPlugin {\n private readonly _options: TablePluginOptions = {};\n\n public name = 'table';\n public order = 1;\n\n constructor(options: TablePluginOptions = {}) {\n this._options = options;\n }\n\n onNewPage = (_id: string, pageManager: PageManager) => {\n if (this._options.includeHeaderOnlyTables) {\n return;\n }\n\n const pageState = pageManager.getPageState();\n const tableElement = pageState.parentStack.find((node) =>\n this._isTable(node.getNode())\n );\n if (!tableElement || !tableElement.clonedFrom) {\n return;\n }\n\n // need to check previous page elements, so have to use clonedFrom\n const openTable = tableElement.clonedFrom;\n const openTableNode = openTable.getNode() as HTMLTableElement;\n\n const header = openTableNode.tHead;\n const hasHeader = header !== null;\n if (!hasHeader) {\n return;\n }\n\n const body = openTableNode.tBodies;\n if (!this._isTableBodyEmpty(body)) {\n return;\n }\n\n openTable.remove();\n\n const newTable = tableElement.getNode() as HTMLTableElement;\n if (newTable.tHead === null) {\n const headerNode = createPageNode(\n header.cloneNode(true),\n tableElement.transaction,\n tableElement.config\n );\n tableElement.appendChild(headerNode);\n }\n };\n\n onClone = (_id: string, source: Element, cloned: PageElement) => {\n if (source.tagName === 'TR') {\n cloned.config.keepOnSamePage = true;\n return;\n }\n\n if (\n !this._isTable(source) ||\n !cloned.clonedFrom ||\n cloned.cloneCount === 1\n ) {\n return;\n }\n\n const originalNode = cloned.getOriginalNode() as HTMLTableElement;\n const head = originalNode.tHead;\n if (head && this._options.cloneHeader === true) {\n const clonedHead = new PageElement(\n head.cloneNode(true) as HTMLElement,\n cloned.transaction,\n cloned.config\n );\n cloned.appendChild(clonedHead);\n }\n\n const foot = originalNode.tFoot;\n if (foot && this._options.cloneFooter === true) {\n const clonedFoot = new PageElement(\n foot.cloneNode(true) as HTMLElement,\n cloned.transaction,\n cloned.config\n );\n cloned.appendChild(clonedFoot);\n }\n };\n\n private _isTable(\n element: Element | SafeElement\n ): element is HTMLTableElement {\n return element.tagName === 'TABLE';\n }\n\n private _isTableBodyEmpty(\n body: HTMLCollectionOf<HTMLTableSectionElement>\n ): boolean {\n if (body.length === 0) return true;\n\n const tbody = body[0];\n if (tbody.rows.length !== 1) return false;\n\n const row = tbody.rows[0];\n if (row.cells.length !== 1) return false;\n\n const cell = row.cells[0];\n return cell.textContent.trim() === '';\n }\n}\n","import type { PaginationPlugin } from '../paginate/PaginationPlugin';\nimport { PageBreakPlugin } from './PageBreakPlugin';\nimport { TablePlugin } from './TablePlugin';\n\nexport const defaultPlugins: PaginationPlugin[] = [\n new PageBreakPlugin(),\n new TablePlugin(),\n];\n","import { attributePrefix, pageClassName } from '../constants';\nimport type { PaginationPlugin } from '../paginate/PaginationPlugin';\n\nexport const debugPlugin: PaginationPlugin = {\n name: 'debug',\n order: Number.MAX_SAFE_INTEGER,\n onNewPage: (_, pageManager) => {\n const page = pageManager.getPageState().currentPage.getNode();\n\n if (!page.classList.contains(pageClassName)) {\n page.classList.add(pageClassName);\n }\n\n page.setAttribute(`${attributePrefix}-element`, 'page');\n page.setAttribute(\n `${attributePrefix}-height`,\n pageManager.getPageState().pageHeight.toString()\n );\n },\n};\n","import type { DomState } from '../paginate/DomState';\nimport type { PageManager } from '../paginate/PageManager';\nimport type { PageElement, SafeElement } from '../paginate/PageNodes';\nimport type { PaginationPlugin } from '../paginate/PaginationPlugin';\n\nexport const sectionTocName = 'sectionToc';\n\nexport type SectionTocState = {\n sectionId: string;\n pageIndex: number;\n title: string;\n level: number;\n};\n\nexport class SectionTocPlugin implements PaginationPlugin {\n public readonly name = sectionTocName;\n public readonly order = 1;\n\n private _state: Map<string, SectionTocState[]> = new Map();\n\n public getContentList = (): SectionTocState[] => {\n return Array.from(this._state.values()).flat();\n };\n\n public onVisitElement = (\n id: string,\n domState: DomState & { currentNode: PageElement },\n pageManager: PageManager\n ) => {\n {\n const node = domState.currentNode.getNode();\n const headingLevel = this.getHeadingLevel(node);\n\n if (!headingLevel || !node.textContent) return;\n\n const pageIndex = pageManager.getPageState().pageIndex;\n\n // cleanup state for first page of section\n if (pageIndex === 0) {\n this._state.set(id, []);\n }\n\n this._state.get(id)?.push({\n sectionId: id,\n pageIndex: pageIndex,\n title: node.textContent,\n level: headingLevel,\n });\n }\n };\n\n getHeadingLevel(node: SafeElement): number | null {\n const tagName = node.tagName;\n return /^H[1-6]$/.test(tagName)\n ? parseInt(tagName.charAt(1), 10)\n : null;\n }\n}\n","export const paprize_isInitialized = '__PAPRIZE_IS_INITIALIZED';\nexport const paprize_isReady = '__PAPRIZE_IS_READY';\nexport const paprize_readJsonDataFile = '__PAPRIZE_READ_JSON_DATA_FILE';\n\ndeclare global {\n interface Window {\n [paprize_isInitialized]?: boolean;\n [paprize_isReady]?: boolean;\n [paprize_readJsonDataFile]?: () => Promise<string>;\n }\n}\n","import { EventDispatcher } from './EventDispatcher';\n\ntype PromiseStatus = 'pending' | 'resolved' | 'rejected';\n\ninterface TrackedPromise {\n promise: Promise<unknown>;\n status: PromiseStatus;\n}\n\nexport interface PromiseTrackerEvents {\n onChange: (pendingCount: number) => void;\n}\n\nexport class PromiseTracker {\n private readonly _promises: TrackedPromise[];\n\n public readonly monitor: EventDispatcher<PromiseTrackerEvents>;\n\n public get promise(): Promise<void> {\n return this._promises.length > 0\n ? Promise.allSettled(this._promises.map((p) => p.promise)).then(\n () => {}\n )\n : Promise.resolve();\n }\n\n public constructor() {\n this._promises = [];\n this.monitor = new EventDispatcher<PromiseTrackerEvents>();\n }\n\n public async add(promises: Promise<unknown>[] = []) {\n this._promises.push(...promises.map(PromiseTracker.toTracked));\n\n // let all microtask queue flush by queuing a macrotask\n await new Promise((resolve) => setTimeout(resolve, 0));\n\n if (this.getPending().length === 0) {\n this.monitor.dispatch('onChange', 0);\n return;\n }\n\n this._promises.forEach((p) => this.injectEvents(p));\n }\n\n private static toTracked(promise: Promise<unknown>): TrackedPromise {\n const tracked: TrackedPromise = {\n promise,\n status: 'pending',\n };\n\n tracked.promise.finally(() => {\n tracked.status = 'resolved';\n });\n\n return tracked;\n }\n\n private async injectEvents(tracked: TrackedPromise) {\n tracked.promise.finally(() => {\n const pending = this.getPending();\n this.monitor.dispatch('onChange', pending.length);\n });\n }\n\n public getPending(): TrackedPromise[] {\n return Array.from(this._promises.values()).filter(\n (p) => p.status === 'pending'\n );\n }\n}\n","import { isDebugMode } from '../debugUtilities/debugMode';\nimport { Paginator } from '../paginate/Paginator';\nimport { defaultPlugins } from '../plugins';\nimport { pageMargin } from './pageConst';\nimport type { PageDimension, PageMargin } from './pageTypes';\nimport type { Monitor } from './EventDispatcher';\nimport { EventDispatcher } from './EventDispatcher';\nimport type {\n PageContext,\n ReportBuilderEvents,\n SectionContext,\n} from './ReportBuilderEvents';\nimport { reportStyles } from './reportStyles';\nimport { cloneComponents, type SectionComponents } from './sectionComponents';\nimport {\n calculatePageDimensions,\n createSectionPageHeightPlugin,\n} from './utils';\nimport { paprize_isInitialized, paprize_isReady } from '../window';\nimport { globalStyleId } from '../constants';\nimport { PromiseTracker } from './PromiseTracker';\nimport logger from '../logger';\nimport type { PaginationConfig } from '../paginate/PaginationConfig';\n\nexport interface SectionOptions extends Partial<PaginationConfig> {\n readonly id: string;\n readonly dimension: PageDimension;\n readonly margin?: PageMargin;\n readonly suspense?: Promise<unknown>[];\n}\n\nexport interface SectionState {\n options: SectionOptions;\n context: SectionContext;\n components: SectionComponents;\n onPaginationCompleted: (pages: PageContext[]) => void;\n}\n\nconst logPrefix = '\\x1b[43mREPORT\\x1b[0m';\n\nexport interface ScheduleResult {\n sections: SectionContext[];\n suspension: Promise<void>;\n}\n\nexport class ReportBuilder {\n private readonly _sections: Map<string, SectionState>;\n private readonly _monitor: EventDispatcher<ReportBuilderEvents>;\n private _paginationInProgress: boolean;\n private _pendingPaginateResolvers: {\n resolve: (value: ScheduleResult) => void;\n reject: (reason?: unknown) => void;\n }[];\n private _currentAbortController: AbortController | null;\n\n public constructor() {\n this._sections = new Map();\n this._monitor = new EventDispatcher<ReportBuilderEvents>();\n this._paginationInProgress = false;\n this._pendingPaginateResolvers = [];\n this._currentAbortController = null;\n\n window[paprize_isInitialized] = true;\n this._injectStyle(reportStyles.globalStyle);\n }\n\n public get monitor(): Monitor<ReportBuilderEvents> {\n return this._monitor;\n }\n\n public removeSection(sectionId: string): void {\n this._sections.delete(sectionId);\n }\n\n public tryAddSection(\n options: SectionOptions,\n components: SectionComponents,\n onPaginationCompleted: (pages: PageContext[]) => void\n ): boolean {\n if (this._sections.has(options.id)) {\n return false;\n }\n\n const context: SectionContext = {\n index: this._sections.size,\n sectionId: options.id,\n isPaginated: false,\n isSuspended: !!options.suspense?.length,\n pages: [],\n };\n this._sections.set(options.id, {\n context,\n options,\n components,\n onPaginationCompleted,\n });\n\n this._injectStyle(\n reportStyles.sectionPageMedia(options.id, options.dimension)\n );\n this._monitor.dispatch('sectionCreated', context);\n\n return true;\n }\n\n public async schedulePaginate(): Promise<ScheduleResult> {\n if (this._sections.size === 0) {\n window[paprize_isReady] = true;\n return {\n sections: [],\n suspension: Promise.resolve(),\n };\n }\n\n if (this._paginationInProgress && this._currentAbortController) {\n logger.debug(\n logPrefix,\n `Cancelling previous pagination operation.`\n );\n this._currentAbortController.abort(\n 'Cancelled by new paginate call'\n );\n }\n\n // If pagination is still in progress, queue this request\n if (this._paginationInProgress) {\n return new Promise<ScheduleResult>((resolve, reject) => {\n this._pendingPaginateResolvers.push({ resolve, reject });\n });\n }\n\n return this._executePagination();\n }\n\n private async _executePagination(): Promise<ScheduleResult> {\n this._paginationInProgress = true;\n this._currentAbortController = new AbortController();\n const abortSignal = this._currentAbortController.signal;\n\n try {\n logger.debug(logPrefix, `Schedule paginate.`);\n\n await document.fonts.ready;\n if (abortSignal.aborted) {\n return new Promise<ScheduleResult>((resolve, reject) => {\n this._pendingPaginateResolvers.push({ resolve, reject });\n });\n }\n\n const trackers: PromiseTracker[] = [];\n for (const state of this._sections.values()) {\n state.context.isPaginated = false;\n\n const tracker = new PromiseTracker();\n await tracker.add(state.options.suspense);\n tracker.monitor.addEventListener('onChange', (pendingCount) => {\n logger.debug(\n logPrefix,\n `${pendingCount} pending promises in section '${state.options.id}'.`\n );\n });\n\n tracker.promise.then(async () => {\n if (abortSignal.aborted) {\n return;\n }\n\n logger.debug(\n logPrefix,\n `Start paginating section '${state.options.id}'.`\n );\n state.context.isSuspended = false;\n this._paginateSection(state);\n });\n\n trackers.push(tracker);\n }\n\n const reportTracker = new PromiseTracker();\n reportTracker.monitor.addEventListener('onChange', () => {\n logger.debug(logPrefix, 'Report pagination completed.');\n this._monitor.dispatch('paginationCycleCompleted', {\n sections: [...this._sections.values()].map(\n (s) => s.context\n ),\n });\n });\n\n if (abortSignal.aborted) {\n return new Promise<ScheduleResult>((resolve, reject) => {\n this._pendingPaginateResolvers.push({ resolve, reject });\n });\n }\n\n await reportTracker.add(trackers.map((t) => t.promise));\n\n return {\n sections: [...this._sections.values()].map((s) => s.context),\n suspension: reportTracker.promise.then(() => {\n window[paprize_isReady] = true;\n }),\n };\n } finally {\n this._processPendingPagination();\n this._paginationInProgress = false;\n this._currentAbortController = null;\n }\n }\n\n private async _processPendingPagination() {\n if (this._pendingPaginateResolvers.length === 0) {\n return;\n }\n\n logger.debug(\n logPrefix,\n `Processing ${this._pendingPaginateResolvers.length} pending paginate calls.`\n );\n\n const pendingResolvers = [...this._pendingPaginateResolvers];\n this._pendingPaginateResolvers = [];\n\n const nextResult = await this._executePagination();\n for (const resolver of pendingResolvers) {\n resolver.resolve(nextResult);\n }\n }\n\n private _injectStyle(styleContent: string) {\n let style = document.getElementById(\n globalStyleId\n ) as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement('style');\n style.id = globalStyleId;\n style.textContent = '';\n document.head.appendChild(style);\n }\n\n style.textContent = (style.textContent + styleContent)\n .replace(/\\s+/g, ' ')\n .replace(/\\s*([:;{}])\\s*/g, '$1')\n .trim();\n }\n\n private async _paginateSection(state: SectionState): Promise<void> {\n const temporarilyContainer = document.createElement('div');\n\n Object.assign(\n temporarilyContainer.style,\n reportStyles.page(\n state.options.dimension,\n state.options.margin ?? pageMargin.None\n )\n );\n\n if (!isDebugMode()) {\n Object.assign(temporarilyContainer.style, reportStyles.outOfScreen);\n }\n\n const components = cloneComponents(state.components);\n\n if (components.sectionHeader) {\n Object.assign(\n components.sectionHeader.style,\n reportStyles.component\n );\n temporarilyContainer.appendChild(components.sectionHeader);\n }\n if (components.pageHeader) {\n Object.assign(components.pageHeader.style, reportStyles.component);\n temporarilyContainer.appendChild(components.pageHeader);\n }\n\n Object.assign(components.pageContent.style, reportStyles.pageContent);\n temporarilyContainer.appendChild(components.pageContent);\n\n if (components.pageFooter) {\n Object.assign(components.pageFooter.style, reportStyles.component);\n temporarilyContainer.appendChild(components.pageFooter);\n }\n if (components.sectionFooter) {\n Object.assign(\n components.sectionFooter.style,\n reportStyles.component\n );\n temporarilyContainer.appendChild(components.sectionFooter);\n }\n\n document.body.appendChild(temporarilyContainer);\n\n const { height, width, sectionHeaderHeight, sectionFooterHeight } =\n calculatePageDimensions(\n components.pageContent,\n components.sectionHeader,\n components.sectionFooter\n );\n\n const paginatorResult = Paginator.paginate(\n components.pageContent,\n { height, width },\n {\n id: state.options.id,\n plugins: [\n ...(state.options.plugins ?? defaultPlugins),\n createSectionPageHeightPlugin(\n height,\n sectionHeaderHeight,\n sectionFooterHeight\n ),\n ],\n }\n );\n\n temporarilyContainer.remove();\n const pageContexts = paginatorResult.map((content, index) => ({\n index,\n totalPages: paginatorResult.length,\n sectionId: state.options.id,\n pageContentHtml: content,\n }));\n\n state.onPaginationCompleted(pageContexts);\n\n for (const pageContext of pageContexts) {\n this._monitor.dispatch('pageCompleted', pageContext);\n }\n\n const sectionContext: SectionContext = {\n ...state.context,\n isPaginated: true,\n isSuspended: false,\n pages: pageContexts,\n };\n this._sections.set(state.options.id, {\n ...state,\n context: sectionContext,\n });\n\n this._monitor.dispatch('sectionCompleted', sectionContext);\n }\n}\n","const words = [\n 'ad',\n 'adipisicing',\n 'aliqua',\n 'aliquip',\n 'amet',\n 'anim',\n 'aute',\n 'cillum',\n 'commodo',\n 'consectetur',\n 'consequat',\n 'culpa',\n 'cupidatat',\n 'deserunt',\n 'do',\n 'dolor',\n 'dolore',\n 'duis',\n 'ea',\n 'eiusmod',\n 'elit',\n 'enim',\n 'esse',\n 'est',\n 'et',\n 'eu',\n 'ex',\n 'excepteur',\n 'exercitation',\n 'fugiat',\n 'id',\n 'in',\n 'incididunt',\n 'ipsum',\n 'irure',\n 'labore',\n 'laboris',\n 'laborum',\n 'Lorem',\n 'magna',\n 'minim',\n 'mollit',\n 'nisi',\n 'non',\n 'nostrud',\n 'nulla',\n 'occaecat',\n 'officia',\n 'pariatur',\n 'proident',\n 'qui',\n 'quis',\n 'reprehenderit',\n 'sint',\n 'sit',\n 'sunt',\n 'tempor',\n 'ullamco',\n 'ut',\n 'velit',\n 'veniam',\n 'voluptate',\n];\n\nexport function createLoremIpsumParagraph(\n wordCount: number,\n seed: number\n): string {\n if (wordCount <= 0) {\n return '';\n }\n\n const selectedWords: string[] = [];\n const baseSeed = Math.floor(seed * 982451653);\n\n for (let i = 0; i < wordCount; i++) {\n const wordSeed = (baseSeed + i * 2654435761) % Math.pow(2, 32);\n const randomIndex = Math.floor(\n (wordSeed / Math.pow(2, 32)) * words.length\n );\n selectedWords.push(words[randomIndex]);\n }\n\n // capitalize first word and join with spaces\n if (selectedWords.length > 0) {\n selectedWords[0] =\n selectedWords[0].charAt(0).toUpperCase() +\n selectedWords[0].slice(1);\n }\n\n return selectedWords.join(' ') + '.';\n}\n","import type { PageDimension, PageOrientation } from './report/pageTypes';\n\nexport function buildPageId(sectionId: string, pageIndex: number): string {\n return `${sectionId}-${pageIndex + 1}`;\n}\n\nexport function adjustDimension(\n dimension: PageDimension,\n orientation: PageOrientation\n): PageDimension {\n if (orientation === 'landscape') {\n return { height: dimension.width, width: dimension.height };\n }\n\n return dimension;\n}\n"],"names":["loggerName","tempContainerClassName","currentElementClassName","currentTextClassName","ignoredElementClassName","ignoredTextClassName","globalStyleId","pageClassName","sectionClassName","previewClassName","attributePrefix","debugMode","enableDebugMode","isDebugMode","isElement","node","isTextNode","getVisibleHeight","element","rect","computedStyle","marginTop","marginBottom","moveOffscreen","AttributeValueDef","name","reader","defaultValue","value","AttributeDef","configToAttributes","config","map","key","def","defaultConfigAttribute","configValue","attributeCache","getNodeConfigAttribute","attributes","valueDef","attrName","result","defaultConfig","getConfigFromAttributes","globalConfig","root","definition","module","this","noop","undefinedType","isIE","logMethods","_loggersByName","defaultLogger","bindMethod","obj","methodName","method","traceForIE","realMethod","replaceLoggingMethods","level","i","enableLoggingWhenConsoleArrives","defaultMethodFactory","_level","_loggerName","Logger","factory","self","inheritedLevel","defaultLevel","userLevel","storageKey","persistLevelIfPossible","levelNum","levelName","getPersistedLevel","storedLevel","cookie","cookieName","location","clearPersistedLevel","normalizeLevel","input","persist","childName","initialLevel","logger","_log","loglevel","logPrefix","callPluginHook","plugins","hookName","args","a","b","plugin","hook","error","PageNodeType","PageElement","transaction","clonedFrom","current","withChildren","clonedElement","clonedPageElement","PageText","text","createPageNode","DomState","parentsTraversed","Transaction","callback","func","PageState","currentPage","activeElement","currentElement","parentStack","pageIsFull","pageIndex","pageHeight","PageManager","tempContainer","pageSize","pageHtmlElement","page","newPageState","parent","clonedParent","cleanup","popped","pageWidth","state","elementHeight","clonedNode","textNode","newTextNode","SplitResult","paginateElementAcrossPages","currentNode","pageManager","tryPlaceElement","rollback","commit","nextPageResult","paginateTextByWord","splitResult","tokens","token","pendingToken","tokenIndex","currentToken","processToken","originalContent","overflowResult","handleTokenOverflow","leftovers","hyphenation","word","hyphen","appended","char","tentative","Paginator","id","paginator","x","ctx","EventDispatcher","handler","registry","listeners","listener","_pageSize","_pageMargin","pageMargin","getVisibleSize","marginLeft","marginRight","calculatePageDimensions","sectionHeader","sectionFooter","height","width","sectionHeaderHeight","sectionFooterHeight","createSectionPageHeightPlugin","_id","_result","domState","_","pageState","shorthand","margin","globalStyle","component","outOfScreen","pageDimension","pageContent","overlay","section","sectionId","sectionPageMedia","dimension","reportStyles","cloneElement","cloneComponents","components","pageBreakAttributeName","PageBreakPlugin","context","TablePlugin","options","tableElement","openTable","openTableNode","header","body","headerNode","source","cloned","originalNode","head","clonedHead","foot","clonedFoot","tbody","row","defaultPlugins","debugPlugin","sectionTocName","SectionTocPlugin","headingLevel","tagName","paprize_isInitialized","paprize_isReady","paprize_readJsonDataFile","PromiseTracker","p","promises","resolve","promise","tracked","pending","ReportBuilder","onPaginationCompleted","reject","abortSignal","trackers","tracker","pendingCount","reportTracker","s","t","pendingResolvers","nextResult","resolver","styleContent","style","temporarilyContainer","paginatorResult","pageContexts","content","index","pageContext","sectionContext","words","createLoremIpsumParagraph","wordCount","seed","selectedWords","baseSeed","wordSeed","randomIndex","buildPageId","adjustDimension","orientation"],"mappings":"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","x_google_ignoreList":[5]}
1
+ {"version":3,"file":"paprize-core.umd.cjs","sources":["../src/constants.ts","../src/debugUtilities/debugMode.ts","../src/paginate/domUtilities.ts","../src/paginate/LayoutOptions.ts","../src/paginate/attributes.ts","../src/paginate/PaginationOptions.ts","../../../node_modules/loglevel/lib/loglevel.js","../src/logger.ts","../src/paginate/PaginationPlugin.ts","../src/paginate/PageNodes.ts","../src/paginate/DomState.ts","../src/paginate/Transaction.ts","../src/paginate/PageManager.ts","../src/paginate/SplitResult.ts","../src/paginate/paginateElement.ts","../src/paginate/paginateText.ts","../src/paginate/Paginator.ts","../src/report/EventDispatcher.ts","../src/report/pageConst.ts","../src/window.ts","../src/report/utils.ts","../src/report/reportStyles.ts","../src/report/sectionComponents.ts","../src/plugins/PageBreakPlugin.ts","../src/plugins/TablePlugin.ts","../src/plugins/defaultPlugins.ts","../src/plugins/debugPlugin.ts","../src/plugins/SectionTocPlugin.ts","../src/report/PromiseTracker.ts","../src/utils.ts","../src/report/ReportBuilder.ts","../src/debugUtilities/loremIpsum.ts"],"sourcesContent":["export const loggerName = 'paprize';\nexport const tempContainerClassName = 'pz-temp-container';\n\nexport const currentElementClassName = 'pz-current-element';\nexport const currentTextClassName = 'pz-current-text';\n\nexport const ignoredElementClassName = 'pz-ignored-element';\nexport const ignoredTextClassName = 'pz-ignored-text';\n\nexport const globalStyleId = 'paprize-global-style';\nexport const pageClassName = 'pz-page';\nexport const sectionClassName = 'pz-section';\nexport const previewClassName = 'pz-preview';\n\nexport const attributePrefix = 'data-pz-';\n","let debugMode = false;\n\nexport const enableDebugMode = () => {\n debugMode = true;\n};\n\nexport const isDebugMode = () => debugMode;\n","export function isElement(node: Node): node is Element {\n return node.nodeType === Node.ELEMENT_NODE;\n}\n\nexport function isTextNode(node: Node): node is Text {\n return node.nodeType === Node.TEXT_NODE;\n}\n\nexport function getVisibleHeight(element: Element): number {\n const rect = element.getBoundingClientRect();\n const computedStyle = getComputedStyle(element);\n\n const marginTop = parseFloat(computedStyle.marginTop) || 0;\n const marginBottom = parseFloat(computedStyle.marginBottom) || 0;\n\n return rect.height + marginTop + marginBottom;\n}\n\nexport function moveOffscreen(element: HTMLDivElement): void {\n element.style.visibility = 'hidden';\n element.style.position = 'absolute';\n element.style.left = '-9999px';\n element.style.top = '-9999px';\n}\n","/**\n * Layout options for the pagination engine\n */\nexport interface LayoutOptions {\n /**\n * Specifies the character used for hyphenation when a word is broken across lines.\n * @defaultValue \"-\"\n */\n hyphen?: string;\n\n /**\n * Prevents an element from being split across pages.\n * If an element does not fit in the available space on the current page,\n * it will be moved entirely to the next page. If it still does not fit on an empty page,\n * it will be skipped and not rendered.\n * @defaultValue false\n */\n keepOnSamePage?: boolean;\n\n /**\n * Disables automatic word hyphenation.\n * When disabled, if a word (a sequence of text without whitespace) does not fit\n * on the current page, it will move to the next page instead of being split\n * with a hyphen character.\n * @defaultValue false\n */\n hyphenationDisabled?: boolean;\n}\n\nexport const defaultLayoutOptions: Required<LayoutOptions> = {\n hyphen: '-',\n keepOnSamePage: false,\n hyphenationDisabled: false,\n};\n","import { attributePrefix } from '../constants';\nimport { defaultLayoutOptions, type LayoutOptions } from './LayoutOptions';\n\ntype LayoutOptionsAttributes = {\n [Key in keyof Required<LayoutOptions>]: {\n key: string;\n reader: (value: unknown) => LayoutOptions[Key];\n };\n};\nconst layoutOptionsAttributes: LayoutOptionsAttributes = {\n hyphen: {\n key: `${attributePrefix}hyphen`,\n reader: (value) => String(value),\n },\n keepOnSamePage: {\n key: `${attributePrefix}keep-on-same-page`,\n reader: (value) => value === 'true',\n },\n hyphenationDisabled: {\n key: `${attributePrefix}hyphenation-disabled`,\n reader: (value) => value === 'true',\n },\n};\n\nexport function layoutOptionsToAttributes(\n config: LayoutOptions\n): Record<string, string> {\n const map: Record<string, string> = {};\n for (const [key, value] of Object.entries(config)) {\n const attribute = layoutOptionsAttributes[key as keyof LayoutOptions];\n if (attribute !== undefined && value !== undefined) {\n map[attribute.key] = String(value);\n }\n }\n return map;\n}\n\nconst attributeCache = new WeakMap<Node, LayoutOptions>();\n\nfunction assignAttribute<K extends keyof LayoutOptions>(\n key: K,\n reader: (value: unknown) => LayoutOptions[K],\n value: string | null,\n attributes: LayoutOptions\n) {\n if (value == null) {\n return;\n }\n\n const parsedValue = reader(value);\n if (parsedValue !== undefined) {\n attributes[key] = parsedValue;\n }\n}\n\nexport function getNodeLayoutOptionsFromAttribute(\n node: Node | null\n): Partial<LayoutOptions> {\n if (!node) {\n return {};\n }\n\n if (!(node instanceof Element)) {\n return getNodeLayoutOptionsFromAttribute(node?.parentNode);\n }\n\n const attributes: Partial<LayoutOptions> = {};\n for (const key of Object.keys(defaultLayoutOptions)) {\n const typedKey = key as keyof LayoutOptions;\n const attribute = layoutOptionsAttributes[typedKey];\n\n const value = node.getAttribute(attribute.key);\n assignAttribute(typedKey, attribute.reader, value, attributes);\n }\n\n // each node inherits attributes from its ancestors\n // since the DOM tree is traversed from top to bottom,\n // the parent attributes have already been read.\n const parentAttributes = node.parentNode\n ? attributeCache.get(node.parentNode)\n : undefined;\n\n const result = { ...parentAttributes, ...attributes };\n attributeCache.set(node, result);\n\n return result;\n}\n","import { defaultLayoutOptions, type LayoutOptions } from './LayoutOptions';\nimport type { PaginationPlugin } from './PaginationPlugin';\nimport { getNodeLayoutOptionsFromAttribute } from './attributes';\n\n/**\n * Pagination options\n * @interface\n * @inlineType LayoutOptions\n */\nexport type PaginationOptions = Required<LayoutOptions> & {\n /**\n * Unique id of the pagination.\n */\n id: string;\n /**\n * List of plugins to use during pagination.\n */\n plugins: PaginationPlugin[];\n};\n\nexport const defaultPaginationOptions: PaginationOptions = {\n id: 'default',\n plugins: [],\n ...defaultLayoutOptions,\n};\n\nexport function resolvePaginationOptions(\n node: Node | null,\n globalConfig?: PaginationOptions\n): PaginationOptions {\n const attributes = getNodeLayoutOptionsFromAttribute(node);\n\n return { ...defaultPaginationOptions, ...globalConfig, ...attributes };\n}\n","/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n var _loggersByName = {};\n var defaultLogger = null;\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods() {\n /*jshint validthis:true */\n var level = this.getLevel();\n\n // Replace the actual methods.\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, this.name);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n\n // Return any important warnings.\n if (typeof console === undefinedType && level < this.levels.SILENT) {\n return \"No console available for logging\";\n }\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, _level, _loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, factory) {\n // Private instance variables.\n var self = this;\n /**\n * The level inherited from a parent logger (or a global default). We\n * cache this here rather than delegating to the parent so that it stays\n * in sync with the actual logging methods that we have installed (the\n * parent could change levels but we might not have rebuilt the loggers\n * in this child yet).\n * @type {number}\n */\n var inheritedLevel;\n /**\n * The default level for this logger, if any. If set, this overrides\n * `inheritedLevel`.\n * @type {number|null}\n */\n var defaultLevel;\n /**\n * A user-specific level for this logger. If set, this overrides\n * `defaultLevel`.\n * @type {number|null}\n */\n var userLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var cookieName = encodeURIComponent(storageKey);\n var location = cookie.indexOf(cookieName + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(\n cookie.slice(location + cookieName.length + 1)\n )[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n function normalizeLevel(input) {\n var level = input;\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n return level;\n } else {\n throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n }\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n if (userLevel != null) {\n return userLevel;\n } else if (defaultLevel != null) {\n return defaultLevel;\n } else {\n return inheritedLevel;\n }\n };\n\n self.setLevel = function (level, persist) {\n userLevel = normalizeLevel(level);\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(userLevel);\n }\n\n // NOTE: in v2, this should call rebuild(), which updates children.\n return replaceLoggingMethods.call(self);\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = normalizeLevel(level);\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n userLevel = null;\n clearPersistedLevel();\n replaceLoggingMethods.call(self);\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n self.rebuild = function () {\n if (defaultLogger !== self) {\n inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n }\n replaceLoggingMethods.call(self);\n\n if (defaultLogger === self) {\n for (var childName in _loggersByName) {\n _loggersByName[childName].rebuild();\n }\n }\n };\n\n // Initialize all the internal levels.\n inheritedLevel = normalizeLevel(\n defaultLogger ? defaultLogger.getLevel() : \"WARN\"\n );\n var initialLevel = getPersistedLevel();\n if (initialLevel != null) {\n userLevel = normalizeLevel(initialLevel);\n }\n replaceLoggingMethods.call(self);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n defaultLogger = new Logger();\n\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name,\n defaultLogger.methodFactory\n );\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n","import loglevel from 'loglevel';\nimport { loggerName } from './constants';\n\nconst logger = loglevel.getLogger(loggerName);\nlogger.setDefaultLevel('info');\n\nexport default logger;\n","import type { PageManager } from './PageManager';\nimport type { PageElement, PageText } from './PageNodes';\nimport type { SplitResult } from './SplitResult';\nimport logger from '../logger';\nimport type { DomState } from './DomState';\n\nconst logPrefix = '\\x1b[46mPLUGIN\\x1b[0m';\n\nexport interface VisitContext {\n result?: SplitResult;\n}\n\nexport interface PaginationPlugin {\n readonly name: string;\n readonly order: number;\n onVisitText?: (\n id: string,\n domState: DomState & { currentNode: PageText },\n pageManager: PageManager,\n context: VisitContext\n ) => void;\n onVisitElement?: (\n id: string,\n domState: DomState & { currentNode: PageElement },\n pageManager: PageManager,\n context: VisitContext\n ) => void;\n afterVisitNode?: (\n id: string,\n result: SplitResult,\n domState: DomState,\n pageManager: PageManager\n ) => void;\n onNewPage?: (id: string, pageManager: PageManager) => void;\n onClone?: (id: string, source: Element, cloned: PageElement) => void;\n}\n\ntype PluginKeys = {\n [K in keyof PaginationPlugin]: PaginationPlugin[K] extends\n | ((...args: never[]) => unknown)\n | undefined\n ? K\n : never;\n}[keyof PaginationPlugin];\n\ntype PluginHookNames = NonNullable<PluginKeys>;\n\nexport function callPluginHook<T extends PluginHookNames>(\n plugins: PaginationPlugin[],\n hookName: T,\n ...args: Parameters<NonNullable<PaginationPlugin[T]>>\n): void {\n plugins\n .sort((a, b) => a.order - b.order)\n .forEach((plugin) => {\n const hook = plugin[hookName];\n if (!hook) {\n return;\n }\n\n logger.debug(\n logPrefix,\n `executing plugin ${plugin.name}:${String(hookName)} (${String()})`,\n args\n );\n\n try {\n (hook as (...args: unknown[]) => void)(...args);\n logger.debug(\n logPrefix,\n `plugin ${plugin.name}:${String(hookName)} executed`,\n args\n );\n } catch (error) {\n logger.debug(\n logPrefix,\n `plugin ${plugin.name}:${String(hookName)} failed`,\n error\n );\n }\n });\n}\n","import { getVisibleHeight, isElement, isTextNode } from './domUtilities';\nimport { type PaginationOptions } from './PaginationOptions';\nimport { callPluginHook } from './PaginationPlugin';\nimport type { Transaction } from './Transaction';\n\nexport type SafeElement = Omit<\n Element,\n 'removeChild' | 'appendChild' | 'replaceChild' | 'remove'\n>;\n\nexport type SafeText = Omit<Text, 'remove'>;\n\nexport const PageNodeType = {\n Element: 'element',\n Text: 'text',\n} as const;\n\nexport class PageElement {\n private readonly _node: Element;\n\n public config: PaginationOptions;\n\n public readonly type: 'element' = PageNodeType.Element;\n public readonly transaction: Transaction;\n public readonly clonedFrom?: PageElement;\n public readonly cloneCount: number;\n\n constructor(\n element: Element,\n transaction: Transaction,\n config: PaginationOptions,\n clonedFrom?: PageElement\n ) {\n this._node = element;\n this.transaction = transaction;\n this.config = config;\n this.clonedFrom = clonedFrom;\n this.cloneCount = clonedFrom ? clonedFrom.cloneCount + 1 : 0;\n }\n\n getOriginalNode(): Node | undefined {\n let current: PageElement | undefined = this.clonedFrom;\n while (current?.clonedFrom) {\n current = current.clonedFrom;\n }\n return current?._node;\n }\n\n appendChild(node: PageNode): void {\n if (this.transaction.isActive) {\n this.transaction.addRollbackCallback(() => {\n this._node.removeChild(node.getNode() as Node);\n });\n }\n\n this._node.appendChild(node.getNode() as Node);\n }\n\n clone(withChildren?: boolean): PageElement {\n const clonedElement = this._node.cloneNode(withChildren) as Element;\n const clonedPageElement = new PageElement(\n clonedElement,\n this.transaction,\n this.config,\n this\n );\n\n callPluginHook(\n this.config.plugins,\n 'onClone',\n this.config.id,\n this._node,\n clonedPageElement\n );\n\n return clonedPageElement;\n }\n\n getHeight(): number {\n return getVisibleHeight(this._node);\n }\n\n remove(): void {\n this.transaction.addCommitCallback(() => {\n this._node.remove();\n });\n }\n\n isEmpty(): boolean {\n return this._node.innerHTML === '';\n }\n\n getChildrenCount(): number {\n return this._node.childNodes.length;\n }\n\n getNode(): SafeElement {\n return this._node;\n }\n}\n\nexport class PageText {\n private readonly _node: Text;\n\n public readonly type: 'text' = PageNodeType.Text;\n public readonly transaction: Transaction;\n\n public config: PaginationOptions;\n\n constructor(\n text: Text,\n transaction: Transaction,\n config: PaginationOptions\n ) {\n this._node = text;\n this.transaction = transaction;\n this.config = config;\n }\n\n get textContent(): string {\n return this._node.textContent ?? '';\n }\n\n set textContent(value: string) {\n this._node.textContent = value;\n }\n\n remove(): void {\n this.transaction.addCommitCallback(() => {\n this._node.remove();\n });\n }\n\n getNode(): SafeText {\n return this._node;\n }\n}\n\nexport type PageNode = PageElement | PageText;\n\nexport function createPageNode(\n node: Element,\n transaction: Transaction,\n config: PaginationOptions\n): PageElement;\nexport function createPageNode(\n node: Text,\n transaction: Transaction,\n config: PaginationOptions\n): PageText;\nexport function createPageNode(\n node: Node,\n transaction: Transaction,\n config: PaginationOptions\n): PageNode;\nexport function createPageNode(\n node: Node,\n transaction: Transaction,\n config: PaginationOptions\n): PageNode {\n if (isTextNode(node)) {\n return new PageText(node, transaction, config);\n } else if (isElement(node)) {\n return new PageElement(node, transaction, config);\n }\n\n throw new Error('Unsupported node type');\n}\n","import {\n markCurrentNode,\n unmarkCurrentNode,\n} from '../debugUtilities/pageNodeMarker';\nimport { type PageNode, createPageNode } from './PageNodes';\nimport {\n resolvePaginationOptions,\n type PaginationOptions,\n} from './PaginationOptions';\nimport type { Transaction } from './Transaction';\nimport logger from '../logger';\n\nconst logPrefix = '\\x1b[106mDOM\\x1b[0m';\n\nexport class DomState {\n private readonly _transaction: Transaction;\n private readonly _treeWalker: TreeWalker;\n private readonly _config: PaginationOptions;\n\n private _completed: boolean = false;\n private _currentNode: PageNode | null = null;\n private _previousNode: PageNode | null = null;\n\n constructor(\n root: Element,\n transaction: Transaction,\n config: PaginationOptions\n ) {\n this._transaction = transaction;\n this._config = config;\n this._treeWalker = document.createTreeWalker(\n root,\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT\n );\n }\n\n public get completed(): boolean {\n return this._completed;\n }\n public get currentNode(): PageNode | null {\n return this._currentNode;\n }\n public get previousNode(): PageNode | null {\n return this._previousNode;\n }\n\n public goToNextNode() {\n const result = this._treeWalker.nextNode();\n if (!result) {\n this._completed = true;\n }\n\n logger.debug(logPrefix, 'moving to next node');\n\n this.setState();\n }\n\n public goToNextSiblingOrParentSibling(): { parentsTraversed: number } {\n let parentsTraversed = 0;\n\n if (this._treeWalker.nextSibling()) {\n logger.debug(logPrefix, 'moving to next sibling node');\n\n this.setState();\n return { parentsTraversed };\n }\n\n // no sibling found, traverse up the tree to find the next available node\n while (this._treeWalker.parentNode()) {\n parentsTraversed++;\n\n if (this._treeWalker.nextSibling()) {\n logger.debug(\n logPrefix,\n 'moving to parent sibling node, traversed:',\n parentsTraversed\n );\n\n this.setState();\n return { parentsTraversed };\n }\n }\n\n this._completed = true;\n return { parentsTraversed };\n }\n\n public goToFirstChildOrNextNode(): { parentsTraversed: number } {\n if (this._treeWalker.firstChild()) {\n logger.debug(logPrefix, 'moving to first child node');\n this.setState();\n return { parentsTraversed: 1 };\n }\n\n this.goToNextNode();\n return { parentsTraversed: 0 };\n }\n\n private setState() {\n this._previousNode = this._currentNode;\n this._currentNode = createPageNode(\n this._treeWalker.currentNode,\n this._transaction,\n resolvePaginationOptions(this._treeWalker.currentNode, this._config)\n );\n\n DEV: markCurrentNode(this._currentNode);\n DEV: unmarkCurrentNode(this._previousNode);\n\n logger.debug(logPrefix, 'moved to node', {\n currentNode: this._currentNode,\n previousNode: this._previousNode,\n });\n }\n}\n","export class Transaction {\n private _onRollback: (() => void)[];\n private _onCommit: (() => void)[];\n public isActive: boolean;\n\n constructor() {\n this._onRollback = [];\n this._onCommit = [];\n this.isActive = false;\n }\n\n start = () => {\n if (this.isActive) {\n throw new Error('Transaction already in progress');\n }\n this.isActive = true;\n this._onRollback = [];\n this._onCommit = [];\n };\n\n addRollbackCallback = (callback: () => void) => {\n this._onRollback.push(callback);\n };\n\n addCommitCallback = (callback: () => void) => {\n if (!this.isActive) {\n callback();\n return;\n }\n this._onCommit.push(callback);\n };\n\n rollback = () => {\n if (!this.isActive) return;\n this.isActive = false;\n this._onRollback.forEach((func) => func());\n };\n\n commit = () => {\n if (!this.isActive) return;\n this.isActive = false;\n this._onCommit.forEach((func) => func());\n };\n}\n","import {\n createPageNode,\n PageNodeType,\n type PageElement,\n type PageNode,\n type PageText,\n} from './PageNodes';\nimport { Transaction } from './Transaction';\nimport type { RealizedPageSize } from './RealizedPageSize';\nimport { unmarkCurrentNode } from '../debugUtilities/pageNodeMarker';\nimport logger from '../logger';\nimport { type PaginationOptions } from './PaginationOptions';\nimport { callPluginHook } from './PaginationPlugin';\n\nconst logPrefix = '\\x1b[102mPAGE\\x1b[0m';\n\nexport class PageState {\n public currentPage: PageElement;\n public activeElement: PageNode | null;\n public currentElement: PageElement;\n public parentStack: PageElement[];\n public pageIsFull: boolean;\n public pageIndex: number;\n public pageHeight: number;\n\n constructor(\n currentPage: PageElement,\n activeElement: PageNode | null,\n currentElement: PageElement,\n parentStack: PageElement[],\n pageIsFull: boolean,\n pageIndex: number,\n pageHeight: number\n ) {\n this.currentPage = currentPage;\n this.activeElement = activeElement;\n this.currentElement = currentElement;\n this.parentStack = parentStack;\n this.pageIsFull = pageIsFull;\n this.pageIndex = pageIndex;\n this.pageHeight = pageHeight;\n }\n\n public static create(\n currentPage: PageElement,\n parentStack: PageElement[],\n pageIndex: number,\n pageHeight: number\n ) {\n return new PageState(\n currentPage,\n null,\n currentPage,\n parentStack,\n false,\n pageIndex,\n pageHeight\n );\n }\n\n public clone = (): PageState => {\n return new PageState(\n this.currentPage,\n this.activeElement,\n this.currentElement,\n [...this.parentStack],\n this.pageIsFull,\n this.pageIndex,\n this.pageHeight\n );\n };\n}\n\nexport class PageManager {\n private _pageState: PageState;\n\n private readonly _transaction: Transaction;\n private readonly _tempContainer: Element;\n private readonly _config: PaginationOptions;\n\n public constructor(\n tempContainer: Element,\n pageSize: RealizedPageSize,\n transaction: Transaction,\n config: PaginationOptions\n ) {\n this._tempContainer = tempContainer;\n this._config = config;\n this._transaction = transaction;\n\n const pageHtmlElement = PageManager.createPageHtmlElement(\n pageSize.width\n );\n\n const page = this.createNewPage(pageHtmlElement);\n this._pageState = PageState.create(page, [], 0, pageSize.height);\n callPluginHook(this._config.plugins, 'onNewPage', config.id, this);\n }\n\n public nextPage(): void {\n const page = this.createNewPage(\n this._pageState.currentPage.getNode().cloneNode(false) as Element\n );\n\n const newPageState = PageState.create(\n page,\n [],\n this._pageState.pageIndex + 1,\n this._pageState.pageHeight\n );\n\n // add uncompleted parents elements to the new page\n this.cloneParentStackToNewPage(newPageState);\n this.cleanupEmptyParent();\n\n this._pageState = newPageState;\n callPluginHook(\n this._config.plugins,\n 'onNewPage',\n this._config.id,\n this\n );\n }\n\n private cloneParentStackToNewPage(newPageState: PageState): void {\n for (const parent of this._pageState.parentStack) {\n const clonedParent = parent.clone(false);\n newPageState.currentElement.appendChild(clonedParent);\n newPageState.currentElement = clonedParent;\n newPageState.parentStack.push(clonedParent);\n }\n }\n\n private cleanupEmptyParent(): void {\n const parentStack = [...this._pageState.parentStack];\n\n const cleanup = () => {\n // iterate backwards to check the element in order\n for (let i = parentStack.length - 1; i >= 0; i--) {\n const parent = parentStack[i];\n if (parent.isEmpty()) {\n parent.remove();\n }\n }\n };\n\n this._transaction.addCommitCallback(cleanup);\n }\n\n public enterElement(): void {\n if (\n !this._pageState.activeElement ||\n this._pageState.activeElement.type !== PageNodeType.Element\n ) {\n throw new Error('Invalid state: activeElement is not an Element');\n }\n\n logger.debug(\n logPrefix,\n 'entering an element',\n this._pageState.activeElement\n );\n this._pageState.currentElement = this._pageState.activeElement;\n this._pageState.parentStack.push(this._pageState.activeElement);\n }\n\n public leaveElement(): void {\n this._pageState.activeElement = null;\n\n // remove last parent as we are leaving it\n const popped = this._pageState.parentStack.pop();\n logger.debug(logPrefix, 'leaving a parent element', popped);\n\n // find the original parent\n const parent = this._pageState.parentStack.at(-1);\n this._pageState.currentElement = parent ?? this._pageState.currentPage;\n }\n\n private static createPageHtmlElement(pageWidth: number): Element {\n const page = document.createElement('div');\n page.style.width = `${pageWidth}px`;\n page.style.maxWidth = `${pageWidth}px`;\n\n return page;\n }\n\n private createNewPage(pageHtmlElement: Element): PageElement {\n this._tempContainer.appendChild(pageHtmlElement);\n\n if (this._transaction.isActive) {\n this._transaction.addRollbackCallback(() => {\n this._tempContainer.removeChild(pageHtmlElement);\n });\n }\n\n return createPageNode(pageHtmlElement, this._transaction, this._config);\n }\n\n public startTransaction(): { rollback: () => void; commit: () => void } {\n this._transaction.start();\n\n const state = this._pageState.clone();\n this._transaction.addRollbackCallback(() => {\n this._pageState = state;\n });\n\n return this._transaction;\n }\n\n public hasEmptySpace(elementHeight?: number): boolean {\n return (\n !this._pageState.pageIsFull &&\n this._pageState.currentPage.getHeight() +\n (elementHeight || 0.0001) <=\n this._pageState.pageHeight\n );\n }\n\n public isOverFlow(): boolean {\n return (\n this._pageState.currentPage.getHeight() > this._pageState.pageHeight\n );\n }\n\n public markPageAsFull(): void {\n this._pageState.pageIsFull = true;\n }\n\n public appendChild(node: PageElement, withChildren: boolean): PageElement {\n const clonedNode = node.clone(withChildren);\n\n DEV: unmarkCurrentNode(clonedNode);\n\n this._pageState.currentElement.appendChild(clonedNode);\n this._pageState.activeElement = clonedNode;\n\n return clonedNode;\n }\n\n public addTextNode(text: string): PageText {\n if (this._pageState.activeElement?.type === PageNodeType.Text) {\n return this._pageState.activeElement;\n }\n\n const textNode = document.createTextNode(text);\n const newTextNode = createPageNode(\n textNode,\n this._transaction,\n this._config\n );\n\n this._pageState.currentElement.appendChild(newTextNode);\n this._pageState.activeElement = newTextNode;\n\n return newTextNode;\n }\n\n public getPageState(): PageState {\n return this._pageState;\n }\n}\n","export const SplitResult = {\n None: 0, // The node fits completely on the page, no further splitting required.\n FullNodePlaced: 1, // The entire node was placed on the page, continue with the next sibling or element.\n SplitChildren: 2, // The node is too large for the page, and its children must be paginated individually.\n} as const;\n\nexport type SplitResult = (typeof SplitResult)[keyof typeof SplitResult];\n","import logger from '../logger';\nimport { type PageManager } from './PageManager';\nimport { SplitResult } from './SplitResult';\nimport type { PageElement } from './PageNodes';\n\n/**\n * Tries to split the given element across pages by first attempting to place it\n * (with its entire subtree) on the current page, then (if needed) on the next page.\n * Falls back to partial (without children) placement when allowed.\n */\nexport function paginateElementAcrossPages(\n currentNode: PageElement,\n pageManager: PageManager\n): SplitResult {\n // try on current page\n const result = tryPlaceElement(currentNode, pageManager);\n if (result !== SplitResult.None) {\n return result;\n }\n\n // try on next page (transactional)\n const { rollback, commit } = pageManager.startTransaction();\n pageManager.nextPage();\n\n const nextPageResult = tryPlaceElement(currentNode, pageManager);\n if (nextPageResult !== SplitResult.None) {\n commit();\n return nextPageResult;\n }\n\n rollback();\n logger.debug('Element is too big to fit on a page', currentNode);\n return SplitResult.None;\n}\n\n/**\n * Attempts to place the node (first with children, then without if allowed).\n * Returns the achieved SplitResult or None if not possible.\n */\nfunction tryPlaceElement(\n currentNode: PageElement,\n pageManager: PageManager\n): SplitResult {\n // fast path: try full subtree if height suggests it could fit\n if (pageManager.hasEmptySpace(currentNode.getHeight())) {\n // copy the next node and sub tree of it to the current page\n const clonedNode = pageManager.appendChild(currentNode, true);\n if (pageManager.isOverFlow()) {\n // If overflow after optimistic append, we removed it and continue to partial logic\n clonedNode.remove();\n } else {\n return SplitResult.FullNodePlaced;\n }\n }\n\n if (\n currentNode.config.keepOnSamePage ||\n currentNode.getChildrenCount() === 0\n ) {\n // cannot (or not allowed to) split from its children\n return SplitResult.None;\n }\n\n // Try placing only the element shell (children will render later)\n const clonedNode = pageManager.appendChild(currentNode, false);\n if (pageManager.isOverFlow()) {\n clonedNode.remove();\n return SplitResult.None;\n }\n\n return SplitResult.SplitChildren;\n}\n","import logger from '../logger';\nimport type { PageManager } from './PageManager';\nimport type { PageText } from './PageNodes';\nimport { SplitResult } from './SplitResult';\nimport type { PaginationOptions } from './PaginationOptions';\n\n/**\n * Splits text across pages by whole words; falls back to character splitting\n * only when a single word cannot fit on an empty page.\n *\n * Algorithm:\n * 1. Tokenize into words + whitespace (preserve spacing).\n * 2. Try appending each token to the current text node.\n * 3. On overflow: revert, try the whole token at top of a new page inside a transaction.\n * 4. If it still overflows on an empty page, rollback and split by character\n * starting in the current (previous) page\n */\nexport function paginateTextByWord(\n text: PageText,\n pageManager: PageManager\n): SplitResult {\n let splitResult: SplitResult = SplitResult.FullNodePlaced;\n\n const tokens = text.textContent\n .split(/(\\s+)/)\n .filter((token) => token !== '');\n\n let pendingToken: string | undefined;\n let tokenIndex = 0;\n\n while (pendingToken || tokenIndex < tokens.length) {\n const currentToken = pendingToken ?? tokens[tokenIndex];\n const result = processToken(currentToken, pageManager, text.config);\n\n if (!result.completed) {\n splitResult = SplitResult.None;\n }\n\n if (result.pendingToken) {\n pendingToken = result.pendingToken;\n } else {\n pendingToken = undefined;\n tokenIndex++;\n }\n }\n\n return splitResult;\n}\n\nfunction processToken(\n token: string,\n pageManager: PageManager,\n config: PaginationOptions\n): {\n completed: boolean;\n pendingToken?: string;\n} {\n if (!pageManager.hasEmptySpace()) {\n pageManager.nextPage();\n }\n const textNode = pageManager.addTextNode('');\n\n // tentatively append\n const originalContent = textNode.textContent;\n textNode.textContent += token;\n\n if (!pageManager.isOverFlow()) {\n // token fits on new page\n return {\n completed: true,\n };\n }\n\n // overflow: revert append\n textNode.textContent = originalContent;\n\n const overflowResult = handleTokenOverflow(token, pageManager, config);\n return {\n pendingToken: overflowResult.leftovers,\n completed: overflowResult.completed,\n };\n}\n\nfunction handleTokenOverflow(\n token: string,\n pageManager: PageManager,\n config: PaginationOptions\n): {\n completed: boolean;\n leftovers?: string;\n} {\n // try on a fresh page within a transaction\n const { rollback, commit } = pageManager.startTransaction();\n pageManager.nextPage();\n pageManager.addTextNode(token);\n\n if (!pageManager.isOverFlow()) {\n // token fits entirely on the new page\n commit();\n\n return {\n completed: true,\n };\n }\n\n // still doesn't fit - rollback to previous state split the token by character (hyphenation)\n rollback();\n\n if (config.hyphenationDisabled) {\n // If hyphenation is not enabled and the token is too long, we need to skip the token\n\n logger.warn('Hyphenation disabled, skipping oversized token:', token);\n\n return {\n completed: false,\n };\n }\n\n const leftovers = hyphenation(token, config.hyphen, pageManager);\n return {\n completed: true,\n leftovers: leftovers && leftovers.length > 0 ? leftovers : undefined,\n };\n}\n\nexport function hyphenation(\n word: string,\n hyphen: string,\n pageManager: PageManager\n): string | null {\n const textNode = pageManager.addTextNode('');\n let appended = '';\n\n for (let i = 0; i < word.length; i++) {\n const char = word[i];\n\n // tentatively add the character with hyphen\n const tentative = appended + char;\n textNode.textContent = tentative + hyphen;\n\n if (!pageManager.hasEmptySpace()) {\n // overflow: revert to previous appended\n textNode.textContent = appended ? appended + hyphen : '';\n\n pageManager.markPageAsFull();\n\n // return leftover starting from the char that did not fit\n return word.slice(i);\n }\n\n appended = tentative;\n }\n\n // all characters consumed; no leftovers\n return null;\n}\n","import { DomState } from './DomState';\nimport { PageManager } from './PageManager';\nimport type { RealizedPageSize } from './RealizedPageSize';\nimport { PageElement, PageNodeType, PageText } from './PageNodes';\nimport { paginateElementAcrossPages } from './paginateElement';\nimport { paginateTextByWord } from './paginateText';\nimport { SplitResult } from './SplitResult';\nimport { Transaction } from './Transaction';\nimport logger from 'loglevel';\nimport {\n defaultPaginationOptions,\n type PaginationOptions,\n} from './PaginationOptions';\nimport { markIgnoredNode } from '../debugUtilities/pageNodeMarker';\nimport { callPluginHook, type VisitContext } from './PaginationPlugin';\nimport { attributePrefix, tempContainerClassName } from '../constants';\nimport { isDebugMode } from '../debugUtilities/debugMode';\nimport { isElement, moveOffscreen } from './domUtilities';\n\nconst logPrefix = '\\x1b[103mPAGINATOR\\x1b[0m';\n\nexport type PaginateResult = string[];\n\nexport class Paginator {\n private readonly _domState: DomState;\n private readonly _pageManager: PageManager;\n private readonly _transaction: Transaction;\n private readonly _tempContainer: Element;\n private readonly _config: PaginationOptions;\n\n private constructor(\n root: Element,\n pageSize: RealizedPageSize,\n config?: Partial<PaginationOptions>\n ) {\n this._config = { ...defaultPaginationOptions, ...config };\n this._tempContainer = Paginator.createTempContainer(this._config.id);\n this._transaction = new Transaction();\n this._domState = new DomState(root, this._transaction, this._config);\n this._pageManager = new PageManager(\n this._tempContainer,\n pageSize,\n this._transaction,\n this._config\n );\n }\n\n private static createTempContainer(id: string): Element {\n const tempContainer = document.createElement('div');\n tempContainer.style.display = 'flex'; // to avoid margin collapsing between pages\n tempContainer.style.flexDirection = 'column';\n tempContainer.style.gap = '20px';\n tempContainer.setAttribute(`${attributePrefix}-section-id`, id);\n\n tempContainer.classList.add(tempContainerClassName);\n DEV: if (!isDebugMode()) {\n moveOffscreen(tempContainer);\n }\n document.body.appendChild(tempContainer);\n return tempContainer;\n }\n\n public static paginate(\n root: Element,\n pageSize: RealizedPageSize,\n config?: Partial<PaginationOptions>\n ): PaginateResult {\n const paginator = new Paginator(root, pageSize, config);\n paginator.processAllNodes();\n\n const result = Array.from(paginator._tempContainer.childNodes)\n .filter((x) => isElement(x))\n .map((x) => x.innerHTML);\n\n DEV: if (!isDebugMode()) {\n paginator._tempContainer.remove();\n }\n\n return result;\n }\n\n private processAllNodes(): void {\n this._domState.goToNextNode();\n\n do {\n logger.debug(\n logPrefix,\n 'paginating node',\n this._domState.currentNode\n );\n const result = this.processCurrentNode();\n\n callPluginHook(\n this._config.plugins,\n 'afterVisitNode',\n this._config.id,\n result,\n this._domState,\n this._pageManager\n );\n\n switch (result) {\n case SplitResult.None:\n this.handleNodeSkipped();\n break;\n\n case SplitResult.FullNodePlaced:\n this.handleFullNodePlaced();\n break;\n\n case SplitResult.SplitChildren:\n this.handleChildrenSplit();\n break;\n }\n } while (this._domState.completed === false);\n\n logger.debug(logPrefix, 'pagination completed');\n }\n\n private handleNodeSkipped(): void {\n logger.debug(logPrefix, \"node skipped - couldn't paginate\");\n\n DEV: markIgnoredNode(this._domState.currentNode);\n this._domState.goToNextNode();\n }\n\n private handleFullNodePlaced(): void {\n logger.debug(logPrefix, 'node fully paginated');\n\n const { parentsTraversed } =\n this._domState.goToNextSiblingOrParentSibling();\n for (let i = 0; i < parentsTraversed; i++) {\n this._pageManager.leaveElement();\n }\n }\n\n private handleChildrenSplit(): void {\n logger.debug(\n logPrefix,\n 'node partially paginated - splitting children'\n );\n\n if (\n this._domState.goToFirstChildOrNextNode().parentsTraversed === 1 &&\n this._domState.previousNode?.type === PageNodeType.Element\n ) {\n this._pageManager.enterElement();\n }\n }\n\n private processCurrentNode(): SplitResult {\n if (!this._domState.currentNode) {\n return SplitResult.None;\n }\n\n if (this._domState.currentNode.type === PageNodeType.Element) {\n // call plugins ...\n const ctx: VisitContext = {};\n callPluginHook(\n this._config.plugins,\n 'onVisitElement',\n this._config.id,\n this._domState as DomState & { currentNode: PageElement },\n this._pageManager,\n ctx\n );\n if (ctx.result !== undefined) {\n return ctx.result;\n }\n // ... plugins called\n\n return paginateElementAcrossPages(\n this._domState.currentNode,\n this._pageManager\n );\n } else {\n // call plugins ...\n const ctx: VisitContext = {};\n callPluginHook(\n this._config.plugins,\n 'onVisitText',\n this._config.id,\n this._domState as DomState & { currentNode: PageText },\n this._pageManager,\n ctx\n );\n if (ctx.result !== undefined) {\n return ctx.result;\n }\n // ... plugins called\n\n return paginateTextByWord(\n this._domState.currentNode,\n this._pageManager\n );\n }\n }\n}\n","type EventHandler<TKey extends keyof TEvents, TEvents> = TEvents[TKey] extends (\n ...args: infer TArgs\n) => infer TReturn\n ? (...args: TArgs) => TReturn\n : never;\n\nexport class EventDispatcher<TEvents> {\n private registry = new Map<\n keyof TEvents,\n Set<(...args: unknown[]) => unknown | Promise<unknown>>\n >();\n\n public addEventListener<T extends keyof TEvents>(\n name: T,\n handler: EventHandler<T, TEvents>\n ) {\n const { registry } = this;\n const listeners = new Set(registry.get(name));\n\n listeners.add(handler);\n registry.set(name, listeners);\n\n return () => this.removeEventListener(name, handler);\n }\n\n public removeEventListener<T extends keyof TEvents>(\n name: T,\n handler: EventHandler<T, TEvents>\n ) {\n const { registry } = this;\n const listeners = new Set(registry.get(name));\n\n listeners.delete(handler);\n registry.set(name, listeners);\n }\n\n public async dispatch<T extends keyof TEvents>(\n name: T,\n ...args: Parameters<EventHandler<T, TEvents>>\n ) {\n const { registry } = this;\n const listeners = registry.get(name);\n\n if (!listeners) {\n return;\n }\n\n for (const listener of listeners) {\n await listener(...args);\n }\n }\n}\n\nexport type Monitor<TEvents> = Omit<EventDispatcher<TEvents>, 'dispatch'>;\n","import type { PageSize, PageMargin } from './pageTypes';\n\n/**\n * Predefined values for commonly used {@link PageSize}\n * @privateRemarks\n * Type casting is only for cleaner TypeDoc output\n */\nexport const pageSize = {\n /** 841mm x 594mm */\n A1: { height: '841mm', width: '594mm' } as PageSize,\n /** 594mm x 420mm */\n A2: { height: '594mm', width: '420mm' } as PageSize,\n /** 420mm x 297mm */\n A3: { height: '420mm', width: '297mm' } as PageSize,\n /** 297mm x 210mm */\n A4: { height: '297mm', width: '210mm' } as PageSize,\n /** 210mm x 148mm */\n A5: { height: '210mm', width: '148mm' } as PageSize,\n /** 148mm x 105mm */\n A6: { height: '148mm', width: '105mm' } as PageSize,\n /** 500mm x 353mm */\n B3: { height: '500mm', width: '353mm' } as PageSize,\n /** 353mm x 250mm */\n B4: { height: '353mm', width: '250mm' } as PageSize,\n /** 250mm x 176mm */\n B5: { height: '250mm', width: '176mm' } as PageSize,\n /** 8.5in x 11in */\n Letter: { height: '8.5in', width: '11in' } as PageSize,\n /** 11in x 8.5in */\n Legal: { height: '11in', width: '8.5in' } as PageSize,\n /** 11in x 17in */\n Tabloid: { height: '11in', width: '17in' } as PageSize,\n} as const satisfies Record<string, PageSize>;\n\n/**\n * Predefined values for commonly used {@link PageMargin}\n * @privateRemarks\n * Type casting is only for cleaner TypeDoc output\n */\nexport const pageMargin = {\n /** Top, Right, Bottom, Left: 1in */\n Normal: {\n top: '1in',\n right: '1in',\n bottom: '1in',\n left: '1in',\n } as PageMargin,\n /** Top: 0.4in, Right, Bottom, Left: 0.6in */\n Narrow: {\n top: '0.4in',\n right: '0.6in',\n bottom: '0.6in',\n left: '0.6in',\n } as PageMargin,\n /** Top, Bottom: 0.5in, Right, Left: 2in */\n Wide: {\n top: '0.5in',\n right: '2in',\n bottom: '0.5in',\n left: '2in',\n } as PageMargin,\n /** Top, Right, Bottom, Left: 0 */\n None: {\n top: '0in',\n right: '0in',\n bottom: '0in',\n left: '0in',\n } as PageMargin,\n} as const satisfies Record<string, PageMargin>;\n","export const paprize_isInitialized = '__PAPRIZE_IS_INITIALIZED';\nexport const paprize_isReady = '__PAPRIZE_IS_READY';\nexport const paprize_readJsonDataFile = '__PAPRIZE_READ_JSON_DATA_FILE';\n\ndeclare global {\n interface Window {\n [paprize_isInitialized]?: boolean;\n [paprize_isReady]?: boolean;\n [paprize_readJsonDataFile]?: () => Promise<string>;\n }\n}\n","import { getVisibleHeight } from '../paginate/domUtilities';\nimport type { PaginationPlugin } from '../paginate/PaginationPlugin';\nimport { paprize_readJsonDataFile } from '../window';\nimport type { PageMargin } from './pageTypes';\n\nexport function getVisibleSize(element: Element) {\n const rect = element.getBoundingClientRect();\n const computedStyle = getComputedStyle(element);\n\n const marginLeft = parseFloat(computedStyle.marginLeft) || 0;\n const marginRight = parseFloat(computedStyle.marginRight) || 0;\n\n return {\n height: getVisibleHeight(element),\n width: rect.width + marginLeft + marginRight,\n };\n}\n\nexport function calculatePageSizes(\n current: HTMLElement,\n sectionHeader: HTMLElement | null,\n sectionFooter: HTMLElement | null\n): {\n height: number;\n width: number;\n sectionHeaderHeight: number;\n sectionFooterHeight: number;\n} {\n const { height, width } = getVisibleSize(current);\n const sectionHeaderHeight = sectionHeader\n ? getVisibleHeight(sectionHeader)\n : 0;\n const sectionFooterHeight = sectionFooter\n ? getVisibleHeight(sectionFooter)\n : 0;\n\n return { height, width, sectionHeaderHeight, sectionFooterHeight };\n}\n\nexport function createSectionPageHeightPlugin(\n height: number,\n sectionHeaderHeight: number,\n sectionFooterHeight: number\n): PaginationPlugin {\n return {\n name: 'sectionPageHeight',\n order: 1,\n afterVisitNode: (_id, _result, domState, pageManager) => {\n const lastPage = domState.completed;\n if (!lastPage || sectionFooterHeight <= 0) return;\n\n // if there is no empty space for the section footer, create a new page for it\n if (!pageManager.hasEmptySpace(sectionFooterHeight)) {\n pageManager.nextPage();\n }\n },\n onNewPage: (_, pageManager) => {\n const pageState = pageManager.getPageState();\n if (pageState.pageIndex === 0) {\n pageState.pageHeight = height + sectionFooterHeight; // reserve sectionHeaderHeight\n } else {\n pageState.pageHeight =\n height + sectionHeaderHeight + sectionFooterHeight;\n }\n },\n };\n}\n\nexport function shorthand(margin?: PageMargin) {\n return margin\n ? `${margin.top} ${margin.right} ${margin.bottom} ${margin.left}`\n : '0';\n}\n\nexport function lazyPromise<T>(factory: () => Promise<T>): () => Promise<T> {\n let promise: Promise<T> | null = null;\n\n return () => {\n if (!promise) {\n promise = factory();\n }\n return promise;\n };\n}\n\nexport async function jsonDataReader() {\n if (!(paprize_readJsonDataFile in window)) {\n return null;\n }\n\n const strData = await window[paprize_readJsonDataFile]?.();\n return strData ? (JSON.parse(strData) as unknown) : null;\n}\n","import type * as CSS from 'csstype';\nimport {\n pageClassName,\n previewClassName,\n sectionClassName,\n} from '../constants';\nimport type { PageSize, PageMargin } from './pageTypes';\nimport { shorthand } from './utils';\n\nexport const globalStyle = `\n html {\n box-sizing: border-box;\n }\n\n *,\n *:before,\n *:after {\n box-sizing: inherit;\n }\n\n :root {\n --paprize-page-background-color: #ffffff;\n --paprize-page-margin-bottom: 10px;\n --paprize-page-box-shadow: rgb(142 138 138) -1px 3px 5px 2px;\n --paprize-section-margin-bottom: 10px;\n --paprize-preview-background-color: rgb(218 220 224);\n --paprize-preview-padding: 30px 10px;\n }\n\n body {\n margin: 0;\n }\n \n @media screen {\n .${previewClassName} {\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n background-color: var(--paprize-preview-background-color);\n padding: var(--paprize-preview-padding);\n }\n\n .${pageClassName} {\n box-shadow: var(--paprize-page-box-shadow);\n margin-bottom: var(--paprize-page-margin-bottom);\n background-color: var(--paprize-page-background-color);\n }\n\n .${sectionClassName} {\n margin-bottom: var(--paprize-section-margin-bottom);\n }\n }\n\n @media print {\n html:has(.${previewClassName}) *:not(.${previewClassName}):not(.${previewClassName} *):not(:has(.${previewClassName})) {\n display: none !important;\n }\n } \n `;\n\nexport type CSSProperties = CSS.Properties<string | number>;\n\nconst component: CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n};\n\nconst outOfScreen: CSSProperties = {\n position: 'absolute',\n left: '-9999px',\n top: '-9999px',\n visibility: 'hidden',\n};\n\nconst page = (pageSize: PageSize, pageMargin: PageMargin): CSSProperties => ({\n display: 'flex',\n flexDirection: 'column',\n width: pageSize.width,\n height: pageSize.height,\n maxHeight: pageSize.height,\n position: 'relative',\n padding: shorthand(pageMargin),\n zIndex: '1',\n});\n\nconst pageContent: CSSProperties = {\n overflow: 'hidden',\n width: '100%',\n height: '100%',\n};\n\nconst overlay: CSSProperties = {\n position: 'absolute',\n width: '100%',\n height: '100%',\n left: 0,\n top: 0,\n};\n\nconst section = (sectionId: string): CSSProperties => ({\n page: `section-${sectionId}`,\n});\n\nfunction sectionPageMedia(sectionId: string, size: PageSize): string {\n return `@page section-${sectionId} {\n margin: none; \n size:${size.width} ${size.height}; \n width:${size.width};\n height:${size.height};\n }`;\n}\n\nexport const reportStyles = {\n globalStyle,\n component,\n outOfScreen,\n page,\n overlay,\n pageContent,\n sectionPageMedia,\n section,\n};\n","/**\n * Represents the collection of DOM elements generated by\n * the pagination engine from the report components on the current page.\n */\nexport interface SectionComponents {\n /**\n * The HTML element that serves as the header for the entire section.\n * `null` if the section has no section header.\n */\n sectionHeader: HTMLElement | null;\n\n /**\n * The HTML element that serves as the footer for the entire section.\n * `null` if the section has no section footer.\n */\n sectionFooter: HTMLElement | null;\n\n /**\n * The HTML element that serves as the header for this page.\n * `null` if the page has no header.\n */\n pageHeader: HTMLElement | null;\n\n /**\n * The HTML element that serves as the footer for this page.\n * `null` if the page has no footer.\n */\n pageFooter: HTMLElement | null;\n\n /**\n * The main HTML element for the this page content\n * This property is always defined.\n */\n pageContent: HTMLElement;\n}\n\nfunction cloneElement<T extends HTMLElement | null>(element?: T): T {\n return (element?.cloneNode(true) ?? null) as T;\n}\n\nexport function cloneComponents(\n components: SectionComponents\n): SectionComponents {\n return {\n sectionHeader: cloneElement(components.sectionHeader),\n sectionFooter: cloneElement(components.sectionFooter),\n pageHeader: cloneElement(components.pageHeader),\n pageFooter: cloneElement(components.pageFooter),\n pageContent: cloneElement(components.pageContent),\n };\n}\n","import type { DomState } from '../paginate/DomState';\nimport type { PageManager } from '../paginate/PageManager';\nimport type { PageElement } from '../paginate/PageNodes';\nimport type {\n PaginationPlugin,\n VisitContext,\n} from '../paginate/PaginationPlugin';\nimport { SplitResult } from '../paginate/SplitResult';\n\nexport const pageBreakAttributeName = 'data-pz-page-break';\n\nexport class PageBreakPlugin implements PaginationPlugin {\n public name = 'pageBreak';\n public order = 1;\n\n onVisitElement = (\n _id: string,\n domState: DomState & { currentNode: PageElement },\n pageManager: PageManager,\n context: VisitContext\n ) => {\n if (\n domState.currentNode\n .getNode()\n .getAttribute(pageBreakAttributeName) === 'true'\n ) {\n pageManager.markPageAsFull();\n\n // ignore the page break node itself\n context.result = SplitResult.FullNodePlaced;\n }\n };\n}\n","import type { PageManager } from '../paginate/PageManager';\nimport {\n createPageNode,\n PageElement,\n type SafeElement,\n} from '../paginate/PageNodes';\nimport type { PaginationPlugin } from '../paginate/PaginationPlugin';\n\n/**\n * Table plugin options\n */\nexport interface TablePluginOptions {\n /**\n * If true, the table header (thead) will be cloned on each page.\n */\n cloneHeader?: boolean;\n /**\n * If true, the table footer (tfoot) will be cloned on each page.\n */\n cloneFooter?: boolean;\n /**\n * When true, tables containing only a header (no body rows) will not be removed.\n */\n includeHeaderOnlyTables?: boolean;\n}\n\nexport class TablePlugin implements PaginationPlugin {\n private readonly _options: TablePluginOptions = {};\n\n public name = 'table';\n public order = 1;\n\n constructor(options: TablePluginOptions = {}) {\n this._options = options;\n }\n\n onNewPage = (_id: string, pageManager: PageManager) => {\n if (this._options.includeHeaderOnlyTables) {\n return;\n }\n\n const pageState = pageManager.getPageState();\n const tableElement = pageState.parentStack.find((node) =>\n this._isTable(node.getNode())\n );\n if (!tableElement || !tableElement.clonedFrom) {\n return;\n }\n\n // need to check previous page elements, so have to use clonedFrom\n const openTable = tableElement.clonedFrom;\n const openTableNode = openTable.getNode() as HTMLTableElement;\n\n const header = openTableNode.tHead;\n const hasHeader = header !== null;\n if (!hasHeader) {\n return;\n }\n\n const body = openTableNode.tBodies;\n if (!this._isTableBodyEmpty(body)) {\n return;\n }\n\n openTable.remove();\n\n const newTable = tableElement.getNode() as HTMLTableElement;\n if (newTable.tHead === null) {\n const headerNode = createPageNode(\n header.cloneNode(true),\n tableElement.transaction,\n tableElement.config\n );\n tableElement.appendChild(headerNode);\n }\n };\n\n onClone = (_id: string, source: Element, cloned: PageElement) => {\n if (source.tagName === 'TR') {\n cloned.config.keepOnSamePage = true;\n return;\n }\n\n if (\n !this._isTable(source) ||\n !cloned.clonedFrom ||\n cloned.cloneCount === 1\n ) {\n return;\n }\n\n const originalNode = cloned.getOriginalNode() as HTMLTableElement;\n const head = originalNode.tHead;\n if (head && this._options.cloneHeader === true) {\n const clonedHead = new PageElement(\n head.cloneNode(true) as HTMLElement,\n cloned.transaction,\n cloned.config\n );\n cloned.appendChild(clonedHead);\n }\n\n const foot = originalNode.tFoot;\n if (foot && this._options.cloneFooter === true) {\n const clonedFoot = new PageElement(\n foot.cloneNode(true) as HTMLElement,\n cloned.transaction,\n cloned.config\n );\n cloned.appendChild(clonedFoot);\n }\n };\n\n private _isTable(\n element: Element | SafeElement\n ): element is HTMLTableElement {\n return element.tagName === 'TABLE';\n }\n\n private _isTableBodyEmpty(\n body: HTMLCollectionOf<HTMLTableSectionElement>\n ): boolean {\n if (body.length === 0) return true;\n\n const tbody = body[0];\n if (tbody.rows.length !== 1) return false;\n\n const row = tbody.rows[0];\n if (row.cells.length !== 1) return false;\n\n const cell = row.cells[0];\n return cell.textContent.trim() === '';\n }\n}\n","import type { PaginationPlugin } from '../paginate/PaginationPlugin';\nimport { PageBreakPlugin } from './PageBreakPlugin';\nimport { TablePlugin } from './TablePlugin';\n\nexport const defaultPlugins: PaginationPlugin[] = [\n new PageBreakPlugin(),\n new TablePlugin(),\n];\n","import { attributePrefix, pageClassName } from '../constants';\nimport type { PaginationPlugin } from '../paginate/PaginationPlugin';\n\nexport const debugPlugin: PaginationPlugin = {\n name: 'debug',\n order: Number.MAX_SAFE_INTEGER,\n onNewPage: (_, pageManager) => {\n const page = pageManager.getPageState().currentPage.getNode();\n\n if (!page.classList.contains(pageClassName)) {\n page.classList.add(pageClassName);\n }\n\n page.setAttribute(`${attributePrefix}-element`, 'page');\n page.setAttribute(\n `${attributePrefix}-height`,\n pageManager.getPageState().pageHeight.toString()\n );\n },\n};\n","import type { DomState } from '../paginate/DomState';\nimport type { PageManager } from '../paginate/PageManager';\nimport type { PageElement, SafeElement } from '../paginate/PageNodes';\nimport type { PaginationPlugin } from '../paginate/PaginationPlugin';\n\nexport const sectionTocName = 'sectionToc';\n\nexport type SectionTocState = {\n sectionId: string;\n pageIndex: number;\n title: string;\n level: number;\n};\n\nexport class SectionTocPlugin implements PaginationPlugin {\n public readonly name = sectionTocName;\n public readonly order = 1;\n\n private _state: Map<string, SectionTocState[]> = new Map();\n\n public getContentList = (): SectionTocState[] => {\n return Array.from(this._state.values()).flat();\n };\n\n public onVisitElement = (\n id: string,\n domState: DomState & { currentNode: PageElement },\n pageManager: PageManager\n ) => {\n {\n const node = domState.currentNode.getNode();\n const headingLevel = this.getHeadingLevel(node);\n\n if (!headingLevel || !node.textContent) return;\n\n const pageIndex = pageManager.getPageState().pageIndex;\n\n // cleanup state for first page of section\n if (pageIndex === 0) {\n this._state.set(id, []);\n }\n\n this._state.get(id)?.push({\n sectionId: id,\n pageIndex: pageIndex,\n title: node.textContent,\n level: headingLevel,\n });\n }\n };\n\n getHeadingLevel(node: SafeElement): number | null {\n const tagName = node.tagName;\n return /^H[1-6]$/.test(tagName)\n ? parseInt(tagName.charAt(1), 10)\n : null;\n }\n}\n","import { EventDispatcher } from './EventDispatcher';\n\ntype PromiseStatus = 'pending' | 'resolved' | 'rejected';\n\ninterface TrackedPromise {\n promise: Promise<unknown>;\n status: PromiseStatus;\n}\n\nexport interface PromiseTrackerEvents {\n onChange: (pendingCount: number) => void;\n}\n\nexport class PromiseTracker {\n private readonly _promises: TrackedPromise[];\n\n public readonly monitor: EventDispatcher<PromiseTrackerEvents>;\n\n public get promise(): Promise<void> {\n return this._promises.length > 0\n ? Promise.allSettled(this._promises.map((p) => p.promise)).then(\n () => {}\n )\n : Promise.resolve();\n }\n\n public constructor() {\n this._promises = [];\n this.monitor = new EventDispatcher<PromiseTrackerEvents>();\n }\n\n public async add(promises: Promise<unknown>[] = []) {\n this._promises.push(...promises.map(PromiseTracker.toTracked));\n\n // let all microtask queue flush by queuing a macrotask\n await new Promise((resolve) => setTimeout(resolve, 0));\n\n if (this.getPending().length === 0) {\n this.monitor.dispatch('onChange', 0);\n return;\n }\n\n this._promises.forEach((p) => this.injectEvents(p));\n }\n\n private static toTracked(promise: Promise<unknown>): TrackedPromise {\n const tracked: TrackedPromise = {\n promise,\n status: 'pending',\n };\n\n tracked.promise.finally(() => {\n tracked.status = 'resolved';\n });\n\n return tracked;\n }\n\n private async injectEvents(tracked: TrackedPromise) {\n tracked.promise.finally(() => {\n const pending = this.getPending();\n this.monitor.dispatch('onChange', pending.length);\n });\n }\n\n public getPending(): TrackedPromise[] {\n return Array.from(this._promises.values()).filter(\n (p) => p.status === 'pending'\n );\n }\n}\n","import type { PageSize, PageOrientation } from './report/pageTypes';\n\nexport function buildPageId(sectionId: string, pageIndex: number): string {\n return `${sectionId}-${pageIndex + 1}`;\n}\n\nexport function adjustPageSize(\n size: PageSize,\n orientation?: PageOrientation\n): PageSize {\n if (orientation === 'landscape') {\n return { height: size.width, width: size.height };\n }\n\n return size;\n}\n","import { isDebugMode } from '../debugUtilities/debugMode';\nimport { Paginator } from '../paginate/Paginator';\nimport { defaultPlugins } from '../plugins';\nimport { pageMargin } from './pageConst';\nimport type { PageSize, PageMargin, PageOrientation } from './pageTypes';\nimport type { Monitor } from './EventDispatcher';\nimport { EventDispatcher } from './EventDispatcher';\nimport type {\n PageContext,\n ReportBuilderEvents,\n SectionContext,\n} from './ReportBuilderEvents';\nimport { reportStyles } from './reportStyles';\nimport { cloneComponents, type SectionComponents } from './sectionComponents';\nimport {\n calculatePageSizes,\n createSectionPageHeightPlugin,\n jsonDataReader,\n lazyPromise,\n} from './utils';\nimport { paprize_isInitialized, paprize_isReady } from '../window';\nimport { globalStyleId } from '../constants';\nimport { PromiseTracker } from './PromiseTracker';\nimport logger from '../logger';\nimport type { PaginationOptions } from '../paginate/PaginationOptions';\nimport { adjustPageSize } from '../utils';\n\n/**\n * Configuration options for a section.\n * @inlineType PaginationConfig\n */\nexport interface SectionOptions extends Partial<Omit<PaginationOptions, 'id'>> {\n /**\n * Unique id of the section within the report.\n */\n readonly id: string;\n /**\n * Page size used for this section.\n */\n readonly size: PageSize;\n /**\n * Page orientation used for this section.\n * @inlineType PageOrientation\n * @default portrait\n */\n readonly orientation?: PageOrientation;\n /**\n * Page margins for this section.\n */\n readonly margin?: PageMargin;\n /**\n * A list of promises that must be resolved before the section can be paginated.\n */\n readonly suspense?: Promise<unknown>[];\n}\n\nexport interface SectionState {\n options: SectionOptions;\n context: SectionContext;\n components: SectionComponents;\n onPaginationCompleted: (pages: PageContext[]) => void;\n}\n\nconst logPrefix = '\\x1b[43mREPORT\\x1b[0m';\n\n/**\n * Represents the result of a scheduled pagination process.\n */\nexport interface ScheduleResult {\n /**\n * List of all registered sections.\n */\n sections: SectionContext[];\n\n /**\n * If there are any suspended sections, this Promise tracks their state\n * and resolves only after all suspended sections have been resumed\n * and paginated.\n */\n suspension: Promise<void>;\n}\n\n/**\n * The report builder class that contains the logic for handling pagination\n * and managing the report layout.\n */\nexport class ReportBuilder {\n private readonly _sections: Map<string, SectionState>;\n private readonly _monitor: EventDispatcher<ReportBuilderEvents>;\n private _paginationInProgress: boolean;\n private _pendingPaginateResolvers: {\n resolve: (value: ScheduleResult) => void;\n reject: (reason?: unknown) => void;\n }[];\n private _currentAbortController: AbortController | null;\n\n public constructor() {\n this._sections = new Map();\n this._monitor = new EventDispatcher<ReportBuilderEvents>();\n this._paginationInProgress = false;\n this._pendingPaginateResolvers = [];\n this._currentAbortController = null;\n\n window[paprize_isInitialized] = true;\n this._injectStyle(reportStyles.globalStyle);\n }\n\n /**\n * Monitor instance used to subscribe to pagination events.\n * See {@link ReportBuilderEvents} for available event types.\n */\n public get monitor(): Monitor<ReportBuilderEvents> {\n return this._monitor;\n }\n\n /**\n * Removes a section from the registered sections, if it has already been registered in the report.\n */\n public removeSection(sectionId: string): void {\n this._sections.delete(sectionId);\n }\n\n /**\n * Registers a section by its ID, specifying the page size, margins, and other options.\n *\n * @param options - Configuration options for the section.\n * @param components - The DOM components associated with the section.\n * @param onPaginationCompleted - Callback invoked when pagination for the section is completed.\n * @returns `true` if the section was added to the report’s section list, or `false` if it already exists.\n */\n public async tryAddSection(\n options: SectionOptions,\n components: SectionComponents,\n onPaginationCompleted: (pages: PageContext[]) => void\n ): Promise<boolean> {\n if (this._sections.has(options.id)) {\n return false;\n }\n\n const context: SectionContext = {\n sectionIndex: this._sections.size,\n sectionId: options.id,\n isPaginated: false,\n isSuspended: !!options.suspense?.length,\n pages: [],\n };\n this._sections.set(options.id, {\n context,\n options: {\n ...options,\n size: adjustPageSize(\n options.size,\n options.orientation ?? 'portrait'\n ),\n },\n components,\n onPaginationCompleted,\n });\n\n this._injectStyle(\n reportStyles.sectionPageMedia(options.id, options.size)\n );\n\n await this._monitor.dispatch('sectionCreated', context);\n\n return true;\n }\n\n /**\n * Schedules a pagination operation.\n *\n * It is not possible to schedule multiple pagination operations in parallel,\n * as the process involves DOM manipulation, and concurrent modifications\n * could cause conflicts and unexpected results.\n * Each newly scheduled operation is queued and executed sequentially.\n * When a new pagination is scheduled, any ongoing or pending operations\n * will be aborted, and the new pagination will start immediately afterward.\n *\n * @returns A promise that resolves when the first pagination cycle is completed.\n * It does not wait for suspended sections to resolve and be paginated.\n * To wait for all sections to complete pagination, use the\n * `suspension` property of the returned result object.\n */\n public async schedulePagination(): Promise<ScheduleResult> {\n if (this._sections.size === 0) {\n window[paprize_isReady] = true;\n return {\n sections: [],\n suspension: Promise.resolve(),\n };\n }\n\n if (this._paginationInProgress && this._currentAbortController) {\n logger.debug(\n logPrefix,\n `Cancelling previous pagination operation.`\n );\n this._currentAbortController.abort(\n 'Cancelled by new paginate call'\n );\n }\n\n // If pagination is still in progress, queue this request\n if (this._paginationInProgress) {\n return new Promise<ScheduleResult>((resolve, reject) => {\n this._pendingPaginateResolvers.push({ resolve, reject });\n });\n }\n\n return this._executePagination();\n }\n\n /**\n * Retrieves JSON data injected by **@paprize/puppeteer** during server-side rendering (SSR).\n *\n * If no injected data is available, the function returns the provided `defaultData`, or `null` if none is given.\n *\n * ⚠️ **Important Notes:**\n * - This function is **not type-safe** — it performs **no runtime type validation** on the returned data.\n * - It is available **only during server-side rendering** when using **@paprize/puppeteer**.\n * - When used in **client-side rendering** or **development** mode, you should provide a `defaultData` value for testing purposes.\n *\n * @template T - The expected type of the injected JSON data.\n * @param defaultData - Optional fallback value to return if no injected data is found.\n * @returns A promise resolving to the injected JSON data if available, otherwise the provided default value or `null`.\n */\n public async getJsonData<T>(defaultData?: T): Promise<T | null> {\n const json = await this._lazyJsonDataReader().catch(() => defaultData);\n return (json as T) ?? defaultData ?? null;\n }\n\n private _lazyJsonDataReader = lazyPromise(jsonDataReader);\n\n private async _executePagination(): Promise<ScheduleResult> {\n this._paginationInProgress = true;\n this._currentAbortController = new AbortController();\n const abortSignal = this._currentAbortController.signal;\n\n try {\n logger.debug(logPrefix, `Schedule paginate.`);\n\n await document.fonts.ready;\n if (abortSignal.aborted) {\n return new Promise<ScheduleResult>((resolve, reject) => {\n this._pendingPaginateResolvers.push({ resolve, reject });\n });\n }\n\n const trackers: PromiseTracker[] = [];\n for (const state of this._sections.values()) {\n state.context.isPaginated = false;\n\n const tracker = new PromiseTracker();\n await tracker.add(state.options.suspense);\n tracker.monitor.addEventListener('onChange', (pendingCount) => {\n logger.debug(\n logPrefix,\n `${pendingCount} pending promises in section '${state.options.id}'.`\n );\n });\n\n tracker.promise.then(async () => {\n if (abortSignal.aborted) {\n return;\n }\n\n logger.debug(\n logPrefix,\n `Start paginating section '${state.options.id}'.`\n );\n state.context.isSuspended = false;\n this._paginateSection(state);\n });\n\n trackers.push(tracker);\n }\n\n const reportTracker = new PromiseTracker();\n reportTracker.monitor.addEventListener('onChange', async () => {\n logger.debug(logPrefix, 'Report pagination completed.');\n await this._monitor.dispatch('paginationCycleCompleted', {\n sections: [...this._sections.values()].map(\n (s) => s.context\n ),\n });\n });\n\n if (abortSignal.aborted) {\n return new Promise<ScheduleResult>((resolve, reject) => {\n this._pendingPaginateResolvers.push({ resolve, reject });\n });\n }\n\n await reportTracker.add(trackers.map((t) => t.promise));\n\n return {\n sections: [...this._sections.values()].map((s) => s.context),\n suspension: reportTracker.promise.then(() => {\n window[paprize_isReady] = true;\n }),\n };\n } finally {\n this._processPendingPagination();\n this._paginationInProgress = false;\n this._currentAbortController = null;\n }\n }\n\n private async _processPendingPagination() {\n if (this._pendingPaginateResolvers.length === 0) {\n return;\n }\n\n logger.debug(\n logPrefix,\n `Processing ${this._pendingPaginateResolvers.length} pending paginate calls.`\n );\n\n const pendingResolvers = [...this._pendingPaginateResolvers];\n this._pendingPaginateResolvers = [];\n\n const nextResult = await this._executePagination();\n for (const resolver of pendingResolvers) {\n resolver.resolve(nextResult);\n }\n }\n\n private _injectStyle(styleContent: string) {\n let style = document.getElementById(\n globalStyleId\n ) as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement('style');\n style.id = globalStyleId;\n style.textContent = '';\n document.head.appendChild(style);\n }\n\n style.textContent = (style.textContent + styleContent)\n .replace(/\\s+/g, ' ')\n .replace(/\\s*([:;{}])\\s*/g, '$1')\n .trim();\n }\n\n private async _paginateSection(state: SectionState): Promise<void> {\n const temporarilyContainer = document.createElement('div');\n\n Object.assign(\n temporarilyContainer.style,\n reportStyles.page(\n state.options.size,\n state.options.margin ?? pageMargin.None\n )\n );\n\n if (!isDebugMode()) {\n Object.assign(temporarilyContainer.style, reportStyles.outOfScreen);\n }\n\n const components = cloneComponents(state.components);\n\n if (components.sectionHeader) {\n Object.assign(\n components.sectionHeader.style,\n reportStyles.component\n );\n temporarilyContainer.appendChild(components.sectionHeader);\n }\n if (components.pageHeader) {\n Object.assign(components.pageHeader.style, reportStyles.component);\n temporarilyContainer.appendChild(components.pageHeader);\n }\n\n Object.assign(components.pageContent.style, reportStyles.pageContent);\n temporarilyContainer.appendChild(components.pageContent);\n\n if (components.pageFooter) {\n Object.assign(components.pageFooter.style, reportStyles.component);\n temporarilyContainer.appendChild(components.pageFooter);\n }\n if (components.sectionFooter) {\n Object.assign(\n components.sectionFooter.style,\n reportStyles.component\n );\n temporarilyContainer.appendChild(components.sectionFooter);\n }\n\n document.body.appendChild(temporarilyContainer);\n\n const { height, width, sectionHeaderHeight, sectionFooterHeight } =\n calculatePageSizes(\n components.pageContent,\n components.sectionHeader,\n components.sectionFooter\n );\n\n const paginatorResult = Paginator.paginate(\n components.pageContent,\n { height, width },\n {\n id: state.options.id,\n plugins: [\n ...(state.options.plugins ?? defaultPlugins),\n createSectionPageHeightPlugin(\n height,\n sectionHeaderHeight,\n sectionFooterHeight\n ),\n ],\n }\n );\n\n temporarilyContainer.remove();\n const pageContexts = paginatorResult.map((content, index) => ({\n pageIndex: index,\n totalPages: paginatorResult.length,\n sectionId: state.options.id,\n pageContentHtml: content,\n }));\n\n state.onPaginationCompleted(pageContexts);\n\n for (const pageContext of pageContexts) {\n await this._monitor.dispatch('pageCompleted', pageContext);\n }\n\n const sectionContext: SectionContext = {\n ...state.context,\n isPaginated: true,\n isSuspended: false,\n pages: pageContexts,\n };\n this._sections.set(state.options.id, {\n ...state,\n context: sectionContext,\n });\n\n await this._monitor.dispatch('sectionCompleted', sectionContext);\n }\n}\n","const words = [\n 'ad',\n 'adipisicing',\n 'aliqua',\n 'aliquip',\n 'amet',\n 'anim',\n 'aute',\n 'cillum',\n 'commodo',\n 'consectetur',\n 'consequat',\n 'culpa',\n 'cupidatat',\n 'deserunt',\n 'do',\n 'dolor',\n 'dolore',\n 'duis',\n 'ea',\n 'eiusmod',\n 'elit',\n 'enim',\n 'esse',\n 'est',\n 'et',\n 'eu',\n 'ex',\n 'excepteur',\n 'exercitation',\n 'fugiat',\n 'id',\n 'in',\n 'incididunt',\n 'ipsum',\n 'irure',\n 'labore',\n 'laboris',\n 'laborum',\n 'Lorem',\n 'magna',\n 'minim',\n 'mollit',\n 'nisi',\n 'non',\n 'nostrud',\n 'nulla',\n 'occaecat',\n 'officia',\n 'pariatur',\n 'proident',\n 'qui',\n 'quis',\n 'reprehenderit',\n 'sint',\n 'sit',\n 'sunt',\n 'tempor',\n 'ullamco',\n 'ut',\n 'velit',\n 'veniam',\n 'voluptate',\n];\n\nexport function createLoremIpsumParagraph(\n wordCount: number,\n seed: number\n): string {\n if (wordCount <= 0) {\n return '';\n }\n\n const selectedWords: string[] = [];\n const baseSeed = Math.floor(seed * 982451653);\n\n for (let i = 0; i < wordCount; i++) {\n const wordSeed = (baseSeed + i * 2654435761) % Math.pow(2, 32);\n const randomIndex = Math.floor(\n (wordSeed / Math.pow(2, 32)) * words.length\n );\n selectedWords.push(words[randomIndex]);\n }\n\n // capitalize first word and join with spaces\n if (selectedWords.length > 0) {\n selectedWords[0] =\n selectedWords[0].charAt(0).toUpperCase() +\n selectedWords[0].slice(1);\n }\n\n return selectedWords.join(' ') + '.';\n}\n"],"names":["loggerName","tempContainerClassName","currentElementClassName","currentTextClassName","ignoredElementClassName","ignoredTextClassName","globalStyleId","pageClassName","sectionClassName","previewClassName","attributePrefix","debugMode","enableDebugMode","isDebugMode","isElement","node","isTextNode","getVisibleHeight","element","rect","computedStyle","marginTop","marginBottom","moveOffscreen","defaultLayoutOptions","layoutOptionsAttributes","value","layoutOptionsToAttributes","config","map","key","attribute","attributeCache","assignAttribute","reader","attributes","parsedValue","getNodeLayoutOptionsFromAttribute","typedKey","result","defaultPaginationOptions","resolvePaginationOptions","globalConfig","root","definition","module","this","noop","undefinedType","isIE","logMethods","_loggersByName","defaultLogger","bindMethod","obj","methodName","method","traceForIE","realMethod","replaceLoggingMethods","level","i","enableLoggingWhenConsoleArrives","defaultMethodFactory","_level","_loggerName","Logger","name","factory","self","inheritedLevel","defaultLevel","userLevel","storageKey","persistLevelIfPossible","levelNum","levelName","getPersistedLevel","storedLevel","cookie","cookieName","location","clearPersistedLevel","normalizeLevel","input","persist","childName","initialLevel","logger","_log","loglevel","logPrefix","callPluginHook","plugins","hookName","args","a","b","plugin","hook","error","PageNodeType","PageElement","transaction","clonedFrom","current","withChildren","clonedElement","clonedPageElement","PageText","text","createPageNode","DomState","parentsTraversed","Transaction","callback","func","PageState","currentPage","activeElement","currentElement","parentStack","pageIsFull","pageIndex","pageHeight","PageManager","tempContainer","pageSize","pageHtmlElement","page","newPageState","parent","clonedParent","cleanup","popped","pageWidth","state","elementHeight","clonedNode","textNode","newTextNode","SplitResult","paginateElementAcrossPages","currentNode","pageManager","tryPlaceElement","rollback","commit","nextPageResult","paginateTextByWord","splitResult","tokens","token","pendingToken","tokenIndex","currentToken","processToken","originalContent","overflowResult","handleTokenOverflow","leftovers","hyphenation","word","hyphen","appended","char","tentative","Paginator","id","paginator","x","ctx","EventDispatcher","handler","registry","listeners","listener","pageMargin","paprize_isInitialized","paprize_isReady","paprize_readJsonDataFile","getVisibleSize","marginLeft","marginRight","calculatePageSizes","sectionHeader","sectionFooter","height","width","sectionHeaderHeight","sectionFooterHeight","createSectionPageHeightPlugin","_id","_result","domState","_","pageState","shorthand","margin","lazyPromise","promise","jsonDataReader","strData","globalStyle","component","outOfScreen","pageContent","overlay","section","sectionId","sectionPageMedia","size","reportStyles","cloneElement","cloneComponents","components","pageBreakAttributeName","PageBreakPlugin","context","TablePlugin","options","tableElement","openTable","openTableNode","header","body","headerNode","source","cloned","originalNode","head","clonedHead","foot","clonedFoot","tbody","row","defaultPlugins","debugPlugin","sectionTocName","SectionTocPlugin","headingLevel","tagName","PromiseTracker","p","promises","resolve","tracked","pending","buildPageId","adjustPageSize","orientation","ReportBuilder","onPaginationCompleted","reject","defaultData","abortSignal","trackers","tracker","pendingCount","reportTracker","s","t","pendingResolvers","nextResult","resolver","styleContent","style","temporarilyContainer","paginatorResult","pageContexts","content","index","pageContext","sectionContext","words","createLoremIpsumParagraph","wordCount","seed","selectedWords","baseSeed","wordSeed","randomIndex"],"mappings":"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","x_google_ignoreList":[6]}