pdfjs_rails 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +37 -0
- data/Rakefile +1 -0
- data/lib/generators/pdfjs_rails/install_generator.rb +13 -0
- data/lib/pdfjs/build/pdf.js +7071 -0
- data/lib/pdfjs/build/pdf.worker.js +38687 -0
- data/lib/pdfjs/web/compatibility.js +471 -0
- data/lib/pdfjs/web/debugger.js +532 -0
- data/lib/pdfjs/web/images/annotation-check.svg +10 -0
- data/lib/pdfjs/web/images/annotation-comment.svg +15 -0
- data/lib/pdfjs/web/images/annotation-help.svg +25 -0
- data/lib/pdfjs/web/images/annotation-insert.svg +9 -0
- data/lib/pdfjs/web/images/annotation-key.svg +10 -0
- data/lib/pdfjs/web/images/annotation-newparagraph.svg +10 -0
- data/lib/pdfjs/web/images/annotation-note.svg +41 -0
- data/lib/pdfjs/web/images/annotation-paragraph.svg +15 -0
- data/lib/pdfjs/web/images/findbarButton-next-rtl.png +0 -0
- data/lib/pdfjs/web/images/findbarButton-next.png +0 -0
- data/lib/pdfjs/web/images/findbarButton-previous-rtl.png +0 -0
- data/lib/pdfjs/web/images/findbarButton-previous.png +0 -0
- data/lib/pdfjs/web/images/loading-icon.gif +0 -0
- data/lib/pdfjs/web/images/loading-small.png +0 -0
- data/lib/pdfjs/web/images/secondaryToolbarButton-firstPage.png +0 -0
- data/lib/pdfjs/web/images/secondaryToolbarButton-lastPage.png +0 -0
- data/lib/pdfjs/web/images/secondaryToolbarButton-rotateCcw.png +0 -0
- data/lib/pdfjs/web/images/secondaryToolbarButton-rotateCw.png +0 -0
- data/lib/pdfjs/web/images/shadow.png +0 -0
- data/lib/pdfjs/web/images/texture.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-bookmark.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-download.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-menuArrows.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-openFile.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-pageDown-rtl.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-pageDown.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-pageUp-rtl.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-pageUp.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-presentationMode.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-print.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-search.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-sidebarToggle.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-viewOutline.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-viewThumbnail.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-zoomIn.png +0 -0
- data/lib/pdfjs/web/images/toolbarButton-zoomOut.png +0 -0
- data/lib/pdfjs/web/l10n.js +922 -0
- data/lib/pdfjs/web/locale/ar/viewer.properties +112 -0
- data/lib/pdfjs/web/locale/ca/viewer.properties +131 -0
- data/lib/pdfjs/web/locale/cs/viewer.properties +58 -0
- data/lib/pdfjs/web/locale/da/viewer.properties +132 -0
- data/lib/pdfjs/web/locale/de/viewer.properties +128 -0
- data/lib/pdfjs/web/locale/el/viewer.properties +124 -0
- data/lib/pdfjs/web/locale/en-US/viewer.properties +134 -0
- data/lib/pdfjs/web/locale/es/viewer.properties +131 -0
- data/lib/pdfjs/web/locale/fi/viewer.properties +129 -0
- data/lib/pdfjs/web/locale/fr/viewer.properties +130 -0
- data/lib/pdfjs/web/locale/he/viewer.properties +59 -0
- data/lib/pdfjs/web/locale/it/viewer.properties +44 -0
- data/lib/pdfjs/web/locale/ja/viewer.properties +132 -0
- data/lib/pdfjs/web/locale/ko/viewer.properties +131 -0
- data/lib/pdfjs/web/locale/locale.properties +78 -0
- data/lib/pdfjs/web/locale/lt/viewer.properties +129 -0
- data/lib/pdfjs/web/locale/nl/viewer.properties +134 -0
- data/lib/pdfjs/web/locale/pl/viewer.properties +132 -0
- data/lib/pdfjs/web/locale/pt-BR/viewer.properties +44 -0
- data/lib/pdfjs/web/locale/ro/viewer.properties +55 -0
- data/lib/pdfjs/web/locale/ru/viewer.properties +62 -0
- data/lib/pdfjs/web/locale/sr/viewer.properties +55 -0
- data/lib/pdfjs/web/locale/sv/viewer.properties +134 -0
- data/lib/pdfjs/web/locale/tr/viewer.properties +129 -0
- data/lib/pdfjs/web/locale/vi/viewer.properties +131 -0
- data/lib/pdfjs/web/locale/zh-CN/viewer.properties +129 -0
- data/lib/pdfjs/web/locale/zh-TW/viewer.properties +132 -0
- data/lib/pdfjs/web/viewer.css +1544 -0
- data/lib/pdfjs/web/viewer.html +250 -0
- data/lib/pdfjs/web/viewer.js +4477 -0
- data/lib/pdfjs_rails.rb +6 -0
- data/lib/pdfjs_rails/railtie.rb +9 -0
- data/lib/pdfjs_rails/version.rb +3 -0
- data/lib/pdfjs_rails/view_helpers.rb +225 -0
- data/pdfjs_rails.gemspec +24 -0
- data/vender/assets/images/annotation-check.svg +10 -0
- data/vender/assets/images/annotation-comment.svg +15 -0
- data/vender/assets/images/annotation-help.svg +25 -0
- data/vender/assets/images/annotation-insert.svg +9 -0
- data/vender/assets/images/annotation-key.svg +10 -0
- data/vender/assets/images/annotation-newparagraph.svg +10 -0
- data/vender/assets/images/annotation-note.svg +41 -0
- data/vender/assets/images/annotation-paragraph.svg +15 -0
- data/vender/assets/images/findbarButton-next-rtl.png +0 -0
- data/vender/assets/images/findbarButton-next.png +0 -0
- data/vender/assets/images/findbarButton-previous-rtl.png +0 -0
- data/vender/assets/images/findbarButton-previous.png +0 -0
- data/vender/assets/images/loading-icon.gif +0 -0
- data/vender/assets/images/loading-small.png +0 -0
- data/vender/assets/images/shadow.png +0 -0
- data/vender/assets/images/texture.png +0 -0
- data/vender/assets/images/toolbarButton-bookmark.png +0 -0
- data/vender/assets/images/toolbarButton-download.png +0 -0
- data/vender/assets/images/toolbarButton-menuArrows.png +0 -0
- data/vender/assets/images/toolbarButton-openFile.png +0 -0
- data/vender/assets/images/toolbarButton-pageDown-rtl.png +0 -0
- data/vender/assets/images/toolbarButton-pageDown.png +0 -0
- data/vender/assets/images/toolbarButton-pageUp-rtl.png +0 -0
- data/vender/assets/images/toolbarButton-pageUp.png +0 -0
- data/vender/assets/images/toolbarButton-presentationMode.png +0 -0
- data/vender/assets/images/toolbarButton-print.png +0 -0
- data/vender/assets/images/toolbarButton-search.png +0 -0
- data/vender/assets/images/toolbarButton-sidebarToggle.png +0 -0
- data/vender/assets/images/toolbarButton-viewOutline.png +0 -0
- data/vender/assets/images/toolbarButton-viewThumbnail.png +0 -0
- data/vender/assets/images/toolbarButton-zoomIn.png +0 -0
- data/vender/assets/images/toolbarButton-zoomOut.png +0 -0
- data/vender/assets/javascripts/application.js +22 -0
- data/vender/assets/javascripts/compatibility.js +471 -0
- data/vender/assets/javascripts/debugger.js +532 -0
- data/vender/assets/javascripts/l10n.js +922 -0
- data/vender/assets/javascripts/pdf.js +7063 -0
- data/vender/assets/javascripts/pdf.worker.js +38679 -0
- data/vender/assets/javascripts/viewer.js +4317 -0
- data/vender/assets/stylesheets/viewer.css +1382 -0
- 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
|
+
})();
|