pdfjs_rails 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +37 -0
  6. data/Rakefile +1 -0
  7. data/lib/generators/pdfjs_rails/install_generator.rb +13 -0
  8. data/lib/pdfjs/build/pdf.js +7071 -0
  9. data/lib/pdfjs/build/pdf.worker.js +38687 -0
  10. data/lib/pdfjs/web/compatibility.js +471 -0
  11. data/lib/pdfjs/web/debugger.js +532 -0
  12. data/lib/pdfjs/web/images/annotation-check.svg +10 -0
  13. data/lib/pdfjs/web/images/annotation-comment.svg +15 -0
  14. data/lib/pdfjs/web/images/annotation-help.svg +25 -0
  15. data/lib/pdfjs/web/images/annotation-insert.svg +9 -0
  16. data/lib/pdfjs/web/images/annotation-key.svg +10 -0
  17. data/lib/pdfjs/web/images/annotation-newparagraph.svg +10 -0
  18. data/lib/pdfjs/web/images/annotation-note.svg +41 -0
  19. data/lib/pdfjs/web/images/annotation-paragraph.svg +15 -0
  20. data/lib/pdfjs/web/images/findbarButton-next-rtl.png +0 -0
  21. data/lib/pdfjs/web/images/findbarButton-next.png +0 -0
  22. data/lib/pdfjs/web/images/findbarButton-previous-rtl.png +0 -0
  23. data/lib/pdfjs/web/images/findbarButton-previous.png +0 -0
  24. data/lib/pdfjs/web/images/loading-icon.gif +0 -0
  25. data/lib/pdfjs/web/images/loading-small.png +0 -0
  26. data/lib/pdfjs/web/images/secondaryToolbarButton-firstPage.png +0 -0
  27. data/lib/pdfjs/web/images/secondaryToolbarButton-lastPage.png +0 -0
  28. data/lib/pdfjs/web/images/secondaryToolbarButton-rotateCcw.png +0 -0
  29. data/lib/pdfjs/web/images/secondaryToolbarButton-rotateCw.png +0 -0
  30. data/lib/pdfjs/web/images/shadow.png +0 -0
  31. data/lib/pdfjs/web/images/texture.png +0 -0
  32. data/lib/pdfjs/web/images/toolbarButton-bookmark.png +0 -0
  33. data/lib/pdfjs/web/images/toolbarButton-download.png +0 -0
  34. data/lib/pdfjs/web/images/toolbarButton-menuArrows.png +0 -0
  35. data/lib/pdfjs/web/images/toolbarButton-openFile.png +0 -0
  36. data/lib/pdfjs/web/images/toolbarButton-pageDown-rtl.png +0 -0
  37. data/lib/pdfjs/web/images/toolbarButton-pageDown.png +0 -0
  38. data/lib/pdfjs/web/images/toolbarButton-pageUp-rtl.png +0 -0
  39. data/lib/pdfjs/web/images/toolbarButton-pageUp.png +0 -0
  40. data/lib/pdfjs/web/images/toolbarButton-presentationMode.png +0 -0
  41. data/lib/pdfjs/web/images/toolbarButton-print.png +0 -0
  42. data/lib/pdfjs/web/images/toolbarButton-search.png +0 -0
  43. data/lib/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.png +0 -0
  44. data/lib/pdfjs/web/images/toolbarButton-sidebarToggle.png +0 -0
  45. data/lib/pdfjs/web/images/toolbarButton-viewOutline.png +0 -0
  46. data/lib/pdfjs/web/images/toolbarButton-viewThumbnail.png +0 -0
  47. data/lib/pdfjs/web/images/toolbarButton-zoomIn.png +0 -0
  48. data/lib/pdfjs/web/images/toolbarButton-zoomOut.png +0 -0
  49. data/lib/pdfjs/web/l10n.js +922 -0
  50. data/lib/pdfjs/web/locale/ar/viewer.properties +112 -0
  51. data/lib/pdfjs/web/locale/ca/viewer.properties +131 -0
  52. data/lib/pdfjs/web/locale/cs/viewer.properties +58 -0
  53. data/lib/pdfjs/web/locale/da/viewer.properties +132 -0
  54. data/lib/pdfjs/web/locale/de/viewer.properties +128 -0
  55. data/lib/pdfjs/web/locale/el/viewer.properties +124 -0
  56. data/lib/pdfjs/web/locale/en-US/viewer.properties +134 -0
  57. data/lib/pdfjs/web/locale/es/viewer.properties +131 -0
  58. data/lib/pdfjs/web/locale/fi/viewer.properties +129 -0
  59. data/lib/pdfjs/web/locale/fr/viewer.properties +130 -0
  60. data/lib/pdfjs/web/locale/he/viewer.properties +59 -0
  61. data/lib/pdfjs/web/locale/it/viewer.properties +44 -0
  62. data/lib/pdfjs/web/locale/ja/viewer.properties +132 -0
  63. data/lib/pdfjs/web/locale/ko/viewer.properties +131 -0
  64. data/lib/pdfjs/web/locale/locale.properties +78 -0
  65. data/lib/pdfjs/web/locale/lt/viewer.properties +129 -0
  66. data/lib/pdfjs/web/locale/nl/viewer.properties +134 -0
  67. data/lib/pdfjs/web/locale/pl/viewer.properties +132 -0
  68. data/lib/pdfjs/web/locale/pt-BR/viewer.properties +44 -0
  69. data/lib/pdfjs/web/locale/ro/viewer.properties +55 -0
  70. data/lib/pdfjs/web/locale/ru/viewer.properties +62 -0
  71. data/lib/pdfjs/web/locale/sr/viewer.properties +55 -0
  72. data/lib/pdfjs/web/locale/sv/viewer.properties +134 -0
  73. data/lib/pdfjs/web/locale/tr/viewer.properties +129 -0
  74. data/lib/pdfjs/web/locale/vi/viewer.properties +131 -0
  75. data/lib/pdfjs/web/locale/zh-CN/viewer.properties +129 -0
  76. data/lib/pdfjs/web/locale/zh-TW/viewer.properties +132 -0
  77. data/lib/pdfjs/web/viewer.css +1544 -0
  78. data/lib/pdfjs/web/viewer.html +250 -0
  79. data/lib/pdfjs/web/viewer.js +4477 -0
  80. data/lib/pdfjs_rails.rb +6 -0
  81. data/lib/pdfjs_rails/railtie.rb +9 -0
  82. data/lib/pdfjs_rails/version.rb +3 -0
  83. data/lib/pdfjs_rails/view_helpers.rb +225 -0
  84. data/pdfjs_rails.gemspec +24 -0
  85. data/vender/assets/images/annotation-check.svg +10 -0
  86. data/vender/assets/images/annotation-comment.svg +15 -0
  87. data/vender/assets/images/annotation-help.svg +25 -0
  88. data/vender/assets/images/annotation-insert.svg +9 -0
  89. data/vender/assets/images/annotation-key.svg +10 -0
  90. data/vender/assets/images/annotation-newparagraph.svg +10 -0
  91. data/vender/assets/images/annotation-note.svg +41 -0
  92. data/vender/assets/images/annotation-paragraph.svg +15 -0
  93. data/vender/assets/images/findbarButton-next-rtl.png +0 -0
  94. data/vender/assets/images/findbarButton-next.png +0 -0
  95. data/vender/assets/images/findbarButton-previous-rtl.png +0 -0
  96. data/vender/assets/images/findbarButton-previous.png +0 -0
  97. data/vender/assets/images/loading-icon.gif +0 -0
  98. data/vender/assets/images/loading-small.png +0 -0
  99. data/vender/assets/images/shadow.png +0 -0
  100. data/vender/assets/images/texture.png +0 -0
  101. data/vender/assets/images/toolbarButton-bookmark.png +0 -0
  102. data/vender/assets/images/toolbarButton-download.png +0 -0
  103. data/vender/assets/images/toolbarButton-menuArrows.png +0 -0
  104. data/vender/assets/images/toolbarButton-openFile.png +0 -0
  105. data/vender/assets/images/toolbarButton-pageDown-rtl.png +0 -0
  106. data/vender/assets/images/toolbarButton-pageDown.png +0 -0
  107. data/vender/assets/images/toolbarButton-pageUp-rtl.png +0 -0
  108. data/vender/assets/images/toolbarButton-pageUp.png +0 -0
  109. data/vender/assets/images/toolbarButton-presentationMode.png +0 -0
  110. data/vender/assets/images/toolbarButton-print.png +0 -0
  111. data/vender/assets/images/toolbarButton-search.png +0 -0
  112. data/vender/assets/images/toolbarButton-sidebarToggle.png +0 -0
  113. data/vender/assets/images/toolbarButton-viewOutline.png +0 -0
  114. data/vender/assets/images/toolbarButton-viewThumbnail.png +0 -0
  115. data/vender/assets/images/toolbarButton-zoomIn.png +0 -0
  116. data/vender/assets/images/toolbarButton-zoomOut.png +0 -0
  117. data/vender/assets/javascripts/application.js +22 -0
  118. data/vender/assets/javascripts/compatibility.js +471 -0
  119. data/vender/assets/javascripts/debugger.js +532 -0
  120. data/vender/assets/javascripts/l10n.js +922 -0
  121. data/vender/assets/javascripts/pdf.js +7063 -0
  122. data/vender/assets/javascripts/pdf.worker.js +38679 -0
  123. data/vender/assets/javascripts/viewer.js +4317 -0
  124. data/vender/assets/stylesheets/viewer.css +1382 -0
  125. metadata +209 -0
@@ -0,0 +1,532 @@
1
+ /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
+ /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
3
+ /* Copyright 2012 Mozilla Foundation
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /* globals PDFJS */
18
+
19
+ 'use strict';
20
+
21
+ var FontInspector = (function FontInspectorClosure() {
22
+ var fonts;
23
+ var panelWidth = 300;
24
+ var active = false;
25
+ var fontAttribute = 'data-font-name';
26
+ function removeSelection() {
27
+ var divs = document.querySelectorAll('div[' + fontAttribute + ']');
28
+ for (var i = 0, ii = divs.length; i < ii; ++i) {
29
+ var div = divs[i];
30
+ div.className = '';
31
+ }
32
+ }
33
+ function resetSelection() {
34
+ var divs = document.querySelectorAll('div[' + fontAttribute + ']');
35
+ for (var i = 0, ii = divs.length; i < ii; ++i) {
36
+ var div = divs[i];
37
+ div.className = 'debuggerHideText';
38
+ }
39
+ }
40
+ function selectFont(fontName, show) {
41
+ var divs = document.querySelectorAll('div[' + fontAttribute + '=' +
42
+ fontName + ']');
43
+ for (var i = 0, ii = divs.length; i < ii; ++i) {
44
+ var div = divs[i];
45
+ div.className = show ? 'debuggerShowText' : 'debuggerHideText';
46
+ }
47
+ }
48
+ function textLayerClick(e) {
49
+ if (!e.target.dataset.fontName || e.target.tagName.toUpperCase() !== 'DIV')
50
+ return;
51
+ var fontName = e.target.dataset.fontName;
52
+ var selects = document.getElementsByTagName('input');
53
+ for (var i = 0; i < selects.length; ++i) {
54
+ var select = selects[i];
55
+ if (select.dataset.fontName != fontName) continue;
56
+ select.checked = !select.checked;
57
+ selectFont(fontName, select.checked);
58
+ select.scrollIntoView();
59
+ }
60
+ }
61
+ return {
62
+ // Properties/functions needed by PDFBug.
63
+ id: 'FontInspector',
64
+ name: 'Font Inspector',
65
+ panel: null,
66
+ manager: null,
67
+ init: function init() {
68
+ var panel = this.panel;
69
+ panel.setAttribute('style', 'padding: 5px;');
70
+ var tmp = document.createElement('button');
71
+ tmp.addEventListener('click', resetSelection);
72
+ tmp.textContent = 'Refresh';
73
+ panel.appendChild(tmp);
74
+
75
+ fonts = document.createElement('div');
76
+ panel.appendChild(fonts);
77
+ },
78
+ enabled: false,
79
+ get active() {
80
+ return active;
81
+ },
82
+ set active(value) {
83
+ active = value;
84
+ if (active) {
85
+ document.body.addEventListener('click', textLayerClick, true);
86
+ resetSelection();
87
+ } else {
88
+ document.body.removeEventListener('click', textLayerClick, true);
89
+ removeSelection();
90
+ }
91
+ },
92
+ // FontInspector specific functions.
93
+ fontAdded: function fontAdded(fontObj, url) {
94
+ function properties(obj, list) {
95
+ var moreInfo = document.createElement('table');
96
+ for (var i = 0; i < list.length; i++) {
97
+ var tr = document.createElement('tr');
98
+ var td1 = document.createElement('td');
99
+ td1.textContent = list[i];
100
+ tr.appendChild(td1);
101
+ var td2 = document.createElement('td');
102
+ td2.textContent = obj[list[i]].toString();
103
+ tr.appendChild(td2);
104
+ moreInfo.appendChild(tr);
105
+ }
106
+ return moreInfo;
107
+ }
108
+ var moreInfo = properties(fontObj, ['name', 'type']);
109
+ var m = /url\(['"]?([^\)"']+)/.exec(url);
110
+ var fontName = fontObj.loadedName;
111
+ var font = document.createElement('div');
112
+ var name = document.createElement('span');
113
+ name.textContent = fontName;
114
+ var download = document.createElement('a');
115
+ download.href = m[1];
116
+ download.textContent = 'Download';
117
+ var logIt = document.createElement('a');
118
+ logIt.href = '';
119
+ logIt.textContent = 'Log';
120
+ logIt.addEventListener('click', function(event) {
121
+ event.preventDefault();
122
+ console.log(fontObj);
123
+ });
124
+ var select = document.createElement('input');
125
+ select.setAttribute('type', 'checkbox');
126
+ select.dataset.fontName = fontName;
127
+ select.addEventListener('click', (function(select, fontName) {
128
+ return (function() {
129
+ selectFont(fontName, select.checked);
130
+ });
131
+ })(select, fontName));
132
+ font.appendChild(select);
133
+ font.appendChild(name);
134
+ font.appendChild(document.createTextNode(' '));
135
+ font.appendChild(download);
136
+ font.appendChild(document.createTextNode(' '));
137
+ font.appendChild(logIt);
138
+ font.appendChild(moreInfo);
139
+ fonts.appendChild(font);
140
+ // Somewhat of a hack, should probably add a hook for when the text layer
141
+ // is done rendering.
142
+ setTimeout(function() {
143
+ if (this.active)
144
+ resetSelection();
145
+ }.bind(this), 2000);
146
+ }
147
+ };
148
+ })();
149
+
150
+ // Manages all the page steppers.
151
+ var StepperManager = (function StepperManagerClosure() {
152
+ var steppers = [];
153
+ var stepperDiv = null;
154
+ var stepperControls = null;
155
+ var stepperChooser = null;
156
+ var breakPoints = {};
157
+ return {
158
+ // Properties/functions needed by PDFBug.
159
+ id: 'Stepper',
160
+ name: 'Stepper',
161
+ panel: null,
162
+ manager: null,
163
+ init: function init() {
164
+ var self = this;
165
+ this.panel.setAttribute('style', 'padding: 5px;');
166
+ stepperControls = document.createElement('div');
167
+ stepperChooser = document.createElement('select');
168
+ stepperChooser.addEventListener('change', function(event) {
169
+ self.selectStepper(this.value);
170
+ });
171
+ stepperControls.appendChild(stepperChooser);
172
+ stepperDiv = document.createElement('div');
173
+ this.panel.appendChild(stepperControls);
174
+ this.panel.appendChild(stepperDiv);
175
+ if (sessionStorage.getItem('pdfjsBreakPoints'))
176
+ breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints'));
177
+ },
178
+ enabled: false,
179
+ active: false,
180
+ // Stepper specific functions.
181
+ create: function create(pageIndex) {
182
+ var debug = document.createElement('div');
183
+ debug.id = 'stepper' + pageIndex;
184
+ debug.setAttribute('hidden', true);
185
+ debug.className = 'stepper';
186
+ stepperDiv.appendChild(debug);
187
+ var b = document.createElement('option');
188
+ b.textContent = 'Page ' + (pageIndex + 1);
189
+ b.value = pageIndex;
190
+ stepperChooser.appendChild(b);
191
+ var initBreakPoints = breakPoints[pageIndex] || [];
192
+ var stepper = new Stepper(debug, pageIndex, initBreakPoints);
193
+ steppers.push(stepper);
194
+ if (steppers.length === 1)
195
+ this.selectStepper(pageIndex, false);
196
+ return stepper;
197
+ },
198
+ selectStepper: function selectStepper(pageIndex, selectPanel) {
199
+ if (selectPanel)
200
+ this.manager.selectPanel(1);
201
+ for (var i = 0; i < steppers.length; ++i) {
202
+ var stepper = steppers[i];
203
+ if (stepper.pageIndex == pageIndex)
204
+ stepper.panel.removeAttribute('hidden');
205
+ else
206
+ stepper.panel.setAttribute('hidden', true);
207
+ }
208
+ var options = stepperChooser.options;
209
+ for (var i = 0; i < options.length; ++i) {
210
+ var option = options[i];
211
+ option.selected = option.value == pageIndex;
212
+ }
213
+ },
214
+ saveBreakPoints: function saveBreakPoints(pageIndex, bps) {
215
+ breakPoints[pageIndex] = bps;
216
+ sessionStorage.setItem('pdfjsBreakPoints', JSON.stringify(breakPoints));
217
+ }
218
+ };
219
+ })();
220
+
221
+ // The stepper for each page's IRQueue.
222
+ var Stepper = (function StepperClosure() {
223
+ // Shorter way to create element and optionally set textContent.
224
+ function c(tag, textContent) {
225
+ var d = document.createElement(tag);
226
+ if (textContent)
227
+ d.textContent = textContent;
228
+ return d;
229
+ }
230
+
231
+ function glyphsToString(glyphs) {
232
+ var out = '';
233
+ for (var i = 0; i < glyphs.length; i++) {
234
+ if (glyphs[i] === null) {
235
+ out += ' ';
236
+ } else {
237
+ out += glyphs[i].fontChar;
238
+ }
239
+ }
240
+ return out;
241
+ }
242
+
243
+ var glyphCommands = {
244
+ 'showText': 0,
245
+ 'showSpacedText': 0,
246
+ 'nextLineShowText': 0,
247
+ 'nextLineSetSpacingShowText': 2
248
+ };
249
+
250
+ function Stepper(panel, pageIndex, initialBreakPoints) {
251
+ this.panel = panel;
252
+ this.breakPoint = 0;
253
+ this.nextBreakPoint = null;
254
+ this.pageIndex = pageIndex;
255
+ this.breakPoints = initialBreakPoints;
256
+ this.currentIdx = -1;
257
+ this.operatorListIdx = 0;
258
+ }
259
+ Stepper.prototype = {
260
+ init: function init() {
261
+ var panel = this.panel;
262
+ var content = c('div', 'c=continue, s=step');
263
+ var table = c('table');
264
+ content.appendChild(table);
265
+ table.cellSpacing = 0;
266
+ var headerRow = c('tr');
267
+ table.appendChild(headerRow);
268
+ headerRow.appendChild(c('th', 'Break'));
269
+ headerRow.appendChild(c('th', 'Idx'));
270
+ headerRow.appendChild(c('th', 'fn'));
271
+ headerRow.appendChild(c('th', 'args'));
272
+ panel.appendChild(content);
273
+ this.table = table;
274
+ },
275
+ updateOperatorList: function updateOperatorList(operatorList) {
276
+ var self = this;
277
+ for (var i = this.operatorListIdx; i < operatorList.fnArray.length; i++) {
278
+ var line = c('tr');
279
+ line.className = 'line';
280
+ line.dataset.idx = i;
281
+ this.table.appendChild(line);
282
+ var checked = this.breakPoints.indexOf(i) != -1;
283
+ var args = operatorList.argsArray[i] ? operatorList.argsArray[i] : [];
284
+
285
+ var breakCell = c('td');
286
+ var cbox = c('input');
287
+ cbox.type = 'checkbox';
288
+ cbox.className = 'points';
289
+ cbox.checked = checked;
290
+ cbox.onclick = (function(x) {
291
+ return function() {
292
+ if (this.checked)
293
+ self.breakPoints.push(x);
294
+ else
295
+ self.breakPoints.splice(self.breakPoints.indexOf(x), 1);
296
+ StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints);
297
+ };
298
+ })(i);
299
+
300
+ breakCell.appendChild(cbox);
301
+ line.appendChild(breakCell);
302
+ line.appendChild(c('td', i.toString()));
303
+ var fn = operatorList.fnArray[i];
304
+ var decArgs = args;
305
+ if (fn in glyphCommands) {
306
+ var glyphIndex = glyphCommands[fn];
307
+ var glyphs = args[glyphIndex];
308
+ var decArgs = args.slice();
309
+ var newArg;
310
+ if (fn === 'showSpacedText') {
311
+ newArg = [];
312
+ for (var j = 0; j < glyphs.length; j++) {
313
+ if (typeof glyphs[j] === 'number') {
314
+ newArg.push(glyphs[j]);
315
+ } else {
316
+ newArg.push(glyphsToString(glyphs[j]));
317
+ }
318
+ }
319
+ } else {
320
+ newArg = glyphsToString(glyphs);
321
+ }
322
+ decArgs[glyphIndex] = newArg;
323
+ }
324
+ line.appendChild(c('td', fn));
325
+ line.appendChild(c('td', JSON.stringify(decArgs)));
326
+ }
327
+ },
328
+ getNextBreakPoint: function getNextBreakPoint() {
329
+ this.breakPoints.sort(function(a, b) { return a - b; });
330
+ for (var i = 0; i < this.breakPoints.length; i++) {
331
+ if (this.breakPoints[i] > this.currentIdx)
332
+ return this.breakPoints[i];
333
+ }
334
+ return null;
335
+ },
336
+ breakIt: function breakIt(idx, callback) {
337
+ StepperManager.selectStepper(this.pageIndex, true);
338
+ var self = this;
339
+ var dom = document;
340
+ self.currentIdx = idx;
341
+ var listener = function(e) {
342
+ switch (e.keyCode) {
343
+ case 83: // step
344
+ dom.removeEventListener('keydown', listener, false);
345
+ self.nextBreakPoint = self.currentIdx + 1;
346
+ self.goTo(-1);
347
+ callback();
348
+ break;
349
+ case 67: // continue
350
+ dom.removeEventListener('keydown', listener, false);
351
+ var breakPoint = self.getNextBreakPoint();
352
+ self.nextBreakPoint = breakPoint;
353
+ self.goTo(-1);
354
+ callback();
355
+ break;
356
+ }
357
+ };
358
+ dom.addEventListener('keydown', listener, false);
359
+ self.goTo(idx);
360
+ },
361
+ goTo: function goTo(idx) {
362
+ var allRows = this.panel.getElementsByClassName('line');
363
+ for (var x = 0, xx = allRows.length; x < xx; ++x) {
364
+ var row = allRows[x];
365
+ if (row.dataset.idx == idx) {
366
+ row.style.backgroundColor = 'rgb(251,250,207)';
367
+ row.scrollIntoView();
368
+ } else {
369
+ row.style.backgroundColor = null;
370
+ }
371
+ }
372
+ }
373
+ };
374
+ return Stepper;
375
+ })();
376
+
377
+ var Stats = (function Stats() {
378
+ var stats = [];
379
+ function clear(node) {
380
+ while (node.hasChildNodes())
381
+ node.removeChild(node.lastChild);
382
+ }
383
+ function getStatIndex(pageNumber) {
384
+ for (var i = 0, ii = stats.length; i < ii; ++i)
385
+ if (stats[i].pageNumber === pageNumber)
386
+ return i;
387
+ return false;
388
+ }
389
+ return {
390
+ // Properties/functions needed by PDFBug.
391
+ id: 'Stats',
392
+ name: 'Stats',
393
+ panel: null,
394
+ manager: null,
395
+ init: function init() {
396
+ this.panel.setAttribute('style', 'padding: 5px;');
397
+ PDFJS.enableStats = true;
398
+ },
399
+ enabled: false,
400
+ active: false,
401
+ // Stats specific functions.
402
+ add: function(pageNumber, stat) {
403
+ if (!stat)
404
+ return;
405
+ var statsIndex = getStatIndex(pageNumber);
406
+ if (statsIndex !== false) {
407
+ var b = stats[statsIndex];
408
+ this.panel.removeChild(b.div);
409
+ stats.splice(statsIndex, 1);
410
+ }
411
+ var wrapper = document.createElement('div');
412
+ wrapper.className = 'stats';
413
+ var title = document.createElement('div');
414
+ title.className = 'title';
415
+ title.textContent = 'Page: ' + pageNumber;
416
+ var statsDiv = document.createElement('div');
417
+ statsDiv.textContent = stat.toString();
418
+ wrapper.appendChild(title);
419
+ wrapper.appendChild(statsDiv);
420
+ stats.push({ pageNumber: pageNumber, div: wrapper });
421
+ stats.sort(function(a, b) { return a.pageNumber - b.pageNumber; });
422
+ clear(this.panel);
423
+ for (var i = 0, ii = stats.length; i < ii; ++i)
424
+ this.panel.appendChild(stats[i].div);
425
+ }
426
+ };
427
+ })();
428
+
429
+ // Manages all the debugging tools.
430
+ var PDFBug = (function PDFBugClosure() {
431
+ var panelWidth = 300;
432
+ var buttons = [];
433
+ var activePanel = null;
434
+
435
+ return {
436
+ tools: [
437
+ FontInspector,
438
+ StepperManager,
439
+ Stats
440
+ ],
441
+ enable: function(ids) {
442
+ var all = false, tools = this.tools;
443
+ if (ids.length === 1 && ids[0] === 'all')
444
+ all = true;
445
+ for (var i = 0; i < tools.length; ++i) {
446
+ var tool = tools[i];
447
+ if (all || ids.indexOf(tool.id) !== -1)
448
+ tool.enabled = true;
449
+ }
450
+ if (!all) {
451
+ // Sort the tools by the order they are enabled.
452
+ tools.sort(function(a, b) {
453
+ var indexA = ids.indexOf(a.id);
454
+ indexA = indexA < 0 ? tools.length : indexA;
455
+ var indexB = ids.indexOf(b.id);
456
+ indexB = indexB < 0 ? tools.length : indexB;
457
+ return indexA - indexB;
458
+ });
459
+ }
460
+ },
461
+ init: function init() {
462
+ /*
463
+ * Basic Layout:
464
+ * PDFBug
465
+ * Controls
466
+ * Panels
467
+ * Panel
468
+ * Panel
469
+ * ...
470
+ */
471
+ var ui = document.createElement('div');
472
+ ui.id = 'PDFBug';
473
+
474
+ var controls = document.createElement('div');
475
+ controls.setAttribute('class', 'controls');
476
+ ui.appendChild(controls);
477
+
478
+ var panels = document.createElement('div');
479
+ panels.setAttribute('class', 'panels');
480
+ ui.appendChild(panels);
481
+
482
+ var container = document.getElementById('viewerContainer');
483
+ container.appendChild(ui);
484
+ container.style.right = panelWidth + 'px';
485
+
486
+ // Initialize all the debugging tools.
487
+ var tools = this.tools;
488
+ var self = this;
489
+ for (var i = 0; i < tools.length; ++i) {
490
+ var tool = tools[i];
491
+ var panel = document.createElement('div');
492
+ var panelButton = document.createElement('button');
493
+ panelButton.textContent = tool.name;
494
+ panelButton.addEventListener('click', (function(selected) {
495
+ return function(event) {
496
+ event.preventDefault();
497
+ self.selectPanel(selected);
498
+ };
499
+ })(i));
500
+ controls.appendChild(panelButton);
501
+ panels.appendChild(panel);
502
+ tool.panel = panel;
503
+ tool.manager = this;
504
+ if (tool.enabled)
505
+ tool.init();
506
+ else
507
+ panel.textContent = tool.name + ' is disabled. To enable add ' +
508
+ ' "' + tool.id + '" to the pdfBug parameter ' +
509
+ 'and refresh (seperate multiple by commas).';
510
+ buttons.push(panelButton);
511
+ }
512
+ this.selectPanel(0);
513
+ },
514
+ selectPanel: function selectPanel(index) {
515
+ if (index === activePanel)
516
+ return;
517
+ activePanel = index;
518
+ var tools = this.tools;
519
+ for (var j = 0; j < tools.length; ++j) {
520
+ if (j == index) {
521
+ buttons[j].setAttribute('class', 'active');
522
+ tools[j].active = true;
523
+ tools[j].panel.removeAttribute('hidden');
524
+ } else {
525
+ buttons[j].setAttribute('class', '');
526
+ tools[j].active = false;
527
+ tools[j].panel.setAttribute('hidden', 'true');
528
+ }
529
+ }
530
+ }
531
+ };
532
+ })();