diff --git a/docz/docs/02-getting-started/01-installation/04-amd.md b/docz/docs/02-getting-started/01-installation/04-amd.md
index 2ff3d3e..bd5e123 100644
--- a/docz/docs/02-getting-started/01-installation/04-amd.md
+++ b/docz/docs/02-getting-started/01-installation/04-amd.md
@@ -21,8 +21,8 @@ Each standalone release script is available at .
When referencing by file name, AMD loaders typically omit the file extension.
-The actual file name is `xlsx.full.min.js`, but the examples will refer to the
-script as `xlsx.full.min`.
+The actual file name is `xlsx.full.min.js`, but the examples identify the script
+using the name `xlsx.full.min`
:::
diff --git a/docz/docs/03-demos/07-data/19-alasql.md b/docz/docs/03-demos/07-data/19-alasql.md
index 046185e..e138f1b 100644
--- a/docz/docs/03-demos/07-data/19-alasql.md
+++ b/docz/docs/03-demos/07-data/19-alasql.md
@@ -29,7 +29,7 @@ This demo was tested in the following environments:
| Environment | AlaSQL | Date |
|:--------------------|:-------|:----------:|
-| NodeJS | 3.1.0 | 2023-07-24 |
+| NodeJS | 3.1.0 | 2023-10-26 |
| Standalone (Chrome) | 3.0.0 | 2023-08-20 |
:::
diff --git a/docz/docs/03-demos/42-engines/01-duktape.md b/docz/docs/03-demos/42-engines/01-duktape.md
index cd83bf6..a65cf50 100644
--- a/docz/docs/03-demos/42-engines/01-duktape.md
+++ b/docz/docs/03-demos/42-engines/01-duktape.md
@@ -119,7 +119,7 @@ This demo was tested in the following deployments:
| Architecture | Version | Date |
|:-------------|:--------|:-----------|
-| `darwin-x64` | `2.7.0` | 2023-07-24 |
+| `darwin-x64` | `2.7.0` | 2023-10-26 |
| `darwin-arm` | `2.7.0` | 2023-10-18 |
| `win10-x64` | `2.7.0` | 2023-07-24 |
| `win11-arm` | `2.7.0` | 2023-09-26 |
@@ -293,23 +293,40 @@ may not work on every platform.
### Perl
-The Perl binding for Duktape is available on CPAN:
+The Perl binding for Duktape is available as `JavaScript::Duktape` on CPAN.
+
+The Perl binding does not have raw `Buffer` ops, so Base64 strings are used.
+
+#### Perl Demo
+
+:::note
+
+This demo was tested in the following deployments:
+
+| Architecture | Version | Date |
+|:-------------|:--------|:-----------|
+| `darwin-x64` | `2.5.0` | 2023-10-26 |
+
+:::
+
+0) Ensure `perl` and `cpan` are installed and available on the system path.
+
+1) Install the `JavaScript::Duktape` library:
```bash
cpan install JavaScript::Duktape
```
-The Perl binding does not have raw `Buffer` ops, so Base64 strings are used.
-With the [ExtendScript](/docs/getting-started/installation/extendscript) build:
+2) Save the following codeblock to `SheetJSDuk.pl`:
-```perl SheetJSDuk.pl
+```perl title="SheetJSDuk.pl"
# usage: perl SheetJSDuk.pl path/to/file
use JavaScript::Duktape;
use File::Slurp;
use MIME::Base64 qw( encode_base64 decode_base64 );
# Initialize
-my $js = JavaScript::Duktape->new( max_memory => 1024 * 1024 * 1024 );
+my $js = JavaScript::Duktape->new( max_memory => 256 * 1024 * 1024 );
$js->eval("var global = (function(){ return this; }).call(null);");
# Load the ExtendScript build
@@ -325,15 +342,31 @@ $js->eval("log('SheetJS library version ' + XLSX.version);");
my $raw_data = encode_base64(read_file($ARGV[0], { binmode => ':raw' }), "");
$js->set("b64", $raw_data);
$js->eval(qq{
- global.wb = XLSX.read(b64, {type: "base64"});
+ global.wb = XLSX.read(b64, {type: "base64", WTF:1});
global.ws = wb.Sheets[wb.SheetNames[0]];
+ void 0;
});
# Print first worksheet CSV
-my $csv = $js->eval('XLSX.utils.sheet_to_csv(global.ws)');
-print $csv
+$js->eval('log(XLSX.utils.sheet_to_csv(global.ws))');
# Write XLSB file
my $xlsb = $js->eval("XLSX.write(global.wb, {type:'base64', bookType:'xlsb'})");
write_file("SheetJSDuk.xlsb", decode_base64($xlsb));
-```
\ No newline at end of file
+```
+
+3) Download the SheetJS ExtendScript build and test file:
+
+{`\
+curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.extendscript.js
+curl -LO https://sheetjs.com/pres.xlsx`}
+
+
+4) Run the script:
+
+```bash
+perl SheetJSDuk.pl pres.xlsx
+```
+
+If the script succeeded, the data in the test file will be printed in CSV rows.
+The script will also export `SheetJSDuk.xlsb`.
\ No newline at end of file
diff --git a/docz/docs/03-demos/42-engines/03-rhino.md b/docz/docs/03-demos/42-engines/03-rhino.md
index 649a7f4..eeb0e9c 100644
--- a/docz/docs/03-demos/42-engines/03-rhino.md
+++ b/docz/docs/03-demos/42-engines/03-rhino.md
@@ -120,21 +120,26 @@ This string can be loaded into the JS engine and processed:
:::note
-This demo was tested on 2023-07-26 using Rhino 1.7.14.
+This demo was tested on 2023-10-26 against Rhino 1.7.14.
:::
-0) Ensure Java is installed. Create a folder for the project, download the
-[JAR](https://repo1.maven.org/maven2/org/mozilla/rhino/1.7.14/rhino-1.7.14.jar)
-and rename to `rhino.jar`:
+0) Ensure Java is installed.
+
+1) Create a folder for the project:
```bash
mkdir sheetjs-java
cd sheetjs-java
+```
+
+2) Download the Rhino JAR and rename to `rhino.jar`:
+
+```
curl -L -o rhino.jar https://repo1.maven.org/maven2/org/mozilla/rhino/1.7.14/rhino-1.7.14.jar
```
-1) Download the SheetJS Standalone script and the test file. Save both files in
+3) Download the SheetJS Standalone script and the test file. Save both files in
the project directory:
@@ -147,14 +152,14 @@ curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
curl -LO https://sheetjs.com/pres.xlsx`}
-2) Download [`SheetJSRhino.zip`](pathname:///rhino/SheetJSRhino.zip) and unzip
+4) Download [`SheetJSRhino.zip`](pathname:///rhino/SheetJSRhino.zip) and unzip
```bash
curl -LO https://docs.sheetjs.com/rhino/SheetJSRhino.zip
unzip SheetJSRhino.zip
```
-3) Save the following code to `SheetJSRhino.java`:
+5) Save the following code to `SheetJSRhino.java`:
```java title="SheetJSRhino.java"
/* sheetjs (C) 2013-present SheetJS -- https://sheetjs.com */
@@ -184,14 +189,14 @@ public class SheetJSRhino {
}
```
-4) Assemble `SheetJS.jar` from the demo code:
+6) Assemble `SheetJS.jar` from the demo code:
```bash
javac -cp .:rhino.jar SheetJSRhino.java
jar -cf SheetJS.jar SheetJSRhino.class com/sheetjs/*.class xlsx.full.min.js
```
-5) Test the program:
+7) Test the program:
```bash
java -cp .:SheetJS.jar:rhino.jar SheetJSRhino pres.xlsx
diff --git a/docz/docs/03-demos/42-engines/04-jsc.md b/docz/docs/03-demos/42-engines/04-jsc.md
index 68fce44..3bf1ea9 100644
--- a/docz/docs/03-demos/42-engines/04-jsc.md
+++ b/docz/docs/03-demos/42-engines/04-jsc.md
@@ -133,7 +133,7 @@ This demo was tested in the following environments:
| Architecture | Swift | Date |
|:-------------|:--------|:-----------|
-| `darwin-x64` | `5.8.1` | 2023-07-24 |
+| `darwin-x64` | `5.9.0` | 2023-10-26 |
| `darwin-arm` | `5.9.0` | 2023-10-18 |
:::
@@ -146,14 +146,22 @@ This example requires MacOS + Swift and will not work on Windows or Linux!
:::
-0) Ensure Xcode is installed. Create a folder for the project:
+0) Ensure Swift is installed by running the following command in the terminal:
+
+```bash
+swiftc --version
+```
+
+If the command is not found, install Xcode.
+
+1) Create a folder for the project:
```bash
mkdir sheetjswift
cd sheetjswift
```
-1) Download the SheetJS Standalone script and the test file. Save both files in
+2) Download the SheetJS Standalone script and the test file. Save both files in
the project directory:
@@ -166,7 +174,7 @@ curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
curl -LO https://sheetjs.com/pres.numbers`}
-2) Download the Swift scripts for the demo
+3) Download the Swift scripts for the demo
- [`SheetJSCore.swift`](pathname:///swift/SheetJSCore.swift) Wrapper library
- [`main.swift`](pathname:///swift/main.swift) Command-line script
@@ -177,13 +185,13 @@ curl -LO https://docs.sheetjs.com/swift/main.swift
```
-3) Build the `SheetJSwift` binary:
+4) Build the `SheetJSwift` program:
```bash
swiftc SheetJSCore.swift main.swift -o SheetJSwift
```
-4) Test the program:
+5) Test the program:
```bash
./SheetJSwift pres.numbers
diff --git a/docz/docs/03-demos/42-engines/08-quickjs.md b/docz/docs/03-demos/42-engines/08-quickjs.md
index 4bdecdf..9aa5d39 100644
--- a/docz/docs/03-demos/42-engines/08-quickjs.md
+++ b/docz/docs/03-demos/42-engines/08-quickjs.md
@@ -262,7 +262,7 @@ This demo was tested in the following deployments:
| Architecture | Git Commit | Date |
|:-------------|:-----------|:-----------|
-| `darwin-x64` | `2788d71` | 2023-07-24 |
+| `darwin-x64` | `2788d71` | 2023-10-26 |
| `darwin-arm` | `2788d71` | 2023-10-18 |
| `win10-x64` | `2788d71` | 2023-10-09 |
| `win11-arm` | `2788d71` | 2023-09-25 |
diff --git a/docz/docs/09-constellation/01-ssf.md b/docz/docs/09-constellation/01-ssf.md
index 1eb2d90..f64697f 100644
--- a/docz/docs/09-constellation/01-ssf.md
+++ b/docz/docs/09-constellation/01-ssf.md
@@ -1,5 +1,6 @@
---
title: SSF Number Formatter
+hide_table_of_contents: true
---
As explained in ["Number Formats"](/docs/csf/features/nf), modern spreadsheet
@@ -7,7 +8,7 @@ file formats separate "content" from "presentation". Instead of storing a
formatted value like `$3.50`, applications will store the underlying value
(`3.50`) and the number format (`$0.00`). Parsers are expected to render values.
-The SheetJS `SSF` ("SpreadSheet Formatter") library formats numbers according
+The SheetJS `SSF` ("SpreadSheet Format") library formats numbers according
to the number formatting rules defined in Excel and other spreadsheet software[^1]
A version of the library ships with the main file processing library. It is
@@ -19,6 +20,36 @@ The library is also available for standalone use on the SheetJS CDN[^5].
The source code and project documentation is hosted on the SheetJS git server at
+## Live Demo
+
+The formatted text is calculated from the specified number format and value.
+Please [report an issue](https://git.sheetjs.com/sheetjs/sheetjs/issues) if a
+particular format is not supported.
+
+```jsx live
+function SheetJSSSF() {
+ const [fmt, setFmt] = React.useState("#,##0");
+ const [val, setVal] = React.useState(7262);
+
+ const format = (fmt, val) => { try {
+ return XLSX.SSF.format(fmt, val);
+ } catch(e) { return "ERROR: " + (e && e.message || e); } };
+
+ return ( );
+}
+```
+
[^1]: The number formatting rules are sketched in ECMA-376. A rough grammar is defined in the MS-XLS specification.
[^2]: See [`read` in "Reading Files"](/docs/api/parse-options)
[^3]: See [`write` in "Writing Files"](/docs/api/write-options)
diff --git a/docz/docusaurus.config.js b/docz/docusaurus.config.js
index 6b44077..b67738d 100644
--- a/docz/docusaurus.config.js
+++ b/docz/docusaurus.config.js
@@ -181,9 +181,12 @@ const config = {
{ from: '/docs/demos/vue', to: '/docs/demos/frontend/vue/' },
{ from: '/docs/demos/bundler', to: '/docs/demos/frontend/bundler/' },
{ from: '/docs/demos/legacy', to: '/docs/demos/frontend/legacy/' },
+ { from: '/docs/demos/rollup', to: '/docs/demos/frontend/bundler/rollup/' },
{ from: '/docs/getting-started/demos/legacy', to: '/docs/demos/frontend/legacy/' },
+ { from: '/docs/getting-started/demos/bundler', to: '/docs/demos/frontend/bundler/' },
/* cloud */
{ from: '/docs/demos/salesforce', to: '/docs/demos/cloud/salesforce/' },
+ { from: '/docs/getting-started/demos/salesforce', to: '/docs/demos/cloud/salesforce/' },
{ from: '/docs/demos/aws', to: '/docs/demos/cloud/aws/' },
{ from: '/docs/demos/azure', to: '/docs/demos/cloud/azure/' },
{ from: '/docs/demos/netsuite', to: '/docs/demos/cloud/netsuite/' },
@@ -214,6 +217,7 @@ const config = {
{ from: '/docs/getting-started/demos/network', to: '/docs/demos/net/network/' },
/* local */
{ from: '/docs/demos/clipboard', to: '/docs/demos/local/clipboard/' },
+ { from: '/docs/getting-started/demos/clipboard', to: '/docs/demos/local/clipboard/' },
{ from: '/docs/demos/localfile', to: '/docs/demos/local/file/' },
{ from: '/docs/demos/data/indexeddb', to: '/docs/demos/local/indexeddb/' },
{ from: '/docs/demos/data/storageapi', to: '/docs/demos/local/storageapi/' },
diff --git a/docz/src/components/Playground.tsx b/docz/src/components/Playground.tsx
deleted file mode 100644
index 917c7f2..0000000
--- a/docz/src/components/Playground.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import React from 'react';
-import useBaseUrl from '@docusaurus/useBaseUrl';
-
-import { CodePreview } from 'docusaurus-plugin-code-preview';
-
-/*
-export default function Playground(props) {
- return (
-
- );
-}
-*/
-
-export default function Playground(props) {
- return ;
-}