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.
- package/.gitlab-ci.yml +1 -1
- package/CHANGELOG.md +5 -0
- package/README.md +153 -50
- package/bundle/read-excel-file.min.js +1 -1
- package/bundle/read-excel-file.min.js.map +1 -1
- package/bundle/read-excel-file.min.old.js +2 -0
- package/bundle/read-excel-file.min.old.js.map +1 -0
- package/commonjs/export/convertValuesFromUint8ArraysToStrings.js +3 -0
- package/commonjs/export/convertValuesFromUint8ArraysToStrings.js.map +1 -1
- package/commonjs/export/parseSheet.js +12 -9
- package/commonjs/export/parseSheet.js.map +1 -1
- package/commonjs/export/readSheetBrowser.js +6 -2
- package/commonjs/export/readSheetBrowser.js.map +1 -1
- package/commonjs/export/readSheetNode.js +6 -2
- package/commonjs/export/readSheetNode.js.map +1 -1
- package/commonjs/export/readSheetUniversal.js +14 -2
- package/commonjs/export/readSheetUniversal.js.map +1 -1
- package/commonjs/export/readSheetWebWorker.js +12 -2
- package/commonjs/export/readSheetWebWorker.js.map +1 -1
- package/commonjs/export/readXlsxFileBrowser.js +6 -2
- package/commonjs/export/readXlsxFileBrowser.js.map +1 -1
- package/commonjs/export/readXlsxFileNode.js +6 -2
- package/commonjs/export/readXlsxFileNode.js.map +1 -1
- package/commonjs/export/readXlsxFileUniversal.js +14 -2
- package/commonjs/export/readXlsxFileUniversal.js.map +1 -1
- package/commonjs/export/readXlsxFileWebWorker.js +12 -2
- package/commonjs/export/readXlsxFileWebWorker.js.map +1 -1
- package/commonjs/export/unpackXlsxFileBrowser.js +29 -6
- package/commonjs/export/unpackXlsxFileBrowser.js.map +1 -1
- package/commonjs/export/unpackXlsxFileNode.js +6 -0
- package/commonjs/export/unpackXlsxFileNode.js.map +1 -1
- package/commonjs/export/unpackXlsxFileUniversal.js +6 -0
- package/commonjs/export/unpackXlsxFileUniversal.js.map +1 -1
- package/commonjs/export/unpackXlsxFileWebWorker.js +14 -0
- package/commonjs/export/unpackXlsxFileWebWorker.js.map +1 -0
- package/commonjs/parseSheetData/parseSheetData.js +6 -6
- package/commonjs/parseSheetData/parseSheetData.js.map +1 -1
- package/commonjs/utility/checkpoint.js +33 -0
- package/commonjs/utility/checkpoint.js.map +1 -0
- package/commonjs/utility/isObject.js +15 -0
- package/commonjs/utility/isObject.js.map +1 -0
- package/commonjs/utility/isPromise.js +18 -0
- package/commonjs/utility/isPromise.js.map +1 -0
- package/commonjs/xlsx/convertCellsToData2dArray.js +0 -3
- package/commonjs/xlsx/convertCellsToData2dArray.js.map +1 -1
- package/commonjs/xlsx/isDateFormatStyle.js +2 -2
- package/commonjs/xlsx/isDateFormatStyle.js.map +1 -1
- package/commonjs/xlsx/parseCell.js +89 -24
- package/commonjs/xlsx/parseCell.js.map +1 -1
- package/{modules/xlsx/parseCellCoordinates.js → commonjs/xlsx/parseCellAddress.js} +18 -7
- package/commonjs/xlsx/parseCellAddress.js.map +1 -0
- package/commonjs/xlsx/parseCellValue.js +7 -23
- package/commonjs/xlsx/parseCellValue.js.map +1 -1
- package/commonjs/xlsx/parseFilePaths.js +31 -32
- package/commonjs/xlsx/parseFilePaths.js.map +1 -1
- package/commonjs/xlsx/parseNumber.js +20 -0
- package/commonjs/xlsx/parseNumber.js.map +1 -0
- package/commonjs/xlsx/parseSharedString.js +64 -0
- package/commonjs/xlsx/parseSharedString.js.map +1 -0
- package/commonjs/xlsx/parseSharedStrings.js +45 -5
- package/commonjs/xlsx/parseSharedStrings.js.map +1 -1
- package/commonjs/xlsx/parseSheet.js +93 -9
- package/commonjs/xlsx/parseSheet.js.map +1 -1
- package/commonjs/xlsx/parseSheetData.js +68 -0
- package/commonjs/xlsx/parseSheetData.js.map +1 -0
- package/commonjs/xlsx/parseSpreadsheetContents.js +244 -43
- package/commonjs/xlsx/parseSpreadsheetContents.js.map +1 -1
- package/commonjs/xlsx/parseSpreadsheetInfo.js +67 -36
- package/commonjs/xlsx/parseSpreadsheetInfo.js.map +1 -1
- package/commonjs/xlsx/parseStyles.js +89 -36
- package/commonjs/xlsx/parseStyles.js.map +1 -1
- package/commonjs/xml/dom.js +2 -1
- package/commonjs/xml/dom.js.map +1 -1
- package/commonjs/xml/parseXmlStream.js +14 -0
- package/commonjs/xml/parseXmlStream.js.map +1 -0
- package/commonjs/xml/parseXmlStream.sax.js +109 -0
- package/commonjs/xml/parseXmlStream.sax.js.map +1 -0
- package/commonjs/xml/parseXmlStream.saxen.code.js +953 -0
- package/commonjs/xml/parseXmlStream.saxen.code.js.map +1 -0
- package/commonjs/xml/parseXmlStream.saxen.js +85 -0
- package/commonjs/xml/parseXmlStream.saxen.js.map +1 -0
- package/commonjs/xml/xlsx.js +75 -40
- package/commonjs/xml/xlsx.js.map +1 -1
- package/commonjs/zip/unzipFromArrayBuffer.js +5 -14
- package/commonjs/zip/unzipFromArrayBuffer.js.map +1 -1
- package/commonjs/zip/unzipFromStream.fflate.js +154 -25
- package/commonjs/zip/unzipFromStream.fflate.js.map +1 -1
- package/commonjs/zip/unzipFromStream.js.map +1 -1
- package/commonjs/zip/unzipFromStream.unzipper.js +37 -26
- package/commonjs/zip/unzipFromStream.unzipper.js.map +1 -1
- package/modules/export/convertValuesFromUint8ArraysToStrings.js +2 -0
- package/modules/export/convertValuesFromUint8ArraysToStrings.js.map +1 -1
- package/modules/export/parseSheet.js +12 -9
- package/modules/export/parseSheet.js.map +1 -1
- package/modules/export/readSheetBrowser.js +5 -2
- package/modules/export/readSheetBrowser.js.map +1 -1
- package/modules/export/readSheetNode.js +5 -2
- package/modules/export/readSheetNode.js.map +1 -1
- package/modules/export/readSheetUniversal.js +14 -2
- package/modules/export/readSheetUniversal.js.map +1 -1
- package/modules/export/readSheetWebWorker.js +12 -2
- package/modules/export/readSheetWebWorker.js.map +1 -1
- package/modules/export/readXlsxFileBrowser.js +5 -2
- package/modules/export/readXlsxFileBrowser.js.map +1 -1
- package/modules/export/readXlsxFileNode.js +5 -2
- package/modules/export/readXlsxFileNode.js.map +1 -1
- package/modules/export/readXlsxFileUniversal.js +14 -2
- package/modules/export/readXlsxFileUniversal.js.map +1 -1
- package/modules/export/readXlsxFileWebWorker.js +12 -2
- package/modules/export/readXlsxFileWebWorker.js.map +1 -1
- package/modules/export/unpackXlsxFileBrowser.js +26 -6
- package/modules/export/unpackXlsxFileBrowser.js.map +1 -1
- package/modules/export/unpackXlsxFileNode.js +3 -0
- package/modules/export/unpackXlsxFileNode.js.map +1 -1
- package/modules/export/unpackXlsxFileUniversal.js +3 -0
- package/modules/export/unpackXlsxFileUniversal.js.map +1 -1
- package/modules/export/unpackXlsxFileWebWorker.js +6 -0
- package/modules/export/unpackXlsxFileWebWorker.js.map +1 -0
- package/modules/parseSheetData/parseSheetData.js +4 -4
- package/modules/parseSheetData/parseSheetData.js.map +1 -1
- package/modules/utility/checkpoint.js +25 -0
- package/modules/utility/checkpoint.js.map +1 -0
- package/modules/utility/isObject.js +9 -0
- package/modules/utility/isObject.js.map +1 -0
- package/modules/utility/isPromise.js +12 -0
- package/modules/utility/isPromise.js.map +1 -0
- package/modules/xlsx/convertCellsToData2dArray.js +0 -3
- package/modules/xlsx/convertCellsToData2dArray.js.map +1 -1
- package/modules/xlsx/isDateFormatStyle.js +2 -2
- package/modules/xlsx/isDateFormatStyle.js.map +1 -1
- package/modules/xlsx/parseCell.js +85 -24
- package/modules/xlsx/parseCell.js.map +1 -1
- package/{commonjs/xlsx/parseCellCoordinates.js → modules/xlsx/parseCellAddress.js} +12 -13
- package/modules/xlsx/parseCellAddress.js.map +1 -0
- package/modules/xlsx/parseCellValue.js +7 -23
- package/modules/xlsx/parseCellValue.js.map +1 -1
- package/modules/xlsx/parseFilePaths.js +31 -33
- package/modules/xlsx/parseFilePaths.js.map +1 -1
- package/modules/xlsx/parseNumber.js +14 -0
- package/modules/xlsx/parseNumber.js.map +1 -0
- package/modules/xlsx/parseSharedString.js +55 -0
- package/modules/xlsx/parseSharedString.js.map +1 -0
- package/modules/xlsx/parseSharedStrings.js +46 -5
- package/modules/xlsx/parseSharedStrings.js.map +1 -1
- package/modules/xlsx/parseSheet.js +91 -9
- package/modules/xlsx/parseSheet.js.map +1 -1
- package/modules/xlsx/parseSheetData.js +55 -0
- package/modules/xlsx/parseSheetData.js.map +1 -0
- package/modules/xlsx/parseSpreadsheetContents.js +242 -43
- package/modules/xlsx/parseSpreadsheetContents.js.map +1 -1
- package/modules/xlsx/parseSpreadsheetInfo.js +67 -37
- package/modules/xlsx/parseSpreadsheetInfo.js.map +1 -1
- package/modules/xlsx/parseStyles.js +88 -36
- package/modules/xlsx/parseStyles.js.map +1 -1
- package/modules/xml/dom.js +2 -1
- package/modules/xml/dom.js.map +1 -1
- package/modules/xml/parseXmlStream.js +18 -0
- package/modules/xml/parseXmlStream.js.map +1 -0
- package/modules/xml/parseXmlStream.sax.js +103 -0
- package/modules/xml/parseXmlStream.sax.js.map +1 -0
- package/modules/xml/parseXmlStream.saxen.code.js +947 -0
- package/modules/xml/parseXmlStream.saxen.code.js.map +1 -0
- package/modules/xml/parseXmlStream.saxen.js +79 -0
- package/modules/xml/parseXmlStream.saxen.js.map +1 -0
- package/modules/xml/xlsx.js +72 -36
- package/modules/xml/xlsx.js.map +1 -1
- package/modules/zip/unzipFromArrayBuffer.js +5 -14
- package/modules/zip/unzipFromArrayBuffer.js.map +1 -1
- package/modules/zip/unzipFromStream.fflate.js +157 -24
- package/modules/zip/unzipFromStream.fflate.js.map +1 -1
- package/modules/zip/unzipFromStream.js +56 -2
- package/modules/zip/unzipFromStream.js.map +1 -1
- package/modules/zip/unzipFromStream.unzipper.js +38 -26
- package/modules/zip/unzipFromStream.unzipper.js.map +1 -1
- package/package.json +4 -6
- package/commonjs/xlsx/parseCellCoordinates.js.map +0 -1
- package/commonjs/xlsx/parseCells.js +0 -34
- package/commonjs/xlsx/parseCells.js.map +0 -1
- package/commonjs/xlsx/parseSheetDimensions.js +0 -43
- package/commonjs/xlsx/parseSheetDimensions.js.map +0 -1
- package/commonjs/xml/xml.js +0 -13
- package/commonjs/xml/xml.js.map +0 -1
- package/commonjs/xml/xmlBrowser.js +0 -17
- package/commonjs/xml/xmlBrowser.js.map +0 -1
- package/commonjs/xml/xpath/xlsx-xpath.js +0 -92
- package/commonjs/xml/xpath/xlsx-xpath.js.map +0 -1
- package/commonjs/xml/xpath/xpathBrowser.js +0 -33
- package/commonjs/xml/xpath/xpathBrowser.js.map +0 -1
- package/commonjs/xml/xpath/xpathNode.js +0 -16
- package/commonjs/xml/xpath/xpathNode.js.map +0 -1
- package/modules/xlsx/parseCellCoordinates.js.map +0 -1
- package/modules/xlsx/parseCells.js +0 -27
- package/modules/xlsx/parseCells.js.map +0 -1
- package/modules/xlsx/parseSheetDimensions.js +0 -37
- package/modules/xlsx/parseSheetDimensions.js.map +0 -1
- package/modules/xml/xml.js +0 -7
- package/modules/xml/xml.js.map +0 -1
- package/modules/xml/xmlBrowser.js +0 -11
- package/modules/xml/xmlBrowser.js.map +0 -1
- package/modules/xml/xpath/xlsx-xpath.js +0 -73
- package/modules/xml/xpath/xlsx-xpath.js.map +0 -1
- package/modules/xml/xpath/xpathBrowser.js +0 -27
- package/modules/xml/xpath/xpathBrowser.js.map +0 -1
- package/modules/xml/xpath/xpathNode.js +0 -9
- package/modules/xml/xpath/xpathNode.js.map +0 -1
|
@@ -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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
|
38
|
+
function createInitialStateInStyles() {
|
|
36
39
|
return {
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
43
|
-
|
|
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
|
-
|
|
46
|
-
|
|
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 (
|
|
50
|
-
|
|
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:
|
|
105
|
+
id: Number(numFmtId)
|
|
54
106
|
};
|
|
55
107
|
}
|
|
56
108
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseStyles.js","names":["
|
|
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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"}
|
package/modules/xml/dom.js
CHANGED
|
@@ -77,7 +77,8 @@ export function getFirstElementChild(element) {
|
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
-
// This function
|
|
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
|
package/modules/xml/dom.js.map
CHANGED
|
@@ -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
|
|
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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"}
|