From d6abde0e8e2e7ecf3cb92123ed70b40850887a1d Mon Sep 17 00:00:00 2001 From: SheetJS Date: Wed, 3 Jan 2024 01:47:00 -0500 Subject: [PATCH] math --- .gitignore | 1 + docz/docs/03-demos/01-math/09-danfojs.md | 307 ++++++++++++ docz/docs/03-demos/01-math/11-tensorflow.md | 440 ++++++++++++++++++ docz/docs/03-demos/01-math/_category_.json | 4 + docz/docs/03-demos/01-math/index.md | 412 ++++++++++++++++ .../02-frontend/19-bundler/03-vitejs.md | 1 + docz/docs/03-demos/02-frontend/index.md | 2 +- .../docs/03-demos/03-net/01-network/index.mdx | 41 +- .../docs/03-demos/17-mobile/01-reactnative.md | 97 +++- docz/docs/03-demos/17-mobile/05-capacitor.md | 2 +- docz/docs/03-demos/19-desktop/01-electron.md | 22 +- docz/docs/03-demos/19-desktop/02-nwjs.md | 4 +- docz/docs/03-demos/19-desktop/03-wails.md | 2 +- .../docs/03-demos/19-desktop/05-neutralino.md | 6 +- docz/docs/03-demos/19-desktop/09-cli.md | 6 +- docz/docs/03-demos/30-cloud/02-netsuite.md | 6 +- docz/docs/03-demos/30-cloud/18-github.md | 66 +-- docz/docs/03-demos/32-extensions/12-maple.md | 2 +- docz/docs/03-demos/37-bigdata/03-ml.mdx | 347 -------------- docz/docs/03-demos/42-engines/01-duktape.md | 4 +- docz/docs/03-demos/42-engines/03-rhino.md | 20 +- docz/docs/03-demos/42-engines/08-quickjs.md | 20 +- docz/docs/03-demos/42-engines/20-chakra.md | 2 +- docz/docs/03-demos/42-engines/21-boa.md | 2 +- docz/docs/03-demos/42-engines/22-perl.md | 8 +- docz/docs/03-demos/42-engines/index.md | 16 +- docz/docs/03-demos/index.md | 2 +- docz/docs/06-solutions/01-input.md | 2 +- docz/docs/06-solutions/05-output.md | 2 +- docz/docs/08-api/07-utilities/08-wb.md | 30 +- docz/docs/08-api/07-utilities/index.md | 2 +- docz/docs/08-api/index.md | 2 +- docz/docs/09-miscellany/05-contributing.md | 46 +- docz/docusaurus.config.js | 4 +- docz/package.json | 2 +- docz/static/deno/s2c.ts | 6 +- docz/static/nwjs/index.html | 4 + .../reactnative/xcode-select-project.png | Bin 0 -> 24930 bytes docz/static/reactnative/xcode-targets.png | Bin 0 -> 144001 bytes docz/static/tfjs/tf.min.js | 2 +- docz/static/typedarray/col.png | Bin 0 -> 14430 bytes docz/static/typedarray/iris.png | Bin 0 -> 31499 bytes docz/static/typedarray/iris.xlsx | Bin 0 -> 13872 bytes docz/static/typedarray/iristr.png | Bin 0 -> 33072 bytes docz/static/typedarray/ta-col.png | Bin 0 -> 17549 bytes docz/static/typedarray/ta-row.png | Bin 0 -> 16262 bytes docz/version.js | 2 +- 47 files changed, 1453 insertions(+), 493 deletions(-) create mode 100644 docz/docs/03-demos/01-math/09-danfojs.md create mode 100644 docz/docs/03-demos/01-math/11-tensorflow.md create mode 100644 docz/docs/03-demos/01-math/_category_.json create mode 100644 docz/docs/03-demos/01-math/index.md delete mode 100644 docz/docs/03-demos/37-bigdata/03-ml.mdx create mode 100644 docz/static/reactnative/xcode-select-project.png create mode 100644 docz/static/reactnative/xcode-targets.png create mode 100644 docz/static/typedarray/col.png create mode 100644 docz/static/typedarray/iris.png create mode 100644 docz/static/typedarray/iris.xlsx create mode 100644 docz/static/typedarray/iristr.png create mode 100644 docz/static/typedarray/ta-col.png create mode 100644 docz/static/typedarray/ta-row.png diff --git a/.gitignore b/.gitignore index d3ab5af..f828735 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ package-lock.json pnpm-lock.yaml /docs +node_modules diff --git a/docz/docs/03-demos/01-math/09-danfojs.md b/docz/docs/03-demos/01-math/09-danfojs.md new file mode 100644 index 0000000..6280e2e --- /dev/null +++ b/docz/docs/03-demos/01-math/09-danfojs.md @@ -0,0 +1,307 @@ +--- +title: Sheets in DanfoJS +sidebar_label: DanfoJS +pagination_prev: demos/index +pagination_next: demos/frontend/index +--- + + + + + +[SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing +data from spreadsheets. + +[DanfoJS](https://danfo.jsdata.org/) is a library for processing structured +data. It uses SheetJS under the hood for reading and writing spreadsheets. + +This demo covers details elided in the official DanfoJS documentation. + +:::note Tested Deployments + +This example was last tested on 2024 January 03 against DanfoJS 1.1.2. + +::: + +:::info Browser integration + +The live demos on this page include the DanfoJS browser bundle: + +```html + +``` + +There are known issues with the documentation generator. If a demo explicitly +prints "RELOAD THIS PAGE", please reload or refresh the page. + +::: + +## DataFrames and Worksheets + +The DanfoJS `DataFrame`[^1] represents two-dimensional tabular data. It is the +starting point for most DanfoJS data processing tasks. A `DataFrame` typically +corresponds to one SheetJS worksheet[^2]. + +
SpreadsheetDanfoJS DataFrame
+ +![`pres.xlsx` data](pathname:///pres.png) + + + +``` +╔════╤═══════════════╤═══════╗ +║ │ Name │ Index ║ +╟────┼───────────────┼───────╢ +║ 0 │ Bill Clinton │ 42 ║ +╟────┼───────────────┼───────╢ +║ 1 │ GeorgeW Bush │ 43 ║ +╟────┼───────────────┼───────╢ +║ 2 │ Barack Obama │ 44 ║ +╟────┼───────────────┼───────╢ +║ 3 │ Donald Trump │ 45 ║ +╟────┼───────────────┼───────╢ +║ 4 │ Joseph Biden │ 46 ║ +╚════╧═══════════════╧═══════╝ +``` + +
+ +## DanfoJS SheetJS Integration + +:::note pass + +The official documentation inconsistently names the library object `danfo` and +`dfd`. Since `dfd` is the browser global, the demos use the name `dfd`. + +::: + +Methods to read and write spreadsheets are attached to the main `dfd` object. + +### Importing DataFrames + +`readExcel`[^3] accepts two arguments: source data and options. + +The source data must be a `string` or `File` object. Strings are interpreted as +URLs while `File` objects are treated as data. + +_Selecting a Worksheet_ + +DanfoJS will generate a dataframe from one worksheet. The parser normally uses +the first worksheet. The `sheet` property of the options object controls the +selected worksheet. It is expected to be a zero-indexed number: + +```js +const first_sheet = await dfd.readExcel(url, {sheet: 0}); +const second_sheet = await dfd.readExcel(url, {sheet: 1}); +``` + +_More Parsing Options_ + +The `parsingOptions` property of the options argument is passed directly to the +SheetJS `read` method[^4]. + +For example, the `sheetRows` property controls how many rows are extracted from +larger worksheets. To pull 3 data rows, `sheetRows` must be set to 4: + +```js +const first_three_rows = await dfd.readExcel(url, { parsingOptions: { + // see https://docs.sheetjs.com/docs/api/parse-options for details + sheetRows: 4 +} }); +``` + +#### URL source + +The following example fetches a [test file](https://sheetjs.com/pres.xlsx), +parses with SheetJS and generates a DanfoJS dataframe. + +```jsx live +function DanfoReadExcelURL() { + const [text, setText] = React.useState(""); + React.useEffect(() => { (async() => { + if(typeof dfd === "undefined") return setText("RELOAD THIS PAGE!"); + const df = await dfd.readExcel("https://sheetjs.com/pres.xlsx"); + setText("" + df.head()); + })(); }, []); + return (
{text}
); +} +``` + +#### File source + +The following example uses a file input element. The "File API"[^5] section of +the "Local File Access" demo covers the browser API in more detail. + +```jsx live +function DanfoReadExcelFile() { + const [text, setText] = React.useState("Select a spreadsheet"); + + return (<>
{text}
{ + if(typeof dfd === "undefined") return setText("RELOAD THIS PAGE!"); + + /* get first file */ + const file = e.target.files[0]; + + /* create dataframe and pretty-print the first 10 rows */ + const df = await dfd.readExcel(file); + setText("" + df.head()); + }}/>); +} +``` + +### Exporting DataFrames + +`toExcel`[^6] accepts two arguments: dataframe and options. Under the hood, it +uses the SheetJS `writeFile` method[^7]. + +_Exported File Name_ + +The relevant property for the file name depends on the platform: + +| Platform | Property | +|:---------|:-----------| +| NodeJS | `filePath` | +| Browser | `fileName` | + +The exporter will deduce the desired file format from the file extension. + +_Worksheet Name_ + +The `sheetName` property specifies the name of the worksheet in the workbook: + +```js +dfd.toExcel(df, { + fileName: "test.xlsx", // generate `test.xlsx` + // highlight-next-line + sheetName: "Export" // The name of the worksheet will be "Export" +}); +``` + +:::caution pass + +The DanfoJS integration forces the `.xlsx` file extension. Exporting to other +file formats will require [low-level operations](#generating-files). + +::: + +_More Writing Options_ + +The `writingOptions` property of the options argument is passed directly to the +SheetJS `writeFile` method[^8]. + +For example, the `compression` property enables ZIP compression for XLSX and +other formats: + +```js +dfd.toExcel(df, {fileName: "export.xlsx", writingOptions: { + // see https://docs.sheetjs.com/docs/api/write-options for details + compression: true +}}); +``` + +#### Export to File + +The following example exports a sample dataframe to a XLSX spreadsheet. + +```jsx live +function DanfoToExcel() { + if(typeof dfd === "undefined") return (RELOAD THIS PAGE); + /* sample dataframe */ + const df = new dfd.DataFrame([{Sheet:1,JS:2},{Sheet:3,JS:4}]); + return ( <>
{"Data:\n"+df.head()}
); +} +``` + +## Low-Level Operations + +DanfoJS and SheetJS provide methods for processing arrays of objects. + +```mermaid +flowchart LR + ws((SheetJS\nWorksheet)) + aoo[[array of\nobjects]] + df[(DanfoJS\nDataFrame)] + ws --> |sheet_to_json\n\n| aoo + aoo --> |\njson_to_sheet| ws + df --> |\ndfd.toJSON| aoo + aoo --> |new DataFrame\n\n| df +``` + +### Creating DataFrames + +The `DataFrame` constructor[^9] creates `DataFrame` objects from arrays of +objects. Given a SheetJS worksheet object, the `sheet_to_json` method[^10] +generates compatible arrays of objects: + +```js +function ws_to_df(ws) { + const aoo = XLSX.utils.sheet_to_json(ws); + return new dfd.DataFrame(aoo); +} +``` + +### Generating Files + +`toJSON`[^11] accepts two arguments: dataframe and options. + +The `format` key of the `options` argument dictates the result layout. The +`column` layout generates an array of objects in row-major order. The SheetJS +`json_to_sheet`[^12] method can generate a worksheet object from the result: + +```js +function df_to_ws(df) { + const aoo = dfd.toJSON(df, { format: "column" }); + return XLSX.utils.json_to_sheet(aoo); +} +``` + +The SheetJS `book_new` method creates a workbook object from the worksheet[^13] +and the `writeFile` method[^14] will generate the file: + +```js +const ws = df_to_ws(df); +const wb = XLSX.utils.book_new(ws, "Export"); +XLSX.writeFile(wb, "SheetJSDanfoJS.xlsb", { compression: true }); +``` + +The following demo exports a sample dataframe to XLSB. This operation is not +supported by the DanfoJS `toExcel` method since that method enforces XLSX. + +```jsx live +function DanfoToXLS() { + if(typeof dfd === "undefined") return (RELOAD THIS PAGE); + /* sample dataframe */ + const df = new dfd.DataFrame([{Sheet:1,JS:2},{Sheet:3,JS:4}]); + return ( <>
{"Data:\n"+df.head()}
); +} +``` + +[^1]: See ["Dataframe"](https://danfo.jsdata.org/api-reference/dataframe) in the DanfoJS documentation +[^2]: See ["Sheet Objects"](/docs/csf/sheet) +[^3]: See ["danfo.readExcel"](https://danfo.jsdata.org/api-reference/input-output/danfo.read_excel) in the DanfoJS documentation. +[^4]: See ["Reading Files"](/docs/api/parse-options/#parsing-options) for the full list of parsing options. +[^5]: See ["File API" in "Local File Access"](/docs/demos/local/file#file-api) for more details. +[^6]: See ["danfo.toExcel"](https://danfo.jsdata.org/api-reference/input-output/danfo.to_excel) in the DanfoJS documentation. +[^7]: See [`writeFile` in "Writing Files"](/docs/api/write-options) +[^8]: See ["Writing Files"](/docs/api/write-options/#writing-options) for the full list of writing options. +[^9]: See ["Creating a DataFrame"](https://danfo.jsdata.org/api-reference/dataframe/creating-a-dataframe) in the DanfoJS documentation. +[^10]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output) +[^11]: See ["danfo.toJSON"](https://danfo.jsdata.org/api-reference/input-output/danfo.to_json) in the DanfoJS documentation. +[^12]: See [`json_to_sheet` in "Utilities"](/docs/api/utilities/array#array-of-objects-input) +[^13]: See [`book_new` in "Utilities"](/docs/api/utilities/wb) +[^14]: See [`writeFile` in "Writing Files"](/docs/api/write-options) \ No newline at end of file diff --git a/docz/docs/03-demos/01-math/11-tensorflow.md b/docz/docs/03-demos/01-math/11-tensorflow.md new file mode 100644 index 0000000..f225108 --- /dev/null +++ b/docz/docs/03-demos/01-math/11-tensorflow.md @@ -0,0 +1,440 @@ +--- +title: Sheets in TensorFlow +sidebar_label: TensorFlow.js +pagination_prev: demos/index +pagination_next: demos/frontend/index +--- + + + + + +[TensorFlow.js](https://www.tensorflow.org/js) (shortened to TF.js) is a library +for machine learning in JavaScript. + +[SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing +data from spreadsheets. + +This demo uses TensorFlow.js and SheetJS to process data in spreadsheets. We'll +explore how to load spreadsheet data into TF.js datasets and how to export +results back to spreadsheets. + +- ["CSV Data Interchange"](#csv-data-interchange) uses SheetJS to process sheets + and generate CSV data that TF.js can import. + +- ["JSON Data Interchange"](#json-data-interchange) uses SheetJS to process + sheets and generate rows of objects that can be post-processed. + +:::info pass + +Live code blocks in this page use the TF.js `4.14.0` standalone build. + +For use in web frameworks, the `@tensorflow/tfjs` module should be used. + +For use in NodeJS, the native bindings module is `@tensorflow/tfjs-node`. + +::: + +:::note Tested Deployments + +Each browser demo was tested in the following environments: + +| Browser | TF.js version | Date | +|:------------|:--------------|:-----------| +| Chrome 119 | `4.14.0` | 2023-12-09 | +| Safari 16.6 | `4.14.0` | 2023-12-09 | + +::: + +## CSV Data Interchange + +`tf.data.csv`[^1] generates a Dataset from CSV data. The function expects a URL. + +:::note pass + +When this demo was last tested, there was no direct method to pass a CSV string +to the underlying parser. + +::: + +Fortunately blob URLs are supported. + +```mermaid +flowchart LR + ws((SheetJS\nWorksheet)) + csv(CSV\nstring) + url{{Data\nURL}} + dataset[(TF.js\nDataset)] + ws --> |sheet_to_csv\nSheetJS| csv + csv --> |JavaScript\nAPIs| url + url --> |tf.data.csv\nTensorFlow.js| dataset +``` + +The SheetJS `sheet_to_csv` method[^2] generates a CSV string from a worksheet +object. Using standard JavaScript techniques, a blob URL can be constructed: + +```js +function worksheet_to_csv_url(worksheet) { + /* generate CSV */ + const csv = XLSX.utils.sheet_to_csv(worksheet); + + /* CSV -> Uint8Array -> Blob */ + const u8 = new TextEncoder().encode(csv); + const blob = new Blob([u8], { type: "text/csv" }); + + /* generate a blob URL */ + return URL.createObjectURL(blob); +} +``` + +### CSV Demo + +This demo shows a simple model fitting using the "cars" dataset from TensorFlow. +The [sample XLS file](https://sheetjs.com/data/cd.xls) contains the data. The +data processing mirrors the official "Making Predictions from 2D Data" demo[^3]. + +```mermaid +flowchart LR + file[(Remote\nFile)] + subgraph SheetJS Operations + ab[(Data\nBytes)] + wb(((SheetJS\nWorkbook))) + ws((SheetJS\nWorksheet)) + csv(CSV\nstring) + end + subgraph TensorFlow.js Operations + url{{Data\nURL}} + dataset[(TF.js\nDataset)] + results((Results)) + end + file --> |fetch\n\n| ab + ab --> |read\n\n| wb + wb --> |select\nsheet| ws + ws --> |sheet_to_csv\n\n| csv + csv --> |JS\nAPI| url + url --> |tf.data.csv\nTF.js| dataset + dataset --> |fitDataset\nTF.js| results +``` + +The demo builds a model for predicting MPG from Horsepower data. It: + +- fetches +- parses the data with the SheetJS `read`[^4] method +- selects the first worksheet[^5] and converts to CSV using `sheet_to_csv`[^6] +- generates a blob URL from the CSV text +- generates a TF.js dataset with `tf.data.csv`[^7] and selects data columns +- builds a model and trains with `fitDataset`[^8] +- predicts MPG from a set of sample inputs and displays results in a table + +
Live Demo (click to show) + +:::caution pass + +In some test runs, the results did not make sense given the underlying data. +The dependent and independent variables are expected to be anti-correlated. + +**This is a known issue in TF.js and affects the official demos** + +::: + +:::caution pass + +If the live demo shows a message + +``` +ReferenceError: tf is not defined +``` + +please refresh the page. This is a known bug in the documentation generator. + +::: + +```jsx live +function SheetJSToTFJSCSV() { + const [output, setOutput] = React.useState(""); + const [results, setResults] = React.useState([]); + const [disabled, setDisabled] = React.useState(false); + + function worksheet_to_csv_url(worksheet) { + /* generate CSV */ + const csv = XLSX.utils.sheet_to_csv(worksheet); + + /* CSV -> Uint8Array -> Blob */ + const u8 = new TextEncoder().encode(csv); + const blob = new Blob([u8], { type: "text/csv" }); + + /* generate a blob URL */ + return URL.createObjectURL(blob); + } + + const doit = React.useCallback(async () => { + setResults([]); setOutput(""); setDisabled(true); + try { + /* fetch file */ + const f = await fetch("https://sheetjs.com/data/cd.xls"); + const ab = await f.arrayBuffer(); + /* parse file and get first worksheet */ + const wb = XLSX.read(ab); + const ws = wb.Sheets[wb.SheetNames[0]]; + + /* generate blob URL */ + const url = worksheet_to_csv_url(ws); + + /* feed to tf.js */ + const dataset = tf.data.csv(url, { + hasHeader: true, + configuredColumnsOnly: true, + columnConfigs:{ + "Horsepower": {required: false, default: 0}, + "Miles_per_Gallon":{required: false, default: 0, isLabel:true} + } + }); + + /* pre-process data */ + let flat = dataset + .map(({xs,ys}) =>({xs: Object.values(xs), ys: Object.values(ys)})) + .filter(({xs,ys}) => [...xs,...ys].every(v => v>0)); + + /* normalize manually :( */ + let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity; + await flat.forEachAsync(({xs, ys}) => { + minX = Math.min(minX, xs[0]); maxX = Math.max(maxX, xs[0]); + minY = Math.min(minY, ys[0]); maxY = Math.max(maxY, ys[0]); + }); + flat = flat.map(({xs, ys}) => ({xs:xs.map(v => (v-minX)/(maxX - minX)),ys:ys.map(v => (v-minY)/(maxY-minY))})); + flat = flat.batch(32); + + /* build and train model */ + const model = tf.sequential(); + model.add(tf.layers.dense({inputShape: [1], units: 1})); + model.compile({ optimizer: tf.train.sgd(0.000001), loss: 'meanSquaredError' }); + await model.fitDataset(flat, { epochs: 100, callbacks: { onEpochEnd: async (epoch, logs) => { + setOutput(`${epoch}:${logs.loss}`); + }}}); + + /* predict values */ + const inp = tf.linspace(0, 1, 9); + const pred = model.predict(inp); + const xs = await inp.dataSync(), ys = await pred.dataSync(); + setResults(Array.from(xs).map((x, i) => [ x * (maxX - minX) + minX, ys[i] * (maxY - minY) + minY ])); + setOutput(""); + + } catch(e) { setOutput(`ERROR: ${String(e)}`); } finally { setDisabled(false);} + }); + return ( <> +
+ {output &&
{output}
|| <>} + {results.length && + {results.map((r,i) => )} +
HorsepowerMPG
{r[0]}{r[1].toFixed(2)}
|| <>} + ); +} +``` + +
+ +## JS Array Interchange + +[The official Linear Regression tutorial](https://www.tensorflow.org/js/tutorials/training/linear_regression) +loads data from a JSON file: + +```json +[ + { + "Name": "chevrolet chevelle malibu", + "Miles_per_Gallon": 18, + "Cylinders": 8, + "Displacement": 307, + "Horsepower": 130, + "Weight_in_lbs": 3504, + "Acceleration": 12, + "Year": "1970-01-01", + "Origin": "USA" + }, + // ... +] +``` + +In real use cases, data is stored in [spreadsheets](https://sheetjs.com/data/cd.xls) + +![cd.xls screenshot](pathname:///files/cd.png) + +Following the tutorial, the data fetching method can be adapted to handle arrays +of objects, such as those generated by the SheetJS `sheet_to_json` method[^9]. + +Differences from the official example are highlighted below: + +```js +/** + * Get the car data reduced to just the variables we are interested + * and cleaned of missing data. + */ +async function getData() { + // highlight-start + /* fetch file */ + const carsDataResponse = await fetch('https://sheetjs.com/data/cd.xls'); + /* get file data (ArrayBuffer) */ + const carsDataAB = await carsDataResponse.arrayBuffer(); + /* parse */ + const carsDataWB = XLSX.read(carsDataAB); + /* get first worksheet */ + const carsDataWS = carsDataWB.Sheets[carsDataWB.SheetNames[0]]; + /* generate array of JS objects */ + const carsData = XLSX.utils.sheet_to_json(carsDataWS); + // highlight-end + const cleaned = carsData.map(car => ({ + mpg: car.Miles_per_Gallon, + horsepower: car.Horsepower, + })) + .filter(car => (car.mpg != null && car.horsepower != null)); + + return cleaned; +} +``` + +## Low-Level Operations + +### Data Transposition + +A typical dataset in a spreadsheet will start with one header row and represent +each data record in its own row. For example, the Iris dataset might look like + +![Iris dataset](pathname:///files/iris.png) + +The SheetJS `sheet_to_json` method[^10] will translate worksheet objects into an +array of row objects: + +```js +var aoo = [ + {"sepal length": 5.1, "sepal width": 3.5, ...}, + {"sepal length": 4.9, "sepal width": 3, ...}, + ... +]; +``` + +TF.js and other libraries tend to operate on individual columns, equivalent to: + +```js +var sepal_lengths = [5.1, 4.9, ...]; +var sepal_widths = [3.5, 3, ...]; +``` + +When a `tensor2d` can be exported, it will look different from the spreadsheet: + +```js +var data_set_2d = [ + [5.1, 4.9, ...], + [3.5, 3, ...], + ... +] +``` + +This is the transpose of how people use spreadsheets! + +### Exporting Datasets to a Worksheet + +The `aoa_to_sheet` method[^11] can generate a worksheet from an array of arrays. +ML libraries typically provide APIs to pull an array of arrays, but it will be +transposed. To export multiple data sets, the data should be transposed: + +```js +/* assuming data is an array of typed arrays */ +var aoa = []; +for(var i = 0; i < data.length; ++i) { + for(var j = 0; j < data[i].length; ++j) { + if(!aoa[j]) aoa[j] = []; + aoa[j][i] = data[i][j]; + } +} +/* aoa can be directly converted to a worksheet object */ +var ws = XLSX.utils.aoa_to_sheet(aoa); +``` + +### Importing Data from a Spreadsheet + +`sheet_to_json` with the option `header:1`[^12] will generate a row-major array +of arrays that can be transposed. However, it is more efficient to walk the +sheet manually: + +```js +/* find worksheet range */ +var range = XLSX.utils.decode_range(ws['!ref']); +var out = [] +/* walk the columns */ +for(var C = range.s.c; C <= range.e.c; ++C) { + /* create the typed array */ + var ta = new Float32Array(range.e.r - range.s.r + 1); + /* walk the rows */ + for(var R = range.s.r; R <= range.e.r; ++R) { + /* find the cell, skip it if the cell isn't numeric or boolean */ + var cell = ws["!data"] ? (ws["!data"][R]||[])[C] : ws[XLSX.utils.encode_cell({r:R, c:C})]; + if(!cell || cell.t != 'n' && cell.t != 'b') continue; + /* assign to the typed array */ + ta[R - range.s.r] = cell.v; + } + out.push(ta); +} +``` + +If the data set has a header row, the loop can be adjusted to skip those rows. + +### TF.js Tensors + +A single `Array#map` can pull individual named fields from the result, which +can be used to construct TensorFlow.js tensor objects: + +```js +const aoo = XLSX.utils.sheet_to_json(worksheet); +const lengths = aoo.map(row => row["sepal length"]); +const tensor = tf.tensor1d(lengths); +``` + +`tf.Tensor` objects can be directly transposed using `transpose`: + +```js +var aoo = XLSX.utils.sheet_to_json(worksheet); +// "x" and "y" are the fields we want to pull from the data +var data = aoo.map(row => ([row["x"], row["y"]])); + +// create a tensor representing two column datasets +var tensor = tf.tensor2d(data).transpose(); + +// individual columns can be accessed +var col1 = tensor.slice([0,0], [1,tensor.shape[1]]).flatten(); +var col2 = tensor.slice([1,0], [1,tensor.shape[1]]).flatten(); +``` + +For exporting, `stack` can be used to collapse the columns into a linear array: + +```js +/* pull data into a Float32Array */ +var result = tf.stack([col1, col2]).transpose(); +var shape = tensor.shape; +var f32 = tensor.dataSync(); + +/* construct an array of arrays of the data in spreadsheet order */ +var aoa = []; +for(var j = 0; j < shape[0]; ++j) { + aoa[j] = []; + for(var i = 0; i < shape[1]; ++i) aoa[j][i] = f32[j * shape[1] + i]; +} + +/* add headers to the top */ +aoa.unshift(["x", "y"]); + +/* generate worksheet */ +var worksheet = XLSX.utils.aoa_to_sheet(aoa); +``` + +[^1]: See [`tf.data.csv`](https://js.tensorflow.org/api/latest/#data.csv) in the TensorFlow.js documentation +[^2]: See [`sheet_to_csv` in "CSV and Text"](/docs/api/utilities/csv#delimiter-separated-output) +[^3]: The ["Making Predictions from 2D Data" example](https://codelabs.developers.google.com/codelabs/tfjs-training-regression/) uses a hosted JSON file. The [sample XLS file](https://sheetjs.com/data/cd.xls) includes the same data. +[^4]: See [`read` in "Reading Files"](/docs/api/parse-options) +[^5]: See ["Workbook Object"](/docs/csf/book) +[^6]: See [`sheet_to_csv` in "CSV and Text"](/docs/api/utilities/csv#delimiter-separated-output) +[^7]: See [`tf.data.csv`](https://js.tensorflow.org/api/latest/#data.csv) in the TensorFlow.js documentation +[^8]: See [`tf.LayersModel.fitDataset`](https://js.tensorflow.org/api/latest/#tf.LayersModel.fitDataset) in the TensorFlow.js documentation +[^9]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output) +[^10]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output) +[^11]: See [`aoa_to_sheet` in "Utilities"](/docs/api/utilities/array#array-of-arrays-input) +[^12]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output) diff --git a/docz/docs/03-demos/01-math/_category_.json b/docz/docs/03-demos/01-math/_category_.json new file mode 100644 index 0000000..c68ab02 --- /dev/null +++ b/docz/docs/03-demos/01-math/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Math and Statistics", + "position": 1 +} \ No newline at end of file diff --git a/docz/docs/03-demos/01-math/index.md b/docz/docs/03-demos/01-math/index.md new file mode 100644 index 0000000..3627862 --- /dev/null +++ b/docz/docs/03-demos/01-math/index.md @@ -0,0 +1,412 @@ +--- +title: Math and Statistics +pagination_prev: demos/index +pagination_next: demos/frontend/index +--- + +import DocCardList from '@theme/DocCardList'; +import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; + +With full support for IEEE754 doubles and singles, JavaScript is an excellent +language for mathematics and statistical analysis. It has also proven to be a +viable platform for machine learning. + +## Demos + +Demos for various libraries are included in separate pages: + + + + +## Typed Arrays + +Modern JavaScript math and statistics libraries typically use `Float64Array` or +`Float32Array` objects to efficiently store data variables. + +
Technical details (click to show) + +Under the hood, `ArrayBuffer` objects represent raw binary data. "Typed arrays" +such as `Float64Array` and `Float32Array` are objects designed for efficient +interpretation and mutation of `ArrayBuffer` data. + + +:::note pass + +`ArrayBuffer` are roughly analogous to heap-allocated memory. Typed arrays +behave like typed pointers. + +**JavaScript** + +```js +const buf = new ArrayBuffer(16); +const dbl = new Float64Array(buf); +dbl[1] = 3.14159; +const u8 = new Uint8Array(buf); +for(let i = 0; i < 8; ++i) + console.log(u8[i+8]); +``` + +**Equivalent C** + +```c +void *const buf = malloc(16); +double *const dbl = (double *)buf; +dbl[1] = 3.14159; +uint8_t *const u8 = (uint8_t *)buf; +for(uint8_t i = 0; i < 8; ++i) + printf("%u\n", u8[i+8]); +``` + +::: + +
+ +### Reading from Sheets + +Each typed array class has a `from` static method for converting data into a +typed array. `Float64Array.from` returns a `double` typed array (8 bytes per +value) and `Float32Array.from` generates a `float` typed array (4 bytes). + +```js +const column_f32 = Float32Array.from(arr); // 4-byte floats +const column_f64 = Float64Array.from(arr); // 8-byte doubles +``` + +:::info pass + +Values in the array will be coerced to the relevant data type. Unsupported +entries will be converted to quiet `NaN` values. + +::: + +#### Extracting Worksheet Data + +The SheetJS `sheet_to_json`[^1] method with the option `header: 1`[^2] generates +an array of arrays from a worksheet object. The result is in row-major order: + +```js +const aoa = XLSX.utils.sheet_to_json(worksheet, {header: 1}); +``` + +#### Categorical Variables + +Dichotomous variables are commonly represented as spreadsheet `TRUE` or `FALSE`. +The SheetJS `sheet_to_json` method will translate these values to `true` and +`false`. Typed array methods will interpret values as `1` and `0` respectively. + +Polychotomous variables must be manually mapped to numeric values. For example, +using the Iris dataset: + +![Iris dataset](pathname:///typedarray/iris.png) + +```js +[ + ["sepal length", "sepal width", "petal length", "petal width", "class"], + [5.1, 3.5, 1.4, 0.2, "Iris-setosa"], + [4.9, 3, 1.4, 0.2, "Iris-setosa"], +] +``` + +Column E (`class`) is a polychotomous variable and must be manually translated: + +```js +const aoa = XLSX.utils.sheet_to_json(worksheet, {header: 1}); + +/* index_to_class will be needed to recover the values later */ +const index_to_class = []; + +/* map from class name to number */ +const class_to_index = new Map(); + +/* loop over the data */ +for(let R = 1; R < aoa.length; ++R) { + /* Column E = SheetJS row 4 */ + const category = aoa[R][4]; + const val = class_to_index.get(category); + if(val == null) { + /* assign a new index */ + class_to_index.set(category, index_to_class.length); + aoa[R][4] = index_to_class.length; + index_to_class.push(category); + } else aoa[R][4] = val; +} +``` + +
Live Demo (click to show) + +This example fetches and parses [`iris.xlsx`](pathname:///typedarray/iris.xlsx). +The first worksheet is processed and the new data and mapping are printed. + +```jsx live +function SheetJSPolychotomy() { + const [cat, setCat] = React.useState([]); + const [aoa, setAoA] = React.useState([]); + + React.useEffect(() => { (async() => { + const ab = await (await fetch("/typedarray/iris.xlsx")).arrayBuffer(); + const wb = XLSX.read(ab); + const aoa = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], {header:1}); + + const index_to_class = []; + const class_to_index = new Map(); + for(let R = 1; R < aoa.length; ++R) { + const category = aoa[R][4]; + const val = class_to_index.get(category); + if(val == null) { + class_to_index.set(category, index_to_class.length); + aoa[R][4] = index_to_class.length; + index_to_class.push(category); + } else aoa[R][4] = val; + } + + /* display every 25 rows, skipping the header row */ + setAoA(aoa.filter((_, i) => (i % 25) == 1)); + setCat(index_to_class); + })(); }, []); + + return ( <> + Mapping
+ + {cat.map((name, i) => ())} +
IndexName
{i}{name}
+ Sample Data
+ {"ABCDE".split("").map(c => ())} + {aoa.map(row => ({row.map(col => ())}))} +
{c}
{col}
+ + ); +} +``` + +
+ +#### One Variable per Column + +It is common to store datasets where each row represents an observation and each +column represents a variable: + +![Iris dataset](pathname:///typedarray/iris.png) + +```js +var aoa = [ + ["sepal length", "sepal width", "petal length", "petal width", "class"], + [5.1, 3.5, 1.4, 0.2, "Iris-setosa"], + [4.9, 3, 1.4, 0.2, "Iris-setosa"], +] +``` + +An array `map` operation can pull data from an individual column. After mapping, +a `slice` can remove the header label. For example, the following snippet pulls +column C ("petal length") into a `Float64Array`: + +```js +const C = XLSX.utils.decode_col("C"); // Column "C" = SheetJS index 2 +const petal_length = Float64Array.from(aoa.map(row => row[C]).slice(1)); +``` + +#### One Variable per Row + +Some datasets are stored in tables where each row represents a variable and each +column represents an observation: + +
JavaScriptSpreadsheet
+ +```js +var aoa = [ + ["sepal length", 5.1, 4.9], + ["sepal width", 3.5, 3], + ["petal length", 1.4, 1.4], + ["petal width", 0.2, 0.2], + ["class", "setosa", "setosa"] +] +``` + + + +![Single column of data](pathname:///typedarray/iristr.png) + +
+ + +From the row-major array of arrays, each entry of the outer array is a row. + +Many sheets include header columns. The `slice` method can remove the header. +After removing the header, `Float64Array.from` can generate a typed array. For +example, this snippet pulls row 3 ("petal length") into a `Float64Array`: + +```js +const petal_length = Float64Array.from(aoa[2].slice(1)); +``` + +### Writing to Sheets + +The SheetJS `aoa_to_sheet`[^1] method can generate a worksheet from an array of +arrays. Similarly, `sheet_add_aoa`[^2] can add an array of arrays of data into +an existing worksheet object. The `origin` option[^3] controls where data will +be written in the worksheet. + +Neither method understands typed arrays, so data columns must be converted to +arrays of arrays. + +#### One Variable per Row + +A single typed array can be converted to a pure JS array with `Array.from`: + +```js +const arr = Array.from(column); +``` + +An array of arrays can be created from the array: + +```js +const aoa = [ + arr // this array is the first element of the array literal +]; +``` + +`aoa_to_sheet` and `sheet_add_aoa` treat this as one row. By default, data will +be written to cells in the first row of the worksheet. + +Titles can be added to data rows with an `unshift` operation, but it is more +efficient to build up the worksheet with `aoa_to_sheet`: + +```js +/* sample data */ +const data = new Float64Array([54337.95, 3.14159, 2.718281828]); +const title = "Values"; + +/* convert sample data to array */ +const arr = Array.from(data); +/* create worksheet from title (array of arrays) */ +const ws = XLSX.utils.aoa_to_sheet([ [ "Values" ] ]); +/* add data starting at B1 */ +XLSX.utils.sheet_add_aoa(ws, [ arr ], { origin: "B1" }); +``` + +![Typed Array to single row with title](pathname:///typedarray/ta-row.png) + +
Live Demo (click to hide) + +In this example, two typed arrays are exported. `aoa_to_sheet` creates the +worksheet and `sheet_add_aoa` will add the data to the sheet. + +```jsx live +function SheetJSeriesToRows() { return (); } +``` + +
+ +#### One Variable per Column + +A single typed array can be converted to a pure JS array with `Array.from`. For +columns, each value should be individually wrapped in an array: + +
JavaScriptSpreadsheet
+ +```js +var data = [ + [54337.95], + [3.14159], + [2.718281828] +]; +``` + + + +![Single column of data](pathname:///typedarray/col.png) + +
+ +`Array.from` takes a second argument. If it is a function, the function will be +called on each element and the value will be used in place of the original value +(in effect, mapping over the data). To generate a data column, each element must +be wrapped in an array literal: + +```js +var arr = Array.from(column, (value) => ([ value ])); +``` + +`aoa_to_sheet` and `sheet_add_aoa` treat this as rows with one column of data +per row. By default, data will be written to cells in column "A". + +Titles can be added to data columns with an `unshift` operation, but it is more +efficient to build up the worksheet with `aoa_to_sheet`: + +```js +/* sample data */ +const data = new Float64Array([54337.95, 3.14159, 2.718281828]); +const title = "Values"; + +/* convert sample data to array */ +const arr = Array.from(data, (value) => ([value])); +/* create worksheet from title (array of arrays) */ +const ws = XLSX.utils.aoa_to_sheet([ [ "Values" ] ]); +/* add data starting at B1 */ +XLSX.utils.sheet_add_aoa(ws, arr, { origin: "A2" }); +``` + +![Typed Array to single column with title](pathname:///typedarray/ta-col.png) + +
Live Demo (click to hide) + +In this example, two typed arrays are exported. `aoa_to_sheet` creates the +worksheet and `sheet_add_aoa` will add the data to the sheet. + +```jsx live +function SheetJSeriesToCols() { return (); } +``` + +
+ +[^1]: See [`aoa_to_sheet` in "Utilities"](/docs/api/utilities/array#array-of-arrays-input) +[^2]: See [`sheet_add_aoa` in "Utilities"](/docs/api/utilities/array#array-of-arrays-input) +[^3]: See [the `origin` option of `sheet_add_aoa` in "Utilities"](/docs/api/utilities/array#array-of-arrays-input) diff --git a/docz/docs/03-demos/02-frontend/19-bundler/03-vitejs.md b/docz/docs/03-demos/02-frontend/19-bundler/03-vitejs.md index 9261cbb..91ae83d 100644 --- a/docz/docs/03-demos/02-frontend/19-bundler/03-vitejs.md +++ b/docz/docs/03-demos/02-frontend/19-bundler/03-vitejs.md @@ -43,6 +43,7 @@ This demo was tested in the following environments: |:---------|:-----------| | `5.0.5` | 2023-12-04 | | `4.5.0` | 2023-12-04 | +| `3.2.7` | 2023-12-05 | ::: diff --git a/docz/docs/03-demos/02-frontend/index.md b/docz/docs/03-demos/02-frontend/index.md index bc65198..8f1f510 100644 --- a/docz/docs/03-demos/02-frontend/index.md +++ b/docz/docs/03-demos/02-frontend/index.md @@ -1,6 +1,6 @@ --- title: Web Frameworks -pagination_prev: demos/index +pagination_prev: demos/math/index pagination_next: demos/grid/index --- diff --git a/docz/docs/03-demos/03-net/01-network/index.mdx b/docz/docs/03-demos/03-net/01-network/index.mdx index 562b4b5..5ca0d7b 100644 --- a/docz/docs/03-demos/03-net/01-network/index.mdx +++ b/docz/docs/03-demos/03-net/01-network/index.mdx @@ -11,6 +11,11 @@ pagination_next: demos/net/upload/index import current from '/version.js'; import CodeBlock from '@theme/CodeBlock'; +`XMLHttpRequest` and `fetch` browser APIs enable binary data transfer between +web browser clients and web servers. Since this library works in web browsers, +server conversion work can be offloaded to the client! This demo shows a few +common scenarios involving browser APIs and popular wrapper libraries. + :::info pass This demo focuses on downloading files. Other demos cover other HTTP use cases: @@ -20,11 +25,6 @@ This demo focuses on downloading files. Other demos cover other HTTP use cases: ::: -`XMLHttpRequest` and `fetch` browser APIs enable binary data transfer between -web browser clients and web servers. Since this library works in web browsers, -server conversion work can be offloaded to the client! This demo shows a few -common scenarios involving browser APIs and popular wrapper libraries. - :::caution Third-Party Hosts and Binary Data Third-party cloud platforms such as AWS may corrupt raw binary downloads by @@ -45,7 +45,20 @@ The APIs generally have a way to control the interpretation of the downloaded data. The `arraybuffer` response type usually forces the data to be presented as an `ArrayBuffer` which can be parsed directly with the SheetJS `read` method[^1]. -For example, with `fetch`: +The following example shows the data flow using `fetch` to download files: + +```mermaid +flowchart LR + server[(Remote\nFile)] + response(Response\nobject) + subgraph SheetJS operations + ab(XLSX Data\nArrayBuffer) + wb(((SheetJS\nWorkbook))) + end + server --> |`fetch`\nGET request| response + response --> |`arrayBuffer`\n\n| ab + ab --> |`read`\n\n| wb +``` ```js /* download data into an ArrayBuffer object */ @@ -69,7 +82,8 @@ contents match the first worksheet. The table is generated using the SheetJS ### XMLHttpRequest For downloading data, the `arraybuffer` response type generates an `ArrayBuffer` -that can be viewed as an `Uint8Array` and fed to `XLSX.read` using `array` type: +that can be viewed as an `Uint8Array` and fed to the SheetJS `read` method. For +legacy browsers, the option `type: "array"` should be specified: ```js /* set up an async GET request */ @@ -122,7 +136,7 @@ function SheetJSXHRDL() { ### fetch For downloading data, `Response#arrayBuffer` resolves to an `ArrayBuffer` that -can be converted to `Uint8Array` and passed to `XLSX.read`: +can be converted to `Uint8Array` and passed to the SheetJS `read` method: ```js fetch(url).then(function(res) { @@ -215,13 +229,14 @@ $.ajax({ ### Wrapper Libraries Before `fetch` shipped with browsers, there were various wrapper libraries to -simplify `XMLHttpRequest`. Due to limitations with `fetch`, these libraries -are still relevant. +simplify `XMLHttpRequest`. Due to limitations with `fetch`, these libraries are +still relevant. #### axios [`axios`](https://axios-http.com/) presents a Promise based interface. Setting -`responseType` to `arraybuffer` ensures the return type is an ArrayBuffer: +`responseType` to `arraybuffer` ensures the return type is an ArrayBuffer. The +`data` property of the result can be passed to the SheetJS `read` method: ```js async function workbook_dl_axios(url) { @@ -491,7 +506,7 @@ npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz request #### axios When the `responseType` is `"arraybuffer"`, `axios` actually captures the data -in a NodeJS Buffer. `XLSX.read` will transparently handle Buffers: +in a NodeJS Buffer. The SheetJS `read` method handles NodeJS Buffer objects: ```js title="SheetJSAxios.js" const XLSX = require("xlsx"), axios = require("axios"); @@ -548,6 +563,8 @@ Other demos show network operations in special platforms: - [React Native "Fetching Remote Data"](/docs/demos/mobile/reactnative#fetching-remote-data) - [NativeScript "Fetching Remote Files"](/docs/demos/mobile/nativescript#fetching-remote-files) +- [AngularJS "Remote Files"](/docs/demos/frontend/angularjs#remote-files) +- [Dojo Toolkit "Parsing Remote Files"](/docs/demos/frontend/dojo#parsing-remote-files) [^1]: See [`read` in "Reading Files"](/docs/api/parse-options) [^2]: See [`sheet_to_html` in "Utilities"](/docs/api/utilities/html#html-table-output) diff --git a/docz/docs/03-demos/17-mobile/01-reactnative.md b/docz/docs/03-demos/17-mobile/01-reactnative.md index 5cd49de..ddb4a3a 100644 --- a/docz/docs/03-demos/17-mobile/01-reactnative.md +++ b/docz/docs/03-demos/17-mobile/01-reactnative.md @@ -219,17 +219,17 @@ This demo was tested in the following environments: | OS | Type | Device | RN | Date | |:-----------|:-----|:--------------------|:---------|:-----------| -| Android 34 | Sim | Pixel 3a | `0.72.7` | 2023-12-04 | -| iOS 17.0.1 | Sim | iPhone 15 Pro Max | `0.72.7` | 2023-12-04 | -| Android 29 | Real | NVIDIA Shield | `0.72.7` | 2023-12-04 | -| iOS 15.1 | Real | iPad Pro | `0.72.7` | 2023-12-04 | +| Android 34 | Sim | Pixel 3a | `0.73.1` | 2023-12-21 | +| iOS 17.2 | Sim | iPhone 15 Pro Max | `0.73.1` | 2023-12-21 | +| Android 29 | Real | NVIDIA Shield | `0.73.1` | 2023-12-21 | +| iOS 15.1 | Real | iPad Pro | `0.73.1` | 2023-12-21 | ::: 1) Create project: ```bash -npx -y react-native@0.72.7 init SheetJSRNFetch --version="0.72.7" +npx -y react-native@0.73.1 init SheetJSRNFetch --version="0.73.1" ``` 2) Install shared dependencies: @@ -249,16 +249,16 @@ curl -LO https://docs.sheetjs.com/reactnative/App.tsx **Android Testing** -4) Install or switch to Java 11[^6] +4) Install or switch to Java 17[^6] :::note pass When the demo was last tested on macOS, `java -version` displayed the following: ``` -openjdk version "11.0.21" 2023-10-17 LTS -OpenJDK Runtime Environment Zulu11.68+17-CA (build 11.0.21+9-LTS) -OpenJDK 64-Bit Server VM Zulu11.68+17-CA (build 11.0.21+9-LTS, mixed mode) +openjdk version "17.0.9" 2023-10-17 +OpenJDK Runtime Environment Temurin-17.0.9+9 (build 17.0.9+9) +OpenJDK 64-Bit Server VM Temurin-17.0.9+9 (build 17.0.9+9, mixed mode) ``` ::: @@ -274,8 +274,14 @@ npx react-native run-android If the initial launch fails with an error referencing the emulator, manually start the emulator and try again. -Gradle errors typically stem from a Java version mismatch. Run `java -version` -and verify that the Java major version is 11. +Gradle errors typically stem from a Java version mismatch: + +``` +> Failed to apply plugin 'com.android.internal.application'. + > Android Gradle plugin requires Java 17 to run. You are currently using Java 11. +``` + +This error can be resolved by installing and switching to the requested version. ::: @@ -299,7 +305,9 @@ tapping "Import data from a spreadsheet", verify that the app shows new data: :::warning pass -iOS testing requires macOS. It does not work on Windows or Linux. +**iOS testing can only be performed on Apple hardware running macOS!** + +Xcode and iOS simulators are not available on Windows or Linux. ::: @@ -349,7 +357,7 @@ npx react-native run-android 13) Close any Android / iOS emulators. -14) Enable developer code signing certificates[^7] +14) Enable developer code signing certificates[^7]. 15) Install `ios-deploy` through Homebrew: @@ -363,6 +371,67 @@ brew install ios-deploy npx react-native run-ios ``` +:::caution pass + +When this demo was last tested, the build failed with the following error: + +``` +PhaseScriptExecution failed with a nonzero exit code +``` + +This was due to an error in the `react-native` package. The script +`node_modules/react-native/scripts/react-native-xcode.sh` must be edited. + +Near the top of the script, there will be a `set` statement: + +```bash title="node_modules/react-native/scripts/react-native-xcode.sh" +# Print commands before executing them (useful for troubleshooting) +# highlight-next-line +set -x -e +DEST=$CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH +``` + +The `-e` argument must be removed: + +```bash title="node_modules/react-native/scripts/react-native-xcode.sh (edit line)" +# Print commands before executing them (useful for troubleshooting) +# highlight-next-line +set -x +DEST=$CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH +``` + +::: + +:::info pass + +By default, React Native generates applications that exclusively target iPhone. +On a physical iPad, a pixellated iPhone app will be run. + +The "targeted device families" setting must be changed to support iPad: + +A) Open the Xcode workspace: + +```bash +open ./ios/SheetJSRNFetch.xcworkspace +``` + +B) Select the project in the left sidebar: + +![Select the project](pathname:///reactnative/xcode-select-project.png) + +C) Select the "SheetJSRNFetch" target in the sidebar. + +![Settings](pathname:///reactnative/xcode-targets.png) + +D) Select the "Build Settings" tab in the main area. + +E) In the search bar below "Build Settings", type "tar" + +F) Look for the "Targeted Device Families" row. Change the corresponding value +to "iPhone, iPad". + +::: + ## Local Files :::warning pass @@ -987,6 +1056,6 @@ npx xlsx-cli /tmp/sheetjsw.xlsx [^3]: See ["Array Output" in "Utility Functions"](/docs/api/utilities/array#array-output) [^4]: See ["Array of Arrays Input" in "Utility Functions"](/docs/api/utilities/array#array-of-arrays-input) [^5]: React-Native commit [`5b597b5`](https://github.com/facebook/react-native/commit/5b597b5ff94953accc635ed3090186baeecb3873) added the final piece required for `fetch` support. It landed in version `0.72.0-rc.1` and is available in official releases starting from `0.72.0`. -[^6]: When the demo was last tested, the Zulu11 distribution of Java 11 was installed through the macOS Brew package manager. [Direct downloads are available at `azul.com`](https://www.azul.com/downloads/?version=java-11-lts&package=jdk#zulu) +[^6]: When the demo was last tested, the Temurin distribution of Java 17 was installed through the macOS Brew package manager by running `brew install temurin17`. [Direct downloads are available at `adoptium.net`](https://adoptium.net/temurin/releases/?version=17) [^7]: See ["Running On Device"](https://reactnative.dev/docs/running-on-device) in the React Native documentation [^8]: Follow the ["React Native CLI Quickstart"](https://reactnative.dev/docs/environment-setup) for Android (and iOS, if applicable) \ No newline at end of file diff --git a/docz/docs/03-demos/17-mobile/05-capacitor.md b/docz/docs/03-demos/17-mobile/05-capacitor.md index 8511c83..233702f 100644 --- a/docz/docs/03-demos/17-mobile/05-capacitor.md +++ b/docz/docs/03-demos/17-mobile/05-capacitor.md @@ -178,7 +178,7 @@ npx cap init sheetjs-cap com.sheetjs.cap --web-dir=dist npm run build ``` -:::note +:::note pass If prompted to create an Ionic account, type `N` and press Enter. diff --git a/docz/docs/03-demos/19-desktop/01-electron.md b/docz/docs/03-demos/19-desktop/01-electron.md index fe9e3ce..9ce26a2 100644 --- a/docz/docs/03-demos/19-desktop/01-electron.md +++ b/docz/docs/03-demos/19-desktop/01-electron.md @@ -184,11 +184,11 @@ This demo was tested in the following environments: | OS and Version | Architecture | Electron | Date | |:---------------|:-------------|:---------|:-----------| -| macOS 13.5.1 | `darwin-x64` | `26.1.0` | 2023-09-03 | +| macOS 13.5.1 | `darwin-x64` | `27.1.3` | 2023-12-09 | | macOS 14.1.2 | `darwin-arm` | `27.1.3` | 2023-12-01 | -| Windows 10 | `win10-x64` | `26.1.0` | 2023-09-03 | +| Windows 10 | `win10-x64` | `27.1.3` | 2023-12-09 | | Windows 11 | `win11-arm` | `27.1.3` | 2023-12-01 | -| Linux (HoloOS) | `linux-x64` | `27.0.0` | 2023-10-11 | +| Linux (HoloOS) | `linux-x64` | `27.1.3` | 2023-12-09 | | Linux (Debian) | `linux-arm` | `27.1.3` | 2023-12-01 | ::: @@ -247,7 +247,7 @@ The app will show. npm run make ``` -This will create a package in the `out\make` folder. +This will create a package in the `out\make` folder and a standalone binary. :::caution pass @@ -266,11 +266,13 @@ The program will run on ARM64 Windows. 5) Download [the test file `pres.numbers`](https://sheetjs.com/pres.numbers) -6) Re-launch the application in the test environment: +6) Launch the generated application: -```bash -npx -y electron . -``` +| Architecture | Command | +|:-------------|:--------------------------------------------------------------| +| `darwin-x64` | `open ./out/sheetjs-electron-darwin-x64/sheetjs-electron.app` | +| `win10-x64` | `.\out\sheetjs-electron-win32-x64\sheetjs-electron.exe` | +| `linux-x64` | `./out/sheetjs-electron-linux-x64/sheetjs-electron` | #### Electron API @@ -284,7 +286,7 @@ to write to `Untitled.xls` in the Downloads folder. :::note pass -During the most recent Linux ARM64 test, the dialog did not have a default name. +In some tests, the dialog did not have a default name. If there is no default name, enter `Untitled.xls` and click "Save". @@ -335,4 +337,4 @@ call is required to enable Developer Tools in the window. ::: -[^1]: See ["Makers"](https://www.electronforge.io/config/makers) in the Electron Forge documentation. On Linux, the demo generates `rpm` and `deb` distributables. \ No newline at end of file +[^1]: See ["Makers"](https://www.electronforge.io/config/makers) in the Electron Forge documentation. On Linux, the demo generates `rpm` and `deb` distributables. On Arch Linux and the Steam Deck, `sudo pacman -Syu rpm-tools dpkg fakeroot` installed required packages. \ No newline at end of file diff --git a/docz/docs/03-demos/19-desktop/02-nwjs.md b/docz/docs/03-demos/19-desktop/02-nwjs.md index 74ad237..eb59c52 100644 --- a/docz/docs/03-demos/19-desktop/02-nwjs.md +++ b/docz/docs/03-demos/19-desktop/02-nwjs.md @@ -115,9 +115,9 @@ This demo was tested in the following environments: |:---------------|:-------------|:---------|:-----------| | macOS 13.5.2 | `darwin-x64` | `0.78.1` | 2023-09-27 | | macOS 14.1.2 | `darwin-arm` | `0.82.0` | 2023-12-01 | -| Windows 10 | `win10-x64` | `0.78.1` | 2023-09-27 | +| Windows 10 | `win10-x64` | `0.82.0` | 2023-12-09 | | Windows 11 | `win11-arm` | `0.82.0` | 2023-12-01 | -| Linux (HoloOS) | `linux-x64` | `0.78.1` | 2023-10-11 | +| Linux (HoloOS) | `linux-x64` | `0.82.0` | 2023-12-07 | There is no official Linux ARM64 release. The community release[^1] was tested and verified on 2023-09-27. diff --git a/docz/docs/03-demos/19-desktop/03-wails.md b/docz/docs/03-demos/19-desktop/03-wails.md index 588632b..2275757 100644 --- a/docz/docs/03-demos/19-desktop/03-wails.md +++ b/docz/docs/03-demos/19-desktop/03-wails.md @@ -299,7 +299,7 @@ This demo was tested in the following environments: |:---------------|:-------------|:---------|:-----------| | macOS 13.6 | `darwin-x64` | `v2.6.0` | 2023-11-05 | | macOS 14.1.2 | `darwin-arm` | `v2.6.0` | 2023-12-01 | -| Windows 10 | `win10-x64` | `v2.5.1` | 2023-08-25 | +| Windows 10 | `win10-x64` | `v2.6.0` | 2023-12-09 | | Windows 11 | `win11-arm` | `v2.6.0` | 2023-12-01 | | Linux (HoloOS) | `linux-x64` | `v2.6.0` | 2023-10-11 | | Linux (Debian) | `linux-arm` | `v2.6.0` | 2023-12-01 | diff --git a/docz/docs/03-demos/19-desktop/05-neutralino.md b/docz/docs/03-demos/19-desktop/05-neutralino.md index f0ec717..105920d 100644 --- a/docz/docs/03-demos/19-desktop/05-neutralino.md +++ b/docz/docs/03-demos/19-desktop/05-neutralino.md @@ -192,11 +192,11 @@ This demo was tested in the following environments: | OS and Version | Architecture | Server | Client | Date | |:---------------|:-------------|:----------|:----------|:-----------| -| macOS 13.5.1 | `darwin-x64` | `v4.13.0` | `v3.11.0` | 2023-08-26 | +| macOS 13.5.1 | `darwin-x64` | `v4.14.1` | `v3.12.0` | 2023-12-13 | | macOS 14.0 | `darwin-arm` | `v4.14.1` | `v3.12.0` | 2023-10-18 | -| Windows 10 | `win10-x64` | `v4.13.0` | `v3.11.0` | 2023-08-26 | +| Windows 10 | `win10-x64` | `v4.14.1` | `v3.12.0` | 2023-12-09 | | Windows 11 | `win11-arm` | `v4.14.1` | `v3.12.0` | 2023-12-01 | -| Linux (HoloOS) | `linux-x64` | `v4.14.1` | `v3.12.0` | 2023-10-11 | +| Linux (HoloOS) | `linux-x64` | `v4.14.1` | `v3.12.0` | 2023-12-09 | | Linux (Debian) | `linux-arm` | `v4.14.1` | `v3.12.0` | 2023-12-01 | ::: diff --git a/docz/docs/03-demos/19-desktop/09-cli.md b/docz/docs/03-demos/19-desktop/09-cli.md index 3132199..57aea31 100644 --- a/docz/docs/03-demos/19-desktop/09-cli.md +++ b/docz/docs/03-demos/19-desktop/09-cli.md @@ -55,7 +55,7 @@ This demo was tested in the following deployments: | `darwin-arm` | `4.0.0-rc.2` | `18.18.0` | 2023-12-01 | | `win10-x64` | `4.0.0-rc.2` | `14.15.3` | 2023-10-09 | | `win11-arm` | `4.0.0-rc.2` | `20.10.0` | 2023-12-01 | -| `linux-x64` | `4.0.0-rc.2` | `14.15.3` | 2023-10-11 | +| `linux-x64` | `4.0.0-rc.2` | `14.15.3` | 2023-12-07 | | `linux-arm` | `4.0.0-rc.2` | `20.10.0` | 2023-12-01 | @@ -67,7 +67,7 @@ This demo was tested in the following deployments: | `darwin-arm` | `5.8.1` | `18.5.0` | 2023-12-01 | | `win10-x64` | `5.8.1` | `18.5.0` | 2023-10-09 | | `win11-arm` | `5.8.1` | `18.5.0` | 2023-12-01 | -| `linux-x64` | `5.8.1` | `18.5.0` | 2023-10-11 | +| `linux-x64` | `5.8.1` | `18.5.0` | 2023-12-07 | | `linux-arm` | `5.8.1` | `18.5.0` | 2023-12-01 | @@ -78,7 +78,7 @@ This demo was tested in the following deployments: | `darwin-x64` | `2.1.2` | `20.8.0` | 2023-10-12 | | `darwin-arm` | `2.3.0` | `21.3.0` | 2023-12-01 | | `win10-x64` | `2.1.2` | `16.20.2` | 2023-10-09 | -| `linux-x64` | `2.1.2` | `20.8.0` | 2023-10-11 | +| `linux-x64` | `2.3.0` | `21.4.0` | 2023-12-07 | | `linux-arm` | `2.3.0` | `21.3.0` | 2023-12-01 | diff --git a/docz/docs/03-demos/30-cloud/02-netsuite.md b/docz/docs/03-demos/30-cloud/02-netsuite.md index 249fabc..8f8de36 100644 --- a/docz/docs/03-demos/30-cloud/02-netsuite.md +++ b/docz/docs/03-demos/30-cloud/02-netsuite.md @@ -24,10 +24,10 @@ This demo was verified by NetSuite consultants in the following deployments: | `@NScriptType` | `@NApiVersion` | Date | |:----------------|:---------------|:-----------| -| ScheduledScript | 2.1 | 2023-08-18 | +| ScheduledScript | 2.1 | 2023-12-13 | | Restlet | 2.1 | 2023-10-05 | -| Suitelet | 2.1 | 2023-10-27 | -| MapReduceScript | 2.1 | 2023-11-16 | +| Suitelet | 2.1 | 2023-12-22 | +| MapReduceScript | 2.1 | 2023-12-07 | ::: diff --git a/docz/docs/03-demos/30-cloud/18-github.md b/docz/docs/03-demos/30-cloud/18-github.md index 7d51826..51b3090 100644 --- a/docz/docs/03-demos/30-cloud/18-github.md +++ b/docz/docs/03-demos/30-cloud/18-github.md @@ -1,5 +1,5 @@ --- -title: Data Processing in GitHub +title: Flat Data Processing in GitHub sidebar_label: GitHub pagination_prev: demos/local/index pagination_next: demos/extensions/index @@ -8,15 +8,12 @@ pagination_next: demos/extensions/index import current from '/version.js'; import CodeBlock from '@theme/CodeBlock'; -Many official data releases by governments and organizations include XLSX or -XLS files. Unfortunately some data sources do not retain older versions. - [Git](https://git-scm.com/) is a popular system for organizing a historical record of text files and changes. Git can also store and track spreadsheets. -[GitHub](https://github.com/) hosts Git repositories and provides infrastructure -to run scheduled tasks. ["Flat Data"](https://octo.github.com/projects/flat-data) -explores storing and comparing versions of structured CSV and JSON data. +GitHub hosts Git repositories and provides infrastructure to execute workflows. +The ["Flat Data" project](https://octo.github.com/projects/flat-data) explores +storing and comparing versions of structured data using GitHub infrastructure. [SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing data from spreadsheets. @@ -29,7 +26,7 @@ changes over time. ["Excel to CSV"](https://octo.github.com/projects/flat-data#:~:text=Excel) is an official example that pulls XLSX workbooks from an endpoint and uses SheetJS to -parse the workbooks and generate CSV files: +parse the workbooks and generate CSV files. ::: @@ -38,8 +35,8 @@ The following diagram depicts the data dance: ```mermaid sequenceDiagram autonumber - participant R as GH Repo - participant A as GH Action + participant R as GitHub Repo + participant A as GitHub Action participant S as Data Source loop Regular Interval (cron) A->>R: clone repo @@ -56,18 +53,30 @@ sequenceDiagram ## Flat Data +Many official data releases by governments and organizations include XLSX or +XLS files. Unfortunately some data sources do not retain older versions. + +Software developers typically use version control systems such as Git to track +changes in source code. + +The "Flat Data" project starts from the idea that the same version control +systems can be used to track changes in data. Third-party data sources can be +snapshotted at regular intervals and stored in Git repositories. + +### Components + As a project from the company, the entire lifecycle uses GitHub offerings: -- GitHub offers free hosting for Git repositories -- GitHub Actions[^1] infrastructure runs tasks at regular intervals -- `githubocto/flat`[^2] library helps fetch data and automate post-processing -- `flat-postprocessing`[^3] library provides post-processing helper functions -- "Flat Viewer"[^4] displays structured CSV and JSON data from Git repositories +- GitHub.com[^1] offers free hosting for Git repositories +- GitHub Actions[^2] infrastructure runs tasks at regular intervals +- `githubocto/flat`[^3] library helps fetch data and automate post-processing +- `flat-postprocessing`[^4] library provides post-processing helper functions +- "Flat Viewer"[^5] displays structured CSV and JSON data from Git repositories :::caution pass A GitHub account is required. When the demo was last tested, "GitHub Free" -accounts had no Actions usage limits for public repositories[^5]. +accounts had no Actions usage limits for public repositories[^6]. Private GitHub repositories can be used for processing data, but the Flat Viewer will not be able to display private data. @@ -143,12 +152,12 @@ for more details. The first argument to the post-processing script is the filename. -The SheetJS `readFile` method[^6] will read the file and generate a SheetJS -workbook object[^7]. After extracting the first worksheet, `sheet_to_csv`[^8] +The SheetJS `readFile` method[^7] will read the file and generate a SheetJS +workbook object[^8]. After extracting the first worksheet, `sheet_to_csv`[^9] generates a CSV string. After generating a CSV string, the string should be written to the filesystem -using `Deno.writeFileSync`[^9]. By convention, the CSV should preserve the file +using `Deno.writeFileSync`[^10]. By convention, the CSV should preserve the file name stem and replace the extension with `.csv`: {`\ @@ -316,12 +325,13 @@ jobs: The column chart in the Index column is a histogram. -[^1]: See ["GitHub Actions documentation"](https://docs.github.com/en/actions) -[^2]: See [`githubocto/flat`](https://github.com/githubocto/flat) repo on GitHub. -[^3]: See [`githubocto/flat-postprocessing`](https://github.com/githubocto/flat-postprocessing) repo on GitHub. -[^4]: The hosted version is available at -[^5]: See ["About billing for GitHub Actions"](https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions) in the GitHub documentation. -[^6]: See [`readFile` in "Reading Files"](/docs/api/parse-options) -[^7]: See ["Workbook Object"](/docs/csf/book) -[^8]: See [`sheet_to_csv` in "CSV and Text"](/docs/api/utilities/csv#delimiter-separated-output) -[^9]: See [`Deno.writeFileSync`](https://deno.land/api?s=Deno.writeFileSync) in the Deno Runtime APIs documentation. \ No newline at end of file +[^1]: See ["Repositories documentation"](https://docs.github.com/en/repositories) in the GitHub documentation. +[^2]: See ["GitHub Actions documentation"](https://docs.github.com/en/actions) in the GitHub documentation. +[^3]: See [`githubocto/flat`](https://github.com/githubocto/flat) repo on GitHub. +[^4]: See [`githubocto/flat-postprocessing`](https://github.com/githubocto/flat-postprocessing) repo on GitHub. +[^5]: The hosted version is available at +[^6]: See ["About billing for GitHub Actions"](https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions) in the GitHub documentation. +[^7]: See [`readFile` in "Reading Files"](/docs/api/parse-options) +[^8]: See ["Workbook Object"](/docs/csf/book) +[^9]: See [`sheet_to_csv` in "CSV and Text"](/docs/api/utilities/csv#delimiter-separated-output) +[^10]: See [`Deno.writeFileSync`](https://deno.land/api?s=Deno.writeFileSync) in the Deno Runtime APIs documentation. \ No newline at end of file diff --git a/docz/docs/03-demos/32-extensions/12-maple.md b/docz/docs/03-demos/32-extensions/12-maple.md index f63f2f7..32ee9f6 100644 --- a/docz/docs/03-demos/32-extensions/12-maple.md +++ b/docz/docs/03-demos/32-extensions/12-maple.md @@ -28,7 +28,7 @@ flowchart LR nfile --> |ExcelTools\nImport|data ``` -:::note +:::note Tested Deployments This demo was last tested by SheetJS users on 2023 October 3 in Maple 2023. diff --git a/docz/docs/03-demos/37-bigdata/03-ml.mdx b/docz/docs/03-demos/37-bigdata/03-ml.mdx deleted file mode 100644 index ea67544..0000000 --- a/docz/docs/03-demos/37-bigdata/03-ml.mdx +++ /dev/null @@ -1,347 +0,0 @@ ---- -title: Typed Arrays and ML -pagination_prev: demos/extensions/index -pagination_next: demos/engines/index -sidebar_custom_props: - summary: Parse and serialize Uint8Array data from TensorFlow ---- - - - - - -Machine learning libraries in JS typically use "Typed Arrays". Typed Arrays are -not JS Arrays! With some data wrangling, translating between SheetJS worksheets -and typed arrays is straightforward. - -This demo covers conversions between worksheets and Typed Arrays for use with -TensorFlow.js and other ML libraries. - -:::info pass - -Live code blocks in this page load the standalone build from version `4.10.0`. - -For use in web frameworks, the `@tensorflow/tfjs` module should be used. - -For use in NodeJS, the native bindings module is `@tensorflow/tfjs-node`. - -::: - -:::note pass - -Each browser demo was tested in the following environments: - -| Browser | Date | TF.js version | -|:------------|:-----------|:--------------| -| Chrome 116 | 2023-09-02 | `4.10.0` | -| Safari 16.6 | 2023-09-02 | `4.10.0` | -| Brave 1.57 | 2023-09-02 | `4.10.0` | - -::: - -## CSV Data Interchange - -`tf.data.csv` generates a Dataset from CSV data. The function expects a URL. -Fortunately blob URLs are supported, making data import straightforward: - -```js -function worksheet_to_csv_url(worksheet) { - /* generate CSV */ - const csv = XLSX.utils.sheet_to_csv(worksheet); - - /* CSV -> Uint8Array -> Blob */ - const u8 = new TextEncoder().encode(csv); - const blob = new Blob([u8], { type: "text/csv" }); - - /* generate a blob URL */ - return URL.createObjectURL(blob); -} -``` - -
TF CSV Demo using XLSX files (click to show) - -This demo shows a simple model fitting using the "Boston Housing" dataset. The -[sample XLSX file](https://sheetjs.com/data/bht.xlsx) contains the data. - -The demo first fetches the XLSX file and generates CSV text. A blob URL is -generated and fed to `tf.data.csv`. The rest of the demo follows the official -example in the TensorFlow documentation. - -:::caution pass - -If the live demo shows a message - -``` -ReferenceError: tf is not defined -``` - -please refresh the page. This is a known bug in the documentation generator. - -::: - -```jsx live -function SheetJSToTFJSCSV() { - const [output, setOutput] = React.useState(""); - const doit = React.useCallback(async () => { - /* fetch file */ - const f = await fetch("https://sheetjs.com/data/bht.xlsx"); - const ab = await f.arrayBuffer(); - /* parse file and get first worksheet */ - const wb = XLSX.read(ab); - const ws = wb.Sheets[wb.SheetNames[0]]; - - /* generate CSV */ - const csv = XLSX.utils.sheet_to_csv(ws); - - /* generate blob URL */ - const u8 = new TextEncoder().encode(csv); - const blob = new Blob([u8], {type: "text/csv"}); - const url = URL.createObjectURL(blob); - - /* feed to tfjs */ - const dataset = tf.data.csv(url, {columnConfigs:{"medv":{isLabel:true}}}); - - /* this part mirrors the tf.data.csv docs */ - const flat = dataset.map(({xs,ys}) => ({xs: Object.values(xs), ys: Object.values(ys)})).batch(10); - const model = tf.sequential(); - model.add(tf.layers.dense({inputShape: [(await dataset.columnNames()).length - 1], units: 1})); - model.compile({ optimizer: tf.train.sgd(0.000001), loss: 'meanSquaredError' }); - let base = output; - await model.fitDataset(flat, { epochs: 10, callbacks: { onEpochEnd: async (epoch, logs) => { - setOutput(base += "\n" + epoch + ":" + logs.loss); - }}}); - model.summary(); - }); - return (
-    
-    {output}
-  
); -} -``` - -
- -In the other direction, `XLSX.read` will readily parse CSV exports. - -## JS Array Interchange - -[The official Linear Regression tutorial](https://www.tensorflow.org/js/tutorials/training/linear_regression) -loads data from a JSON file: - -```json -[ - { - "Name": "chevrolet chevelle malibu", - "Miles_per_Gallon": 18, - "Cylinders": 8, - "Displacement": 307, - "Horsepower": 130, - "Weight_in_lbs": 3504, - "Acceleration": 12, - "Year": "1970-01-01", - "Origin": "USA" - }, - { - "Name": "buick skylark 320", - "Miles_per_Gallon": 15, - "Cylinders": 8, - "Displacement": 350, - "Horsepower": 165, - "Weight_in_lbs": 3693, - "Acceleration": 11.5, - "Year": "1970-01-01", - "Origin": "USA" - }, - // ... -] -``` - -In real use cases, data is stored in [spreadsheets](https://sheetjs.com/data/cd.xls) - -![cd.xls screenshot](pathname:///files/cd.png) - -Following the tutorial, the data fetching method is easily adapted. Differences -from the official example are highlighted below: - -```js -/** - * Get the car data reduced to just the variables we are interested - * and cleaned of missing data. - */ -async function getData() { - // highlight-start - /* fetch file */ - const carsDataResponse = await fetch('https://sheetjs.com/data/cd.xls'); - /* get file data (ArrayBuffer) */ - const carsDataAB = await carsDataResponse.arrayBuffer(); - /* parse */ - const carsDataWB = XLSX.read(carsDataAB); - /* get first worksheet */ - const carsDataWS = carsDataWB.Sheets[carsDataWB.SheetNames[0]]; - /* generate array of JS objects */ - const carsData = XLSX.utils.sheet_to_json(carsDataWS); - // highlight-end - const cleaned = carsData.map(car => ({ - mpg: car.Miles_per_Gallon, - horsepower: car.Horsepower, - })) - .filter(car => (car.mpg != null && car.horsepower != null)); - - return cleaned; -} -``` - -## Low-Level Operations - -:::caution pass - -While it is more efficient to use low-level operations, JS or CSV interchange -is strongly recommended when possible. - -::: - -### Data Transposition - -A typical dataset in a spreadsheet will start with one header row and represent -each data record in its own row. For example, the Iris dataset might look like - -![Iris dataset](pathname:///files/iris.png) - -`XLSX.utils.sheet_to_json` will translate this into an array of row objects: - -```js -var aoo = [ - {"sepal length": 5.1, "sepal width": 3.5, ...}, - {"sepal length": 4.9, "sepal width": 3, ...}, - ... -]; -``` - -TF.js and other libraries tend to operate on individual columns, equivalent to: - -```js -var sepal_lengths = [5.1, 4.9, ...]; -var sepal_widths = [3.5, 3, ...]; -``` - -When a `tensor2d` can be exported, it will look different from the spreadsheet: - -```js -var data_set_2d = [ - [5.1, 4.9, ...], - [3.5, 3, ...], - ... -] -``` - -This is the transpose of how people use spreadsheets! - -#### Typed Arrays and Columns - -A single typed array can be converted to a pure JS array with `Array.from`: - -```js -var column = Array.from(dataset_typedarray); -``` - -Similarly, `Float32Array.from` generates a typed array from a normal array: - -```js -var dataset = Float32Array.from(column); -``` - -### Exporting Datasets to a Worksheet - -`XLSX.utils.aoa_to_sheet` can generate a worksheet from an array of arrays. -ML libraries typically provide APIs to pull an array of arrays, but it will -be transposed. To export multiple data sets, manually "transpose" the data: - -```js -/* assuming data is an array of typed arrays */ -var aoa = []; -for(var i = 0; i < data.length; ++i) { - for(var j = 0; j < data[i].length; ++j) { - if(!aoa[j]) aoa[j] = []; - aoa[j][i] = data[i][j]; - } -} -/* aoa can be directly converted to a worksheet object */ -var ws = XLSX.utils.aoa_to_sheet(aoa); -``` - -### Importing Data from a Spreadsheet - -`sheet_to_json` with the option `header:1` will generate a row-major array of -arrays that can be transposed. However, it is more efficient to walk the sheet -manually: - -```js -/* find worksheet range */ -var range = XLSX.utils.decode_range(ws['!ref']); -var out = [] -/* walk the columns */ -for(var C = range.s.c; C <= range.e.c; ++C) { - /* create the typed array */ - var ta = new Float32Array(range.e.r - range.s.r + 1); - /* walk the rows */ - for(var R = range.s.r; R <= range.e.r; ++R) { - /* find the cell, skip it if the cell isn't numeric or boolean */ - var cell = ws[XLSX.utils.encode_cell({r:R, c:C})]; - if(!cell || cell.t != 'n' && cell.t != 'b') continue; - /* assign to the typed array */ - ta[R - range.s.r] = cell.v; - } - out.push(ta); -} -``` - -If the data set has a header row, the loop can be adjusted to skip those rows. - -### TF.js Tensors - -A single `Array#map` can pull individual named fields from the result, which -can be used to construct TensorFlow.js tensor objects: - -```js -const aoo = XLSX.utils.sheet_to_json(worksheet); -const lengths = aoo.map(row => row["sepal length"]); -const tensor = tf.tensor1d(lengths); -``` - -`tf.Tensor` objects can be directly transposed using `transpose`: - -```js -var aoo = XLSX.utils.sheet_to_json(worksheet); -// "x" and "y" are the fields we want to pull from the data -var data = aoo.map(row => ([row["x"], row["y"]])); - -// create a tensor representing two column datasets -var tensor = tf.tensor2d(data).transpose(); - -// individual columns can be accessed -var col1 = tensor.slice([0,0], [1,tensor.shape[1]]).flatten(); -var col2 = tensor.slice([1,0], [1,tensor.shape[1]]).flatten(); -``` - -For exporting, `stack` can be used to collapse the columns into a linear array: - -```js -/* pull data into a Float32Array */ -var result = tf.stack([col1, col2]).transpose(); -var shape = tensor.shape; -var f32 = tensor.dataSync(); - -/* construct an array of arrays of the data in spreadsheet order */ -var aoa = []; -for(var j = 0; j < shape[0]; ++j) { - aoa[j] = []; - for(var i = 0; i < shape[1]; ++i) aoa[j][i] = f32[j * shape[1] + i]; -} - -/* add headers to the top */ -aoa.unshift(["x", "y"]); - -/* generate worksheet */ -var worksheet = XLSX.utils.aoa_to_sheet(aoa); -``` - diff --git a/docz/docs/03-demos/42-engines/01-duktape.md b/docz/docs/03-demos/42-engines/01-duktape.md index 8efcc89..9f7f512 100644 --- a/docz/docs/03-demos/42-engines/01-duktape.md +++ b/docz/docs/03-demos/42-engines/01-duktape.md @@ -130,11 +130,11 @@ This demo was tested in the following deployments: | Architecture | Version | Date | |:-------------|:--------|:-----------| -| `darwin-x64` | `2.7.0` | 2023-10-26 | +| `darwin-x64` | `2.7.0` | 2023-12-05 | | `darwin-arm` | `2.7.0` | 2023-10-18 | | `win10-x64` | `2.7.0` | 2023-10-27 | | `win11-arm` | `2.7.0` | 2023-12-01 | -| `linux-x64` | `2.7.0` | 2023-10-11 | +| `linux-x64` | `2.7.0` | 2023-12-07 | | `linux-arm` | `2.7.0` | 2023-12-01 | ::: diff --git a/docz/docs/03-demos/42-engines/03-rhino.md b/docz/docs/03-demos/42-engines/03-rhino.md index eeb0e9c..7edbee9 100644 --- a/docz/docs/03-demos/42-engines/03-rhino.md +++ b/docz/docs/03-demos/42-engines/03-rhino.md @@ -17,8 +17,18 @@ result is a JAR. :::caution pass -Rhino does not support Uint8Array, so certain formats like NUMBERS cannot be -parsed or written from Rhino JS code! +Rhino does not support Uint8Array, so NUMBERS files cannot be read or written. + +::: + +:::note Tested Deployments + +This demo was tested in the following deployments: + +| OpenJDK | Rhino | Date | +|:--------|:---------|:-----------| +| 21.0.1 | `1.7.14` | 2023-12-05 | +| 1.8.0 | `1.7.14` | 2023-12-05 | ::: @@ -118,12 +128,6 @@ This string can be loaded into the JS engine and processed: ## Complete Example -:::note - -This demo was tested on 2023-10-26 against Rhino 1.7.14. - -::: - 0) Ensure Java is installed. 1) Create a folder for the project: diff --git a/docz/docs/03-demos/42-engines/08-quickjs.md b/docz/docs/03-demos/42-engines/08-quickjs.md index a571123..b20635d 100644 --- a/docz/docs/03-demos/42-engines/08-quickjs.md +++ b/docz/docs/03-demos/42-engines/08-quickjs.md @@ -27,7 +27,7 @@ command-line tool for reading data from files. :::note pass Many QuickJS functions are not documented. The explanation was verified against -the latest release (commit `2788d71`). +the latest release (commit `daa35bc`). ::: @@ -262,14 +262,14 @@ This demo was tested in the following deployments: | Architecture | Git Commit | Date | |:-------------|:-----------|:-----------| -| `darwin-x64` | `2788d71` | 2023-10-26 | +| `darwin-x64` | `daa35bc` | 2023-12-09 | | `darwin-arm` | `2788d71` | 2023-10-18 | -| `win10-x64` | `2788d71` | 2023-10-09 | +| `win10-x64` | `daa35bc` | 2023-12-09 | | `win11-arm` | `03cc5ec` | 2023-12-01 | -| `linux-x64` | `2788d71` | 2023-10-11 | +| `linux-x64` | `03cc5ec` | 2023-12-07 | | `linux-arm` | `03cc5ec` | 2023-12-01 | -When the demo was tested, commit `03cc5ec` corresponded to the latest commit. +When the demo was tested, commit `daa35bc` corresponded to the latest release. ::: @@ -285,7 +285,7 @@ tests were run entirely within Windows Subsystem for Linux. ```bash git clone https://github.com/bellard/quickjs cd quickjs -git checkout 03cc5ec +git checkout daa35bc make cd .. ``` @@ -342,10 +342,10 @@ This demo was tested in the following environments: | Git Commit | Date | |:-----------|:-----------| -| `03cc5ec` | 2023-12-01 | -| `2788d71` | 2023-10-11 | +| `daa35bc` | 2023-12-09 | +| `2788d71` | 2023-12-09 | -When the demo was tested, commit `03cc5ec` corresponded to the latest commit. +When the demo was tested, commit `daa35bc` corresponded to the latest release. ::: @@ -354,7 +354,7 @@ When the demo was tested, commit `03cc5ec` corresponded to the latest commit. ```bash git clone https://github.com/bellard/quickjs cd quickjs -git checkout 03cc5ec +git checkout daa35bc make cd .. cp quickjs/qjs . diff --git a/docz/docs/03-demos/42-engines/20-chakra.md b/docz/docs/03-demos/42-engines/20-chakra.md index c7d3467..e51312a 100644 --- a/docz/docs/03-demos/42-engines/20-chakra.md +++ b/docz/docs/03-demos/42-engines/20-chakra.md @@ -135,7 +135,7 @@ This demo was tested in the following deployments: | `darwin-x64` | `c3ead3f` | 2023-11-04 | | `darwin-arm` | `c3ead3f` | 2023-10-19 | | `win10-x64` | `c3ead3f` | 2023-10-28 | -| `linux-x64` | `c3ead3f` | 2023-10-11 | +| `linux-x64` | `c3ead3f` | 2023-12-09 | ::: diff --git a/docz/docs/03-demos/42-engines/21-boa.md b/docz/docs/03-demos/42-engines/21-boa.md index 9236b3a..9318d90 100644 --- a/docz/docs/03-demos/42-engines/21-boa.md +++ b/docz/docs/03-demos/42-engines/21-boa.md @@ -124,7 +124,7 @@ This demo was tested in the following deployments: | `darwin-arm` | 2023-10-20 | | `win10-x64` | 2023-10-28 | | `win11-arm` | 2023-12-01 | -| `linux-x64` | 2023-10-11 | +| `linux-x64` | 2023-12-07 | | `linux-arm` | 2023-12-01 | ::: diff --git a/docz/docs/03-demos/42-engines/22-perl.md b/docz/docs/03-demos/42-engines/22-perl.md index 747606c..0c5e660 100644 --- a/docz/docs/03-demos/42-engines/22-perl.md +++ b/docz/docs/03-demos/42-engines/22-perl.md @@ -100,9 +100,9 @@ write_file("SheetJE.fods", $fods); ## Complete Example -:::note +:::note Tested Deployments -This demo was tested on 2023-08-26 against JE 0.066 +This demo was tested on 2023-12-05 against JE 0.066 ::: @@ -131,5 +131,5 @@ curl -LO https://sheetjs.com/data/cd.xls perl SheetJE.pl cd.xls ``` -After a short wait, the contents will be displayed in CSV form. It will also -write a file `SheetJE.fods` that can be opened in LibreOffice. \ No newline at end of file +After a short wait, the contents will be displayed in CSV form. The script will +also generate the spreadsheet `SheetJE.fods` which can be opened in LibreOffice. \ No newline at end of file diff --git a/docz/docs/03-demos/42-engines/index.md b/docz/docs/03-demos/42-engines/index.md index 4f90ca0..d99d67e 100644 --- a/docz/docs/03-demos/42-engines/index.md +++ b/docz/docs/03-demos/42-engines/index.md @@ -125,14 +125,22 @@ generates a C library and a standalone CLI tool. The simplest way to interact with the engine is to pass Base64 strings. -:::note pass +:::note Tested Environments -This demo was tested in the following deployments: +This demo was tested in the following environments: | Architecture | Commit | Date | |:-------------|:----------|:-----------| -| `darwin-x64` | `bc408b1` | 2023-11-14 | -| `linux-x64` | `a588e49` | 2023-10-11 | +| `darwin-x64` | `ef4cb2b` | 2023-12-08 | +| `darwin-arm` | `ef4cb2b` | 2023-12-08 | +| `win11-x64` | `ef4cb2b` | 2023-12-08 | +| `win11-arm` | `ef4cb2b` | 2023-12-08 | +| `linux-x64` | `ef4cb2b` | 2023-12-08 | +| `linux-arm` | `ef4cb2b` | 2023-12-08 | + +The Windows tests were run in WSL. + +Debian and WSL require the `cmake`, `python3` and `python-is-python3` packages. ::: diff --git a/docz/docs/03-demos/index.md b/docz/docs/03-demos/index.md index 941981d..52ad9df 100644 --- a/docz/docs/03-demos/index.md +++ b/docz/docs/03-demos/index.md @@ -21,7 +21,7 @@ in the [issue tracker](https://git.sheetjs.com/sheetjs/docs.sheetjs.com/issues) - [`XMLHttpRequest and fetch`](/docs/demos/net/network) - [`Clipboard Data`](/docs/demos/local/clipboard) - [`Web Workers`](/docs/demos/bigdata/worker) -- [`Typed Arrays for Machine Learning`](/docs/demos/bigdata/ml) +- [`Typed Arrays`](/docs/demos/math) - [`Local File Access`](/docs/demos/local/file) - [`LocalStorage and SessionStorage`](/docs/demos/data/storageapi) - [`Web SQL Database`](/docs/demos/data/websql) diff --git a/docz/docs/06-solutions/01-input.md b/docz/docs/06-solutions/01-input.md index 9216624..6fc6a01 100644 --- a/docz/docs/06-solutions/01-input.md +++ b/docz/docs/06-solutions/01-input.md @@ -748,7 +748,7 @@ example of fetching data from a JSON Endpoint and generating a workbook. [`x-spreadsheet`](/docs/demos/grid/xs) is an interactive data grid for previewing and modifying structured data in the web browser. -["Typed Arrays and ML"](/docs/demos/ml) covers strategies for +["TensorFlow.js"](/docs/demos/math/tensorflow) covers strategies for creating worksheets from ML library exports (datasets stored in Typed Arrays).
diff --git a/docz/docs/06-solutions/05-output.md b/docz/docs/06-solutions/05-output.md index 10ba726..6febe2c 100644 --- a/docz/docs/06-solutions/05-output.md +++ b/docz/docs/06-solutions/05-output.md @@ -652,7 +652,7 @@ export default function App() { ### Example: Data Loading -["Typed Arrays and ML"](/docs/demos/ml) covers strategies for +["TensorFlow.js"](/docs/demos/math/tensorflow) covers strategies for generating typed arrays and tensors from worksheet data.
diff --git a/docz/docs/08-api/07-utilities/08-wb.md b/docz/docs/08-api/07-utilities/08-wb.md index 299d026..89fba2b 100644 --- a/docz/docs/08-api/07-utilities/08-wb.md +++ b/docz/docs/08-api/07-utilities/08-wb.md @@ -1,6 +1,7 @@ --- sidebar_position: 8 title: Workbook Helpers +hide_table_of_contents: true --- Many utility functions return worksheet objects. Worksheets cannot be written to @@ -9,10 +10,12 @@ workbook file formats directly. They must be added to a workbook object. **Create a new workbook** ```js -var workbook = XLSX.utils.book_new(); +var wb_sans_sheets = XLSX.utils.book_new(); ``` -The `book_new` utility function creates an empty workbook with no worksheets. +With no arguments, the `book_new` utility function creates an empty workbook. + +:::info pass Spreadsheet software generally require at least one worksheet and enforce the requirement in the user interface. For example, if the last worksheet is deleted @@ -21,6 +24,29 @@ in the program, Apple Numbers will automatically create a new blank sheet. The SheetJS [write functions](/docs/api/write-options) enforce the requirement. They will throw errors when trying to export empty workbooks. +::: + +_Single Worksheet_ + +:::tip pass + +Version `0.20.1` introduced the one and two argument forms of `book_new`. It is +strongly recommended to [upgrade](/docs/getting-started/installation/). + +::: + +```js +var wb_with_sheet_named_Sheet1 = XLSX.utils.book_new(worksheet); +var wb_with_sheet_named_Blatte = XLSX.utils.book_new(worksheet, "Blatte"); +``` + +`book_new` can accept one or two arguments. + +If provided, the first argument is expected to be a worksheet object. It will +be added to the new workbook. + +If provided, the second argument is the name of the worksheet. If omitted, the +default name "Sheet1" will be used. **Append a Worksheet to a Workbook** diff --git a/docz/docs/08-api/07-utilities/index.md b/docz/docs/08-api/07-utilities/index.md index 765a999..acf092a 100644 --- a/docz/docs/08-api/07-utilities/index.md +++ b/docz/docs/08-api/07-utilities/index.md @@ -21,7 +21,7 @@ flowchart LR wb(SheetJS\nWorkbook) file[(workbook\nfile)] html --> |table_to_sheet\n\n| ws - ws --> |book_new\nbook_append_sheet| wb + ws --> |book_new\n\n| wb wb --> |writeFile\n\n| file ``` diff --git a/docz/docs/08-api/index.md b/docz/docs/08-api/index.md index 304ccc9..8006646 100644 --- a/docz/docs/08-api/index.md +++ b/docz/docs/08-api/index.md @@ -116,7 +116,7 @@ _Exporting Formulae:_ _Workbook Operations:_ -- `book_new` creates an empty workbook +- `book_new` creates a workbook object - `book_append_sheet` adds a worksheet to a workbook **[Utility Functions](/docs/api/utilities)** diff --git a/docz/docs/09-miscellany/05-contributing.md b/docz/docs/09-miscellany/05-contributing.md index 1c7e268..b1fb3b0 100644 --- a/docz/docs/09-miscellany/05-contributing.md +++ b/docz/docs/09-miscellany/05-contributing.md @@ -37,15 +37,15 @@ building, reproducing official releases, and running NodeJS and browser tests. These instructions were tested on the following platforms: -| Platform | Test Date | -|:------------------------------|:-----------| -| Linux (Steam Deck Holo x64) | 2023-11-27 | -| Linux (Ubuntu 18 AArch64) | 2023-12-01 | -| MacOS 10.13.6 (x64) | 2023-09-30 | -| MacOS 14.1.2 (ARM64) | 2023-12-01 | -| Windows 10 (x64) + WSL Ubuntu | 2023-11-27 | -| Windows 11 (x64) + WSL Ubuntu | 2023-10-14 | -| Windows 11 (ARM) + WSL Ubuntu | 2023-09-18 | +| Platform | Architecture | Test Date | +|:------------------------------|:-------------|:-----------| +| Linux (Steam Deck Holo x64) | `linux-x64` | 2023-11-27 | +| Linux (Ubuntu 18 AArch64) | `linux-arm` | 2023-12-01 | +| MacOS 10.13.6 (x64) | `darwin-x64` | 2023-09-30 | +| MacOS 14.1.2 (ARM64) | `darwin-arm` | 2023-12-01 | +| Windows 10 (x64) + WSL Ubuntu | `win10-x64` | 2023-11-27 | +| Windows 11 (x64) + WSL Ubuntu | `win11-x64` | 2023-10-14 | +| Windows 11 (ARM) + WSL Ubuntu | `win11-arm` | 2023-09-18 | With some additional dependencies, the unminified scripts are reproducible and tests will pass in Windows XP with NodeJS 5.10.0. @@ -525,28 +525,28 @@ echo 'export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"' >> ~/.profile ### Reproduce official builds 5) Run `git log` and search for the commit that matches a particular release -version. For example, version `0.20.0` can be found with: +version. For example, version `0.20.1` can be found with: ```bash -git log | grep -B4 "version bump 0.20.0" +git log | grep -B4 "version bump 0.20.1" ``` The output should look like: ```bash -$ git log | grep -B4 "version bump 0.20.0" +$ git log | grep -B4 "version bump 0.20.1" # highlight-next-line -commit 955543147dac0274d20307057c5a9f3e3e5d5307 <-- this is the commit hash +commit 29d46c07a895bdfd948d15b5115529ae697ccb48 <-- this is the commit hash Author: SheetJS -Date: Fri Jun 23 05:48:47 2023 -0400 +Date: Tue Dec 5 03:19:42 2023 -0500 - version bump 0.20.0 + version bump 0.20.1 ``` 6) Switch to that commit: ```bash -git checkout 955543147dac0274d20307057c5a9f3e3e5d5307 +git checkout 29d46c07a895bdfd948d15b5115529ae697ccb48 ``` 7) Run the full build sequence @@ -593,36 +593,36 @@ The checksum for the CDN version can be computed with: ```bash -curl -L https://cdn.sheetjs.com/xlsx-0.20.0/package/dist/xlsx.full.min.js | md5sum - +curl -L https://cdn.sheetjs.com/xlsx-0.20.1/package/dist/xlsx.full.min.js | md5sum - ``` ```bash -curl -k -L https://cdn.sheetjs.com/xlsx-0.20.0/package/dist/xlsx.full.min.js | md5 +curl -k -L https://cdn.sheetjs.com/xlsx-0.20.1/package/dist/xlsx.full.min.js | md5 ``` ```bash -curl -L https://cdn.sheetjs.com/xlsx-0.20.0/package/dist/xlsx.full.min.js | md5sum - +curl -L https://cdn.sheetjs.com/xlsx-0.20.1/package/dist/xlsx.full.min.js | md5sum - ``` -When the demo was last tested on macOS, against version `0.20.0`: +When the demo was last tested on macOS, against version `0.20.1`: > ```bash $ md5 dist/xlsx.full.min.js # highlight-next-line -MD5 (dist/xlsx.full.min.js) = 0b2f539797f92d35c6394274818f2c22 -$ curl -k -L https://cdn.sheetjs.com/xlsx-0.20.0/package/dist/xlsx.full.min.js | md5 +MD5 (dist/xlsx.full.min.js) = c5db4b1d2a1985a4ebfbaa500243f593 +$ curl -k -L https://cdn.sheetjs.com/xlsx-0.20.1/package/dist/xlsx.full.min.js | md5 # highlight-next-line -0b2f539797f92d35c6394274818f2c22 +c5db4b1d2a1985a4ebfbaa500243f593 ``` The two hashes should match. diff --git a/docz/docusaurus.config.js b/docz/docusaurus.config.js index 6054b81..5cb8193 100644 --- a/docz/docusaurus.config.js +++ b/docz/docusaurus.config.js @@ -227,9 +227,11 @@ const config = { { from: '/docs/getting-started/demos/cli', to: '/docs/demos/desktop/cli/' }, { from: '/docs/getting-started/demos/desktop', to: '/docs/demos/desktop/' }, /* bigdata */ - { from: '/docs/demos/ml', to: '/docs/demos/bigdata/ml/' }, { from: '/docs/demos/worker', to: '/docs/demos/bigdata/worker/' }, { from: '/docs/demos/stream', to: '/docs/demos/bigdata/stream/' }, + /* math */ + { from: '/docs/demos/ml', to: '/docs/demos/math/' }, + { from: '/docs/demos/bigdata/ml', to: '/docs/demos/math/' }, /* installation */ { from: '/docs/installation/standalone', to: '/docs/getting-started/installation/standalone/' }, { from: '/docs/installation/frameworks', to: '/docs/getting-started/installation/frameworks/' }, diff --git a/docz/package.json b/docz/package.json index a8854ae..02b1a2e 100644 --- a/docz/package.json +++ b/docz/package.json @@ -26,7 +26,7 @@ "prism-react-renderer": "1.3.5", "react": "17.0.2", "react-dom": "17.0.2", - "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.0/xlsx-0.20.0.tgz" + "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz" }, "devDependencies": { "@docusaurus/module-type-aliases": "2.4.1" diff --git a/docz/static/deno/s2c.ts b/docz/static/deno/s2c.ts index 108e2df..6d710ec 100644 --- a/docz/static/deno/s2c.ts +++ b/docz/static/deno/s2c.ts @@ -1,6 +1,6 @@ -// @deno-types="https://cdn.sheetjs.com/xlsx-0.20.0/package/types/index.d.ts" -import { read, utils, set_cptable, version } from 'https://cdn.sheetjs.com/xlsx-0.20.0/package/xlsx.mjs'; -import * as cptable from 'https://cdn.sheetjs.com/xlsx-0.20.0/package/dist/cpexcel.full.mjs'; +// @deno-types="https://cdn.sheetjs.com/xlsx-0.20.1/package/types/index.d.ts" +import { read, utils, set_cptable, version } from 'https://cdn.sheetjs.com/xlsx-0.20.1/package/xlsx.mjs'; +import * as cptable from 'https://cdn.sheetjs.com/xlsx-0.20.1/package/dist/cpexcel.full.mjs'; set_cptable(cptable); import * as Drash from "https://cdn.jsdelivr.net/gh/drashland/drash@v2.8.1/mod.ts"; diff --git a/docz/static/nwjs/index.html b/docz/static/nwjs/index.html index d86a447..dbf27fb 100644 --- a/docz/static/nwjs/index.html +++ b/docz/static/nwjs/index.html @@ -64,6 +64,10 @@ async function do_file(files) { process_wb(XLSX.read(data)); } +(async() => { + process_wb(XLSX.read(await (await fetch("https://sheetjs.com/pres.numbers")).arrayBuffer())) +})(); + var drop = document.getElementById('drop'); function handleDrop(e) { diff --git a/docz/static/reactnative/xcode-select-project.png b/docz/static/reactnative/xcode-select-project.png new file mode 100644 index 0000000000000000000000000000000000000000..c816724cac568933e88a628039250115b4dd2b08 GIT binary patch literal 24930 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 literal 0 HcmV?d00001 diff --git a/docz/static/tfjs/tf.min.js b/docz/static/tfjs/tf.min.js index ce8fe7c..00adab9 100644 --- a/docz/static/tfjs/tf.min.js +++ b/docz/static/tfjs/tf.min.js @@ -14,5 +14,5 @@ * limitations under the License. * ============================================================================= */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).tf=e.tf||{})}(this,(function(e){"use strict";function t(e,t){return t.forEach((function(t){t&&"string"!=typeof t&&!Array.isArray(t)&&Object.keys(t).forEach((function(n){if("default"!==n&&!(n in e)){var r=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(e,n,r.get?r:{enumerable:!0,get:function(){return t[n]}})}}))})),e}var n="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function r(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function a(e){var t,n;function r(t,n){try{var o=e[t](n),s=o.value,u=s instanceof i;Promise.resolve(u?s.v:s).then((function(n){if(u){var i="return"===t?"return":"next";if(!s.k||n.done)return r(i,n);n=e[i](n).value}a(o.done?"return":"normal",n)}),(function(e){r("throw",e)}))}catch(e){a("throw",e)}}function a(e,a){switch(e){case"return":t.resolve({value:a,done:!0});break;case"throw":t.reject(a);break;default:t.resolve({value:a,done:!1})}(t=t.next)?r(t.key,t.arg):n=null}this._invoke=function(e,a){return new Promise((function(i,o){var s={key:e,arg:a,resolve:i,reject:o,next:null};n?n=n.next=s:(t=n=s,r(e,a))}))},"function"!=typeof e.return&&(this.return=void 0)}function i(e,t){this.v=e,this.k=t}function o(){o=function(){return e};var e={},t=Object.prototype,n=t.hasOwnProperty,r=Object.defineProperty||function(e,t,n){e[t]=n.value},a="function"==typeof Symbol?Symbol:{},i=a.iterator||"@@iterator",s=a.asyncIterator||"@@asyncIterator",u=a.toStringTag||"@@toStringTag";function c(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{c({},"")}catch(e){c=function(e,t,n){return e[t]=n}}function l(e,t,n,a){var i=t&&t.prototype instanceof f?t:f,o=Object.create(i.prototype),s=new T(a||[]);return r(o,"_invoke",{value:w(e,n,s)}),o}function h(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}e.wrap=l;var p={};function f(){}function d(){}function v(){}var m={};c(m,i,(function(){return this}));var g=Object.getPrototypeOf,y=g&&g(g(E([])));y&&y!==t&&n.call(y,i)&&(m=y);var b=v.prototype=f.prototype=Object.create(m);function x(e){["next","throw","return"].forEach((function(t){c(e,t,(function(e){return this._invoke(t,e)}))}))}function k(e,t){function a(r,i,o,s){var u=h(e[r],e,i);if("throw"!==u.type){var c=u.arg,l=c.value;return l&&"object"==typeof l&&n.call(l,"__await")?t.resolve(l.__await).then((function(e){a("next",e,o,s)}),(function(e){a("throw",e,o,s)})):t.resolve(l).then((function(e){c.value=e,o(c)}),(function(e){return a("throw",e,o,s)}))}s(u.arg)}var i;r(this,"_invoke",{value:function(e,n){function r(){return new t((function(t,r){a(e,n,t,r)}))}return i=i?i.then(r,r):r()}})}function w(e,t,n){var r="suspendedStart";return function(a,i){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===a)throw i;return C()}for(n.method=a,n.arg=i;;){var o=n.delegate;if(o){var s=I(o,n);if(s){if(s===p)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var u=h(e,t,n);if("normal"===u.type){if(r=n.done?"completed":"suspendedYield",u.arg===p)continue;return{value:u.arg,done:n.done}}"throw"===u.type&&(r="completed",n.method="throw",n.arg=u.arg)}}}function I(e,t){var n=t.method,r=e.iterator[n];if(void 0===r)return t.delegate=null,"throw"===n&&e.iterator.return&&(t.method="return",t.arg=void 0,I(e,t),"throw"===t.method)||"return"!==n&&(t.method="throw",t.arg=new TypeError("The iterator does not provide a '"+n+"' method")),p;var a=h(r,e.iterator,t.arg);if("throw"===a.type)return t.method="throw",t.arg=a.arg,t.delegate=null,p;var i=a.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,p):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,p)}function N(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function S(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function T(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(N,this),this.reset(!0)}function E(e){if(e){var t=e[i];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,a=function t(){for(;++r=0;--a){var i=this.tryEntries[a],o=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var s=n.call(i,"catchLoc"),u=n.call(i,"finallyLoc");if(s&&u){if(this.prev=0;--r){var a=this.tryEntries[r];if(a.tryLoc<=this.prev&&n.call(a,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),S(n),p}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var a=r.arg;S(n)}return a}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:E(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),p}},e}function s(e){return s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s(e)}function u(e,t,n,r,a,i,o){try{var s=e[i](o),u=s.value}catch(e){return void n(e)}s.done?t(u):Promise.resolve(u).then(r,a)}function c(e){return function(){var t=this,n=arguments;return new Promise((function(r,a){var i=e.apply(t,n);function o(e){u(i,r,a,o,s,"next",e)}function s(e){u(i,r,a,o,s,"throw",e)}o(void 0)}))}}function l(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function h(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,o=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,i=e},f:function(){try{o||null==n.return||n.return()}finally{if(s)throw i}}}}function F(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}a.prototype["function"==typeof Symbol&&Symbol.asyncIterator||"@@asyncIterator"]=function(){return this},a.prototype.next=function(e){return this._invoke("next",e)},a.prototype.throw=function(e){return this._invoke("throw",e)},a.prototype.return=function(e){return this._invoke("return",e)};var D,M,L=function(e){return e&&e.Math==Math&&e},z=L("object"==("undefined"==typeof globalThis?"undefined":s(globalThis))&&globalThis)||L("object"==("undefined"==typeof window?"undefined":s(window))&&window)||L("object"==("undefined"==typeof self?"undefined":s(self))&&self)||L("object"==s(n)&&n)||function(){return this}()||Function("return this")(),P={},B=function(e){try{return!!e()}catch(e){return!0}},W=!B((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),U=!B((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")})),V=U,G=Function.prototype.call,j=V?G.bind(G):function(){return G.apply(G,arguments)},H={},q={}.propertyIsEnumerable,K=Object.getOwnPropertyDescriptor,X=K&&!q.call({1:2},1),Y=(H.f=X?function(e){var t=K(this,e);return!!t&&t.enumerable}:q,function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}),J=U,Z=Function.prototype,Q=Z.call,$=J&&Z.bind.bind(Q,Q),ee=J?$:function(e){return function(){return Q.apply(e,arguments)}},te=ee,ne=te({}.toString),re=te("".slice),ae=function(e){return re(ne(e),8,-1)},ie=B,oe=ae,se=Object,ue=ee("".split),ce=ie((function(){return!se("z").propertyIsEnumerable(0)}))?function(e){return"String"==oe(e)?ue(e,""):se(e)}:se,le=function(e){return null==e},he=le,pe=TypeError,fe=function(e){if(he(e))throw pe("Can't call method on "+e);return e},de=ce,ve=fe,me=function(e){return de(ve(e))},ge="object"==("undefined"==typeof document?"undefined":s(document))&&document.all,ye={all:ge,IS_HTMLDDA:void 0===ge&&void 0!==ge},be=ye.all,xe=ye.IS_HTMLDDA?function(e){return"function"==typeof e||e===be}:function(e){return"function"==typeof e},ke=xe,we=ye.all,Ie=ye.IS_HTMLDDA?function(e){return"object"==s(e)?null!==e:ke(e)||e===we}:function(e){return"object"==s(e)?null!==e:ke(e)},Ne=z,Se=xe,Te=function(e){return Se(e)?e:void 0},Ee=function(e,t){return arguments.length<2?Te(Ne[e]):Ne[e]&&Ne[e][t]},Ce=ee({}.isPrototypeOf),Ae="undefined"!=typeof navigator&&String(navigator.userAgent)||"",Re=z,_e=Ae,Oe=Re.process,Fe=Re.Deno,De=Oe&&Oe.versions||Fe&&Fe.version,Me=De&&De.v8;Me&&(M=(D=Me.split("."))[0]>0&&D[0]<4?1:+(D[0]+D[1])),!M&&_e&&(!(D=_e.match(/Edge\/(\d+)/))||D[1]>=74)&&(D=_e.match(/Chrome\/(\d+)/))&&(M=+D[1]);var Le=M,ze=Le,Pe=B,Be=!!Object.getOwnPropertySymbols&&!Pe((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&ze&&ze<41})),We=Be&&!Symbol.sham&&"symbol"==s(Symbol.iterator),Ue=Ee,Ve=xe,Ge=Ce,je=Object,He=We?function(e){return"symbol"==s(e)}:function(e){var t=Ue("Symbol");return Ve(t)&&Ge(t.prototype,je(e))},qe=String,Ke=function(e){try{return qe(e)}catch(e){return"Object"}},Xe=xe,Ye=Ke,Je=TypeError,Ze=function(e){if(Xe(e))return e;throw Je(Ye(e)+" is not a function")},Qe=Ze,$e=le,et=function(e,t){var n=e[t];return $e(n)?void 0:Qe(n)},tt=j,nt=xe,rt=Ie,at=TypeError,it=function(e,t){var n,r;if("string"===t&&nt(n=e.toString)&&!rt(r=tt(n,e)))return r;if(nt(n=e.valueOf)&&!rt(r=tt(n,e)))return r;if("string"!==t&&nt(n=e.toString)&&!rt(r=tt(n,e)))return r;throw at("Can't convert object to primitive value")},ot={exports:{}},st=!1,ut=z,ct=Object.defineProperty,lt=function(e,t){try{ct(ut,e,{value:t,configurable:!0,writable:!0})}catch(n){ut[e]=t}return t},ht=lt,pt="__core-js_shared__",ft=z[pt]||ht(pt,{}),dt=(ot.exports,ft);(ot.exports=function(e,t){return dt[e]||(dt[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.29.1",mode:"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.29.1/LICENSE",source:"https://github.com/zloirock/core-js"});var vt=ot.exports,mt=fe,gt=Object,yt=function(e){return gt(mt(e))},bt=yt,xt=ee({}.hasOwnProperty),kt=Object.hasOwn||function(e,t){return xt(bt(e),t)},wt=ee,It=0,Nt=Math.random(),St=wt(1..toString),Tt=function(e){return"Symbol("+(void 0===e?"":e)+")_"+St(++It+Nt,36)},Et=vt,Ct=kt,At=Tt,Rt=Be,_t=We,Ot=z.Symbol,Ft=Et("wks"),Dt=_t?Ot.for||Ot:Ot&&Ot.withoutSetter||At,Mt=function(e){return Ct(Ft,e)||(Ft[e]=Rt&&Ct(Ot,e)?Ot[e]:Dt("Symbol."+e)),Ft[e]},Lt=j,zt=Ie,Pt=He,Bt=et,Wt=it,Ut=TypeError,Vt=Mt("toPrimitive"),Gt=function(e,t){if(!zt(e)||Pt(e))return e;var n,r=Bt(e,Vt);if(r){if(void 0===t&&(t="default"),n=Lt(r,e,t),!zt(n)||Pt(n))return n;throw Ut("Can't convert object to primitive value")}return void 0===t&&(t="number"),Wt(e,t)},jt=Gt,Ht=He,qt=function(e){var t=jt(e,"string");return Ht(t)?t:t+""},Kt=Ie,Xt=z.document,Yt=Kt(Xt)&&Kt(Xt.createElement),Jt=function(e){return Yt?Xt.createElement(e):{}},Zt=Jt,Qt=!W&&!B((function(){return 7!=Object.defineProperty(Zt("div"),"a",{get:function(){return 7}}).a})),$t=W,en=j,tn=H,nn=Y,rn=me,an=qt,on=kt,sn=Qt,un=Object.getOwnPropertyDescriptor,cn=(P.f=$t?un:function(e,t){if(e=rn(e),t=an(t),sn)try{return un(e,t)}catch(e){}if(on(e,t))return nn(!en(tn.f,e,t),e[t])},{}),ln=W&&B((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype})),hn=Ie,pn=String,fn=TypeError,dn=function(e){if(hn(e))return e;throw fn(pn(e)+" is not an object")},vn=W,mn=Qt,gn=ln,yn=dn,bn=qt,xn=TypeError,kn=Object.defineProperty,wn=Object.getOwnPropertyDescriptor,In="enumerable",Nn="configurable",Sn="writable",Tn=(cn.f=vn?gn?function(e,t,n){if(yn(e),t=bn(t),yn(n),"function"==typeof e&&"prototype"===t&&"value"in n&&Sn in n&&!n.writable){var r=wn(e,t);r&&r.writable&&(e[t]=n.value,n={configurable:Nn in n?n.configurable:r.configurable,enumerable:In in n?n.enumerable:r.enumerable,writable:!1})}return kn(e,t,n)}:kn:function(e,t,n){if(yn(e),t=bn(t),yn(n),mn)try{return kn(e,t,n)}catch(e){}if("get"in n||"set"in n)throw xn("Accessors not supported");return"value"in n&&(e[t]=n.value),e},cn),En=Y,Cn=W?function(e,t,n){return Tn.f(e,t,En(1,n))}:function(e,t,n){return e[t]=n,e},An={exports:{}},Rn=W,_n=kt,On=Function.prototype,Fn=Rn&&Object.getOwnPropertyDescriptor,Dn=_n(On,"name"),Mn={EXISTS:Dn,PROPER:Dn&&"something"===function(){}.name,CONFIGURABLE:Dn&&(!Rn||Rn&&Fn(On,"name").configurable)},Ln=xe,zn=ft,Pn=ee(Function.toString);Ln(zn.inspectSource)||(zn.inspectSource=function(e){return Pn(e)});var Bn,Wn,Un,Vn=zn.inspectSource,Gn=xe,jn=z.WeakMap,Hn=Gn(jn)&&/native code/.test(String(jn)),qn=Tt,Kn=vt("keys"),Xn=function(e){return Kn[e]||(Kn[e]=qn(e))},Yn={},Jn=Hn,Zn=z,Qn=Ie,$n=Cn,er=kt,tr=ft,nr=Xn,rr=Yn,ar="Object already initialized",ir=Zn.TypeError,or=Zn.WeakMap;if(Jn||tr.state){var sr=tr.state||(tr.state=new or);sr.get=sr.get,sr.has=sr.has,sr.set=sr.set,Bn=function(e,t){if(sr.has(e))throw ir(ar);return t.facade=e,sr.set(e,t),t},Wn=function(e){return sr.get(e)||{}},Un=function(e){return sr.has(e)}}else{var ur=nr("state");rr[ur]=!0,Bn=function(e,t){if(er(e,ur))throw ir(ar);return t.facade=e,$n(e,ur,t),t},Wn=function(e){return er(e,ur)?e[ur]:{}},Un=function(e){return er(e,ur)}}var cr={set:Bn,get:Wn,has:Un,enforce:function(e){return Un(e)?Wn(e):Bn(e,{})},getterFor:function(e){return function(t){var n;if(!Qn(t)||(n=Wn(t)).type!==e)throw ir("Incompatible receiver, "+e+" required");return n}}},lr=(An.exports,ee),hr=B,pr=xe,fr=kt,dr=W,vr=Mn.CONFIGURABLE,mr=Vn,gr=cr.enforce,yr=cr.get,br=String,xr=Object.defineProperty,kr=lr("".slice),wr=lr("".replace),Ir=lr([].join),Nr=dr&&!hr((function(){return 8!==xr((function(){}),"length",{value:8}).length})),Sr=String(String).split("String"),Tr=An.exports=function(e,t,n){"Symbol("===kr(br(t),0,7)&&(t="["+wr(br(t),/^Symbol\(([^)]*)\)/,"$1")+"]"),n&&n.getter&&(t="get "+t),n&&n.setter&&(t="set "+t),(!fr(e,"name")||vr&&e.name!==t)&&(dr?xr(e,"name",{value:t,configurable:!0}):e.name=t),Nr&&n&&fr(n,"arity")&&e.length!==n.arity&&xr(e,"length",{value:n.arity});try{n&&fr(n,"constructor")&&n.constructor?dr&&xr(e,"prototype",{writable:!1}):e.prototype&&(e.prototype=void 0)}catch(e){}var r=gr(e);return fr(r,"source")||(r.source=Ir(Sr,"string"==typeof t?t:"")),e};Function.prototype.toString=Tr((function(){return pr(this)&&yr(this).source||mr(this)}),"toString");var Er=An.exports,Cr=xe,Ar=cn,Rr=Er,_r=lt,Or=function(e,t,n,r){r||(r={});var a=r.enumerable,i=void 0!==r.name?r.name:t;if(Cr(n)&&Rr(n,i,r),r.global)a?e[t]=n:_r(t,n);else{try{r.unsafe?e[t]&&(a=!0):delete e[t]}catch(e){}a?e[t]=n:Ar.f(e,t,{value:n,enumerable:!1,configurable:!r.nonConfigurable,writable:!r.nonWritable})}return e},Fr={},Dr=Math.ceil,Mr=Math.floor,Lr=Math.trunc||function(e){var t=+e;return(t>0?Mr:Dr)(t)},zr=Lr,Pr=function(e){var t=+e;return t!=t||0===t?0:zr(t)},Br=Pr,Wr=Math.max,Ur=Math.min,Vr=function(e,t){var n=Br(e);return n<0?Wr(n+t,0):Ur(n,t)},Gr=Pr,jr=Math.min,Hr=function(e){return e>0?jr(Gr(e),9007199254740991):0},qr=Hr,Kr=function(e){return qr(e.length)},Xr=me,Yr=Vr,Jr=Kr,Zr=function(e){return function(t,n,r){var a,i=Xr(t),o=Jr(i),s=Yr(r,o);if(e&&n!=n){for(;o>s;)if((a=i[s++])!=a)return!0}else for(;o>s;s++)if((e||s in i)&&i[s]===n)return e||s||0;return!e&&-1}},Qr={includes:Zr(!0),indexOf:Zr(!1)},$r=kt,ea=me,ta=Qr.indexOf,na=Yn,ra=ee([].push),aa=function(e,t){var n,r=ea(e),a=0,i=[];for(n in r)!$r(na,n)&&$r(r,n)&&ra(i,n);for(;t.length>a;)$r(r,n=t[a++])&&(~ta(i,n)||ra(i,n));return i},ia=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],oa=aa,sa=ia.concat("length","prototype"),ua=(Fr.f=Object.getOwnPropertyNames||function(e){return oa(e,sa)},{}),ca=(ua.f=Object.getOwnPropertySymbols,Ee),la=Fr,ha=ua,pa=dn,fa=ee([].concat),da=ca("Reflect","ownKeys")||function(e){var t=la.f(pa(e)),n=ha.f;return n?fa(t,n(e)):t},va=kt,ma=da,ga=P,ya=cn,ba=function(e,t,n){for(var r=ma(t),a=ya.f,i=ga.f,o=0;oo;)ni.f(e,n=a[o++],r[n]);return e},Ee("document","documentElement")),si=dn,ui=Ja,ci=ia,li=Yn,hi=oi,pi=Jt,fi=Xn("IE_PROTO"),di=function(){},vi=function(e){return"