pdfjs_rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
+ })();