@digicole/pdfmake-rtl 1.2.0 → 2.1.1

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.
Files changed (100) hide show
  1. package/.vscode/tasks.json +17 -0
  2. package/CHANGELOG.md +83 -128
  3. package/LICENSE +22 -22
  4. package/README.md +188 -681
  5. package/build/fonts/Cairo/Cairo-Black.ttf +0 -0
  6. package/build/fonts/Cairo/Cairo-Bold.ttf +0 -0
  7. package/build/fonts/Cairo/Cairo-ExtraLight.ttf +0 -0
  8. package/build/fonts/Cairo/Cairo-Light.ttf +0 -0
  9. package/build/fonts/Cairo/Cairo-Regular.ttf +0 -0
  10. package/build/fonts/Cairo/Cairo-SemiBold.ttf +0 -0
  11. package/build/fonts/Cairo.js +27 -0
  12. package/build/fonts/Roboto/Roboto-Italic.ttf +0 -0
  13. package/build/fonts/Roboto/Roboto-Medium.ttf +0 -0
  14. package/build/fonts/Roboto/Roboto-MediumItalic.ttf +0 -0
  15. package/build/fonts/Roboto/Roboto-Regular.ttf +0 -0
  16. package/build/fonts/Roboto.js +27 -0
  17. package/build/pdfmake.js +63736 -71285
  18. package/build/pdfmake.js.map +1 -1
  19. package/build/pdfmake.min.js +2 -2
  20. package/build/pdfmake.min.js.map +1 -1
  21. package/build/standard-fonts/Courier.js +27 -0
  22. package/build/standard-fonts/Helvetica.js +27 -0
  23. package/build/standard-fonts/Symbol.js +21 -0
  24. package/build/standard-fonts/Times.js +27 -0
  25. package/build/standard-fonts/ZapfDingbats.js +21 -0
  26. package/build/vfs_fonts.js +11 -7
  27. package/build-vfs.js +44 -44
  28. package/fonts/Cairo/Cairo-Black.ttf +0 -0
  29. package/fonts/Cairo/Cairo-Bold.ttf +0 -0
  30. package/fonts/Cairo/Cairo-ExtraLight.ttf +0 -0
  31. package/fonts/Cairo/Cairo-Light.ttf +0 -0
  32. package/fonts/Cairo/Cairo-Regular.ttf +0 -0
  33. package/fonts/Cairo/Cairo-SemiBold.ttf +0 -0
  34. package/fonts/Cairo.js +8 -0
  35. package/fonts/Roboto/Roboto-Italic.ttf +0 -0
  36. package/fonts/Roboto/Roboto-Medium.ttf +0 -0
  37. package/fonts/Roboto/Roboto-MediumItalic.ttf +0 -0
  38. package/fonts/Roboto/Roboto-Regular.ttf +0 -0
  39. package/fonts/Roboto.js +8 -0
  40. package/index.js +26 -26
  41. package/package.json +42 -39
  42. package/src/3rd-party/svg-to-pdfkit/LICENSE +9 -9
  43. package/src/3rd-party/svg-to-pdfkit/source.js +229 -36
  44. package/src/3rd-party/svg-to-pdfkit.js +3 -3
  45. package/src/OutputDocument.js +64 -0
  46. package/src/OutputDocumentServer.js +32 -0
  47. package/src/PDFDocument.js +174 -0
  48. package/src/PageSize.js +53 -0
  49. package/src/Renderer.js +445 -0
  50. package/src/TextBreaker.js +168 -0
  51. package/src/TextInlines.js +263 -0
  52. package/src/URLResolver.js +43 -0
  53. package/src/base.js +70 -0
  54. package/src/browser-extensions/OutputDocumentBrowser.js +80 -0
  55. package/src/browser-extensions/fonts/Cairo.js +27 -0
  56. package/src/browser-extensions/fonts/Roboto.js +27 -0
  57. package/src/browser-extensions/index.js +61 -0
  58. package/src/browser-extensions/pdfMake.js +1 -355
  59. package/src/browser-extensions/standard-fonts/Courier.js +27 -0
  60. package/src/browser-extensions/standard-fonts/Helvetica.js +27 -0
  61. package/src/browser-extensions/standard-fonts/Symbol.js +21 -0
  62. package/src/browser-extensions/standard-fonts/Times.js +27 -0
  63. package/src/browser-extensions/standard-fonts/ZapfDingbats.js +21 -0
  64. package/src/browser-extensions/virtual-fs-cjs.js +1 -0
  65. package/src/columnCalculator.js +154 -157
  66. package/src/docMeasure.js +802 -810
  67. package/src/docPreprocessor.js +306 -273
  68. package/src/documentContext.js +345 -340
  69. package/src/elementWriter.js +736 -411
  70. package/src/helpers/node.js +136 -0
  71. package/src/helpers/tools.js +44 -0
  72. package/src/helpers/variableType.js +50 -0
  73. package/src/index.js +16 -0
  74. package/src/layoutBuilder.js +1393 -1197
  75. package/src/line.js +122 -104
  76. package/src/pageElementWriter.js +187 -174
  77. package/src/printer.js +370 -727
  78. package/src/qrEnc.js +796 -791
  79. package/src/rtlUtils.js +500 -485
  80. package/src/standardPageSizes.js +52 -54
  81. package/src/styleContextStack.js +208 -138
  82. package/src/svgMeasure.js +109 -70
  83. package/src/tableLayouts.js +100 -0
  84. package/src/tableProcessor.js +620 -606
  85. package/src/textDecorator.js +175 -157
  86. package/src/virtual-fs.js +66 -0
  87. package/standard-fonts/Courier.js +8 -0
  88. package/standard-fonts/Helvetica.js +8 -0
  89. package/standard-fonts/Symbol.js +5 -0
  90. package/standard-fonts/Times.js +8 -0
  91. package/standard-fonts/ZapfDingbats.js +5 -0
  92. package/index.html +0 -396
  93. package/src/browser-extensions/URLBrowserResolver.js +0 -96
  94. package/src/browser-extensions/virtual-fs.js +0 -55
  95. package/src/fontProvider.js +0 -68
  96. package/src/helpers.js +0 -138
  97. package/src/imageMeasure.js +0 -62
  98. package/src/pdfKitEngine.js +0 -21
  99. package/src/textTools.js +0 -391
  100. package/src/traversalTracker.js +0 -47
@@ -1,273 +1,306 @@
1
- 'use strict';
2
-
3
- var isString = require('./helpers').isString;
4
- var isNumber = require('./helpers').isNumber;
5
- var isBoolean = require('./helpers').isBoolean;
6
- var isArray = require('./helpers').isArray;
7
- var isUndefined = require('./helpers').isUndefined;
8
- var fontStringify = require('./helpers').fontStringify;
9
- var rtlUtils = require('./rtlUtils');
10
-
11
- function DocPreprocessor() {
12
-
13
- }
14
-
15
- DocPreprocessor.prototype.preprocessDocument = function (docStructure) {
16
- this.parentNode = null;
17
- this.tocs = [];
18
- this.nodeReferences = [];
19
- return this.preprocessNode(docStructure);
20
- };
21
-
22
- DocPreprocessor.prototype.preprocessNode = function (node) {
23
- // expand shortcuts and casting values
24
- if (isArray(node)) {
25
- node = { stack: node };
26
- } else if (isString(node)) {
27
- node = { text: node };
28
- } else if (isNumber(node) || isBoolean(node)) {
29
- node = { text: node.toString() };
30
- } else if (node === undefined || node === null) {
31
- node = { text: '' };
32
- } else if (Object.keys(node).length === 0) { // empty object
33
- node = { text: '' };
34
- } else if ('text' in node && (node.text === undefined || node.text === null)) {
35
- node.text = '';
36
- }
37
-
38
- if (node.columns) {
39
- return this.preprocessColumns(node);
40
- } else if (node.stack) {
41
- return this.preprocessVerticalContainer(node);
42
- } else if (node.ul) {
43
- return this.preprocessList(node);
44
- } else if (node.ol) {
45
- return this.preprocessList(node);
46
- } else if (node.table) {
47
- return this.preprocessTable(node);
48
- } else if (node.text !== undefined) {
49
- return this.preprocessText(node);
50
- } else if (node.toc) {
51
- return this.preprocessToc(node);
52
- } else if (node.image) {
53
- return this.preprocessImage(node);
54
- } else if (node.svg) {
55
- return this.preprocessSVG(node);
56
- } else if (node.canvas) {
57
- return this.preprocessCanvas(node);
58
- } else if (node.qr) {
59
- return this.preprocessQr(node);
60
- } else if (node.pageReference || node.textReference) {
61
- return this.preprocessText(node);
62
- } else {
63
- throw 'Unrecognized document structure: ' + JSON.stringify(node, fontStringify);
64
- }
65
- };
66
-
67
- DocPreprocessor.prototype.preprocessColumns = function (node) {
68
- var columns = node.columns;
69
-
70
- for (var i = 0, l = columns.length; i < l; i++) {
71
- columns[i] = this.preprocessNode(columns[i]);
72
- }
73
-
74
- return node;
75
- };
76
-
77
- DocPreprocessor.prototype.preprocessVerticalContainer = function (node) {
78
- var items = node.stack;
79
-
80
- for (var i = 0, l = items.length; i < l; i++) {
81
- items[i] = this.preprocessNode(items[i]);
82
- }
83
-
84
- return node;
85
- };
86
-
87
- DocPreprocessor.prototype.preprocessList = function (node) {
88
- var items = node.ul || node.ol;
89
-
90
- // Apply automatic RTL detection to list items
91
- if (node.ul) {
92
- node.ul = rtlUtils.processRTLList(node.ul);
93
- items = node.ul;
94
- } else if (node.ol) {
95
- node.ol = rtlUtils.processRTLList(node.ol);
96
- items = node.ol;
97
- }
98
-
99
- for (var i = 0, l = items.length; i < l; i++) {
100
- items[i] = this.preprocessNode(items[i]);
101
- }
102
-
103
- return node;
104
- };
105
-
106
- DocPreprocessor.prototype.preprocessTable = function (node) {
107
- var col, row, cols, rows;
108
-
109
- // Apply automatic RTL detection and processing
110
- node = rtlUtils.processAutoRTLTable(node);
111
-
112
- for (col = 0, cols = node.table.body[0].length; col < cols; col++) {
113
- for (row = 0, rows = node.table.body.length; row < rows; row++) {
114
- var rowData = node.table.body[row];
115
- var data = rowData[col];
116
- if (data !== undefined) {
117
- if (data === null) { // transform to object
118
- data = '';
119
- }
120
- if (!data._span) {
121
- // Apply automatic RTL detection to cell content
122
- data = rtlUtils.autoApplyRTL(data);
123
- rowData[col] = this.preprocessNode(data);
124
- }
125
- }
126
- }
127
- }
128
-
129
- return node;
130
- };
131
-
132
- DocPreprocessor.prototype.preprocessText = function (node) {
133
- // Apply automatic RTL detection to text elements
134
- node = rtlUtils.autoApplyRTL(node);
135
-
136
- if (node.tocItem) {
137
- if (!isArray(node.tocItem)) {
138
- node.tocItem = [node.tocItem];
139
- }
140
-
141
- for (var i = 0, l = node.tocItem.length; i < l; i++) {
142
- if (!isString(node.tocItem[i])) {
143
- node.tocItem[i] = '_default_';
144
- }
145
-
146
- var tocItemId = node.tocItem[i];
147
-
148
- if (!this.tocs[tocItemId]) {
149
- this.tocs[tocItemId] = { toc: { _items: [], _pseudo: true } };
150
- }
151
-
152
- if (!node.id) {
153
- node.id = 'toc-' + tocItemId + '-' + this.tocs[tocItemId].toc._items.length;
154
- }
155
-
156
- var tocItemRef = {
157
- _nodeRef: this._getNodeForNodeRef(node),
158
- _textNodeRef: node
159
- };
160
- this.tocs[tocItemId].toc._items.push(tocItemRef);
161
- }
162
- }
163
-
164
- if (node.id) {
165
- if (this.nodeReferences[node.id]) {
166
- if (!this.nodeReferences[node.id]._pseudo) {
167
- throw "Node id '" + node.id + "' already exists";
168
- }
169
-
170
- this.nodeReferences[node.id]._nodeRef = this._getNodeForNodeRef(node);
171
- this.nodeReferences[node.id]._textNodeRef = node;
172
- this.nodeReferences[node.id]._pseudo = false;
173
- } else {
174
- this.nodeReferences[node.id] = {
175
- _nodeRef: this._getNodeForNodeRef(node),
176
- _textNodeRef: node
177
- };
178
- }
179
- }
180
-
181
- if (node.pageReference) {
182
- if (!this.nodeReferences[node.pageReference]) {
183
- this.nodeReferences[node.pageReference] = {
184
- _nodeRef: {},
185
- _textNodeRef: {},
186
- _pseudo: true
187
- };
188
- }
189
- node.text = '00000';
190
- node.linkToDestination = node.pageReference;
191
- node._pageRef = this.nodeReferences[node.pageReference];
192
- }
193
-
194
- if (node.textReference) {
195
- if (!this.nodeReferences[node.textReference]) {
196
- this.nodeReferences[node.textReference] = { _nodeRef: {}, _pseudo: true };
197
- }
198
-
199
- node.text = '';
200
- node.linkToDestination = node.textReference;
201
- node._textRef = this.nodeReferences[node.textReference];
202
- }
203
-
204
- if (node.text && node.text.text) {
205
- node.text = [this.preprocessNode(node.text)];
206
- } else if (isArray(node.text)) {
207
- var isSetParentNode = false;
208
- if (this.parentNode === null) {
209
- this.parentNode = node;
210
- isSetParentNode = true;
211
- }
212
-
213
- for (var i = 0, l = node.text.length; i < l; i++) {
214
- node.text[i] = this.preprocessNode(node.text[i]);
215
- }
216
-
217
- if (isSetParentNode) {
218
- this.parentNode = null;
219
- }
220
- }
221
-
222
- return node;
223
- };
224
-
225
- DocPreprocessor.prototype.preprocessToc = function (node) {
226
- if (!node.toc.id) {
227
- node.toc.id = '_default_';
228
- }
229
-
230
- node.toc.title = node.toc.title ? this.preprocessNode(node.toc.title) : null;
231
- node.toc._items = [];
232
-
233
- if (this.tocs[node.toc.id]) {
234
- if (!this.tocs[node.toc.id].toc._pseudo) {
235
- throw "TOC '" + node.toc.id + "' already exists";
236
- }
237
-
238
- node.toc._items = this.tocs[node.toc.id].toc._items;
239
- }
240
-
241
- this.tocs[node.toc.id] = node;
242
-
243
- return node;
244
- };
245
-
246
- DocPreprocessor.prototype.preprocessImage = function (node) {
247
- if (!isUndefined(node.image.type) && !isUndefined(node.image.data) && (node.image.type === 'Buffer') && isArray(node.image.data)) {
248
- node.image = Buffer.from(node.image.data);
249
- }
250
- return node;
251
- };
252
-
253
- DocPreprocessor.prototype.preprocessSVG = function (node) {
254
- return node;
255
- };
256
-
257
- DocPreprocessor.prototype.preprocessCanvas = function (node) {
258
- return node;
259
- };
260
-
261
- DocPreprocessor.prototype.preprocessQr = function (node) {
262
- return node;
263
- };
264
-
265
- DocPreprocessor.prototype._getNodeForNodeRef = function (node) {
266
- if (this.parentNode) {
267
- return this.parentNode;
268
- }
269
-
270
- return node;
271
- };
272
-
273
- module.exports = DocPreprocessor;
1
+ import { isString, isNumber, isValue, isEmptyObject } from './helpers/variableType';
2
+ import { stringifyNode } from './helpers/node';
3
+ import { processRTLElement, processRTLTable, containsRTL, applyRTLToNode } from './rtlUtils';
4
+
5
+ const convertValueToString = value => {
6
+ if (isString(value)) {
7
+ return value.replace(/\t/g, ' '); // expand tab as spaces
8
+ } else if (isNumber(value) || typeof value === 'boolean') {
9
+ return value.toString();
10
+ } else if (!isValue(value) || isEmptyObject(value)) {
11
+ return '';
12
+ }
13
+
14
+ // TODO: throw exception ?
15
+
16
+ return value;
17
+ };
18
+
19
+ class DocPreprocessor {
20
+ preprocessDocument(docStructure) {
21
+ this.parentNode = null;
22
+ this.tocs = [];
23
+ this.nodeReferences = [];
24
+
25
+ // Check if RTL is enabled at document level
26
+ const documentRTL = docStructure.rtl === true;
27
+
28
+ // Process content for RTL if enabled
29
+ if (documentRTL && docStructure.content) {
30
+ docStructure.content = processRTLElement(docStructure.content, true);
31
+ }
32
+
33
+ return this.preprocessNode(docStructure, true);
34
+ }
35
+
36
+ preprocessBlock(node) {
37
+ this.parentNode = null;
38
+ this.tocs = [];
39
+ this.nodeReferences = [];
40
+ return this.preprocessNode(node);
41
+ }
42
+
43
+ preprocessNode(node, isSectionAllowed = false) {
44
+ // expand shortcuts and casting values
45
+ if (Array.isArray(node)) {
46
+ node = { stack: node };
47
+ } else if (isString(node) || isNumber(node) || typeof node === 'boolean' || !isValue(node) || isEmptyObject(node)) { // text node defined as value
48
+ node = { text: convertValueToString(node) };
49
+ } else if ('text' in node) { // cast value in text property
50
+ node.text = convertValueToString(node.text);
51
+ }
52
+
53
+ // Apply RTL processing if rtl property is set on this node
54
+ if (node && typeof node === 'object' && node.rtl === true) {
55
+ node = processRTLElement(node, true);
56
+ }
57
+ // Auto-detect RTL for text nodes without explicit rtl property
58
+ else if (node && typeof node === 'object' && node.text && typeof node.text === 'string' && containsRTL(node.text) && !node.rtl) {
59
+ node = applyRTLToNode(node, false);
60
+ }
61
+ // Auto-detect RTL for table nodes - reverse columns if table has RTL content
62
+ else if (node && typeof node === 'object' && node.table && !node.rtl) {
63
+ node = processRTLTable(node);
64
+ }
65
+
66
+ if (node.section) {
67
+ if (!isSectionAllowed) {
68
+ throw new Error(`Incorrect document structure, section node is only allowed at the root level of document structure: ${stringifyNode(node)}`);
69
+ }
70
+
71
+ return this.preprocessSection(node);
72
+ } else if (node.columns) {
73
+ return this.preprocessColumns(node);
74
+ } else if (node.stack) {
75
+ return this.preprocessVerticalContainer(node, isSectionAllowed);
76
+ } else if (node.ul) {
77
+ return this.preprocessList(node);
78
+ } else if (node.ol) {
79
+ return this.preprocessList(node);
80
+ } else if (node.table) {
81
+ return this.preprocessTable(node);
82
+ } else if (node.text !== undefined) {
83
+ return this.preprocessText(node);
84
+ } else if (node.toc) {
85
+ return this.preprocessToc(node);
86
+ } else if (node.image) {
87
+ return this.preprocessImage(node);
88
+ } else if (node.svg) {
89
+ return this.preprocessSVG(node);
90
+ } else if (node.canvas) {
91
+ return this.preprocessCanvas(node);
92
+ } else if (node.qr) {
93
+ return this.preprocessQr(node);
94
+ } else if (node.attachment) {
95
+ return this.preprocessAttachment(node);
96
+ } else if (node.pageReference || node.textReference) {
97
+ return this.preprocessText(node);
98
+ } else {
99
+ throw new Error(`Unrecognized document structure: ${stringifyNode(node)}`);
100
+ }
101
+ }
102
+
103
+ preprocessSection(node) {
104
+ node.section = this.preprocessNode(node.section);
105
+
106
+ return node;
107
+ }
108
+
109
+ preprocessColumns(node) {
110
+ let columns = node.columns;
111
+
112
+ for (let i = 0, l = columns.length; i < l; i++) {
113
+ columns[i] = this.preprocessNode(columns[i]);
114
+ }
115
+
116
+ return node;
117
+ }
118
+
119
+ preprocessVerticalContainer(node, isSectionAllowed) {
120
+ let items = node.stack;
121
+
122
+ for (let i = 0, l = items.length; i < l; i++) {
123
+ items[i] = this.preprocessNode(items[i], isSectionAllowed);
124
+ }
125
+
126
+ return node;
127
+ }
128
+
129
+ preprocessList(node) {
130
+ let items = node.ul || node.ol;
131
+
132
+ for (let i = 0, l = items.length; i < l; i++) {
133
+ items[i] = this.preprocessNode(items[i]);
134
+ }
135
+
136
+ return node;
137
+ }
138
+
139
+ preprocessTable(node) {
140
+ let col;
141
+ let row;
142
+ let cols;
143
+ let rows;
144
+
145
+ for (col = 0, cols = node.table.body[0].length; col < cols; col++) {
146
+ for (row = 0, rows = node.table.body.length; row < rows; row++) {
147
+ let rowData = node.table.body[row];
148
+ let data = rowData[col];
149
+ if (data !== undefined) {
150
+ if (data === null) { // transform to object
151
+ data = '';
152
+ }
153
+ if (!data._span) {
154
+ rowData[col] = this.preprocessNode(data);
155
+ }
156
+ }
157
+ }
158
+ }
159
+
160
+ return node;
161
+ }
162
+
163
+ preprocessText(node) {
164
+ if (node.tocItem) {
165
+ if (!Array.isArray(node.tocItem)) {
166
+ node.tocItem = [node.tocItem];
167
+ }
168
+
169
+ for (let i = 0, l = node.tocItem.length; i < l; i++) {
170
+ if (!isString(node.tocItem[i])) {
171
+ node.tocItem[i] = '_default_';
172
+ }
173
+
174
+ let tocItemId = node.tocItem[i];
175
+
176
+ if (!this.tocs[tocItemId]) {
177
+ this.tocs[tocItemId] = { toc: { _items: [], _pseudo: true } };
178
+ }
179
+
180
+ if (!node.id) {
181
+ node.id = `toc-${tocItemId}-${this.tocs[tocItemId].toc._items.length}`;
182
+ }
183
+
184
+ let tocItemRef = {
185
+ _nodeRef: this._getNodeForNodeRef(node),
186
+ _textNodeRef: node
187
+ };
188
+ this.tocs[tocItemId].toc._items.push(tocItemRef);
189
+ }
190
+ }
191
+
192
+ if (node.id) {
193
+ if (this.nodeReferences[node.id]) {
194
+ if (!this.nodeReferences[node.id]._pseudo) {
195
+ throw new Error(`Node id '${node.id}' already exists`);
196
+ }
197
+
198
+ this.nodeReferences[node.id]._nodeRef = this._getNodeForNodeRef(node);
199
+ this.nodeReferences[node.id]._textNodeRef = node;
200
+ this.nodeReferences[node.id]._pseudo = false;
201
+ } else {
202
+ this.nodeReferences[node.id] = {
203
+ _nodeRef: this._getNodeForNodeRef(node),
204
+ _textNodeRef: node
205
+ };
206
+ }
207
+ }
208
+
209
+ if (node.pageReference) {
210
+ if (!this.nodeReferences[node.pageReference]) {
211
+ this.nodeReferences[node.pageReference] = {
212
+ _nodeRef: {},
213
+ _textNodeRef: {},
214
+ _pseudo: true
215
+ };
216
+ }
217
+ node.text = '00000';
218
+ node.linkToDestination = node.pageReference;
219
+ node._pageRef = this.nodeReferences[node.pageReference];
220
+ }
221
+
222
+ if (node.textReference) {
223
+ if (!this.nodeReferences[node.textReference]) {
224
+ this.nodeReferences[node.textReference] = { _nodeRef: {}, _pseudo: true };
225
+ }
226
+
227
+ node.text = '';
228
+ node.linkToDestination = node.textReference;
229
+ node._textRef = this.nodeReferences[node.textReference];
230
+ }
231
+
232
+ if (node.text && node.text.text) {
233
+ node.text = [this.preprocessNode(node.text)];
234
+ } else if (Array.isArray(node.text)) {
235
+ let isSetParentNode = false;
236
+ if (this.parentNode === null) {
237
+ this.parentNode = node;
238
+ isSetParentNode = true;
239
+ }
240
+
241
+ for (let i = 0, l = node.text.length; i < l; i++) {
242
+ node.text[i] = this.preprocessNode(node.text[i]);
243
+ }
244
+
245
+ if (isSetParentNode) {
246
+ this.parentNode = null;
247
+ }
248
+ }
249
+
250
+ return node;
251
+ }
252
+
253
+ preprocessToc(node) {
254
+ if (!node.toc.id) {
255
+ node.toc.id = '_default_';
256
+ }
257
+
258
+ node.toc.title = node.toc.title ? this.preprocessNode(node.toc.title) : null;
259
+ node.toc._items = [];
260
+
261
+ if (this.tocs[node.toc.id]) {
262
+ if (!this.tocs[node.toc.id].toc._pseudo) {
263
+ throw new Error(`TOC '${node.toc.id}' already exists`);
264
+ }
265
+
266
+ node.toc._items = this.tocs[node.toc.id].toc._items;
267
+ }
268
+
269
+ this.tocs[node.toc.id] = node;
270
+
271
+ return node;
272
+ }
273
+
274
+ preprocessImage(node) {
275
+ if ((node.image.type !== undefined) && (node.image.data !== undefined) && (node.image.type === 'Buffer') && Array.isArray(node.image.data)) {
276
+ node.image = Buffer.from(node.image.data);
277
+ }
278
+ return node;
279
+ }
280
+
281
+ preprocessCanvas(node) {
282
+ return node;
283
+ }
284
+
285
+ preprocessSVG(node) {
286
+ return node;
287
+ }
288
+
289
+ preprocessQr(node) {
290
+ return node;
291
+ }
292
+
293
+ preprocessAttachment(node) {
294
+ return node;
295
+ }
296
+
297
+ _getNodeForNodeRef(node) {
298
+ if (this.parentNode) {
299
+ return this.parentNode;
300
+ }
301
+
302
+ return node;
303
+ }
304
+ }
305
+
306
+ export default DocPreprocessor;