@paprize/core 0.0.2 → 0.0.4
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 +41 -5
- package/dist/paprize-core.js +335 -283
- package/dist/paprize-core.js.map +1 -0
- package/dist/paprize-core.umd.cjs +2 -1
- package/dist/paprize-core.umd.cjs.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paprize-core.js","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/debugUtilities/loremIpsum.ts","../src/plugins/pageBreakPlugin.ts","../src/plugins/defaultPlugins.ts","../src/plugins/debugPlugin.ts","../src/plugins/SectionTocPlugin.ts","../src/window.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 pageClassName = 'pz-page';\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 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: any[]) => any)\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 Function)(...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 private readonly _transaction: Transaction;\n\n public readonly type: 'element' = PageNodeType.Element;\n public readonly config: PaginationConfig;\n\n constructor(\n element: Element,\n transaction: Transaction,\n config: PaginationConfig\n ) {\n this._node = element;\n this._transaction = transaction;\n this.config = config;\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 );\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 private readonly _transaction: Transaction;\n\n public readonly type: 'text' = PageNodeType.Text;\n public readonly 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 nextNode() {\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 nextSiblingOrParentSibling(): { 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 firstChildOrNextNode(): { 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.nextNode();\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 let 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.nextNode();\n\n do {\n logger.debug(\n logPrefix,\n 'paginating node',\n this._domState.currentNode\n );\n const result = this.processCurrentNode();\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\n callPluginHook(\n this._config.plugins,\n 'afterVisitNode',\n this._config.id,\n this._domState,\n this._pageManager\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.nextNode();\n }\n\n private handleFullNodePlaced(): void {\n logger.debug(logPrefix, 'node fully paginated');\n\n const { parentsTraversed } =\n this._domState.nextSiblingOrParentSibling();\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.firstChildOrNextNode().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","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 { PaginationPlugin } from '../paginate/PaginationPlugin';\nimport { SplitResult } from '../paginate/SplitResult';\n\nexport const pageBreakAttributeName = 'data-pz-page-break';\nexport const pageBreakPluginName = 'pageBreak';\n\nexport const pageBreakPlugin: PaginationPlugin = {\n name: pageBreakPluginName,\n order: 1,\n onVisitElement: (_, domState, pageManager, context) => {\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 { pageBreakPlugin } from './pageBreakPlugin';\n\nexport const defaultPlugins = [pageBreakPlugin];\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 pageNumber: number;\n title: string;\n level: number;\n};\n\nexport class SectionTocPlugin implements PaginationPlugin {\n public readonly state: SectionTocState[] = [];\n public readonly name = sectionTocName;\n public readonly order = 1;\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 this.state.push({\n sectionId: id,\n pageNumber: pageManager.getPageState().pageIndex + 1,\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_isReady = '__PAPRIZE_IS_READY';\nexport const paprize_readJsonDataFile = '__PAPRIZE_READ_JSON_DATA_FILE';\n\ndeclare global {\n interface Window {\n [paprize_isReady]?: boolean;\n [paprize_readJsonDataFile]?: () => Promise<string>;\n }\n}\n"],"names":["loggerName","tempContainerClassName","currentElementClassName","currentTextClassName","ignoredElementClassName","ignoredTextClassName","pageClassName","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","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","words","createLoremIpsumParagraph","wordCount","seed","selectedWords","baseSeed","wordSeed","randomIndex","pageBreakAttributeName","pageBreakPluginName","pageBreakPlugin","_","domState","context","defaultPlugins","debugPlugin","sectionTocName","SectionTocPlugin","headingLevel","tagName","paprize_isReady","paprize_readJsonDataFile"],"mappings":"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","x_google_ignoreList":[5]}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
(function(l,_){typeof exports=="object"&&typeof module<"u"?_(exports):typeof define=="function"&&define.amd?define(["exports"],_):(l=typeof globalThis<"u"?globalThis:l||self,_(l.paprize_core={}))})(this,(function(l){"use strict";const _="paprize",M="pz-temp-container",oe="pz-current-element",re="pz-current-text",ae="pz-ignored-element",se="pz-ignored-text",le="pz-page",I="data-pz-";let D=!1;const ce=()=>{D=!0},ue=()=>D;function O(n){return n.nodeType===Node.ELEMENT_NODE}function z(n){return n.nodeType===Node.TEXT_NODE}function U(n){const e=n.getBoundingClientRect(),t=getComputedStyle(n),i=parseFloat(t.marginTop)||0,o=parseFloat(t.marginBottom)||0;return e.height+i+o}function de(n){n.style.visibility="hidden",n.style.position="absolute",n.style.left="-9999px",n.style.top="-9999px"}class v{name;defaultValue;_reader;constructor(e,t,i){this.name=e,this._reader=t,this.defaultValue=i}read(e){return this._reader(e)}static createStr(e,t){return new v(e,i=>i,t)}static createBool(e,t){return new v(e,i=>i==="true",t)}}const T={hyphen:v.createStr("hyphen","-"),keepOnSamePage:v.createBool("keep-on-same-page",!1),hyphenationEnabled:v.createBool("hyphenation-enabled",!0)};function ge(n){const e={};for(const t in n){const i=n[t];if(i!==void 0){const o=T[t];e[`${I}${o.name}`]=String(i)}}return e}const pe=Object.fromEntries(Object.entries(T).map(([n,e])=>[n,e.defaultValue])),V=new WeakMap;function q(n){if(!n)return{};if(!(n instanceof Element))return q(n?.parentNode);const e={};for(const o in T){const a=T[o],s=`${I}${a.name}`,f=n.getAttribute(s);f!==null&&(e[o]=a.read(f))}const i={...n.parentNode?V.get(n.parentNode):void 0,...e};return V.set(n,i),i}const j={plugins:[],...pe};function he(n,e){const t=q(n);return{...j,...e,...t}}function fe(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var P={exports:{}},me=P.exports,G;function _e(){return G||(G=1,(function(n){(function(e,t){n.exports?n.exports=t():e.log=t()})(me,function(){var e=function(){},t="undefined",i=typeof window!==t&&typeof window.navigator!==t&&/Trident\/|MSIE /.test(window.navigator.userAgent),o=["trace","debug","info","warn","error"],a={},s=null;function f(c,d){var r=c[d];if(typeof r.bind=="function")return r.bind(c);try{return Function.prototype.bind.call(r,c)}catch{return function(){return Function.prototype.apply.apply(r,[c,arguments])}}}function Pe(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function Le(c){return c==="debug"&&(c="log"),typeof console===t?!1:c==="trace"&&i?Pe:console[c]!==void 0?f(console,c):console.log!==void 0?f(console,"log"):e}function k(){for(var c=this.getLevel(),d=0;d<o.length;d++){var r=o[d];this[r]=d<c?e:this.methodFactory(r,c,this.name)}if(this.log=this.debug,typeof console===t&&c<this.levels.SILENT)return"No console available for logging"}function Ae(c){return function(){typeof console!==t&&(k.call(this),this[c].apply(this,arguments))}}function Fe(c,d,r){return Le(c)||Ae.apply(this,arguments)}function ee(c,d){var r=this,A,$,y,m="loglevel";typeof c=="string"?m+=":"+c:typeof c=="symbol"&&(m=void 0);function Oe(u){var g=(o[u]||"silent").toUpperCase();if(!(typeof window===t||!m)){try{window.localStorage[m]=g;return}catch{}try{window.document.cookie=encodeURIComponent(m)+"="+g+";"}catch{}}}function te(){var u;if(!(typeof window===t||!m)){try{u=window.localStorage[m]}catch{}if(typeof u===t)try{var g=window.document.cookie,F=encodeURIComponent(m),ie=g.indexOf(F+"=");ie!==-1&&(u=/^([^;]+)/.exec(g.slice(ie+F.length+1))[1])}catch{}return r.levels[u]===void 0&&(u=void 0),u}}function Re(){if(!(typeof window===t||!m)){try{window.localStorage.removeItem(m)}catch{}try{window.document.cookie=encodeURIComponent(m)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch{}}}function x(u){var g=u;if(typeof g=="string"&&r.levels[g.toUpperCase()]!==void 0&&(g=r.levels[g.toUpperCase()]),typeof g=="number"&&g>=0&&g<=r.levels.SILENT)return g;throw new TypeError("log.setLevel() called with invalid level: "+u)}r.name=c,r.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},r.methodFactory=d||Fe,r.getLevel=function(){return y??$??A},r.setLevel=function(u,g){return y=x(u),g!==!1&&Oe(y),k.call(r)},r.setDefaultLevel=function(u){$=x(u),te()||r.setLevel(u,!1)},r.resetLevel=function(){y=null,Re(),k.call(r)},r.enableAll=function(u){r.setLevel(r.levels.TRACE,u)},r.disableAll=function(u){r.setLevel(r.levels.SILENT,u)},r.rebuild=function(){if(s!==r&&(A=x(s.getLevel())),k.call(r),s===r)for(var u in a)a[u].rebuild()},A=x(s?s.getLevel():"WARN");var ne=te();ne!=null&&(y=x(ne)),k.call(r)}s=new ee,s.getLogger=function(d){if(typeof d!="symbol"&&typeof d!="string"||d==="")throw new TypeError("You must supply a name when creating a logger.");var r=a[d];return r||(r=a[d]=new ee(d,s.methodFactory)),r};var Ie=typeof window!==t?window.log:void 0;return s.noConflict=function(){return typeof window!==t&&window.log===s&&(window.log=Ie),s},s.getLoggers=function(){return a},s.default=s,s})})(P)),P.exports}var ve=_e();const N=fe(ve),h=N.getLogger(_);h.setDefaultLevel("info");const R="\x1B[46mPLUGIN\x1B[0m";function S(n,e,...t){n.forEach(i=>{const o=i[e];if(o){h.debug(R,`executing plugin ${i.name}:${String(e)}`,t);try{o(...t),h.debug(R,`plugin ${i.name}:${String(e)} executed`,t)}catch(a){h.debug(R,`plugin ${i.name}:${String(e)} failed`,a)}}})}const b={Element:"element",Text:"text"};class B{_node;_transaction;type=b.Element;config;constructor(e,t,i){this._node=e,this._transaction=t,this.config=i}appendChild(e){this._transaction.isActive&&this._transaction.addRollbackCallback(()=>{this._node.removeChild(e.getNode())}),this._node.appendChild(e.getNode())}clone(e){const t=this._node.cloneNode(e),i=new B(t,this._transaction,this.config);return S(this.config.plugins,"onClone",this._node,i),i}getHeight(){return U(this._node)}remove(){this._transaction.addCommitCallback(()=>{this._node.remove()})}isEmpty(){return this._node.innerHTML===""}getChildrenCount(){return this._node.childNodes.length}getNode(){return this._node}}class Ne{_node;_transaction;type=b.Text;config;constructor(e,t,i){this._node=e,this._transaction=t,this.config=i}get textContent(){return this._node.textContent??""}set textContent(e){this._node.textContent=e}remove(){this._transaction.addCommitCallback(()=>{this._node.remove()})}getNode(){return this._node}}function H(n,e,t){if(z(n))return new Ne(n,e,t);if(O(n))return new B(n,e,t);throw new Error("Unsupported node type")}const C="\x1B[106mDOM\x1B[0m";class Se{_transaction;_treeWalker;_config;_completed=!1;_currentNode=null;_previousNode=null;constructor(e,t,i){this._transaction=t,this._config=i,this._treeWalker=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT)}get completed(){return this._completed}get currentNode(){return this._currentNode}get previousNode(){return this._previousNode}nextNode(){this._treeWalker.nextNode()||(this._completed=!0),h.debug(C,"moving to next node"),this.setState()}nextSiblingOrParentSibling(){let e=0;if(this._treeWalker.nextSibling())return h.debug(C,"moving to next sibling node"),this.setState(),{parentsTraversed:e};for(;this._treeWalker.parentNode();)if(e++,this._treeWalker.nextSibling())return h.debug(C,"moving to parent sibling node, traversed:",e),this.setState(),{parentsTraversed:e};return this._completed=!0,{parentsTraversed:e}}firstChildOrNextNode(){return this._treeWalker.firstChild()?(h.debug(C,"moving to first child node"),this.setState(),{parentsTraversed:1}):(this.nextNode(),{parentsTraversed:0})}setState(){this._previousNode=this._currentNode,this._currentNode=H(this._treeWalker.currentNode,this._transaction,he(this._treeWalker.currentNode,this._config)),h.debug(C,"moved to node",{currentNode:this.currentNode,previousNode:this.previousNode})}}class be{_onRollback;_onCommit;isActive;constructor(){this._onRollback=[],this._onCommit=[],this.isActive=!1}start=()=>{if(this.isActive)throw new Error("Transaction already in progress");this.isActive=!0,this._onRollback=[],this._onCommit=[]};addRollbackCallback=e=>{this._onRollback.push(e)};addCommitCallback=e=>{if(!this.isActive){e();return}this._onCommit.push(e)};rollback=()=>{this.isActive&&(this.isActive=!1,this._onRollback.forEach(e=>e()))};commit=()=>{this.isActive&&(this.isActive=!1,this._onCommit.forEach(e=>e()))}}const X="\x1B[102mPAGE\x1B[0m";class E{currentPage;activeElement;currentElement;parentStack;pageIsFull;pageIndex;pageHeight;constructor(e,t,i,o,a,s,f){this.currentPage=e,this.activeElement=t,this.currentElement=i,this.parentStack=o,this.pageIsFull=a,this.pageIndex=s,this.pageHeight=f}static create(e,t,i,o){return new E(e,null,e,t,!1,i,o)}clone=()=>new E(this.currentPage,this.activeElement,this.currentElement,[...this.parentStack],this.pageIsFull,this.pageIndex,this.pageHeight)}class W{_pageState;_transaction;_tempContainer;_config;constructor(e,t,i,o){this._tempContainer=e,this._config=o,this._transaction=i;const a=W.createPageHtmlElement(t.width),s=this.createNewPage(a);this._pageState=E.create(s,[],0,t.height),S(this._config.plugins,"onNewPage",this._pageState)}nextPage(){const e=this.createNewPage(this._pageState.currentPage.getNode().cloneNode(!1)),t=E.create(e,[],this._pageState.pageIndex+1,this._pageState.pageHeight);this.cloneParentStackToNewPage(t),this.cleanupEmptyParent(),this._pageState=t,S(this._config.plugins,"onNewPage",this._pageState)}cloneParentStackToNewPage(e){for(const t of this._pageState.parentStack){const i=t.clone(!1);e.currentElement.appendChild(i),e.currentElement=i,e.parentStack.push(i)}}cleanupEmptyParent(){const e=[...this._pageState.parentStack],t=()=>{for(let i=e.length-1;i>=0;i--){const o=e[i];o.isEmpty()&&o.remove()}};this._transaction.addCommitCallback(t)}enterElement(){if(!this._pageState.activeElement||this._pageState.activeElement.type!==b.Element)throw new Error("Invalid state: activeElement is not an Element");h.debug(X,"entering an element",this._pageState.activeElement),this._pageState.currentElement=this._pageState.activeElement,this._pageState.parentStack.push(this._pageState.activeElement)}leaveElement(){this._pageState.activeElement=null;const e=this._pageState.parentStack.pop();h.debug(X,"leaving a parent element",e);const t=this._pageState.parentStack.at(-1);this._pageState.currentElement=t??this._pageState.currentPage}static createPageHtmlElement(e){const t=document.createElement("div");return t.style.display="flex",t.style.flexDirection="column",t.style.width=`${e}px`,t.style.maxWidth=`${e}px`,t}createNewPage(e){return this._tempContainer.appendChild(e),this._transaction.isActive&&this._transaction.addRollbackCallback(()=>{this._tempContainer.removeChild(e)}),H(e,this._transaction,this._config)}startTransaction(){this._transaction.start();const e=this._pageState.clone();return this._transaction.addRollbackCallback(()=>{this._pageState=e}),this._transaction}hasEmptySpace(e){return!this._pageState.pageIsFull&&this._pageState.currentPage.getHeight()+(e||1)<=this._pageState.pageHeight}isOverFlow(){return this._pageState.currentPage.getHeight()>this._pageState.pageHeight}markPageAsFull(){this._pageState.pageIsFull=!0}appendChild(e,t){const i=e.clone(t);return this._pageState.currentElement.appendChild(i),this._pageState.activeElement=i,i}addTextNode(e){if(this._pageState.activeElement?.type===b.Text)return this._pageState.activeElement;const t=document.createTextNode(e),i=H(t,this._transaction,this._config);return this._pageState.currentElement.appendChild(i),this._pageState.activeElement=i,i}}const p={None:0,FullNodePlaced:1,SplitChildren:2};function ye(n,e){const t=J(n,e);if(t!==p.None)return t;const{rollback:i,commit:o}=e.startTransaction();e.nextPage();const a=J(n,e);return a!==p.None?(o(),a):(i(),h.debug("Element is too big to fit on a page",n),p.None)}function J(n,e){if(e.hasEmptySpace(n.getHeight())){const i=e.appendChild(n,!0);if(e.isOverFlow())i.remove();else return p.FullNodePlaced}if(n.config.keepOnSamePage||n.getChildrenCount()===0)return p.None;const t=e.appendChild(n,!1);return e.isOverFlow()?(t.remove(),p.None):p.SplitChildren}function Ce(n,e){let t=p.FullNodePlaced;const i=n.textContent.split(/(\s+)/).filter(s=>s!=="");let o,a=0;for(;o||a<i.length;){const s=o??i[a],f=Ee(s,e,n.config);f.completed||(t=p.None),f.pendingToken?o=f.pendingToken:(o=void 0,a++)}return t}function Ee(n,e,t){e.hasEmptySpace()||e.nextPage();let i=e.addTextNode("");const o=i.textContent;if(i.textContent+=n,!e.isOverFlow())return{completed:!0};i.textContent=o;const a=we(n,e,t);return{pendingToken:a.leftovers,completed:a.completed}}function we(n,e,t){const{rollback:i,commit:o}=e.startTransaction();if(e.nextPage(),e.addTextNode(n),!e.isOverFlow())return o(),{completed:!0};if(i(),!t.hyphenationEnabled)return h.warn("Hyphenation disabled, skipping oversized token:",n),{completed:!1};const a=ke(n,t.hyphen,e);return{completed:!0,leftovers:a&&a.length>0?a:void 0}}function ke(n,e,t){const i=t.addTextNode("");let o="";for(let a=0;a<n.length;a++){const s=n[a],f=o+s;if(i.textContent=f+e,!t.hasEmptySpace())return i.textContent=o?o+e:"",t.markPageAsFull(),n.slice(a);o=f}return null}const w="\x1B[103mPAGINATOR\x1B[0m";class L{_domState;_pageManager;_transaction;_tempContainer;_config;constructor(e,t,i){this._config={...j,...i},this._tempContainer=L.createTempContainer(),this._transaction=new be,this._domState=new Se(e,this._transaction,this._config),this._pageManager=new W(this._tempContainer,t,this._transaction,this._config)}static createTempContainer(){const e=document.createElement("div");return e.classList.add(M),document.body.appendChild(e),e}static paginate(e,t,i){const o=new L(e,t,i);return o.processAllNodes(),Array.from(o._tempContainer.childNodes).filter(s=>O(s)).map(s=>s.innerHTML)}processAllNodes(){this._domState.nextNode();do{switch(N.debug(w,"paginating node",this._domState.currentNode),this.processCurrentNode()){case p.None:this.handleNodeSkipped();break;case p.FullNodePlaced:this.handleFullNodePlaced();break;case p.SplitChildren:this.handleChildrenSplit();break}S(this._config.plugins,"afterVisitNode",this._domState,this._pageManager)}while(this._domState.completed===!1);N.debug(w,"pagination completed")}handleNodeSkipped(){N.debug(w,"node skipped - couldn't paginate"),this._domState.nextNode()}handleFullNodePlaced(){N.debug(w,"node fully paginated");const{parentsTraversed:e}=this._domState.nextSiblingOrParentSibling();for(let t=0;t<e;t++)this._pageManager.leaveElement()}handleChildrenSplit(){N.debug(w,"node partially paginated - splitting children"),this._domState.firstChildOrNextNode().parentsTraversed===1&&this._domState.previousNode?.type===b.Element&&this._pageManager.enterElement()}processCurrentNode(){if(!this._domState.currentNode)return p.None;if(this._domState.currentNode.type===b.Element){const e={};return S(this._config.plugins,"onVisitElement",this._domState,this._pageManager,e),e.result!==void 0?e.result:ye(this._domState.currentNode,this._pageManager)}else{const e={};return S(this._config.plugins,"onVisitText",this._domState,this._pageManager,e),e.result!==void 0?e.result:Ce(this._domState.currentNode,this._pageManager)}}}const K=["ad","adipisicing","aliqua","aliquip","amet","anim","aute","cillum","commodo","consectetur","consequat","culpa","cupidatat","deserunt","do","dolor","dolore","duis","ea","eiusmod","elit","enim","esse","est","et","eu","ex","excepteur","exercitation","fugiat","id","in","incididunt","ipsum","irure","labore","laboris","laborum","Lorem","magna","minim","mollit","nisi","non","nostrud","nulla","occaecat","officia","pariatur","proident","qui","quis","reprehenderit","sint","sit","sunt","tempor","ullamco","ut","velit","veniam","voluptate"];function xe(n,e){if(n<=0)return"";const t=[],i=Math.floor(e*982451653);for(let o=0;o<n;o++){const a=(i+o*2654435761)%Math.pow(2,32),s=Math.floor(a/Math.pow(2,32)*K.length);t.push(K[s])}return t.length>0&&(t[0]=t[0].charAt(0).toUpperCase()+t[0].slice(1)),t.join(" ")+"."}const Y="data-pz-page-break",Q="pageBreak",Z={name:Q,onVisitElement:(n,e,t)=>{n.currentNode.getNode().getAttribute(Y)==="true"&&(e.markPageAsFull(),t.result=p.FullNodePlaced)}},Te=[Z];l.Paginator=L,l.SplitResult=p,l.attributePrefix=I,l.configToAttributeMap=ge,l.createLoremIpsumParagraph=xe,l.currentElementClassName=oe,l.currentTextClassName=re,l.defaultPlugins=Te,l.enableDebugMode=ce,l.getVisibleHeight=U,l.ignoredElementClassName=ae,l.ignoredTextClassName=se,l.isDebugMode=ue,l.isElement=O,l.isTextNode=z,l.logger=h,l.loggerName=_,l.moveOffscreen=de,l.pageBreakAttributeName=Y,l.pageBreakPlugin=Z,l.pageBreakPluginName=Q,l.pageClassName=le,l.tempContainerClassName=M,Object.defineProperty(l,Symbol.toStringTag,{value:"Module"})}));
|
|
1
|
+
(function(s,_){typeof exports=="object"&&typeof module<"u"?_(exports):typeof define=="function"&&define.amd?define(["exports"],_):(s=typeof globalThis<"u"?globalThis:s||self,_(s["paprize-core"]={}))})(this,(function(s){"use strict";const _="paprize",M="pz-temp-container",ae="pz-current-element",se="pz-current-text",le="pz-ignored-element",ce="pz-ignored-text",R="pz-page",v="data-pz-";let z=!1;const de=()=>{z=!0},ue=()=>z;function O(i){return i.nodeType===Node.ELEMENT_NODE}function U(i){return i.nodeType===Node.TEXT_NODE}function V(i){const e=i.getBoundingClientRect(),t=getComputedStyle(i),n=parseFloat(t.marginTop)||0,o=parseFloat(t.marginBottom)||0;return e.height+n+o}function ge(i){i.style.visibility="hidden",i.style.position="absolute",i.style.left="-9999px",i.style.top="-9999px"}class N{name;defaultValue;_reader;constructor(e,t,n){this.name=e,this._reader=t,this.defaultValue=n}read(e){return this._reader(e)}static createStr(e,t){return new N(e,n=>n,t)}static createBool(e,t){return new N(e,n=>n==="true",t)}}const x={hyphen:N.createStr("hyphen","-"),keepOnSamePage:N.createBool("keep-on-same-page",!1),hyphenationEnabled:N.createBool("hyphenation-enabled",!0)};function pe(i){const e={};for(const t in i){const n=i[t];if(n!==void 0){const o=x[t];e[`${v}${o.name}`]=String(n)}}return e}const he=Object.fromEntries(Object.entries(x).map(([i,e])=>[i,e.defaultValue])),q=new WeakMap;function G(i){if(!i)return{};if(!(i instanceof Element))return G(i?.parentNode);const e={};for(const o in x){const r=x[o],l=`${v}${r.name}`,f=i.getAttribute(l);f!==null&&(e[o]=r.read(f))}const n={...i.parentNode?q.get(i.parentNode):void 0,...e};return q.set(i,n),n}const j={id:"default",plugins:[],...he};function fe(i,e){const t=G(i);return{...j,...e,...t}}function me(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var A={exports:{}},_e=A.exports,J;function ve(){return J||(J=1,(function(i){(function(e,t){i.exports?i.exports=t():e.log=t()})(_e,function(){var e=function(){},t="undefined",n=typeof window!==t&&typeof window.navigator!==t&&/Trident\/|MSIE /.test(window.navigator.userAgent),o=["trace","debug","info","warn","error"],r={},l=null;function f(c,u){var a=c[u];if(typeof a.bind=="function")return a.bind(c);try{return Function.prototype.bind.call(a,c)}catch{return function(){return Function.prototype.apply.apply(a,[c,arguments])}}}function Re(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function Oe(c){return c==="debug"&&(c="log"),typeof console===t?!1:c==="trace"&&n?Re:console[c]!==void 0?f(console,c):console.log!==void 0?f(console,"log"):e}function T(){for(var c=this.getLevel(),u=0;u<o.length;u++){var a=o[u];this[a]=u<c?e:this.methodFactory(a,c,this.name)}if(this.log=this.debug,typeof console===t&&c<this.levels.SILENT)return"No console available for logging"}function Be(c){return function(){typeof console!==t&&(T.call(this),this[c].apply(this,arguments))}}function He(c,u,a){return Oe(c)||Be.apply(this,arguments)}function ne(c,u){var a=this,F,W,E,m="loglevel";typeof c=="string"?m+=":"+c:typeof c=="symbol"&&(m=void 0);function De(d){var g=(o[d]||"silent").toUpperCase();if(!(typeof window===t||!m)){try{window.localStorage[m]=g;return}catch{}try{window.document.cookie=encodeURIComponent(m)+"="+g+";"}catch{}}}function ie(){var d;if(!(typeof window===t||!m)){try{d=window.localStorage[m]}catch{}if(typeof d===t)try{var g=window.document.cookie,I=encodeURIComponent(m),re=g.indexOf(I+"=");re!==-1&&(d=/^([^;]+)/.exec(g.slice(re+I.length+1))[1])}catch{}return a.levels[d]===void 0&&(d=void 0),d}}function We(){if(!(typeof window===t||!m)){try{window.localStorage.removeItem(m)}catch{}try{window.document.cookie=encodeURIComponent(m)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch{}}}function k(d){var g=d;if(typeof g=="string"&&a.levels[g.toUpperCase()]!==void 0&&(g=a.levels[g.toUpperCase()]),typeof g=="number"&&g>=0&&g<=a.levels.SILENT)return g;throw new TypeError("log.setLevel() called with invalid level: "+d)}a.name=c,a.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},a.methodFactory=u||He,a.getLevel=function(){return E??W??F},a.setLevel=function(d,g){return E=k(d),g!==!1&&De(E),T.call(a)},a.setDefaultLevel=function(d){W=k(d),ie()||a.setLevel(d,!1)},a.resetLevel=function(){E=null,We(),T.call(a)},a.enableAll=function(d){a.setLevel(a.levels.TRACE,d)},a.disableAll=function(d){a.setLevel(a.levels.SILENT,d)},a.rebuild=function(){if(l!==a&&(F=k(l.getLevel())),T.call(a),l===a)for(var d in r)r[d].rebuild()},F=k(l?l.getLevel():"WARN");var oe=ie();oe!=null&&(E=k(oe)),T.call(a)}l=new ne,l.getLogger=function(u){if(typeof u!="symbol"&&typeof u!="string"||u==="")throw new TypeError("You must supply a name when creating a logger.");var a=r[u];return a||(a=r[u]=new ne(u,l.methodFactory)),a};var $e=typeof window!==t?window.log:void 0;return l.noConflict=function(){return typeof window!==t&&window.log===l&&(window.log=$e),l},l.getLoggers=function(){return r},l.default=l,l})})(A)),A.exports}var Ne=ve();const S=me(Ne),h=S.getLogger(_);h.setDefaultLevel("info");const B="\x1B[46mPLUGIN\x1B[0m";function b(i,e,...t){i.sort((n,o)=>n.order-o.order).forEach(n=>{const o=n[e];if(o){h.debug(B,`executing plugin ${n.name}:${String(e)} ()`,t);try{o(...t),h.debug(B,`plugin ${n.name}:${String(e)} executed`,t)}catch(r){h.debug(B,`plugin ${n.name}:${String(e)} failed`,r)}}})}const y={Element:"element",Text:"text"};class H{_node;_transaction;type=y.Element;config;constructor(e,t,n){this._node=e,this._transaction=t,this.config=n}appendChild(e){this._transaction.isActive&&this._transaction.addRollbackCallback(()=>{this._node.removeChild(e.getNode())}),this._node.appendChild(e.getNode())}clone(e){const t=this._node.cloneNode(e),n=new H(t,this._transaction,this.config);return b(this.config.plugins,"onClone",this.config.id,this._node,n),n}getHeight(){return V(this._node)}remove(){this._transaction.addCommitCallback(()=>{this._node.remove()})}isEmpty(){return this._node.innerHTML===""}getChildrenCount(){return this._node.childNodes.length}getNode(){return this._node}}class Se{_node;_transaction;type=y.Text;config;constructor(e,t,n){this._node=e,this._transaction=t,this.config=n}get textContent(){return this._node.textContent??""}set textContent(e){this._node.textContent=e}remove(){this._transaction.addCommitCallback(()=>{this._node.remove()})}getNode(){return this._node}}function $(i,e,t){if(U(i))return new Se(i,e,t);if(O(i))return new H(i,e,t);throw new Error("Unsupported node type")}const C="\x1B[106mDOM\x1B[0m";class be{_transaction;_treeWalker;_config;_completed=!1;_currentNode=null;_previousNode=null;constructor(e,t,n){this._transaction=t,this._config=n,this._treeWalker=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT)}get completed(){return this._completed}get currentNode(){return this._currentNode}get previousNode(){return this._previousNode}nextNode(){this._treeWalker.nextNode()||(this._completed=!0),h.debug(C,"moving to next node"),this.setState()}nextSiblingOrParentSibling(){let e=0;if(this._treeWalker.nextSibling())return h.debug(C,"moving to next sibling node"),this.setState(),{parentsTraversed:e};for(;this._treeWalker.parentNode();)if(e++,this._treeWalker.nextSibling())return h.debug(C,"moving to parent sibling node, traversed:",e),this.setState(),{parentsTraversed:e};return this._completed=!0,{parentsTraversed:e}}firstChildOrNextNode(){return this._treeWalker.firstChild()?(h.debug(C,"moving to first child node"),this.setState(),{parentsTraversed:1}):(this.nextNode(),{parentsTraversed:0})}setState(){this._previousNode=this._currentNode,this._currentNode=$(this._treeWalker.currentNode,this._transaction,fe(this._treeWalker.currentNode,this._config)),h.debug(C,"moved to node",{currentNode:this.currentNode,previousNode:this.previousNode})}}class ye{_onRollback;_onCommit;isActive;constructor(){this._onRollback=[],this._onCommit=[],this.isActive=!1}start=()=>{if(this.isActive)throw new Error("Transaction already in progress");this.isActive=!0,this._onRollback=[],this._onCommit=[]};addRollbackCallback=e=>{this._onRollback.push(e)};addCommitCallback=e=>{if(!this.isActive){e();return}this._onCommit.push(e)};rollback=()=>{this.isActive&&(this.isActive=!1,this._onRollback.forEach(e=>e()))};commit=()=>{this.isActive&&(this.isActive=!1,this._onCommit.forEach(e=>e()))}}const X="\x1B[102mPAGE\x1B[0m";class w{currentPage;activeElement;currentElement;parentStack;pageIsFull;pageIndex;pageHeight;constructor(e,t,n,o,r,l,f){this.currentPage=e,this.activeElement=t,this.currentElement=n,this.parentStack=o,this.pageIsFull=r,this.pageIndex=l,this.pageHeight=f}static create(e,t,n,o){return new w(e,null,e,t,!1,n,o)}clone=()=>new w(this.currentPage,this.activeElement,this.currentElement,[...this.parentStack],this.pageIsFull,this.pageIndex,this.pageHeight)}class D{_pageState;_transaction;_tempContainer;_config;constructor(e,t,n,o){this._tempContainer=e,this._config=o,this._transaction=n;const r=D.createPageHtmlElement(t.width),l=this.createNewPage(r);this._pageState=w.create(l,[],0,t.height),b(this._config.plugins,"onNewPage",o.id,this)}nextPage(){const e=this.createNewPage(this._pageState.currentPage.getNode().cloneNode(!1)),t=w.create(e,[],this._pageState.pageIndex+1,this._pageState.pageHeight);this.cloneParentStackToNewPage(t),this.cleanupEmptyParent(),this._pageState=t,b(this._config.plugins,"onNewPage",this._config.id,this)}cloneParentStackToNewPage(e){for(const t of this._pageState.parentStack){const n=t.clone(!1);e.currentElement.appendChild(n),e.currentElement=n,e.parentStack.push(n)}}cleanupEmptyParent(){const e=[...this._pageState.parentStack],t=()=>{for(let n=e.length-1;n>=0;n--){const o=e[n];o.isEmpty()&&o.remove()}};this._transaction.addCommitCallback(t)}enterElement(){if(!this._pageState.activeElement||this._pageState.activeElement.type!==y.Element)throw new Error("Invalid state: activeElement is not an Element");h.debug(X,"entering an element",this._pageState.activeElement),this._pageState.currentElement=this._pageState.activeElement,this._pageState.parentStack.push(this._pageState.activeElement)}leaveElement(){this._pageState.activeElement=null;const e=this._pageState.parentStack.pop();h.debug(X,"leaving a parent element",e);const t=this._pageState.parentStack.at(-1);this._pageState.currentElement=t??this._pageState.currentPage}static createPageHtmlElement(e){const t=document.createElement("div");return t.style.width=`${e}px`,t.style.maxWidth=`${e}px`,t}createNewPage(e){return this._tempContainer.appendChild(e),this._transaction.isActive&&this._transaction.addRollbackCallback(()=>{this._tempContainer.removeChild(e)}),$(e,this._transaction,this._config)}startTransaction(){this._transaction.start();const e=this._pageState.clone();return this._transaction.addRollbackCallback(()=>{this._pageState=e}),this._transaction}hasEmptySpace(e){return!this._pageState.pageIsFull&&this._pageState.currentPage.getHeight()+(e||1e-4)<=this._pageState.pageHeight}isOverFlow(){return this._pageState.currentPage.getHeight()>this._pageState.pageHeight}markPageAsFull(){this._pageState.pageIsFull=!0}appendChild(e,t){const n=e.clone(t);return this._pageState.currentElement.appendChild(n),this._pageState.activeElement=n,n}addTextNode(e){if(this._pageState.activeElement?.type===y.Text)return this._pageState.activeElement;const t=document.createTextNode(e),n=$(t,this._transaction,this._config);return this._pageState.currentElement.appendChild(n),this._pageState.activeElement=n,n}getPageState(){return this._pageState}}const p={None:0,FullNodePlaced:1,SplitChildren:2};function Ee(i,e){const t=Y(i,e);if(t!==p.None)return t;const{rollback:n,commit:o}=e.startTransaction();e.nextPage();const r=Y(i,e);return r!==p.None?(o(),r):(n(),h.debug("Element is too big to fit on a page",i),p.None)}function Y(i,e){if(e.hasEmptySpace(i.getHeight())){const n=e.appendChild(i,!0);if(e.isOverFlow())n.remove();else return p.FullNodePlaced}if(i.config.keepOnSamePage||i.getChildrenCount()===0)return p.None;const t=e.appendChild(i,!1);return e.isOverFlow()?(t.remove(),p.None):p.SplitChildren}function Ce(i,e){let t=p.FullNodePlaced;const n=i.textContent.split(/(\s+)/).filter(l=>l!=="");let o,r=0;for(;o||r<n.length;){const l=o??n[r],f=we(l,e,i.config);f.completed||(t=p.None),f.pendingToken?o=f.pendingToken:(o=void 0,r++)}return t}function we(i,e,t){e.hasEmptySpace()||e.nextPage();let n=e.addTextNode("");const o=n.textContent;if(n.textContent+=i,!e.isOverFlow())return{completed:!0};n.textContent=o;const r=Pe(i,e,t);return{pendingToken:r.leftovers,completed:r.completed}}function Pe(i,e,t){const{rollback:n,commit:o}=e.startTransaction();if(e.nextPage(),e.addTextNode(i),!e.isOverFlow())return o(),{completed:!0};if(n(),!t.hyphenationEnabled)return h.warn("Hyphenation disabled, skipping oversized token:",i),{completed:!1};const r=Te(i,t.hyphen,e);return{completed:!0,leftovers:r&&r.length>0?r:void 0}}function Te(i,e,t){const n=t.addTextNode("");let o="";for(let r=0;r<i.length;r++){const l=i[r],f=o+l;if(n.textContent=f+e,!t.hasEmptySpace())return n.textContent=o?o+e:"",t.markPageAsFull(),i.slice(r);o=f}return null}const P="\x1B[103mPAGINATOR\x1B[0m";class L{_domState;_pageManager;_transaction;_tempContainer;_config;constructor(e,t,n){this._config={...j,...n},this._tempContainer=L.createTempContainer(this._config.id),this._transaction=new ye,this._domState=new be(e,this._transaction,this._config),this._pageManager=new D(this._tempContainer,t,this._transaction,this._config)}static createTempContainer(e){const t=document.createElement("div");return t.style.display="flex",t.style.flexDirection="column",t.style.gap="20px",t.setAttribute(`${v}-section-id`,e),t.classList.add(M),document.body.appendChild(t),t}static paginate(e,t,n){const o=new L(e,t,n);return o.processAllNodes(),Array.from(o._tempContainer.childNodes).filter(l=>O(l)).map(l=>l.innerHTML)}processAllNodes(){this._domState.nextNode();do{switch(S.debug(P,"paginating node",this._domState.currentNode),this.processCurrentNode()){case p.None:this.handleNodeSkipped();break;case p.FullNodePlaced:this.handleFullNodePlaced();break;case p.SplitChildren:this.handleChildrenSplit();break}b(this._config.plugins,"afterVisitNode",this._config.id,this._domState,this._pageManager)}while(this._domState.completed===!1);S.debug(P,"pagination completed")}handleNodeSkipped(){S.debug(P,"node skipped - couldn't paginate"),this._domState.nextNode()}handleFullNodePlaced(){S.debug(P,"node fully paginated");const{parentsTraversed:e}=this._domState.nextSiblingOrParentSibling();for(let t=0;t<e;t++)this._pageManager.leaveElement()}handleChildrenSplit(){S.debug(P,"node partially paginated - splitting children"),this._domState.firstChildOrNextNode().parentsTraversed===1&&this._domState.previousNode?.type===y.Element&&this._pageManager.enterElement()}processCurrentNode(){if(!this._domState.currentNode)return p.None;if(this._domState.currentNode.type===y.Element){const e={};return b(this._config.plugins,"onVisitElement",this._config.id,this._domState,this._pageManager,e),e.result!==void 0?e.result:Ee(this._domState.currentNode,this._pageManager)}else{const e={};return b(this._config.plugins,"onVisitText",this._config.id,this._domState,this._pageManager,e),e.result!==void 0?e.result:Ce(this._domState.currentNode,this._pageManager)}}}const Z=["ad","adipisicing","aliqua","aliquip","amet","anim","aute","cillum","commodo","consectetur","consequat","culpa","cupidatat","deserunt","do","dolor","dolore","duis","ea","eiusmod","elit","enim","esse","est","et","eu","ex","excepteur","exercitation","fugiat","id","in","incididunt","ipsum","irure","labore","laboris","laborum","Lorem","magna","minim","mollit","nisi","non","nostrud","nulla","occaecat","officia","pariatur","proident","qui","quis","reprehenderit","sint","sit","sunt","tempor","ullamco","ut","velit","veniam","voluptate"];function ke(i,e){if(i<=0)return"";const t=[],n=Math.floor(e*982451653);for(let o=0;o<i;o++){const r=(n+o*2654435761)%Math.pow(2,32),l=Math.floor(r/Math.pow(2,32)*Z.length);t.push(Z[l])}return t.length>0&&(t[0]=t[0].charAt(0).toUpperCase()+t[0].slice(1)),t.join(" ")+"."}const K="data-pz-page-break",Q="pageBreak",ee={name:Q,order:1,onVisitElement:(i,e,t,n)=>{e.currentNode.getNode().getAttribute(K)==="true"&&(t.markPageAsFull(),n.result=p.FullNodePlaced)}},xe=[ee],Ae={name:"debug",order:Number.MAX_SAFE_INTEGER,onNewPage:(i,e)=>{const t=e.getPageState().currentPage.getNode();t.classList.contains(R)||t.classList.add(R),t.setAttribute(`${v}-element`,"page"),t.setAttribute(`${v}-height`,e.getPageState().pageHeight.toString())}},te="sectionToc";class Le{state=[];name=te;order=1;onVisitElement=(e,t,n)=>{{const o=t.currentNode.getNode(),r=this.getHeadingLevel(o);if(!r||!o.textContent)return;this.state.push({sectionId:e,pageNumber:n.getPageState().pageIndex+1,title:o.textContent,level:r})}};getHeadingLevel(e){const t=e.tagName;return/^H[1-6]$/.test(t)?parseInt(t.charAt(1),10):null}}const Fe="__PAPRIZE_IS_READY",Ie="__PAPRIZE_READ_JSON_DATA_FILE";s.Paginator=L,s.SectionTocPlugin=Le,s.SplitResult=p,s.attributePrefix=v,s.configToAttributeMap=pe,s.createLoremIpsumParagraph=ke,s.currentElementClassName=ae,s.currentTextClassName=se,s.debugPlugin=Ae,s.defaultPlugins=xe,s.enableDebugMode=de,s.getVisibleHeight=V,s.ignoredElementClassName=le,s.ignoredTextClassName=ce,s.isDebugMode=ue,s.isElement=O,s.isTextNode=U,s.logger=h,s.loggerName=_,s.moveOffscreen=ge,s.pageBreakAttributeName=K,s.pageBreakPlugin=ee,s.pageBreakPluginName=Q,s.pageClassName=R,s.paprize_isReady=Fe,s.paprize_readJsonDataFile=Ie,s.sectionTocName=te,s.tempContainerClassName=M,Object.defineProperty(s,Symbol.toStringTag,{value:"Module"})}));
|
|
2
|
+
//# sourceMappingURL=paprize-core.umd.cjs.map
|
|
@@ -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/debugUtilities/loremIpsum.ts","../src/plugins/pageBreakPlugin.ts","../src/plugins/defaultPlugins.ts","../src/plugins/debugPlugin.ts","../src/plugins/SectionTocPlugin.ts","../src/window.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 pageClassName = 'pz-page';\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 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: any[]) => any)\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 Function)(...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 private readonly _transaction: Transaction;\n\n public readonly type: 'element' = PageNodeType.Element;\n public readonly config: PaginationConfig;\n\n constructor(\n element: Element,\n transaction: Transaction,\n config: PaginationConfig\n ) {\n this._node = element;\n this._transaction = transaction;\n this.config = config;\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 );\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 private readonly _transaction: Transaction;\n\n public readonly type: 'text' = PageNodeType.Text;\n public readonly 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 nextNode() {\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 nextSiblingOrParentSibling(): { 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 firstChildOrNextNode(): { 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.nextNode();\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 let 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.nextNode();\n\n do {\n logger.debug(\n logPrefix,\n 'paginating node',\n this._domState.currentNode\n );\n const result = this.processCurrentNode();\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\n callPluginHook(\n this._config.plugins,\n 'afterVisitNode',\n this._config.id,\n this._domState,\n this._pageManager\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.nextNode();\n }\n\n private handleFullNodePlaced(): void {\n logger.debug(logPrefix, 'node fully paginated');\n\n const { parentsTraversed } =\n this._domState.nextSiblingOrParentSibling();\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.firstChildOrNextNode().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","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 { PaginationPlugin } from '../paginate/PaginationPlugin';\nimport { SplitResult } from '../paginate/SplitResult';\n\nexport const pageBreakAttributeName = 'data-pz-page-break';\nexport const pageBreakPluginName = 'pageBreak';\n\nexport const pageBreakPlugin: PaginationPlugin = {\n name: pageBreakPluginName,\n order: 1,\n onVisitElement: (_, domState, pageManager, context) => {\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 { pageBreakPlugin } from './pageBreakPlugin';\n\nexport const defaultPlugins = [pageBreakPlugin];\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 pageNumber: number;\n title: string;\n level: number;\n};\n\nexport class SectionTocPlugin implements PaginationPlugin {\n public readonly state: SectionTocState[] = [];\n public readonly name = sectionTocName;\n public readonly order = 1;\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 this.state.push({\n sectionId: id,\n pageNumber: pageManager.getPageState().pageIndex + 1,\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_isReady = '__PAPRIZE_IS_READY';\nexport const paprize_readJsonDataFile = '__PAPRIZE_READ_JSON_DATA_FILE';\n\ndeclare global {\n interface Window {\n [paprize_isReady]?: boolean;\n [paprize_readJsonDataFile]?: () => Promise<string>;\n }\n}\n"],"names":["loggerName","tempContainerClassName","currentElementClassName","currentTextClassName","ignoredElementClassName","ignoredTextClassName","pageClassName","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","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","words","createLoremIpsumParagraph","wordCount","seed","selectedWords","baseSeed","wordSeed","randomIndex","pageBreakAttributeName","pageBreakPluginName","pageBreakPlugin","_","domState","context","defaultPlugins","debugPlugin","sectionTocName","SectionTocPlugin","headingLevel","tagName","paprize_isReady","paprize_readJsonDataFile"],"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.4",
|
|
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",
|