ng2-pdfjs-viewer 6.0.2 → 14.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 (161) hide show
  1. package/LICENSE +51 -0
  2. package/{README.MD → README.md} +5 -5
  3. package/esm2020/index.mjs +3 -0
  4. package/esm2020/ng2-pdfjs-viewer.mjs +5 -0
  5. package/esm2020/src/ng2-pdfjs-viewer.component.mjs +383 -0
  6. package/esm2020/src/ng2-pdfjs-viewer.module.mjs +23 -0
  7. package/fesm2015/ng2-pdfjs-viewer.mjs +410 -0
  8. package/fesm2015/ng2-pdfjs-viewer.mjs.map +1 -0
  9. package/fesm2020/ng2-pdfjs-viewer.mjs +410 -0
  10. package/fesm2020/ng2-pdfjs-viewer.mjs.map +1 -0
  11. package/index.d.ts +2 -5
  12. package/ng2-pdfjs-viewer.d.ts +1 -0
  13. package/package.json +52 -30
  14. package/pdfjs/build/pdf.js +24384 -24384
  15. package/pdfjs/web/debugger.js +615 -615
  16. package/pdfjs/web/images/annotation-check.svg +11 -11
  17. package/pdfjs/web/images/annotation-comment.svg +16 -16
  18. package/pdfjs/web/images/annotation-help.svg +26 -26
  19. package/pdfjs/web/images/annotation-insert.svg +10 -10
  20. package/pdfjs/web/images/annotation-key.svg +11 -11
  21. package/pdfjs/web/images/annotation-newparagraph.svg +11 -11
  22. package/pdfjs/web/images/annotation-noicon.svg +7 -7
  23. package/pdfjs/web/images/annotation-note.svg +42 -42
  24. package/pdfjs/web/images/annotation-paragraph.svg +16 -16
  25. package/pdfjs/web/locale/ach/viewer.properties +207 -207
  26. package/pdfjs/web/locale/af/viewer.properties +184 -184
  27. package/pdfjs/web/locale/ak/viewer.properties +130 -130
  28. package/pdfjs/web/locale/an/viewer.properties +184 -184
  29. package/pdfjs/web/locale/ar/viewer.properties +242 -242
  30. package/pdfjs/web/locale/as/viewer.properties +167 -167
  31. package/pdfjs/web/locale/ast/viewer.properties +201 -201
  32. package/pdfjs/web/locale/az/viewer.properties +242 -242
  33. package/pdfjs/web/locale/be/viewer.properties +242 -242
  34. package/pdfjs/web/locale/bg/viewer.properties +242 -242
  35. package/pdfjs/web/locale/bn-BD/viewer.properties +232 -232
  36. package/pdfjs/web/locale/bn-IN/viewer.properties +242 -242
  37. package/pdfjs/web/locale/br/viewer.properties +242 -242
  38. package/pdfjs/web/locale/brx/viewer.properties +167 -167
  39. package/pdfjs/web/locale/bs/viewer.properties +201 -201
  40. package/pdfjs/web/locale/ca/viewer.properties +236 -236
  41. package/pdfjs/web/locale/cak/viewer.properties +242 -242
  42. package/pdfjs/web/locale/crh/viewer.properties +242 -242
  43. package/pdfjs/web/locale/cs/viewer.properties +242 -242
  44. package/pdfjs/web/locale/csb/viewer.properties +134 -134
  45. package/pdfjs/web/locale/cy/viewer.properties +242 -242
  46. package/pdfjs/web/locale/da/viewer.properties +242 -242
  47. package/pdfjs/web/locale/de/viewer.properties +242 -242
  48. package/pdfjs/web/locale/el/viewer.properties +242 -242
  49. package/pdfjs/web/locale/en-CA/viewer.properties +242 -242
  50. package/pdfjs/web/locale/en-GB/viewer.properties +242 -242
  51. package/pdfjs/web/locale/en-US/viewer.properties +246 -246
  52. package/pdfjs/web/locale/en-ZA/viewer.properties +170 -170
  53. package/pdfjs/web/locale/eo/viewer.properties +242 -242
  54. package/pdfjs/web/locale/es-AR/viewer.properties +242 -242
  55. package/pdfjs/web/locale/es-CL/viewer.properties +242 -242
  56. package/pdfjs/web/locale/es-ES/viewer.properties +242 -242
  57. package/pdfjs/web/locale/es-MX/viewer.properties +242 -242
  58. package/pdfjs/web/locale/et/viewer.properties +242 -242
  59. package/pdfjs/web/locale/eu/viewer.properties +242 -242
  60. package/pdfjs/web/locale/fa/viewer.properties +223 -223
  61. package/pdfjs/web/locale/ff/viewer.properties +242 -242
  62. package/pdfjs/web/locale/fi/viewer.properties +242 -242
  63. package/pdfjs/web/locale/fr/viewer.properties +242 -242
  64. package/pdfjs/web/locale/fy-NL/viewer.properties +242 -242
  65. package/pdfjs/web/locale/ga-IE/viewer.properties +184 -184
  66. package/pdfjs/web/locale/gd/viewer.properties +242 -242
  67. package/pdfjs/web/locale/gl/viewer.properties +242 -242
  68. package/pdfjs/web/locale/gn/viewer.properties +242 -242
  69. package/pdfjs/web/locale/gu-IN/viewer.properties +242 -242
  70. package/pdfjs/web/locale/he/viewer.properties +240 -240
  71. package/pdfjs/web/locale/hi-IN/viewer.properties +224 -224
  72. package/pdfjs/web/locale/hr/viewer.properties +242 -242
  73. package/pdfjs/web/locale/hsb/viewer.properties +242 -242
  74. package/pdfjs/web/locale/hto/viewer.properties +127 -127
  75. package/pdfjs/web/locale/hu/viewer.properties +242 -242
  76. package/pdfjs/web/locale/hy-AM/viewer.properties +201 -201
  77. package/pdfjs/web/locale/ia/viewer.properties +242 -242
  78. package/pdfjs/web/locale/id/viewer.properties +242 -242
  79. package/pdfjs/web/locale/is/viewer.properties +239 -239
  80. package/pdfjs/web/locale/it/viewer.properties +157 -157
  81. package/pdfjs/web/locale/ja/viewer.properties +242 -242
  82. package/pdfjs/web/locale/ka/viewer.properties +242 -242
  83. package/pdfjs/web/locale/kab/viewer.properties +242 -242
  84. package/pdfjs/web/locale/kk/viewer.properties +242 -242
  85. package/pdfjs/web/locale/km/viewer.properties +184 -184
  86. package/pdfjs/web/locale/kn/viewer.properties +193 -193
  87. package/pdfjs/web/locale/ko/viewer.properties +242 -242
  88. package/pdfjs/web/locale/kok/viewer.properties +167 -167
  89. package/pdfjs/web/locale/ks/viewer.properties +168 -168
  90. package/pdfjs/web/locale/ku/viewer.properties +146 -146
  91. package/pdfjs/web/locale/lg/viewer.properties +112 -112
  92. package/pdfjs/web/locale/lij/viewer.properties +242 -242
  93. package/pdfjs/web/locale/lo/viewer.properties +152 -152
  94. package/pdfjs/web/locale/locale.properties +369 -369
  95. package/pdfjs/web/locale/lt/viewer.properties +242 -242
  96. package/pdfjs/web/locale/ltg/viewer.properties +220 -220
  97. package/pdfjs/web/locale/lv/viewer.properties +242 -242
  98. package/pdfjs/web/locale/mai/viewer.properties +168 -168
  99. package/pdfjs/web/locale/meh/viewer.properties +72 -72
  100. package/pdfjs/web/locale/mk/viewer.properties +145 -145
  101. package/pdfjs/web/locale/ml/viewer.properties +184 -184
  102. package/pdfjs/web/locale/mn/viewer.properties +82 -82
  103. package/pdfjs/web/locale/mr/viewer.properties +227 -227
  104. package/pdfjs/web/locale/ms/viewer.properties +242 -242
  105. package/pdfjs/web/locale/my/viewer.properties +198 -198
  106. package/pdfjs/web/locale/nb-NO/viewer.properties +242 -242
  107. package/pdfjs/web/locale/ne-NP/viewer.properties +184 -184
  108. package/pdfjs/web/locale/nl/viewer.properties +246 -246
  109. package/pdfjs/web/locale/nn-NO/viewer.properties +242 -242
  110. package/pdfjs/web/locale/nso/viewer.properties +130 -130
  111. package/pdfjs/web/locale/oc/viewer.properties +210 -210
  112. package/pdfjs/web/locale/or/viewer.properties +167 -167
  113. package/pdfjs/web/locale/pa-IN/viewer.properties +225 -225
  114. package/pdfjs/web/locale/pl/viewer.properties +242 -242
  115. package/pdfjs/web/locale/pt-BR/viewer.properties +242 -242
  116. package/pdfjs/web/locale/pt-PT/viewer.properties +242 -242
  117. package/pdfjs/web/locale/rm/viewer.properties +242 -242
  118. package/pdfjs/web/locale/ro/viewer.properties +242 -242
  119. package/pdfjs/web/locale/ru/viewer.properties +242 -242
  120. package/pdfjs/web/locale/rw/viewer.properties +81 -81
  121. package/pdfjs/web/locale/sah/viewer.properties +166 -166
  122. package/pdfjs/web/locale/sat/viewer.properties +134 -134
  123. package/pdfjs/web/locale/si/viewer.properties +207 -207
  124. package/pdfjs/web/locale/sk/viewer.properties +242 -242
  125. package/pdfjs/web/locale/sl/viewer.properties +242 -242
  126. package/pdfjs/web/locale/son/viewer.properties +180 -180
  127. package/pdfjs/web/locale/sq/viewer.properties +235 -235
  128. package/pdfjs/web/locale/sr/viewer.properties +220 -220
  129. package/pdfjs/web/locale/sv-SE/viewer.properties +242 -242
  130. package/pdfjs/web/locale/sw/viewer.properties +128 -128
  131. package/pdfjs/web/locale/ta/viewer.properties +201 -201
  132. package/pdfjs/web/locale/ta-LK/viewer.properties +77 -77
  133. package/pdfjs/web/locale/te/viewer.properties +218 -218
  134. package/pdfjs/web/locale/th/viewer.properties +242 -242
  135. package/pdfjs/web/locale/tl/viewer.properties +242 -242
  136. package/pdfjs/web/locale/tn/viewer.properties +83 -83
  137. package/pdfjs/web/locale/tr/viewer.properties +242 -242
  138. package/pdfjs/web/locale/tsz/viewer.properties +75 -75
  139. package/pdfjs/web/locale/uk/viewer.properties +242 -242
  140. package/pdfjs/web/locale/ur/viewer.properties +207 -207
  141. package/pdfjs/web/locale/uz/viewer.properties +169 -169
  142. package/pdfjs/web/locale/vi/viewer.properties +239 -239
  143. package/pdfjs/web/locale/wo/viewer.properties +124 -124
  144. package/pdfjs/web/locale/xh/viewer.properties +184 -184
  145. package/pdfjs/web/locale/zam/viewer.properties +90 -90
  146. package/pdfjs/web/locale/zh-CN/viewer.properties +242 -242
  147. package/pdfjs/web/locale/zh-TW/viewer.properties +242 -242
  148. package/pdfjs/web/locale/zu/viewer.properties +131 -131
  149. package/pdfjs/web/viewer.css +2405 -2405
  150. package/pdfjs/web/viewer.html +394 -394
  151. package/pdfjs/web/viewer.js +15876 -15876
  152. package/{ng2-pdfjs-viewer.component.d.ts → src/ng2-pdfjs-viewer.component.d.ts} +3 -0
  153. package/src/ng2-pdfjs-viewer.module.d.ts +10 -0
  154. package/index.js +0 -437
  155. package/ng2-pdfjs-viewer.metadata.json +0 -1
  156. package/ng2-pdfjs-viewer.umd.js +0 -445
  157. package/pdfjs/build/pdf.min.js +0 -1
  158. package/pdfjs/build/pdf.worker.min.js +0 -1
  159. package/pdfjs/web/cmaps/LICENSE +0 -36
  160. package/pdfjs/web/debugger.min.js +0 -1
  161. package/pdfjs/web/viewer.min.js +0 -1
@@ -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
+ })();