read-excel-file 9.1.1 → 9.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/.gitlab-ci.yml +1 -1
  2. package/CHANGELOG.md +14 -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 +338 -0
  87. package/commonjs/zip/unzipFromStream.fflate.js.map +1 -0
  88. package/commonjs/zip/unzipFromStream.js +8 -200
  89. package/commonjs/zip/unzipFromStream.js.map +1 -1
  90. package/commonjs/zip/unzipFromStream.unzipper.js +138 -0
  91. package/commonjs/zip/unzipFromStream.unzipper.js.map +1 -0
  92. package/modules/export/convertValuesFromUint8ArraysToStrings.js +2 -0
  93. package/modules/export/convertValuesFromUint8ArraysToStrings.js.map +1 -1
  94. package/modules/export/parseSheet.js +12 -9
  95. package/modules/export/parseSheet.js.map +1 -1
  96. package/modules/export/readSheetBrowser.js +5 -2
  97. package/modules/export/readSheetBrowser.js.map +1 -1
  98. package/modules/export/readSheetNode.js +5 -2
  99. package/modules/export/readSheetNode.js.map +1 -1
  100. package/modules/export/readSheetUniversal.js +14 -2
  101. package/modules/export/readSheetUniversal.js.map +1 -1
  102. package/modules/export/readSheetWebWorker.js +12 -2
  103. package/modules/export/readSheetWebWorker.js.map +1 -1
  104. package/modules/export/readXlsxFileBrowser.js +5 -2
  105. package/modules/export/readXlsxFileBrowser.js.map +1 -1
  106. package/modules/export/readXlsxFileNode.js +5 -2
  107. package/modules/export/readXlsxFileNode.js.map +1 -1
  108. package/modules/export/readXlsxFileUniversal.js +14 -2
  109. package/modules/export/readXlsxFileUniversal.js.map +1 -1
  110. package/modules/export/readXlsxFileWebWorker.js +12 -2
  111. package/modules/export/readXlsxFileWebWorker.js.map +1 -1
  112. package/modules/export/unpackXlsxFileBrowser.js +26 -6
  113. package/modules/export/unpackXlsxFileBrowser.js.map +1 -1
  114. package/modules/export/unpackXlsxFileNode.js +3 -0
  115. package/modules/export/unpackXlsxFileNode.js.map +1 -1
  116. package/modules/export/unpackXlsxFileUniversal.js +3 -0
  117. package/modules/export/unpackXlsxFileUniversal.js.map +1 -1
  118. package/modules/export/unpackXlsxFileWebWorker.js +6 -0
  119. package/modules/export/unpackXlsxFileWebWorker.js.map +1 -0
  120. package/modules/parseSheetData/parseSheetData.js +4 -4
  121. package/modules/parseSheetData/parseSheetData.js.map +1 -1
  122. package/modules/utility/checkpoint.js +25 -0
  123. package/modules/utility/checkpoint.js.map +1 -0
  124. package/modules/utility/isObject.js +9 -0
  125. package/modules/utility/isObject.js.map +1 -0
  126. package/modules/utility/isPromise.js +12 -0
  127. package/modules/utility/isPromise.js.map +1 -0
  128. package/modules/xlsx/convertCellsToData2dArray.js +0 -3
  129. package/modules/xlsx/convertCellsToData2dArray.js.map +1 -1
  130. package/modules/xlsx/isDateFormatStyle.js +2 -2
  131. package/modules/xlsx/isDateFormatStyle.js.map +1 -1
  132. package/modules/xlsx/parseCell.js +85 -24
  133. package/modules/xlsx/parseCell.js.map +1 -1
  134. package/{commonjs/xlsx/parseCellCoordinates.js → modules/xlsx/parseCellAddress.js} +12 -13
  135. package/modules/xlsx/parseCellAddress.js.map +1 -0
  136. package/modules/xlsx/parseCellValue.js +7 -23
  137. package/modules/xlsx/parseCellValue.js.map +1 -1
  138. package/modules/xlsx/parseFilePaths.js +31 -33
  139. package/modules/xlsx/parseFilePaths.js.map +1 -1
  140. package/modules/xlsx/parseNumber.js +14 -0
  141. package/modules/xlsx/parseNumber.js.map +1 -0
  142. package/modules/xlsx/parseSharedString.js +55 -0
  143. package/modules/xlsx/parseSharedString.js.map +1 -0
  144. package/modules/xlsx/parseSharedStrings.js +46 -5
  145. package/modules/xlsx/parseSharedStrings.js.map +1 -1
  146. package/modules/xlsx/parseSheet.js +91 -9
  147. package/modules/xlsx/parseSheet.js.map +1 -1
  148. package/modules/xlsx/parseSheetData.js +55 -0
  149. package/modules/xlsx/parseSheetData.js.map +1 -0
  150. package/modules/xlsx/parseSpreadsheetContents.js +242 -43
  151. package/modules/xlsx/parseSpreadsheetContents.js.map +1 -1
  152. package/modules/xlsx/parseSpreadsheetInfo.js +67 -37
  153. package/modules/xlsx/parseSpreadsheetInfo.js.map +1 -1
  154. package/modules/xlsx/parseStyles.js +88 -36
  155. package/modules/xlsx/parseStyles.js.map +1 -1
  156. package/modules/xml/dom.js +2 -1
  157. package/modules/xml/dom.js.map +1 -1
  158. package/modules/xml/parseXmlStream.js +18 -0
  159. package/modules/xml/parseXmlStream.js.map +1 -0
  160. package/modules/xml/parseXmlStream.sax.js +103 -0
  161. package/modules/xml/parseXmlStream.sax.js.map +1 -0
  162. package/modules/xml/parseXmlStream.saxen.code.js +947 -0
  163. package/modules/xml/parseXmlStream.saxen.code.js.map +1 -0
  164. package/modules/xml/parseXmlStream.saxen.js +79 -0
  165. package/modules/xml/parseXmlStream.saxen.js.map +1 -0
  166. package/modules/xml/xlsx.js +72 -36
  167. package/modules/xml/xlsx.js.map +1 -1
  168. package/modules/zip/unzipFromArrayBuffer.js +5 -14
  169. package/modules/zip/unzipFromArrayBuffer.js.map +1 -1
  170. package/modules/zip/unzipFromStream.fflate.js +336 -0
  171. package/modules/zip/unzipFromStream.fflate.js.map +1 -0
  172. package/modules/zip/unzipFromStream.js +55 -187
  173. package/modules/zip/unzipFromStream.js.map +1 -1
  174. package/modules/zip/unzipFromStream.unzipper.js +133 -0
  175. package/modules/zip/unzipFromStream.unzipper.js.map +1 -0
  176. package/package.json +12 -32
  177. package/commonjs/xlsx/parseCellCoordinates.js.map +0 -1
  178. package/commonjs/xlsx/parseCells.js +0 -34
  179. package/commonjs/xlsx/parseCells.js.map +0 -1
  180. package/commonjs/xlsx/parseSheetDimensions.js +0 -43
  181. package/commonjs/xlsx/parseSheetDimensions.js.map +0 -1
  182. package/commonjs/xml/xml.js +0 -13
  183. package/commonjs/xml/xml.js.map +0 -1
  184. package/commonjs/xml/xmlBrowser.js +0 -17
  185. package/commonjs/xml/xmlBrowser.js.map +0 -1
  186. package/commonjs/xml/xpath/xlsx-xpath.js +0 -92
  187. package/commonjs/xml/xpath/xlsx-xpath.js.map +0 -1
  188. package/commonjs/xml/xpath/xpathBrowser.js +0 -33
  189. package/commonjs/xml/xpath/xpathBrowser.js.map +0 -1
  190. package/commonjs/xml/xpath/xpathNode.js +0 -16
  191. package/commonjs/xml/xpath/xpathNode.js.map +0 -1
  192. package/modules/xlsx/parseCellCoordinates.js.map +0 -1
  193. package/modules/xlsx/parseCells.js +0 -27
  194. package/modules/xlsx/parseCells.js.map +0 -1
  195. package/modules/xlsx/parseSheetDimensions.js +0 -37
  196. package/modules/xlsx/parseSheetDimensions.js.map +0 -1
  197. package/modules/xml/xml.js +0 -7
  198. package/modules/xml/xml.js.map +0 -1
  199. package/modules/xml/xmlBrowser.js +0 -11
  200. package/modules/xml/xmlBrowser.js.map +0 -1
  201. package/modules/xml/xpath/xlsx-xpath.js +0 -73
  202. package/modules/xml/xpath/xlsx-xpath.js.map +0 -1
  203. package/modules/xml/xpath/xpathBrowser.js +0 -27
  204. package/modules/xml/xpath/xpathBrowser.js.map +0 -1
  205. package/modules/xml/xpath/xpathNode.js +0 -9
  206. package/modules/xml/xpath/xpathNode.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"parseSpreadsheetContents.js","names":["parseSpreadsheetInfo","parseFilePaths","parseStyles","parseSharedStrings","parseSheet","parseSpreadsheetContents","contents","xml","options","arguments","length","undefined","getFileContent","filePath","Error","concat","filePaths","sharedStrings","styles","_parseSpreadsheetInfo","sheets","epoch1904","sheetIdsToRead","map","sheet","getSheetId","sheetsData","_i","_Object$keys","Object","keys","sheetId","includes","push","getSheetNameById","data","_iterator","_createForOfIteratorHelperLoose","_step","done","_sheet","value","name","relationId","_ref","join","_iterator2","_step2"],"sources":["../../source/xlsx/parseSpreadsheetContents.js"],"sourcesContent":["import parseSpreadsheetInfo from './parseSpreadsheetInfo.js'\r\nimport parseFilePaths from './parseFilePaths.js'\r\nimport parseStyles from './parseStyles.js'\r\nimport parseSharedStrings from './parseSharedStrings.js'\r\nimport parseSheet from './parseSheet.js'\r\n\r\n// For an introduction in reading `.xlsx` files see \"The minimum viable XLSX reader\":\r\n// https://www.brendanlong.com/the-minimum-viable-xlsx-reader.html\r\n\r\n/**\r\n * Reads data from an `.xlsx` file.\r\n * @param {Record<string,string>} contents - A map of `.xml` files inside the `.xlsx` file (which itself is just a zipped directory).\r\n * @param {object} xml — An object having a single property — `createDocument(string)` function.\r\n * @param {object} [options]\r\n * @return {Sheet[]}\r\n */\r\nexport default function parseSpreadsheetContents(contents, xml, options = {}) {\r\n const getFileContent = (filePath) => {\r\n if (!contents[filePath]) {\r\n throw new Error(`\"${filePath}\" file not found inside the *.xlsx file zip archive`)\r\n }\r\n return contents[filePath]\r\n }\r\n\r\n // Read the paths to certain files inside the `.xlsx` file, which is itself just a `.zip` archive.\r\n // These paths aren't standardized between different spreadsheet editors.\r\n // https://github.com/tidyverse/readxl/issues/104\r\n const filePaths = parseFilePaths(getFileContent('xl/_rels/workbook.xml.rels'), xml)\r\n\r\n // The usual file path for \"shared strings\" is \"xl/sharedStrings.xml\".\r\n const sharedStrings = filePaths.sharedStrings\r\n ? parseSharedStrings(getFileContent(filePaths.sharedStrings), xml)\r\n : []\r\n\r\n // The usual file path for \"styles\" is \"xl/styles.xml\".\r\n const styles = filePaths.styles\r\n ? parseStyles(getFileContent(filePaths.styles), xml)\r\n : {}\r\n\r\n const { sheets, epoch1904 } = parseSpreadsheetInfo(getFileContent('xl/workbook.xml'), xml)\r\n\r\n const sheetIdsToRead = options.sheets && options.sheets.map(sheet => getSheetId(sheet, sheets))\r\n\r\n // Parse sheets data.\r\n\r\n const sheetsData = []\r\n\r\n for (const sheetId of Object.keys(filePaths.sheets)) {\r\n if (sheetIdsToRead && !sheetIdsToRead.includes(sheetId)) {\r\n continue\r\n }\r\n\r\n sheetsData.push({\r\n sheet: getSheetNameById(sheetId, sheets),\r\n data: parseSheet(\r\n getFileContent(filePaths.sheets[sheetId]),\r\n xml,\r\n sharedStrings,\r\n styles,\r\n epoch1904,\r\n options\r\n )\r\n })\r\n }\r\n\r\n // Return spreadsheet data.\r\n return sheetsData\r\n}\r\n\r\nfunction getSheetId(sheet, sheets) {\r\n if (typeof sheet === 'string') {\r\n for (const _sheet of sheets) {\r\n if (_sheet.name === sheet) {\r\n return _sheet.relationId\r\n }\r\n }\r\n\t\tthrow new Error(`Sheet \"${sheet}\" not found. Available sheets: ${sheets.map(({ name }) => `\"${name}\"`).join(', ')}`)\r\n } else {\r\n\t\tif (sheet <= sheets.length) {\r\n return sheets[sheet - 1].relationId\r\n }\r\n throw new Error(`Sheet number out of bounds: ${sheet}. Available sheets count: ${sheets.length}`)\r\n }\r\n}\r\n\r\nfunction getSheetNameById(sheetId, sheets) {\r\n for (const sheet of sheets) {\r\n if (sheet.relationId === sheetId) {\r\n return sheet.name\r\n }\r\n }\r\n throw new Error(`Sheet ID not found: ${sheetId}`)\r\n}"],"mappings":"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"}
1
+ {"version":3,"file":"parseSpreadsheetContents.js","names":["parseSpreadsheetInfo","parseFilePaths","parseStyles","parseSharedStrings","parseSheet","parseNumberDefault","checkpoint","latestCheckpointTimestamp","isPromise","parseSpreadsheetContents","parseXmlStream","contents","options","arguments","length","undefined","readFiles","getXmlFilesAtFixedPaths","then","_ref","spreadsheetInfo","filePaths","getXmlFilesAtNonFixedPaths","_ref2","sharedStrings","styles","sheetRelationIdsToRead","sheets","map","sheet","getSheetRelationId","_","relationId","concat","getSheetDataXmlFiles","epoch1904","sheetsData","sheetRelationId","getSheetNameByRelationId","data","parseSpreadsheetContentsInWorker","createWorkerFunction","parseNumber","_objectSpread","_options","optionsJson","_objectWithoutProperties","_excluded","workerFn","addDependencies","callOnce","_iterator","_createForOfIteratorHelperLoose","_step","done","_sheet","value","name","Error","_ref3","join","_iterator2","_step2","parse","_ref4","_defineProperty","fallback","sheetDataParserParameters","Object","keys","filter","includes","reduce","filesInfo","content","results","_loop","filePath","_Object$keys","_i","fileInfo","promises","_loop2","_Object$keys2","_i2","push","result","Promise","all"],"sources":["../../source/xlsx/parseSpreadsheetContents.js"],"sourcesContent":["import parseSpreadsheetInfo from './parseSpreadsheetInfo.js'\r\nimport parseFilePaths from './parseFilePaths.js'\r\nimport parseStyles from './parseStyles.js'\r\nimport parseSharedStrings from './parseSharedStrings.js'\r\nimport parseSheet from './parseSheet.js'\r\nimport parseNumberDefault from './parseNumber.js'\r\n\r\nimport checkpoint, { latestCheckpointTimestamp } from '../utility/checkpoint.js'\r\nimport isPromise from '../utility/isPromise.js'\r\n\r\n// For an introduction in reading `.xlsx` files see \"The minimum viable XLSX reader\":\r\n// https://www.brendanlong.com/the-minimum-viable-xlsx-reader.html\r\n\r\n/**\r\n * Reads data from an `.xlsx` file.\r\n * @param {function} parseXmlStream — SAX XML parser.\r\n * @param {Record<string,string>} contents - A map of `.xml` files inside the `.xlsx` file (which itself is just a zipped directory).\r\n * @param {object} [options]\r\n * @return {Promise<Sheet[]>}\r\n */\r\nfunction parseSpreadsheetContents(parseXmlStream, contents, options = {}) {\r\n // Because of how `.xlsx` file contents are defined in the specification,\r\n // it will have to be read in 3 passes:\r\n // * First pass — read the actual file paths\r\n // * Second pass — read \"shared strings\" and \"styles\"\r\n // * Thirs pass — read the sheets data\r\n\r\n checkpoint('parse spreadsheet info and file paths')\r\n\r\n // Get spreadsheet info and the paths to files.\r\n return readFiles(\r\n getXmlFilesAtFixedPaths(),\r\n contents,\r\n parseXmlStream\r\n ).then(({ spreadsheetInfo, filePaths }) => {\r\n checkpoint('parse \"shared strings\" and \"styles\"')\r\n\r\n // Parse \"shared strings\" and \"styles\".\r\n return readFiles(\r\n getXmlFilesAtNonFixedPaths(filePaths),\r\n contents,\r\n parseXmlStream\r\n ).then(({ sharedStrings, styles }) => {\r\n const sheetRelationIdsToRead = options.sheets\r\n ? options.sheets.map(sheet => getSheetRelationId(sheet, spreadsheetInfo.sheets))\r\n : spreadsheetInfo.sheets.map(_ => _.relationId)\r\n\r\n checkpoint(`parse sheet${sheetRelationIdsToRead.length === 1 ? '' : 's'} data`)\r\n\r\n // Parse sheets data.\r\n return readFiles(\r\n getSheetDataXmlFiles(filePaths, sheetRelationIdsToRead, {\r\n sharedStrings,\r\n styles,\r\n epoch1904: spreadsheetInfo.epoch1904,\r\n options\r\n }),\r\n contents,\r\n parseXmlStream\r\n ).then((sheetsData) => {\r\n checkpoint('end')\r\n // Return sheets data.\r\n return sheetRelationIdsToRead.map((sheetRelationId) => ({\r\n sheet: getSheetNameByRelationId(sheetRelationId, spreadsheetInfo.sheets),\r\n data: sheetsData[sheetRelationId]\r\n }))\r\n })\r\n })\r\n })\r\n}\r\n\r\n/**\r\n * Reads data from an `.xlsx` file in a worker.\r\n * @param {function} [createWorkerFunction] — Creates a worker function.\r\n * @param {function} parseXmlStream — SAX XML parser.\r\n * @param {Record<string,string>} contents - A map of `.xml` files inside the `.xlsx` file (which itself is just a zipped directory).\r\n * @param {object} [options]\r\n * @return {Promise<Sheet[]>}\r\n */\r\nexport default function parseSpreadsheetContentsInWorker(createWorkerFunction, parseXmlStream, contents, options) {\r\n // Assign the default `parseNumber()` function in the `options`.\r\n // The reason is that the worker code requires it to be non-`undefined`.\r\n // Otherwise, it would throw \"parseNumber is not defined\".\r\n if (!(options && options.parseNumber)) {\r\n options = {\r\n ...options,\r\n parseNumber: parseNumberDefault\r\n }\r\n }\r\n\r\n // Using a worker requires specifying all the top-level variables or functions that it uses.\r\n // Currently, that list looks a little bit too long so for now workers aren't used for parsing sheet data.\r\n // See the comment in `createWorkerFunction()` call for more details.\r\n // createWorkerFunction = undefined\r\n\r\n // If the environment doesn't support \"workers\", parse spreadsheet contents \"synchronously\".\r\n // This will \"block\" the main thread while parsing.\r\n if (!createWorkerFunction) {\r\n return parseSpreadsheetContents(parseXmlStream, contents, options)\r\n }\r\n\r\n // Any functions have to be removed from the `options` in order for them to be \"serializable\"\r\n // before sending them to the worker thread.\r\n const { parseNumber, ...optionsJson } = options\r\n\r\n // Create a worker.\r\n const workerFn = createWorkerFunction(\r\n (data) => {\r\n // Reconstruct the `options`.\r\n const options = {\r\n ...data.optionsJson,\r\n parseNumber\r\n }\r\n // Parse sheet data from the `.xml` files.\r\n return parseSpreadsheetContents(parseXmlStream, data.contents, options)\r\n }\r\n )\r\n\r\n workerFn.addDependencies(\r\n // Any \"outside\" dependencies that're referenced in the function (below).\r\n () => [\r\n parseXmlStream,\r\n parseNumber,\r\n parseSpreadsheetContents,\r\n getSheetRelationId,\r\n getSheetNameByRelationId,\r\n getXmlFilesAtFixedPaths,\r\n getXmlFilesAtNonFixedPaths,\r\n getSheetDataXmlFiles,\r\n readFiles,\r\n checkpoint,\r\n latestCheckpointTimestamp,\r\n isPromise,\r\n // parseSheet,\r\n //\r\n // This is not the full list by any means. There's more. Quite a lot more of them.\r\n // It started looking a bit too much so I stopped adding the dependencies here.\r\n // Now I understand why `fflate`'s source code is all written in a single\r\n // multi-thousand-line `index.ts` file. The thing is, once one starts splitting\r\n // the code into modules, they'd have to manually export any top-level variables\r\n // or functions from those modules and import them here in order to specify them\r\n // in the list of dependencies. And even if doing so for every top-level variable\r\n // or function in every imported module doesn't seem like an impossible task,\r\n // imagine someone refactoring the code later and extracting new top-level\r\n // variables or functions. Without 100% code coverage requirement, it won't be caught\r\n // at build time and can only be caught in production, which isn't ideal to say the least.\r\n // So it seems like users of this package will have to just deal with the \"blocking\"\r\n // nature of the sheet data parser, because I won't follow into `fflate`'s steps\r\n // and rewrite this package as a single `index.js` file.\r\n // Users of this package will have to manually put their code in a worker\r\n // in case they'd prefer it to run in a separate thread to prevent \"blocking\"\r\n // the main thread when parsing sheet data.\r\n ]\r\n )\r\n\r\n // Post a message with some data to the worker\r\n // so that it starts processing the data\r\n // and later posts a message back to the main thread\r\n // with the result of the calculation.\r\n return workerFn.callOnce({ optionsJson, contents }) // (optional) add `transferList` argument.\r\n}\r\n\r\nfunction getSheetRelationId(sheet, sheets) {\r\n if (typeof sheet === 'string') {\r\n for (const _sheet of sheets) {\r\n if (_sheet.name === sheet) {\r\n return _sheet.relationId\r\n }\r\n }\r\n\t\tthrow new Error(`Sheet \"${sheet}\" not found. Available sheets: ${sheets.map(({ name }) => `\"${name}\"`).join(', ')}`)\r\n } else {\r\n\t\tif (sheet <= sheets.length) {\r\n return sheets[sheet - 1].relationId\r\n }\r\n throw new Error(`Sheet number out of bounds: ${sheet}. Available sheets count: ${sheets.length}`)\r\n }\r\n}\r\n\r\nfunction getSheetNameByRelationId(sheetRelationId, sheets) {\r\n for (const sheet of sheets) {\r\n if (sheet.relationId === sheetRelationId) {\r\n return sheet.name\r\n }\r\n }\r\n throw new Error(`Sheet relation ID not found: ${sheetRelationId}`)\r\n}\r\n\r\nfunction getXmlFilesAtFixedPaths() {\r\n return {\r\n // Read the paths to certain files inside the `.xlsx` file, which is itself just a `.zip` archive.\r\n // These paths aren't standardized between different spreadsheet editors.\r\n // https://github.com/tidyverse/readxl/issues/104\r\n 'xl/_rels/workbook.xml.rels': {\r\n name: 'filePaths',\r\n parse: parseFilePaths\r\n },\r\n\r\n // General info on the spreadsheet.\r\n 'xl/workbook.xml': {\r\n name: 'spreadsheetInfo',\r\n parse: parseSpreadsheetInfo\r\n }\r\n }\r\n}\r\n\r\nfunction getXmlFilesAtNonFixedPaths(filePaths) {\r\n return {\r\n // The usual file path for \"shared strings\" is \"xl/sharedStrings.xml\".\r\n [filePaths.sharedStrings || 'xl/sharedStrings.xml']: {\r\n name: 'sharedStrings',\r\n // `parseSharedStrings()` returns a `Promise`.\r\n parse: parseSharedStrings,\r\n // It seems that \"sharedStrings.xml\" is not required to exist.\r\n // For example, that could be the case when a spreadsheet doesn't contain any strings.\r\n // https://github.com/catamphetamine/read-excel-file/issues/85\r\n fallback: []\r\n },\r\n\r\n // The usual file path for \"styles\" is \"xl/styles.xml\".\r\n [filePaths.styles || 'xl/styles.xml']: {\r\n name: 'styles',\r\n parse: parseStyles,\r\n fallback: {}\r\n }\r\n }\r\n}\r\n\r\n// Returns the list of sheet data `.xml` files.\r\nfunction getSheetDataXmlFiles(filePaths, sheetRelationIdsToRead, sheetDataParserParameters) {\r\n return Object.keys(filePaths.sheets)\r\n .filter((sheetRelationId) => sheetRelationIdsToRead.includes(sheetRelationId))\r\n .reduce((filesInfo, sheetRelationId) => ({\r\n ...filesInfo,\r\n [filePaths.sheets[sheetRelationId]]: {\r\n name: sheetRelationId,\r\n // `parseSheet()` returns a `Promise`.\r\n parse: (content, parseXmlStream) => parseSheet(content, parseXmlStream, sheetDataParserParameters)\r\n }\r\n }), {})\r\n}\r\n\r\n// In case of converting `.zip` file reader from a \"read-and-return\" one to a \"streaming\" one,\r\n// this function could be modified to process the files as they come rather than all-at-once.\r\n\r\n// Reads files from inside an `.xlsx` archive by file paths.\r\n//\r\n// In case of converting `.zip` file reader from a \"read-and-return\" one to a \"streaming\" one,\r\n// this function could be modified to process the files as they come rather than all-at-once.\r\n//\r\n// But there's a catch: inside an `.xlsx` file, some file paths are not fixed\r\n// and are instead defined in \"xl/_rels/workbook.xml.rels\" file,\r\n// which presents a \"chicken and an egg\" dilemma: how could one possibly\r\n// read an `.xlsx` file in one go when the order of the files inside it isn't fixed\r\n// and could be random. Most likely, in the majority of cases, \"xl/_rels/workbook.xml.rels\"\r\n// file is gonna be one of the first in a given `.xlsx` archive, but still it's not guaranteed.\r\n// A solution would be reading an `.xlsx` file in two passes: one pass would be just to read\r\n// the \"xl/_rels/workbook.xml.rels\" and ignore decompressing anything else,\r\n// and then the second pass would be to read all other files whose paths are now known.\r\n//\r\n// Returns:\r\n// * If none of the `parse()` functions returned a `Promise`, it returns a map of files' contents.\r\n// * If any of the `parse()` functions returned a `Promise`, it returns a `Promise` that resolves to a map of files' contents.\r\n//\r\nfunction readFiles(filesInfo, contents, parseXmlStream) {\r\n // Get files' contents.\r\n const results = {}\r\n for (const filePath of Object.keys(filesInfo)) {\r\n const fileInfo = filesInfo[filePath]\r\n results[fileInfo.name] = contents[filePath] === undefined\r\n ? (\r\n fileInfo.fallback === undefined\r\n ? (() => { throw new Error(`\"${filePath}\" file not found inside the \\`.xlsx\\` file`) })()\r\n : fileInfo.fallback\r\n )\r\n : fileInfo.parse(contents[filePath], parseXmlStream)\r\n }\r\n // Resolve any `Promise`s.\r\n const promises = []\r\n for (const name of Object.keys(results)) {\r\n if (isPromise(results[name])) {\r\n promises.push(results[name].then((result) => {\r\n results[name] = result\r\n }))\r\n }\r\n }\r\n if (promises.length > 0) {\r\n return Promise.all(promises).then(() => results)\r\n }\r\n return results\r\n}"],"mappings":"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"}
@@ -1,42 +1,72 @@
1
- function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
2
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
3
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
4
- import { getWorkbookProperties, getSheets } from '../xml/xlsx.js';
5
-
6
- // I guess `xl/workbook.xml` file should always be present inside the *.xlsx archive.
7
- export default function parseSpreadsheetInfo(content, xml) {
8
- var book = xml.createDocument(content);
9
-
10
- // Read `<workbookPr/>` element to detect whether dates are 1900-based or 1904-based.
11
- // https://support.microsoft.com/en-gb/help/214330/differences-between-the-1900-and-the-1904-date-system-in-excel
12
- // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/workbookPr.html
13
- var workbookProperties = getWorkbookProperties(book);
14
- var epoch1904 = Boolean(workbookProperties) && workbookProperties.getAttribute('date1904') === '1';
15
-
16
- // Example of `<sheets/>` element:
17
- //
18
- // <sheets>
19
- // <sheet
20
- // xmlns:ns="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
21
- // name="Sheet1"
22
- // sheetId="1"
23
- // ns:id="rId3"/>
24
- // </sheets>
25
-
26
- var sheets = [];
27
- for (var _iterator = _createForOfIteratorHelperLoose(getSheets(book)), _step; !(_step = _iterator()).done;) {
28
- var sheet = _step.value;
29
- if (sheet.getAttribute('name')) {
30
- sheets.push({
31
- id: sheet.getAttribute('sheetId'),
32
- name: sheet.getAttribute('name'),
33
- relationId: sheet.getAttribute('r:id')
1
+ /**
2
+ * Parses spreadsheet info.
3
+ * @param {string} content
4
+ * @param {function} parseXmlStream SAX XML parser.
5
+ * @returns {object} An object of shape `{ epoch1904: boolean, sheets: Sheet[] }`.
6
+ */
7
+ export default function parseSpreadsheetInfo(content, parseXmlStream) {
8
+ return parseXmlStream(content, {
9
+ createInitialState: createInitialStateInWorkbookXml,
10
+ onOpenTag: onOpenTagInWorkbookXml
11
+ }).then(function (state) {
12
+ return {
13
+ epoch1904: state.workbookPr ? state.workbookPr.epoch1904 : false,
14
+ sheets: state.sheets
15
+ };
16
+ });
17
+ }
18
+ function createInitialStateInWorkbookXml() {
19
+ return {
20
+ workbookPr: undefined,
21
+ sheets: []
22
+ };
23
+ }
24
+ function onOpenTagInWorkbookXml(tagName, attributes, state) {
25
+ if (tagName === 'workbookPr') {
26
+ // The official Open XML specification dictates that the top-level `<workbook/>` element
27
+ // should only contain exactly one `<workbookPr/>` element. In case of multiple ones,
28
+ // only the first one is being read and the rest are simply ignored.
29
+ //
30
+ // There's a `1904-based-dates.xlsx` test case that happens to include multiple `<workbookPr/>`
31
+ // elements by accident, most likely because I edited its `.xml` files by hand and didn't notice
32
+ // the already-existing `<workbookPr/>` tag.
33
+ //
34
+ // At first I thought about just fixing that one `.xlsx` test file but later
35
+ // I saw that another library called `SheetJS` specifically handles such cases
36
+ // by only reading the first `<workbookPr/>` element and ignoring the rest,
37
+ // so I though that perhaps it would make some sense to do same thing here.
38
+ // https://github.com/SheetJS/sheetjs/issues/1619
39
+ //
40
+ if (!state.workbookPr) {
41
+ // Read `<workbookPr/>` element attributes to detect whether dates are 1900-based or 1904-based.
42
+ // https://support.microsoft.com/en-gb/help/214330/differences-between-the-1900-and-the-1904-date-system-in-excel
43
+ // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/workbookPr.html
44
+ state.workbookPr = {
45
+ epoch1904: attributes.date1904 === '1'
46
+ };
47
+ }
48
+ } else if (tagName === 'sheet') {
49
+ // Example of `<sheets/>` element:
50
+ // ```
51
+ // <sheets>
52
+ // <sheet
53
+ // xmlns:ns="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
54
+ // name="Sheet1"
55
+ // sheetId="1"
56
+ // ns:id="rId3"/>
57
+ // </sheets>
58
+ // ```
59
+ if (attributes.name) {
60
+ state.sheets.push({
61
+ // `sheetId` attribute value is an arbitrary, `1`-based unique positive integer
62
+ // assigned to a worksheet, typically starting at `1` for the first sheet.
63
+ // Deleting and adding new sheets might cause the sheetId values to become non-sequential.
64
+ // For example, `sheetId`s could be `1`, `2`, `4`, if sheet `3` was deleted.
65
+ id: Number(attributes.sheetId),
66
+ name: attributes.name,
67
+ relationId: attributes['r:id']
34
68
  });
35
69
  }
36
70
  }
37
- return {
38
- epoch1904: epoch1904,
39
- sheets: sheets
40
- };
41
71
  }
42
72
  //# sourceMappingURL=parseSpreadsheetInfo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseSpreadsheetInfo.js","names":["getWorkbookProperties","getSheets","parseSpreadsheetInfo","content","xml","book","createDocument","workbookProperties","epoch1904","Boolean","getAttribute","sheets","_iterator","_createForOfIteratorHelperLoose","_step","done","sheet","value","push","id","name","relationId"],"sources":["../../source/xlsx/parseSpreadsheetInfo.js"],"sourcesContent":["import {\r\n getWorkbookProperties,\r\n getSheets\r\n} from '../xml/xlsx.js'\r\n\r\n// I guess `xl/workbook.xml` file should always be present inside the *.xlsx archive.\r\nexport default function parseSpreadsheetInfo(content, xml) {\r\n const book = xml.createDocument(content)\r\n\r\n // Read `<workbookPr/>` element to detect whether dates are 1900-based or 1904-based.\r\n // https://support.microsoft.com/en-gb/help/214330/differences-between-the-1900-and-the-1904-date-system-in-excel\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/workbookPr.html\r\n const workbookProperties = getWorkbookProperties(book)\r\n const epoch1904 = Boolean(workbookProperties) && workbookProperties.getAttribute('date1904') === '1'\r\n\r\n // Example of `<sheets/>` element:\r\n //\r\n // <sheets>\r\n // <sheet\r\n // xmlns:ns=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\r\n // name=\"Sheet1\"\r\n // sheetId=\"1\"\r\n // ns:id=\"rId3\"/>\r\n // </sheets>\r\n\r\n const sheets = []\r\n for (const sheet of getSheets(book)) {\r\n if (sheet.getAttribute('name')) {\r\n sheets.push({\r\n id: sheet.getAttribute('sheetId'),\r\n name: sheet.getAttribute('name'),\r\n relationId: sheet.getAttribute('r:id')\r\n })\r\n }\r\n }\r\n\r\n return {\r\n epoch1904,\r\n sheets\r\n }\r\n}"],"mappings":";;;AAAA,SACEA,qBAAqB,EACrBC,SAAS,QACJ,gBAAgB;;AAEvB;AACA,eAAe,SAASC,oBAAoBA,CAACC,OAAO,EAAEC,GAAG,EAAE;EACzD,IAAMC,IAAI,GAAGD,GAAG,CAACE,cAAc,CAACH,OAAO,CAAC;;EAExC;EACA;EACA;EACA,IAAMI,kBAAkB,GAAGP,qBAAqB,CAACK,IAAI,CAAC;EACtD,IAAMG,SAAS,GAAGC,OAAO,CAACF,kBAAkB,CAAC,IAAIA,kBAAkB,CAACG,YAAY,CAAC,UAAU,CAAC,KAAK,GAAG;;EAEpG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA,IAAMC,MAAM,GAAG,EAAE;EACjB,SAAAC,SAAA,GAAAC,+BAAA,CAAoBZ,SAAS,CAACI,IAAI,CAAC,GAAAS,KAAA,IAAAA,KAAA,GAAAF,SAAA,IAAAG,IAAA,GAAE;IAAA,IAA1BC,KAAK,GAAAF,KAAA,CAAAG,KAAA;IACd,IAAID,KAAK,CAACN,YAAY,CAAC,MAAM,CAAC,EAAE;MAC9BC,MAAM,CAACO,IAAI,CAAC;QACVC,EAAE,EAAEH,KAAK,CAACN,YAAY,CAAC,SAAS,CAAC;QACjCU,IAAI,EAAEJ,KAAK,CAACN,YAAY,CAAC,MAAM,CAAC;QAChCW,UAAU,EAAEL,KAAK,CAACN,YAAY,CAAC,MAAM;MACvC,CAAC,CAAC;IACJ;EACF;EAEA,OAAO;IACLF,SAAS,EAATA,SAAS;IACTG,MAAM,EAANA;EACF,CAAC;AACH"}
1
+ {"version":3,"file":"parseSpreadsheetInfo.js","names":["parseSpreadsheetInfo","content","parseXmlStream","createInitialState","createInitialStateInWorkbookXml","onOpenTag","onOpenTagInWorkbookXml","then","state","epoch1904","workbookPr","sheets","undefined","tagName","attributes","date1904","name","push","id","Number","sheetId","relationId"],"sources":["../../source/xlsx/parseSpreadsheetInfo.js"],"sourcesContent":["/**\r\n * Parses spreadsheet info.\r\n * @param {string} content\r\n * @param {function} parseXmlStream — SAX XML parser.\r\n * @returns {object} An object of shape `{ epoch1904: boolean, sheets: Sheet[] }`.\r\n */\r\nexport default function parseSpreadsheetInfo(content, parseXmlStream) {\r\n return parseXmlStream(content, {\r\n createInitialState: createInitialStateInWorkbookXml,\r\n onOpenTag: onOpenTagInWorkbookXml\r\n }).then((state) => {\r\n return {\r\n epoch1904: state.workbookPr ? state.workbookPr.epoch1904 : false,\r\n sheets: state.sheets\r\n }\r\n })\r\n}\r\n\r\nfunction createInitialStateInWorkbookXml() {\r\n return {\r\n workbookPr: undefined,\r\n sheets: []\r\n }\r\n}\r\n\r\nfunction onOpenTagInWorkbookXml(tagName, attributes, state) {\r\n if (tagName === 'workbookPr') {\r\n // The official Open XML specification dictates that the top-level `<workbook/>` element\r\n // should only contain exactly one `<workbookPr/>` element. In case of multiple ones,\r\n // only the first one is being read and the rest are simply ignored.\r\n //\r\n // There's a `1904-based-dates.xlsx` test case that happens to include multiple `<workbookPr/>`\r\n // elements by accident, most likely because I edited its `.xml` files by hand and didn't notice\r\n // the already-existing `<workbookPr/>` tag.\r\n //\r\n // At first I thought about just fixing that one `.xlsx` test file but later\r\n // I saw that another library called `SheetJS` specifically handles such cases\r\n // by only reading the first `<workbookPr/>` element and ignoring the rest,\r\n // so I though that perhaps it would make some sense to do same thing here.\r\n // https://github.com/SheetJS/sheetjs/issues/1619\r\n //\r\n if (!state.workbookPr) {\r\n // Read `<workbookPr/>` element attributes to detect whether dates are 1900-based or 1904-based.\r\n // https://support.microsoft.com/en-gb/help/214330/differences-between-the-1900-and-the-1904-date-system-in-excel\r\n // http://webapp.docx4java.org/OnlineDemo/ecma376/SpreadsheetML/workbookPr.html\r\n state.workbookPr = {\r\n epoch1904: attributes.date1904 === '1'\r\n }\r\n }\r\n } else if (tagName === 'sheet') {\r\n // Example of `<sheets/>` element:\r\n // ```\r\n // <sheets>\r\n // <sheet\r\n // xmlns:ns=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\r\n // name=\"Sheet1\"\r\n // sheetId=\"1\"\r\n // ns:id=\"rId3\"/>\r\n // </sheets>\r\n // ```\r\n if (attributes.name) {\r\n state.sheets.push({\r\n // `sheetId` attribute value is an arbitrary, `1`-based unique positive integer\r\n // assigned to a worksheet, typically starting at `1` for the first sheet.\r\n // Deleting and adding new sheets might cause the sheetId values to become non-sequential.\r\n // For example, `sheetId`s could be `1`, `2`, `4`, if sheet `3` was deleted.\r\n id: Number(attributes.sheetId),\r\n name: attributes.name,\r\n relationId: attributes['r:id']\r\n })\r\n }\r\n }\r\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASA,oBAAoBA,CAACC,OAAO,EAAEC,cAAc,EAAE;EACpE,OAAOA,cAAc,CAACD,OAAO,EAAE;IAC7BE,kBAAkB,EAAEC,+BAA+B;IACnDC,SAAS,EAAEC;EACb,CAAC,CAAC,CAACC,IAAI,CAAC,UAACC,KAAK,EAAK;IACjB,OAAO;MACLC,SAAS,EAAED,KAAK,CAACE,UAAU,GAAGF,KAAK,CAACE,UAAU,CAACD,SAAS,GAAG,KAAK;MAChEE,MAAM,EAAEH,KAAK,CAACG;IAChB,CAAC;EACH,CAAC,CAAC;AACJ;AAEA,SAASP,+BAA+BA,CAAA,EAAG;EACzC,OAAO;IACLM,UAAU,EAAEE,SAAS;IACrBD,MAAM,EAAE;EACV,CAAC;AACH;AAEA,SAASL,sBAAsBA,CAACO,OAAO,EAAEC,UAAU,EAAEN,KAAK,EAAE;EAC1D,IAAIK,OAAO,KAAK,YAAY,EAAE;IAC5B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,IAAI,CAACL,KAAK,CAACE,UAAU,EAAE;MACrB;MACA;MACA;MACAF,KAAK,CAACE,UAAU,GAAG;QACjBD,SAAS,EAAEK,UAAU,CAACC,QAAQ,KAAK;MACrC,CAAC;IACH;EACF,CAAC,MAAM,IAAIF,OAAO,KAAK,OAAO,EAAE;IAC9B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,IAAIC,UAAU,CAACE,IAAI,EAAE;MACnBR,KAAK,CAACG,MAAM,CAACM,IAAI,CAAC;QAChB;QACA;QACA;QACA;QACAC,EAAE,EAAEC,MAAM,CAACL,UAAU,CAACM,OAAO,CAAC;QAC9BJ,IAAI,EAAEF,UAAU,CAACE,IAAI;QACrBK,UAAU,EAAEP,UAAU,CAAC,MAAM;MAC/B,CAAC,CAAC;IACJ;EACF;AACF"}
@@ -1,56 +1,108 @@
1
1
  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); }
2
+ var _excluded = ["xfId"];
2
3
  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; }
3
4
  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; }
4
5
  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; }
5
6
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
6
7
  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); }
7
- import { getBaseStyles, getCellStyles, getNumberFormats } from '../xml/xlsx.js';
8
-
9
- // http://officeopenxml.com/SSstyles.php
10
- // Returns an array of cell styles.
11
- // A cell style index is its ID.
12
- export default function parseStyles(content, xml) {
13
- if (!content) {
14
- return {};
15
- }
16
-
8
+ 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; }
9
+ 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; }
10
+ /**
11
+ * Parses `.xlsx` file styles.
12
+ * http://officeopenxml.com/SSstyles.php
13
+ * Returns an array of cell styles.
14
+ * A cell style index is the cell style ID.
15
+ * @param {string} content
16
+ * @param {function} parseXmlStream — SAX XML parser.
17
+ * @returns {object} styles
18
+ */
19
+ export default function parseStyles(content, parseXmlStream) {
17
20
  // 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
18
21
  // https://www.office-forums.com/threads/cellxfs-cellstylexfs.2163519/
19
- var doc = xml.createDocument(content);
20
- var baseStyles = getBaseStyles(doc).map(parseCellStyle);
21
- var numberFormats = getNumberFormats(doc).map(parseNumberFormatStyle).reduce(function (formats, format) {
22
- // Format ID is a numeric index.
23
- // There're some standard "built-in" formats (in Excel) up to about `100`.
24
- formats[format.id] = format;
25
- return formats;
26
- }, []);
27
- var getCellStyle = function getCellStyle(xf) {
28
- if (xf.hasAttribute('xfId')) {
29
- return _objectSpread(_objectSpread({}, baseStyles[xf.xfId]), parseCellStyle(xf, numberFormats));
30
- }
31
- return parseCellStyle(xf, numberFormats);
32
- };
33
- return getCellStyles(doc).map(getCellStyle);
22
+ return parseXmlStream(content, {
23
+ createInitialState: createInitialStateInStyles,
24
+ onOpenTag: onOpenTagInStyles,
25
+ onCloseTag: onCloseTagInStyles
26
+ }).then(function (state) {
27
+ return state.styles.map(function (style) {
28
+ if (style.xfId) {
29
+ var xfId = style.xfId,
30
+ styleProperties = _objectWithoutProperties(style, _excluded);
31
+ return _objectSpread(_objectSpread({}, state.baseStyles[xfId]), styleProperties);
32
+ } else {
33
+ return style;
34
+ }
35
+ });
36
+ });
34
37
  }
35
- function parseNumberFormatStyle(numFmt) {
38
+ function createInitialStateInStyles() {
36
39
  return {
37
- id: numFmt.getAttribute('numFmtId'),
38
- template: numFmt.getAttribute('formatCode')
40
+ numberFormats: {},
41
+ baseStyles: [],
42
+ // The first `164` elements of the `styles` array are going to be `undefined`
43
+ // because those represent the built-in "default" styles in `.xlsx` specification.
44
+ // These "default" styles have IDs from `0` to `163`, i.e. according to their index.
45
+ styles: [],
46
+ cellStyleXfs: false,
47
+ cellXfs: false
39
48
  };
40
49
  }
41
-
42
- // http://www.datypic.com/sc/ooxml/e-ssml_xf-2.html
43
- function parseCellStyle(xf, numFmts) {
50
+ function onOpenTagInStyles(tagName, attributes, state) {
51
+ if (tagName === 'numFmt') {
52
+ // `<numFmts/>` element contains `<numFmt/>` elements.
53
+ // `<numFmt/>` defines a "number format" template.
54
+ // The value of `numFmtId` attribute is a (numeric) ID of this "number format".
55
+ state.numberFormats[attributes.numFmtId] = {
56
+ id: Number(attributes.numFmtId),
57
+ template: attributes.formatCode
58
+ };
59
+ } else if (tagName === 'cellStyleXfs') {
60
+ // `<cellStyleXfs/>` contains "base styles" that could be extended by `<cellXfs/>`.
61
+ // These styles don't apply to individual cells directly. They can only be extended.
62
+ state.cellStyleXfs = true;
63
+ } else if (tagName === 'cellXfs') {
64
+ // `<cellXfs/>` contains individual cell styles. They can extend "base styles".
65
+ state.cellXfs = true;
66
+ } else if (tagName === 'xf') {
67
+ if (state.cellStyleXfs) {
68
+ // The index of a `<xf/>` element is by definition its numeric ID.
69
+ // Therefore, even empty `style` elements still must be put into the array.
70
+ state.baseStyles.push(parseCellStyle(attributes));
71
+ } else if (state.cellXfs) {
72
+ var style = parseCellStyle(attributes, state.numberFormats);
73
+ // A style might extend a "base style" by its numeric ID.
74
+ if (attributes.xfId) {
75
+ style.xfId = Number(attributes.xfId);
76
+ }
77
+ // The index of a `<xf/>` element is by definition its numeric ID.
78
+ // Therefore, even empty `style` elements still must be put into the array.
79
+ state.styles.push(style);
80
+ }
81
+ }
82
+ }
83
+ function onCloseTagInStyles(tagName, state) {
84
+ if (tagName === 'cellStyleXfs') {
85
+ state.cellStyleXfs = false;
86
+ } else if (tagName === 'cellXfs') {
87
+ state.cellXfs = false;
88
+ }
89
+ }
90
+ function parseCellStyle(attributes, numberFormats) {
44
91
  var style = {};
45
- if (xf.hasAttribute('numFmtId')) {
46
- var numberFormatId = xf.getAttribute('numFmtId');
92
+ // `numFmtId` in `<cellStyleXfs/>` and `<cellXfs/>` is a numerical ID
93
+ // referencing the cell's "number format". Values from `0` to `163` are built-in formats,
94
+ // while values `164` and above are custom formats defined in the `<numFmts/>` element.
95
+ var numFmtId = attributes.numFmtId;
96
+ if (numFmtId) {
47
97
  // Built-in number formats don't have a `<numFmt/>` element in `styles.xml`.
48
98
  // https://hexdocs.pm/xlsxir/number_styles.html
49
- if (numFmts[numberFormatId]) {
50
- style.numberFormat = numFmts[numberFormatId];
99
+ if (numberFormats && numberFormats[numFmtId]) {
100
+ // Non-built-in number format.
101
+ style.numberFormat = numberFormats[numFmtId];
51
102
  } else {
103
+ // Built-in number format.
52
104
  style.numberFormat = {
53
- id: numberFormatId
105
+ id: Number(numFmtId)
54
106
  };
55
107
  }
56
108
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parseStyles.js","names":["getBaseStyles","getCellStyles","getNumberFormats","parseStyles","content","xml","doc","createDocument","baseStyles","map","parseCellStyle","numberFormats","parseNumberFormatStyle","reduce","formats","format","id","getCellStyle","xf","hasAttribute","_objectSpread","xfId","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":";;;;;;AAAA,SACEA,aAAa,EACbC,aAAa,EACbC,gBAAgB,QACX,gBAAgB;;AAEvB;AACA;AACA;AACA,eAAe,SAASC,WAAWA,CAACC,OAAO,EAAEC,GAAG,EAAE;EAChD,IAAI,CAACD,OAAO,EAAE;IACZ,OAAO,CAAC,CAAC;EACX;;EAEA;EACA;EACA,IAAME,GAAG,GAAGD,GAAG,CAACE,cAAc,CAACH,OAAO,CAAC;EAEvC,IAAMI,UAAU,GAAGR,aAAa,CAACM,GAAG,CAAC,CAClCG,GAAG,CAACC,cAAc,CAAC;EAEtB,IAAMC,aAAa,GAAGT,gBAAgB,CAACI,GAAG,CAAC,CACxCG,GAAG,CAACG,sBAAsB,CAAC,CAC3BC,MAAM,CAAC,UAACC,OAAO,EAAEC,MAAM,EAAK;IAC3B;IACA;IACAD,OAAO,CAACC,MAAM,CAACC,EAAE,CAAC,GAAGD,MAAM;IAC3B,OAAOD,OAAO;EAChB,CAAC,EAAE,EAAE,CAAC;EAER,IAAMG,YAAY,GAAG,SAAfA,YAAYA,CAAIC,EAAE,EAAK;IAC3B,IAAIA,EAAE,CAACC,YAAY,CAAC,MAAM,CAAC,EAAE;MAC3B,OAAAC,aAAA,CAAAA,aAAA,KACKZ,UAAU,CAACU,EAAE,CAACG,IAAI,CAAC,GACnBX,cAAc,CAACQ,EAAE,EAAEP,aAAa,CAAC;IAExC;IACA,OAAOD,cAAc,CAACQ,EAAE,EAAEP,aAAa,CAAC;EAC1C,CAAC;EAED,OAAOV,aAAa,CAACK,GAAG,CAAC,CAACG,GAAG,CAACQ,YAAY,CAAC;AAC7C;AAEA,SAASL,sBAAsBA,CAACU,MAAM,EAAE;EACtC,OAAO;IACLN,EAAE,EAAEM,MAAM,CAACC,YAAY,CAAC,UAAU,CAAC;IACnCC,QAAQ,EAAEF,MAAM,CAACC,YAAY,CAAC,YAAY;EAC5C,CAAC;AACH;;AAEA;AACA,SAASb,cAAcA,CAACQ,EAAE,EAAEO,OAAO,EAAE;EACnC,IAAMC,KAAK,GAAG,CAAC,CAAC;EAChB,IAAIR,EAAE,CAACC,YAAY,CAAC,UAAU,CAAC,EAAE;IAC/B,IAAMQ,cAAc,GAAGT,EAAE,CAACK,YAAY,CAAC,UAAU,CAAC;IAClD;IACA;IACA,IAAIE,OAAO,CAACE,cAAc,CAAC,EAAE;MAC3BD,KAAK,CAACE,YAAY,GAAGH,OAAO,CAACE,cAAc,CAAC;IAC9C,CAAC,MAAM;MACLD,KAAK,CAACE,YAAY,GAAG;QAAEZ,EAAE,EAAEW;MAAe,CAAC;IAC7C;EACF;EACA,OAAOD,KAAK;AACd"}
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":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,SAASA,WAAWA,CAACC,OAAO,EAAEC,cAAc,EAAE;EAC3D;EACA;EACA,OAAOA,cAAc,CAACD,OAAO,EAAE;IAC7BE,kBAAkB,EAAEC,0BAA0B;IAC9CC,SAAS,EAAEC,iBAAiB;IAC5BC,UAAU,EAAEC;EACd,CAAC,CAAC,CAACC,IAAI,CAAC,UAACC,KAAK,EAAK;IACjB,OAAOA,KAAK,CAACC,MAAM,CAACC,GAAG,CAAC,UAACC,KAAK,EAAK;MACjC,IAAIA,KAAK,CAACC,IAAI,EAAE;QACd,IAAQA,IAAI,GAAyBD,KAAK,CAAlCC,IAAI;UAAKC,eAAe,GAAAC,wBAAA,CAAKH,KAAK,EAAAI,SAAA;QAC1C,OAAAC,aAAA,CAAAA,aAAA,KACKR,KAAK,CAACS,UAAU,CAACL,IAAI,CAAC,GACtBC,eAAe;MAEtB,CAAC,MAAM;QACL,OAAOF,KAAK;MACd;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ;AAEA,SAAST,0BAA0BA,CAAA,EAAG;EACpC,OAAO;IACLgB,aAAa,EAAE,CAAC,CAAC;IACjBD,UAAU,EAAE,EAAE;IACd;IACA;IACA;IACAR,MAAM,EAAE,EAAE;IACVU,YAAY,EAAE,KAAK;IACnBC,OAAO,EAAE;EACX,CAAC;AACH;AAEA,SAAShB,iBAAiBA,CAACiB,OAAO,EAAEC,UAAU,EAAEd,KAAK,EAAE;EACrD,IAAIa,OAAO,KAAK,QAAQ,EAAE;IACxB;IACA;IACA;IACAb,KAAK,CAACU,aAAa,CAACI,UAAU,CAACC,QAAQ,CAAC,GAAG;MACzCC,EAAE,EAAEC,MAAM,CAACH,UAAU,CAACC,QAAQ,CAAC;MAC/BG,QAAQ,EAAEJ,UAAU,CAACK;IACvB,CAAC;EACH,CAAC,MAAM,IAAIN,OAAO,KAAK,cAAc,EAAE;IACrC;IACA;IACAb,KAAK,CAACW,YAAY,GAAG,IAAI;EAC3B,CAAC,MAAM,IAAIE,OAAO,KAAK,SAAS,EAAE;IAChC;IACAb,KAAK,CAACY,OAAO,GAAG,IAAI;EACtB,CAAC,MAAM,IAAIC,OAAO,KAAK,IAAI,EAAE;IAC3B,IAAIb,KAAK,CAACW,YAAY,EAAE;MACtB;MACA;MACAX,KAAK,CAACS,UAAU,CAACW,IAAI,CAACC,cAAc,CAACP,UAAU,CAAC,CAAC;IACnD,CAAC,MAAM,IAAId,KAAK,CAACY,OAAO,EAAE;MACxB,IAAMT,KAAK,GAAGkB,cAAc,CAACP,UAAU,EAAEd,KAAK,CAACU,aAAa,CAAC;MAC7D;MACA,IAAII,UAAU,CAACV,IAAI,EAAE;QACnBD,KAAK,CAACC,IAAI,GAAGa,MAAM,CAACH,UAAU,CAACV,IAAI,CAAC;MACtC;MACA;MACA;MACAJ,KAAK,CAACC,MAAM,CAACmB,IAAI,CAACjB,KAAK,CAAC;IAC1B;EACF;AACF;AAEA,SAASL,kBAAkBA,CAACe,OAAO,EAAEb,KAAK,EAAE;EAC1C,IAAIa,OAAO,KAAK,cAAc,EAAE;IAC9Bb,KAAK,CAACW,YAAY,GAAG,KAAK;EAC5B,CAAC,MAAM,IAAIE,OAAO,KAAK,SAAS,EAAE;IAChCb,KAAK,CAACY,OAAO,GAAG,KAAK;EACvB;AACF;AAEA,SAASS,cAAcA,CAACP,UAAU,EAAEJ,aAAa,EAAE;EACjD,IAAMP,KAAK,GAAG,CAAC,CAAC;EAChB;EACA;EACA;EACA,IAAQY,QAAQ,GAAKD,UAAU,CAAvBC,QAAQ;EAChB,IAAIA,QAAQ,EAAE;IACZ;IACA;IACA,IAAIL,aAAa,IAAIA,aAAa,CAACK,QAAQ,CAAC,EAAE;MAC5C;MACAZ,KAAK,CAACmB,YAAY,GAAGZ,aAAa,CAACK,QAAQ,CAAC;IAC9C,CAAC,MAAM;MACL;MACAZ,KAAK,CAACmB,YAAY,GAAG;QAAEN,EAAE,EAAEC,MAAM,CAACF,QAAQ;MAAE,CAAC;IAC/C;EACF;EACA,OAAOZ,KAAK;AACd"}
@@ -77,7 +77,8 @@ export function getFirstElementChild(element) {
77
77
  }
78
78
  }
79
79
 
80
- // This function is only used for occasional debug messages.
80
+ // This function was only used for occasional debug messages during development.
81
+ // It's not used in the actual code.
81
82
  export function getOuterXml(node) {
82
83
  // `nodeType: 1` means "Element".
83
84
  // 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,18 @@
1
+ // Currently there're 2 XML stream parser implementations:
2
+ // * `sax` — The "classic" one. Supports Node.js streams.
3
+ // * `saxen` — The small and fast one.
4
+ //
5
+ // `sax` has been around for a long time, and is written by a well-known developer,
6
+ // but it performance is very subpar compared to `saxen`: reading a `10 MB` `.xlsx` file
7
+ // with `sax` is about `1.4` secs while with `saxen` it's about `0.3` secs,
8
+ // meaning that `saxen` is light-years ahead of `sax` in terms of performance.
9
+ //
10
+ // `sax` has an advantage of parsing XML from a Node.js stream rather than from just a `string`,
11
+ // but the weird part is that when enabled, "streaming" mode results in significantly slower parsing:
12
+ // about `3.1` secs. in "streaming" mode vs about `1.4` secs. in non-"streaming" mode.
13
+ //
14
+ // `sax` "bundled" size is `22.5 kB` (`8.1 kB` gzipped).
15
+ // `saxen` "bundled" size is `6.15 kB` (`2.7 kB` gzipped).
16
+ //
17
+ export { default } from './parseXmlStream.saxen.js';
18
+ //# sourceMappingURL=parseXmlStream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseXmlStream.js","names":["default"],"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":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,OAAkB,QAAQ,2BAA2B"}
@@ -0,0 +1,103 @@
1
+ import { Readable } from 'node:stream';
2
+ import sax from 'sax';
3
+
4
+ // For some strange reason, using "streaming" mode results in
5
+ // quite a dramatic drop in performance.
6
+ // For example, reading a `10 MB` `.xlsx` file in "streaming" mode is about `3.1` secs.
7
+ // while in non-"streaming" mode it's about `1.4` secs.
8
+ // Because of such strange performance issue, "streaming" mode is turned off.
9
+ var STREAMING_MODE = false;
10
+ export default function parseXmlStream(xml, _ref) {
11
+ var createInitialState = _ref.createInitialState,
12
+ onOpenTag = _ref.onOpenTag,
13
+ onCloseTag = _ref.onCloseTag,
14
+ onText = _ref.onText;
15
+ return new Promise(function (resolve, reject) {
16
+ var errored = false;
17
+ var strict = true;
18
+ var xmlns = true;
19
+ var parserOptions = {
20
+ lowercase: true,
21
+ xmlns: xmlns
22
+ };
23
+ var prefixedTagNameToUnprefixedTagName = {};
24
+ var state = createInitialState();
25
+
26
+ // an error happened.
27
+ var onerror = function onerror(error) {
28
+ if (errored) {
29
+ return;
30
+ }
31
+ errored = true;
32
+ reject(error);
33
+ };
34
+
35
+ // got some text. `text` is the string of text.
36
+ var ontext = function ontext(text) {
37
+ if (onText) {
38
+ onText(text, state);
39
+ }
40
+ };
41
+
42
+ // opened a tag. `node` has "name" and "attributes"
43
+ var onopentag = function onopentag(node) {
44
+ if (onOpenTag) {
45
+ if (xmlns) {
46
+ prefixedTagNameToUnprefixedTagName[node.name] = node.local;
47
+ }
48
+ onOpenTag(xmlns ? node.local : node.name, xmlns ? getAttributesWithoutXmlnsPrefixes(node.attributes) : node.attributes, state);
49
+ }
50
+ };
51
+
52
+ // closed a tag.
53
+ var onclosetag = function onclosetag(name) {
54
+ if (onCloseTag) {
55
+ var tagName = xmlns ? prefixedTagNameToUnprefixedTagName[name] : name;
56
+ if (xmlns && !tagName) {
57
+ throw new Error("Unknown closing tag: ".concat(name));
58
+ }
59
+ onCloseTag(tagName, state);
60
+ }
61
+ };
62
+
63
+ // an attribute. `attribute` has "name" and "value"
64
+ var onattribute = function onattribute(attribute) {
65
+ // const name = xmlns ? attribute.local : attribute.name
66
+ // const value = attribute.value
67
+ };
68
+
69
+ // parser stream is done, and ready to have more stuff written to it.
70
+ var onend = function onend() {
71
+ if (errored) {
72
+ return;
73
+ }
74
+ resolve(state);
75
+ };
76
+ if (STREAMING_MODE) {
77
+ var parser = sax.createStream(strict, parserOptions);
78
+ parser.on('error', onerror);
79
+ parser.on('text', ontext);
80
+ parser.on('opentag', onopentag);
81
+ parser.on('closetag', onclosetag);
82
+ parser.on('attribute', onattribute);
83
+ parser.on('end', onend);
84
+ Readable.from(xml).pipe(parser);
85
+ } else {
86
+ var _parser = sax.parser(strict, parserOptions);
87
+ _parser.onerror = onerror;
88
+ _parser.ontext = ontext;
89
+ _parser.onopentag = onopentag;
90
+ _parser.onclosetag = onclosetag;
91
+ _parser.onattribute = onattribute;
92
+ _parser.onend = onend;
93
+ _parser.write(xml).end();
94
+ }
95
+ });
96
+ }
97
+ function getAttributesWithoutXmlnsPrefixes(attributes) {
98
+ return Object.keys(attributes).reduce(function (attributesWithoutPrefixes, nameWithPrefix) {
99
+ attributesWithoutPrefixes[attributes[nameWithPrefix].local] = attributes[nameWithPrefix].value;
100
+ return attributesWithoutPrefixes;
101
+ }, {});
102
+ }
103
+ //# sourceMappingURL=parseXmlStream.sax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseXmlStream.sax.js","names":["Readable","sax","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","createStream","on","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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"}