read-excel-file 9.2.0 → 9.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/.gitlab-ci.yml +1 -1
  2. package/CHANGELOG.md +5 -0
  3. package/README.md +153 -50
  4. package/bundle/read-excel-file.min.js +1 -1
  5. package/bundle/read-excel-file.min.js.map +1 -1
  6. package/bundle/read-excel-file.min.old.js +2 -0
  7. package/bundle/read-excel-file.min.old.js.map +1 -0
  8. package/commonjs/export/convertValuesFromUint8ArraysToStrings.js +3 -0
  9. package/commonjs/export/convertValuesFromUint8ArraysToStrings.js.map +1 -1
  10. package/commonjs/export/parseSheet.js +12 -9
  11. package/commonjs/export/parseSheet.js.map +1 -1
  12. package/commonjs/export/readSheetBrowser.js +6 -2
  13. package/commonjs/export/readSheetBrowser.js.map +1 -1
  14. package/commonjs/export/readSheetNode.js +6 -2
  15. package/commonjs/export/readSheetNode.js.map +1 -1
  16. package/commonjs/export/readSheetUniversal.js +14 -2
  17. package/commonjs/export/readSheetUniversal.js.map +1 -1
  18. package/commonjs/export/readSheetWebWorker.js +12 -2
  19. package/commonjs/export/readSheetWebWorker.js.map +1 -1
  20. package/commonjs/export/readXlsxFileBrowser.js +6 -2
  21. package/commonjs/export/readXlsxFileBrowser.js.map +1 -1
  22. package/commonjs/export/readXlsxFileNode.js +6 -2
  23. package/commonjs/export/readXlsxFileNode.js.map +1 -1
  24. package/commonjs/export/readXlsxFileUniversal.js +14 -2
  25. package/commonjs/export/readXlsxFileUniversal.js.map +1 -1
  26. package/commonjs/export/readXlsxFileWebWorker.js +12 -2
  27. package/commonjs/export/readXlsxFileWebWorker.js.map +1 -1
  28. package/commonjs/export/unpackXlsxFileBrowser.js +29 -6
  29. package/commonjs/export/unpackXlsxFileBrowser.js.map +1 -1
  30. package/commonjs/export/unpackXlsxFileNode.js +6 -0
  31. package/commonjs/export/unpackXlsxFileNode.js.map +1 -1
  32. package/commonjs/export/unpackXlsxFileUniversal.js +6 -0
  33. package/commonjs/export/unpackXlsxFileUniversal.js.map +1 -1
  34. package/commonjs/export/unpackXlsxFileWebWorker.js +14 -0
  35. package/commonjs/export/unpackXlsxFileWebWorker.js.map +1 -0
  36. package/commonjs/parseSheetData/parseSheetData.js +6 -6
  37. package/commonjs/parseSheetData/parseSheetData.js.map +1 -1
  38. package/commonjs/utility/checkpoint.js +33 -0
  39. package/commonjs/utility/checkpoint.js.map +1 -0
  40. package/commonjs/utility/isObject.js +15 -0
  41. package/commonjs/utility/isObject.js.map +1 -0
  42. package/commonjs/utility/isPromise.js +18 -0
  43. package/commonjs/utility/isPromise.js.map +1 -0
  44. package/commonjs/xlsx/convertCellsToData2dArray.js +0 -3
  45. package/commonjs/xlsx/convertCellsToData2dArray.js.map +1 -1
  46. package/commonjs/xlsx/isDateFormatStyle.js +2 -2
  47. package/commonjs/xlsx/isDateFormatStyle.js.map +1 -1
  48. package/commonjs/xlsx/parseCell.js +89 -24
  49. package/commonjs/xlsx/parseCell.js.map +1 -1
  50. package/{modules/xlsx/parseCellCoordinates.js → commonjs/xlsx/parseCellAddress.js} +18 -7
  51. package/commonjs/xlsx/parseCellAddress.js.map +1 -0
  52. package/commonjs/xlsx/parseCellValue.js +7 -23
  53. package/commonjs/xlsx/parseCellValue.js.map +1 -1
  54. package/commonjs/xlsx/parseFilePaths.js +31 -32
  55. package/commonjs/xlsx/parseFilePaths.js.map +1 -1
  56. package/commonjs/xlsx/parseNumber.js +20 -0
  57. package/commonjs/xlsx/parseNumber.js.map +1 -0
  58. package/commonjs/xlsx/parseSharedString.js +64 -0
  59. package/commonjs/xlsx/parseSharedString.js.map +1 -0
  60. package/commonjs/xlsx/parseSharedStrings.js +45 -5
  61. package/commonjs/xlsx/parseSharedStrings.js.map +1 -1
  62. package/commonjs/xlsx/parseSheet.js +93 -9
  63. package/commonjs/xlsx/parseSheet.js.map +1 -1
  64. package/commonjs/xlsx/parseSheetData.js +68 -0
  65. package/commonjs/xlsx/parseSheetData.js.map +1 -0
  66. package/commonjs/xlsx/parseSpreadsheetContents.js +244 -43
  67. package/commonjs/xlsx/parseSpreadsheetContents.js.map +1 -1
  68. package/commonjs/xlsx/parseSpreadsheetInfo.js +67 -36
  69. package/commonjs/xlsx/parseSpreadsheetInfo.js.map +1 -1
  70. package/commonjs/xlsx/parseStyles.js +89 -36
  71. package/commonjs/xlsx/parseStyles.js.map +1 -1
  72. package/commonjs/xml/dom.js +2 -1
  73. package/commonjs/xml/dom.js.map +1 -1
  74. package/commonjs/xml/parseXmlStream.js +14 -0
  75. package/commonjs/xml/parseXmlStream.js.map +1 -0
  76. package/commonjs/xml/parseXmlStream.sax.js +109 -0
  77. package/commonjs/xml/parseXmlStream.sax.js.map +1 -0
  78. package/commonjs/xml/parseXmlStream.saxen.code.js +953 -0
  79. package/commonjs/xml/parseXmlStream.saxen.code.js.map +1 -0
  80. package/commonjs/xml/parseXmlStream.saxen.js +85 -0
  81. package/commonjs/xml/parseXmlStream.saxen.js.map +1 -0
  82. package/commonjs/xml/xlsx.js +75 -40
  83. package/commonjs/xml/xlsx.js.map +1 -1
  84. package/commonjs/zip/unzipFromArrayBuffer.js +5 -14
  85. package/commonjs/zip/unzipFromArrayBuffer.js.map +1 -1
  86. package/commonjs/zip/unzipFromStream.fflate.js +154 -25
  87. package/commonjs/zip/unzipFromStream.fflate.js.map +1 -1
  88. package/commonjs/zip/unzipFromStream.js.map +1 -1
  89. package/commonjs/zip/unzipFromStream.unzipper.js +37 -26
  90. package/commonjs/zip/unzipFromStream.unzipper.js.map +1 -1
  91. package/modules/export/convertValuesFromUint8ArraysToStrings.js +2 -0
  92. package/modules/export/convertValuesFromUint8ArraysToStrings.js.map +1 -1
  93. package/modules/export/parseSheet.js +12 -9
  94. package/modules/export/parseSheet.js.map +1 -1
  95. package/modules/export/readSheetBrowser.js +5 -2
  96. package/modules/export/readSheetBrowser.js.map +1 -1
  97. package/modules/export/readSheetNode.js +5 -2
  98. package/modules/export/readSheetNode.js.map +1 -1
  99. package/modules/export/readSheetUniversal.js +14 -2
  100. package/modules/export/readSheetUniversal.js.map +1 -1
  101. package/modules/export/readSheetWebWorker.js +12 -2
  102. package/modules/export/readSheetWebWorker.js.map +1 -1
  103. package/modules/export/readXlsxFileBrowser.js +5 -2
  104. package/modules/export/readXlsxFileBrowser.js.map +1 -1
  105. package/modules/export/readXlsxFileNode.js +5 -2
  106. package/modules/export/readXlsxFileNode.js.map +1 -1
  107. package/modules/export/readXlsxFileUniversal.js +14 -2
  108. package/modules/export/readXlsxFileUniversal.js.map +1 -1
  109. package/modules/export/readXlsxFileWebWorker.js +12 -2
  110. package/modules/export/readXlsxFileWebWorker.js.map +1 -1
  111. package/modules/export/unpackXlsxFileBrowser.js +26 -6
  112. package/modules/export/unpackXlsxFileBrowser.js.map +1 -1
  113. package/modules/export/unpackXlsxFileNode.js +3 -0
  114. package/modules/export/unpackXlsxFileNode.js.map +1 -1
  115. package/modules/export/unpackXlsxFileUniversal.js +3 -0
  116. package/modules/export/unpackXlsxFileUniversal.js.map +1 -1
  117. package/modules/export/unpackXlsxFileWebWorker.js +6 -0
  118. package/modules/export/unpackXlsxFileWebWorker.js.map +1 -0
  119. package/modules/parseSheetData/parseSheetData.js +4 -4
  120. package/modules/parseSheetData/parseSheetData.js.map +1 -1
  121. package/modules/utility/checkpoint.js +25 -0
  122. package/modules/utility/checkpoint.js.map +1 -0
  123. package/modules/utility/isObject.js +9 -0
  124. package/modules/utility/isObject.js.map +1 -0
  125. package/modules/utility/isPromise.js +12 -0
  126. package/modules/utility/isPromise.js.map +1 -0
  127. package/modules/xlsx/convertCellsToData2dArray.js +0 -3
  128. package/modules/xlsx/convertCellsToData2dArray.js.map +1 -1
  129. package/modules/xlsx/isDateFormatStyle.js +2 -2
  130. package/modules/xlsx/isDateFormatStyle.js.map +1 -1
  131. package/modules/xlsx/parseCell.js +85 -24
  132. package/modules/xlsx/parseCell.js.map +1 -1
  133. package/{commonjs/xlsx/parseCellCoordinates.js → modules/xlsx/parseCellAddress.js} +12 -13
  134. package/modules/xlsx/parseCellAddress.js.map +1 -0
  135. package/modules/xlsx/parseCellValue.js +7 -23
  136. package/modules/xlsx/parseCellValue.js.map +1 -1
  137. package/modules/xlsx/parseFilePaths.js +31 -33
  138. package/modules/xlsx/parseFilePaths.js.map +1 -1
  139. package/modules/xlsx/parseNumber.js +14 -0
  140. package/modules/xlsx/parseNumber.js.map +1 -0
  141. package/modules/xlsx/parseSharedString.js +55 -0
  142. package/modules/xlsx/parseSharedString.js.map +1 -0
  143. package/modules/xlsx/parseSharedStrings.js +46 -5
  144. package/modules/xlsx/parseSharedStrings.js.map +1 -1
  145. package/modules/xlsx/parseSheet.js +91 -9
  146. package/modules/xlsx/parseSheet.js.map +1 -1
  147. package/modules/xlsx/parseSheetData.js +55 -0
  148. package/modules/xlsx/parseSheetData.js.map +1 -0
  149. package/modules/xlsx/parseSpreadsheetContents.js +242 -43
  150. package/modules/xlsx/parseSpreadsheetContents.js.map +1 -1
  151. package/modules/xlsx/parseSpreadsheetInfo.js +67 -37
  152. package/modules/xlsx/parseSpreadsheetInfo.js.map +1 -1
  153. package/modules/xlsx/parseStyles.js +88 -36
  154. package/modules/xlsx/parseStyles.js.map +1 -1
  155. package/modules/xml/dom.js +2 -1
  156. package/modules/xml/dom.js.map +1 -1
  157. package/modules/xml/parseXmlStream.js +18 -0
  158. package/modules/xml/parseXmlStream.js.map +1 -0
  159. package/modules/xml/parseXmlStream.sax.js +103 -0
  160. package/modules/xml/parseXmlStream.sax.js.map +1 -0
  161. package/modules/xml/parseXmlStream.saxen.code.js +947 -0
  162. package/modules/xml/parseXmlStream.saxen.code.js.map +1 -0
  163. package/modules/xml/parseXmlStream.saxen.js +79 -0
  164. package/modules/xml/parseXmlStream.saxen.js.map +1 -0
  165. package/modules/xml/xlsx.js +72 -36
  166. package/modules/xml/xlsx.js.map +1 -1
  167. package/modules/zip/unzipFromArrayBuffer.js +5 -14
  168. package/modules/zip/unzipFromArrayBuffer.js.map +1 -1
  169. package/modules/zip/unzipFromStream.fflate.js +157 -24
  170. package/modules/zip/unzipFromStream.fflate.js.map +1 -1
  171. package/modules/zip/unzipFromStream.js +56 -2
  172. package/modules/zip/unzipFromStream.js.map +1 -1
  173. package/modules/zip/unzipFromStream.unzipper.js +38 -26
  174. package/modules/zip/unzipFromStream.unzipper.js.map +1 -1
  175. package/package.json +4 -6
  176. package/commonjs/xlsx/parseCellCoordinates.js.map +0 -1
  177. package/commonjs/xlsx/parseCells.js +0 -34
  178. package/commonjs/xlsx/parseCells.js.map +0 -1
  179. package/commonjs/xlsx/parseSheetDimensions.js +0 -43
  180. package/commonjs/xlsx/parseSheetDimensions.js.map +0 -1
  181. package/commonjs/xml/xml.js +0 -13
  182. package/commonjs/xml/xml.js.map +0 -1
  183. package/commonjs/xml/xmlBrowser.js +0 -17
  184. package/commonjs/xml/xmlBrowser.js.map +0 -1
  185. package/commonjs/xml/xpath/xlsx-xpath.js +0 -92
  186. package/commonjs/xml/xpath/xlsx-xpath.js.map +0 -1
  187. package/commonjs/xml/xpath/xpathBrowser.js +0 -33
  188. package/commonjs/xml/xpath/xpathBrowser.js.map +0 -1
  189. package/commonjs/xml/xpath/xpathNode.js +0 -16
  190. package/commonjs/xml/xpath/xpathNode.js.map +0 -1
  191. package/modules/xlsx/parseCellCoordinates.js.map +0 -1
  192. package/modules/xlsx/parseCells.js +0 -27
  193. package/modules/xlsx/parseCells.js.map +0 -1
  194. package/modules/xlsx/parseSheetDimensions.js +0 -37
  195. package/modules/xlsx/parseSheetDimensions.js.map +0 -1
  196. package/modules/xml/xml.js +0 -7
  197. package/modules/xml/xml.js.map +0 -1
  198. package/modules/xml/xmlBrowser.js +0 -11
  199. package/modules/xml/xmlBrowser.js.map +0 -1
  200. package/modules/xml/xpath/xlsx-xpath.js +0 -73
  201. package/modules/xml/xpath/xlsx-xpath.js.map +0 -1
  202. package/modules/xml/xpath/xpathBrowser.js +0 -27
  203. package/modules/xml/xpath/xpathBrowser.js.map +0 -1
  204. package/modules/xml/xpath/xpathNode.js +0 -9
  205. package/modules/xml/xpath/xpathNode.js.map +0 -1
@@ -1,61 +1,114 @@
1
1
  "use strict";
2
2
 
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports["default"] = parseStyles;
7
- var _xlsx = require("../xml/xlsx.js");
8
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
8
+ var _excluded = ["xfId"];
9
9
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
10
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
11
11
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
12
12
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
13
13
  function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
14
- // http://officeopenxml.com/SSstyles.php
15
- // Returns an array of cell styles.
16
- // A cell style index is its ID.
17
- function parseStyles(content, xml) {
18
- if (!content) {
19
- return {};
20
- }
21
-
14
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
15
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
16
+ /**
17
+ * Parses `.xlsx` file styles.
18
+ * http://officeopenxml.com/SSstyles.php
19
+ * Returns an array of cell styles.
20
+ * A cell style index is the cell style ID.
21
+ * @param {string} content
22
+ * @param {function} parseXmlStream — SAX XML parser.
23
+ * @returns {object} styles
24
+ */
25
+ function parseStyles(content, parseXmlStream) {
22
26
  // https://social.msdn.microsoft.com/Forums/sqlserver/en-US/708978af-b598-45c4-a598-d3518a5a09f0/howwhen-is-cellstylexfs-vs-cellxfs-applied-to-a-cell?forum=os_binaryfile
23
27
  // https://www.office-forums.com/threads/cellxfs-cellstylexfs.2163519/
24
- var doc = xml.createDocument(content);
25
- var baseStyles = (0, _xlsx.getBaseStyles)(doc).map(parseCellStyle);
26
- var numberFormats = (0, _xlsx.getNumberFormats)(doc).map(parseNumberFormatStyle).reduce(function (formats, format) {
27
- // Format ID is a numeric index.
28
- // There're some standard "built-in" formats (in Excel) up to about `100`.
29
- formats[format.id] = format;
30
- return formats;
31
- }, []);
32
- var getCellStyle = function getCellStyle(xf) {
33
- if (xf.hasAttribute('xfId')) {
34
- return _objectSpread(_objectSpread({}, baseStyles[xf.xfId]), parseCellStyle(xf, numberFormats));
35
- }
36
- return parseCellStyle(xf, numberFormats);
37
- };
38
- return (0, _xlsx.getCellStyles)(doc).map(getCellStyle);
28
+ return parseXmlStream(content, {
29
+ createInitialState: createInitialStateInStyles,
30
+ onOpenTag: onOpenTagInStyles,
31
+ onCloseTag: onCloseTagInStyles
32
+ }).then(function (state) {
33
+ return state.styles.map(function (style) {
34
+ if (style.xfId) {
35
+ var xfId = style.xfId,
36
+ styleProperties = _objectWithoutProperties(style, _excluded);
37
+ return _objectSpread(_objectSpread({}, state.baseStyles[xfId]), styleProperties);
38
+ } else {
39
+ return style;
40
+ }
41
+ });
42
+ });
39
43
  }
40
- function parseNumberFormatStyle(numFmt) {
44
+ function createInitialStateInStyles() {
41
45
  return {
42
- id: numFmt.getAttribute('numFmtId'),
43
- template: numFmt.getAttribute('formatCode')
46
+ numberFormats: {},
47
+ baseStyles: [],
48
+ // The first `164` elements of the `styles` array are going to be `undefined`
49
+ // because those represent the built-in "default" styles in `.xlsx` specification.
50
+ // These "default" styles have IDs from `0` to `163`, i.e. according to their index.
51
+ styles: [],
52
+ cellStyleXfs: false,
53
+ cellXfs: false
44
54
  };
45
55
  }
46
-
47
- // http://www.datypic.com/sc/ooxml/e-ssml_xf-2.html
48
- function parseCellStyle(xf, numFmts) {
56
+ function onOpenTagInStyles(tagName, attributes, state) {
57
+ if (tagName === 'numFmt') {
58
+ // `<numFmts/>` element contains `<numFmt/>` elements.
59
+ // `<numFmt/>` defines a "number format" template.
60
+ // The value of `numFmtId` attribute is a (numeric) ID of this "number format".
61
+ state.numberFormats[attributes.numFmtId] = {
62
+ id: Number(attributes.numFmtId),
63
+ template: attributes.formatCode
64
+ };
65
+ } else if (tagName === 'cellStyleXfs') {
66
+ // `<cellStyleXfs/>` contains "base styles" that could be extended by `<cellXfs/>`.
67
+ // These styles don't apply to individual cells directly. They can only be extended.
68
+ state.cellStyleXfs = true;
69
+ } else if (tagName === 'cellXfs') {
70
+ // `<cellXfs/>` contains individual cell styles. They can extend "base styles".
71
+ state.cellXfs = true;
72
+ } else if (tagName === 'xf') {
73
+ if (state.cellStyleXfs) {
74
+ // The index of a `<xf/>` element is by definition its numeric ID.
75
+ // Therefore, even empty `style` elements still must be put into the array.
76
+ state.baseStyles.push(parseCellStyle(attributes));
77
+ } else if (state.cellXfs) {
78
+ var style = parseCellStyle(attributes, state.numberFormats);
79
+ // A style might extend a "base style" by its numeric ID.
80
+ if (attributes.xfId) {
81
+ style.xfId = Number(attributes.xfId);
82
+ }
83
+ // The index of a `<xf/>` element is by definition its numeric ID.
84
+ // Therefore, even empty `style` elements still must be put into the array.
85
+ state.styles.push(style);
86
+ }
87
+ }
88
+ }
89
+ function onCloseTagInStyles(tagName, state) {
90
+ if (tagName === 'cellStyleXfs') {
91
+ state.cellStyleXfs = false;
92
+ } else if (tagName === 'cellXfs') {
93
+ state.cellXfs = false;
94
+ }
95
+ }
96
+ function parseCellStyle(attributes, numberFormats) {
49
97
  var style = {};
50
- if (xf.hasAttribute('numFmtId')) {
51
- var numberFormatId = xf.getAttribute('numFmtId');
98
+ // `numFmtId` in `<cellStyleXfs/>` and `<cellXfs/>` is a numerical ID
99
+ // referencing the cell's "number format". Values from `0` to `163` are built-in formats,
100
+ // while values `164` and above are custom formats defined in the `<numFmts/>` element.
101
+ var numFmtId = attributes.numFmtId;
102
+ if (numFmtId) {
52
103
  // Built-in number formats don't have a `<numFmt/>` element in `styles.xml`.
53
104
  // https://hexdocs.pm/xlsxir/number_styles.html
54
- if (numFmts[numberFormatId]) {
55
- style.numberFormat = numFmts[numberFormatId];
105
+ if (numberFormats && numberFormats[numFmtId]) {
106
+ // Non-built-in number format.
107
+ style.numberFormat = numberFormats[numFmtId];
56
108
  } else {
109
+ // Built-in number format.
57
110
  style.numberFormat = {
58
- id: numberFormatId
111
+ id: Number(numFmtId)
59
112
  };
60
113
  }
61
114
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parseStyles.js","names":["_xlsx","require","_typeof","o","Symbol","iterator","constructor","prototype","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","obj","key","value","_toPropertyKey","configurable","writable","arg","_toPrimitive","String","input","hint","prim","toPrimitive","undefined","res","call","TypeError","Number","parseStyles","content","xml","doc","createDocument","baseStyles","getBaseStyles","map","parseCellStyle","numberFormats","getNumberFormats","parseNumberFormatStyle","reduce","formats","format","id","getCellStyle","xf","hasAttribute","xfId","getCellStyles","numFmt","getAttribute","template","numFmts","style","numberFormatId","numberFormat"],"sources":["../../source/xlsx/parseStyles.js"],"sourcesContent":["import {\r\n getBaseStyles,\r\n getCellStyles,\r\n getNumberFormats\r\n} from '../xml/xlsx.js'\r\n\r\n// http://officeopenxml.com/SSstyles.php\r\n// Returns an array of cell styles.\r\n// A cell style index is its ID.\r\nexport default function parseStyles(content, xml) {\r\n if (!content) {\r\n return {}\r\n }\r\n\r\n // https://social.msdn.microsoft.com/Forums/sqlserver/en-US/708978af-b598-45c4-a598-d3518a5a09f0/howwhen-is-cellstylexfs-vs-cellxfs-applied-to-a-cell?forum=os_binaryfile\r\n // https://www.office-forums.com/threads/cellxfs-cellstylexfs.2163519/\r\n const doc = xml.createDocument(content)\r\n\r\n const baseStyles = getBaseStyles(doc)\r\n .map(parseCellStyle)\r\n\r\n const numberFormats = getNumberFormats(doc)\r\n .map(parseNumberFormatStyle)\r\n .reduce((formats, format) => {\r\n // Format ID is a numeric index.\r\n // There're some standard \"built-in\" formats (in Excel) up to about `100`.\r\n formats[format.id] = format\r\n return formats\r\n }, [])\r\n\r\n const getCellStyle = (xf) => {\r\n if (xf.hasAttribute('xfId')) {\r\n return {\r\n ...baseStyles[xf.xfId],\r\n ...parseCellStyle(xf, numberFormats)\r\n }\r\n }\r\n return parseCellStyle(xf, numberFormats)\r\n }\r\n\r\n return getCellStyles(doc).map(getCellStyle)\r\n}\r\n\r\nfunction parseNumberFormatStyle(numFmt) {\r\n return {\r\n id: numFmt.getAttribute('numFmtId'),\r\n template: numFmt.getAttribute('formatCode')\r\n }\r\n}\r\n\r\n// http://www.datypic.com/sc/ooxml/e-ssml_xf-2.html\r\nfunction parseCellStyle(xf, numFmts) {\r\n const style = {}\r\n if (xf.hasAttribute('numFmtId')) {\r\n const numberFormatId = xf.getAttribute('numFmtId')\r\n // Built-in number formats don't have a `<numFmt/>` element in `styles.xml`.\r\n // https://hexdocs.pm/xlsxir/number_styles.html\r\n if (numFmts[numberFormatId]) {\r\n style.numberFormat = numFmts[numberFormatId]\r\n } else {\r\n style.numberFormat = { id: numberFormatId }\r\n }\r\n }\r\n return style\r\n}"],"mappings":"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"}
1
+ {"version":3,"file":"parseStyles.js","names":["parseStyles","content","parseXmlStream","createInitialState","createInitialStateInStyles","onOpenTag","onOpenTagInStyles","onCloseTag","onCloseTagInStyles","then","state","styles","map","style","xfId","styleProperties","_objectWithoutProperties","_excluded","_objectSpread","baseStyles","numberFormats","cellStyleXfs","cellXfs","tagName","attributes","numFmtId","id","Number","template","formatCode","push","parseCellStyle","numberFormat"],"sources":["../../source/xlsx/parseStyles.js"],"sourcesContent":["/**\r\n * Parses `.xlsx` file styles.\r\n * http://officeopenxml.com/SSstyles.php\r\n * Returns an array of cell styles.\r\n * A cell style index is the cell style ID.\r\n * @param {string} content\r\n * @param {function} parseXmlStream — SAX XML parser.\r\n * @returns {object} styles\r\n */\r\nexport default function parseStyles(content, parseXmlStream) {\r\n // https://social.msdn.microsoft.com/Forums/sqlserver/en-US/708978af-b598-45c4-a598-d3518a5a09f0/howwhen-is-cellstylexfs-vs-cellxfs-applied-to-a-cell?forum=os_binaryfile\r\n // https://www.office-forums.com/threads/cellxfs-cellstylexfs.2163519/\r\n return parseXmlStream(content, {\r\n createInitialState: createInitialStateInStyles,\r\n onOpenTag: onOpenTagInStyles,\r\n onCloseTag: onCloseTagInStyles\r\n }).then((state) => {\r\n return state.styles.map((style) => {\r\n if (style.xfId) {\r\n const { xfId, ...styleProperties } = style\r\n return {\r\n ...state.baseStyles[xfId],\r\n ...styleProperties\r\n }\r\n } else {\r\n return style\r\n }\r\n })\r\n })\r\n}\r\n\r\nfunction createInitialStateInStyles() {\r\n return {\r\n numberFormats: {},\r\n baseStyles: [],\r\n // The first `164` elements of the `styles` array are going to be `undefined`\r\n // because those represent the built-in \"default\" styles in `.xlsx` specification.\r\n // These \"default\" styles have IDs from `0` to `163`, i.e. according to their index.\r\n styles: [],\r\n cellStyleXfs: false,\r\n cellXfs: false\r\n }\r\n}\r\n\r\nfunction onOpenTagInStyles(tagName, attributes, state) {\r\n if (tagName === 'numFmt') {\r\n // `<numFmts/>` element contains `<numFmt/>` elements.\r\n // `<numFmt/>` defines a \"number format\" template.\r\n // The value of `numFmtId` attribute is a (numeric) ID of this \"number format\".\r\n state.numberFormats[attributes.numFmtId] = {\r\n id: Number(attributes.numFmtId),\r\n template: attributes.formatCode\r\n }\r\n } else if (tagName === 'cellStyleXfs') {\r\n // `<cellStyleXfs/>` contains \"base styles\" that could be extended by `<cellXfs/>`.\r\n // These styles don't apply to individual cells directly. They can only be extended.\r\n state.cellStyleXfs = true\r\n } else if (tagName === 'cellXfs') {\r\n // `<cellXfs/>` contains individual cell styles. They can extend \"base styles\".\r\n state.cellXfs = true\r\n } else if (tagName === 'xf') {\r\n if (state.cellStyleXfs) {\r\n // The index of a `<xf/>` element is by definition its numeric ID.\r\n // Therefore, even empty `style` elements still must be put into the array.\r\n state.baseStyles.push(parseCellStyle(attributes))\r\n } else if (state.cellXfs) {\r\n const style = parseCellStyle(attributes, state.numberFormats)\r\n // A style might extend a \"base style\" by its numeric ID.\r\n if (attributes.xfId) {\r\n style.xfId = Number(attributes.xfId)\r\n }\r\n // The index of a `<xf/>` element is by definition its numeric ID.\r\n // Therefore, even empty `style` elements still must be put into the array.\r\n state.styles.push(style)\r\n }\r\n }\r\n}\r\n\r\nfunction onCloseTagInStyles(tagName, state) {\r\n if (tagName === 'cellStyleXfs') {\r\n state.cellStyleXfs = false\r\n } else if (tagName === 'cellXfs') {\r\n state.cellXfs = false\r\n }\r\n}\r\n\r\nfunction parseCellStyle(attributes, numberFormats) {\r\n const style = {}\r\n // `numFmtId` in `<cellStyleXfs/>` and `<cellXfs/>` is a numerical ID\r\n // referencing the cell's \"number format\". Values from `0` to `163` are built-in formats,\r\n // while values `164` and above are custom formats defined in the `<numFmts/>` element.\r\n const { numFmtId } = attributes\r\n if (numFmtId) {\r\n // Built-in number formats don't have a `<numFmt/>` element in `styles.xml`.\r\n // https://hexdocs.pm/xlsxir/number_styles.html\r\n if (numberFormats && numberFormats[numFmtId]) {\r\n // Non-built-in number format.\r\n style.numberFormat = numberFormats[numFmtId]\r\n } else {\r\n // Built-in number format.\r\n style.numberFormat = { id: Number(numFmtId) }\r\n }\r\n }\r\n return style\r\n}"],"mappings":"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"}
@@ -90,7 +90,8 @@ function getFirstElementChild(element) {
90
90
  }
91
91
  }
92
92
 
93
- // This function is only used for occasional debug messages.
93
+ // This function was only used for occasional debug messages during development.
94
+ // It's not used in the actual code.
94
95
  function getOuterXml(node) {
95
96
  // `nodeType: 1` means "Element".
96
97
  // https://www.w3schools.com/xml/prop_element_nodetype.asp
@@ -1 +1 @@
1
- {"version":3,"file":"dom.js","names":["findChild","node","tagName","i","childNodes","length","childNode","nodeType","getTagName","findChildren","results","push","forEach","func","map","NAMESPACE_REG_EXP","element","replace","isElement","getFirstElementChild","getOuterXml","textContent","xml","j","attributes","name","value"],"sources":["../../source/xml/dom.js"],"sourcesContent":["export function findChild(node, tagName) {\r\n\tlet i = 0\r\n\twhile (i < node.childNodes.length) {\r\n\t\tconst childNode = node.childNodes[i]\r\n\t\t// `nodeType: 1` means \"Element\".\r\n\t\t// https://www.w3schools.com/xml/prop_element_nodetype.asp\r\n\t\tif (childNode.nodeType === 1 && getTagName(childNode) === tagName) {\r\n\t\t\treturn childNode\r\n\t\t}\r\n\t\ti++\r\n\t}\r\n}\r\n\r\nexport function findChildren(node, tagName) {\r\n\tconst results = []\r\n\tlet i = 0\r\n\twhile (i < node.childNodes.length) {\r\n\t\tconst childNode = node.childNodes[i]\r\n\t\t// `nodeType: 1` means \"Element\".\r\n\t\t// https://www.w3schools.com/xml/prop_element_nodetype.asp\r\n\t\tif (childNode.nodeType === 1 && getTagName(childNode) === tagName) {\r\n\t\t\tresults.push(childNode)\r\n\t\t}\r\n\t\ti++\r\n\t}\r\n\treturn results\r\n}\r\n\r\nexport function forEach(node, tagName, func) {\r\n\t// if (typeof tagName === 'function') {\r\n\t// \tfunc = tagName\r\n\t// \ttagName = undefined\r\n\t// }\r\n\tlet i = 0\r\n\twhile (i < node.childNodes.length) {\r\n\t\tconst childNode = node.childNodes[i]\r\n\t\tif (tagName) {\r\n\t\t\t// `nodeType: 1` means \"Element\".\r\n\t\t\t// https://www.w3schools.com/xml/prop_element_nodetype.asp\r\n\t\t\tif (childNode.nodeType === 1 && getTagName(childNode) === tagName) {\r\n\t\t\t\tfunc(childNode, i)\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tfunc(childNode, i)\r\n\t\t}\r\n\t\ti++\r\n\t}\r\n}\r\n\r\nexport function map(node, tagName, func) {\r\n\tconst results = []\r\n\tforEach(node, tagName, (node, i) => {\r\n\t\tresults.push(func(node, i))\r\n\t})\r\n\treturn results\r\n}\r\n\r\nconst NAMESPACE_REG_EXP = /.+\\:/\r\nexport function getTagName(element) {\r\n\t// For some weird reason, if an element is declared as,\r\n\t// for example, `<x:sheets/>`, then its `.tagName` will be\r\n\t// \"x:sheets\" instead of just \"sheets\".\r\n\t// https://gitlab.com/catamphetamine/read-excel-file/-/issues/25\r\n\t// Its not clear how to tell it to ignore any namespaces\r\n\t// when getting `.tagName`, so just replacing anything\r\n\t// before a colon, if any.\r\n\treturn element.tagName.replace(NAMESPACE_REG_EXP, '')\r\n}\r\n\r\nexport function isElement(node) {\r\n\t// `nodeType: 1` means \"Element\".\r\n\t// https://www.w3schools.com/xml/prop_element_nodetype.asp\r\n\treturn node.nodeType === 1\r\n}\r\n\r\nexport function getFirstElementChild(element) {\r\n let i = 0\r\n while (i < element.childNodes.length) {\r\n \tif (isElement(element.childNodes[i])) {\r\n\t\t\treturn element.childNodes[i]\r\n\t\t}\r\n i++\r\n }\r\n}\r\n\r\n// This function is only used for occasional debug messages.\r\nexport function getOuterXml(node) {\r\n\t// `nodeType: 1` means \"Element\".\r\n\t// https://www.w3schools.com/xml/prop_element_nodetype.asp\r\n\tif (node.nodeType !== 1) {\r\n\t\treturn node.textContent\r\n\t}\r\n\r\n let xml = '<' + getTagName(node)\r\n\r\n let j = 0\r\n while (j < node.attributes.length) {\r\n xml += ' ' + node.attributes[j].name + '=' + '\"' + node.attributes[j].value + '\"'\r\n j++\r\n }\r\n\r\n xml += '>'\r\n\r\n let i = 0\r\n while (i < node.childNodes.length) {\r\n \txml += getOuterXml(node.childNodes[i])\r\n i++\r\n }\r\n\r\n xml += '</' + getTagName(node) + '>'\r\n\r\n return xml\r\n}"],"mappings":"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"}
1
+ {"version":3,"file":"dom.js","names":["findChild","node","tagName","i","childNodes","length","childNode","nodeType","getTagName","findChildren","results","push","forEach","func","map","NAMESPACE_REG_EXP","element","replace","isElement","getFirstElementChild","getOuterXml","textContent","xml","j","attributes","name","value"],"sources":["../../source/xml/dom.js"],"sourcesContent":["export function findChild(node, tagName) {\r\n\tlet i = 0\r\n\twhile (i < node.childNodes.length) {\r\n\t\tconst childNode = node.childNodes[i]\r\n\t\t// `nodeType: 1` means \"Element\".\r\n\t\t// https://www.w3schools.com/xml/prop_element_nodetype.asp\r\n\t\tif (childNode.nodeType === 1 && getTagName(childNode) === tagName) {\r\n\t\t\treturn childNode\r\n\t\t}\r\n\t\ti++\r\n\t}\r\n}\r\n\r\nexport function findChildren(node, tagName) {\r\n\tconst results = []\r\n\tlet i = 0\r\n\twhile (i < node.childNodes.length) {\r\n\t\tconst childNode = node.childNodes[i]\r\n\t\t// `nodeType: 1` means \"Element\".\r\n\t\t// https://www.w3schools.com/xml/prop_element_nodetype.asp\r\n\t\tif (childNode.nodeType === 1 && getTagName(childNode) === tagName) {\r\n\t\t\tresults.push(childNode)\r\n\t\t}\r\n\t\ti++\r\n\t}\r\n\treturn results\r\n}\r\n\r\nexport function forEach(node, tagName, func) {\r\n\t// if (typeof tagName === 'function') {\r\n\t// \tfunc = tagName\r\n\t// \ttagName = undefined\r\n\t// }\r\n\tlet i = 0\r\n\twhile (i < node.childNodes.length) {\r\n\t\tconst childNode = node.childNodes[i]\r\n\t\tif (tagName) {\r\n\t\t\t// `nodeType: 1` means \"Element\".\r\n\t\t\t// https://www.w3schools.com/xml/prop_element_nodetype.asp\r\n\t\t\tif (childNode.nodeType === 1 && getTagName(childNode) === tagName) {\r\n\t\t\t\tfunc(childNode, i)\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tfunc(childNode, i)\r\n\t\t}\r\n\t\ti++\r\n\t}\r\n}\r\n\r\nexport function map(node, tagName, func) {\r\n\tconst results = []\r\n\tforEach(node, tagName, (node, i) => {\r\n\t\tresults.push(func(node, i))\r\n\t})\r\n\treturn results\r\n}\r\n\r\nconst NAMESPACE_REG_EXP = /.+\\:/\r\nexport function getTagName(element) {\r\n\t// For some weird reason, if an element is declared as,\r\n\t// for example, `<x:sheets/>`, then its `.tagName` will be\r\n\t// \"x:sheets\" instead of just \"sheets\".\r\n\t// https://gitlab.com/catamphetamine/read-excel-file/-/issues/25\r\n\t// Its not clear how to tell it to ignore any namespaces\r\n\t// when getting `.tagName`, so just replacing anything\r\n\t// before a colon, if any.\r\n\treturn element.tagName.replace(NAMESPACE_REG_EXP, '')\r\n}\r\n\r\nexport function isElement(node) {\r\n\t// `nodeType: 1` means \"Element\".\r\n\t// https://www.w3schools.com/xml/prop_element_nodetype.asp\r\n\treturn node.nodeType === 1\r\n}\r\n\r\nexport function getFirstElementChild(element) {\r\n let i = 0\r\n while (i < element.childNodes.length) {\r\n \tif (isElement(element.childNodes[i])) {\r\n\t\t\treturn element.childNodes[i]\r\n\t\t}\r\n i++\r\n }\r\n}\r\n\r\n// This function was only used for occasional debug messages during development.\r\n// It's not used in the actual code.\r\nexport function getOuterXml(node) {\r\n\t// `nodeType: 1` means \"Element\".\r\n\t// https://www.w3schools.com/xml/prop_element_nodetype.asp\r\n\tif (node.nodeType !== 1) {\r\n\t\treturn node.textContent\r\n\t}\r\n\r\n let xml = '<' + getTagName(node)\r\n\r\n let j = 0\r\n while (j < node.attributes.length) {\r\n xml += ' ' + node.attributes[j].name + '=' + '\"' + node.attributes[j].value + '\"'\r\n j++\r\n }\r\n\r\n xml += '>'\r\n\r\n let i = 0\r\n while (i < node.childNodes.length) {\r\n \txml += getOuterXml(node.childNodes[i])\r\n i++\r\n }\r\n\r\n xml += '</' + getTagName(node) + '>'\r\n\r\n return xml\r\n}"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "default", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _parseXmlStreamSaxen["default"];
10
+ }
11
+ });
12
+ var _parseXmlStreamSaxen = _interopRequireDefault(require("./parseXmlStream.saxen.js"));
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
14
+ //# sourceMappingURL=parseXmlStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseXmlStream.js","names":["_parseXmlStreamSaxen","_interopRequireDefault","require","obj","__esModule"],"sources":["../../source/xml/parseXmlStream.js"],"sourcesContent":["// Currently there're 2 XML stream parser implementations:\r\n// * `sax` — The \"classic\" one. Supports Node.js streams.\r\n// * `saxen` — The small and fast one.\r\n//\r\n// `sax` has been around for a long time, and is written by a well-known developer,\r\n// but it performance is very subpar compared to `saxen`: reading a `10 MB` `.xlsx` file\r\n// with `sax` is about `1.4` secs while with `saxen` it's about `0.3` secs,\r\n// meaning that `saxen` is light-years ahead of `sax` in terms of performance.\r\n//\r\n// `sax` has an advantage of parsing XML from a Node.js stream rather than from just a `string`,\r\n// but the weird part is that when enabled, \"streaming\" mode results in significantly slower parsing:\r\n// about `3.1` secs. in \"streaming\" mode vs about `1.4` secs. in non-\"streaming\" mode.\r\n//\r\n// `sax` \"bundled\" size is `22.5 kB` (`8.1 kB` gzipped).\r\n// `saxen` \"bundled\" size is `6.15 kB` (`2.7 kB` gzipped).\r\n//\r\nexport { default as default } from './parseXmlStream.saxen.js'"],"mappings":";;;;;;;;;;;AAgBA,IAAAA,oBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA8D,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,gBAAAA,GAAA"}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = parseXmlStream;
7
+ var _nodeStream = require("node:stream");
8
+ var _sax = _interopRequireDefault(require("sax"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10
+ // For some strange reason, using "streaming" mode results in
11
+ // quite a dramatic drop in performance.
12
+ // For example, reading a `10 MB` `.xlsx` file in "streaming" mode is about `3.1` secs.
13
+ // while in non-"streaming" mode it's about `1.4` secs.
14
+ // Because of such strange performance issue, "streaming" mode is turned off.
15
+ var STREAMING_MODE = false;
16
+ function parseXmlStream(xml, _ref) {
17
+ var createInitialState = _ref.createInitialState,
18
+ onOpenTag = _ref.onOpenTag,
19
+ onCloseTag = _ref.onCloseTag,
20
+ onText = _ref.onText;
21
+ return new Promise(function (resolve, reject) {
22
+ var errored = false;
23
+ var strict = true;
24
+ var xmlns = true;
25
+ var parserOptions = {
26
+ lowercase: true,
27
+ xmlns: xmlns
28
+ };
29
+ var prefixedTagNameToUnprefixedTagName = {};
30
+ var state = createInitialState();
31
+
32
+ // an error happened.
33
+ var onerror = function onerror(error) {
34
+ if (errored) {
35
+ return;
36
+ }
37
+ errored = true;
38
+ reject(error);
39
+ };
40
+
41
+ // got some text. `text` is the string of text.
42
+ var ontext = function ontext(text) {
43
+ if (onText) {
44
+ onText(text, state);
45
+ }
46
+ };
47
+
48
+ // opened a tag. `node` has "name" and "attributes"
49
+ var onopentag = function onopentag(node) {
50
+ if (onOpenTag) {
51
+ if (xmlns) {
52
+ prefixedTagNameToUnprefixedTagName[node.name] = node.local;
53
+ }
54
+ onOpenTag(xmlns ? node.local : node.name, xmlns ? getAttributesWithoutXmlnsPrefixes(node.attributes) : node.attributes, state);
55
+ }
56
+ };
57
+
58
+ // closed a tag.
59
+ var onclosetag = function onclosetag(name) {
60
+ if (onCloseTag) {
61
+ var tagName = xmlns ? prefixedTagNameToUnprefixedTagName[name] : name;
62
+ if (xmlns && !tagName) {
63
+ throw new Error("Unknown closing tag: ".concat(name));
64
+ }
65
+ onCloseTag(tagName, state);
66
+ }
67
+ };
68
+
69
+ // an attribute. `attribute` has "name" and "value"
70
+ var onattribute = function onattribute(attribute) {
71
+ // const name = xmlns ? attribute.local : attribute.name
72
+ // const value = attribute.value
73
+ };
74
+
75
+ // parser stream is done, and ready to have more stuff written to it.
76
+ var onend = function onend() {
77
+ if (errored) {
78
+ return;
79
+ }
80
+ resolve(state);
81
+ };
82
+ if (STREAMING_MODE) {
83
+ var parser = _sax["default"].createStream(strict, parserOptions);
84
+ parser.on('error', onerror);
85
+ parser.on('text', ontext);
86
+ parser.on('opentag', onopentag);
87
+ parser.on('closetag', onclosetag);
88
+ parser.on('attribute', onattribute);
89
+ parser.on('end', onend);
90
+ _nodeStream.Readable.from(xml).pipe(parser);
91
+ } else {
92
+ var _parser = _sax["default"].parser(strict, parserOptions);
93
+ _parser.onerror = onerror;
94
+ _parser.ontext = ontext;
95
+ _parser.onopentag = onopentag;
96
+ _parser.onclosetag = onclosetag;
97
+ _parser.onattribute = onattribute;
98
+ _parser.onend = onend;
99
+ _parser.write(xml).end();
100
+ }
101
+ });
102
+ }
103
+ function getAttributesWithoutXmlnsPrefixes(attributes) {
104
+ return Object.keys(attributes).reduce(function (attributesWithoutPrefixes, nameWithPrefix) {
105
+ attributesWithoutPrefixes[attributes[nameWithPrefix].local] = attributes[nameWithPrefix].value;
106
+ return attributesWithoutPrefixes;
107
+ }, {});
108
+ }
109
+ //# sourceMappingURL=parseXmlStream.sax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseXmlStream.sax.js","names":["_nodeStream","require","_sax","_interopRequireDefault","obj","__esModule","STREAMING_MODE","parseXmlStream","xml","_ref","createInitialState","onOpenTag","onCloseTag","onText","Promise","resolve","reject","errored","strict","xmlns","parserOptions","lowercase","prefixedTagNameToUnprefixedTagName","state","onerror","error","ontext","text","onopentag","node","name","local","getAttributesWithoutXmlnsPrefixes","attributes","onclosetag","tagName","Error","concat","onattribute","attribute","onend","parser","sax","createStream","on","Readable","from","pipe","write","end","Object","keys","reduce","attributesWithoutPrefixes","nameWithPrefix","value"],"sources":["../../source/xml/parseXmlStream.sax.js"],"sourcesContent":["import { Readable } from 'node:stream'\r\n\r\nimport sax from 'sax'\r\n\r\n// For some strange reason, using \"streaming\" mode results in\r\n// quite a dramatic drop in performance.\r\n// For example, reading a `10 MB` `.xlsx` file in \"streaming\" mode is about `3.1` secs.\r\n// while in non-\"streaming\" mode it's about `1.4` secs.\r\n// Because of such strange performance issue, \"streaming\" mode is turned off.\r\nconst STREAMING_MODE = false\r\n\r\nexport default function parseXmlStream(xml, {\r\n\tcreateInitialState,\r\n\tonOpenTag,\r\n\tonCloseTag,\r\n\tonText\r\n}) {\r\n\treturn new Promise((resolve, reject) => {\r\n\t\tlet errored = false\r\n\r\n\t\tconst strict = true\r\n\t\tconst xmlns = true\r\n\t\tconst parserOptions = { lowercase: true, xmlns }\r\n\r\n\t\tconst prefixedTagNameToUnprefixedTagName = {}\r\n\t\tconst state = createInitialState()\r\n\r\n\t\t// an error happened.\r\n\t\tconst onerror = (error) => {\r\n\t\t\tif (errored) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\t\t\terrored = true\r\n\t\t\treject(error)\r\n\t\t}\r\n\r\n\t\t// got some text. `text` is the string of text.\r\n\t\tconst ontext = (text) => {\r\n\t\t\tif (onText) {\r\n\t\t\t\tonText(text, state)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// opened a tag. `node` has \"name\" and \"attributes\"\r\n\t\tconst onopentag = (node) => {\r\n\t\t\tif (onOpenTag) {\r\n\t\t\t\tif (xmlns) {\r\n\t\t\t\t\tprefixedTagNameToUnprefixedTagName[node.name] = node.local\r\n\t\t\t\t}\r\n\t\t\t\tonOpenTag(\r\n\t\t\t\t\txmlns ? node.local : node.name,\r\n\t\t\t\t\txmlns ? getAttributesWithoutXmlnsPrefixes(node.attributes) : node.attributes,\r\n\t\t\t\t\tstate\r\n\t\t\t\t)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// closed a tag.\r\n\t\tconst onclosetag = (name) => {\r\n\t\t\tif (onCloseTag) {\r\n\t\t\t\tconst tagName = xmlns ? prefixedTagNameToUnprefixedTagName[name] : name\r\n\t\t\t\tif (xmlns && !tagName) {\r\n\t\t\t\t\tthrow new Error(`Unknown closing tag: ${name}`)\r\n\t\t\t\t}\r\n\t\t\t\tonCloseTag(tagName, state)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// an attribute. `attribute` has \"name\" and \"value\"\r\n\t\tconst onattribute = (attribute) => {\r\n\t\t\t// const name = xmlns ? attribute.local : attribute.name\r\n\t\t\t// const value = attribute.value\r\n\t\t}\r\n\r\n\t\t// parser stream is done, and ready to have more stuff written to it.\r\n\t\tconst onend = () => {\r\n\t\t\tif (errored) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\t\t\tresolve(state)\r\n\t\t}\r\n\r\n\t\tif (STREAMING_MODE) {\r\n\t\t\tconst parser = sax.createStream(strict, parserOptions)\r\n\t\t\tparser.on('error', onerror)\r\n\t\t\tparser.on('text', ontext)\r\n\t\t\tparser.on('opentag', onopentag)\r\n\t\t\tparser.on('closetag', onclosetag)\r\n\t\t\tparser.on('attribute', onattribute)\r\n\t\t\tparser.on('end', onend)\r\n\t\t\tReadable.from(xml).pipe(parser)\r\n\t\t} else {\r\n\t\t\tconst parser = sax.parser(strict, parserOptions)\r\n\t\t\tparser.onerror = onerror\r\n\t\t\tparser.ontext = ontext\r\n\t\t\tparser.onopentag = onopentag\r\n\t\t\tparser.onclosetag = onclosetag\r\n\t\t\tparser.onattribute = onattribute\r\n\t\t\tparser.onend = onend\r\n\t\t\tparser.write(xml).end()\r\n\t\t}\r\n\t})\r\n}\r\n\r\nfunction getAttributesWithoutXmlnsPrefixes(attributes) {\r\n return Object.keys(attributes).reduce((attributesWithoutPrefixes, nameWithPrefix) => {\r\n attributesWithoutPrefixes[attributes[nameWithPrefix].local] = attributes[nameWithPrefix].value\r\n return attributesWithoutPrefixes\r\n }, {})\r\n}"],"mappings":"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"}