pdfjs 0.0.1 → 0.0.2

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 (230) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +39 -2
  3. data/Rakefile +2 -0
  4. data/app/assets/images/pdfjs/annotation-check.svg +11 -0
  5. data/app/assets/images/pdfjs/annotation-comment.svg +16 -0
  6. data/app/assets/images/pdfjs/annotation-help.svg +26 -0
  7. data/app/assets/images/pdfjs/annotation-insert.svg +10 -0
  8. data/app/assets/images/pdfjs/annotation-key.svg +11 -0
  9. data/app/assets/images/pdfjs/annotation-newparagraph.svg +11 -0
  10. data/app/assets/images/pdfjs/annotation-noicon.svg +7 -0
  11. data/app/assets/images/pdfjs/annotation-note.svg +42 -0
  12. data/app/assets/images/pdfjs/annotation-paragraph.svg +16 -0
  13. data/app/assets/images/pdfjs/findbarButton-next-rtl.png +0 -0
  14. data/app/assets/images/pdfjs/findbarButton-next-rtl@2x.png +0 -0
  15. data/app/assets/images/pdfjs/findbarButton-next.png +0 -0
  16. data/app/assets/images/pdfjs/findbarButton-next@2x.png +0 -0
  17. data/app/assets/images/pdfjs/findbarButton-previous-rtl.png +0 -0
  18. data/app/assets/images/pdfjs/findbarButton-previous-rtl@2x.png +0 -0
  19. data/app/assets/images/pdfjs/findbarButton-previous.png +0 -0
  20. data/app/assets/images/pdfjs/findbarButton-previous@2x.png +0 -0
  21. data/app/assets/images/pdfjs/grab.cur +0 -0
  22. data/app/assets/images/pdfjs/grabbing.cur +0 -0
  23. data/app/assets/images/pdfjs/loading-icon.gif +0 -0
  24. data/app/assets/images/pdfjs/loading-small.png +0 -0
  25. data/app/assets/images/pdfjs/loading-small@2x.png +0 -0
  26. data/app/assets/images/pdfjs/loading.gif +0 -0
  27. data/app/assets/images/pdfjs/secondaryToolbarButton-documentProperties.png +0 -0
  28. data/app/assets/images/pdfjs/secondaryToolbarButton-documentProperties@2x.png +0 -0
  29. data/app/assets/images/pdfjs/secondaryToolbarButton-firstPage.png +0 -0
  30. data/app/assets/images/pdfjs/secondaryToolbarButton-firstPage@2x.png +0 -0
  31. data/app/assets/images/pdfjs/secondaryToolbarButton-handTool.png +0 -0
  32. data/app/assets/images/pdfjs/secondaryToolbarButton-handTool@2x.png +0 -0
  33. data/app/assets/images/pdfjs/secondaryToolbarButton-lastPage.png +0 -0
  34. data/app/assets/images/pdfjs/secondaryToolbarButton-lastPage@2x.png +0 -0
  35. data/app/assets/images/pdfjs/secondaryToolbarButton-rotateCcw.png +0 -0
  36. data/app/assets/images/pdfjs/secondaryToolbarButton-rotateCcw@2x.png +0 -0
  37. data/app/assets/images/pdfjs/secondaryToolbarButton-rotateCw.png +0 -0
  38. data/app/assets/images/pdfjs/secondaryToolbarButton-rotateCw@2x.png +0 -0
  39. data/app/assets/images/pdfjs/shadow.png +0 -0
  40. data/app/assets/images/pdfjs/texture.png +0 -0
  41. data/app/assets/images/pdfjs/toolbarButton-bookmark.png +0 -0
  42. data/app/assets/images/pdfjs/toolbarButton-bookmark@2x.png +0 -0
  43. data/app/assets/images/pdfjs/toolbarButton-download.png +0 -0
  44. data/app/assets/images/pdfjs/toolbarButton-download@2x.png +0 -0
  45. data/app/assets/images/pdfjs/toolbarButton-menuArrows.png +0 -0
  46. data/app/assets/images/pdfjs/toolbarButton-menuArrows@2x.png +0 -0
  47. data/app/assets/images/pdfjs/toolbarButton-openFile.png +0 -0
  48. data/app/assets/images/pdfjs/toolbarButton-openFile@2x.png +0 -0
  49. data/app/assets/images/pdfjs/toolbarButton-pageDown-rtl.png +0 -0
  50. data/app/assets/images/pdfjs/toolbarButton-pageDown-rtl@2x.png +0 -0
  51. data/app/assets/images/pdfjs/toolbarButton-pageDown.png +0 -0
  52. data/app/assets/images/pdfjs/toolbarButton-pageDown@2x.png +0 -0
  53. data/app/assets/images/pdfjs/toolbarButton-pageUp-rtl.png +0 -0
  54. data/app/assets/images/pdfjs/toolbarButton-pageUp-rtl@2x.png +0 -0
  55. data/app/assets/images/pdfjs/toolbarButton-pageUp.png +0 -0
  56. data/app/assets/images/pdfjs/toolbarButton-pageUp@2x.png +0 -0
  57. data/app/assets/images/pdfjs/toolbarButton-presentationMode.png +0 -0
  58. data/app/assets/images/pdfjs/toolbarButton-presentationMode@2x.png +0 -0
  59. data/app/assets/images/pdfjs/toolbarButton-print.png +0 -0
  60. data/app/assets/images/pdfjs/toolbarButton-print@2x.png +0 -0
  61. data/app/assets/images/pdfjs/toolbarButton-search.png +0 -0
  62. data/app/assets/images/pdfjs/toolbarButton-search@2x.png +0 -0
  63. data/app/assets/images/pdfjs/toolbarButton-secondaryToolbarToggle-rtl.png +0 -0
  64. data/app/assets/images/pdfjs/toolbarButton-secondaryToolbarToggle-rtl@2x.png +0 -0
  65. data/app/assets/images/pdfjs/toolbarButton-secondaryToolbarToggle.png +0 -0
  66. data/app/assets/images/pdfjs/toolbarButton-secondaryToolbarToggle@2x.png +0 -0
  67. data/app/assets/images/pdfjs/toolbarButton-sidebarToggle-rtl.png +0 -0
  68. data/app/assets/images/pdfjs/toolbarButton-sidebarToggle-rtl@2x.png +0 -0
  69. data/app/assets/images/pdfjs/toolbarButton-sidebarToggle.png +0 -0
  70. data/app/assets/images/pdfjs/toolbarButton-sidebarToggle@2x.png +0 -0
  71. data/app/assets/images/pdfjs/toolbarButton-viewAttachments.png +0 -0
  72. data/app/assets/images/pdfjs/toolbarButton-viewAttachments@2x.png +0 -0
  73. data/app/assets/images/pdfjs/toolbarButton-viewOutline-rtl.png +0 -0
  74. data/app/assets/images/pdfjs/toolbarButton-viewOutline-rtl@2x.png +0 -0
  75. data/app/assets/images/pdfjs/toolbarButton-viewOutline.png +0 -0
  76. data/app/assets/images/pdfjs/toolbarButton-viewOutline@2x.png +0 -0
  77. data/app/assets/images/pdfjs/toolbarButton-viewThumbnail.png +0 -0
  78. data/app/assets/images/pdfjs/toolbarButton-viewThumbnail@2x.png +0 -0
  79. data/app/assets/images/pdfjs/toolbarButton-zoomIn.png +0 -0
  80. data/app/assets/images/pdfjs/toolbarButton-zoomIn@2x.png +0 -0
  81. data/app/assets/images/pdfjs/toolbarButton-zoomOut.png +0 -0
  82. data/app/assets/images/pdfjs/toolbarButton-zoomOut@2x.png +0 -0
  83. data/app/assets/javascripts/pdfjs.js +5 -0
  84. data/app/assets/javascripts/pdfjs/compatibility.js +574 -0
  85. data/app/assets/javascripts/pdfjs/debugger.js +620 -0
  86. data/app/assets/javascripts/pdfjs/l10n.js +1004 -0
  87. data/app/assets/javascripts/pdfjs/pdf.js +7793 -0
  88. data/app/assets/javascripts/pdfjs/pdf.worker.js +38661 -0
  89. data/app/assets/javascripts/pdfjs/viewer.js.erb +6912 -0
  90. data/app/assets/stylesheets/pdfjs.scss +3 -0
  91. data/app/assets/stylesheets/pdfjs/viewer.css.erb +1989 -0
  92. data/app/controllers/pdfjs/application_controller.rb +4 -0
  93. data/app/controllers/pdfjs/pdfjs_controller.rb +4 -0
  94. data/app/helpers/pdfjs/application_helper.rb +4 -0
  95. data/app/views/layouts/pdfjs/application.html.erb +396 -0
  96. data/config/routes.rb +2 -0
  97. data/lib/pdfjs.rb +2 -1
  98. data/lib/pdfjs/engine.rb +9 -0
  99. data/lib/pdfjs/version.rb +1 -1
  100. data/test/controllers/pdfjs_controller_test.rb +7 -0
  101. data/test/dummy/README.rdoc +28 -0
  102. data/test/dummy/Rakefile +6 -0
  103. data/test/dummy/app/assets/images/pdfjs/annotation-check.svg +11 -0
  104. data/test/dummy/app/assets/images/pdfjs/annotation-comment.svg +16 -0
  105. data/test/dummy/app/assets/images/pdfjs/annotation-help.svg +26 -0
  106. data/test/dummy/app/assets/images/pdfjs/annotation-insert.svg +10 -0
  107. data/test/dummy/app/assets/images/pdfjs/annotation-key.svg +11 -0
  108. data/test/dummy/app/assets/images/pdfjs/annotation-newparagraph.svg +11 -0
  109. data/test/dummy/app/assets/images/pdfjs/annotation-noicon.svg +7 -0
  110. data/test/dummy/app/assets/images/pdfjs/annotation-note.svg +42 -0
  111. data/test/dummy/app/assets/images/pdfjs/annotation-paragraph.svg +16 -0
  112. data/test/dummy/app/assets/images/pdfjs/findbarButton-next-rtl.png +0 -0
  113. data/test/dummy/app/assets/images/pdfjs/findbarButton-next-rtl@2x.png +0 -0
  114. data/test/dummy/app/assets/images/pdfjs/findbarButton-next.png +0 -0
  115. data/test/dummy/app/assets/images/pdfjs/findbarButton-next@2x.png +0 -0
  116. data/test/dummy/app/assets/images/pdfjs/findbarButton-previous-rtl.png +0 -0
  117. data/test/dummy/app/assets/images/pdfjs/findbarButton-previous-rtl@2x.png +0 -0
  118. data/test/dummy/app/assets/images/pdfjs/findbarButton-previous.png +0 -0
  119. data/test/dummy/app/assets/images/pdfjs/findbarButton-previous@2x.png +0 -0
  120. data/test/dummy/app/assets/images/pdfjs/grab.cur +0 -0
  121. data/test/dummy/app/assets/images/pdfjs/grabbing.cur +0 -0
  122. data/test/dummy/app/assets/images/pdfjs/loading-icon.gif +0 -0
  123. data/test/dummy/app/assets/images/pdfjs/loading-small.png +0 -0
  124. data/test/dummy/app/assets/images/pdfjs/loading-small@2x.png +0 -0
  125. data/test/dummy/app/assets/images/pdfjs/loading.gif +0 -0
  126. data/test/dummy/app/assets/images/pdfjs/secondaryToolbarButton-documentProperties.png +0 -0
  127. data/test/dummy/app/assets/images/pdfjs/secondaryToolbarButton-documentProperties@2x.png +0 -0
  128. data/test/dummy/app/assets/images/pdfjs/secondaryToolbarButton-firstPage.png +0 -0
  129. data/test/dummy/app/assets/images/pdfjs/secondaryToolbarButton-firstPage@2x.png +0 -0
  130. data/test/dummy/app/assets/images/pdfjs/secondaryToolbarButton-handTool.png +0 -0
  131. data/test/dummy/app/assets/images/pdfjs/secondaryToolbarButton-handTool@2x.png +0 -0
  132. data/test/dummy/app/assets/images/pdfjs/secondaryToolbarButton-lastPage.png +0 -0
  133. data/test/dummy/app/assets/images/pdfjs/secondaryToolbarButton-lastPage@2x.png +0 -0
  134. data/test/dummy/app/assets/images/pdfjs/secondaryToolbarButton-rotateCcw.png +0 -0
  135. data/test/dummy/app/assets/images/pdfjs/secondaryToolbarButton-rotateCcw@2x.png +0 -0
  136. data/test/dummy/app/assets/images/pdfjs/secondaryToolbarButton-rotateCw.png +0 -0
  137. data/test/dummy/app/assets/images/pdfjs/secondaryToolbarButton-rotateCw@2x.png +0 -0
  138. data/test/dummy/app/assets/images/pdfjs/shadow.png +0 -0
  139. data/test/dummy/app/assets/images/pdfjs/texture.png +0 -0
  140. data/test/dummy/app/assets/images/pdfjs/toolbarButton-bookmark.png +0 -0
  141. data/test/dummy/app/assets/images/pdfjs/toolbarButton-bookmark@2x.png +0 -0
  142. data/test/dummy/app/assets/images/pdfjs/toolbarButton-download.png +0 -0
  143. data/test/dummy/app/assets/images/pdfjs/toolbarButton-download@2x.png +0 -0
  144. data/test/dummy/app/assets/images/pdfjs/toolbarButton-menuArrows.png +0 -0
  145. data/test/dummy/app/assets/images/pdfjs/toolbarButton-menuArrows@2x.png +0 -0
  146. data/test/dummy/app/assets/images/pdfjs/toolbarButton-openFile.png +0 -0
  147. data/test/dummy/app/assets/images/pdfjs/toolbarButton-openFile@2x.png +0 -0
  148. data/test/dummy/app/assets/images/pdfjs/toolbarButton-pageDown-rtl.png +0 -0
  149. data/test/dummy/app/assets/images/pdfjs/toolbarButton-pageDown-rtl@2x.png +0 -0
  150. data/test/dummy/app/assets/images/pdfjs/toolbarButton-pageDown.png +0 -0
  151. data/test/dummy/app/assets/images/pdfjs/toolbarButton-pageDown@2x.png +0 -0
  152. data/test/dummy/app/assets/images/pdfjs/toolbarButton-pageUp-rtl.png +0 -0
  153. data/test/dummy/app/assets/images/pdfjs/toolbarButton-pageUp-rtl@2x.png +0 -0
  154. data/test/dummy/app/assets/images/pdfjs/toolbarButton-pageUp.png +0 -0
  155. data/test/dummy/app/assets/images/pdfjs/toolbarButton-pageUp@2x.png +0 -0
  156. data/test/dummy/app/assets/images/pdfjs/toolbarButton-presentationMode.png +0 -0
  157. data/test/dummy/app/assets/images/pdfjs/toolbarButton-presentationMode@2x.png +0 -0
  158. data/test/dummy/app/assets/images/pdfjs/toolbarButton-print.png +0 -0
  159. data/test/dummy/app/assets/images/pdfjs/toolbarButton-print@2x.png +0 -0
  160. data/test/dummy/app/assets/images/pdfjs/toolbarButton-search.png +0 -0
  161. data/test/dummy/app/assets/images/pdfjs/toolbarButton-search@2x.png +0 -0
  162. data/test/dummy/app/assets/images/pdfjs/toolbarButton-secondaryToolbarToggle-rtl.png +0 -0
  163. data/test/dummy/app/assets/images/pdfjs/toolbarButton-secondaryToolbarToggle-rtl@2x.png +0 -0
  164. data/test/dummy/app/assets/images/pdfjs/toolbarButton-secondaryToolbarToggle.png +0 -0
  165. data/test/dummy/app/assets/images/pdfjs/toolbarButton-secondaryToolbarToggle@2x.png +0 -0
  166. data/test/dummy/app/assets/images/pdfjs/toolbarButton-sidebarToggle-rtl.png +0 -0
  167. data/test/dummy/app/assets/images/pdfjs/toolbarButton-sidebarToggle-rtl@2x.png +0 -0
  168. data/test/dummy/app/assets/images/pdfjs/toolbarButton-sidebarToggle.png +0 -0
  169. data/test/dummy/app/assets/images/pdfjs/toolbarButton-sidebarToggle@2x.png +0 -0
  170. data/test/dummy/app/assets/images/pdfjs/toolbarButton-viewAttachments.png +0 -0
  171. data/test/dummy/app/assets/images/pdfjs/toolbarButton-viewAttachments@2x.png +0 -0
  172. data/test/dummy/app/assets/images/pdfjs/toolbarButton-viewOutline-rtl.png +0 -0
  173. data/test/dummy/app/assets/images/pdfjs/toolbarButton-viewOutline-rtl@2x.png +0 -0
  174. data/test/dummy/app/assets/images/pdfjs/toolbarButton-viewOutline.png +0 -0
  175. data/test/dummy/app/assets/images/pdfjs/toolbarButton-viewOutline@2x.png +0 -0
  176. data/test/dummy/app/assets/images/pdfjs/toolbarButton-viewThumbnail.png +0 -0
  177. data/test/dummy/app/assets/images/pdfjs/toolbarButton-viewThumbnail@2x.png +0 -0
  178. data/test/dummy/app/assets/images/pdfjs/toolbarButton-zoomIn.png +0 -0
  179. data/test/dummy/app/assets/images/pdfjs/toolbarButton-zoomIn@2x.png +0 -0
  180. data/test/dummy/app/assets/images/pdfjs/toolbarButton-zoomOut.png +0 -0
  181. data/test/dummy/app/assets/images/pdfjs/toolbarButton-zoomOut@2x.png +0 -0
  182. data/test/dummy/app/assets/javascripts/application.js +13 -0
  183. data/test/dummy/app/assets/javascripts/pdfjs.js +5 -0
  184. data/test/dummy/app/assets/javascripts/pdfjs/compatibility.js +574 -0
  185. data/test/dummy/app/assets/javascripts/pdfjs/debugger.js +620 -0
  186. data/test/dummy/app/assets/javascripts/pdfjs/l10n.js +1004 -0
  187. data/test/dummy/app/assets/javascripts/pdfjs/pdf.js +7793 -0
  188. data/test/dummy/app/assets/javascripts/pdfjs/pdf.worker.js +38661 -0
  189. data/test/dummy/app/assets/javascripts/pdfjs/viewer.js.erb +6912 -0
  190. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  191. data/test/dummy/app/assets/stylesheets/pdfjs.scss +3 -0
  192. data/test/dummy/app/assets/stylesheets/pdfjs/viewer.css.erb +1989 -0
  193. data/test/dummy/app/controllers/application_controller.rb +5 -0
  194. data/test/dummy/app/controllers/pdfjs/application_controller.rb +4 -0
  195. data/test/dummy/app/controllers/pdfjs/pdfjs_controller.rb +4 -0
  196. data/test/dummy/app/helpers/application_helper.rb +2 -0
  197. data/test/dummy/app/helpers/pdfjs/application_helper.rb +4 -0
  198. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  199. data/test/dummy/app/views/layouts/pdfjs/application.html.erb +396 -0
  200. data/test/dummy/app/views/pdfjs/pdfjs/show.html.erb +5 -0
  201. data/test/dummy/bin/bundle +3 -0
  202. data/test/dummy/bin/rails +4 -0
  203. data/test/dummy/bin/rake +4 -0
  204. data/test/dummy/config.ru +4 -0
  205. data/test/dummy/config/application.rb +26 -0
  206. data/test/dummy/config/boot.rb +5 -0
  207. data/test/dummy/config/database.yml +25 -0
  208. data/test/dummy/config/environment.rb +5 -0
  209. data/test/dummy/config/environments/development.rb +37 -0
  210. data/test/dummy/config/environments/production.rb +78 -0
  211. data/test/dummy/config/environments/test.rb +42 -0
  212. data/test/dummy/config/initializers/assets.rb +8 -0
  213. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  214. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  215. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  216. data/test/dummy/config/initializers/inflections.rb +16 -0
  217. data/test/dummy/config/initializers/mime_types.rb +4 -0
  218. data/test/dummy/config/initializers/session_store.rb +3 -0
  219. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  220. data/test/dummy/config/locales/en.yml +23 -0
  221. data/test/dummy/config/routes.rb +3 -0
  222. data/test/dummy/config/secrets.yml +22 -0
  223. data/test/dummy/db/test.sqlite3 +0 -0
  224. data/test/dummy/log/test.log +60 -0
  225. data/test/dummy/public/404.html +67 -0
  226. data/test/dummy/public/422.html +67 -0
  227. data/test/dummy/public/500.html +66 -0
  228. data/test/dummy/public/favicon.ico +0 -0
  229. data/test/test_helper.rb +4 -2
  230. metadata +362 -23
@@ -0,0 +1,620 @@
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 active = false;
24
+ var fontAttribute = 'data-font-name';
25
+ function removeSelection() {
26
+ var divs = document.querySelectorAll('div[' + fontAttribute + ']');
27
+ for (var i = 0, ii = divs.length; i < ii; ++i) {
28
+ var div = divs[i];
29
+ div.className = '';
30
+ }
31
+ }
32
+ function resetSelection() {
33
+ var divs = document.querySelectorAll('div[' + fontAttribute + ']');
34
+ for (var i = 0, ii = divs.length; i < ii; ++i) {
35
+ var div = divs[i];
36
+ div.className = 'debuggerHideText';
37
+ }
38
+ }
39
+ function selectFont(fontName, show) {
40
+ var divs = document.querySelectorAll('div[' + fontAttribute + '=' +
41
+ fontName + ']');
42
+ for (var i = 0, ii = divs.length; i < ii; ++i) {
43
+ var div = divs[i];
44
+ div.className = show ? 'debuggerShowText' : 'debuggerHideText';
45
+ }
46
+ }
47
+ function textLayerClick(e) {
48
+ if (!e.target.dataset.fontName ||
49
+ e.target.tagName.toUpperCase() !== 'DIV') {
50
+ return;
51
+ }
52
+ var fontName = e.target.dataset.fontName;
53
+ var selects = document.getElementsByTagName('input');
54
+ for (var i = 0; i < selects.length; ++i) {
55
+ var select = selects[i];
56
+ if (select.dataset.fontName !== fontName) {
57
+ continue;
58
+ }
59
+ select.checked = !select.checked;
60
+ selectFont(fontName, select.checked);
61
+ select.scrollIntoView();
62
+ }
63
+ }
64
+ return {
65
+ // Properties/functions needed by PDFBug.
66
+ id: 'FontInspector',
67
+ name: 'Font Inspector',
68
+ panel: null,
69
+ manager: null,
70
+ init: function init() {
71
+ var panel = this.panel;
72
+ panel.setAttribute('style', 'padding: 5px;');
73
+ var tmp = document.createElement('button');
74
+ tmp.addEventListener('click', resetSelection);
75
+ tmp.textContent = 'Refresh';
76
+ panel.appendChild(tmp);
77
+
78
+ fonts = document.createElement('div');
79
+ panel.appendChild(fonts);
80
+ },
81
+ cleanup: function cleanup() {
82
+ fonts.textContent = '';
83
+ },
84
+ enabled: false,
85
+ get active() {
86
+ return active;
87
+ },
88
+ set active(value) {
89
+ active = value;
90
+ if (active) {
91
+ document.body.addEventListener('click', textLayerClick, true);
92
+ resetSelection();
93
+ } else {
94
+ document.body.removeEventListener('click', textLayerClick, true);
95
+ removeSelection();
96
+ }
97
+ },
98
+ // FontInspector specific functions.
99
+ fontAdded: function fontAdded(fontObj, url) {
100
+ function properties(obj, list) {
101
+ var moreInfo = document.createElement('table');
102
+ for (var i = 0; i < list.length; i++) {
103
+ var tr = document.createElement('tr');
104
+ var td1 = document.createElement('td');
105
+ td1.textContent = list[i];
106
+ tr.appendChild(td1);
107
+ var td2 = document.createElement('td');
108
+ td2.textContent = obj[list[i]].toString();
109
+ tr.appendChild(td2);
110
+ moreInfo.appendChild(tr);
111
+ }
112
+ return moreInfo;
113
+ }
114
+ var moreInfo = properties(fontObj, ['name', 'type']);
115
+ var fontName = fontObj.loadedName;
116
+ var font = document.createElement('div');
117
+ var name = document.createElement('span');
118
+ name.textContent = fontName;
119
+ var download = document.createElement('a');
120
+ if (url) {
121
+ url = /url\(['"]?([^\)"']+)/.exec(url);
122
+ download.href = url[1];
123
+ } else if (fontObj.data) {
124
+ url = URL.createObjectURL(new Blob([fontObj.data], {
125
+ type: fontObj.mimeType
126
+ }));
127
+ }
128
+ download.href = url;
129
+ download.textContent = 'Download';
130
+ var logIt = document.createElement('a');
131
+ logIt.href = '';
132
+ logIt.textContent = 'Log';
133
+ logIt.addEventListener('click', function(event) {
134
+ event.preventDefault();
135
+ console.log(fontObj);
136
+ });
137
+ var select = document.createElement('input');
138
+ select.setAttribute('type', 'checkbox');
139
+ select.dataset.fontName = fontName;
140
+ select.addEventListener('click', (function(select, fontName) {
141
+ return (function() {
142
+ selectFont(fontName, select.checked);
143
+ });
144
+ })(select, fontName));
145
+ font.appendChild(select);
146
+ font.appendChild(name);
147
+ font.appendChild(document.createTextNode(' '));
148
+ font.appendChild(download);
149
+ font.appendChild(document.createTextNode(' '));
150
+ font.appendChild(logIt);
151
+ font.appendChild(moreInfo);
152
+ fonts.appendChild(font);
153
+ // Somewhat of a hack, should probably add a hook for when the text layer
154
+ // is done rendering.
155
+ setTimeout(function() {
156
+ if (this.active) {
157
+ resetSelection();
158
+ }
159
+ }.bind(this), 2000);
160
+ }
161
+ };
162
+ })();
163
+
164
+ // Manages all the page steppers.
165
+ var StepperManager = (function StepperManagerClosure() {
166
+ var steppers = [];
167
+ var stepperDiv = null;
168
+ var stepperControls = null;
169
+ var stepperChooser = null;
170
+ var breakPoints = {};
171
+ return {
172
+ // Properties/functions needed by PDFBug.
173
+ id: 'Stepper',
174
+ name: 'Stepper',
175
+ panel: null,
176
+ manager: null,
177
+ init: function init() {
178
+ var self = this;
179
+ this.panel.setAttribute('style', 'padding: 5px;');
180
+ stepperControls = document.createElement('div');
181
+ stepperChooser = document.createElement('select');
182
+ stepperChooser.addEventListener('change', function(event) {
183
+ self.selectStepper(this.value);
184
+ });
185
+ stepperControls.appendChild(stepperChooser);
186
+ stepperDiv = document.createElement('div');
187
+ this.panel.appendChild(stepperControls);
188
+ this.panel.appendChild(stepperDiv);
189
+ if (sessionStorage.getItem('pdfjsBreakPoints')) {
190
+ breakPoints = JSON.parse(sessionStorage.getItem('pdfjsBreakPoints'));
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
+ var opMap = null;
258
+
259
+ function simplifyArgs(args) {
260
+ if (typeof args === 'string') {
261
+ var MAX_STRING_LENGTH = 75;
262
+ return args.length <= MAX_STRING_LENGTH ? args :
263
+ args.substr(0, MAX_STRING_LENGTH) + '...';
264
+ }
265
+ if (typeof args !== 'object' || args === null) {
266
+ return args;
267
+ }
268
+ if ('length' in args) { // array
269
+ var simpleArgs = [], i, ii;
270
+ var MAX_ITEMS = 10;
271
+ for (i = 0, ii = Math.min(MAX_ITEMS, args.length); i < ii; i++) {
272
+ simpleArgs.push(simplifyArgs(args[i]));
273
+ }
274
+ if (i < args.length) {
275
+ simpleArgs.push('...');
276
+ }
277
+ return simpleArgs;
278
+ }
279
+ var simpleObj = {};
280
+ for (var key in args) {
281
+ simpleObj[key] = simplifyArgs(args[key]);
282
+ }
283
+ return simpleObj;
284
+ }
285
+
286
+ function Stepper(panel, pageIndex, initialBreakPoints) {
287
+ this.panel = panel;
288
+ this.breakPoint = 0;
289
+ this.nextBreakPoint = null;
290
+ this.pageIndex = pageIndex;
291
+ this.breakPoints = initialBreakPoints;
292
+ this.currentIdx = -1;
293
+ this.operatorListIdx = 0;
294
+ }
295
+ Stepper.prototype = {
296
+ init: function init() {
297
+ var panel = this.panel;
298
+ var content = c('div', 'c=continue, s=step');
299
+ var table = c('table');
300
+ content.appendChild(table);
301
+ table.cellSpacing = 0;
302
+ var headerRow = c('tr');
303
+ table.appendChild(headerRow);
304
+ headerRow.appendChild(c('th', 'Break'));
305
+ headerRow.appendChild(c('th', 'Idx'));
306
+ headerRow.appendChild(c('th', 'fn'));
307
+ headerRow.appendChild(c('th', 'args'));
308
+ panel.appendChild(content);
309
+ this.table = table;
310
+ if (!opMap) {
311
+ opMap = Object.create(null);
312
+ for (var key in PDFJS.OPS) {
313
+ opMap[PDFJS.OPS[key]] = key;
314
+ }
315
+ }
316
+ },
317
+ updateOperatorList: function updateOperatorList(operatorList) {
318
+ var self = this;
319
+
320
+ function cboxOnClick() {
321
+ var x = +this.dataset.idx;
322
+ if (this.checked) {
323
+ self.breakPoints.push(x);
324
+ } else {
325
+ self.breakPoints.splice(self.breakPoints.indexOf(x), 1);
326
+ }
327
+ StepperManager.saveBreakPoints(self.pageIndex, self.breakPoints);
328
+ }
329
+
330
+ var MAX_OPERATORS_COUNT = 15000;
331
+ if (this.operatorListIdx > MAX_OPERATORS_COUNT) {
332
+ return;
333
+ }
334
+
335
+ var chunk = document.createDocumentFragment();
336
+ var operatorsToDisplay = Math.min(MAX_OPERATORS_COUNT,
337
+ operatorList.fnArray.length);
338
+ for (var i = this.operatorListIdx; i < operatorsToDisplay; i++) {
339
+ var line = c('tr');
340
+ line.className = 'line';
341
+ line.dataset.idx = i;
342
+ chunk.appendChild(line);
343
+ var checked = this.breakPoints.indexOf(i) !== -1;
344
+ var args = operatorList.argsArray[i] || [];
345
+
346
+ var breakCell = c('td');
347
+ var cbox = c('input');
348
+ cbox.type = 'checkbox';
349
+ cbox.className = 'points';
350
+ cbox.checked = checked;
351
+ cbox.dataset.idx = i;
352
+ cbox.onclick = cboxOnClick;
353
+
354
+ breakCell.appendChild(cbox);
355
+ line.appendChild(breakCell);
356
+ line.appendChild(c('td', i.toString()));
357
+ var fn = opMap[operatorList.fnArray[i]];
358
+ var decArgs = args;
359
+ if (fn === 'showText') {
360
+ var glyphs = args[0];
361
+ var newArgs = [];
362
+ var str = [];
363
+ for (var j = 0; j < glyphs.length; j++) {
364
+ var glyph = glyphs[j];
365
+ if (typeof glyph === 'object' && glyph !== null) {
366
+ str.push(glyph.fontChar);
367
+ } else {
368
+ if (str.length > 0) {
369
+ newArgs.push(str.join(''));
370
+ str = [];
371
+ }
372
+ newArgs.push(glyph); // null or number
373
+ }
374
+ }
375
+ if (str.length > 0) {
376
+ newArgs.push(str.join(''));
377
+ }
378
+ decArgs = [newArgs];
379
+ }
380
+ line.appendChild(c('td', fn));
381
+ line.appendChild(c('td', JSON.stringify(simplifyArgs(decArgs))));
382
+ }
383
+ if (operatorsToDisplay < operatorList.fnArray.length) {
384
+ line = c('tr');
385
+ var lastCell = c('td', '...');
386
+ lastCell.colspan = 4;
387
+ chunk.appendChild(lastCell);
388
+ }
389
+ this.operatorListIdx = operatorList.fnArray.length;
390
+ this.table.appendChild(chunk);
391
+ },
392
+ getNextBreakPoint: function getNextBreakPoint() {
393
+ this.breakPoints.sort(function(a, b) { return a - b; });
394
+ for (var i = 0; i < this.breakPoints.length; i++) {
395
+ if (this.breakPoints[i] > this.currentIdx) {
396
+ return this.breakPoints[i];
397
+ }
398
+ }
399
+ return null;
400
+ },
401
+ breakIt: function breakIt(idx, callback) {
402
+ StepperManager.selectStepper(this.pageIndex, true);
403
+ var self = this;
404
+ var dom = document;
405
+ self.currentIdx = idx;
406
+ var listener = function(e) {
407
+ switch (e.keyCode) {
408
+ case 83: // step
409
+ dom.removeEventListener('keydown', listener, false);
410
+ self.nextBreakPoint = self.currentIdx + 1;
411
+ self.goTo(-1);
412
+ callback();
413
+ break;
414
+ case 67: // continue
415
+ dom.removeEventListener('keydown', listener, false);
416
+ var breakPoint = self.getNextBreakPoint();
417
+ self.nextBreakPoint = breakPoint;
418
+ self.goTo(-1);
419
+ callback();
420
+ break;
421
+ }
422
+ };
423
+ dom.addEventListener('keydown', listener, false);
424
+ self.goTo(idx);
425
+ },
426
+ goTo: function goTo(idx) {
427
+ var allRows = this.panel.getElementsByClassName('line');
428
+ for (var x = 0, xx = allRows.length; x < xx; ++x) {
429
+ var row = allRows[x];
430
+ if ((row.dataset.idx | 0) === idx) {
431
+ row.style.backgroundColor = 'rgb(251,250,207)';
432
+ row.scrollIntoView();
433
+ } else {
434
+ row.style.backgroundColor = null;
435
+ }
436
+ }
437
+ }
438
+ };
439
+ return Stepper;
440
+ })();
441
+
442
+ var Stats = (function Stats() {
443
+ var stats = [];
444
+ function clear(node) {
445
+ while (node.hasChildNodes()) {
446
+ node.removeChild(node.lastChild);
447
+ }
448
+ }
449
+ function getStatIndex(pageNumber) {
450
+ for (var i = 0, ii = stats.length; i < ii; ++i) {
451
+ if (stats[i].pageNumber === pageNumber) {
452
+ return i;
453
+ }
454
+ }
455
+ return false;
456
+ }
457
+ return {
458
+ // Properties/functions needed by PDFBug.
459
+ id: 'Stats',
460
+ name: 'Stats',
461
+ panel: null,
462
+ manager: null,
463
+ init: function init() {
464
+ this.panel.setAttribute('style', 'padding: 5px;');
465
+ PDFJS.enableStats = true;
466
+ },
467
+ enabled: false,
468
+ active: false,
469
+ // Stats specific functions.
470
+ add: function(pageNumber, stat) {
471
+ if (!stat) {
472
+ return;
473
+ }
474
+ var statsIndex = getStatIndex(pageNumber);
475
+ if (statsIndex !== false) {
476
+ var b = stats[statsIndex];
477
+ this.panel.removeChild(b.div);
478
+ stats.splice(statsIndex, 1);
479
+ }
480
+ var wrapper = document.createElement('div');
481
+ wrapper.className = 'stats';
482
+ var title = document.createElement('div');
483
+ title.className = 'title';
484
+ title.textContent = 'Page: ' + pageNumber;
485
+ var statsDiv = document.createElement('div');
486
+ statsDiv.textContent = stat.toString();
487
+ wrapper.appendChild(title);
488
+ wrapper.appendChild(statsDiv);
489
+ stats.push({ pageNumber: pageNumber, div: wrapper });
490
+ stats.sort(function(a, b) { return a.pageNumber - b.pageNumber; });
491
+ clear(this.panel);
492
+ for (var i = 0, ii = stats.length; i < ii; ++i) {
493
+ this.panel.appendChild(stats[i].div);
494
+ }
495
+ },
496
+ cleanup: function () {
497
+ stats = [];
498
+ clear(this.panel);
499
+ }
500
+ };
501
+ })();
502
+
503
+ // Manages all the debugging tools.
504
+ var PDFBug = (function PDFBugClosure() {
505
+ var panelWidth = 300;
506
+ var buttons = [];
507
+ var activePanel = null;
508
+
509
+ return {
510
+ tools: [
511
+ FontInspector,
512
+ StepperManager,
513
+ Stats
514
+ ],
515
+ enable: function(ids) {
516
+ var all = false, tools = this.tools;
517
+ if (ids.length === 1 && ids[0] === 'all') {
518
+ all = true;
519
+ }
520
+ for (var i = 0; i < tools.length; ++i) {
521
+ var tool = tools[i];
522
+ if (all || ids.indexOf(tool.id) !== -1) {
523
+ tool.enabled = true;
524
+ }
525
+ }
526
+ if (!all) {
527
+ // Sort the tools by the order they are enabled.
528
+ tools.sort(function(a, b) {
529
+ var indexA = ids.indexOf(a.id);
530
+ indexA = indexA < 0 ? tools.length : indexA;
531
+ var indexB = ids.indexOf(b.id);
532
+ indexB = indexB < 0 ? tools.length : indexB;
533
+ return indexA - indexB;
534
+ });
535
+ }
536
+ },
537
+ init: function init() {
538
+ /*
539
+ * Basic Layout:
540
+ * PDFBug
541
+ * Controls
542
+ * Panels
543
+ * Panel
544
+ * Panel
545
+ * ...
546
+ */
547
+ var ui = document.createElement('div');
548
+ ui.id = 'PDFBug';
549
+
550
+ var controls = document.createElement('div');
551
+ controls.setAttribute('class', 'controls');
552
+ ui.appendChild(controls);
553
+
554
+ var panels = document.createElement('div');
555
+ panels.setAttribute('class', 'panels');
556
+ ui.appendChild(panels);
557
+
558
+ var container = document.getElementById('viewerContainer');
559
+ container.appendChild(ui);
560
+ container.style.right = panelWidth + 'px';
561
+
562
+ // Initialize all the debugging tools.
563
+ var tools = this.tools;
564
+ var self = this;
565
+ for (var i = 0; i < tools.length; ++i) {
566
+ var tool = tools[i];
567
+ var panel = document.createElement('div');
568
+ var panelButton = document.createElement('button');
569
+ panelButton.textContent = tool.name;
570
+ panelButton.addEventListener('click', (function(selected) {
571
+ return function(event) {
572
+ event.preventDefault();
573
+ self.selectPanel(selected);
574
+ };
575
+ })(i));
576
+ controls.appendChild(panelButton);
577
+ panels.appendChild(panel);
578
+ tool.panel = panel;
579
+ tool.manager = this;
580
+ if (tool.enabled) {
581
+ tool.init();
582
+ } else {
583
+ panel.textContent = tool.name + ' is disabled. To enable add ' +
584
+ ' "' + tool.id + '" to the pdfBug parameter ' +
585
+ 'and refresh (seperate multiple by commas).';
586
+ }
587
+ buttons.push(panelButton);
588
+ }
589
+ this.selectPanel(0);
590
+ },
591
+ cleanup: function cleanup() {
592
+ for (var i = 0, ii = this.tools.length; i < ii; i++) {
593
+ if (this.tools[i].enabled) {
594
+ this.tools[i].cleanup();
595
+ }
596
+ }
597
+ },
598
+ selectPanel: function selectPanel(index) {
599
+ if (typeof index !== 'number') {
600
+ index = this.tools.indexOf(index);
601
+ }
602
+ if (index === activePanel) {
603
+ return;
604
+ }
605
+ activePanel = index;
606
+ var tools = this.tools;
607
+ for (var j = 0; j < tools.length; ++j) {
608
+ if (j === index) {
609
+ buttons[j].setAttribute('class', 'active');
610
+ tools[j].active = true;
611
+ tools[j].panel.removeAttribute('hidden');
612
+ } else {
613
+ buttons[j].setAttribute('class', '');
614
+ tools[j].active = false;
615
+ tools[j].panel.setAttribute('hidden', 'true');
616
+ }
617
+ }
618
+ }
619
+ };
620
+ })();