ng2-pdfjs-viewer 13.2.2 → 15.0.0

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 (151) hide show
  1. package/esm2020/index.mjs +2 -31
  2. package/esm2020/src/ng2-pdfjs-viewer.component.mjs +3 -3
  3. package/esm2020/src/ng2-pdfjs-viewer.module.mjs +23 -0
  4. package/fesm2015/ng2-pdfjs-viewer.mjs +12 -19
  5. package/fesm2015/ng2-pdfjs-viewer.mjs.map +1 -1
  6. package/fesm2020/ng2-pdfjs-viewer.mjs +12 -19
  7. package/fesm2020/ng2-pdfjs-viewer.mjs.map +1 -1
  8. package/index.d.ts +1 -10
  9. package/package.json +5 -5
  10. package/pdfjs/build/pdf.js +24384 -24384
  11. package/pdfjs/web/debugger.js +615 -615
  12. package/pdfjs/web/images/annotation-check.svg +11 -11
  13. package/pdfjs/web/images/annotation-comment.svg +16 -16
  14. package/pdfjs/web/images/annotation-help.svg +26 -26
  15. package/pdfjs/web/images/annotation-insert.svg +10 -10
  16. package/pdfjs/web/images/annotation-key.svg +11 -11
  17. package/pdfjs/web/images/annotation-newparagraph.svg +11 -11
  18. package/pdfjs/web/images/annotation-noicon.svg +7 -7
  19. package/pdfjs/web/images/annotation-note.svg +42 -42
  20. package/pdfjs/web/images/annotation-paragraph.svg +16 -16
  21. package/pdfjs/web/locale/ach/viewer.properties +207 -207
  22. package/pdfjs/web/locale/af/viewer.properties +184 -184
  23. package/pdfjs/web/locale/ak/viewer.properties +130 -130
  24. package/pdfjs/web/locale/an/viewer.properties +184 -184
  25. package/pdfjs/web/locale/ar/viewer.properties +242 -242
  26. package/pdfjs/web/locale/as/viewer.properties +167 -167
  27. package/pdfjs/web/locale/ast/viewer.properties +201 -201
  28. package/pdfjs/web/locale/az/viewer.properties +242 -242
  29. package/pdfjs/web/locale/be/viewer.properties +242 -242
  30. package/pdfjs/web/locale/bg/viewer.properties +242 -242
  31. package/pdfjs/web/locale/bn-BD/viewer.properties +232 -232
  32. package/pdfjs/web/locale/bn-IN/viewer.properties +242 -242
  33. package/pdfjs/web/locale/br/viewer.properties +242 -242
  34. package/pdfjs/web/locale/brx/viewer.properties +167 -167
  35. package/pdfjs/web/locale/bs/viewer.properties +201 -201
  36. package/pdfjs/web/locale/ca/viewer.properties +236 -236
  37. package/pdfjs/web/locale/cak/viewer.properties +242 -242
  38. package/pdfjs/web/locale/crh/viewer.properties +242 -242
  39. package/pdfjs/web/locale/cs/viewer.properties +242 -242
  40. package/pdfjs/web/locale/csb/viewer.properties +134 -134
  41. package/pdfjs/web/locale/cy/viewer.properties +242 -242
  42. package/pdfjs/web/locale/da/viewer.properties +242 -242
  43. package/pdfjs/web/locale/de/viewer.properties +242 -242
  44. package/pdfjs/web/locale/el/viewer.properties +242 -242
  45. package/pdfjs/web/locale/en-CA/viewer.properties +242 -242
  46. package/pdfjs/web/locale/en-GB/viewer.properties +242 -242
  47. package/pdfjs/web/locale/en-US/viewer.properties +246 -246
  48. package/pdfjs/web/locale/en-ZA/viewer.properties +170 -170
  49. package/pdfjs/web/locale/eo/viewer.properties +242 -242
  50. package/pdfjs/web/locale/es-AR/viewer.properties +242 -242
  51. package/pdfjs/web/locale/es-CL/viewer.properties +242 -242
  52. package/pdfjs/web/locale/es-ES/viewer.properties +242 -242
  53. package/pdfjs/web/locale/es-MX/viewer.properties +242 -242
  54. package/pdfjs/web/locale/et/viewer.properties +242 -242
  55. package/pdfjs/web/locale/eu/viewer.properties +242 -242
  56. package/pdfjs/web/locale/fa/viewer.properties +223 -223
  57. package/pdfjs/web/locale/ff/viewer.properties +242 -242
  58. package/pdfjs/web/locale/fi/viewer.properties +242 -242
  59. package/pdfjs/web/locale/fr/viewer.properties +242 -242
  60. package/pdfjs/web/locale/fy-NL/viewer.properties +242 -242
  61. package/pdfjs/web/locale/ga-IE/viewer.properties +184 -184
  62. package/pdfjs/web/locale/gd/viewer.properties +242 -242
  63. package/pdfjs/web/locale/gl/viewer.properties +242 -242
  64. package/pdfjs/web/locale/gn/viewer.properties +242 -242
  65. package/pdfjs/web/locale/gu-IN/viewer.properties +242 -242
  66. package/pdfjs/web/locale/he/viewer.properties +240 -240
  67. package/pdfjs/web/locale/hi-IN/viewer.properties +224 -224
  68. package/pdfjs/web/locale/hr/viewer.properties +242 -242
  69. package/pdfjs/web/locale/hsb/viewer.properties +242 -242
  70. package/pdfjs/web/locale/hto/viewer.properties +127 -127
  71. package/pdfjs/web/locale/hu/viewer.properties +242 -242
  72. package/pdfjs/web/locale/hy-AM/viewer.properties +201 -201
  73. package/pdfjs/web/locale/ia/viewer.properties +242 -242
  74. package/pdfjs/web/locale/id/viewer.properties +242 -242
  75. package/pdfjs/web/locale/is/viewer.properties +239 -239
  76. package/pdfjs/web/locale/it/viewer.properties +157 -157
  77. package/pdfjs/web/locale/ja/viewer.properties +242 -242
  78. package/pdfjs/web/locale/ka/viewer.properties +242 -242
  79. package/pdfjs/web/locale/kab/viewer.properties +242 -242
  80. package/pdfjs/web/locale/kk/viewer.properties +242 -242
  81. package/pdfjs/web/locale/km/viewer.properties +184 -184
  82. package/pdfjs/web/locale/kn/viewer.properties +193 -193
  83. package/pdfjs/web/locale/ko/viewer.properties +242 -242
  84. package/pdfjs/web/locale/kok/viewer.properties +167 -167
  85. package/pdfjs/web/locale/ks/viewer.properties +168 -168
  86. package/pdfjs/web/locale/ku/viewer.properties +146 -146
  87. package/pdfjs/web/locale/lg/viewer.properties +112 -112
  88. package/pdfjs/web/locale/lij/viewer.properties +242 -242
  89. package/pdfjs/web/locale/lo/viewer.properties +152 -152
  90. package/pdfjs/web/locale/locale.properties +369 -369
  91. package/pdfjs/web/locale/lt/viewer.properties +242 -242
  92. package/pdfjs/web/locale/ltg/viewer.properties +220 -220
  93. package/pdfjs/web/locale/lv/viewer.properties +242 -242
  94. package/pdfjs/web/locale/mai/viewer.properties +168 -168
  95. package/pdfjs/web/locale/meh/viewer.properties +72 -72
  96. package/pdfjs/web/locale/mk/viewer.properties +145 -145
  97. package/pdfjs/web/locale/ml/viewer.properties +184 -184
  98. package/pdfjs/web/locale/mn/viewer.properties +82 -82
  99. package/pdfjs/web/locale/mr/viewer.properties +227 -227
  100. package/pdfjs/web/locale/ms/viewer.properties +242 -242
  101. package/pdfjs/web/locale/my/viewer.properties +198 -198
  102. package/pdfjs/web/locale/nb-NO/viewer.properties +242 -242
  103. package/pdfjs/web/locale/ne-NP/viewer.properties +184 -184
  104. package/pdfjs/web/locale/nl/viewer.properties +246 -246
  105. package/pdfjs/web/locale/nn-NO/viewer.properties +242 -242
  106. package/pdfjs/web/locale/nso/viewer.properties +130 -130
  107. package/pdfjs/web/locale/oc/viewer.properties +210 -210
  108. package/pdfjs/web/locale/or/viewer.properties +167 -167
  109. package/pdfjs/web/locale/pa-IN/viewer.properties +225 -225
  110. package/pdfjs/web/locale/pl/viewer.properties +242 -242
  111. package/pdfjs/web/locale/pt-BR/viewer.properties +242 -242
  112. package/pdfjs/web/locale/pt-PT/viewer.properties +242 -242
  113. package/pdfjs/web/locale/rm/viewer.properties +242 -242
  114. package/pdfjs/web/locale/ro/viewer.properties +242 -242
  115. package/pdfjs/web/locale/ru/viewer.properties +242 -242
  116. package/pdfjs/web/locale/rw/viewer.properties +81 -81
  117. package/pdfjs/web/locale/sah/viewer.properties +166 -166
  118. package/pdfjs/web/locale/sat/viewer.properties +134 -134
  119. package/pdfjs/web/locale/si/viewer.properties +207 -207
  120. package/pdfjs/web/locale/sk/viewer.properties +242 -242
  121. package/pdfjs/web/locale/sl/viewer.properties +242 -242
  122. package/pdfjs/web/locale/son/viewer.properties +180 -180
  123. package/pdfjs/web/locale/sq/viewer.properties +235 -235
  124. package/pdfjs/web/locale/sr/viewer.properties +220 -220
  125. package/pdfjs/web/locale/sv-SE/viewer.properties +242 -242
  126. package/pdfjs/web/locale/sw/viewer.properties +128 -128
  127. package/pdfjs/web/locale/ta/viewer.properties +201 -201
  128. package/pdfjs/web/locale/ta-LK/viewer.properties +77 -77
  129. package/pdfjs/web/locale/te/viewer.properties +218 -218
  130. package/pdfjs/web/locale/th/viewer.properties +242 -242
  131. package/pdfjs/web/locale/tl/viewer.properties +242 -242
  132. package/pdfjs/web/locale/tn/viewer.properties +83 -83
  133. package/pdfjs/web/locale/tr/viewer.properties +242 -242
  134. package/pdfjs/web/locale/tsz/viewer.properties +75 -75
  135. package/pdfjs/web/locale/uk/viewer.properties +242 -242
  136. package/pdfjs/web/locale/ur/viewer.properties +207 -207
  137. package/pdfjs/web/locale/uz/viewer.properties +169 -169
  138. package/pdfjs/web/locale/vi/viewer.properties +239 -239
  139. package/pdfjs/web/locale/wo/viewer.properties +124 -124
  140. package/pdfjs/web/locale/xh/viewer.properties +184 -184
  141. package/pdfjs/web/locale/zam/viewer.properties +90 -90
  142. package/pdfjs/web/locale/zh-CN/viewer.properties +242 -242
  143. package/pdfjs/web/locale/zh-TW/viewer.properties +242 -242
  144. package/pdfjs/web/locale/zu/viewer.properties +131 -131
  145. package/pdfjs/web/viewer.css +2405 -2405
  146. package/pdfjs/web/viewer.html +394 -394
  147. package/pdfjs/web/viewer.js +15876 -15876
  148. package/src/ng2-pdfjs-viewer.component.d.ts +1 -1
  149. package/src/ng2-pdfjs-viewer.module.d.ts +10 -0
  150. package/README.md +0 -311
  151. package/ng2-pdfjs-viewer.d.ts +0 -5
@@ -1,615 +1,615 @@
1
- /* Copyright 2012 Mozilla Foundation
2
- *
3
- * Licensed under the Apache License, Version 2.0 (the "License");
4
- * you may not use this file except in compliance with the License.
5
- * You may obtain a copy of the License at
6
- *
7
- * http://www.apache.org/licenses/LICENSE-2.0
8
- *
9
- * Unless required by applicable law or agreed to in writing, software
10
- * distributed under the License is distributed on an "AS IS" BASIS,
11
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- * See the License for the specific language governing permissions and
13
- * limitations under the License.
14
- */
15
- /* eslint-disable no-var */
16
-
17
- 'use strict';
18
-
19
- var FontInspector = (function FontInspectorClosure() {
20
- var fonts, createObjectURL;
21
- var active = false;
22
- var fontAttribute = 'data-font-name';
23
- function removeSelection() {
24
- let divs = document.querySelectorAll(`span[${fontAttribute}]`);
25
- for (let div of divs) {
26
- div.className = '';
27
- }
28
- }
29
- function resetSelection() {
30
- let divs = document.querySelectorAll(`span[${fontAttribute}]`);
31
- for (let div of divs) {
32
- div.className = 'debuggerHideText';
33
- }
34
- }
35
- function selectFont(fontName, show) {
36
- let divs = document.querySelectorAll(`span[${fontAttribute}=${fontName}]`);
37
- for (let div of divs) {
38
- div.className = show ? 'debuggerShowText' : 'debuggerHideText';
39
- }
40
- }
41
- function textLayerClick(e) {
42
- if (!e.target.dataset.fontName ||
43
- e.target.tagName.toUpperCase() !== 'SPAN') {
44
- return;
45
- }
46
- var fontName = e.target.dataset.fontName;
47
- var selects = document.getElementsByTagName('input');
48
- for (var i = 0; i < selects.length; ++i) {
49
- var select = selects[i];
50
- if (select.dataset.fontName !== fontName) {
51
- continue;
52
- }
53
- select.checked = !select.checked;
54
- selectFont(fontName, select.checked);
55
- select.scrollIntoView();
56
- }
57
- }
58
- return {
59
- // Properties/functions needed by PDFBug.
60
- id: 'FontInspector',
61
- name: 'Font Inspector',
62
- panel: null,
63
- manager: null,
64
- init: function init(pdfjsLib) {
65
- var panel = this.panel;
66
- panel.setAttribute('style', 'padding: 5px;');
67
- var tmp = document.createElement('button');
68
- tmp.addEventListener('click', resetSelection);
69
- tmp.textContent = 'Refresh';
70
- panel.appendChild(tmp);
71
-
72
- fonts = document.createElement('div');
73
- panel.appendChild(fonts);
74
-
75
- createObjectURL = pdfjsLib.createObjectURL;
76
- },
77
- cleanup: function cleanup() {
78
- fonts.textContent = '';
79
- },
80
- enabled: false,
81
- get active() {
82
- return active;
83
- },
84
- set active(value) {
85
- active = value;
86
- if (active) {
87
- document.body.addEventListener('click', textLayerClick, true);
88
- resetSelection();
89
- } else {
90
- document.body.removeEventListener('click', textLayerClick, true);
91
- removeSelection();
92
- }
93
- },
94
- // FontInspector specific functions.
95
- fontAdded: function fontAdded(fontObj, url) {
96
- function properties(obj, list) {
97
- var moreInfo = document.createElement('table');
98
- for (var i = 0; i < list.length; i++) {
99
- var tr = document.createElement('tr');
100
- var td1 = document.createElement('td');
101
- td1.textContent = list[i];
102
- tr.appendChild(td1);
103
- var td2 = document.createElement('td');
104
- td2.textContent = obj[list[i]].toString();
105
- tr.appendChild(td2);
106
- moreInfo.appendChild(tr);
107
- }
108
- return moreInfo;
109
- }
110
- var moreInfo = properties(fontObj, ['name', 'type']);
111
- var fontName = fontObj.loadedName;
112
- var font = document.createElement('div');
113
- var name = document.createElement('span');
114
- name.textContent = fontName;
115
- var download = document.createElement('a');
116
- if (url) {
117
- url = /url\(['"]?([^\)"']+)/.exec(url);
118
- download.href = url[1];
119
- } else if (fontObj.data) {
120
- download.href = createObjectURL(fontObj.data, fontObj.mimeType);
121
- }
122
- download.textContent = 'Download';
123
- var logIt = document.createElement('a');
124
- logIt.href = '';
125
- logIt.textContent = 'Log';
126
- logIt.addEventListener('click', function(event) {
127
- event.preventDefault();
128
- console.log(fontObj);
129
- });
130
- var select = document.createElement('input');
131
- select.setAttribute('type', 'checkbox');
132
- select.dataset.fontName = fontName;
133
- select.addEventListener('click', (function(select, fontName) {
134
- return (function() {
135
- selectFont(fontName, select.checked);
136
- });
137
- })(select, fontName));
138
- font.appendChild(select);
139
- font.appendChild(name);
140
- font.appendChild(document.createTextNode(' '));
141
- font.appendChild(download);
142
- font.appendChild(document.createTextNode(' '));
143
- font.appendChild(logIt);
144
- font.appendChild(moreInfo);
145
- fonts.appendChild(font);
146
- // Somewhat of a hack, should probably add a hook for when the text layer
147
- // is done rendering.
148
- setTimeout(() => {
149
- if (this.active) {
150
- resetSelection();
151
- }
152
- }, 2000);
153
- },
154
- };
155
- })();
156
-
157
- var opMap;
158
-
159
- // Manages all the page steppers.
160
- var StepperManager = (function StepperManagerClosure() {
161
- var steppers = [];
162
- var stepperDiv = null;
163
- var stepperControls = null;
164
- var stepperChooser = null;
165
- var breakPoints = Object.create(null);
166
- return {
167
- // Properties/functions needed by PDFBug.
168
- id: 'Stepper',
169
- name: 'Stepper',
170
- panel: null,
171
- manager: null,
172
- init: function init(pdfjsLib) {
173
- var self = this;
174
- this.panel.setAttribute('style', 'padding: 5px;');
175
- stepperControls = document.createElement('div');
176
- stepperChooser = document.createElement('select');
177
- stepperChooser.addEventListener('change', function(event) {
178
- self.selectStepper(this.value);
179
- });
180
- stepperControls.appendChild(stepperChooser);
181
- stepperDiv = document.createElement('div');
182
- this.panel.appendChild(stepperControls);
183
- this.panel.appendChild(stepperDiv);
184
- if (sessionStorage.getItem('pdfjsBreakPoints')) {
185
- breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints'));
186
- }
187
-
188
- opMap = Object.create(null);
189
- for (var key in pdfjsLib.OPS) {
190
- opMap[pdfjsLib.OPS[key]] = key;
191
- }
192
- },
193
- cleanup: function cleanup() {
194
- stepperChooser.textContent = '';
195
- stepperDiv.textContent = '';
196
- steppers = [];
197
- },
198
- enabled: false,
199
- active: false,
200
- // Stepper specific functions.
201
- create: function create(pageIndex) {
202
- var debug = document.createElement('div');
203
- debug.id = 'stepper' + pageIndex;
204
- debug.setAttribute('hidden', true);
205
- debug.className = 'stepper';
206
- stepperDiv.appendChild(debug);
207
- var b = document.createElement('option');
208
- b.textContent = 'Page ' + (pageIndex + 1);
209
- b.value = pageIndex;
210
- stepperChooser.appendChild(b);
211
- var initBreakPoints = breakPoints[pageIndex] || [];
212
- var stepper = new Stepper(debug, pageIndex, initBreakPoints);
213
- steppers.push(stepper);
214
- if (steppers.length === 1) {
215
- this.selectStepper(pageIndex, false);
216
- }
217
- return stepper;
218
- },
219
- selectStepper: function selectStepper(pageIndex, selectPanel) {
220
- var i;
221
- pageIndex = pageIndex | 0;
222
- if (selectPanel) {
223
- this.manager.selectPanel(this);
224
- }
225
- for (i = 0; i < steppers.length; ++i) {
226
- var stepper = steppers[i];
227
- if (stepper.pageIndex === pageIndex) {
228
- stepper.panel.removeAttribute('hidden');
229
- } else {
230
- stepper.panel.setAttribute('hidden', true);
231
- }
232
- }
233
- var options = stepperChooser.options;
234
- for (i = 0; i < options.length; ++i) {
235
- var option = options[i];
236
- option.selected = (option.value | 0) === pageIndex;
237
- }
238
- },
239
- saveBreakPoints: function saveBreakPoints(pageIndex, bps) {
240
- breakPoints[pageIndex] = bps;
241
- sessionStorage.setItem('pdfjsBreakPoints', JSON.stringify(breakPoints));
242
- },
243
- };
244
- })();
245
-
246
- // The stepper for each page's IRQueue.
247
- var Stepper = (function StepperClosure() {
248
- // Shorter way to create element and optionally set textContent.
249
- function c(tag, textContent) {
250
- var d = document.createElement(tag);
251
- if (textContent) {
252
- d.textContent = textContent;
253
- }
254
- return d;
255
- }
256
-
257
- function simplifyArgs(args) {
258
- if (typeof args === 'string') {
259
- var MAX_STRING_LENGTH = 75;
260
- return args.length <= MAX_STRING_LENGTH ? args :
261
- args.substring(0, MAX_STRING_LENGTH) + '...';
262
- }
263
- if (typeof args !== 'object' || args === null) {
264
- return args;
265
- }
266
- if ('length' in args) { // array
267
- var simpleArgs = [], i, ii;
268
- var MAX_ITEMS = 10;
269
- for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) {
270
- simpleArgs.push(simplifyArgs(args[i]));
271
- }
272
- if (i < args.length) {
273
- simpleArgs.push('...');
274
- }
275
- return simpleArgs;
276
- }
277
- var simpleObj = {};
278
- for (var key in args) {
279
- simpleObj[key] = simplifyArgs(args[key]);
280
- }
281
- return simpleObj;
282
- }
283
-
284
- function Stepper(panel, pageIndex, initialBreakPoints) {
285
- this.panel = panel;
286
- this.breakPoint = 0;
287
- this.nextBreakPoint = null;
288
- this.pageIndex = pageIndex;
289
- this.breakPoints = initialBreakPoints;
290
- this.currentIdx = -1;
291
- this.operatorListIdx = 0;
292
- }
293
- Stepper.prototype = {
294
- init: function init(operatorList) {
295
- var panel = this.panel;
296
- var content = c('div', 'c=continue, s=step');
297
- var table = c('table');
298
- content.appendChild(table);
299
- table.cellSpacing = 0;
300
- var headerRow = c('tr');
301
- table.appendChild(headerRow);
302
- headerRow.appendChild(c('th', 'Break'));
303
- headerRow.appendChild(c('th', 'Idx'));
304
- headerRow.appendChild(c('th', 'fn'));
305
- headerRow.appendChild(c('th', 'args'));
306
- panel.appendChild(content);
307
- this.table = table;
308
- this.updateOperatorList(operatorList);
309
- },
310
- updateOperatorList: function updateOperatorList(operatorList) {
311
- var self = this;
312
-
313
- function cboxOnClick() {
314
- var x = +this.dataset.idx;
315
- if (this.checked) {
316
- self.breakPoints.push(x);
317
- } else {
318
- self.breakPoints.splice(self.breakPoints.indexOf(x), 1);
319
- }
320
- StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints);
321
- }
322
-
323
- var MAX_OPERATORS_COUNT = 15000;
324
- if (this.operatorListIdx > MAX_OPERATORS_COUNT) {
325
- return;
326
- }
327
-
328
- var chunk = document.createDocumentFragment();
329
- var operatorsToDisplay = Math.min(MAX_OPERATORS_COUNT,
330
- operatorList.fnArray.length);
331
- for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) {
332
- var line = c('tr');
333
- line.className = 'line';
334
- line.dataset.idx = i;
335
- chunk.appendChild(line);
336
- var checked = this.breakPoints.includes(i);
337
- var args = operatorList.argsArray[i] || [];
338
-
339
- var breakCell = c('td');
340
- var cbox = c('input');
341
- cbox.type = 'checkbox';
342
- cbox.className = 'points';
343
- cbox.checked = checked;
344
- cbox.dataset.idx = i;
345
- cbox.onclick = cboxOnClick;
346
-
347
- breakCell.appendChild(cbox);
348
- line.appendChild(breakCell);
349
- line.appendChild(c('td', i.toString()));
350
- var fn = opMap[operatorList.fnArray[i]];
351
- var decArgs = args;
352
- if (fn === 'showText') {
353
- var glyphs = args[0];
354
- var newArgs = [];
355
- var str = [];
356
- for (var j = 0; j < glyphs.length; j++) {
357
- var glyph = glyphs[j];
358
- if (typeof glyph === 'object' && glyph !== null) {
359
- str.push(glyph.fontChar);
360
- } else {
361
- if (str.length > 0) {
362
- newArgs.push(str.join(''));
363
- str = [];
364
- }
365
- newArgs.push(glyph); // null or number
366
- }
367
- }
368
- if (str.length > 0) {
369
- newArgs.push(str.join(''));
370
- }
371
- decArgs = [newArgs];
372
- }
373
- line.appendChild(c('td', fn));
374
- line.appendChild(c('td', JSON.stringify(simplifyArgs(decArgs))));
375
- }
376
- if (operatorsToDisplay < operatorList.fnArray.length) {
377
- line = c('tr');
378
- var lastCell = c('td', '...');
379
- lastCell.colspan = 4;
380
- chunk.appendChild(lastCell);
381
- }
382
- this.operatorListIdx = operatorList.fnArray.length;
383
- this.table.appendChild(chunk);
384
- },
385
- getNextBreakPoint: function getNextBreakPoint() {
386
- this.breakPoints.sort(function(a, b) {
387
- return a - b;
388
- });
389
- for (var i = 0; i < this.breakPoints.length; i++) {
390
- if (this.breakPoints[i] > this.currentIdx) {
391
- return this.breakPoints[i];
392
- }
393
- }
394
- return null;
395
- },
396
- breakIt: function breakIt(idx, callback) {
397
- StepperManager.selectStepper(this.pageIndex, true);
398
- var self = this;
399
- var dom = document;
400
- self.currentIdx = idx;
401
- var listener = function(e) {
402
- switch (e.keyCode) {
403
- case 83: // step
404
- dom.removeEventListener('keydown', listener);
405
- self.nextBreakPoint = self.currentIdx + 1;
406
- self.goTo(-1);
407
- callback();
408
- break;
409
- case 67: // continue
410
- dom.removeEventListener('keydown', listener);
411
- var breakPoint = self.getNextBreakPoint();
412
- self.nextBreakPoint = breakPoint;
413
- self.goTo(-1);
414
- callback();
415
- break;
416
- }
417
- };
418
- dom.addEventListener('keydown', listener);
419
- self.goTo(idx);
420
- },
421
- goTo: function goTo(idx) {
422
- var allRows = this.panel.getElementsByClassName('line');
423
- for (var x = 0, xx = allRows.length; x < xx; ++x) {
424
- var row = allRows[x];
425
- if ((row.dataset.idx | 0) === idx) {
426
- row.style.backgroundColor = 'rgb(251,250,207)';
427
- row.scrollIntoView();
428
- } else {
429
- row.style.backgroundColor = null;
430
- }
431
- }
432
- },
433
- };
434
- return Stepper;
435
- })();
436
-
437
- var Stats = (function Stats() {
438
- var stats = [];
439
- function clear(node) {
440
- while (node.hasChildNodes()) {
441
- node.removeChild(node.lastChild);
442
- }
443
- }
444
- function getStatIndex(pageNumber) {
445
- for (var i = 0, ii = stats.length; i < ii; ++i) {
446
- if (stats[i].pageNumber === pageNumber) {
447
- return i;
448
- }
449
- }
450
- return false;
451
- }
452
- return {
453
- // Properties/functions needed by PDFBug.
454
- id: 'Stats',
455
- name: 'Stats',
456
- panel: null,
457
- manager: null,
458
- init(pdfjsLib) {
459
- this.panel.setAttribute('style', 'padding: 5px;');
460
- },
461
- enabled: false,
462
- active: false,
463
- // Stats specific functions.
464
- add(pageNumber, stat) {
465
- if (!stat) {
466
- return;
467
- }
468
- var statsIndex = getStatIndex(pageNumber);
469
- if (statsIndex !== false) {
470
- var b = stats[statsIndex];
471
- this.panel.removeChild(b.div);
472
- stats.splice(statsIndex, 1);
473
- }
474
- var wrapper = document.createElement('div');
475
- wrapper.className = 'stats';
476
- var title = document.createElement('div');
477
- title.className = 'title';
478
- title.textContent = 'Page: ' + pageNumber;
479
- var statsDiv = document.createElement('div');
480
- statsDiv.textContent = stat.toString();
481
- wrapper.appendChild(title);
482
- wrapper.appendChild(statsDiv);
483
- stats.push({ pageNumber, div: wrapper, });
484
- stats.sort(function(a, b) {
485
- return a.pageNumber - b.pageNumber;
486
- });
487
- clear(this.panel);
488
- for (var i = 0, ii = stats.length; i < ii; ++i) {
489
- this.panel.appendChild(stats[i].div);
490
- }
491
- },
492
- cleanup() {
493
- stats = [];
494
- clear(this.panel);
495
- },
496
- };
497
- })();
498
-
499
- // Manages all the debugging tools.
500
- window.PDFBug = (function PDFBugClosure() {
501
- var panelWidth = 300;
502
- var buttons = [];
503
- var activePanel = null;
504
-
505
- return {
506
- tools: [
507
- FontInspector,
508
- StepperManager,
509
- Stats
510
- ],
511
- enable(ids) {
512
- var all = false, tools = this.tools;
513
- if (ids.length === 1 && ids[0] === 'all') {
514
- all = true;
515
- }
516
- for (var i = 0; i < tools.length; ++i) {
517
- var tool = tools[i];
518
- if (all || ids.includes(tool.id)) {
519
- tool.enabled = true;
520
- }
521
- }
522
- if (!all) {
523
- // Sort the tools by the order they are enabled.
524
- tools.sort(function(a, b) {
525
- var indexA = ids.indexOf(a.id);
526
- indexA = indexA < 0 ? tools.length : indexA;
527
- var indexB = ids.indexOf(b.id);
528
- indexB = indexB < 0 ? tools.length : indexB;
529
- return indexA - indexB;
530
- });
531
- }
532
- },
533
- init(pdfjsLib, container) {
534
- /*
535
- * Basic Layout:
536
- * PDFBug
537
- * Controls
538
- * Panels
539
- * Panel
540
- * Panel
541
- * ...
542
- */
543
- var ui = document.createElement('div');
544
- ui.id = 'PDFBug';
545
-
546
- var controls = document.createElement('div');
547
- controls.setAttribute('class', 'controls');
548
- ui.appendChild(controls);
549
-
550
- var panels = document.createElement('div');
551
- panels.setAttribute('class', 'panels');
552
- ui.appendChild(panels);
553
-
554
- container.appendChild(ui);
555
- container.style.right = panelWidth + 'px';
556
-
557
- // Initialize all the debugging tools.
558
- var tools = this.tools;
559
- var self = this;
560
- for (var i = 0; i < tools.length; ++i) {
561
- var tool = tools[i];
562
- var panel = document.createElement('div');
563
- var panelButton = document.createElement('button');
564
- panelButton.textContent = tool.name;
565
- panelButton.addEventListener('click', (function(selected) {
566
- return function(event) {
567
- event.preventDefault();
568
- self.selectPanel(selected);
569
- };
570
- })(i));
571
- controls.appendChild(panelButton);
572
- panels.appendChild(panel);
573
- tool.panel = panel;
574
- tool.manager = this;
575
- if (tool.enabled) {
576
- tool.init(pdfjsLib);
577
- } else {
578
- panel.textContent = tool.name + ' is disabled. To enable add ' +
579
- ' "' + tool.id + '" to the pdfBug parameter ' +
580
- 'and refresh (separate multiple by commas).';
581
- }
582
- buttons.push(panelButton);
583
- }
584
- this.selectPanel(0);
585
- },
586
- cleanup() {
587
- for (var i = 0, ii = this.tools.length; i < ii; i++) {
588
- if (this.tools[i].enabled) {
589
- this.tools[i].cleanup();
590
- }
591
- }
592
- },
593
- selectPanel(index) {
594
- if (typeof index !== 'number') {
595
- index = this.tools.indexOf(index);
596
- }
597
- if (index === activePanel) {
598
- return;
599
- }
600
- activePanel = index;
601
- var tools = this.tools;
602
- for (var j = 0; j < tools.length; ++j) {
603
- if (j === index) {
604
- buttons[j].setAttribute('class', 'active');
605
- tools[j].active = true;
606
- tools[j].panel.removeAttribute('hidden');
607
- } else {
608
- buttons[j].setAttribute('class', '');
609
- tools[j].active = false;
610
- tools[j].panel.setAttribute('hidden', 'true');
611
- }
612
- }
613
- },
614
- };
615
- })();
1
+ /* Copyright 2012 Mozilla Foundation
2
+ *
3
+ * Licensed under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License.
5
+ * You may obtain a copy of the License at
6
+ *
7
+ * http://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software
10
+ * distributed under the License is distributed on an "AS IS" BASIS,
11
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ * See the License for the specific language governing permissions and
13
+ * limitations under the License.
14
+ */
15
+ /* eslint-disable no-var */
16
+
17
+ 'use strict';
18
+
19
+ var FontInspector = (function FontInspectorClosure() {
20
+ var fonts, createObjectURL;
21
+ var active = false;
22
+ var fontAttribute = 'data-font-name';
23
+ function removeSelection() {
24
+ let divs = document.querySelectorAll(`span[${fontAttribute}]`);
25
+ for (let div of divs) {
26
+ div.className = '';
27
+ }
28
+ }
29
+ function resetSelection() {
30
+ let divs = document.querySelectorAll(`span[${fontAttribute}]`);
31
+ for (let div of divs) {
32
+ div.className = 'debuggerHideText';
33
+ }
34
+ }
35
+ function selectFont(fontName, show) {
36
+ let divs = document.querySelectorAll(`span[${fontAttribute}=${fontName}]`);
37
+ for (let div of divs) {
38
+ div.className = show ? 'debuggerShowText' : 'debuggerHideText';
39
+ }
40
+ }
41
+ function textLayerClick(e) {
42
+ if (!e.target.dataset.fontName ||
43
+ e.target.tagName.toUpperCase() !== 'SPAN') {
44
+ return;
45
+ }
46
+ var fontName = e.target.dataset.fontName;
47
+ var selects = document.getElementsByTagName('input');
48
+ for (var i = 0; i < selects.length; ++i) {
49
+ var select = selects[i];
50
+ if (select.dataset.fontName !== fontName) {
51
+ continue;
52
+ }
53
+ select.checked = !select.checked;
54
+ selectFont(fontName, select.checked);
55
+ select.scrollIntoView();
56
+ }
57
+ }
58
+ return {
59
+ // Properties/functions needed by PDFBug.
60
+ id: 'FontInspector',
61
+ name: 'Font Inspector',
62
+ panel: null,
63
+ manager: null,
64
+ init: function init(pdfjsLib) {
65
+ var panel = this.panel;
66
+ panel.setAttribute('style', 'padding: 5px;');
67
+ var tmp = document.createElement('button');
68
+ tmp.addEventListener('click', resetSelection);
69
+ tmp.textContent = 'Refresh';
70
+ panel.appendChild(tmp);
71
+
72
+ fonts = document.createElement('div');
73
+ panel.appendChild(fonts);
74
+
75
+ createObjectURL = pdfjsLib.createObjectURL;
76
+ },
77
+ cleanup: function cleanup() {
78
+ fonts.textContent = '';
79
+ },
80
+ enabled: false,
81
+ get active() {
82
+ return active;
83
+ },
84
+ set active(value) {
85
+ active = value;
86
+ if (active) {
87
+ document.body.addEventListener('click', textLayerClick, true);
88
+ resetSelection();
89
+ } else {
90
+ document.body.removeEventListener('click', textLayerClick, true);
91
+ removeSelection();
92
+ }
93
+ },
94
+ // FontInspector specific functions.
95
+ fontAdded: function fontAdded(fontObj, url) {
96
+ function properties(obj, list) {
97
+ var moreInfo = document.createElement('table');
98
+ for (var i = 0; i < list.length; i++) {
99
+ var tr = document.createElement('tr');
100
+ var td1 = document.createElement('td');
101
+ td1.textContent = list[i];
102
+ tr.appendChild(td1);
103
+ var td2 = document.createElement('td');
104
+ td2.textContent = obj[list[i]].toString();
105
+ tr.appendChild(td2);
106
+ moreInfo.appendChild(tr);
107
+ }
108
+ return moreInfo;
109
+ }
110
+ var moreInfo = properties(fontObj, ['name', 'type']);
111
+ var fontName = fontObj.loadedName;
112
+ var font = document.createElement('div');
113
+ var name = document.createElement('span');
114
+ name.textContent = fontName;
115
+ var download = document.createElement('a');
116
+ if (url) {
117
+ url = /url\(['"]?([^\)"']+)/.exec(url);
118
+ download.href = url[1];
119
+ } else if (fontObj.data) {
120
+ download.href = createObjectURL(fontObj.data, fontObj.mimeType);
121
+ }
122
+ download.textContent = 'Download';
123
+ var logIt = document.createElement('a');
124
+ logIt.href = '';
125
+ logIt.textContent = 'Log';
126
+ logIt.addEventListener('click', function(event) {
127
+ event.preventDefault();
128
+ console.log(fontObj);
129
+ });
130
+ var select = document.createElement('input');
131
+ select.setAttribute('type', 'checkbox');
132
+ select.dataset.fontName = fontName;
133
+ select.addEventListener('click', (function(select, fontName) {
134
+ return (function() {
135
+ selectFont(fontName, select.checked);
136
+ });
137
+ })(select, fontName));
138
+ font.appendChild(select);
139
+ font.appendChild(name);
140
+ font.appendChild(document.createTextNode(' '));
141
+ font.appendChild(download);
142
+ font.appendChild(document.createTextNode(' '));
143
+ font.appendChild(logIt);
144
+ font.appendChild(moreInfo);
145
+ fonts.appendChild(font);
146
+ // Somewhat of a hack, should probably add a hook for when the text layer
147
+ // is done rendering.
148
+ setTimeout(() => {
149
+ if (this.active) {
150
+ resetSelection();
151
+ }
152
+ }, 2000);
153
+ },
154
+ };
155
+ })();
156
+
157
+ var opMap;
158
+
159
+ // Manages all the page steppers.
160
+ var StepperManager = (function StepperManagerClosure() {
161
+ var steppers = [];
162
+ var stepperDiv = null;
163
+ var stepperControls = null;
164
+ var stepperChooser = null;
165
+ var breakPoints = Object.create(null);
166
+ return {
167
+ // Properties/functions needed by PDFBug.
168
+ id: 'Stepper',
169
+ name: 'Stepper',
170
+ panel: null,
171
+ manager: null,
172
+ init: function init(pdfjsLib) {
173
+ var self = this;
174
+ this.panel.setAttribute('style', 'padding: 5px;');
175
+ stepperControls = document.createElement('div');
176
+ stepperChooser = document.createElement('select');
177
+ stepperChooser.addEventListener('change', function(event) {
178
+ self.selectStepper(this.value);
179
+ });
180
+ stepperControls.appendChild(stepperChooser);
181
+ stepperDiv = document.createElement('div');
182
+ this.panel.appendChild(stepperControls);
183
+ this.panel.appendChild(stepperDiv);
184
+ if (sessionStorage.getItem('pdfjsBreakPoints')) {
185
+ breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints'));
186
+ }
187
+
188
+ opMap = Object.create(null);
189
+ for (var key in pdfjsLib.OPS) {
190
+ opMap[pdfjsLib.OPS[key]] = key;
191
+ }
192
+ },
193
+ cleanup: function cleanup() {
194
+ stepperChooser.textContent = '';
195
+ stepperDiv.textContent = '';
196
+ steppers = [];
197
+ },
198
+ enabled: false,
199
+ active: false,
200
+ // Stepper specific functions.
201
+ create: function create(pageIndex) {
202
+ var debug = document.createElement('div');
203
+ debug.id = 'stepper' + pageIndex;
204
+ debug.setAttribute('hidden', true);
205
+ debug.className = 'stepper';
206
+ stepperDiv.appendChild(debug);
207
+ var b = document.createElement('option');
208
+ b.textContent = 'Page ' + (pageIndex + 1);
209
+ b.value = pageIndex;
210
+ stepperChooser.appendChild(b);
211
+ var initBreakPoints = breakPoints[pageIndex] || [];
212
+ var stepper = new Stepper(debug, pageIndex, initBreakPoints);
213
+ steppers.push(stepper);
214
+ if (steppers.length === 1) {
215
+ this.selectStepper(pageIndex, false);
216
+ }
217
+ return stepper;
218
+ },
219
+ selectStepper: function selectStepper(pageIndex, selectPanel) {
220
+ var i;
221
+ pageIndex = pageIndex | 0;
222
+ if (selectPanel) {
223
+ this.manager.selectPanel(this);
224
+ }
225
+ for (i = 0; i < steppers.length; ++i) {
226
+ var stepper = steppers[i];
227
+ if (stepper.pageIndex === pageIndex) {
228
+ stepper.panel.removeAttribute('hidden');
229
+ } else {
230
+ stepper.panel.setAttribute('hidden', true);
231
+ }
232
+ }
233
+ var options = stepperChooser.options;
234
+ for (i = 0; i < options.length; ++i) {
235
+ var option = options[i];
236
+ option.selected = (option.value | 0) === pageIndex;
237
+ }
238
+ },
239
+ saveBreakPoints: function saveBreakPoints(pageIndex, bps) {
240
+ breakPoints[pageIndex] = bps;
241
+ sessionStorage.setItem('pdfjsBreakPoints', JSON.stringify(breakPoints));
242
+ },
243
+ };
244
+ })();
245
+
246
+ // The stepper for each page's IRQueue.
247
+ var Stepper = (function StepperClosure() {
248
+ // Shorter way to create element and optionally set textContent.
249
+ function c(tag, textContent) {
250
+ var d = document.createElement(tag);
251
+ if (textContent) {
252
+ d.textContent = textContent;
253
+ }
254
+ return d;
255
+ }
256
+
257
+ function simplifyArgs(args) {
258
+ if (typeof args === 'string') {
259
+ var MAX_STRING_LENGTH = 75;
260
+ return args.length <= MAX_STRING_LENGTH ? args :
261
+ args.substring(0, MAX_STRING_LENGTH) + '...';
262
+ }
263
+ if (typeof args !== 'object' || args === null) {
264
+ return args;
265
+ }
266
+ if ('length' in args) { // array
267
+ var simpleArgs = [], i, ii;
268
+ var MAX_ITEMS = 10;
269
+ for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) {
270
+ simpleArgs.push(simplifyArgs(args[i]));
271
+ }
272
+ if (i < args.length) {
273
+ simpleArgs.push('...');
274
+ }
275
+ return simpleArgs;
276
+ }
277
+ var simpleObj = {};
278
+ for (var key in args) {
279
+ simpleObj[key] = simplifyArgs(args[key]);
280
+ }
281
+ return simpleObj;
282
+ }
283
+
284
+ function Stepper(panel, pageIndex, initialBreakPoints) {
285
+ this.panel = panel;
286
+ this.breakPoint = 0;
287
+ this.nextBreakPoint = null;
288
+ this.pageIndex = pageIndex;
289
+ this.breakPoints = initialBreakPoints;
290
+ this.currentIdx = -1;
291
+ this.operatorListIdx = 0;
292
+ }
293
+ Stepper.prototype = {
294
+ init: function init(operatorList) {
295
+ var panel = this.panel;
296
+ var content = c('div', 'c=continue, s=step');
297
+ var table = c('table');
298
+ content.appendChild(table);
299
+ table.cellSpacing = 0;
300
+ var headerRow = c('tr');
301
+ table.appendChild(headerRow);
302
+ headerRow.appendChild(c('th', 'Break'));
303
+ headerRow.appendChild(c('th', 'Idx'));
304
+ headerRow.appendChild(c('th', 'fn'));
305
+ headerRow.appendChild(c('th', 'args'));
306
+ panel.appendChild(content);
307
+ this.table = table;
308
+ this.updateOperatorList(operatorList);
309
+ },
310
+ updateOperatorList: function updateOperatorList(operatorList) {
311
+ var self = this;
312
+
313
+ function cboxOnClick() {
314
+ var x = +this.dataset.idx;
315
+ if (this.checked) {
316
+ self.breakPoints.push(x);
317
+ } else {
318
+ self.breakPoints.splice(self.breakPoints.indexOf(x), 1);
319
+ }
320
+ StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints);
321
+ }
322
+
323
+ var MAX_OPERATORS_COUNT = 15000;
324
+ if (this.operatorListIdx > MAX_OPERATORS_COUNT) {
325
+ return;
326
+ }
327
+
328
+ var chunk = document.createDocumentFragment();
329
+ var operatorsToDisplay = Math.min(MAX_OPERATORS_COUNT,
330
+ operatorList.fnArray.length);
331
+ for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) {
332
+ var line = c('tr');
333
+ line.className = 'line';
334
+ line.dataset.idx = i;
335
+ chunk.appendChild(line);
336
+ var checked = this.breakPoints.includes(i);
337
+ var args = operatorList.argsArray[i] || [];
338
+
339
+ var breakCell = c('td');
340
+ var cbox = c('input');
341
+ cbox.type = 'checkbox';
342
+ cbox.className = 'points';
343
+ cbox.checked = checked;
344
+ cbox.dataset.idx = i;
345
+ cbox.onclick = cboxOnClick;
346
+
347
+ breakCell.appendChild(cbox);
348
+ line.appendChild(breakCell);
349
+ line.appendChild(c('td', i.toString()));
350
+ var fn = opMap[operatorList.fnArray[i]];
351
+ var decArgs = args;
352
+ if (fn === 'showText') {
353
+ var glyphs = args[0];
354
+ var newArgs = [];
355
+ var str = [];
356
+ for (var j = 0; j < glyphs.length; j++) {
357
+ var glyph = glyphs[j];
358
+ if (typeof glyph === 'object' && glyph !== null) {
359
+ str.push(glyph.fontChar);
360
+ } else {
361
+ if (str.length > 0) {
362
+ newArgs.push(str.join(''));
363
+ str = [];
364
+ }
365
+ newArgs.push(glyph); // null or number
366
+ }
367
+ }
368
+ if (str.length > 0) {
369
+ newArgs.push(str.join(''));
370
+ }
371
+ decArgs = [newArgs];
372
+ }
373
+ line.appendChild(c('td', fn));
374
+ line.appendChild(c('td', JSON.stringify(simplifyArgs(decArgs))));
375
+ }
376
+ if (operatorsToDisplay < operatorList.fnArray.length) {
377
+ line = c('tr');
378
+ var lastCell = c('td', '...');
379
+ lastCell.colspan = 4;
380
+ chunk.appendChild(lastCell);
381
+ }
382
+ this.operatorListIdx = operatorList.fnArray.length;
383
+ this.table.appendChild(chunk);
384
+ },
385
+ getNextBreakPoint: function getNextBreakPoint() {
386
+ this.breakPoints.sort(function(a, b) {
387
+ return a - b;
388
+ });
389
+ for (var i = 0; i < this.breakPoints.length; i++) {
390
+ if (this.breakPoints[i] > this.currentIdx) {
391
+ return this.breakPoints[i];
392
+ }
393
+ }
394
+ return null;
395
+ },
396
+ breakIt: function breakIt(idx, callback) {
397
+ StepperManager.selectStepper(this.pageIndex, true);
398
+ var self = this;
399
+ var dom = document;
400
+ self.currentIdx = idx;
401
+ var listener = function(e) {
402
+ switch (e.keyCode) {
403
+ case 83: // step
404
+ dom.removeEventListener('keydown', listener);
405
+ self.nextBreakPoint = self.currentIdx + 1;
406
+ self.goTo(-1);
407
+ callback();
408
+ break;
409
+ case 67: // continue
410
+ dom.removeEventListener('keydown', listener);
411
+ var breakPoint = self.getNextBreakPoint();
412
+ self.nextBreakPoint = breakPoint;
413
+ self.goTo(-1);
414
+ callback();
415
+ break;
416
+ }
417
+ };
418
+ dom.addEventListener('keydown', listener);
419
+ self.goTo(idx);
420
+ },
421
+ goTo: function goTo(idx) {
422
+ var allRows = this.panel.getElementsByClassName('line');
423
+ for (var x = 0, xx = allRows.length; x < xx; ++x) {
424
+ var row = allRows[x];
425
+ if ((row.dataset.idx | 0) === idx) {
426
+ row.style.backgroundColor = 'rgb(251,250,207)';
427
+ row.scrollIntoView();
428
+ } else {
429
+ row.style.backgroundColor = null;
430
+ }
431
+ }
432
+ },
433
+ };
434
+ return Stepper;
435
+ })();
436
+
437
+ var Stats = (function Stats() {
438
+ var stats = [];
439
+ function clear(node) {
440
+ while (node.hasChildNodes()) {
441
+ node.removeChild(node.lastChild);
442
+ }
443
+ }
444
+ function getStatIndex(pageNumber) {
445
+ for (var i = 0, ii = stats.length; i < ii; ++i) {
446
+ if (stats[i].pageNumber === pageNumber) {
447
+ return i;
448
+ }
449
+ }
450
+ return false;
451
+ }
452
+ return {
453
+ // Properties/functions needed by PDFBug.
454
+ id: 'Stats',
455
+ name: 'Stats',
456
+ panel: null,
457
+ manager: null,
458
+ init(pdfjsLib) {
459
+ this.panel.setAttribute('style', 'padding: 5px;');
460
+ },
461
+ enabled: false,
462
+ active: false,
463
+ // Stats specific functions.
464
+ add(pageNumber, stat) {
465
+ if (!stat) {
466
+ return;
467
+ }
468
+ var statsIndex = getStatIndex(pageNumber);
469
+ if (statsIndex !== false) {
470
+ var b = stats[statsIndex];
471
+ this.panel.removeChild(b.div);
472
+ stats.splice(statsIndex, 1);
473
+ }
474
+ var wrapper = document.createElement('div');
475
+ wrapper.className = 'stats';
476
+ var title = document.createElement('div');
477
+ title.className = 'title';
478
+ title.textContent = 'Page: ' + pageNumber;
479
+ var statsDiv = document.createElement('div');
480
+ statsDiv.textContent = stat.toString();
481
+ wrapper.appendChild(title);
482
+ wrapper.appendChild(statsDiv);
483
+ stats.push({ pageNumber, div: wrapper, });
484
+ stats.sort(function(a, b) {
485
+ return a.pageNumber - b.pageNumber;
486
+ });
487
+ clear(this.panel);
488
+ for (var i = 0, ii = stats.length; i < ii; ++i) {
489
+ this.panel.appendChild(stats[i].div);
490
+ }
491
+ },
492
+ cleanup() {
493
+ stats = [];
494
+ clear(this.panel);
495
+ },
496
+ };
497
+ })();
498
+
499
+ // Manages all the debugging tools.
500
+ window.PDFBug = (function PDFBugClosure() {
501
+ var panelWidth = 300;
502
+ var buttons = [];
503
+ var activePanel = null;
504
+
505
+ return {
506
+ tools: [
507
+ FontInspector,
508
+ StepperManager,
509
+ Stats
510
+ ],
511
+ enable(ids) {
512
+ var all = false, tools = this.tools;
513
+ if (ids.length === 1 && ids[0] === 'all') {
514
+ all = true;
515
+ }
516
+ for (var i = 0; i < tools.length; ++i) {
517
+ var tool = tools[i];
518
+ if (all || ids.includes(tool.id)) {
519
+ tool.enabled = true;
520
+ }
521
+ }
522
+ if (!all) {
523
+ // Sort the tools by the order they are enabled.
524
+ tools.sort(function(a, b) {
525
+ var indexA = ids.indexOf(a.id);
526
+ indexA = indexA < 0 ? tools.length : indexA;
527
+ var indexB = ids.indexOf(b.id);
528
+ indexB = indexB < 0 ? tools.length : indexB;
529
+ return indexA - indexB;
530
+ });
531
+ }
532
+ },
533
+ init(pdfjsLib, container) {
534
+ /*
535
+ * Basic Layout:
536
+ * PDFBug
537
+ * Controls
538
+ * Panels
539
+ * Panel
540
+ * Panel
541
+ * ...
542
+ */
543
+ var ui = document.createElement('div');
544
+ ui.id = 'PDFBug';
545
+
546
+ var controls = document.createElement('div');
547
+ controls.setAttribute('class', 'controls');
548
+ ui.appendChild(controls);
549
+
550
+ var panels = document.createElement('div');
551
+ panels.setAttribute('class', 'panels');
552
+ ui.appendChild(panels);
553
+
554
+ container.appendChild(ui);
555
+ container.style.right = panelWidth + 'px';
556
+
557
+ // Initialize all the debugging tools.
558
+ var tools = this.tools;
559
+ var self = this;
560
+ for (var i = 0; i < tools.length; ++i) {
561
+ var tool = tools[i];
562
+ var panel = document.createElement('div');
563
+ var panelButton = document.createElement('button');
564
+ panelButton.textContent = tool.name;
565
+ panelButton.addEventListener('click', (function(selected) {
566
+ return function(event) {
567
+ event.preventDefault();
568
+ self.selectPanel(selected);
569
+ };
570
+ })(i));
571
+ controls.appendChild(panelButton);
572
+ panels.appendChild(panel);
573
+ tool.panel = panel;
574
+ tool.manager = this;
575
+ if (tool.enabled) {
576
+ tool.init(pdfjsLib);
577
+ } else {
578
+ panel.textContent = tool.name + ' is disabled. To enable add ' +
579
+ ' "' + tool.id + '" to the pdfBug parameter ' +
580
+ 'and refresh (separate multiple by commas).';
581
+ }
582
+ buttons.push(panelButton);
583
+ }
584
+ this.selectPanel(0);
585
+ },
586
+ cleanup() {
587
+ for (var i = 0, ii = this.tools.length; i < ii; i++) {
588
+ if (this.tools[i].enabled) {
589
+ this.tools[i].cleanup();
590
+ }
591
+ }
592
+ },
593
+ selectPanel(index) {
594
+ if (typeof index !== 'number') {
595
+ index = this.tools.indexOf(index);
596
+ }
597
+ if (index === activePanel) {
598
+ return;
599
+ }
600
+ activePanel = index;
601
+ var tools = this.tools;
602
+ for (var j = 0; j < tools.length; ++j) {
603
+ if (j === index) {
604
+ buttons[j].setAttribute('class', 'active');
605
+ tools[j].active = true;
606
+ tools[j].panel.removeAttribute('hidden');
607
+ } else {
608
+ buttons[j].setAttribute('class', '');
609
+ tools[j].active = false;
610
+ tools[j].panel.setAttribute('hidden', 'true');
611
+ }
612
+ }
613
+ },
614
+ };
615
+ })();