@paprize/core 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/paprize-core.d.ts +271 -15
- package/dist/paprize-core.js +776 -288
- package/dist/paprize-core.js.map +1 -0
- package/dist/paprize-core.umd.cjs +57 -1
- package/dist/paprize-core.umd.cjs.map +1 -0
- package/package.json +8 -8
|
@@ -0,0 +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]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@paprize/core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"description": "Paginate DOM elements for professional, print-ready reports",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
],
|
|
10
10
|
"main": "./dist/paprize-core.umd.cjs",
|
|
11
11
|
"module": "./dist/paprize-core.js",
|
|
12
|
+
"source": "./src/index.ts",
|
|
12
13
|
"exports": {
|
|
13
14
|
".": {
|
|
14
15
|
"types": "./dist/paprize-core.d.ts",
|
|
@@ -47,14 +48,13 @@
|
|
|
47
48
|
"prepack": "node ../../scripts/prepack.mjs"
|
|
48
49
|
},
|
|
49
50
|
"devDependencies": {
|
|
50
|
-
"@
|
|
51
|
+
"@paprize/config": "*",
|
|
51
52
|
"@vitest/coverage-v8": "^3.2.4",
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"vite": "^7.
|
|
57
|
-
"vite-plugin-checker": "^0.10.2",
|
|
53
|
+
"csstype": "^3.1.3",
|
|
54
|
+
"happy-dom": "^20.0.0",
|
|
55
|
+
"preact": "^10.27.2",
|
|
56
|
+
"typescript": "~5.9.3",
|
|
57
|
+
"vite": "^7.1.9",
|
|
58
58
|
"vitest": "^3.2.4"
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|