@cj-tech-master/excelts 1.6.3 → 2.0.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 (400) hide show
  1. package/README.md +139 -24
  2. package/README_zh.md +140 -26
  3. package/dist/browser/excelts.esm.js +18468 -0
  4. package/dist/browser/excelts.esm.js.map +1 -0
  5. package/dist/browser/excelts.esm.min.js +125 -0
  6. package/dist/browser/excelts.iife.js +13107 -47146
  7. package/dist/browser/excelts.iife.js.map +1 -1
  8. package/dist/browser/excelts.iife.min.js +24 -106
  9. package/dist/cjs/csv/csv-core.js +701 -0
  10. package/dist/cjs/csv/csv-stream.js +646 -0
  11. package/dist/cjs/csv/csv.base.js +137 -0
  12. package/dist/cjs/csv/csv.browser.js +68 -0
  13. package/dist/cjs/csv/csv.js +218 -162
  14. package/dist/cjs/doc/anchor.js +2 -2
  15. package/dist/cjs/doc/cell.js +22 -22
  16. package/dist/cjs/doc/column.js +28 -7
  17. package/dist/cjs/doc/data-validations.js +3 -3
  18. package/dist/cjs/doc/defined-names.js +13 -13
  19. package/dist/cjs/doc/image.js +7 -7
  20. package/dist/cjs/doc/modelcontainer.js +2 -2
  21. package/dist/cjs/doc/note.js +2 -2
  22. package/dist/cjs/doc/pivot-table.js +5 -5
  23. package/dist/cjs/doc/range.js +11 -11
  24. package/dist/cjs/doc/row.js +16 -16
  25. package/dist/cjs/doc/table.js +5 -5
  26. package/dist/cjs/doc/workbook.base.js +211 -0
  27. package/dist/cjs/doc/workbook.browser.js +62 -0
  28. package/dist/cjs/doc/workbook.js +68 -179
  29. package/dist/cjs/doc/worksheet.js +45 -41
  30. package/dist/cjs/index.js +49 -32
  31. package/dist/cjs/stream/xlsx/hyperlink-reader.js +6 -6
  32. package/dist/cjs/stream/xlsx/sheet-comments-writer.js +12 -12
  33. package/dist/cjs/stream/xlsx/sheet-rels-writer.js +4 -4
  34. package/dist/cjs/stream/xlsx/workbook-reader.js +22 -22
  35. package/dist/cjs/stream/xlsx/workbook-writer.js +38 -38
  36. package/dist/cjs/stream/xlsx/worksheet-reader.js +17 -17
  37. package/dist/cjs/stream/xlsx/worksheet-writer.js +67 -60
  38. package/dist/cjs/utils/browser-buffer.js +75 -0
  39. package/dist/cjs/utils/cell-format.js +2 -2
  40. package/dist/cjs/utils/cell-matrix.js +5 -5
  41. package/dist/cjs/utils/datetime.js +648 -0
  42. package/dist/cjs/utils/encryptor.browser.js +240 -0
  43. package/dist/cjs/utils/parse-sax.js +1191 -13
  44. package/dist/cjs/utils/shared-formula.js +5 -5
  45. package/dist/cjs/utils/sheet-utils.js +13 -13
  46. package/dist/cjs/utils/stream-buf.browser.js +355 -0
  47. package/dist/cjs/utils/stream-buf.js +5 -5
  48. package/dist/cjs/utils/unzip/extract.js +11 -11
  49. package/dist/cjs/utils/unzip/index.js +21 -21
  50. package/dist/cjs/utils/unzip/parse-extra-field.js +3 -3
  51. package/dist/cjs/utils/unzip/parse.js +16 -16
  52. package/dist/cjs/utils/unzip/zip-parser.js +14 -3
  53. package/dist/cjs/utils/utils.base.js +161 -0
  54. package/dist/cjs/utils/utils.browser.js +89 -0
  55. package/dist/cjs/utils/utils.js +46 -154
  56. package/dist/cjs/utils/xml-stream.js +3 -3
  57. package/dist/cjs/utils/zip/compress.base.js +88 -0
  58. package/dist/cjs/utils/zip/compress.browser.js +127 -0
  59. package/dist/cjs/utils/zip/compress.js +18 -198
  60. package/dist/cjs/utils/zip/crc32.browser.js +88 -0
  61. package/dist/cjs/utils/zip/deflate-fallback.js +575 -0
  62. package/dist/cjs/utils/zip/index.js +17 -17
  63. package/dist/cjs/utils/zip/streaming-zip.js +264 -0
  64. package/dist/cjs/utils/zip/zip-builder.js +10 -10
  65. package/dist/cjs/utils/zip-stream.browser.js +135 -0
  66. package/dist/cjs/utils/zip-stream.js +4 -4
  67. package/dist/cjs/xlsx/xform/base-xform.js +4 -4
  68. package/dist/cjs/xlsx/xform/book/defined-name-xform.js +4 -4
  69. package/dist/cjs/xlsx/xform/book/sheet-xform.js +4 -4
  70. package/dist/cjs/xlsx/xform/book/workbook-calc-properties-xform.js +2 -2
  71. package/dist/cjs/xlsx/xform/book/workbook-pivot-cache-xform.js +2 -2
  72. package/dist/cjs/xlsx/xform/book/workbook-properties-xform.js +2 -2
  73. package/dist/cjs/xlsx/xform/book/workbook-view-xform.js +2 -2
  74. package/dist/cjs/xlsx/xform/book/workbook-xform.js +24 -24
  75. package/dist/cjs/xlsx/xform/comment/comment-xform.js +4 -4
  76. package/dist/cjs/xlsx/xform/comment/comments-xform.js +6 -6
  77. package/dist/cjs/xlsx/xform/comment/style/vml-position-xform.js +2 -2
  78. package/dist/cjs/xlsx/xform/comment/style/vml-protection-xform.js +2 -2
  79. package/dist/cjs/xlsx/xform/comment/vml-anchor-xform.js +2 -2
  80. package/dist/cjs/xlsx/xform/comment/vml-client-data-xform.js +10 -10
  81. package/dist/cjs/xlsx/xform/comment/vml-notes-xform.js +6 -6
  82. package/dist/cjs/xlsx/xform/comment/vml-shape-xform.js +6 -6
  83. package/dist/cjs/xlsx/xform/comment/vml-textbox-xform.js +2 -2
  84. package/dist/cjs/xlsx/xform/composite-xform.js +2 -2
  85. package/dist/cjs/xlsx/xform/core/app-heading-pairs-xform.js +2 -2
  86. package/dist/cjs/xlsx/xform/core/app-titles-of-parts-xform.js +2 -2
  87. package/dist/cjs/xlsx/xform/core/app-xform.js +11 -11
  88. package/dist/cjs/xlsx/xform/core/content-types-xform.js +4 -4
  89. package/dist/cjs/xlsx/xform/core/core-xform.js +23 -23
  90. package/dist/cjs/xlsx/xform/core/relationship-xform.js +2 -2
  91. package/dist/cjs/xlsx/xform/core/relationships-xform.js +6 -6
  92. package/dist/cjs/xlsx/xform/drawing/base-cell-anchor-xform.js +2 -2
  93. package/dist/cjs/xlsx/xform/drawing/blip-fill-xform.js +4 -4
  94. package/dist/cjs/xlsx/xform/drawing/blip-xform.js +2 -2
  95. package/dist/cjs/xlsx/xform/drawing/c-nv-pic-pr-xform.js +2 -2
  96. package/dist/cjs/xlsx/xform/drawing/c-nv-pr-xform.js +6 -6
  97. package/dist/cjs/xlsx/xform/drawing/cell-position-xform.js +7 -7
  98. package/dist/cjs/xlsx/xform/drawing/drawing-xform.js +10 -10
  99. package/dist/cjs/xlsx/xform/drawing/ext-lst-xform.js +2 -2
  100. package/dist/cjs/xlsx/xform/drawing/ext-xform.js +2 -2
  101. package/dist/cjs/xlsx/xform/drawing/hlink-click-xform.js +2 -2
  102. package/dist/cjs/xlsx/xform/drawing/nv-pic-pr-xform.js +6 -6
  103. package/dist/cjs/xlsx/xform/drawing/one-cell-anchor-xform.js +10 -10
  104. package/dist/cjs/xlsx/xform/drawing/pic-xform.js +9 -9
  105. package/dist/cjs/xlsx/xform/drawing/two-cell-anchor-xform.js +9 -9
  106. package/dist/cjs/xlsx/xform/list-xform.js +2 -2
  107. package/dist/cjs/xlsx/xform/pivot-table/cache-field-xform.js +5 -5
  108. package/dist/cjs/xlsx/xform/pivot-table/cache-field.js +3 -3
  109. package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-definition-xform.js +10 -10
  110. package/dist/cjs/xlsx/xform/pivot-table/pivot-cache-records-xform.js +9 -9
  111. package/dist/cjs/xlsx/xform/pivot-table/pivot-table-xform.js +10 -11
  112. package/dist/cjs/xlsx/xform/sheet/auto-filter-xform.js +4 -4
  113. package/dist/cjs/xlsx/xform/sheet/cell-xform.js +65 -65
  114. package/dist/cjs/xlsx/xform/sheet/cf/cf-rule-xform.js +27 -27
  115. package/dist/cjs/xlsx/xform/sheet/cf/cfvo-xform.js +3 -3
  116. package/dist/cjs/xlsx/xform/sheet/cf/color-scale-xform.js +6 -6
  117. package/dist/cjs/xlsx/xform/sheet/cf/conditional-formatting-xform.js +6 -6
  118. package/dist/cjs/xlsx/xform/sheet/cf/conditional-formattings-xform.js +4 -4
  119. package/dist/cjs/xlsx/xform/sheet/cf/databar-xform.js +6 -6
  120. package/dist/cjs/xlsx/xform/sheet/cf/ext-lst-ref-xform.js +5 -5
  121. package/dist/cjs/xlsx/xform/sheet/cf/formula-xform.js +2 -2
  122. package/dist/cjs/xlsx/xform/sheet/cf/icon-set-xform.js +11 -11
  123. package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.js +3 -3
  124. package/dist/cjs/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +11 -12
  125. package/dist/cjs/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.js +4 -4
  126. package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.js +8 -8
  127. package/dist/cjs/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.js +6 -6
  128. package/dist/cjs/xlsx/xform/sheet/cf-ext/databar-ext-xform.js +26 -26
  129. package/dist/cjs/xlsx/xform/sheet/cf-ext/f-ext-xform.js +2 -2
  130. package/dist/cjs/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.js +14 -14
  131. package/dist/cjs/xlsx/xform/sheet/cf-ext/sqref-ext-xform.js +2 -2
  132. package/dist/cjs/xlsx/xform/sheet/col-breaks-xform.js +38 -0
  133. package/dist/cjs/xlsx/xform/sheet/col-xform.js +6 -6
  134. package/dist/cjs/xlsx/xform/sheet/data-validations-xform.js +18 -18
  135. package/dist/cjs/xlsx/xform/sheet/dimension-xform.js +2 -2
  136. package/dist/cjs/xlsx/xform/sheet/drawing-xform.js +2 -2
  137. package/dist/cjs/xlsx/xform/sheet/ext-lst-xform.js +5 -5
  138. package/dist/cjs/xlsx/xform/sheet/header-footer-xform.js +2 -2
  139. package/dist/cjs/xlsx/xform/sheet/hyperlink-xform.js +2 -2
  140. package/dist/cjs/xlsx/xform/sheet/merge-cell-xform.js +2 -2
  141. package/dist/cjs/xlsx/xform/sheet/merges.js +8 -8
  142. package/dist/cjs/xlsx/xform/sheet/outline-properties-xform.js +2 -2
  143. package/dist/cjs/xlsx/xform/sheet/page-breaks-xform.js +15 -3
  144. package/dist/cjs/xlsx/xform/sheet/page-margins-xform.js +2 -2
  145. package/dist/cjs/xlsx/xform/sheet/page-setup-properties-xform.js +2 -2
  146. package/dist/cjs/xlsx/xform/sheet/page-setup-xform.js +2 -2
  147. package/dist/cjs/xlsx/xform/sheet/picture-xform.js +2 -2
  148. package/dist/cjs/xlsx/xform/sheet/print-options-xform.js +2 -2
  149. package/dist/cjs/xlsx/xform/sheet/row-breaks-xform.js +15 -17
  150. package/dist/cjs/xlsx/xform/sheet/row-xform.js +11 -11
  151. package/dist/cjs/xlsx/xform/sheet/sheet-format-properties-xform.js +2 -2
  152. package/dist/cjs/xlsx/xform/sheet/sheet-properties-xform.js +8 -8
  153. package/dist/cjs/xlsx/xform/sheet/sheet-protection-xform.js +2 -2
  154. package/dist/cjs/xlsx/xform/sheet/sheet-view-xform.js +4 -4
  155. package/dist/cjs/xlsx/xform/sheet/table-part-xform.js +2 -2
  156. package/dist/cjs/xlsx/xform/sheet/worksheet-xform.js +75 -70
  157. package/dist/cjs/xlsx/xform/simple/boolean-xform.js +2 -2
  158. package/dist/cjs/xlsx/xform/simple/date-xform.js +2 -2
  159. package/dist/cjs/xlsx/xform/simple/float-xform.js +2 -2
  160. package/dist/cjs/xlsx/xform/simple/integer-xform.js +2 -2
  161. package/dist/cjs/xlsx/xform/simple/string-xform.js +2 -2
  162. package/dist/cjs/xlsx/xform/static-xform.js +4 -4
  163. package/dist/cjs/xlsx/xform/strings/phonetic-text-xform.js +6 -6
  164. package/dist/cjs/xlsx/xform/strings/rich-text-xform.js +6 -6
  165. package/dist/cjs/xlsx/xform/strings/shared-string-xform.js +8 -8
  166. package/dist/cjs/xlsx/xform/strings/shared-strings-xform.js +6 -6
  167. package/dist/cjs/xlsx/xform/strings/text-xform.js +2 -2
  168. package/dist/cjs/xlsx/xform/style/alignment-xform.js +8 -8
  169. package/dist/cjs/xlsx/xform/style/border-xform.js +8 -8
  170. package/dist/cjs/xlsx/xform/style/color-xform.js +2 -2
  171. package/dist/cjs/xlsx/xform/style/dxf-xform.js +14 -14
  172. package/dist/cjs/xlsx/xform/style/fill-xform.js +9 -9
  173. package/dist/cjs/xlsx/xform/style/font-xform.js +22 -22
  174. package/dist/cjs/xlsx/xform/style/numfmt-xform.js +5 -5
  175. package/dist/cjs/xlsx/xform/style/protection-xform.js +2 -2
  176. package/dist/cjs/xlsx/xform/style/style-xform.js +6 -6
  177. package/dist/cjs/xlsx/xform/style/styles-xform.js +39 -39
  178. package/dist/cjs/xlsx/xform/style/underline-xform.js +2 -2
  179. package/dist/cjs/xlsx/xform/table/auto-filter-xform.js +4 -4
  180. package/dist/cjs/xlsx/xform/table/custom-filter-xform.js +2 -2
  181. package/dist/cjs/xlsx/xform/table/filter-column-xform.js +9 -9
  182. package/dist/cjs/xlsx/xform/table/filter-xform.js +2 -2
  183. package/dist/cjs/xlsx/xform/table/table-column-xform.js +2 -2
  184. package/dist/cjs/xlsx/xform/table/table-style-info-xform.js +2 -2
  185. package/dist/cjs/xlsx/xform/table/table-xform.js +12 -12
  186. package/dist/cjs/xlsx/xlsx.base.js +742 -0
  187. package/dist/cjs/xlsx/xlsx.browser.js +162 -0
  188. package/dist/cjs/xlsx/xlsx.js +118 -892
  189. package/dist/esm/csv/csv-core.js +694 -0
  190. package/dist/esm/csv/csv-stream.js +638 -0
  191. package/dist/esm/csv/csv.base.js +127 -0
  192. package/dist/esm/csv/csv.browser.js +65 -0
  193. package/dist/esm/csv/csv.js +181 -159
  194. package/dist/esm/doc/column.js +21 -0
  195. package/dist/esm/doc/workbook.base.js +207 -0
  196. package/dist/esm/doc/workbook.browser.js +59 -0
  197. package/dist/esm/doc/workbook.js +64 -175
  198. package/dist/esm/doc/worksheet.js +4 -0
  199. package/dist/esm/index.browser.js +33 -1
  200. package/dist/esm/index.js +23 -8
  201. package/dist/esm/local.js +0 -1
  202. package/dist/esm/stream/xlsx/workbook-writer.js +1 -1
  203. package/dist/esm/stream/xlsx/worksheet-writer.js +8 -1
  204. package/dist/esm/utils/browser-buffer.js +67 -0
  205. package/dist/esm/utils/datetime.js +639 -0
  206. package/dist/esm/utils/encryptor.browser.js +237 -0
  207. package/dist/esm/utils/parse-sax.js +1188 -12
  208. package/dist/esm/utils/stream-buf.browser.js +352 -0
  209. package/dist/esm/utils/unzip/zip-parser.js +11 -0
  210. package/dist/esm/utils/utils.base.js +142 -0
  211. package/dist/esm/utils/utils.browser.js +68 -0
  212. package/dist/esm/utils/utils.js +15 -123
  213. package/dist/esm/utils/zip/compress.base.js +83 -0
  214. package/dist/esm/utils/zip/compress.browser.js +121 -0
  215. package/dist/esm/utils/zip/compress.js +16 -164
  216. package/dist/esm/utils/zip/crc32.browser.js +82 -0
  217. package/dist/esm/utils/zip/deflate-fallback.js +570 -0
  218. package/dist/esm/utils/zip/streaming-zip.js +259 -0
  219. package/dist/esm/utils/zip-stream.browser.js +132 -0
  220. package/dist/esm/xlsx/xform/pivot-table/pivot-table-xform.js +2 -3
  221. package/dist/esm/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.js +2 -3
  222. package/dist/esm/xlsx/xform/sheet/col-breaks-xform.js +35 -0
  223. package/dist/esm/xlsx/xform/sheet/page-breaks-xform.js +13 -1
  224. package/dist/esm/xlsx/xform/sheet/row-breaks-xform.js +11 -13
  225. package/dist/esm/xlsx/xform/sheet/worksheet-xform.js +7 -2
  226. package/dist/esm/xlsx/xlsx.base.js +739 -0
  227. package/dist/esm/xlsx/xlsx.browser.js +159 -0
  228. package/dist/esm/xlsx/xlsx.js +114 -888
  229. package/dist/types/csv/csv-core.d.ts +207 -0
  230. package/dist/types/csv/csv-stream.d.ts +114 -0
  231. package/dist/types/csv/csv.base.d.ts +62 -0
  232. package/dist/types/csv/csv.browser.d.ts +33 -0
  233. package/dist/types/csv/csv.d.ts +97 -71
  234. package/dist/types/doc/anchor.d.ts +1 -1
  235. package/dist/types/doc/cell.d.ts +7 -7
  236. package/dist/types/doc/column.d.ts +9 -3
  237. package/dist/types/doc/defined-names.d.ts +4 -4
  238. package/dist/types/doc/image.d.ts +2 -2
  239. package/dist/types/doc/modelcontainer.d.ts +1 -1
  240. package/dist/types/doc/pivot-table.d.ts +1 -1
  241. package/dist/types/doc/range.d.ts +1 -1
  242. package/dist/types/doc/row.d.ts +3 -3
  243. package/dist/types/doc/table.d.ts +2 -2
  244. package/dist/types/doc/workbook.base.d.ts +111 -0
  245. package/dist/types/doc/workbook.browser.d.ts +38 -0
  246. package/dist/types/doc/workbook.d.ts +62 -92
  247. package/dist/types/doc/worksheet.d.ts +12 -10
  248. package/dist/types/index.browser.d.ts +19 -5
  249. package/dist/types/index.d.ts +24 -23
  250. package/dist/types/local.d.ts +0 -1
  251. package/dist/types/stream/xlsx/hyperlink-reader.d.ts +1 -1
  252. package/dist/types/stream/xlsx/workbook-reader.d.ts +4 -4
  253. package/dist/types/stream/xlsx/workbook-writer.d.ts +7 -7
  254. package/dist/types/stream/xlsx/worksheet-reader.d.ts +5 -5
  255. package/dist/types/stream/xlsx/worksheet-writer.d.ts +11 -9
  256. package/dist/types/types.d.ts +6 -0
  257. package/dist/types/utils/browser-buffer.d.ts +28 -0
  258. package/dist/types/utils/col-cache.d.ts +1 -1
  259. package/dist/types/utils/datetime.d.ts +85 -0
  260. package/dist/types/utils/encryptor.browser.d.ts +28 -0
  261. package/dist/types/utils/parse-sax.d.ts +108 -1
  262. package/dist/types/utils/sheet-utils.d.ts +3 -3
  263. package/dist/types/utils/stream-buf.browser.d.ts +41 -0
  264. package/dist/types/utils/unzip/extract.d.ts +6 -6
  265. package/dist/types/utils/unzip/index.d.ts +8 -8
  266. package/dist/types/utils/unzip/parse.d.ts +3 -3
  267. package/dist/types/utils/unzip/zip-parser.d.ts +5 -0
  268. package/dist/types/utils/utils.base.d.ts +29 -0
  269. package/dist/types/utils/utils.browser.d.ts +29 -0
  270. package/dist/types/utils/utils.d.ts +6 -25
  271. package/dist/types/utils/zip/compress.base.d.ts +45 -0
  272. package/dist/types/utils/zip/compress.browser.d.ts +63 -0
  273. package/dist/types/utils/zip/compress.d.ts +13 -45
  274. package/dist/types/utils/zip/crc32.browser.d.ts +52 -0
  275. package/dist/types/utils/zip/deflate-fallback.d.ts +39 -0
  276. package/dist/types/utils/zip/index.d.ts +5 -5
  277. package/dist/types/utils/zip/streaming-zip.d.ts +96 -0
  278. package/dist/types/utils/zip/zip-builder.d.ts +1 -1
  279. package/dist/types/utils/zip-stream.browser.d.ts +39 -0
  280. package/dist/types/xlsx/xform/base-xform.d.ts +1 -1
  281. package/dist/types/xlsx/xform/book/defined-name-xform.d.ts +1 -1
  282. package/dist/types/xlsx/xform/book/sheet-xform.d.ts +1 -1
  283. package/dist/types/xlsx/xform/book/workbook-calc-properties-xform.d.ts +1 -1
  284. package/dist/types/xlsx/xform/book/workbook-pivot-cache-xform.d.ts +1 -1
  285. package/dist/types/xlsx/xform/book/workbook-properties-xform.d.ts +1 -1
  286. package/dist/types/xlsx/xform/book/workbook-view-xform.d.ts +1 -1
  287. package/dist/types/xlsx/xform/book/workbook-xform.d.ts +2 -2
  288. package/dist/types/xlsx/xform/comment/comment-xform.d.ts +2 -2
  289. package/dist/types/xlsx/xform/comment/comments-xform.d.ts +2 -2
  290. package/dist/types/xlsx/xform/comment/style/vml-position-xform.d.ts +1 -1
  291. package/dist/types/xlsx/xform/comment/style/vml-protection-xform.d.ts +1 -1
  292. package/dist/types/xlsx/xform/comment/vml-anchor-xform.d.ts +1 -1
  293. package/dist/types/xlsx/xform/comment/vml-client-data-xform.d.ts +1 -1
  294. package/dist/types/xlsx/xform/comment/vml-notes-xform.d.ts +1 -1
  295. package/dist/types/xlsx/xform/comment/vml-shape-xform.d.ts +1 -1
  296. package/dist/types/xlsx/xform/comment/vml-textbox-xform.d.ts +1 -1
  297. package/dist/types/xlsx/xform/composite-xform.d.ts +1 -1
  298. package/dist/types/xlsx/xform/core/app-heading-pairs-xform.d.ts +1 -1
  299. package/dist/types/xlsx/xform/core/app-titles-of-parts-xform.d.ts +1 -1
  300. package/dist/types/xlsx/xform/core/app-xform.d.ts +1 -1
  301. package/dist/types/xlsx/xform/core/content-types-xform.d.ts +1 -1
  302. package/dist/types/xlsx/xform/core/core-xform.d.ts +1 -1
  303. package/dist/types/xlsx/xform/core/relationship-xform.d.ts +1 -1
  304. package/dist/types/xlsx/xform/core/relationships-xform.d.ts +1 -1
  305. package/dist/types/xlsx/xform/drawing/base-cell-anchor-xform.d.ts +1 -1
  306. package/dist/types/xlsx/xform/drawing/blip-fill-xform.d.ts +2 -2
  307. package/dist/types/xlsx/xform/drawing/blip-xform.d.ts +1 -1
  308. package/dist/types/xlsx/xform/drawing/c-nv-pic-pr-xform.d.ts +1 -1
  309. package/dist/types/xlsx/xform/drawing/c-nv-pr-xform.d.ts +1 -1
  310. package/dist/types/xlsx/xform/drawing/cell-position-xform.d.ts +2 -2
  311. package/dist/types/xlsx/xform/drawing/drawing-xform.d.ts +1 -1
  312. package/dist/types/xlsx/xform/drawing/ext-lst-xform.d.ts +1 -1
  313. package/dist/types/xlsx/xform/drawing/ext-xform.d.ts +1 -1
  314. package/dist/types/xlsx/xform/drawing/hlink-click-xform.d.ts +1 -1
  315. package/dist/types/xlsx/xform/drawing/nv-pic-pr-xform.d.ts +1 -1
  316. package/dist/types/xlsx/xform/drawing/one-cell-anchor-xform.d.ts +1 -1
  317. package/dist/types/xlsx/xform/drawing/pic-xform.d.ts +1 -1
  318. package/dist/types/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +1 -1
  319. package/dist/types/xlsx/xform/list-xform.d.ts +1 -1
  320. package/dist/types/xlsx/xform/pivot-table/cache-field-xform.d.ts +1 -1
  321. package/dist/types/xlsx/xform/pivot-table/pivot-cache-definition-xform.d.ts +3 -3
  322. package/dist/types/xlsx/xform/pivot-table/pivot-cache-records-xform.d.ts +2 -2
  323. package/dist/types/xlsx/xform/pivot-table/pivot-table-xform.d.ts +1 -1
  324. package/dist/types/xlsx/xform/sheet/auto-filter-xform.d.ts +1 -1
  325. package/dist/types/xlsx/xform/sheet/cell-xform.d.ts +1 -1
  326. package/dist/types/xlsx/xform/sheet/cf/cf-rule-xform.d.ts +6 -6
  327. package/dist/types/xlsx/xform/sheet/cf/cfvo-xform.d.ts +1 -1
  328. package/dist/types/xlsx/xform/sheet/cf/color-scale-xform.d.ts +3 -3
  329. package/dist/types/xlsx/xform/sheet/cf/conditional-formatting-xform.d.ts +1 -1
  330. package/dist/types/xlsx/xform/sheet/cf/conditional-formattings-xform.d.ts +2 -2
  331. package/dist/types/xlsx/xform/sheet/cf/databar-xform.d.ts +3 -3
  332. package/dist/types/xlsx/xform/sheet/cf/ext-lst-ref-xform.d.ts +1 -1
  333. package/dist/types/xlsx/xform/sheet/cf/formula-xform.d.ts +1 -1
  334. package/dist/types/xlsx/xform/sheet/cf/icon-set-xform.d.ts +2 -2
  335. package/dist/types/xlsx/xform/sheet/cf-ext/cf-icon-ext-xform.d.ts +1 -1
  336. package/dist/types/xlsx/xform/sheet/cf-ext/cf-rule-ext-xform.d.ts +3 -3
  337. package/dist/types/xlsx/xform/sheet/cf-ext/cfvo-ext-xform.d.ts +2 -2
  338. package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formatting-ext-xform.d.ts +3 -3
  339. package/dist/types/xlsx/xform/sheet/cf-ext/conditional-formattings-ext-xform.d.ts +2 -2
  340. package/dist/types/xlsx/xform/sheet/cf-ext/databar-ext-xform.d.ts +3 -3
  341. package/dist/types/xlsx/xform/sheet/cf-ext/f-ext-xform.d.ts +1 -1
  342. package/dist/types/xlsx/xform/sheet/cf-ext/icon-set-ext-xform.d.ts +3 -3
  343. package/dist/types/xlsx/xform/sheet/cf-ext/sqref-ext-xform.d.ts +1 -1
  344. package/dist/types/xlsx/xform/sheet/col-breaks-xform.d.ts +16 -0
  345. package/dist/types/xlsx/xform/sheet/col-xform.d.ts +1 -1
  346. package/dist/types/xlsx/xform/sheet/data-validations-xform.d.ts +1 -1
  347. package/dist/types/xlsx/xform/sheet/dimension-xform.d.ts +1 -1
  348. package/dist/types/xlsx/xform/sheet/drawing-xform.d.ts +1 -1
  349. package/dist/types/xlsx/xform/sheet/ext-lst-xform.d.ts +1 -1
  350. package/dist/types/xlsx/xform/sheet/header-footer-xform.d.ts +1 -1
  351. package/dist/types/xlsx/xform/sheet/hyperlink-xform.d.ts +1 -1
  352. package/dist/types/xlsx/xform/sheet/merge-cell-xform.d.ts +1 -1
  353. package/dist/types/xlsx/xform/sheet/outline-properties-xform.d.ts +1 -1
  354. package/dist/types/xlsx/xform/sheet/page-breaks-xform.d.ts +5 -1
  355. package/dist/types/xlsx/xform/sheet/page-margins-xform.d.ts +1 -1
  356. package/dist/types/xlsx/xform/sheet/page-setup-properties-xform.d.ts +1 -1
  357. package/dist/types/xlsx/xform/sheet/page-setup-xform.d.ts +1 -1
  358. package/dist/types/xlsx/xform/sheet/picture-xform.d.ts +1 -1
  359. package/dist/types/xlsx/xform/sheet/print-options-xform.d.ts +1 -1
  360. package/dist/types/xlsx/xform/sheet/row-breaks-xform.d.ts +5 -1
  361. package/dist/types/xlsx/xform/sheet/row-xform.d.ts +1 -1
  362. package/dist/types/xlsx/xform/sheet/sheet-format-properties-xform.d.ts +1 -1
  363. package/dist/types/xlsx/xform/sheet/sheet-properties-xform.d.ts +1 -1
  364. package/dist/types/xlsx/xform/sheet/sheet-protection-xform.d.ts +1 -1
  365. package/dist/types/xlsx/xform/sheet/sheet-view-xform.d.ts +1 -1
  366. package/dist/types/xlsx/xform/sheet/table-part-xform.d.ts +1 -1
  367. package/dist/types/xlsx/xform/sheet/worksheet-xform.d.ts +1 -1
  368. package/dist/types/xlsx/xform/simple/boolean-xform.d.ts +1 -1
  369. package/dist/types/xlsx/xform/simple/date-xform.d.ts +1 -1
  370. package/dist/types/xlsx/xform/simple/float-xform.d.ts +1 -1
  371. package/dist/types/xlsx/xform/simple/integer-xform.d.ts +1 -1
  372. package/dist/types/xlsx/xform/simple/string-xform.d.ts +1 -1
  373. package/dist/types/xlsx/xform/static-xform.d.ts +1 -1
  374. package/dist/types/xlsx/xform/strings/phonetic-text-xform.d.ts +1 -1
  375. package/dist/types/xlsx/xform/strings/rich-text-xform.d.ts +3 -3
  376. package/dist/types/xlsx/xform/strings/shared-string-xform.d.ts +1 -1
  377. package/dist/types/xlsx/xform/strings/shared-strings-xform.d.ts +2 -2
  378. package/dist/types/xlsx/xform/strings/text-xform.d.ts +1 -1
  379. package/dist/types/xlsx/xform/style/alignment-xform.d.ts +1 -1
  380. package/dist/types/xlsx/xform/style/border-xform.d.ts +2 -2
  381. package/dist/types/xlsx/xform/style/color-xform.d.ts +1 -1
  382. package/dist/types/xlsx/xform/style/dxf-xform.d.ts +1 -1
  383. package/dist/types/xlsx/xform/style/fill-xform.d.ts +2 -2
  384. package/dist/types/xlsx/xform/style/font-xform.d.ts +1 -1
  385. package/dist/types/xlsx/xform/style/numfmt-xform.d.ts +1 -1
  386. package/dist/types/xlsx/xform/style/protection-xform.d.ts +1 -1
  387. package/dist/types/xlsx/xform/style/style-xform.d.ts +3 -3
  388. package/dist/types/xlsx/xform/style/styles-xform.d.ts +2 -2
  389. package/dist/types/xlsx/xform/style/underline-xform.d.ts +1 -1
  390. package/dist/types/xlsx/xform/table/auto-filter-xform.d.ts +2 -2
  391. package/dist/types/xlsx/xform/table/custom-filter-xform.d.ts +1 -1
  392. package/dist/types/xlsx/xform/table/filter-column-xform.d.ts +2 -2
  393. package/dist/types/xlsx/xform/table/filter-xform.d.ts +1 -1
  394. package/dist/types/xlsx/xform/table/table-column-xform.d.ts +1 -1
  395. package/dist/types/xlsx/xform/table/table-style-info-xform.d.ts +1 -1
  396. package/dist/types/xlsx/xform/table/table-xform.d.ts +1 -1
  397. package/dist/types/xlsx/xlsx.base.d.ts +134 -0
  398. package/dist/types/xlsx/xlsx.browser.d.ts +31 -0
  399. package/dist/types/xlsx/xlsx.d.ts +20 -80
  400. package/package.json +16 -39
@@ -1,29 +1,1205 @@
1
- import { SaxesParser } from "saxes";
1
+ /**
2
+ * High-performance SAX XML parser
3
+ *
4
+ * Minimal implementation optimized for Excel XML parsing.
5
+ * Supports: opentag, text, closetag, error events.
6
+ * Zero external dependencies.
7
+ *
8
+ * Based on XML 1.0 specification with optimizations for common Excel XML patterns.
9
+ */
2
10
  import { bufferToString } from "./utils.js";
11
+ // ============================================================================
12
+ // Character codes (for fast comparison)
13
+ // ============================================================================
14
+ const TAB = 9;
15
+ const NL = 0xa;
16
+ const CR = 0xd;
17
+ const SPACE = 0x20;
18
+ const BANG = 0x21; // !
19
+ const DQUOTE = 0x22; // "
20
+ const AMP = 0x26; // &
21
+ const SQUOTE = 0x27; // '
22
+ const MINUS = 0x2d; // -
23
+ const FORWARD_SLASH = 0x2f; // /
24
+ const SEMICOLON = 0x3b; // ;
25
+ const LESS = 0x3c; // <
26
+ const EQUAL = 0x3d; // =
27
+ const GREATER = 0x3e; // >
28
+ const QUESTION = 0x3f; // ?
29
+ const OPEN_BRACKET = 0x5b; // [
30
+ const CLOSE_BRACKET = 0x5d; // ]
31
+ const HASH = 0x23; // #
32
+ // ============================================================================
33
+ // Pre-computed lookup tables for performance
34
+ // ============================================================================
35
+ // ASCII character lookup (0-127) for String.fromCharCode
36
+ const ASCII_CHARS = new Array(128);
37
+ for (let i = 0; i < 128; i++) {
38
+ ASCII_CHARS[i] = String.fromCharCode(i);
39
+ }
40
+ // Fast charFromCode - use lookup for ASCII, fallback for others
41
+ function charFromCode(c) {
42
+ return c < 128 ? ASCII_CHARS[c] : String.fromCodePoint(c);
43
+ }
44
+ // Bitmap for ASCII name start chars (a-zA-Z_:)
45
+ const NAME_START_CHAR_ASCII = new Uint8Array(128);
46
+ for (let i = 0x61; i <= 0x7a; i++) {
47
+ NAME_START_CHAR_ASCII[i] = 1;
48
+ } // a-z
49
+ for (let i = 0x41; i <= 0x5a; i++) {
50
+ NAME_START_CHAR_ASCII[i] = 1;
51
+ } // A-Z
52
+ NAME_START_CHAR_ASCII[0x5f] = 1; // _
53
+ NAME_START_CHAR_ASCII[0x3a] = 1; // :
54
+ // Bitmap for ASCII name chars (a-zA-Z0-9_:-.)
55
+ const NAME_CHAR_ASCII = new Uint8Array(128);
56
+ for (let i = 0x61; i <= 0x7a; i++) {
57
+ NAME_CHAR_ASCII[i] = 1;
58
+ } // a-z
59
+ for (let i = 0x41; i <= 0x5a; i++) {
60
+ NAME_CHAR_ASCII[i] = 1;
61
+ } // A-Z
62
+ for (let i = 0x30; i <= 0x39; i++) {
63
+ NAME_CHAR_ASCII[i] = 1;
64
+ } // 0-9
65
+ NAME_CHAR_ASCII[0x5f] = 1; // _
66
+ NAME_CHAR_ASCII[0x3a] = 1; // :
67
+ NAME_CHAR_ASCII[0x2d] = 1; // -
68
+ NAME_CHAR_ASCII[0x2e] = 1; // .
69
+ // ============================================================================
70
+ // Character classification (inlined for performance)
71
+ // ============================================================================
72
+ // isS: space characters (XML whitespace)
73
+ function isS(c) {
74
+ return c === SPACE || c === NL || c === CR || c === TAB;
75
+ }
76
+ // isQuote: quote characters
77
+ function isQuote(c) {
78
+ return c === DQUOTE || c === SQUOTE;
79
+ }
80
+ // isNameStartChar: valid first character of XML name
81
+ // Optimized for common ASCII range first
82
+ function isNameStartChar(c) {
83
+ // Fast path: ASCII lookup
84
+ if (c < 128) {
85
+ return NAME_START_CHAR_ASCII[c] === 1;
86
+ }
87
+ // Extended ranges (less common in Excel XML)
88
+ return ((c >= 0xc0 && c <= 0xd6) ||
89
+ (c >= 0xd8 && c <= 0xf6) ||
90
+ (c >= 0xf8 && c <= 0x2ff) ||
91
+ (c >= 0x370 && c <= 0x37d) ||
92
+ (c >= 0x37f && c <= 0x1fff) ||
93
+ c === 0x200c ||
94
+ c === 0x200d ||
95
+ (c >= 0x2070 && c <= 0x218f) ||
96
+ (c >= 0x2c00 && c <= 0x2fef) ||
97
+ (c >= 0x3001 && c <= 0xd7ff) ||
98
+ (c >= 0xf900 && c <= 0xfdcf) ||
99
+ (c >= 0xfdf0 && c <= 0xfffd) ||
100
+ (c >= 0x10000 && c <= 0xeffff));
101
+ }
102
+ // isNameChar: valid character in XML name (includes digits, hyphen, period)
103
+ function isNameChar(c) {
104
+ // Fast path: ASCII lookup
105
+ if (c < 128) {
106
+ return NAME_CHAR_ASCII[c] === 1;
107
+ }
108
+ // Extended ranges
109
+ return (c === 0xb7 ||
110
+ (c >= 0xc0 && c <= 0xd6) ||
111
+ (c >= 0xd8 && c <= 0xf6) ||
112
+ (c >= 0xf8 && c <= 0x2ff) ||
113
+ (c >= 0x300 && c <= 0x36f) ||
114
+ (c >= 0x370 && c <= 0x37d) ||
115
+ (c >= 0x37f && c <= 0x1fff) ||
116
+ c === 0x200c ||
117
+ c === 0x200d ||
118
+ (c >= 0x203f && c <= 0x2040) ||
119
+ (c >= 0x2070 && c <= 0x218f) ||
120
+ (c >= 0x2c00 && c <= 0x2fef) ||
121
+ (c >= 0x3001 && c <= 0xd7ff) ||
122
+ (c >= 0xf900 && c <= 0xfdcf) ||
123
+ (c >= 0xfdf0 && c <= 0xfffd) ||
124
+ (c >= 0x10000 && c <= 0xeffff));
125
+ }
126
+ // isChar10: valid XML 1.0 character
127
+ function isChar10(c) {
128
+ return ((c >= SPACE && c <= 0xd7ff) ||
129
+ c === NL ||
130
+ c === CR ||
131
+ c === TAB ||
132
+ (c >= 0xe000 && c <= 0xfffd) ||
133
+ (c >= 0x10000 && c <= 0x10ffff));
134
+ }
135
+ // ============================================================================
136
+ // Built-in XML entities
137
+ // ============================================================================
138
+ const XML_ENTITIES = {
139
+ amp: "&",
140
+ gt: ">",
141
+ lt: "<",
142
+ quot: '"',
143
+ apos: "'"
144
+ };
145
+ // ============================================================================
146
+ // Parser States
147
+ // ============================================================================
148
+ const S_TEXT = 0;
149
+ const S_OPEN_WAKA = 1; // <
150
+ const S_OPEN_WAKA_BANG = 2; // <!
151
+ const S_OPEN_TAG = 3; // <tagname
152
+ const S_OPEN_TAG_SLASH = 4; // <tagname /
153
+ const S_ATTRIB = 5; // <tagname attr
154
+ const S_ATTRIB_NAME = 6; // <tagname attr
155
+ const S_ATTRIB_NAME_SAW_WHITE = 7;
156
+ const S_ATTRIB_VALUE = 8; // <tagname attr=
157
+ const S_ATTRIB_VALUE_QUOTED = 9; // <tagname attr="
158
+ const S_ATTRIB_VALUE_CLOSED = 10;
159
+ const S_CLOSE_TAG = 11; // </tagname
160
+ const S_CLOSE_TAG_SAW_WHITE = 12;
161
+ const S_COMMENT = 13; // <!--
162
+ const S_COMMENT_ENDING = 14; // <!-- text -
163
+ const S_COMMENT_ENDED = 15; // <!-- text --
164
+ const S_CDATA = 16; // <![CDATA[
165
+ const S_CDATA_ENDING = 17; // <![CDATA[ text ]
166
+ const S_CDATA_ENDING_2 = 18; // <![CDATA[ text ]]
167
+ const S_PI = 19; // <?
168
+ const S_PI_ENDING = 20; // <? text ?
169
+ const S_DOCTYPE = 21; // <!DOCTYPE
170
+ const S_DOCTYPE_QUOTE = 22;
171
+ const S_DOCTYPE_DTD = 23;
172
+ const S_DOCTYPE_DTD_QUOTED = 24;
173
+ const S_ENTITY = 25; // &entity;
174
+ // ============================================================================
175
+ // SaxesParser Class - Minimal implementation for Excel XML
176
+ // ============================================================================
177
+ export class SaxesParser {
178
+ constructor(opt) {
179
+ // Parser state
180
+ this.state = S_TEXT;
181
+ this.chunk = "";
182
+ this.i = 0;
183
+ this.prevI = 0;
184
+ this.text = "";
185
+ this.name = "";
186
+ this.q = null;
187
+ this.tags = [];
188
+ this.tag = null;
189
+ this.attribList = [];
190
+ this.entity = "";
191
+ this.entityReturnState = S_TEXT;
192
+ this.openWakaBang = "";
193
+ this.sawRoot = false;
194
+ this.closedRoot = false;
195
+ this._closed = false;
196
+ this.reportedTextBeforeRoot = false;
197
+ this.reportedTextAfterRoot = false;
198
+ // Position tracking
199
+ this.line = 1;
200
+ this.column = 0;
201
+ this.positionAtNewLine = 0;
202
+ this.chunkPosition = 0;
203
+ // Entity storage
204
+ this.ENTITIES = { ...XML_ENTITIES };
205
+ this.trackPosition = opt?.position !== false;
206
+ this.fileName = opt?.fileName;
207
+ this.fragment = opt?.fragment ?? false;
208
+ this._init();
209
+ }
210
+ get closed() {
211
+ return this._closed;
212
+ }
213
+ get position() {
214
+ return this.chunkPosition + this.i;
215
+ }
216
+ _init() {
217
+ this.state = this.fragment ? S_TEXT : S_TEXT;
218
+ this.text = "";
219
+ this.name = "";
220
+ this.q = null;
221
+ this.tags = [];
222
+ this.tag = null;
223
+ this.attribList = [];
224
+ this.entity = "";
225
+ this.openWakaBang = "";
226
+ this.sawRoot = this.fragment;
227
+ this.closedRoot = this.fragment;
228
+ this.reportedTextBeforeRoot = this.fragment;
229
+ this.reportedTextAfterRoot = this.fragment;
230
+ this.carriedFromPrevious = undefined;
231
+ this._closed = false;
232
+ this.line = 1;
233
+ this.column = 0;
234
+ this.positionAtNewLine = 0;
235
+ this.chunkPosition = 0;
236
+ this.chunk = "";
237
+ this.i = 0;
238
+ this.prevI = 0;
239
+ }
240
+ on(name, handler) {
241
+ switch (name) {
242
+ case "text":
243
+ this.textHandler = handler;
244
+ break;
245
+ case "opentag":
246
+ this.openTagHandler = handler;
247
+ break;
248
+ case "closetag":
249
+ this.closeTagHandler = handler;
250
+ break;
251
+ case "error":
252
+ this.errorHandler = handler;
253
+ break;
254
+ }
255
+ }
256
+ off(name) {
257
+ switch (name) {
258
+ case "text":
259
+ this.textHandler = undefined;
260
+ break;
261
+ case "opentag":
262
+ this.openTagHandler = undefined;
263
+ break;
264
+ case "closetag":
265
+ this.closeTagHandler = undefined;
266
+ break;
267
+ case "error":
268
+ this.errorHandler = undefined;
269
+ break;
270
+ }
271
+ }
272
+ // Error handling
273
+ makeError(message) {
274
+ let msg = this.fileName ?? "";
275
+ if (this.trackPosition) {
276
+ if (msg.length > 0) {
277
+ msg += ":";
278
+ }
279
+ msg += `${this.line}:${this.column}`;
280
+ }
281
+ if (msg.length > 0) {
282
+ msg += ": ";
283
+ }
284
+ return new Error(msg + message);
285
+ }
286
+ fail(message) {
287
+ const err = this.makeError(message);
288
+ if (this.errorHandler) {
289
+ this.errorHandler(err);
290
+ }
291
+ else {
292
+ throw err;
293
+ }
294
+ return this;
295
+ }
296
+ // Main write method
297
+ write(chunk) {
298
+ if (this._closed) {
299
+ return this.fail("cannot write after close");
300
+ }
301
+ let end = false;
302
+ if (chunk === null) {
303
+ end = true;
304
+ chunk = "";
305
+ }
306
+ if (this.carriedFromPrevious !== undefined) {
307
+ chunk = this.carriedFromPrevious + chunk;
308
+ this.carriedFromPrevious = undefined;
309
+ }
310
+ let limit = chunk.length;
311
+ if (!end && limit > 0) {
312
+ const lastCode = chunk.charCodeAt(limit - 1);
313
+ // Carry CR or surrogate to next chunk
314
+ if (lastCode === CR || (lastCode >= 0xd800 && lastCode <= 0xdbff)) {
315
+ this.carriedFromPrevious = chunk[limit - 1];
316
+ limit--;
317
+ chunk = chunk.slice(0, limit);
318
+ }
319
+ }
320
+ this.chunk = chunk;
321
+ this.i = 0;
322
+ while (this.i < limit) {
323
+ this.processState();
324
+ }
325
+ this.chunkPosition += limit;
326
+ return end ? this.end() : this;
327
+ }
328
+ close() {
329
+ return this.write(null);
330
+ }
331
+ // Get next character code, handling newlines
332
+ // Optimized: split into fast path (no position) and slow path
333
+ getCode() {
334
+ const { chunk, i } = this;
335
+ this.prevI = i;
336
+ this.i = i + 1;
337
+ if (i >= chunk.length) {
338
+ return -1; // EOC
339
+ }
340
+ const code = chunk.charCodeAt(i);
341
+ // Fast path: common ASCII chars (no surrogates, no CR/LF)
342
+ // 0x0a = LF, 0x0d = CR - both need special handling
343
+ if (code < 0x0a || (code > 0x0d && code < 0xd800)) {
344
+ if (this.trackPosition) {
345
+ this.column++;
346
+ }
347
+ return code;
348
+ }
349
+ // Handle surrogates
350
+ if (code >= 0xd800 && code <= 0xdbff) {
351
+ const next = chunk.charCodeAt(i + 1);
352
+ if (next >= 0xdc00 && next <= 0xdfff) {
353
+ this.i = i + 2;
354
+ if (this.trackPosition) {
355
+ this.column++;
356
+ }
357
+ return 0x10000 + ((code - 0xd800) * 0x400 + (next - 0xdc00));
358
+ }
359
+ }
360
+ // Handle CR
361
+ if (code === CR) {
362
+ if (chunk.charCodeAt(i + 1) === NL) {
363
+ this.i = i + 2;
364
+ }
365
+ if (this.trackPosition) {
366
+ this.line++;
367
+ this.column = 0;
368
+ this.positionAtNewLine = this.position;
369
+ }
370
+ return NL;
371
+ }
372
+ // Handle LF (code === 0x0a) or other codes between 0x0a-0x0d
373
+ if (code === NL && this.trackPosition) {
374
+ this.line++;
375
+ this.column = 0;
376
+ this.positionAtNewLine = this.position;
377
+ }
378
+ else if (this.trackPosition) {
379
+ this.column++;
380
+ }
381
+ return code;
382
+ }
383
+ unget() {
384
+ this.i = this.prevI;
385
+ if (this.trackPosition) {
386
+ this.column--;
387
+ }
388
+ }
389
+ // State machine dispatcher
390
+ processState() {
391
+ switch (this.state) {
392
+ case S_TEXT:
393
+ this.sText();
394
+ break;
395
+ case S_OPEN_WAKA:
396
+ this.sOpenWaka();
397
+ break;
398
+ case S_OPEN_WAKA_BANG:
399
+ this.sOpenWakaBang();
400
+ break;
401
+ case S_OPEN_TAG:
402
+ this.sOpenTag();
403
+ break;
404
+ case S_OPEN_TAG_SLASH:
405
+ this.sOpenTagSlash();
406
+ break;
407
+ case S_ATTRIB:
408
+ this.sAttrib();
409
+ break;
410
+ case S_ATTRIB_NAME:
411
+ this.sAttribName();
412
+ break;
413
+ case S_ATTRIB_NAME_SAW_WHITE:
414
+ this.sAttribNameSawWhite();
415
+ break;
416
+ case S_ATTRIB_VALUE:
417
+ this.sAttribValue();
418
+ break;
419
+ case S_ATTRIB_VALUE_QUOTED:
420
+ this.sAttribValueQuoted();
421
+ break;
422
+ case S_ATTRIB_VALUE_CLOSED:
423
+ this.sAttribValueClosed();
424
+ break;
425
+ case S_CLOSE_TAG:
426
+ this.sCloseTag();
427
+ break;
428
+ case S_CLOSE_TAG_SAW_WHITE:
429
+ this.sCloseTagSawWhite();
430
+ break;
431
+ case S_COMMENT:
432
+ this.sComment();
433
+ break;
434
+ case S_COMMENT_ENDING:
435
+ this.sCommentEnding();
436
+ break;
437
+ case S_COMMENT_ENDED:
438
+ this.sCommentEnded();
439
+ break;
440
+ case S_CDATA:
441
+ this.sCData();
442
+ break;
443
+ case S_CDATA_ENDING:
444
+ this.sCDataEnding();
445
+ break;
446
+ case S_CDATA_ENDING_2:
447
+ this.sCDataEnding2();
448
+ break;
449
+ case S_PI:
450
+ this.sPI();
451
+ break;
452
+ case S_PI_ENDING:
453
+ this.sPIEnding();
454
+ break;
455
+ case S_DOCTYPE:
456
+ this.sDoctype();
457
+ break;
458
+ case S_DOCTYPE_QUOTE:
459
+ this.sDoctypeQuote();
460
+ break;
461
+ case S_DOCTYPE_DTD:
462
+ this.sDoctypeDTD();
463
+ break;
464
+ case S_DOCTYPE_DTD_QUOTED:
465
+ this.sDoctypeDTDQuoted();
466
+ break;
467
+ case S_ENTITY:
468
+ this.sEntity();
469
+ break;
470
+ }
471
+ }
472
+ // ============================================================================
473
+ // State handlers
474
+ // ============================================================================
475
+ sText() {
476
+ // Check if we're inside or outside the root element
477
+ if (this.tags.length !== 0) {
478
+ this.handleTextInRoot();
479
+ }
480
+ else {
481
+ this.handleTextOutsideRoot();
482
+ }
483
+ }
484
+ handleTextInRoot() {
485
+ const { chunk } = this;
486
+ let { i: start } = this;
487
+ const handler = this.textHandler;
488
+ while (true) {
489
+ const c = this.getCode();
490
+ if (c === -1) {
491
+ // End of chunk
492
+ if (handler && start < this.i) {
493
+ this.text += chunk.slice(start, this.i);
494
+ }
495
+ return;
496
+ }
497
+ if (c === LESS) {
498
+ // Start of tag
499
+ if (handler) {
500
+ const slice = chunk.slice(start, this.prevI);
501
+ if (this.text.length > 0) {
502
+ handler(this.text + slice);
503
+ this.text = "";
504
+ }
505
+ else if (slice.length > 0) {
506
+ handler(slice);
507
+ }
508
+ }
509
+ this.state = S_OPEN_WAKA;
510
+ return;
511
+ }
512
+ if (c === AMP) {
513
+ // Entity reference
514
+ if (handler) {
515
+ this.text += chunk.slice(start, this.prevI);
516
+ }
517
+ this.state = S_ENTITY;
518
+ this.entityReturnState = S_TEXT;
519
+ this.entity = "";
520
+ return;
521
+ }
522
+ if (c === NL) {
523
+ // Handle newline in text
524
+ if (handler) {
525
+ this.text += chunk.slice(start, this.prevI) + "\n";
526
+ }
527
+ start = this.i;
528
+ }
529
+ }
530
+ }
531
+ handleTextOutsideRoot() {
532
+ const { chunk } = this;
533
+ let { i: start } = this;
534
+ const handler = this.textHandler;
535
+ let nonSpace = false;
536
+ while (true) {
537
+ const c = this.getCode();
538
+ if (c === -1) {
539
+ // End of chunk
540
+ if (handler && start < this.i) {
541
+ this.text += chunk.slice(start, this.i);
542
+ }
543
+ break;
544
+ }
545
+ if (c === LESS) {
546
+ // Start of tag
547
+ if (handler) {
548
+ const slice = chunk.slice(start, this.prevI);
549
+ if (this.text.length > 0) {
550
+ handler(this.text + slice);
551
+ this.text = "";
552
+ }
553
+ else if (slice.length > 0) {
554
+ handler(slice);
555
+ }
556
+ }
557
+ this.state = S_OPEN_WAKA;
558
+ break;
559
+ }
560
+ if (c === AMP) {
561
+ // Entity reference
562
+ if (handler) {
563
+ this.text += chunk.slice(start, this.prevI);
564
+ }
565
+ this.state = S_ENTITY;
566
+ this.entityReturnState = S_TEXT;
567
+ this.entity = "";
568
+ nonSpace = true;
569
+ break;
570
+ }
571
+ if (c === NL) {
572
+ // Handle newline in text
573
+ if (handler) {
574
+ this.text += chunk.slice(start, this.prevI) + "\n";
575
+ }
576
+ start = this.i;
577
+ }
578
+ else if (!isS(c)) {
579
+ nonSpace = true;
580
+ }
581
+ }
582
+ // Report error for non-whitespace text outside root
583
+ if (nonSpace) {
584
+ if (!this.sawRoot && !this.reportedTextBeforeRoot) {
585
+ this.fail("text data outside of root node.");
586
+ this.reportedTextBeforeRoot = true;
587
+ }
588
+ if (this.closedRoot && !this.reportedTextAfterRoot) {
589
+ this.fail("text data outside of root node.");
590
+ this.reportedTextAfterRoot = true;
591
+ }
592
+ }
593
+ }
594
+ sOpenWaka() {
595
+ const c = this.getCode();
596
+ if (isNameStartChar(c)) {
597
+ this.state = S_OPEN_TAG;
598
+ this.name = charFromCode(c);
599
+ return;
600
+ }
601
+ switch (c) {
602
+ case FORWARD_SLASH:
603
+ this.state = S_CLOSE_TAG;
604
+ this.name = "";
605
+ break;
606
+ case BANG:
607
+ this.state = S_OPEN_WAKA_BANG;
608
+ this.openWakaBang = "";
609
+ break;
610
+ case QUESTION:
611
+ this.state = S_PI;
612
+ this.text = "";
613
+ break;
614
+ default:
615
+ this.fail("unexpected character in tag");
616
+ this.state = S_TEXT;
617
+ }
618
+ }
619
+ sOpenWakaBang() {
620
+ const c = this.getCode();
621
+ this.openWakaBang += charFromCode(c);
622
+ switch (this.openWakaBang) {
623
+ case "[CDATA[":
624
+ this.state = S_CDATA;
625
+ this.text = "";
626
+ this.openWakaBang = "";
627
+ break;
628
+ case "--":
629
+ this.state = S_COMMENT;
630
+ this.text = "";
631
+ this.openWakaBang = "";
632
+ break;
633
+ case "DOCTYPE":
634
+ this.state = S_DOCTYPE;
635
+ this.text = "";
636
+ this.openWakaBang = "";
637
+ break;
638
+ default:
639
+ if (this.openWakaBang.length >= 7) {
640
+ this.fail("incorrect syntax");
641
+ this.state = S_TEXT;
642
+ }
643
+ }
644
+ }
645
+ sOpenTag() {
646
+ const c = this.getCode();
647
+ if (c === -1) {
648
+ return;
649
+ }
650
+ if (isNameChar(c)) {
651
+ this.name += charFromCode(c);
652
+ return;
653
+ }
654
+ // Tag name complete
655
+ this.tag = {
656
+ name: this.name,
657
+ attributes: Object.create(null),
658
+ isSelfClosing: false
659
+ };
660
+ this.attribList = [];
661
+ this.sawRoot = true;
662
+ if (c === GREATER) {
663
+ this.openTag();
664
+ }
665
+ else if (c === FORWARD_SLASH) {
666
+ this.state = S_OPEN_TAG_SLASH;
667
+ }
668
+ else if (isS(c)) {
669
+ this.state = S_ATTRIB;
670
+ }
671
+ else {
672
+ this.fail("unexpected character in tag");
673
+ this.state = S_ATTRIB;
674
+ }
675
+ }
676
+ sOpenTagSlash() {
677
+ const c = this.getCode();
678
+ if (c === GREATER) {
679
+ this.openSelfClosingTag();
680
+ }
681
+ else {
682
+ this.fail("expected >");
683
+ this.state = S_ATTRIB;
684
+ }
685
+ }
686
+ sAttrib() {
687
+ const c = this.skipSpaces();
688
+ if (c === -1) {
689
+ return;
690
+ }
691
+ if (isNameStartChar(c)) {
692
+ this.name = charFromCode(c);
693
+ this.state = S_ATTRIB_NAME;
694
+ }
695
+ else if (c === GREATER) {
696
+ this.openTag();
697
+ }
698
+ else if (c === FORWARD_SLASH) {
699
+ this.state = S_OPEN_TAG_SLASH;
700
+ }
701
+ else {
702
+ this.fail("unexpected character in attribute");
703
+ }
704
+ }
705
+ sAttribName() {
706
+ const c = this.getCode();
707
+ if (c === -1) {
708
+ return;
709
+ }
710
+ if (isNameChar(c)) {
711
+ this.name += charFromCode(c);
712
+ return;
713
+ }
714
+ if (c === EQUAL) {
715
+ this.state = S_ATTRIB_VALUE;
716
+ }
717
+ else if (isS(c)) {
718
+ this.state = S_ATTRIB_NAME_SAW_WHITE;
719
+ }
720
+ else if (c === GREATER) {
721
+ this.fail("attribute without value");
722
+ this.attribList.push({ name: this.name, value: this.name });
723
+ this.name = "";
724
+ this.openTag();
725
+ }
726
+ else {
727
+ this.fail("unexpected character in attribute name");
728
+ }
729
+ }
730
+ sAttribNameSawWhite() {
731
+ const c = this.skipSpaces();
732
+ if (c === -1) {
733
+ return;
734
+ }
735
+ if (c === EQUAL) {
736
+ this.state = S_ATTRIB_VALUE;
737
+ }
738
+ else {
739
+ this.fail("attribute without value");
740
+ this.name = "";
741
+ this.text = "";
742
+ if (c === GREATER) {
743
+ this.openTag();
744
+ }
745
+ else if (isNameStartChar(c)) {
746
+ this.name = charFromCode(c);
747
+ this.state = S_ATTRIB_NAME;
748
+ }
749
+ else {
750
+ this.fail("unexpected character");
751
+ this.state = S_ATTRIB;
752
+ }
753
+ }
754
+ }
755
+ sAttribValue() {
756
+ const c = this.skipSpaces();
757
+ if (c === -1) {
758
+ return;
759
+ }
760
+ if (isQuote(c)) {
761
+ this.q = c;
762
+ this.text = "";
763
+ this.state = S_ATTRIB_VALUE_QUOTED;
764
+ }
765
+ else {
766
+ this.fail("unquoted attribute value");
767
+ this.state = S_TEXT;
768
+ }
769
+ }
770
+ sAttribValueQuoted() {
771
+ const { q, chunk } = this;
772
+ let { i: start } = this;
773
+ while (true) {
774
+ const c = this.getCode();
775
+ if (c === -1) {
776
+ this.text += chunk.slice(start, this.i);
777
+ return;
778
+ }
779
+ if (c === q) {
780
+ // End of attribute value
781
+ this.attribList.push({
782
+ name: this.name,
783
+ value: this.text + chunk.slice(start, this.prevI)
784
+ });
785
+ this.name = "";
786
+ this.text = "";
787
+ this.q = null;
788
+ this.state = S_ATTRIB_VALUE_CLOSED;
789
+ return;
790
+ }
791
+ if (c === AMP) {
792
+ this.text += chunk.slice(start, this.prevI);
793
+ this.state = S_ENTITY;
794
+ this.entityReturnState = S_ATTRIB_VALUE_QUOTED;
795
+ this.entity = "";
796
+ return;
797
+ }
798
+ if (c === NL || c === TAB) {
799
+ // Normalize whitespace in attributes
800
+ this.text += chunk.slice(start, this.prevI) + " ";
801
+ start = this.i;
802
+ }
803
+ if (c === LESS) {
804
+ this.text += chunk.slice(start, this.prevI);
805
+ this.fail("< not allowed in attribute value");
806
+ return;
807
+ }
808
+ }
809
+ }
810
+ sAttribValueClosed() {
811
+ const c = this.getCode();
812
+ if (c === -1) {
813
+ return;
814
+ }
815
+ if (isS(c)) {
816
+ this.state = S_ATTRIB;
817
+ }
818
+ else if (c === GREATER) {
819
+ this.openTag();
820
+ }
821
+ else if (c === FORWARD_SLASH) {
822
+ this.state = S_OPEN_TAG_SLASH;
823
+ }
824
+ else if (isNameStartChar(c)) {
825
+ this.fail("no whitespace between attributes");
826
+ this.name = charFromCode(c);
827
+ this.state = S_ATTRIB_NAME;
828
+ }
829
+ else {
830
+ this.fail("unexpected character after attribute");
831
+ }
832
+ }
833
+ sCloseTag() {
834
+ const c = this.getCode();
835
+ if (c === -1) {
836
+ return;
837
+ }
838
+ if (isNameChar(c)) {
839
+ this.name += charFromCode(c);
840
+ }
841
+ else if (c === GREATER) {
842
+ this.closeTag();
843
+ }
844
+ else if (isS(c)) {
845
+ this.state = S_CLOSE_TAG_SAW_WHITE;
846
+ }
847
+ else {
848
+ this.fail("unexpected character in close tag");
849
+ }
850
+ }
851
+ sCloseTagSawWhite() {
852
+ const c = this.skipSpaces();
853
+ if (c === -1) {
854
+ return;
855
+ }
856
+ if (c === GREATER) {
857
+ this.closeTag();
858
+ }
859
+ else {
860
+ this.fail("unexpected character in close tag");
861
+ }
862
+ }
863
+ sComment() {
864
+ const c = this.getCode();
865
+ if (c === -1) {
866
+ return;
867
+ }
868
+ if (c === MINUS) {
869
+ this.state = S_COMMENT_ENDING;
870
+ }
871
+ else {
872
+ this.text += charFromCode(c);
873
+ }
874
+ }
875
+ sCommentEnding() {
876
+ const c = this.getCode();
877
+ if (c === MINUS) {
878
+ this.state = S_COMMENT_ENDED;
879
+ }
880
+ else {
881
+ this.text += "-" + charFromCode(c);
882
+ this.state = S_COMMENT;
883
+ }
884
+ }
885
+ sCommentEnded() {
886
+ const c = this.getCode();
887
+ if (c === GREATER) {
888
+ // Comment done, emit nothing (we don't have a comment handler)
889
+ this.text = "";
890
+ this.state = S_TEXT;
891
+ }
892
+ else if (c === MINUS) {
893
+ this.text += "-";
894
+ }
895
+ else {
896
+ this.fail("malformed comment");
897
+ this.text += "--" + charFromCode(c);
898
+ this.state = S_COMMENT;
899
+ }
900
+ }
901
+ sCData() {
902
+ const c = this.getCode();
903
+ if (c === -1) {
904
+ return;
905
+ }
906
+ if (c === CLOSE_BRACKET) {
907
+ this.state = S_CDATA_ENDING;
908
+ }
909
+ else {
910
+ this.text += charFromCode(c);
911
+ }
912
+ }
913
+ sCDataEnding() {
914
+ const c = this.getCode();
915
+ if (c === CLOSE_BRACKET) {
916
+ this.state = S_CDATA_ENDING_2;
917
+ }
918
+ else {
919
+ this.text += "]" + charFromCode(c);
920
+ this.state = S_CDATA;
921
+ }
922
+ }
923
+ sCDataEnding2() {
924
+ const c = this.getCode();
925
+ if (c === GREATER) {
926
+ // CDATA done - emit as text
927
+ if (this.textHandler && this.text.length > 0) {
928
+ this.textHandler(this.text);
929
+ }
930
+ this.text = "";
931
+ this.state = S_TEXT;
932
+ }
933
+ else if (c === CLOSE_BRACKET) {
934
+ this.text += "]";
935
+ }
936
+ else {
937
+ this.text += "]]" + charFromCode(c);
938
+ this.state = S_CDATA;
939
+ }
940
+ }
941
+ sPI() {
942
+ const c = this.getCode();
943
+ if (c === -1) {
944
+ return;
945
+ }
946
+ if (c === QUESTION) {
947
+ this.state = S_PI_ENDING;
948
+ }
949
+ else {
950
+ this.text += charFromCode(c);
951
+ }
952
+ }
953
+ sPIEnding() {
954
+ const c = this.getCode();
955
+ if (c === GREATER) {
956
+ // PI done, we don't emit PI events
957
+ this.text = "";
958
+ this.state = S_TEXT;
959
+ }
960
+ else if (c === QUESTION) {
961
+ this.text += "?";
962
+ }
963
+ else {
964
+ this.text += "?" + charFromCode(c);
965
+ this.state = S_PI;
966
+ }
967
+ }
968
+ sDoctype() {
969
+ const c = this.getCode();
970
+ if (c === -1) {
971
+ return;
972
+ }
973
+ if (c === GREATER) {
974
+ // DOCTYPE done
975
+ this.text = "";
976
+ this.state = S_TEXT;
977
+ }
978
+ else if (isQuote(c)) {
979
+ this.q = c;
980
+ this.state = S_DOCTYPE_QUOTE;
981
+ }
982
+ else if (c === OPEN_BRACKET) {
983
+ this.state = S_DOCTYPE_DTD;
984
+ }
985
+ else {
986
+ this.text += charFromCode(c);
987
+ }
988
+ }
989
+ sDoctypeQuote() {
990
+ const c = this.getCode();
991
+ if (c === -1) {
992
+ return;
993
+ }
994
+ if (c === this.q) {
995
+ this.q = null;
996
+ this.state = S_DOCTYPE;
997
+ }
998
+ else {
999
+ this.text += charFromCode(c);
1000
+ }
1001
+ }
1002
+ sDoctypeDTD() {
1003
+ const c = this.getCode();
1004
+ if (c === -1) {
1005
+ return;
1006
+ }
1007
+ if (c === CLOSE_BRACKET) {
1008
+ this.state = S_DOCTYPE;
1009
+ }
1010
+ else if (isQuote(c)) {
1011
+ this.q = c;
1012
+ this.state = S_DOCTYPE_DTD_QUOTED;
1013
+ }
1014
+ }
1015
+ sDoctypeDTDQuoted() {
1016
+ const c = this.getCode();
1017
+ if (c === -1) {
1018
+ return;
1019
+ }
1020
+ if (c === this.q) {
1021
+ this.q = null;
1022
+ this.state = S_DOCTYPE_DTD;
1023
+ }
1024
+ }
1025
+ sEntity() {
1026
+ const c = this.getCode();
1027
+ if (c === -1) {
1028
+ return;
1029
+ }
1030
+ if (c === SEMICOLON) {
1031
+ // Entity complete
1032
+ const entity = this.entity;
1033
+ let resolved;
1034
+ if (entity === "") {
1035
+ this.fail("empty entity");
1036
+ resolved = "&;";
1037
+ }
1038
+ else {
1039
+ resolved = this.parseEntity(entity);
1040
+ }
1041
+ this.text += resolved;
1042
+ this.state = this.entityReturnState;
1043
+ this.entity = "";
1044
+ }
1045
+ else if (isNameChar(c) || c === HASH) {
1046
+ this.entity += charFromCode(c);
1047
+ }
1048
+ else {
1049
+ this.fail("invalid entity character");
1050
+ this.text += "&" + this.entity + charFromCode(c);
1051
+ this.state = this.entityReturnState;
1052
+ this.entity = "";
1053
+ }
1054
+ }
1055
+ // Entity resolution
1056
+ parseEntity(entity) {
1057
+ if (entity[0] !== "#") {
1058
+ // Named entity
1059
+ const resolved = this.ENTITIES[entity];
1060
+ if (resolved !== undefined) {
1061
+ return resolved;
1062
+ }
1063
+ this.fail("undefined entity: " + entity);
1064
+ return "&" + entity + ";";
1065
+ }
1066
+ // Numeric entity
1067
+ let num;
1068
+ if (entity[1] === "x" || entity[1] === "X") {
1069
+ // Hexadecimal
1070
+ num = parseInt(entity.slice(2), 16);
1071
+ }
1072
+ else {
1073
+ // Decimal
1074
+ num = parseInt(entity.slice(1), 10);
1075
+ }
1076
+ if (isNaN(num) || !isChar10(num)) {
1077
+ this.fail("invalid character entity");
1078
+ return "&" + entity + ";";
1079
+ }
1080
+ return String.fromCodePoint(num);
1081
+ }
1082
+ // Helper to skip whitespace
1083
+ skipSpaces() {
1084
+ while (true) {
1085
+ const c = this.getCode();
1086
+ if (c === -1 || !isS(c)) {
1087
+ return c;
1088
+ }
1089
+ }
1090
+ }
1091
+ // Tag handling
1092
+ openTag() {
1093
+ const tag = this.tag;
1094
+ tag.isSelfClosing = false;
1095
+ // Copy attributes from list to object
1096
+ for (const { name, value } of this.attribList) {
1097
+ tag.attributes[name] = value;
1098
+ }
1099
+ this.attribList = [];
1100
+ this.openTagHandler?.(tag);
1101
+ this.tags.push(tag);
1102
+ this.name = "";
1103
+ this.state = S_TEXT;
1104
+ }
1105
+ openSelfClosingTag() {
1106
+ const tag = this.tag;
1107
+ tag.isSelfClosing = true;
1108
+ // Copy attributes from list to object
1109
+ for (const { name, value } of this.attribList) {
1110
+ tag.attributes[name] = value;
1111
+ }
1112
+ this.attribList = [];
1113
+ this.openTagHandler?.(tag);
1114
+ this.closeTagHandler?.(tag);
1115
+ if (this.tags.length === 0) {
1116
+ this.closedRoot = true;
1117
+ }
1118
+ this.name = "";
1119
+ this.state = S_TEXT;
1120
+ }
1121
+ closeTag() {
1122
+ const { tags, name } = this;
1123
+ this.state = S_TEXT;
1124
+ this.name = "";
1125
+ if (name === "") {
1126
+ this.fail("empty close tag");
1127
+ this.text += "</>";
1128
+ return;
1129
+ }
1130
+ // Find matching open tag
1131
+ let found = false;
1132
+ for (let i = tags.length - 1; i >= 0; i--) {
1133
+ const tag = tags[i];
1134
+ if (tag.name === name) {
1135
+ // Pop all tags including the matching one
1136
+ while (tags.length > i) {
1137
+ const t = tags.pop();
1138
+ this.closeTagHandler?.(t);
1139
+ if (tags.length > i) {
1140
+ this.fail("unclosed tag: " + t.name);
1141
+ }
1142
+ }
1143
+ found = true;
1144
+ break;
1145
+ }
1146
+ }
1147
+ if (!found) {
1148
+ this.fail("unmatched close tag: " + name);
1149
+ this.text += "</" + name + ">";
1150
+ }
1151
+ if (tags.length === 0) {
1152
+ this.closedRoot = true;
1153
+ }
1154
+ }
1155
+ // End parsing
1156
+ end() {
1157
+ if (!this.sawRoot) {
1158
+ this.fail("document must contain a root element");
1159
+ }
1160
+ while (this.tags.length > 0) {
1161
+ const tag = this.tags.pop();
1162
+ this.fail("unclosed tag: " + tag.name);
1163
+ }
1164
+ if (this.text.length > 0 && this.textHandler) {
1165
+ this.textHandler(this.text);
1166
+ this.text = "";
1167
+ }
1168
+ this._closed = true;
1169
+ this._init();
1170
+ return this;
1171
+ }
1172
+ }
1173
+ // ============================================================================
1174
+ // parseSax generator function
1175
+ // ============================================================================
3
1176
  async function* parseSax(iterable) {
4
- const saxesParser = new SaxesParser({
1177
+ const parser = new SaxesParser({
5
1178
  xmlns: false,
6
- defaultXMLVersion: "1.0"
1179
+ position: true // Keep position for error messages
7
1180
  });
8
1181
  let error;
9
- saxesParser.on("error", (err) => {
1182
+ parser.on("error", (err) => {
10
1183
  error = err;
11
1184
  });
12
1185
  let events = [];
13
- saxesParser.on("opentag", (value) => events.push({ eventType: "opentag", value }));
14
- saxesParser.on("text", (value) => events.push({ eventType: "text", value }));
15
- saxesParser.on("closetag", (value) => events.push({ eventType: "closetag", value }));
1186
+ parser.on("opentag", (value) => events.push({ eventType: "opentag", value }));
1187
+ parser.on("text", (value) => events.push({ eventType: "text", value }));
1188
+ parser.on("closetag", (value) => events.push({ eventType: "closetag", value }));
16
1189
  for await (const chunk of iterable) {
17
- saxesParser.write(bufferToString(chunk));
18
- // saxesParser.write and saxesParser.on() are synchronous,
19
- // so we can only reach the below line once all events have been emitted
1190
+ parser.write(bufferToString(chunk));
20
1191
  if (error) {
21
1192
  throw error;
22
1193
  }
23
- // As a performance optimization, we gather all events instead of passing
24
- // them one by one, which would cause each event to go through the event queue
25
1194
  yield events;
26
1195
  events = [];
27
1196
  }
1197
+ parser.close();
1198
+ if (error) {
1199
+ throw error;
1200
+ }
1201
+ if (events.length > 0) {
1202
+ yield events;
1203
+ }
28
1204
  }
29
1205
  export { parseSax };