@paprize/core 0.0.3 → 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.
@@ -198,6 +198,10 @@ export declare class Paginator {
198
198
  private processCurrentNode;
199
199
  }
200
200
 
201
+ export declare const paprize_isReady = "__PAPRIZE_IS_READY";
202
+
203
+ export declare const paprize_readJsonDataFile = "__PAPRIZE_READ_JSON_DATA_FILE";
204
+
201
205
  declare type PluginHookNames = NonNullable<PluginKeys>;
202
206
 
203
207
  declare type PluginKeys = {
@@ -254,3 +258,11 @@ export declare interface VisitContext {
254
258
  }
255
259
 
256
260
  export { }
261
+
262
+
263
+ declare global {
264
+ interface Window {
265
+ [paprize_isReady]?: boolean;
266
+ [paprize_readJsonDataFile]?: () => Promise<string>;
267
+ }
268
+ }
@@ -1,9 +1,9 @@
1
- const re = "paprize", ae = "pz-temp-container", ke = "pz-current-element", Te = "pz-current-text", Pe = "pz-ignored-element", Le = "pz-ignored-text", D = "pz-page", x = "data-pz-";
2
- let X = !1;
3
- const Ae = () => {
4
- X = !0;
5
- }, Fe = () => X;
6
- function j(i) {
1
+ const re = "paprize", ae = "pz-temp-container", Pe = "pz-current-element", Te = "pz-current-text", ke = "pz-ignored-element", Ae = "pz-ignored-text", M = "pz-page", x = "data-pz-";
2
+ let J = !1;
3
+ const Le = () => {
4
+ J = !0;
5
+ }, Fe = () => J;
6
+ function X(i) {
7
7
  return i.nodeType === Node.ELEMENT_NODE;
8
8
  }
9
9
  function se(i) {
@@ -37,7 +37,7 @@ class v {
37
37
  );
38
38
  }
39
39
  }
40
- const L = {
40
+ const A = {
41
41
  hyphen: v.createStr("hyphen", "-"),
42
42
  keepOnSamePage: v.createBool("keep-on-same-page", !1),
43
43
  hyphenationEnabled: v.createBool(
@@ -50,46 +50,46 @@ function Re(i) {
50
50
  for (const t in i) {
51
51
  const n = i[t];
52
52
  if (n !== void 0) {
53
- const o = L[t];
53
+ const o = A[t];
54
54
  e[`${x}${o.name}`] = String(n);
55
55
  }
56
56
  }
57
57
  return e;
58
58
  }
59
59
  const ce = Object.fromEntries(
60
- Object.entries(L).map(([i, e]) => [
60
+ Object.entries(A).map(([i, e]) => [
61
61
  i,
62
62
  e.defaultValue
63
63
  ])
64
- ), U = /* @__PURE__ */ new WeakMap();
65
- function J(i) {
64
+ ), z = /* @__PURE__ */ new WeakMap();
65
+ function j(i) {
66
66
  if (!i)
67
67
  return {};
68
68
  if (!(i instanceof Element))
69
- return J(i?.parentNode);
69
+ return j(i?.parentNode);
70
70
  const e = {};
71
- for (const o in L) {
72
- const r = L[o], s = `${x}${r.name}`, g = i.getAttribute(s);
71
+ for (const o in A) {
72
+ const r = A[o], s = `${x}${r.name}`, g = i.getAttribute(s);
73
73
  g !== null && (e[o] = r.read(g));
74
74
  }
75
- const n = { ...i.parentNode ? U.get(i.parentNode) : void 0, ...e };
76
- return U.set(i, n), n;
75
+ const n = { ...i.parentNode ? z.get(i.parentNode) : void 0, ...e };
76
+ return z.set(i, n), n;
77
77
  }
78
- const K = {
78
+ const Y = {
79
79
  id: "default",
80
80
  plugins: [],
81
81
  ...ce
82
82
  };
83
83
  function de(i, e) {
84
- const t = J(i);
85
- return { ...K, ...e, ...t };
84
+ const t = j(i);
85
+ return { ...Y, ...e, ...t };
86
86
  }
87
87
  function ue(i) {
88
88
  return i && i.__esModule && Object.prototype.hasOwnProperty.call(i, "default") ? i.default : i;
89
89
  }
90
- var P = { exports: {} }, ge = P.exports, z;
90
+ var k = { exports: {} }, ge = k.exports, U;
91
91
  function pe() {
92
- return z || (z = 1, (function(i) {
92
+ return U || (U = 1, (function(i) {
93
93
  (function(e, t) {
94
94
  i.exports ? i.exports = t() : e.log = t();
95
95
  })(ge, function() {
@@ -113,11 +113,11 @@ function pe() {
113
113
  };
114
114
  }
115
115
  }
116
- function Y() {
116
+ function Z() {
117
117
  console.log && (console.log.apply ? console.log.apply(console, arguments) : Function.prototype.apply.apply(console.log, [console, arguments])), console.trace && console.trace();
118
118
  }
119
- function Q(l) {
120
- return l === "debug" && (l = "log"), typeof console === t ? !1 : l === "trace" && n ? Y : console[l] !== void 0 ? g(console, l) : console.log !== void 0 ? g(console, "log") : e;
119
+ function K(l) {
120
+ return l === "debug" && (l = "log"), typeof console === t ? !1 : l === "trace" && n ? Z : console[l] !== void 0 ? g(console, l) : console.log !== void 0 ? g(console, "log") : e;
121
121
  }
122
122
  function b() {
123
123
  for (var l = this.getLevel(), d = 0; d < o.length; d++) {
@@ -127,16 +127,16 @@ function pe() {
127
127
  if (this.log = this.debug, typeof console === t && l < this.levels.SILENT)
128
128
  return "No console available for logging";
129
129
  }
130
- function Z(l) {
130
+ function Q(l) {
131
131
  return function() {
132
132
  typeof console !== t && (b.call(this), this[l].apply(this, arguments));
133
133
  };
134
134
  }
135
135
  function ee(l, d, a) {
136
- return Q(l) || Z.apply(this, arguments);
136
+ return K(l) || Q.apply(this, arguments);
137
137
  }
138
138
  function $(l, d) {
139
- var a = this, k, A, m, f = "loglevel";
139
+ var a = this, P, L, m, f = "loglevel";
140
140
  typeof l == "string" ? f += ":" + l : typeof l == "symbol" && (f = void 0);
141
141
  function ne(c) {
142
142
  var u = (o[c] || "silent").toUpperCase();
@@ -161,9 +161,9 @@ function pe() {
161
161
  }
162
162
  if (typeof c === t)
163
163
  try {
164
- var u = window.document.cookie, T = encodeURIComponent(f), M = u.indexOf(T + "=");
165
- M !== -1 && (c = /^([^;]+)/.exec(
166
- u.slice(M + T.length + 1)
164
+ var u = window.document.cookie, T = encodeURIComponent(f), D = u.indexOf(T + "=");
165
+ D !== -1 && (c = /^([^;]+)/.exec(
166
+ u.slice(D + T.length + 1)
167
167
  )[1]);
168
168
  } catch {
169
169
  }
@@ -196,11 +196,11 @@ function pe() {
196
196
  ERROR: 4,
197
197
  SILENT: 5
198
198
  }, a.methodFactory = d || ee, a.getLevel = function() {
199
- return m ?? A ?? k;
199
+ return m ?? L ?? P;
200
200
  }, a.setLevel = function(c, u) {
201
201
  return m = y(c), u !== !1 && ne(m), b.call(a);
202
202
  }, a.setDefaultLevel = function(c) {
203
- A = y(c), B() || a.setLevel(c, !1);
203
+ L = y(c), B() || a.setLevel(c, !1);
204
204
  }, a.resetLevel = function() {
205
205
  m = null, ie(), b.call(a);
206
206
  }, a.enableAll = function(c) {
@@ -208,10 +208,10 @@ function pe() {
208
208
  }, a.disableAll = function(c) {
209
209
  a.setLevel(a.levels.SILENT, c);
210
210
  }, a.rebuild = function() {
211
- if (s !== a && (k = y(s.getLevel())), b.call(a), s === a)
211
+ if (s !== a && (P = y(s.getLevel())), b.call(a), s === a)
212
212
  for (var c in r)
213
213
  r[c].rebuild();
214
- }, k = y(
214
+ }, P = y(
215
215
  s ? s.getLevel() : "WARN"
216
216
  );
217
217
  var W = B();
@@ -233,7 +233,7 @@ function pe() {
233
233
  return r;
234
234
  }, s.default = s, s;
235
235
  });
236
- })(P)), P.exports;
236
+ })(k)), k.exports;
237
237
  }
238
238
  var he = pe();
239
239
  const _ = /* @__PURE__ */ ue(he), h = _.getLogger(re);
@@ -339,11 +339,11 @@ class fe {
339
339
  function I(i, e, t) {
340
340
  if (se(i))
341
341
  return new fe(i, e, t);
342
- if (j(i))
342
+ if (X(i))
343
343
  return new O(i, e, t);
344
344
  throw new Error("Unsupported node type");
345
345
  }
346
- const C = "\x1B[106mDOM\x1B[0m";
346
+ const E = "\x1B[106mDOM\x1B[0m";
347
347
  class me {
348
348
  _transaction;
349
349
  _treeWalker;
@@ -367,30 +367,30 @@ class me {
367
367
  return this._previousNode;
368
368
  }
369
369
  nextNode() {
370
- this._treeWalker.nextNode() || (this._completed = !0), h.debug(C, "moving to next node"), this.setState();
370
+ this._treeWalker.nextNode() || (this._completed = !0), h.debug(E, "moving to next node"), this.setState();
371
371
  }
372
372
  nextSiblingOrParentSibling() {
373
373
  let e = 0;
374
374
  if (this._treeWalker.nextSibling())
375
- return h.debug(C, "moving to next sibling node"), this.setState(), { parentsTraversed: e };
375
+ return h.debug(E, "moving to next sibling node"), this.setState(), { parentsTraversed: e };
376
376
  for (; this._treeWalker.parentNode(); )
377
377
  if (e++, this._treeWalker.nextSibling())
378
378
  return h.debug(
379
- C,
379
+ E,
380
380
  "moving to parent sibling node, traversed:",
381
381
  e
382
382
  ), this.setState(), { parentsTraversed: e };
383
383
  return this._completed = !0, { parentsTraversed: e };
384
384
  }
385
385
  firstChildOrNextNode() {
386
- return this._treeWalker.firstChild() ? (h.debug(C, "moving to first child node"), this.setState(), { parentsTraversed: 1 }) : (this.nextNode(), { parentsTraversed: 0 });
386
+ return this._treeWalker.firstChild() ? (h.debug(E, "moving to first child node"), this.setState(), { parentsTraversed: 1 }) : (this.nextNode(), { parentsTraversed: 0 });
387
387
  }
388
388
  setState() {
389
389
  this._previousNode = this._currentNode, this._currentNode = I(
390
390
  this._treeWalker.currentNode,
391
391
  this._transaction,
392
392
  de(this._treeWalker.currentNode, this._config)
393
- ), h.debug(C, "moved to node", {
393
+ ), h.debug(E, "moved to node", {
394
394
  currentNode: this.currentNode,
395
395
  previousNode: this.previousNode
396
396
  });
@@ -642,7 +642,7 @@ function ye(i, e, t) {
642
642
  }
643
643
  return null;
644
644
  }
645
- const E = "\x1B[103mPAGINATOR\x1B[0m";
645
+ const C = "\x1B[103mPAGINATOR\x1B[0m";
646
646
  class R {
647
647
  _domState;
648
648
  _pageManager;
@@ -650,7 +650,7 @@ class R {
650
650
  _tempContainer;
651
651
  _config;
652
652
  constructor(e, t, n) {
653
- this._config = { ...K, ...n }, this._tempContainer = R.createTempContainer(this._config.id), this._transaction = new _e(), this._domState = new me(e, this._transaction, this._config), this._pageManager = new H(
653
+ this._config = { ...Y, ...n }, this._tempContainer = R.createTempContainer(this._config.id), this._transaction = new _e(), this._domState = new me(e, this._transaction, this._config), this._pageManager = new H(
654
654
  this._tempContainer,
655
655
  t,
656
656
  this._transaction,
@@ -663,13 +663,13 @@ class R {
663
663
  }
664
664
  static paginate(e, t, n) {
665
665
  const o = new R(e, t, n);
666
- return o.processAllNodes(), Array.from(o._tempContainer.childNodes).filter((s) => j(s)).map((s) => s.innerHTML);
666
+ return o.processAllNodes(), Array.from(o._tempContainer.childNodes).filter((s) => X(s)).map((s) => s.innerHTML);
667
667
  }
668
668
  processAllNodes() {
669
669
  this._domState.nextNode();
670
670
  do {
671
671
  switch (_.debug(
672
- E,
672
+ C,
673
673
  "paginating node",
674
674
  this._domState.currentNode
675
675
  ), this.processCurrentNode()) {
@@ -691,20 +691,20 @@ class R {
691
691
  this._pageManager
692
692
  );
693
693
  } while (this._domState.completed === !1);
694
- _.debug(E, "pagination completed");
694
+ _.debug(C, "pagination completed");
695
695
  }
696
696
  handleNodeSkipped() {
697
- _.debug(E, "node skipped - couldn't paginate"), this._domState.nextNode();
697
+ _.debug(C, "node skipped - couldn't paginate"), this._domState.nextNode();
698
698
  }
699
699
  handleFullNodePlaced() {
700
- _.debug(E, "node fully paginated");
700
+ _.debug(C, "node fully paginated");
701
701
  const { parentsTraversed: e } = this._domState.nextSiblingOrParentSibling();
702
702
  for (let t = 0; t < e; t++)
703
703
  this._pageManager.leaveElement();
704
704
  }
705
705
  handleChildrenSplit() {
706
706
  _.debug(
707
- E,
707
+ C,
708
708
  "node partially paginated - splitting children"
709
709
  ), this._domState.firstChildOrNextNode().parentsTraversed === 1 && this._domState.previousNode?.type === S.Element && this._pageManager.enterElement();
710
710
  }
@@ -816,18 +816,18 @@ function Oe(i, e) {
816
816
  }
817
817
  return t.length > 0 && (t[0] = t[0].charAt(0).toUpperCase() + t[0].slice(1)), t.join(" ") + ".";
818
818
  }
819
- const Ce = "data-pz-page-break", Ee = "pageBreak", xe = {
820
- name: Ee,
819
+ const Ee = "data-pz-page-break", Ce = "pageBreak", xe = {
820
+ name: Ce,
821
821
  order: 1,
822
822
  onVisitElement: (i, e, t, n) => {
823
- e.currentNode.getNode().getAttribute(Ce) === "true" && (t.markPageAsFull(), n.result = p.FullNodePlaced);
823
+ e.currentNode.getNode().getAttribute(Ee) === "true" && (t.markPageAsFull(), n.result = p.FullNodePlaced);
824
824
  }
825
825
  }, He = [xe], $e = {
826
826
  name: "debug",
827
827
  order: Number.MAX_SAFE_INTEGER,
828
828
  onNewPage: (i, e) => {
829
829
  const t = e.getPageState().currentPage.getNode();
830
- t.classList.contains(D) || t.classList.add(D), t.setAttribute(`${x}-element`, "page"), t.setAttribute(
830
+ t.classList.contains(M) || t.classList.add(M), t.setAttribute(`${x}-element`, "page"), t.setAttribute(
831
831
  `${x}-height`,
832
832
  e.getPageState().pageHeight.toString()
833
833
  );
@@ -854,6 +854,7 @@ class Be {
854
854
  return /^H[1-6]$/.test(t) ? parseInt(t.charAt(1), 10) : null;
855
855
  }
856
856
  }
857
+ const We = "__PAPRIZE_IS_READY", De = "__PAPRIZE_READ_JSON_DATA_FILE";
857
858
  export {
858
859
  R as Paginator,
859
860
  Be as SectionTocPlugin,
@@ -861,24 +862,27 @@ export {
861
862
  x as attributePrefix,
862
863
  Re as configToAttributeMap,
863
864
  Oe as createLoremIpsumParagraph,
864
- ke as currentElementClassName,
865
+ Pe as currentElementClassName,
865
866
  Te as currentTextClassName,
866
867
  $e as debugPlugin,
867
868
  He as defaultPlugins,
868
- Ae as enableDebugMode,
869
+ Le as enableDebugMode,
869
870
  le as getVisibleHeight,
870
- Pe as ignoredElementClassName,
871
- Le as ignoredTextClassName,
871
+ ke as ignoredElementClassName,
872
+ Ae as ignoredTextClassName,
872
873
  Fe as isDebugMode,
873
- j as isElement,
874
+ X as isElement,
874
875
  se as isTextNode,
875
876
  h as logger,
876
877
  re as loggerName,
877
878
  Ie as moveOffscreen,
878
- Ce as pageBreakAttributeName,
879
+ Ee as pageBreakAttributeName,
879
880
  xe as pageBreakPlugin,
880
- Ee as pageBreakPluginName,
881
- D as pageClassName,
881
+ Ce as pageBreakPluginName,
882
+ M as pageClassName,
883
+ We as paprize_isReady,
884
+ De as paprize_readJsonDataFile,
882
885
  we as sectionTocName,
883
886
  ae as tempContainerClassName
884
887
  };
888
+ //# sourceMappingURL=paprize-core.js.map
@@ -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",D="pz-temp-container",ae="pz-current-element",se="pz-current-text",le="pz-ignored-element",ce="pz-ignored-text",O="pz-page",v="data-pz-";let z=!1;const de=()=>{z=!0},ue=()=>z;function R(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 k={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=k[t];e[`${v}${o.name}`]=String(n)}}return e}const he=Object.fromEntries(Object.entries(k).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 k){const r=k[o],s=`${v}${r.name}`,f=i.getAttribute(s);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 L={exports:{}},_e=L.exports,X;function ve(){return X||(X=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={},s=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 Fe(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function Ie(c){return c==="debug"&&(c="log"),typeof console===t?!1:c==="trace"&&n?Fe:console[c]!==void 0?f(console,c):console.log!==void 0?f(console,"log"):e}function P(){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 Oe(c){return function(){typeof console!==t&&(P.call(this),this[c].apply(this,arguments))}}function Re(c,u,a){return Ie(c)||Oe.apply(this,arguments)}function ne(c,u){var a=this,F,M,C,m="loglevel";typeof c=="string"?m+=":"+c:typeof c=="symbol"&&(m=void 0);function He(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 $e(){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(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||Re,a.getLevel=function(){return C??M??F},a.setLevel=function(d,g){return C=x(d),g!==!1&&He(C),P.call(a)},a.setDefaultLevel=function(d){M=x(d),ie()||a.setLevel(d,!1)},a.resetLevel=function(){C=null,$e(),P.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(s!==a&&(F=x(s.getLevel())),P.call(a),s===a)for(var d in r)r[d].rebuild()},F=x(s?s.getLevel():"WARN");var oe=ie();oe!=null&&(C=x(oe)),P.call(a)}s=new ne,s.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,s.methodFactory)),a};var Be=typeof window!==t?window.log:void 0;return s.noConflict=function(){return typeof window!==t&&window.log===s&&(window.log=Be),s},s.getLoggers=function(){return r},s.default=s,s})})(L)),L.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(R(i))return new H(i,e,t);throw new Error("Unsupported node type")}const E="\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(E,"moving to next node"),this.setState()}nextSiblingOrParentSibling(){let e=0;if(this._treeWalker.nextSibling())return h.debug(E,"moving to next sibling node"),this.setState(),{parentsTraversed:e};for(;this._treeWalker.parentNode();)if(e++,this._treeWalker.nextSibling())return h.debug(E,"moving to parent sibling node, traversed:",e),this.setState(),{parentsTraversed:e};return this._completed=!0,{parentsTraversed:e}}firstChildOrNextNode(){return this._treeWalker.firstChild()?(h.debug(E,"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(E,"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 J="\x1B[102mPAGE\x1B[0m";class w{currentPage;activeElement;currentElement;parentStack;pageIsFull;pageIndex;pageHeight;constructor(e,t,n,o,r,s,f){this.currentPage=e,this.activeElement=t,this.currentElement=n,this.parentStack=o,this.pageIsFull=r,this.pageIndex=s,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 W{_pageState;_transaction;_tempContainer;_config;constructor(e,t,n,o){this._tempContainer=e,this._config=o,this._transaction=n;const r=W.createPageHtmlElement(t.width),s=this.createNewPage(r);this._pageState=w.create(s,[],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(J,"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(J,"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 Ce(i,e){const t=K(i,e);if(t!==p.None)return t;const{rollback:n,commit:o}=e.startTransaction();e.nextPage();const r=K(i,e);return r!==p.None?(o(),r):(n(),h.debug("Element is too big to fit on a page",i),p.None)}function K(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 Ee(i,e){let t=p.FullNodePlaced;const n=i.textContent.split(/(\s+)/).filter(s=>s!=="");let o,r=0;for(;o||r<n.length;){const s=o??n[r],f=we(s,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=Te(i,e,t);return{pendingToken:r.leftovers,completed:r.completed}}function Te(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=Pe(i,t.hyphen,e);return{completed:!0,leftovers:r&&r.length>0?r:void 0}}function Pe(i,e,t){const n=t.addTextNode("");let o="";for(let r=0;r<i.length;r++){const s=i[r],f=o+s;if(n.textContent=f+e,!t.hasEmptySpace())return n.textContent=o?o+e:"",t.markPageAsFull(),i.slice(r);o=f}return null}const T="\x1B[103mPAGINATOR\x1B[0m";class A{_domState;_pageManager;_transaction;_tempContainer;_config;constructor(e,t,n){this._config={...j,...n},this._tempContainer=A.createTempContainer(this._config.id),this._transaction=new ye,this._domState=new be(e,this._transaction,this._config),this._pageManager=new W(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(D),document.body.appendChild(t),t}static paginate(e,t,n){const o=new A(e,t,n);return o.processAllNodes(),Array.from(o._tempContainer.childNodes).filter(s=>R(s)).map(s=>s.innerHTML)}processAllNodes(){this._domState.nextNode();do{switch(S.debug(T,"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(T,"pagination completed")}handleNodeSkipped(){S.debug(T,"node skipped - couldn't paginate"),this._domState.nextNode()}handleFullNodePlaced(){S.debug(T,"node fully paginated");const{parentsTraversed:e}=this._domState.nextSiblingOrParentSibling();for(let t=0;t<e;t++)this._pageManager.leaveElement()}handleChildrenSplit(){S.debug(T,"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:Ce(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:Ee(this._domState.currentNode,this._pageManager)}}}const Y=["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(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),s=Math.floor(r/Math.pow(2,32)*Y.length);t.push(Y[s])}return t.length>0&&(t[0]=t[0].charAt(0).toUpperCase()+t[0].slice(1)),t.join(" ")+"."}const Q="data-pz-page-break",Z="pageBreak",ee={name:Z,order:1,onVisitElement:(i,e,t,n)=>{e.currentNode.getNode().getAttribute(Q)==="true"&&(t.markPageAsFull(),n.result=p.FullNodePlaced)}},ke=[ee],Le={name:"debug",order:Number.MAX_SAFE_INTEGER,onNewPage:(i,e)=>{const t=e.getPageState().currentPage.getNode();t.classList.contains(O)||t.classList.add(O),t.setAttribute(`${v}-element`,"page"),t.setAttribute(`${v}-height`,e.getPageState().pageHeight.toString())}},te="sectionToc";class Ae{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}}l.Paginator=A,l.SectionTocPlugin=Ae,l.SplitResult=p,l.attributePrefix=v,l.configToAttributeMap=pe,l.createLoremIpsumParagraph=xe,l.currentElementClassName=ae,l.currentTextClassName=se,l.debugPlugin=Le,l.defaultPlugins=ke,l.enableDebugMode=de,l.getVisibleHeight=V,l.ignoredElementClassName=le,l.ignoredTextClassName=ce,l.isDebugMode=ue,l.isElement=R,l.isTextNode=U,l.logger=h,l.loggerName=_,l.moveOffscreen=ge,l.pageBreakAttributeName=Q,l.pageBreakPlugin=ee,l.pageBreakPluginName=Z,l.pageClassName=O,l.sectionTocName=te,l.tempContainerClassName=D,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",
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",