web-doc 0.3.0

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 (308) hide show
  1. package/LICENSE-APACHE +201 -0
  2. package/LICENSE-MIT +21 -0
  3. package/README.md +148 -0
  4. package/THIRD_PARTY_NOTICES.md +20 -0
  5. package/bin/copy-assets.mjs +27 -0
  6. package/dist/abort.d.ts +1 -0
  7. package/dist/abort.js +18 -0
  8. package/dist/adapters/bitmap.d.ts +9 -0
  9. package/dist/adapters/bitmap.js +63 -0
  10. package/dist/adapters/csv-parser.d.ts +7 -0
  11. package/dist/adapters/csv-parser.js +124 -0
  12. package/dist/adapters/csv.d.ts +26 -0
  13. package/dist/adapters/csv.js +231 -0
  14. package/dist/adapters/image.d.ts +41 -0
  15. package/dist/adapters/image.js +198 -0
  16. package/dist/adapters/office.d.ts +211 -0
  17. package/dist/adapters/office.js +672 -0
  18. package/dist/adapters/pdf.d.ts +32 -0
  19. package/dist/adapters/pdf.js +429 -0
  20. package/dist/adapters/svg.d.ts +17 -0
  21. package/dist/adapters/svg.js +123 -0
  22. package/dist/assets/image/index.d.ts +75 -0
  23. package/dist/assets/image/index.js +289 -0
  24. package/dist/assets/image/index_bg.wasm +0 -0
  25. package/dist/assets/image/index_bg.wasm.d.ts +12 -0
  26. package/dist/assets/legacy/index.d.ts +54 -0
  27. package/dist/assets/legacy/index.js +306 -0
  28. package/dist/assets/legacy/index_bg.wasm +0 -0
  29. package/dist/assets/legacy/index_bg.wasm.d.ts +9 -0
  30. package/dist/assets/pdfjs/cmaps/78-EUC-H.bcmap +0 -0
  31. package/dist/assets/pdfjs/cmaps/78-EUC-V.bcmap +0 -0
  32. package/dist/assets/pdfjs/cmaps/78-H.bcmap +0 -0
  33. package/dist/assets/pdfjs/cmaps/78-RKSJ-H.bcmap +0 -0
  34. package/dist/assets/pdfjs/cmaps/78-RKSJ-V.bcmap +0 -0
  35. package/dist/assets/pdfjs/cmaps/78-V.bcmap +0 -0
  36. package/dist/assets/pdfjs/cmaps/78ms-RKSJ-H.bcmap +0 -0
  37. package/dist/assets/pdfjs/cmaps/78ms-RKSJ-V.bcmap +0 -0
  38. package/dist/assets/pdfjs/cmaps/83pv-RKSJ-H.bcmap +0 -0
  39. package/dist/assets/pdfjs/cmaps/90ms-RKSJ-H.bcmap +0 -0
  40. package/dist/assets/pdfjs/cmaps/90ms-RKSJ-V.bcmap +0 -0
  41. package/dist/assets/pdfjs/cmaps/90msp-RKSJ-H.bcmap +0 -0
  42. package/dist/assets/pdfjs/cmaps/90msp-RKSJ-V.bcmap +0 -0
  43. package/dist/assets/pdfjs/cmaps/90pv-RKSJ-H.bcmap +0 -0
  44. package/dist/assets/pdfjs/cmaps/90pv-RKSJ-V.bcmap +0 -0
  45. package/dist/assets/pdfjs/cmaps/Add-H.bcmap +0 -0
  46. package/dist/assets/pdfjs/cmaps/Add-RKSJ-H.bcmap +0 -0
  47. package/dist/assets/pdfjs/cmaps/Add-RKSJ-V.bcmap +0 -0
  48. package/dist/assets/pdfjs/cmaps/Add-V.bcmap +0 -0
  49. package/dist/assets/pdfjs/cmaps/Adobe-CNS1-0.bcmap +0 -0
  50. package/dist/assets/pdfjs/cmaps/Adobe-CNS1-1.bcmap +0 -0
  51. package/dist/assets/pdfjs/cmaps/Adobe-CNS1-2.bcmap +0 -0
  52. package/dist/assets/pdfjs/cmaps/Adobe-CNS1-3.bcmap +0 -0
  53. package/dist/assets/pdfjs/cmaps/Adobe-CNS1-4.bcmap +0 -0
  54. package/dist/assets/pdfjs/cmaps/Adobe-CNS1-5.bcmap +0 -0
  55. package/dist/assets/pdfjs/cmaps/Adobe-CNS1-6.bcmap +0 -0
  56. package/dist/assets/pdfjs/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  57. package/dist/assets/pdfjs/cmaps/Adobe-GB1-0.bcmap +0 -0
  58. package/dist/assets/pdfjs/cmaps/Adobe-GB1-1.bcmap +0 -0
  59. package/dist/assets/pdfjs/cmaps/Adobe-GB1-2.bcmap +0 -0
  60. package/dist/assets/pdfjs/cmaps/Adobe-GB1-3.bcmap +0 -0
  61. package/dist/assets/pdfjs/cmaps/Adobe-GB1-4.bcmap +0 -0
  62. package/dist/assets/pdfjs/cmaps/Adobe-GB1-5.bcmap +0 -0
  63. package/dist/assets/pdfjs/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  64. package/dist/assets/pdfjs/cmaps/Adobe-Japan1-0.bcmap +0 -0
  65. package/dist/assets/pdfjs/cmaps/Adobe-Japan1-1.bcmap +0 -0
  66. package/dist/assets/pdfjs/cmaps/Adobe-Japan1-2.bcmap +0 -0
  67. package/dist/assets/pdfjs/cmaps/Adobe-Japan1-3.bcmap +0 -0
  68. package/dist/assets/pdfjs/cmaps/Adobe-Japan1-4.bcmap +0 -0
  69. package/dist/assets/pdfjs/cmaps/Adobe-Japan1-5.bcmap +0 -0
  70. package/dist/assets/pdfjs/cmaps/Adobe-Japan1-6.bcmap +0 -0
  71. package/dist/assets/pdfjs/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  72. package/dist/assets/pdfjs/cmaps/Adobe-Korea1-0.bcmap +0 -0
  73. package/dist/assets/pdfjs/cmaps/Adobe-Korea1-1.bcmap +0 -0
  74. package/dist/assets/pdfjs/cmaps/Adobe-Korea1-2.bcmap +0 -0
  75. package/dist/assets/pdfjs/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  76. package/dist/assets/pdfjs/cmaps/B5-H.bcmap +0 -0
  77. package/dist/assets/pdfjs/cmaps/B5-V.bcmap +0 -0
  78. package/dist/assets/pdfjs/cmaps/B5pc-H.bcmap +0 -0
  79. package/dist/assets/pdfjs/cmaps/B5pc-V.bcmap +0 -0
  80. package/dist/assets/pdfjs/cmaps/CNS-EUC-H.bcmap +0 -0
  81. package/dist/assets/pdfjs/cmaps/CNS-EUC-V.bcmap +0 -0
  82. package/dist/assets/pdfjs/cmaps/CNS1-H.bcmap +0 -0
  83. package/dist/assets/pdfjs/cmaps/CNS1-V.bcmap +0 -0
  84. package/dist/assets/pdfjs/cmaps/CNS2-H.bcmap +0 -0
  85. package/dist/assets/pdfjs/cmaps/CNS2-V.bcmap +3 -0
  86. package/dist/assets/pdfjs/cmaps/ETHK-B5-H.bcmap +0 -0
  87. package/dist/assets/pdfjs/cmaps/ETHK-B5-V.bcmap +0 -0
  88. package/dist/assets/pdfjs/cmaps/ETen-B5-H.bcmap +0 -0
  89. package/dist/assets/pdfjs/cmaps/ETen-B5-V.bcmap +0 -0
  90. package/dist/assets/pdfjs/cmaps/ETenms-B5-H.bcmap +3 -0
  91. package/dist/assets/pdfjs/cmaps/ETenms-B5-V.bcmap +0 -0
  92. package/dist/assets/pdfjs/cmaps/EUC-H.bcmap +0 -0
  93. package/dist/assets/pdfjs/cmaps/EUC-V.bcmap +0 -0
  94. package/dist/assets/pdfjs/cmaps/Ext-H.bcmap +0 -0
  95. package/dist/assets/pdfjs/cmaps/Ext-RKSJ-H.bcmap +0 -0
  96. package/dist/assets/pdfjs/cmaps/Ext-RKSJ-V.bcmap +0 -0
  97. package/dist/assets/pdfjs/cmaps/Ext-V.bcmap +0 -0
  98. package/dist/assets/pdfjs/cmaps/GB-EUC-H.bcmap +0 -0
  99. package/dist/assets/pdfjs/cmaps/GB-EUC-V.bcmap +0 -0
  100. package/dist/assets/pdfjs/cmaps/GB-H.bcmap +4 -0
  101. package/dist/assets/pdfjs/cmaps/GB-V.bcmap +0 -0
  102. package/dist/assets/pdfjs/cmaps/GBK-EUC-H.bcmap +0 -0
  103. package/dist/assets/pdfjs/cmaps/GBK-EUC-V.bcmap +0 -0
  104. package/dist/assets/pdfjs/cmaps/GBK2K-H.bcmap +0 -0
  105. package/dist/assets/pdfjs/cmaps/GBK2K-V.bcmap +0 -0
  106. package/dist/assets/pdfjs/cmaps/GBKp-EUC-H.bcmap +0 -0
  107. package/dist/assets/pdfjs/cmaps/GBKp-EUC-V.bcmap +0 -0
  108. package/dist/assets/pdfjs/cmaps/GBT-EUC-H.bcmap +0 -0
  109. package/dist/assets/pdfjs/cmaps/GBT-EUC-V.bcmap +0 -0
  110. package/dist/assets/pdfjs/cmaps/GBT-H.bcmap +0 -0
  111. package/dist/assets/pdfjs/cmaps/GBT-V.bcmap +0 -0
  112. package/dist/assets/pdfjs/cmaps/GBTpc-EUC-H.bcmap +0 -0
  113. package/dist/assets/pdfjs/cmaps/GBTpc-EUC-V.bcmap +0 -0
  114. package/dist/assets/pdfjs/cmaps/GBpc-EUC-H.bcmap +0 -0
  115. package/dist/assets/pdfjs/cmaps/GBpc-EUC-V.bcmap +0 -0
  116. package/dist/assets/pdfjs/cmaps/H.bcmap +0 -0
  117. package/dist/assets/pdfjs/cmaps/HKdla-B5-H.bcmap +0 -0
  118. package/dist/assets/pdfjs/cmaps/HKdla-B5-V.bcmap +0 -0
  119. package/dist/assets/pdfjs/cmaps/HKdlb-B5-H.bcmap +0 -0
  120. package/dist/assets/pdfjs/cmaps/HKdlb-B5-V.bcmap +0 -0
  121. package/dist/assets/pdfjs/cmaps/HKgccs-B5-H.bcmap +0 -0
  122. package/dist/assets/pdfjs/cmaps/HKgccs-B5-V.bcmap +0 -0
  123. package/dist/assets/pdfjs/cmaps/HKm314-B5-H.bcmap +0 -0
  124. package/dist/assets/pdfjs/cmaps/HKm314-B5-V.bcmap +0 -0
  125. package/dist/assets/pdfjs/cmaps/HKm471-B5-H.bcmap +0 -0
  126. package/dist/assets/pdfjs/cmaps/HKm471-B5-V.bcmap +0 -0
  127. package/dist/assets/pdfjs/cmaps/HKscs-B5-H.bcmap +0 -0
  128. package/dist/assets/pdfjs/cmaps/HKscs-B5-V.bcmap +0 -0
  129. package/dist/assets/pdfjs/cmaps/Hankaku.bcmap +0 -0
  130. package/dist/assets/pdfjs/cmaps/Hiragana.bcmap +0 -0
  131. package/dist/assets/pdfjs/cmaps/KSC-EUC-H.bcmap +0 -0
  132. package/dist/assets/pdfjs/cmaps/KSC-EUC-V.bcmap +0 -0
  133. package/dist/assets/pdfjs/cmaps/KSC-H.bcmap +0 -0
  134. package/dist/assets/pdfjs/cmaps/KSC-Johab-H.bcmap +0 -0
  135. package/dist/assets/pdfjs/cmaps/KSC-Johab-V.bcmap +0 -0
  136. package/dist/assets/pdfjs/cmaps/KSC-V.bcmap +0 -0
  137. package/dist/assets/pdfjs/cmaps/KSCms-UHC-H.bcmap +0 -0
  138. package/dist/assets/pdfjs/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  139. package/dist/assets/pdfjs/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  140. package/dist/assets/pdfjs/cmaps/KSCms-UHC-V.bcmap +0 -0
  141. package/dist/assets/pdfjs/cmaps/KSCpc-EUC-H.bcmap +0 -0
  142. package/dist/assets/pdfjs/cmaps/KSCpc-EUC-V.bcmap +0 -0
  143. package/dist/assets/pdfjs/cmaps/Katakana.bcmap +0 -0
  144. package/dist/assets/pdfjs/cmaps/LICENSE +36 -0
  145. package/dist/assets/pdfjs/cmaps/NWP-H.bcmap +0 -0
  146. package/dist/assets/pdfjs/cmaps/NWP-V.bcmap +0 -0
  147. package/dist/assets/pdfjs/cmaps/RKSJ-H.bcmap +0 -0
  148. package/dist/assets/pdfjs/cmaps/RKSJ-V.bcmap +0 -0
  149. package/dist/assets/pdfjs/cmaps/Roman.bcmap +0 -0
  150. package/dist/assets/pdfjs/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  151. package/dist/assets/pdfjs/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  152. package/dist/assets/pdfjs/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  153. package/dist/assets/pdfjs/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  154. package/dist/assets/pdfjs/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  155. package/dist/assets/pdfjs/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  156. package/dist/assets/pdfjs/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  157. package/dist/assets/pdfjs/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  158. package/dist/assets/pdfjs/cmaps/UniGB-UCS2-H.bcmap +0 -0
  159. package/dist/assets/pdfjs/cmaps/UniGB-UCS2-V.bcmap +0 -0
  160. package/dist/assets/pdfjs/cmaps/UniGB-UTF16-H.bcmap +0 -0
  161. package/dist/assets/pdfjs/cmaps/UniGB-UTF16-V.bcmap +0 -0
  162. package/dist/assets/pdfjs/cmaps/UniGB-UTF32-H.bcmap +0 -0
  163. package/dist/assets/pdfjs/cmaps/UniGB-UTF32-V.bcmap +0 -0
  164. package/dist/assets/pdfjs/cmaps/UniGB-UTF8-H.bcmap +0 -0
  165. package/dist/assets/pdfjs/cmaps/UniGB-UTF8-V.bcmap +0 -0
  166. package/dist/assets/pdfjs/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  167. package/dist/assets/pdfjs/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  168. package/dist/assets/pdfjs/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  169. package/dist/assets/pdfjs/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  170. package/dist/assets/pdfjs/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  171. package/dist/assets/pdfjs/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  172. package/dist/assets/pdfjs/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  173. package/dist/assets/pdfjs/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  174. package/dist/assets/pdfjs/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  175. package/dist/assets/pdfjs/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  176. package/dist/assets/pdfjs/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  177. package/dist/assets/pdfjs/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  178. package/dist/assets/pdfjs/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  179. package/dist/assets/pdfjs/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  180. package/dist/assets/pdfjs/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  181. package/dist/assets/pdfjs/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  182. package/dist/assets/pdfjs/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  183. package/dist/assets/pdfjs/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  184. package/dist/assets/pdfjs/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  185. package/dist/assets/pdfjs/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  186. package/dist/assets/pdfjs/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  187. package/dist/assets/pdfjs/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  188. package/dist/assets/pdfjs/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  189. package/dist/assets/pdfjs/cmaps/UniKS-UCS2-H.bcmap +0 -0
  190. package/dist/assets/pdfjs/cmaps/UniKS-UCS2-V.bcmap +0 -0
  191. package/dist/assets/pdfjs/cmaps/UniKS-UTF16-H.bcmap +0 -0
  192. package/dist/assets/pdfjs/cmaps/UniKS-UTF16-V.bcmap +0 -0
  193. package/dist/assets/pdfjs/cmaps/UniKS-UTF32-H.bcmap +0 -0
  194. package/dist/assets/pdfjs/cmaps/UniKS-UTF32-V.bcmap +0 -0
  195. package/dist/assets/pdfjs/cmaps/UniKS-UTF8-H.bcmap +0 -0
  196. package/dist/assets/pdfjs/cmaps/UniKS-UTF8-V.bcmap +0 -0
  197. package/dist/assets/pdfjs/cmaps/V.bcmap +0 -0
  198. package/dist/assets/pdfjs/cmaps/WP-Symbol.bcmap +0 -0
  199. package/dist/assets/pdfjs/iccs/CGATS001Compat-v2-micro.icc +0 -0
  200. package/dist/assets/pdfjs/iccs/LICENSE +116 -0
  201. package/dist/assets/pdfjs/standard_fonts/FoxitDingbats.pfb +0 -0
  202. package/dist/assets/pdfjs/standard_fonts/FoxitFixed.pfb +0 -0
  203. package/dist/assets/pdfjs/standard_fonts/FoxitFixedBold.pfb +0 -0
  204. package/dist/assets/pdfjs/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  205. package/dist/assets/pdfjs/standard_fonts/FoxitFixedItalic.pfb +0 -0
  206. package/dist/assets/pdfjs/standard_fonts/FoxitSerif.pfb +0 -0
  207. package/dist/assets/pdfjs/standard_fonts/FoxitSerifBold.pfb +0 -0
  208. package/dist/assets/pdfjs/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  209. package/dist/assets/pdfjs/standard_fonts/FoxitSerifItalic.pfb +0 -0
  210. package/dist/assets/pdfjs/standard_fonts/FoxitSymbol.pfb +0 -0
  211. package/dist/assets/pdfjs/standard_fonts/LICENSE_FOXIT +27 -0
  212. package/dist/assets/pdfjs/standard_fonts/LICENSE_LIBERATION +102 -0
  213. package/dist/assets/pdfjs/standard_fonts/LiberationSans-Bold.ttf +0 -0
  214. package/dist/assets/pdfjs/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  215. package/dist/assets/pdfjs/standard_fonts/LiberationSans-Italic.ttf +0 -0
  216. package/dist/assets/pdfjs/standard_fonts/LiberationSans-Regular.ttf +0 -0
  217. package/dist/assets/pdfjs/wasm/LICENSE_JBIG2 +196 -0
  218. package/dist/assets/pdfjs/wasm/LICENSE_OPENJPEG +39 -0
  219. package/dist/assets/pdfjs/wasm/LICENSE_PDFJS_JBIG2 +13 -0
  220. package/dist/assets/pdfjs/wasm/LICENSE_PDFJS_OPENJPEG +22 -0
  221. package/dist/assets/pdfjs/wasm/LICENSE_PDFJS_QCMS +22 -0
  222. package/dist/assets/pdfjs/wasm/LICENSE_QCMS +21 -0
  223. package/dist/assets/pdfjs/wasm/jbig2.wasm +0 -0
  224. package/dist/assets/pdfjs/wasm/jbig2_nowasm_fallback.js +15 -0
  225. package/dist/assets/pdfjs/wasm/openjpeg.wasm +0 -0
  226. package/dist/assets/pdfjs/wasm/openjpeg_nowasm_fallback.js +17 -0
  227. package/dist/assets/pdfjs/wasm/qcms_bg.wasm +0 -0
  228. package/dist/assets/pdfjs/wasm/quickjs-eval.js +16 -0
  229. package/dist/assets/pdfjs/wasm/quickjs-eval.wasm +0 -0
  230. package/dist/client.d.ts +20 -0
  231. package/dist/client.js +82 -0
  232. package/dist/contracts.d.ts +379 -0
  233. package/dist/contracts.js +22 -0
  234. package/dist/csv-worker.d.ts +1 -0
  235. package/dist/csv-worker.js +17 -0
  236. package/dist/detect.d.ts +15 -0
  237. package/dist/detect.js +290 -0
  238. package/dist/errors.d.ts +14 -0
  239. package/dist/errors.js +40 -0
  240. package/dist/font-manifest.d.ts +11 -0
  241. package/dist/font-manifest.js +31 -0
  242. package/dist/fonts/OFL-1.1.txt +88 -0
  243. package/dist/fonts/THIRD_PARTY_NOTICES.md +10 -0
  244. package/dist/fonts/manifest.json +83 -0
  245. package/dist/fonts/noto-sans-arabic.woff2 +0 -0
  246. package/dist/fonts/noto-sans-bengali.woff2 +0 -0
  247. package/dist/fonts/noto-sans-cjk.woff2 +0 -0
  248. package/dist/fonts/noto-sans-devanagari.woff2 +0 -0
  249. package/dist/fonts/noto-sans-gujarati.woff2 +0 -0
  250. package/dist/fonts/noto-sans-gurmukhi.woff2 +0 -0
  251. package/dist/fonts/noto-sans-japanese.woff2 +0 -0
  252. package/dist/fonts/noto-sans-kannada.woff2 +0 -0
  253. package/dist/fonts/noto-sans-korean.woff2 +0 -0
  254. package/dist/fonts/noto-sans-latin-cyrillic.woff2 +0 -0
  255. package/dist/fonts/noto-sans-malayalam.woff2 +0 -0
  256. package/dist/fonts/noto-sans-odia.woff2 +0 -0
  257. package/dist/fonts/noto-sans-tamil.woff2 +0 -0
  258. package/dist/fonts/noto-sans-telugu.woff2 +0 -0
  259. package/dist/fonts.d.ts +20 -0
  260. package/dist/fonts.js +238 -0
  261. package/dist/format.d.ts +1 -0
  262. package/dist/format.js +1 -0
  263. package/dist/headless.d.ts +18 -0
  264. package/dist/headless.js +18 -0
  265. package/dist/i18n.d.ts +4 -0
  266. package/dist/i18n.js +55 -0
  267. package/dist/image-worker.d.ts +1 -0
  268. package/dist/image-worker.js +41 -0
  269. package/dist/index.d.ts +27 -0
  270. package/dist/index.js +29 -0
  271. package/dist/interaction.d.ts +24 -0
  272. package/dist/interaction.js +183 -0
  273. package/dist/legacy-converter-worker.d.ts +1 -0
  274. package/dist/legacy-converter-worker.js +19 -0
  275. package/dist/limits.d.ts +4 -0
  276. package/dist/limits.js +162 -0
  277. package/dist/registry.d.ts +8 -0
  278. package/dist/registry.js +35 -0
  279. package/dist/render-scheduler.d.ts +8 -0
  280. package/dist/render-scheduler.js +63 -0
  281. package/dist/source.d.ts +14 -0
  282. package/dist/source.js +116 -0
  283. package/dist/spreadsheet-viewport.d.ts +34 -0
  284. package/dist/spreadsheet-viewport.js +1035 -0
  285. package/dist/styles.css +137 -0
  286. package/dist/ui-styles.d.ts +1 -0
  287. package/dist/ui-styles.js +139 -0
  288. package/dist/ui.d.ts +8 -0
  289. package/dist/ui.js +390 -0
  290. package/dist/viewer.d.ts +52 -0
  291. package/dist/viewer.js +901 -0
  292. package/dist/viewport.d.ts +54 -0
  293. package/dist/viewport.js +907 -0
  294. package/dist/worker-adapter.d.ts +24 -0
  295. package/dist/worker-adapter.js +97 -0
  296. package/dist/worker-client.d.ts +23 -0
  297. package/dist/worker-client.js +105 -0
  298. package/dist/worker-endpoint.d.ts +13 -0
  299. package/dist/worker-endpoint.js +57 -0
  300. package/dist/worker-protocol.d.ts +48 -0
  301. package/dist/worker-protocol.js +14 -0
  302. package/dist/worker.d.ts +4 -0
  303. package/dist/worker.js +4 -0
  304. package/dist/workers/csv-worker.js +160 -0
  305. package/dist/workers/image-worker.js +41 -0
  306. package/dist/workers/legacy-converter-worker.js +19 -0
  307. package/dist/workers/pdf.worker.min.mjs +28 -0
  308. package/package.json +74 -0
@@ -0,0 +1,26 @@
1
+ import type { AdapterOpenContext, DocumentAdapter, DocumentInfo, RenderViewport, SpreadsheetSheetInfo, TextRun, ViewerWarning } from "../contracts.js";
2
+ import type { ParsedDelimitedText } from "./csv-parser.js";
3
+ interface CsvHandle {
4
+ readonly format: "csv" | "tsv";
5
+ readonly parsed: ParsedDelimitedText;
6
+ readonly info: SpreadsheetSheetInfo;
7
+ readonly warnings: readonly ViewerWarning[];
8
+ }
9
+ export interface CsvAdapterOptions {
10
+ readonly workerUrl?: string | URL;
11
+ readonly parse?: (data: Uint8Array, format: "csv" | "tsv", maxCells: number, signal: AbortSignal) => Promise<ParsedDelimitedText>;
12
+ readonly maxCells?: number;
13
+ }
14
+ export declare class CsvDocumentAdapter implements DocumentAdapter<CsvHandle> {
15
+ #private;
16
+ readonly id = "delimited-data";
17
+ readonly formats: readonly ["csv", "tsv"];
18
+ constructor(options?: CsvAdapterOptions);
19
+ open(data: Uint8Array, context: AdapterOpenContext): Promise<CsvHandle>;
20
+ getInfo(handle: CsvHandle): Promise<DocumentInfo>;
21
+ render(handle: CsvHandle, target: HTMLCanvasElement | OffscreenCanvas, viewport: RenderViewport, signal?: AbortSignal): Promise<void>;
22
+ getTextMap(handle: CsvHandle, pageIndex: number, signal?: AbortSignal): Promise<readonly TextRun[]>;
23
+ close(): void;
24
+ }
25
+ export declare function createCsvAdapter(options?: CsvAdapterOptions): CsvDocumentAdapter;
26
+ export {};
@@ -0,0 +1,231 @@
1
+ import { abortError, ViewerError } from "../errors.js";
2
+ const ROW_HEIGHT = 24;
3
+ const COLUMN_WIDTH = 120;
4
+ const ROW_HEADER_WIDTH = 48;
5
+ const COLUMN_HEADER_HEIGHT = 28;
6
+ export class CsvDocumentAdapter {
7
+ id = "delimited-data";
8
+ formats = ["csv", "tsv"];
9
+ #options;
10
+ constructor(options = {}) {
11
+ this.#options = options;
12
+ }
13
+ async open(data, context) {
14
+ const format = context.format === "tsv" ? "tsv" : "csv";
15
+ context.reportProgress({ phase: "parsing", loaded: 0, total: 1 });
16
+ const maxCells = this.#options.maxCells ?? context.limits.maxCsvCells;
17
+ const parsed = this.#options.parse
18
+ ? await this.#options.parse(data, format, maxCells, context.signal)
19
+ : await parseInWorker(data, format, maxCells, this.#options.workerUrl
20
+ ? new URL(this.#options.workerUrl, context.assetBaseUrl)
21
+ : context.assetBaseUrl
22
+ ? new URL("workers/csv-worker.js", context.assetBaseUrl)
23
+ : new URL("../csv-worker.js", import.meta.url), context.signal);
24
+ if (context.signal.aborted)
25
+ throw abortError();
26
+ const maxColumn = parsed.rows.reduce((maximum, row) => Math.max(maximum, row.length), 0);
27
+ const name = context.fileName?.replace(/\.[^.]+$/, "") || "Data";
28
+ const warnings = parsed.encoding === "windows-1252"
29
+ ? [
30
+ {
31
+ code: "fidelity-degraded",
32
+ message: "Input was not valid UTF-8 and was decoded as Windows-1252",
33
+ details: { encoding: parsed.encoding },
34
+ },
35
+ ]
36
+ : [];
37
+ context.reportProgress({ phase: "parsing", loaded: 1, total: 1, ratio: 1 });
38
+ return {
39
+ format,
40
+ parsed,
41
+ warnings,
42
+ info: {
43
+ name,
44
+ frozenRows: 0,
45
+ frozenColumns: 0,
46
+ mergedRanges: [],
47
+ maxRow: parsed.rows.length,
48
+ maxColumn,
49
+ defaultColumnWidth: COLUMN_WIDTH,
50
+ defaultRowHeight: ROW_HEIGHT,
51
+ columnWidths: {},
52
+ rowHeights: {},
53
+ rowHeaderWidth: ROW_HEADER_WIDTH,
54
+ columnHeaderHeight: COLUMN_HEADER_HEIGHT,
55
+ },
56
+ };
57
+ }
58
+ async getInfo(handle) {
59
+ return {
60
+ format: handle.format,
61
+ unit: "sheet",
62
+ pageCount: 1,
63
+ sheetNames: [handle.info.name],
64
+ sheets: [handle.info],
65
+ warnings: handle.warnings,
66
+ };
67
+ }
68
+ async render(handle, target, viewport, signal) {
69
+ if (signal?.aborted)
70
+ throw abortError();
71
+ if (viewport.pageIndex !== 0)
72
+ throw new ViewerError("render-failed", "CSV sheet index is out of range");
73
+ const range = viewport.sheetRange ?? {
74
+ row: 1,
75
+ column: 1,
76
+ rowCount: 50,
77
+ columnCount: 20,
78
+ };
79
+ const zoom = Math.max(0.1, viewport.zoom);
80
+ const width = viewport.width ??
81
+ ROW_HEADER_WIDTH + range.columnCount * COLUMN_WIDTH * zoom;
82
+ const height = viewport.height ??
83
+ COLUMN_HEADER_HEIGHT + range.rowCount * ROW_HEIGHT * zoom;
84
+ const dpr = Math.max(1, viewport.devicePixelRatio);
85
+ target.width = Math.max(1, Math.ceil(width * dpr));
86
+ target.height = Math.max(1, Math.ceil(height * dpr));
87
+ if ("style" in target) {
88
+ target.style.width = `${width}px`;
89
+ target.style.height = `${height}px`;
90
+ }
91
+ const context = target.getContext("2d");
92
+ if (!context)
93
+ throw new ViewerError("render-failed", "Canvas 2D context is unavailable");
94
+ context.setTransform(dpr, 0, 0, dpr, 0, 0);
95
+ drawGrid(context, handle.parsed.rows, range, zoom, width, height, viewport.scrollOffsetX ?? 0, viewport.scrollOffsetY ?? 0, viewport.columnWidths);
96
+ if (signal?.aborted)
97
+ throw abortError();
98
+ }
99
+ async getTextMap(handle, pageIndex, signal) {
100
+ if (pageIndex !== 0)
101
+ throw new ViewerError("render-failed", "CSV sheet index is out of range");
102
+ const runs = [];
103
+ for (let rowIndex = 0; rowIndex < handle.parsed.rows.length; rowIndex += 1) {
104
+ if (signal?.aborted)
105
+ throw abortError();
106
+ const row = handle.parsed.rows[rowIndex];
107
+ for (let columnIndex = 0; columnIndex < row.length; columnIndex += 1) {
108
+ const text = row[columnIndex];
109
+ if (!text)
110
+ continue;
111
+ runs.push({
112
+ text,
113
+ x: ROW_HEADER_WIDTH + columnIndex * COLUMN_WIDTH + 6,
114
+ y: COLUMN_HEADER_HEIGHT + rowIndex * ROW_HEIGHT + 4,
115
+ width: COLUMN_WIDTH - 12,
116
+ height: ROW_HEIGHT - 8,
117
+ row: rowIndex + 1,
118
+ column: columnIndex + 1,
119
+ direction: /[\u0590-\u08ff\ufb1d-\ufefc]/u.test(text) ? "rtl" : "ltr",
120
+ });
121
+ }
122
+ }
123
+ return runs;
124
+ }
125
+ close() { }
126
+ }
127
+ export function createCsvAdapter(options = {}) {
128
+ return new CsvDocumentAdapter(options);
129
+ }
130
+ function drawGrid(context, rows, range, zoom, width, height, scrollOffsetX, scrollOffsetY, columnWidths) {
131
+ const rowHeight = ROW_HEIGHT * zoom;
132
+ context.fillStyle = "#ffffff";
133
+ context.fillRect(0, 0, width, height);
134
+ context.fillStyle = "#f2f4f7";
135
+ context.fillRect(0, 0, width, COLUMN_HEADER_HEIGHT);
136
+ context.fillRect(0, 0, ROW_HEADER_WIDTH, height);
137
+ context.strokeStyle = "#d0d5dd";
138
+ context.lineWidth = 1;
139
+ context.font = `${Math.max(10, 12 * zoom)}px system-ui, sans-serif`;
140
+ context.textBaseline = "middle";
141
+ let columnX = ROW_HEADER_WIDTH - scrollOffsetX * zoom;
142
+ for (let visibleColumn = 0; visibleColumn < range.columnCount; visibleColumn += 1) {
143
+ const column = range.column + visibleColumn;
144
+ const columnWidth = (columnWidths?.[column] ?? COLUMN_WIDTH) * zoom;
145
+ const x = columnX;
146
+ context.beginPath();
147
+ context.moveTo(x, 0);
148
+ context.lineTo(x, height);
149
+ context.stroke();
150
+ context.fillStyle = "#475467";
151
+ context.fillText(columnLabel(column), x + 6, COLUMN_HEADER_HEIGHT / 2);
152
+ columnX += columnWidth;
153
+ }
154
+ for (let visibleRow = 0; visibleRow < range.rowCount; visibleRow += 1) {
155
+ const rowNumber = range.row + visibleRow;
156
+ const y = COLUMN_HEADER_HEIGHT + visibleRow * rowHeight - scrollOffsetY * zoom;
157
+ context.beginPath();
158
+ context.moveTo(0, y);
159
+ context.lineTo(width, y);
160
+ context.stroke();
161
+ context.fillStyle = "#475467";
162
+ context.fillText(String(rowNumber), 6, y + rowHeight / 2);
163
+ const row = rows[rowNumber - 1];
164
+ if (!row)
165
+ continue;
166
+ let cellX = ROW_HEADER_WIDTH - scrollOffsetX * zoom;
167
+ for (let visibleColumn = 0; visibleColumn < range.columnCount; visibleColumn += 1) {
168
+ const column = range.column + visibleColumn;
169
+ const columnWidth = (columnWidths?.[column] ?? COLUMN_WIDTH) * zoom;
170
+ const value = row[column - 1];
171
+ const x = cellX;
172
+ cellX += columnWidth;
173
+ if (!value)
174
+ continue;
175
+ context.save();
176
+ context.beginPath();
177
+ context.rect(x + 3, y + 1, columnWidth - 6, rowHeight - 2);
178
+ context.clip();
179
+ context.fillStyle = "#101828";
180
+ context.direction = /[\u0590-\u08ff\ufb1d-\ufefc]/u.test(value)
181
+ ? "rtl"
182
+ : "ltr";
183
+ context.fillText(value, x + 6, y + rowHeight / 2);
184
+ context.restore();
185
+ }
186
+ }
187
+ }
188
+ function columnLabel(column) {
189
+ let current = Math.max(1, column);
190
+ let result = "";
191
+ while (current > 0) {
192
+ current -= 1;
193
+ result = String.fromCharCode(65 + (current % 26)) + result;
194
+ current = Math.floor(current / 26);
195
+ }
196
+ return result;
197
+ }
198
+ function parseInWorker(data, format, maxCells, workerUrl, signal) {
199
+ return new Promise((resolve, reject) => {
200
+ const worker = new Worker(workerUrl, {
201
+ type: "module",
202
+ name: "csv-parser",
203
+ });
204
+ const finish = () => {
205
+ signal.removeEventListener("abort", onAbort);
206
+ worker.terminate();
207
+ };
208
+ const onAbort = () => {
209
+ finish();
210
+ reject(abortError());
211
+ };
212
+ signal.addEventListener("abort", onAbort, { once: true });
213
+ worker.onerror = (event) => {
214
+ finish();
215
+ reject(new ViewerError("worker-crashed", "CSV parser worker crashed", {
216
+ details: { message: event.message },
217
+ }));
218
+ };
219
+ worker.onmessage = (event) => {
220
+ finish();
221
+ if (event.data.ok)
222
+ resolve(event.data.result);
223
+ else
224
+ reject(new ViewerError(event.data.code === "resource-limit"
225
+ ? "resource-limit"
226
+ : "invalid-file", event.data.message));
227
+ };
228
+ const copy = data.slice().buffer;
229
+ worker.postMessage({ data: copy, format, maxCells }, [copy]);
230
+ });
231
+ }
@@ -0,0 +1,41 @@
1
+ import type { AdapterOpenContext, DocumentAdapter, DocumentInfo, RenderViewport, ViewerWarning } from "../contracts.js";
2
+ type NativeImageFormat = "png" | "jpeg" | "gif" | "webp" | "bmp";
3
+ interface NativeHandle {
4
+ readonly kind: "native";
5
+ readonly format: NativeImageFormat;
6
+ readonly data: Uint8Array;
7
+ readonly warnings: readonly ViewerWarning[];
8
+ }
9
+ interface TiffHandle {
10
+ readonly kind: "tiff";
11
+ readonly format: "tiff";
12
+ readonly backend: TiffBackend;
13
+ readonly warnings: readonly ViewerWarning[];
14
+ }
15
+ type ImageHandle = NativeHandle | TiffHandle;
16
+ export interface TiffBackend {
17
+ readonly pages: readonly {
18
+ readonly width: number;
19
+ readonly height: number;
20
+ }[];
21
+ renderPagePng(pageIndex: number, signal?: AbortSignal): Promise<Uint8Array>;
22
+ close(): void;
23
+ }
24
+ export interface ImageAdapterOptions {
25
+ readonly workerUrl?: string | URL;
26
+ readonly moduleUrl?: string | URL;
27
+ readonly openTiff?: (data: Uint8Array, context: AdapterOpenContext) => Promise<TiffBackend>;
28
+ }
29
+ export declare class ImageDocumentAdapter implements DocumentAdapter<ImageHandle> {
30
+ #private;
31
+ readonly id = "image";
32
+ readonly formats: readonly ["png", "jpeg", "gif", "webp", "bmp", "tiff"];
33
+ constructor(options?: ImageAdapterOptions);
34
+ open(data: Uint8Array, context: AdapterOpenContext): Promise<ImageHandle>;
35
+ getInfo(handle: ImageHandle): Promise<DocumentInfo>;
36
+ render(handle: ImageHandle, target: HTMLCanvasElement | OffscreenCanvas, viewport: RenderViewport, signal?: AbortSignal): Promise<void>;
37
+ getTextMap(): Promise<readonly []>;
38
+ close(handle: ImageHandle): void;
39
+ }
40
+ export declare function createImageAdapter(options?: ImageAdapterOptions): ImageDocumentAdapter;
41
+ export {};
@@ -0,0 +1,198 @@
1
+ import { abortError, ViewerError } from "../errors.js";
2
+ import { drawEncodedImage } from "./bitmap.js";
3
+ export class ImageDocumentAdapter {
4
+ id = "image";
5
+ formats = ["png", "jpeg", "gif", "webp", "bmp", "tiff"];
6
+ #options;
7
+ constructor(options = {}) {
8
+ this.#options = options;
9
+ }
10
+ async open(data, context) {
11
+ if (context.format === "tiff") {
12
+ context.reportProgress({ phase: "parsing", loaded: 0, total: 1 });
13
+ const backend = this.#options.openTiff
14
+ ? await this.#options.openTiff(data, context)
15
+ : await WorkerTiffBackend.open(data, this.#options.workerUrl
16
+ ? new URL(this.#options.workerUrl, context.assetBaseUrl)
17
+ : context.assetBaseUrl
18
+ ? new URL("workers/image-worker.js", context.assetBaseUrl)
19
+ : new URL("../image-worker.js", import.meta.url), this.#options.moduleUrl
20
+ ? new URL(this.#options.moduleUrl, context.assetBaseUrl)
21
+ : context.assetBaseUrl
22
+ ? new URL("assets/image/index.js", context.assetBaseUrl)
23
+ : new URL("../assets/image/index.js", import.meta.url), context.limits.maxDecodedPixels, context.signal, context.limits.maxOperationMs);
24
+ if (backend.pages.length === 0) {
25
+ backend.close();
26
+ throw new ViewerError("invalid-file", "TIFF contains no pages");
27
+ }
28
+ context.reportProgress({
29
+ phase: "parsing",
30
+ loaded: 1,
31
+ total: 1,
32
+ ratio: 1,
33
+ });
34
+ return { kind: "tiff", format: "tiff", backend, warnings: [] };
35
+ }
36
+ const format = context.format;
37
+ const animated = isAnimated(data, format);
38
+ return {
39
+ kind: "native",
40
+ format,
41
+ data,
42
+ warnings: animated
43
+ ? [
44
+ {
45
+ code: "unsupported-feature",
46
+ message: "Animated image frames are preserved in the source; headless canvas rendering captures one browser-decoded frame",
47
+ details: { feature: "animation", format },
48
+ },
49
+ ]
50
+ : [],
51
+ };
52
+ }
53
+ async getInfo(handle) {
54
+ return {
55
+ format: handle.format,
56
+ unit: "image",
57
+ pageCount: handle.kind === "tiff" ? handle.backend.pages.length : 1,
58
+ warnings: handle.warnings,
59
+ };
60
+ }
61
+ async render(handle, target, viewport, signal) {
62
+ if (signal?.aborted)
63
+ throw abortError();
64
+ const pageCount = handle.kind === "tiff" ? handle.backend.pages.length : 1;
65
+ if (!Number.isInteger(viewport.pageIndex) ||
66
+ viewport.pageIndex < 0 ||
67
+ viewport.pageIndex >= pageCount)
68
+ throw new ViewerError("render-failed", "Image page index is out of range");
69
+ const data = handle.kind === "tiff"
70
+ ? await handle.backend.renderPagePng(viewport.pageIndex, signal)
71
+ : handle.data;
72
+ await drawEncodedImage(data, handle.kind === "tiff" ? "image/png" : mimeType(handle.format), target, {
73
+ dpr: viewport.devicePixelRatio,
74
+ scale: viewport.zoom,
75
+ ...(viewport.width === undefined ? {} : { cssWidth: viewport.width }),
76
+ ...(viewport.height === undefined
77
+ ? {}
78
+ : { cssHeight: viewport.height }),
79
+ });
80
+ if (signal?.aborted)
81
+ throw abortError();
82
+ }
83
+ async getTextMap() {
84
+ return [];
85
+ }
86
+ close(handle) {
87
+ if (handle.kind === "tiff")
88
+ handle.backend.close();
89
+ }
90
+ }
91
+ export function createImageAdapter(options = {}) {
92
+ return new ImageDocumentAdapter(options);
93
+ }
94
+ class WorkerTiffBackend {
95
+ pages;
96
+ #worker;
97
+ #id = 0;
98
+ #closed = false;
99
+ #timeoutMs;
100
+ constructor(worker, pages, timeoutMs) {
101
+ this.#worker = worker;
102
+ this.pages = pages;
103
+ this.#timeoutMs = timeoutMs;
104
+ }
105
+ static async open(data, workerUrl, moduleUrl, maxPixels, signal, timeoutMs) {
106
+ const worker = new Worker(workerUrl, {
107
+ type: "module",
108
+ name: "tiff-decoder",
109
+ });
110
+ const copy = data.slice().buffer;
111
+ const response = await requestWorker(worker, {
112
+ id: 0,
113
+ type: "open",
114
+ data: copy,
115
+ moduleUrl: moduleUrl.href,
116
+ maxPixels,
117
+ }, [copy], signal, timeoutMs);
118
+ if (!response.ok || !response.pages) {
119
+ worker.terminate();
120
+ const message = response.ok
121
+ ? "TIFF worker returned no pages"
122
+ : response.message;
123
+ throw new ViewerError(/pixel|limit/i.test(message) ? "resource-limit" : "invalid-file", message);
124
+ }
125
+ return new WorkerTiffBackend(worker, response.pages, timeoutMs);
126
+ }
127
+ async renderPagePng(pageIndex, signal) {
128
+ if (this.#closed)
129
+ throw new ViewerError("lifecycle-error", "TIFF backend is closed");
130
+ const response = await requestWorker(this.#worker, { id: ++this.#id, type: "render", pageIndex }, [], signal, this.#timeoutMs);
131
+ if (!response.ok || !response.data)
132
+ throw new ViewerError("render-failed", response.ok ? "TIFF worker returned no bitmap" : response.message);
133
+ return new Uint8Array(response.data);
134
+ }
135
+ close() {
136
+ if (this.#closed)
137
+ return;
138
+ this.#closed = true;
139
+ this.#worker.postMessage({ id: ++this.#id, type: "close" });
140
+ this.#worker.terminate();
141
+ }
142
+ }
143
+ function requestWorker(worker, payload, transfer, signal, timeoutMs = 30_000) {
144
+ return new Promise((resolve, reject) => {
145
+ if (signal?.aborted) {
146
+ reject(abortError());
147
+ return;
148
+ }
149
+ const expectedId = payload.id;
150
+ const finish = () => {
151
+ clearTimeout(timeout);
152
+ signal?.removeEventListener("abort", onAbort);
153
+ worker.removeEventListener("message", onMessage);
154
+ worker.removeEventListener("error", onError);
155
+ };
156
+ const timeout = setTimeout(() => {
157
+ finish();
158
+ worker.terminate();
159
+ reject(new ViewerError("resource-limit", "TIFF worker operation exceeded maxOperationMs", { details: { timeoutMs } }));
160
+ }, timeoutMs);
161
+ const onAbort = () => {
162
+ finish();
163
+ reject(abortError());
164
+ };
165
+ const onMessage = (event) => {
166
+ if (event.data.id !== expectedId)
167
+ return;
168
+ finish();
169
+ resolve(event.data);
170
+ };
171
+ const onError = (event) => {
172
+ finish();
173
+ reject(new ViewerError("worker-crashed", "TIFF worker crashed", {
174
+ details: { message: event.message },
175
+ }));
176
+ };
177
+ signal?.addEventListener("abort", onAbort, { once: true });
178
+ worker.addEventListener("message", onMessage);
179
+ worker.addEventListener("error", onError);
180
+ worker.postMessage(payload, transfer);
181
+ });
182
+ }
183
+ function mimeType(format) {
184
+ return format === "jpeg" ? "image/jpeg" : `image/${format}`;
185
+ }
186
+ function isAnimated(data, format) {
187
+ if (format === "gif") {
188
+ let frames = 0;
189
+ for (const byte of data)
190
+ if (byte === 0x2c && ++frames > 1)
191
+ return true;
192
+ }
193
+ if (format === "webp")
194
+ return new TextDecoder("latin1")
195
+ .decode(data.subarray(0, 64))
196
+ .includes("ANIM");
197
+ return false;
198
+ }