dompdf.js 1.0.4 → 1.1.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 (407) hide show
  1. package/.vscode/settings.json +5 -0
  2. package/README.md +202 -79
  3. package/dist/dom/element-container.d.ts +4 -2
  4. package/dist/dompdf.esm.js +25972 -14647
  5. package/dist/dompdf.esm.js.map +1 -1
  6. package/dist/dompdf.js +40524 -29199
  7. package/dist/dompdf.js.map +1 -1
  8. package/dist/index.d.ts +6 -8
  9. package/dist/render/canvas/pdf-renderer.d.ts +62 -32
  10. package/dist/render/page-format-map.d.ts +4 -0
  11. package/dist/render/paginate.d.ts +3 -0
  12. package/dist/utils/css-utils.d.ts +2 -0
  13. package/dist/utils/element-utils.d.ts +7 -0
  14. package/dist/utils/font-utils.d.ts +7 -0
  15. package/dist/utils/index.d.ts +5 -0
  16. package/dist/utils/type-utils.d.ts +4 -0
  17. package/dist/utils/url-path.d.ts +7 -0
  18. package/fontconverter/FileSaver.js +2 -0
  19. package/fontconverter/filereader.js +432 -0
  20. package/fontconverter/fontconverter.html +66 -0
  21. package/fontconverter/pure-min.css +11 -0
  22. package/package.json +7 -6
  23. package/dist/lib/__tests__/index.js +0 -144
  24. package/dist/lib/__tests__/index.js.map +0 -1
  25. package/dist/lib/core/__mocks__/cache-storage.js +0 -10
  26. package/dist/lib/core/__mocks__/cache-storage.js.map +0 -1
  27. package/dist/lib/core/__mocks__/context.js +0 -22
  28. package/dist/lib/core/__mocks__/context.js.map +0 -1
  29. package/dist/lib/core/__mocks__/features.js +0 -12
  30. package/dist/lib/core/__mocks__/features.js.map +0 -1
  31. package/dist/lib/core/__mocks__/logger.js +0 -24
  32. package/dist/lib/core/__mocks__/logger.js.map +0 -1
  33. package/dist/lib/core/__tests__/cache-storage.js +0 -420
  34. package/dist/lib/core/__tests__/cache-storage.js.map +0 -1
  35. package/dist/lib/core/__tests__/logger.js +0 -28
  36. package/dist/lib/core/__tests__/logger.js.map +0 -1
  37. package/dist/lib/core/bitwise.js +0 -6
  38. package/dist/lib/core/bitwise.js.map +0 -1
  39. package/dist/lib/core/cache-storage.js +0 -198
  40. package/dist/lib/core/cache-storage.js.map +0 -1
  41. package/dist/lib/core/context.js +0 -18
  42. package/dist/lib/core/context.js.map +0 -1
  43. package/dist/lib/core/debugger.js +0 -25
  44. package/dist/lib/core/debugger.js.map +0 -1
  45. package/dist/lib/core/features.js +0 -193
  46. package/dist/lib/core/features.js.map +0 -1
  47. package/dist/lib/core/logger.js +0 -92
  48. package/dist/lib/core/logger.js.map +0 -1
  49. package/dist/lib/core/util.js +0 -5
  50. package/dist/lib/core/util.js.map +0 -1
  51. package/dist/lib/css/IPropertyDescriptor.js +0 -3
  52. package/dist/lib/css/IPropertyDescriptor.js.map +0 -1
  53. package/dist/lib/css/ITypeDescriptor.js +0 -3
  54. package/dist/lib/css/ITypeDescriptor.js.map +0 -1
  55. package/dist/lib/css/index.js +0 -216
  56. package/dist/lib/css/index.js.map +0 -1
  57. package/dist/lib/css/layout/__mocks__/bounds.js +0 -9
  58. package/dist/lib/css/layout/__mocks__/bounds.js.map +0 -1
  59. package/dist/lib/css/layout/bounds.js +0 -42
  60. package/dist/lib/css/layout/bounds.js.map +0 -1
  61. package/dist/lib/css/layout/text.js +0 -137
  62. package/dist/lib/css/layout/text.js.map +0 -1
  63. package/dist/lib/css/property-descriptors/__tests__/background-tests.js +0 -48
  64. package/dist/lib/css/property-descriptors/__tests__/background-tests.js.map +0 -1
  65. package/dist/lib/css/property-descriptors/__tests__/font-family.js +0 -25
  66. package/dist/lib/css/property-descriptors/__tests__/font-family.js.map +0 -1
  67. package/dist/lib/css/property-descriptors/__tests__/paint-order.js +0 -88
  68. package/dist/lib/css/property-descriptors/__tests__/paint-order.js.map +0 -1
  69. package/dist/lib/css/property-descriptors/__tests__/text-shadow.js +0 -94
  70. package/dist/lib/css/property-descriptors/__tests__/text-shadow.js.map +0 -1
  71. package/dist/lib/css/property-descriptors/__tests__/transform-tests.js +0 -18
  72. package/dist/lib/css/property-descriptors/__tests__/transform-tests.js.map +0 -1
  73. package/dist/lib/css/property-descriptors/background-clip.js +0 -24
  74. package/dist/lib/css/property-descriptors/background-clip.js.map +0 -1
  75. package/dist/lib/css/property-descriptors/background-color.js +0 -11
  76. package/dist/lib/css/property-descriptors/background-color.js.map +0 -1
  77. package/dist/lib/css/property-descriptors/background-image.js +0 -24
  78. package/dist/lib/css/property-descriptors/background-image.js.map +0 -1
  79. package/dist/lib/css/property-descriptors/background-origin.js +0 -24
  80. package/dist/lib/css/property-descriptors/background-origin.js.map +0 -1
  81. package/dist/lib/css/property-descriptors/background-position.js +0 -17
  82. package/dist/lib/css/property-descriptors/background-position.js.map +0 -1
  83. package/dist/lib/css/property-descriptors/background-repeat.js +0 -36
  84. package/dist/lib/css/property-descriptors/background-repeat.js.map +0 -1
  85. package/dist/lib/css/property-descriptors/background-size.js +0 -24
  86. package/dist/lib/css/property-descriptors/background-size.js.map +0 -1
  87. package/dist/lib/css/property-descriptors/border-color.js +0 -15
  88. package/dist/lib/css/property-descriptors/border-color.js.map +0 -1
  89. package/dist/lib/css/property-descriptors/border-radius.js +0 -18
  90. package/dist/lib/css/property-descriptors/border-radius.js.map +0 -1
  91. package/dist/lib/css/property-descriptors/border-style.js +0 -30
  92. package/dist/lib/css/property-descriptors/border-style.js.map +0 -1
  93. package/dist/lib/css/property-descriptors/border-width.js +0 -21
  94. package/dist/lib/css/property-descriptors/border-width.js.map +0 -1
  95. package/dist/lib/css/property-descriptors/box-shadow.js +0 -55
  96. package/dist/lib/css/property-descriptors/box-shadow.js.map +0 -1
  97. package/dist/lib/css/property-descriptors/color.js +0 -11
  98. package/dist/lib/css/property-descriptors/color.js.map +0 -1
  99. package/dist/lib/css/property-descriptors/content.js +0 -20
  100. package/dist/lib/css/property-descriptors/content.js.map +0 -1
  101. package/dist/lib/css/property-descriptors/counter-increment.js +0 -31
  102. package/dist/lib/css/property-descriptors/counter-increment.js.map +0 -1
  103. package/dist/lib/css/property-descriptors/counter-reset.js +0 -27
  104. package/dist/lib/css/property-descriptors/counter-reset.js.map +0 -1
  105. package/dist/lib/css/property-descriptors/direction.js +0 -19
  106. package/dist/lib/css/property-descriptors/direction.js.map +0 -1
  107. package/dist/lib/css/property-descriptors/display.js +0 -82
  108. package/dist/lib/css/property-descriptors/display.js.map +0 -1
  109. package/dist/lib/css/property-descriptors/duration.js +0 -15
  110. package/dist/lib/css/property-descriptors/duration.js.map +0 -1
  111. package/dist/lib/css/property-descriptors/float.js +0 -23
  112. package/dist/lib/css/property-descriptors/float.js.map +0 -1
  113. package/dist/lib/css/property-descriptors/font-family.js +0 -33
  114. package/dist/lib/css/property-descriptors/font-family.js.map +0 -1
  115. package/dist/lib/css/property-descriptors/font-size.js +0 -11
  116. package/dist/lib/css/property-descriptors/font-size.js.map +0 -1
  117. package/dist/lib/css/property-descriptors/font-style.js +0 -21
  118. package/dist/lib/css/property-descriptors/font-style.js.map +0 -1
  119. package/dist/lib/css/property-descriptors/font-variant.js +0 -14
  120. package/dist/lib/css/property-descriptors/font-variant.js.map +0 -1
  121. package/dist/lib/css/property-descriptors/font-weight.js +0 -26
  122. package/dist/lib/css/property-descriptors/font-weight.js.map +0 -1
  123. package/dist/lib/css/property-descriptors/letter-spacing.js +0 -22
  124. package/dist/lib/css/property-descriptors/letter-spacing.js.map +0 -1
  125. package/dist/lib/css/property-descriptors/line-break.js +0 -24
  126. package/dist/lib/css/property-descriptors/line-break.js.map +0 -1
  127. package/dist/lib/css/property-descriptors/line-height.js +0 -25
  128. package/dist/lib/css/property-descriptors/line-height.js.map +0 -1
  129. package/dist/lib/css/property-descriptors/list-style-image.js +0 -17
  130. package/dist/lib/css/property-descriptors/list-style-image.js.map +0 -1
  131. package/dist/lib/css/property-descriptors/list-style-position.js +0 -19
  132. package/dist/lib/css/property-descriptors/list-style-position.js.map +0 -1
  133. package/dist/lib/css/property-descriptors/list-style-type.js +0 -123
  134. package/dist/lib/css/property-descriptors/list-style-type.js.map +0 -1
  135. package/dist/lib/css/property-descriptors/margin.js +0 -14
  136. package/dist/lib/css/property-descriptors/margin.js.map +0 -1
  137. package/dist/lib/css/property-descriptors/opacity.js +0 -17
  138. package/dist/lib/css/property-descriptors/opacity.js.map +0 -1
  139. package/dist/lib/css/property-descriptors/overflow-wrap.js +0 -19
  140. package/dist/lib/css/property-descriptors/overflow-wrap.js.map +0 -1
  141. package/dist/lib/css/property-descriptors/overflow.js +0 -28
  142. package/dist/lib/css/property-descriptors/overflow.js.map +0 -1
  143. package/dist/lib/css/property-descriptors/padding.js +0 -15
  144. package/dist/lib/css/property-descriptors/padding.js.map +0 -1
  145. package/dist/lib/css/property-descriptors/paint-order.js +0 -34
  146. package/dist/lib/css/property-descriptors/paint-order.js.map +0 -1
  147. package/dist/lib/css/property-descriptors/position.js +0 -23
  148. package/dist/lib/css/property-descriptors/position.js.map +0 -1
  149. package/dist/lib/css/property-descriptors/quotes.js +0 -42
  150. package/dist/lib/css/property-descriptors/quotes.js.map +0 -1
  151. package/dist/lib/css/property-descriptors/text-align.js +0 -22
  152. package/dist/lib/css/property-descriptors/text-align.js.map +0 -1
  153. package/dist/lib/css/property-descriptors/text-decoration-color.js +0 -11
  154. package/dist/lib/css/property-descriptors/text-decoration-color.js.map +0 -1
  155. package/dist/lib/css/property-descriptors/text-decoration-line.js +0 -29
  156. package/dist/lib/css/property-descriptors/text-decoration-line.js.map +0 -1
  157. package/dist/lib/css/property-descriptors/text-shadow.js +0 -47
  158. package/dist/lib/css/property-descriptors/text-shadow.js.map +0 -1
  159. package/dist/lib/css/property-descriptors/text-transform.js +0 -21
  160. package/dist/lib/css/property-descriptors/text-transform.js.map +0 -1
  161. package/dist/lib/css/property-descriptors/transform-origin.js +0 -25
  162. package/dist/lib/css/property-descriptors/transform-origin.js.map +0 -1
  163. package/dist/lib/css/property-descriptors/transform.js +0 -37
  164. package/dist/lib/css/property-descriptors/transform.js.map +0 -1
  165. package/dist/lib/css/property-descriptors/visibility.js +0 -21
  166. package/dist/lib/css/property-descriptors/visibility.js.map +0 -1
  167. package/dist/lib/css/property-descriptors/webkit-text-stroke-color.js +0 -11
  168. package/dist/lib/css/property-descriptors/webkit-text-stroke-color.js.map +0 -1
  169. package/dist/lib/css/property-descriptors/webkit-text-stroke-width.js +0 -17
  170. package/dist/lib/css/property-descriptors/webkit-text-stroke-width.js.map +0 -1
  171. package/dist/lib/css/property-descriptors/word-break.js +0 -27
  172. package/dist/lib/css/property-descriptors/word-break.js.map +0 -1
  173. package/dist/lib/css/property-descriptors/z-index.js +0 -20
  174. package/dist/lib/css/property-descriptors/z-index.js.map +0 -1
  175. package/dist/lib/css/syntax/__tests__/tokernizer-tests.js +0 -34
  176. package/dist/lib/css/syntax/__tests__/tokernizer-tests.js.map +0 -1
  177. package/dist/lib/css/syntax/parser.js +0 -147
  178. package/dist/lib/css/syntax/parser.js.map +0 -1
  179. package/dist/lib/css/syntax/tokenizer.js +0 -630
  180. package/dist/lib/css/syntax/tokenizer.js.map +0 -1
  181. package/dist/lib/css/types/__tests__/color-tests.js +0 -66
  182. package/dist/lib/css/types/__tests__/color-tests.js.map +0 -1
  183. package/dist/lib/css/types/__tests__/image-tests.js +0 -233
  184. package/dist/lib/css/types/__tests__/image-tests.js.map +0 -1
  185. package/dist/lib/css/types/angle.js +0 -81
  186. package/dist/lib/css/types/angle.js.map +0 -1
  187. package/dist/lib/css/types/color.js +0 -311
  188. package/dist/lib/css/types/color.js.map +0 -1
  189. package/dist/lib/css/types/functions/-prefix-linear-gradient.js +0 -33
  190. package/dist/lib/css/types/functions/-prefix-linear-gradient.js.map +0 -1
  191. package/dist/lib/css/types/functions/-prefix-radial-gradient.js +0 -84
  192. package/dist/lib/css/types/functions/-prefix-radial-gradient.js.map +0 -1
  193. package/dist/lib/css/types/functions/-webkit-gradient.js +0 -60
  194. package/dist/lib/css/types/functions/-webkit-gradient.js.map +0 -1
  195. package/dist/lib/css/types/functions/__tests__/radial-gradient.js +0 -68
  196. package/dist/lib/css/types/functions/__tests__/radial-gradient.js.map +0 -1
  197. package/dist/lib/css/types/functions/counter.js +0 -374
  198. package/dist/lib/css/types/functions/counter.js.map +0 -1
  199. package/dist/lib/css/types/functions/gradient.js +0 -165
  200. package/dist/lib/css/types/functions/gradient.js.map +0 -1
  201. package/dist/lib/css/types/functions/linear-gradient.js +0 -28
  202. package/dist/lib/css/types/functions/linear-gradient.js.map +0 -1
  203. package/dist/lib/css/types/functions/radial-gradient.js +0 -91
  204. package/dist/lib/css/types/functions/radial-gradient.js.map +0 -1
  205. package/dist/lib/css/types/image.js +0 -53
  206. package/dist/lib/css/types/image.js.map +0 -1
  207. package/dist/lib/css/types/index.js +0 -3
  208. package/dist/lib/css/types/index.js.map +0 -1
  209. package/dist/lib/css/types/length-percentage.js +0 -52
  210. package/dist/lib/css/types/length-percentage.js.map +0 -1
  211. package/dist/lib/css/types/length.js +0 -8
  212. package/dist/lib/css/types/length.js.map +0 -1
  213. package/dist/lib/css/types/time.js +0 -18
  214. package/dist/lib/css/types/time.js.map +0 -1
  215. package/dist/lib/dom/__mocks__/document-cloner.js +0 -24
  216. package/dist/lib/dom/__mocks__/document-cloner.js.map +0 -1
  217. package/dist/lib/dom/document-cloner.js +0 -530
  218. package/dist/lib/dom/document-cloner.js.map +0 -1
  219. package/dist/lib/dom/element-container.js +0 -37
  220. package/dist/lib/dom/element-container.js.map +0 -1
  221. package/dist/lib/dom/elements/li-element-container.js +0 -30
  222. package/dist/lib/dom/elements/li-element-container.js.map +0 -1
  223. package/dist/lib/dom/elements/ol-element-container.js +0 -31
  224. package/dist/lib/dom/elements/ol-element-container.js.map +0 -1
  225. package/dist/lib/dom/elements/select-element-container.js +0 -31
  226. package/dist/lib/dom/elements/select-element-container.js.map +0 -1
  227. package/dist/lib/dom/elements/textarea-element-container.js +0 -30
  228. package/dist/lib/dom/elements/textarea-element-container.js.map +0 -1
  229. package/dist/lib/dom/node-parser.js +0 -360
  230. package/dist/lib/dom/node-parser.js.map +0 -1
  231. package/dist/lib/dom/replaced-elements/canvas-element-container.js +0 -32
  232. package/dist/lib/dom/replaced-elements/canvas-element-container.js.map +0 -1
  233. package/dist/lib/dom/replaced-elements/iframe-element-container.js +0 -54
  234. package/dist/lib/dom/replaced-elements/iframe-element-container.js.map +0 -1
  235. package/dist/lib/dom/replaced-elements/image-element-container.js +0 -33
  236. package/dist/lib/dom/replaced-elements/image-element-container.js.map +0 -1
  237. package/dist/lib/dom/replaced-elements/index.js +0 -3
  238. package/dist/lib/dom/replaced-elements/index.js.map +0 -1
  239. package/dist/lib/dom/replaced-elements/input-element-container.js +0 -102
  240. package/dist/lib/dom/replaced-elements/input-element-container.js.map +0 -1
  241. package/dist/lib/dom/replaced-elements/pseudo-elements.js +0 -1
  242. package/dist/lib/dom/replaced-elements/pseudo-elements.js.map +0 -1
  243. package/dist/lib/dom/replaced-elements/svg-element-container.js +0 -38
  244. package/dist/lib/dom/replaced-elements/svg-element-container.js.map +0 -1
  245. package/dist/lib/dom/text-container.js +0 -32
  246. package/dist/lib/dom/text-container.js.map +0 -1
  247. package/dist/lib/index.js +0 -202
  248. package/dist/lib/index.js.map +0 -1
  249. package/dist/lib/invariant.js +0 -10
  250. package/dist/lib/invariant.js.map +0 -1
  251. package/dist/lib/render/background.js +0 -187
  252. package/dist/lib/render/background.js.map +0 -1
  253. package/dist/lib/render/bezier-curve.js +0 -36
  254. package/dist/lib/render/bezier-curve.js.map +0 -1
  255. package/dist/lib/render/border.js +0 -105
  256. package/dist/lib/render/border.js.map +0 -1
  257. package/dist/lib/render/bound-curves.js +0 -190
  258. package/dist/lib/render/bound-curves.js.map +0 -1
  259. package/dist/lib/render/box-sizing.js +0 -21
  260. package/dist/lib/render/box-sizing.js.map +0 -1
  261. package/dist/lib/render/canvas/canvas-renderer2.js +0 -1415
  262. package/dist/lib/render/canvas/canvas-renderer2.js.map +0 -1
  263. package/dist/lib/render/canvas/foreignobject-renderer.js +0 -108
  264. package/dist/lib/render/canvas/foreignobject-renderer.js.map +0 -1
  265. package/dist/lib/render/canvas/pdf-renderer.js +0 -1406
  266. package/dist/lib/render/canvas/pdf-renderer.js.map +0 -1
  267. package/dist/lib/render/effects.js +0 -41
  268. package/dist/lib/render/effects.js.map +0 -1
  269. package/dist/lib/render/font-metrics.js +0 -55
  270. package/dist/lib/render/font-metrics.js.map +0 -1
  271. package/dist/lib/render/path.js +0 -27
  272. package/dist/lib/render/path.js.map +0 -1
  273. package/dist/lib/render/renderer.js +0 -12
  274. package/dist/lib/render/renderer.js.map +0 -1
  275. package/dist/lib/render/stacking-context.js +0 -172
  276. package/dist/lib/render/stacking-context.js.map +0 -1
  277. package/dist/lib/render/vector.js +0 -18
  278. package/dist/lib/render/vector.js.map +0 -1
  279. package/dist/render/canvas/canvas-renderer2.d.ts +0 -81
  280. package/dist/types/__tests__/index.d.ts +0 -1
  281. package/dist/types/core/__mocks__/cache-storage.d.ts +0 -2
  282. package/dist/types/core/__mocks__/context.d.ts +0 -9
  283. package/dist/types/core/__mocks__/features.d.ts +0 -8
  284. package/dist/types/core/__mocks__/logger.d.ts +0 -9
  285. package/dist/types/core/__tests__/cache-storage.d.ts +0 -1
  286. package/dist/types/core/__tests__/logger.d.ts +0 -1
  287. package/dist/types/core/bitwise.d.ts +0 -1
  288. package/dist/types/core/cache-storage.d.ts +0 -26
  289. package/dist/types/core/context.d.ts +0 -15
  290. package/dist/types/core/debugger.d.ts +0 -8
  291. package/dist/types/core/features.d.ts +0 -12
  292. package/dist/types/core/logger.d.ts +0 -18
  293. package/dist/types/core/util.d.ts +0 -1
  294. package/dist/types/css/IPropertyDescriptor.d.ts +0 -36
  295. package/dist/types/css/ITypeDescriptor.d.ts +0 -6
  296. package/dist/types/css/index.d.ts +0 -132
  297. package/dist/types/css/layout/__mocks__/bounds.d.ts +0 -2
  298. package/dist/types/css/layout/bounds.d.ts +0 -14
  299. package/dist/types/css/layout/text.d.ts +0 -10
  300. package/dist/types/css/property-descriptors/__tests__/background-tests.d.ts +0 -1
  301. package/dist/types/css/property-descriptors/__tests__/font-family.d.ts +0 -1
  302. package/dist/types/css/property-descriptors/__tests__/paint-order.d.ts +0 -1
  303. package/dist/types/css/property-descriptors/__tests__/text-shadow.d.ts +0 -1
  304. package/dist/types/css/property-descriptors/__tests__/transform-tests.d.ts +0 -1
  305. package/dist/types/css/property-descriptors/background-clip.d.ts +0 -8
  306. package/dist/types/css/property-descriptors/background-color.d.ts +0 -2
  307. package/dist/types/css/property-descriptors/background-image.d.ts +0 -3
  308. package/dist/types/css/property-descriptors/background-origin.d.ts +0 -8
  309. package/dist/types/css/property-descriptors/background-position.d.ts +0 -5
  310. package/dist/types/css/property-descriptors/background-repeat.d.ts +0 -9
  311. package/dist/types/css/property-descriptors/background-size.d.ts +0 -11
  312. package/dist/types/css/property-descriptors/border-color.d.ts +0 -5
  313. package/dist/types/css/property-descriptors/border-radius.d.ts +0 -7
  314. package/dist/types/css/property-descriptors/border-style.d.ts +0 -12
  315. package/dist/types/css/property-descriptors/border-width.d.ts +0 -5
  316. package/dist/types/css/property-descriptors/box-shadow.d.ts +0 -14
  317. package/dist/types/css/property-descriptors/color.d.ts +0 -2
  318. package/dist/types/css/property-descriptors/content.d.ts +0 -4
  319. package/dist/types/css/property-descriptors/counter-increment.d.ts +0 -7
  320. package/dist/types/css/property-descriptors/counter-reset.d.ts +0 -7
  321. package/dist/types/css/property-descriptors/direction.d.ts +0 -6
  322. package/dist/types/css/property-descriptors/display.d.ts +0 -35
  323. package/dist/types/css/property-descriptors/duration.d.ts +0 -2
  324. package/dist/types/css/property-descriptors/float.d.ts +0 -9
  325. package/dist/types/css/property-descriptors/font-family.d.ts +0 -4
  326. package/dist/types/css/property-descriptors/font-size.d.ts +0 -2
  327. package/dist/types/css/property-descriptors/font-style.d.ts +0 -7
  328. package/dist/types/css/property-descriptors/font-variant.d.ts +0 -2
  329. package/dist/types/css/property-descriptors/font-weight.d.ts +0 -2
  330. package/dist/types/css/property-descriptors/letter-spacing.d.ts +0 -2
  331. package/dist/types/css/property-descriptors/line-break.d.ts +0 -6
  332. package/dist/types/css/property-descriptors/line-height.d.ts +0 -4
  333. package/dist/types/css/property-descriptors/list-style-image.d.ts +0 -3
  334. package/dist/types/css/property-descriptors/list-style-position.d.ts +0 -6
  335. package/dist/types/css/property-descriptors/list-style-type.d.ts +0 -58
  336. package/dist/types/css/property-descriptors/margin.d.ts +0 -5
  337. package/dist/types/css/property-descriptors/opacity.d.ts +0 -2
  338. package/dist/types/css/property-descriptors/overflow-wrap.d.ts +0 -6
  339. package/dist/types/css/property-descriptors/overflow.d.ts +0 -9
  340. package/dist/types/css/property-descriptors/padding.d.ts +0 -5
  341. package/dist/types/css/property-descriptors/paint-order.d.ts +0 -8
  342. package/dist/types/css/property-descriptors/position.d.ts +0 -9
  343. package/dist/types/css/property-descriptors/quotes.d.ts +0 -8
  344. package/dist/types/css/property-descriptors/text-align.d.ts +0 -7
  345. package/dist/types/css/property-descriptors/text-decoration-color.d.ts +0 -2
  346. package/dist/types/css/property-descriptors/text-decoration-line.d.ts +0 -10
  347. package/dist/types/css/property-descriptors/text-shadow.d.ts +0 -12
  348. package/dist/types/css/property-descriptors/text-transform.d.ts +0 -8
  349. package/dist/types/css/property-descriptors/transform-origin.d.ts +0 -4
  350. package/dist/types/css/property-descriptors/transform.d.ts +0 -4
  351. package/dist/types/css/property-descriptors/visibility.d.ts +0 -7
  352. package/dist/types/css/property-descriptors/webkit-text-stroke-color.d.ts +0 -2
  353. package/dist/types/css/property-descriptors/webkit-text-stroke-width.d.ts +0 -2
  354. package/dist/types/css/property-descriptors/word-break.d.ts +0 -7
  355. package/dist/types/css/property-descriptors/z-index.d.ts +0 -7
  356. package/dist/types/css/syntax/__tests__/tokernizer-tests.d.ts +0 -1
  357. package/dist/types/css/syntax/parser.d.ts +0 -34
  358. package/dist/types/css/syntax/tokenizer.d.ts +0 -94
  359. package/dist/types/css/types/__tests__/color-tests.d.ts +0 -1
  360. package/dist/types/css/types/__tests__/image-tests.d.ts +0 -1
  361. package/dist/types/css/types/angle.d.ts +0 -7
  362. package/dist/types/css/types/color.d.ts +0 -11
  363. package/dist/types/css/types/functions/-prefix-linear-gradient.d.ts +0 -4
  364. package/dist/types/css/types/functions/-prefix-radial-gradient.d.ts +0 -4
  365. package/dist/types/css/types/functions/-webkit-gradient.d.ts +0 -4
  366. package/dist/types/css/types/functions/__tests__/radial-gradient.d.ts +0 -1
  367. package/dist/types/css/types/functions/counter.d.ts +0 -10
  368. package/dist/types/css/types/functions/gradient.d.ts +0 -7
  369. package/dist/types/css/types/functions/linear-gradient.d.ts +0 -4
  370. package/dist/types/css/types/functions/radial-gradient.d.ts +0 -12
  371. package/dist/types/css/types/image.d.ts +0 -54
  372. package/dist/types/css/types/index.d.ts +0 -1
  373. package/dist/types/css/types/length-percentage.d.ts +0 -11
  374. package/dist/types/css/types/length.d.ts +0 -4
  375. package/dist/types/css/types/time.d.ts +0 -2
  376. package/dist/types/dom/__mocks__/document-cloner.d.ts +0 -6
  377. package/dist/types/dom/document-cloner.d.ts +0 -45
  378. package/dist/types/dom/element-container.d.ts +0 -21
  379. package/dist/types/dom/elements/li-element-container.d.ts +0 -6
  380. package/dist/types/dom/elements/ol-element-container.d.ts +0 -7
  381. package/dist/types/dom/elements/select-element-container.d.ts +0 -6
  382. package/dist/types/dom/elements/textarea-element-container.d.ts +0 -6
  383. package/dist/types/dom/node-parser.d.ts +0 -23
  384. package/dist/types/dom/replaced-elements/canvas-element-container.d.ts +0 -8
  385. package/dist/types/dom/replaced-elements/iframe-element-container.d.ts +0 -11
  386. package/dist/types/dom/replaced-elements/image-element-container.d.ts +0 -8
  387. package/dist/types/dom/replaced-elements/index.d.ts +0 -4
  388. package/dist/types/dom/replaced-elements/input-element-container.d.ts +0 -12
  389. package/dist/types/dom/replaced-elements/pseudo-elements.d.ts +0 -0
  390. package/dist/types/dom/replaced-elements/svg-element-container.d.ts +0 -8
  391. package/dist/types/dom/text-container.d.ts +0 -8
  392. package/dist/types/index.d.ts +0 -18
  393. package/dist/types/invariant.d.ts +0 -1
  394. package/dist/types/render/background.d.ts +0 -16
  395. package/dist/types/render/bezier-curve.d.ts +0 -14
  396. package/dist/types/render/border.d.ts +0 -6
  397. package/dist/types/render/bound-curves.d.ts +0 -32
  398. package/dist/types/render/box-sizing.d.ts +0 -4
  399. package/dist/types/render/canvas/canvas-renderer2.d.ts +0 -81
  400. package/dist/types/render/canvas/foreignobject-renderer.d.ts +0 -11
  401. package/dist/types/render/canvas/pdf-renderer.d.ts +0 -80
  402. package/dist/types/render/effects.d.ts +0 -38
  403. package/dist/types/render/font-metrics.d.ts +0 -11
  404. package/dist/types/render/path.d.ts +0 -13
  405. package/dist/types/render/renderer.d.ts +0 -7
  406. package/dist/types/render/stacking-context.d.ts +0 -24
  407. package/dist/types/render/vector.d.ts +0 -9
package/dist/index.d.ts CHANGED
@@ -1,18 +1,16 @@
1
+ import { jsPDF } from 'jspdf';
1
2
  import { ContextOptions } from './core/context';
2
3
  import { CloneOptions, WindowOptions } from './dom/document-cloner';
3
4
  import { RenderOptions } from './render/canvas/pdf-renderer';
4
- interface FontConfig {
5
- fontFamily: string;
6
- fontBase64: string;
7
- fontUrl: string;
8
- fontWeight: number;
9
- fontStyle: string;
10
- }
5
+ import { FontConfig } from './utils';
11
6
  export type Options = CloneOptions & WindowOptions & RenderOptions & ContextOptions & {
12
7
  backgroundColor: string | null;
13
8
  foreignObjectRendering: boolean;
9
+ divisionDisable?: boolean;
14
10
  removeContainer?: boolean;
15
- fontConfig?: FontConfig;
11
+ fontConfig?: FontConfig | FontConfig[] | undefined;
12
+ onJspdfReady?: (jspdfCtx: jsPDF) => void;
13
+ onJspdfFinish?: (jspdfCtx: jsPDF) => void;
16
14
  };
17
15
  declare const dompdf: (element: HTMLElement, options?: Partial<Options>) => Promise<HTMLCanvasElement>;
18
16
  export default dompdf;
@@ -1,26 +1,43 @@
1
+ import { Context2d, EncryptionOptions, jsPDF } from 'jspdf';
2
+ import 'jspdf/dist/polyfills.es.js';
1
3
  import { Context } from '../../core/context';
2
4
  import { CSSParsedDeclaration } from '../../css';
5
+ import { Bounds } from '../../css/layout/bounds';
3
6
  import { TextBounds } from '../../css/layout/text';
4
7
  import { BORDER_STYLE } from '../../css/property-descriptors/border-style';
5
8
  import { Color } from '../../css/types/color';
6
9
  import { ElementContainer } from '../../dom/element-container';
7
- import { ReplacedElementContainer } from '../../dom/replaced-elements';
10
+ import { CanvasElementContainer } from '../../dom/replaced-elements/canvas-element-container';
11
+ import { ImageElementContainer } from '../../dom/replaced-elements/image-element-container';
12
+ import { SVGElementContainer } from '../../dom/replaced-elements/svg-element-container';
8
13
  import { TextContainer } from '../../dom/text-container';
9
14
  import { BoundCurves } from '../bound-curves';
10
15
  import { IElementEffect } from '../effects';
16
+ import { FontConfig } from '../../utils';
11
17
  import { Path } from '../path';
12
18
  import { Renderer } from '../renderer';
13
19
  import { ElementPaint, StackingContext } from '../stacking-context';
14
- interface FontConfig {
15
- fontFamily: string;
16
- fontBase64: string;
17
- fontUrl: string;
18
- fontWeight: number;
19
- fontStyle: string;
20
- }
21
20
  export type RenderConfigurations = RenderOptions & {
22
21
  backgroundColor: Color | null;
23
- fontConfig: FontConfig;
22
+ fontConfig: FontConfig | FontConfig[] | undefined;
23
+ };
24
+ export type pageConfigOptions = {
25
+ header: {
26
+ content: string;
27
+ height: number;
28
+ contentPosition: 'center' | 'centerLeft' | 'centerRight' | 'centerTop' | 'centerBottom' | 'leftTop' | 'leftBottom' | 'rightTop' | 'rightBottom' | [number, number];
29
+ contentColor: string;
30
+ contentFontSize: number;
31
+ padding?: [number, number, number, number];
32
+ };
33
+ footer: {
34
+ content: string;
35
+ height: number;
36
+ contentPosition: 'center' | 'centerLeft' | 'centerRight' | 'centerTop' | 'centerBottom' | 'leftTop' | 'leftBottom' | 'rightTop' | 'rightBottom' | [number, number];
37
+ contentColor: string;
38
+ contentFontSize: number;
39
+ padding?: [number, number, number, number];
40
+ };
24
41
  };
25
42
  export interface RenderOptions {
26
43
  scale: number;
@@ -30,19 +47,33 @@ export interface RenderOptions {
30
47
  width: number;
31
48
  height: number;
32
49
  pdfFileName?: string;
50
+ encryption?: EncryptionOptions | undefined;
51
+ precision?: number;
52
+ floatPrecision?: number | 'smart';
53
+ compress?: boolean;
54
+ putOnlyUsedFonts?: boolean;
55
+ pagination?: boolean;
56
+ format?: 'a0' | 'a1' | 'a2' | 'a3' | 'a4' | 'a5' | 'a6' | 'a7' | 'a8' | 'a9' | 'a10' | 'b0' | 'b1' | 'b2' | 'b3' | 'b4' | 'b5' | 'b6' | 'b7' | 'b8' | 'b9' | 'b10' | 'c0' | 'c1' | 'c2' | 'c3' | 'c4' | 'c5' | 'c6' | 'c7' | 'c8' | 'c9' | 'c10' | 'dl' | 'letter' | 'government-letter' | 'legal' | 'junior-legal' | 'ledger' | 'tabloid' | 'credit-card' | [number, number];
57
+ pageConfig?: pageConfigOptions;
58
+ }
59
+ export declare class JsPdfContext2d {
60
+ }
61
+ export interface JsPdfContext2d extends Context2d {
62
+ getLineDash(): number[];
63
+ setLineDash(segments: number[]): void;
33
64
  }
34
65
  export declare class CanvasRenderer extends Renderer {
35
66
  canvas: HTMLCanvasElement;
36
- ctx: CanvasRenderingContext2D;
37
- readonly jspdfCtx: any;
38
- readonly context2dCtx: any;
67
+ readonly jspdfCtx: jsPDF;
68
+ readonly context2dCtx: JsPdfContext2d;
39
69
  private readonly _activeEffects;
40
70
  private readonly fontMetrics;
41
71
  private readonly pxToPt;
72
+ private totalPages;
42
73
  constructor(context: Context, options: RenderConfigurations);
43
- loadFont(): Promise<void>;
44
- loadFontFromURL(url: string): Promise<unknown>;
45
- addFontToJsPDF(fontData: string): void;
74
+ addFontToJsPDF(): void;
75
+ resetJsPDFFont(): void;
76
+ setTextFont(styles: CSSParsedDeclaration): string;
46
77
  applyEffects(effects: IElementEffect[]): void;
47
78
  applyEffect(effect: IElementEffect): void;
48
79
  popEffect(): void;
@@ -52,29 +83,28 @@ export declare class CanvasRenderer extends Renderer {
52
83
  private createFontStyle;
53
84
  private convertColor;
54
85
  renderTextNode(text: TextContainer, styles: CSSParsedDeclaration): Promise<void>;
55
- renderReplacedElement(container: ReplacedElementContainer, curves: BoundCurves, image: HTMLImageElement | HTMLCanvasElement): void;
86
+ renderReplacedJsPdfImage(container: ImageElementContainer, image: HTMLImageElement | HTMLCanvasElement): void;
87
+ renderReplacedJsPdfSvg(container: SVGElementContainer, image: HTMLImageElement | HTMLCanvasElement): void;
88
+ renderReplacedJsPdfCanvasImage(container: CanvasElementContainer): void;
56
89
  renderNodeContent(paint: ElementPaint): Promise<void>;
57
90
  renderStackContent(stack: StackingContext): Promise<void>;
58
91
  mask(paths: Path[]): void;
59
- path(paths: Path[]): void;
60
- formatPath(paths: Path[]): void;
61
- renderRepeat(path: Path[], pattern: CanvasPattern | CanvasGradient, offsetX: number, offsetY: number): void;
92
+ path(paths: Path[], ctx2d?: Context2d | CanvasRenderingContext2D): void;
93
+ formatPath(paths: Path[], ctx2d?: Context2d | CanvasRenderingContext2D): void;
94
+ renderRepeat(boxs: Bounds, ctx: CanvasRenderingContext2D, path: Path[], pattern: CanvasPattern | CanvasGradient): void;
62
95
  resizeImage(image: HTMLImageElement, width: number, height: number): HTMLCanvasElement | HTMLImageElement;
63
96
  renderBackgroundImage(container: ElementContainer): Promise<void>;
64
- /**
65
- * 渲染实线边框
66
- * @param color - 边框颜色
67
- * @param side - 边的位置(0-3,分别代表上右下左)
68
- * @param curvePoints - 边框曲线点
69
- */
70
97
  renderSolidBorder(color: Color, side: number, curvePoints: BoundCurves): Promise<void>;
71
98
  renderDoubleBorder(color: Color, width: number, side: number, curvePoints: BoundCurves): Promise<void>;
72
99
  renderNodeBackgroundAndBorders(paint: ElementPaint): Promise<void>;
73
- renderDashedDottedBorder(color: Color, // 边框颜色
74
- width: number, // 边框宽度
75
- side: number, // 边的位置(0-3,分别代表上右下左)
76
- curvePoints: BoundCurves, // 边框曲线点
77
- style: BORDER_STYLE): Promise<void>;
78
- render(element: ElementContainer): Promise<HTMLCanvasElement>;
100
+ renderDashedDottedBorder(color: Color, width: number, side: number, curvePoints: BoundCurves, style: BORDER_STYLE): Promise<void>;
101
+ addPage(offsetY: number): Promise<void>;
102
+ renderPage(element: ElementContainer, pageNum: number): Promise<void>;
103
+ setTotalPages(total: number): void;
104
+ private setTextColorFromString;
105
+ private safe;
106
+ private textPdf;
107
+ private computeContentPosition;
108
+ private addImagePdf;
109
+ output(): Promise<Blob>;
79
110
  }
80
- export {};
@@ -0,0 +1,4 @@
1
+ export declare const PAGE_FORMAT_MAP: Record<string, {
2
+ width: number;
3
+ height: number;
4
+ }>;
@@ -0,0 +1,3 @@
1
+ import type { ElementContainer } from '../dom/element-container';
2
+ import { pageConfigOptions } from './canvas/pdf-renderer';
3
+ export declare const paginateNode: (root: ElementContainer, pageHeight: number, initialOffset?: number, pageConfig?: pageConfigOptions) => ElementContainer[];
@@ -0,0 +1,2 @@
1
+ import { BACKGROUND_REPEAT } from '../css/property-descriptors/background-repeat';
2
+ export declare function getBackgroundRepeat(value: BACKGROUND_REPEAT): string;
@@ -0,0 +1,7 @@
1
+ import type { ElementContainer } from '../dom/element-container';
2
+ /**
3
+ * Recursively traverse the nodes and check whether the textNodes of all levels are empty arrays
4
+ * @param {ElementContainer} node
5
+ * @returns {boolean} - If all textNodes are empty, return true; otherwise, return false
6
+ */
7
+ export declare function checkAllTextNodesEmpty(node: ElementContainer): boolean;
@@ -0,0 +1,7 @@
1
+ export interface FontConfig {
2
+ fontFamily: string;
3
+ fontBase64: string;
4
+ fontStyle: string;
5
+ fontWeight: 400 | 700;
6
+ }
7
+ export declare function validateFontConfig(fontConfig: FontConfig | FontConfig[] | undefined): boolean;
@@ -0,0 +1,5 @@
1
+ export * from './css-utils';
2
+ export * from './element-utils';
3
+ export * from './font-utils';
4
+ export * from './type-utils';
5
+ export * from './url-path';
@@ -0,0 +1,4 @@
1
+ export declare function isEmptyValue(obj: unknown): boolean;
2
+ export declare function isArray(obj: unknown): obj is Array<unknown>;
3
+ export declare function isObject(obj: unknown): obj is Record<string, unknown>;
4
+ export declare function isFunction(fn: unknown): fn is (...args: unknown[]) => unknown;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 判断图片路径是否为指定类型的图片
3
+ * @param {string} path 图片路径/URL(如 "../tests/assets/image.svg"、"https://xxx.com/photo.webp")
4
+ * @param {("svg" | "webp" | "png" | "jpg" | "gif" | "unknown")} type 要判断的图片类型
5
+ * @returns {boolean} 是否为指定类型的图片
6
+ */
7
+ export declare function getImageTypeByPath(path: string, type: 'svg' | 'webp' | 'png' | 'jpg' | 'gif' | 'unknown'): boolean;
@@ -0,0 +1,2 @@
1
+ /*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
2
+ var saveAs=saveAs||function(e){"use strict";if(typeof e==="undefined"||typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var t=e.document,n=function(){return e.URL||e.webkitURL||e},r=t.createElementNS("http://www.w3.org/1999/xhtml","a"),o="download"in r,a=function(e){var t=new MouseEvent("click");e.dispatchEvent(t)},i=/constructor/i.test(e.HTMLElement)||e.safari,f=/CriOS\/[\d]+/.test(navigator.userAgent),u=function(t){(e.setImmediate||e.setTimeout)(function(){throw t},0)},s="application/octet-stream",d=1e3*40,c=function(e){var t=function(){if(typeof e==="string"){n().revokeObjectURL(e)}else{e.remove()}};setTimeout(t,d)},l=function(e,t,n){t=[].concat(t);var r=t.length;while(r--){var o=e["on"+t[r]];if(typeof o==="function"){try{o.call(e,n||e)}catch(a){u(a)}}}},p=function(e){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)){return new Blob([String.fromCharCode(65279),e],{type:e.type})}return e},v=function(t,u,d){if(!d){t=p(t)}var v=this,w=t.type,m=w===s,y,h=function(){l(v,"writestart progress write writeend".split(" "))},S=function(){if((f||m&&i)&&e.FileReader){var r=new FileReader;r.onloadend=function(){var t=f?r.result:r.result.replace(/^data:[^;]*;/,"data:attachment/file;");var n=e.open(t,"_blank");if(!n)e.location.href=t;t=undefined;v.readyState=v.DONE;h()};r.readAsDataURL(t);v.readyState=v.INIT;return}if(!y){y=n().createObjectURL(t)}if(m){e.location.href=y}else{var o=e.open(y,"_blank");if(!o){e.location.href=y}}v.readyState=v.DONE;h();c(y)};v.readyState=v.INIT;if(o){y=n().createObjectURL(t);setTimeout(function(){r.href=y;r.download=u;a(r);h();c(y);v.readyState=v.DONE});return}S()},w=v.prototype,m=function(e,t,n){return new v(e,t||e.name||"download",n)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(e,t,n){t=t||e.name||"download";if(!n){e=p(e)}return navigator.msSaveOrOpenBlob(e,t)}}w.abort=function(){};w.readyState=w.INIT=0;w.WRITING=1;w.DONE=2;w.error=w.onwritestart=w.onprogress=w.onwrite=w.onabort=w.onerror=w.onwriteend=null;return m}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||this.content);if(typeof module!=="undefined"&&module.exports){module.exports.saveAs=saveAs}else if(typeof define!=="undefined"&&define!==null&&define.amd!==null){define("FileSaver.js",function(){return saveAs})}
@@ -0,0 +1,432 @@
1
+ /*!
2
+ FileReader.js - v0.99
3
+ A lightweight wrapper for common FileReader usage.
4
+ Copyright 2014 Brian Grinstead - MIT License.
5
+ See http://github.com/bgrins/filereader.js for documentation.
6
+ */
7
+
8
+ (function(window, document) {
9
+
10
+ var FileReader = window.FileReader;
11
+ var FileReaderSyncSupport = false;
12
+ var workerScript = "self.addEventListener('message', function(e) { var data=e.data; try { var reader = new FileReaderSync; postMessage({ result: reader[data.readAs](data.file), extra: data.extra, file: data.file})} catch(e){ postMessage({ result:'error', extra:data.extra, file:data.file}); } }, false);";
13
+ var syncDetectionScript = "onmessage = function(e) { postMessage(!!FileReaderSync); };";
14
+ var fileReaderEvents = ['loadstart', 'progress', 'load', 'abort', 'error', 'loadend'];
15
+ var sync = false;
16
+ var FileReaderJS = window.FileReaderJS = {
17
+ enabled: false,
18
+ setupInput: setupInput,
19
+ setupDrop: setupDrop,
20
+ setupClipboard: setupClipboard,
21
+ setSync: function (value) {
22
+ sync = value;
23
+
24
+ if (sync && !FileReaderSyncSupport) {
25
+ checkFileReaderSyncSupport();
26
+ }
27
+ },
28
+ getSync: function() {
29
+ return sync && FileReaderSyncSupport;
30
+ },
31
+ output: [],
32
+ opts: {
33
+ dragClass: "drag",
34
+ accept: false,
35
+ readAsDefault: 'DataURL',
36
+ readAsMap: {
37
+ },
38
+ on: {
39
+ loadstart: noop,
40
+ progress: noop,
41
+ load: noop,
42
+ abort: noop,
43
+ error: noop,
44
+ loadend: noop,
45
+ skip: noop,
46
+ groupstart: noop,
47
+ groupend: noop,
48
+ beforestart: noop
49
+ }
50
+ }
51
+ };
52
+
53
+ // Setup jQuery plugin (if available)
54
+ if (typeof(jQuery) !== "undefined") {
55
+ jQuery.fn.fileReaderJS = function(opts) {
56
+ return this.each(function() {
57
+ if (jQuery(this).is("input")) {
58
+ setupInput(this, opts);
59
+ }
60
+ else {
61
+ setupDrop(this, opts);
62
+ }
63
+ });
64
+ };
65
+
66
+ jQuery.fn.fileClipboard = function(opts) {
67
+ return this.each(function() {
68
+ setupClipboard(this, opts);
69
+ });
70
+ };
71
+ }
72
+
73
+ // Not all browsers support the FileReader interface. Return with the enabled bit = false.
74
+ if (!FileReader) {
75
+ return;
76
+ }
77
+
78
+
79
+ // makeWorker is a little wrapper for generating web workers from strings
80
+ function makeWorker(script) {
81
+ var URL = window.URL || window.webkitURL;
82
+ var Blob = window.Blob;
83
+ var Worker = window.Worker;
84
+
85
+ if (!URL || !Blob || !Worker || !script) {
86
+ return null;
87
+ }
88
+
89
+ var blob = new Blob([script]);
90
+ var worker = new Worker(URL.createObjectURL(blob));
91
+ return worker;
92
+ }
93
+
94
+ // setupClipboard: bind to clipboard events (intended for document.body)
95
+ function setupClipboard(element, opts) {
96
+
97
+ if (!FileReaderJS.enabled) {
98
+ return;
99
+ }
100
+ var instanceOptions = extend(extend({}, FileReaderJS.opts), opts);
101
+
102
+ element.addEventListener("paste", onpaste, false);
103
+
104
+ function onpaste(e) {
105
+ var files = [];
106
+ var clipboardData = e.clipboardData || {};
107
+ var items = clipboardData.items || [];
108
+
109
+ for (var i = 0; i < items.length; i++) {
110
+ var file = items[i].getAsFile();
111
+
112
+ if (file) {
113
+
114
+ // Create a fake file name for images from clipboard, since this data doesn't get sent
115
+ var matches = new RegExp("/\(.*\)").exec(file.type);
116
+ if (!file.name && matches) {
117
+ var extension = matches[1];
118
+ file.name = "clipboard" + i + "." + extension;
119
+ }
120
+
121
+ files.push(file);
122
+ }
123
+ }
124
+
125
+ if (files.length) {
126
+ processFileList(e, files, instanceOptions);
127
+ e.preventDefault();
128
+ e.stopPropagation();
129
+ }
130
+ }
131
+ }
132
+
133
+ // setupInput: bind the 'change' event to an input[type=file]
134
+ function setupInput(input, opts) {
135
+
136
+ if (!FileReaderJS.enabled) {
137
+ return;
138
+ }
139
+ var instanceOptions = extend(extend({}, FileReaderJS.opts), opts);
140
+
141
+ input.addEventListener("change", inputChange, false);
142
+ input.addEventListener("drop", inputDrop, false);
143
+
144
+ function inputChange(e) {
145
+ processFileList(e, input.files, instanceOptions);
146
+ }
147
+
148
+ function inputDrop(e) {
149
+ e.stopPropagation();
150
+ e.preventDefault();
151
+ processFileList(e, e.dataTransfer.files, instanceOptions);
152
+ }
153
+ }
154
+
155
+ // setupDrop: bind the 'drop' event for a DOM element
156
+ function setupDrop(dropbox, opts) {
157
+
158
+ if (!FileReaderJS.enabled) {
159
+ return;
160
+ }
161
+ var instanceOptions = extend(extend({}, FileReaderJS.opts), opts);
162
+ var dragClass = instanceOptions.dragClass;
163
+ var initializedOnBody = false;
164
+
165
+ // Bind drag events to the dropbox to add the class while dragging, and accept the drop data transfer.
166
+ dropbox.addEventListener("dragenter", onlyWithFiles(dragenter), false);
167
+ dropbox.addEventListener("dragleave", onlyWithFiles(dragleave), false);
168
+ dropbox.addEventListener("dragover", onlyWithFiles(dragover), false);
169
+ dropbox.addEventListener("drop", onlyWithFiles(drop), false);
170
+
171
+ // Bind to body to prevent the dropbox events from firing when it was initialized on the page.
172
+ document.body.addEventListener("dragstart", bodydragstart, true);
173
+ document.body.addEventListener("dragend", bodydragend, true);
174
+ document.body.addEventListener("drop", bodydrop, false);
175
+
176
+ function bodydragend(e) {
177
+ initializedOnBody = false;
178
+ }
179
+
180
+ function bodydragstart(e) {
181
+ initializedOnBody = true;
182
+ }
183
+
184
+ function bodydrop(e) {
185
+ if (e.dataTransfer.files && e.dataTransfer.files.length ){
186
+ e.stopPropagation();
187
+ e.preventDefault();
188
+ }
189
+ }
190
+
191
+ function onlyWithFiles(fn) {
192
+ return function() {
193
+ if (!initializedOnBody) {
194
+ fn.apply(this, arguments);
195
+ }
196
+ };
197
+ }
198
+
199
+ function drop(e) {
200
+ e.stopPropagation();
201
+ e.preventDefault();
202
+ if (dragClass) {
203
+ removeClass(dropbox, dragClass);
204
+ }
205
+ processFileList(e, e.dataTransfer.files, instanceOptions);
206
+ }
207
+
208
+ function dragenter(e) {
209
+ e.stopPropagation();
210
+ e.preventDefault();
211
+ if (dragClass) {
212
+ addClass(dropbox, dragClass);
213
+ }
214
+ }
215
+
216
+ function dragleave(e) {
217
+ if (dragClass) {
218
+ removeClass(dropbox, dragClass);
219
+ }
220
+ }
221
+
222
+ function dragover(e) {
223
+ e.stopPropagation();
224
+ e.preventDefault();
225
+ if (dragClass) {
226
+ addClass(dropbox, dragClass);
227
+ }
228
+ }
229
+ }
230
+
231
+ // setupCustomFileProperties: modify the file object with extra properties
232
+ function setupCustomFileProperties(files, groupID) {
233
+ for (var i = 0; i < files.length; i++) {
234
+ var file = files[i];
235
+ file.extra = {
236
+ nameNoExtension: file.name.substring(0, file.name.lastIndexOf('.')),
237
+ extension: file.name.substring(file.name.lastIndexOf('.') + 1),
238
+ fileID: i,
239
+ uniqueID: getUniqueID(),
240
+ groupID: groupID,
241
+ prettySize: prettySize(file.size)
242
+ };
243
+ }
244
+ }
245
+
246
+ // getReadAsMethod: return method name for 'readAs*' - http://www.w3.org/TR/FileAPI/#reading-a-file
247
+ function getReadAsMethod(type, readAsMap, readAsDefault) {
248
+ for (var r in readAsMap) {
249
+ if (type.match(new RegExp(r))) {
250
+ return 'readAs' + readAsMap[r];
251
+ }
252
+ }
253
+ return 'readAs' + readAsDefault;
254
+ }
255
+
256
+ // processFileList: read the files with FileReader, send off custom events.
257
+ function processFileList(e, files, opts) {
258
+
259
+ var filesLeft = files.length;
260
+ var group = {
261
+ groupID: getGroupID(),
262
+ files: files,
263
+ started: new Date()
264
+ };
265
+
266
+ function groupEnd() {
267
+ group.ended = new Date();
268
+ opts.on.groupend(group);
269
+ }
270
+
271
+ function groupFileDone() {
272
+ if (--filesLeft === 0) {
273
+ groupEnd();
274
+ }
275
+ }
276
+
277
+ FileReaderJS.output.push(group);
278
+ setupCustomFileProperties(files, group.groupID);
279
+
280
+ opts.on.groupstart(group);
281
+
282
+ // No files in group - end immediately
283
+ if (!files.length) {
284
+ groupEnd();
285
+ return;
286
+ }
287
+
288
+ var supportsSync = sync && FileReaderSyncSupport;
289
+ var syncWorker;
290
+
291
+ // Only initialize the synchronous worker if the option is enabled - to prevent the overhead
292
+ if (supportsSync) {
293
+ syncWorker = makeWorker(workerScript);
294
+ syncWorker.onmessage = function(e) {
295
+ var file = e.data.file;
296
+ var result = e.data.result;
297
+
298
+ // Workers seem to lose the custom property on the file object.
299
+ if (!file.extra) {
300
+ file.extra = e.data.extra;
301
+ }
302
+
303
+ file.extra.ended = new Date();
304
+
305
+ // Call error or load event depending on success of the read from the worker.
306
+ opts.on[result === "error" ? "error" : "load"]({ target: { result: result } }, file);
307
+ groupFileDone();
308
+ };
309
+ }
310
+
311
+ Array.prototype.forEach.call(files, function(file) {
312
+
313
+ file.extra.started = new Date();
314
+
315
+ if (opts.accept && !file.type.match(new RegExp(opts.accept))) {
316
+ opts.on.skip(file);
317
+ groupFileDone();
318
+ return;
319
+ }
320
+
321
+ if (opts.on.beforestart(file) === false) {
322
+ opts.on.skip(file);
323
+ groupFileDone();
324
+ return;
325
+ }
326
+
327
+ var readAs = getReadAsMethod(file.type, opts.readAsMap, opts.readAsDefault);
328
+
329
+ if (syncWorker) {
330
+ syncWorker.postMessage({
331
+ file: file,
332
+ extra: file.extra,
333
+ readAs: readAs
334
+ });
335
+ }
336
+ else {
337
+
338
+ var reader = new FileReader();
339
+ reader.originalEvent = e;
340
+
341
+ fileReaderEvents.forEach(function(eventName) {
342
+ reader['on' + eventName] = function(e) {
343
+ if (eventName == 'load' || eventName == 'error') {
344
+ file.extra.ended = new Date();
345
+ }
346
+ opts.on[eventName](e, file);
347
+ if (eventName == 'loadend') {
348
+ groupFileDone();
349
+ }
350
+ };
351
+ });
352
+ reader[readAs](file);
353
+ }
354
+ });
355
+ }
356
+
357
+ // checkFileReaderSyncSupport: Create a temporary worker and see if FileReaderSync exists
358
+ function checkFileReaderSyncSupport() {
359
+ var worker = makeWorker(syncDetectionScript);
360
+ if (worker) {
361
+ worker.onmessage =function(e) {
362
+ FileReaderSyncSupport = e.data;
363
+ };
364
+ worker.postMessage({});
365
+ }
366
+ }
367
+
368
+ // noop: do nothing
369
+ function noop() {
370
+
371
+ }
372
+
373
+ // extend: used to make deep copies of options object
374
+ function extend(destination, source) {
375
+ for (var property in source) {
376
+ if (source[property] && source[property].constructor &&
377
+ source[property].constructor === Object) {
378
+ destination[property] = destination[property] || {};
379
+ arguments.callee(destination[property], source[property]);
380
+ }
381
+ else {
382
+ destination[property] = source[property];
383
+ }
384
+ }
385
+ return destination;
386
+ }
387
+
388
+ // hasClass: does an element have the css class?
389
+ function hasClass(el, name) {
390
+ return new RegExp("(?:^|\\s+)" + name + "(?:\\s+|$)").test(el.className);
391
+ }
392
+
393
+ // addClass: add the css class for the element.
394
+ function addClass(el, name) {
395
+ if (!hasClass(el, name)) {
396
+ el.className = el.className ? [el.className, name].join(' ') : name;
397
+ }
398
+ }
399
+
400
+ // removeClass: remove the css class from the element.
401
+ function removeClass(el, name) {
402
+ if (hasClass(el, name)) {
403
+ var c = el.className;
404
+ el.className = c.replace(new RegExp("(?:^|\\s+)" + name + "(?:\\s+|$)", "g"), " ").replace(/^\s\s*/, '').replace(/\s\s*$/, '');
405
+ }
406
+ }
407
+
408
+ // prettySize: convert bytes to a more readable string.
409
+ function prettySize(bytes) {
410
+ var s = ['bytes', 'kb', 'MB', 'GB', 'TB', 'PB'];
411
+ var e = Math.floor(Math.log(bytes)/Math.log(1024));
412
+ return (bytes/Math.pow(1024, Math.floor(e))).toFixed(2)+" "+s[e];
413
+ }
414
+
415
+ // getGroupID: generate a unique int ID for groups.
416
+ var getGroupID = (function(id) {
417
+ return function() {
418
+ return id++;
419
+ };
420
+ })(0);
421
+
422
+ // getUniqueID: generate a unique int ID for files
423
+ var getUniqueID = (function(id) {
424
+ return function() {
425
+ return id++;
426
+ };
427
+ })(0);
428
+
429
+ // The interface is supported, bind the FileReaderJS callbacks
430
+ FileReaderJS.enabled = true;
431
+
432
+ })(this, document);