From b01bf3873c202795d39c7ac83e95642e2bf80330 Mon Sep 17 00:00:00 2001 From: SheetJS Date: Mon, 7 Nov 2022 05:41:00 -0500 Subject: [PATCH] pres --- docz/docs/03-demos/19-bundler.md | 2 +- docz/docs/03-demos/42-headless.md | 3 +- docz/docs/03-demos/45-git.md | 75 ++------------------- docz/docs/06-solutions/05-output.md | 6 +- docz/docs/09-miscellany/01-formats.md | 4 +- docz/docs/09-miscellany/02-errors.md | 7 +- docz/docs/09-miscellany/03-source.md | 12 +--- docz/docs/09-miscellany/04-testing.md | 33 ++++----- docz/docs/09-miscellany/05-contributing.md | 7 +- docz/docusaurus.config.js | 4 +- docz/static/pres.xlsx | Bin 0 -> 8750 bytes 11 files changed, 38 insertions(+), 115 deletions(-) create mode 100644 docz/static/pres.xlsx diff --git a/docz/docs/03-demos/19-bundler.md b/docz/docs/03-demos/19-bundler.md index ab3f5a6..105478b 100644 --- a/docz/docs/03-demos/19-bundler.md +++ b/docz/docs/03-demos/19-bundler.md @@ -79,7 +79,7 @@ npx browserify xlsxworker.js > worker.js npx http-server ``` -5) Access the site and use the file input element to +5) Access the site http://localhost:8080/ and use the file input element to select a spreadsheet. diff --git a/docz/docs/03-demos/42-headless.md b/docz/docs/03-demos/42-headless.md index 9c99450..6c8fa16 100644 --- a/docz/docs/03-demos/42-headless.md +++ b/docz/docs/03-demos/42-headless.md @@ -220,8 +220,7 @@ const { webkit } = require('playwright'); // import desired browser ## PhantomJS -PhantomJS is a headless web browser powered by WebKit. Standalone binaries are -available at +PhantomJS is a headless web browser powered by WebKit. :::warning diff --git a/docz/docs/03-demos/45-git.md b/docz/docs/03-demos/45-git.md index f3b4f92..70b2a48 100644 --- a/docz/docs/03-demos/45-git.md +++ b/docz/docs/03-demos/45-git.md @@ -14,7 +14,7 @@ const XLSX = require("xlsx"); (async() => { /* Download Data */ - const f = await fetch("https://sheetjs.com/pres.xlsx"); + const f = await fetch("https://docs.sheetjs.com/pres.xlsx"); const data = await f.arrayBuffer(); /* Parse workbook */ @@ -62,69 +62,7 @@ cannot access private repositories. Any publicly available spreadsheet can be a valid data source. The process will fetch the data on specified intervals or events. -This demo endpoint generates XLSX files. - -
Server Details (click to show) - -This demo is hosted on Deno Deploy. - -```ts -// @deno-types="https://cdn.sheetjs.com/xlsx-latest/package/types/index.d.ts" -import { utils, writeXLSX } from 'https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs'; - -import * as Drash from "https://deno.land/x/drash@v2.5.4/mod.ts"; - -const rand = (x:number, n = 10): number => ((x + n * (Math.random() - 0.5) + 10)|0)%10; - -class HomeResource extends Drash.Resource { - public paths = ["/"]; - - // see https://github.com/drashland/drash/issues/194 - public OPTIONS(request: Drash.Request, response: Drash.Response) { - const allHttpMethods: string[] = [ "GET", "POST", "PUT", "DELETE" ]; - response.headers.set("Allow", allHttpMethods.join()); // Use this - response.headers.set("Access-Control-Allow-Methods", allHttpMethods.join()); // or this - response.headers.set("access-control-allow-origin", "*"); - response.status_code = 204; - return response; - } - - public GET(request: Drash.Request, response: Drash.Response): void { - // create a workbook with some random data - let data: any[][] = [ "ABCDEFG".split("") ]; - for(let i = 0; i < 10; ++i) data = data.concat([ - [5,4,3,3,7,9,5].map(v => rand(v)), - [5,4,3,3,7,9,5].map(v => rand(v, 8)), - [5,4,3,3,7,9,5].map(v => rand(v, 6)), - [5,4,3,3,7,9,5].map(v => rand(v, 4)), - [5,4,3,3,7,9,5].map(v => rand(v, 2)), - [5,4,3,3,7,9,5].map(v => rand(v, 0)) - ]); - const ws = utils.aoa_to_sheet(data); - const wb = utils.book_new(); utils.book_append_sheet(wb, ws, "data"); - // write the workbook to XLSX as a Uint8Array - const file = writeXLSX(wb, { type: "buffer"}); - // set headers - response.headers.set("Content-Disposition", 'attachment; filename="LiveSheet.xlsx"'); - // send data - return response.send("application/vnd.ms-excel", file); - } -} - -// Create and run your server -const server = new Drash.Server({ - hostname: "", - port: 3000, - protocol: "http", - resources: [ HomeResource ], -}); - -server.run(); - -console.log(`Server running at ${server.address}.`); -``` - -
+For this demo, will be used. ### Action @@ -135,7 +73,7 @@ The `githubocto/flat` action can be added as a step in a workflow: - name: Fetch data uses: githubocto/flat@v3 with: - http_url: https://livesheet.deno.dev/ + http_url: https://docs.sheetjs.com/pres.xlsx downloaded_filename: data.xlsx postprocess: ./postprocess.ts ``` @@ -144,7 +82,7 @@ The `http_url` will be fetched and saved to `downloaded_filename` in the repo. This can be approximated with the following command: ```bash -curl -L -o data.xlsx https://livesheet.deno.dev/ +curl -L -o data.xlsx https://docs.sheetjs.com/pres.xlsx ``` After saving, the `postprocess` script will be run. When a `.ts` file is the @@ -175,8 +113,7 @@ releases, the examples import from the SheetJS CDN: import * as XLSX from 'https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs'; ``` -The official registry endpoint is out of date. -This is a known registry bug. +The official Deno registry is out of date. This is a known registry bug. ::: @@ -293,7 +230,7 @@ jobs: - name: Fetch data uses: githubocto/flat@v3 with: - http_url: https://livesheet.deno.dev/ + http_url: https://docs.sheetjs.com/pres.xlsx downloaded_filename: data.xlsx postprocess: ./postprocess.ts ``` diff --git a/docz/docs/06-solutions/05-output.md b/docz/docs/06-solutions/05-output.md index 260d80f..657e191 100644 --- a/docz/docs/06-solutions/05-output.md +++ b/docz/docs/06-solutions/05-output.md @@ -393,7 +393,7 @@ evt.respondWith(new Response(buf, {
Complete Example (click to show) Save the following script to `deno.ts` and run with `deno run -A deno.ts`. Open -a web browser and access to download the workbook. +a web browser and access `http://localhost:7262/` to download the workbook. ```ts title="deno.ts" // @deno-types="https://cdn.sheetjs.com/xlsx-latest/package/types/index.d.ts" @@ -447,7 +447,7 @@ return new Response(buf, { Download [`xlsx.mjs`](https://cdn.sheetjs.com/xlsx-latest/package/xlsx.mjs). Save the following script to `bun.js` and run with `bun bun.js`. Open a web -browser and access to download the exported workbook. +browser and access `http://localhost:7262/` to download the exported workbook. ```js title="bun.js" import * as XLSX from "./xlsx.mjs"; @@ -841,5 +841,3 @@ Readable Stream. - `XLSX.stream.to_json` is the streaming version of `XLSX.utils.sheet_to_json`. Examples are included in ["Large Datasets"](/docs/demos/stream#streaming-write) - - pipes write streams to nodejs response. diff --git a/docz/docs/09-miscellany/01-formats.md b/docz/docs/09-miscellany/01-formats.md index ad8539e..e650bed 100644 --- a/docz/docs/09-miscellany/01-formats.md +++ b/docz/docs/09-miscellany/01-formats.md @@ -258,6 +258,6 @@ worksheet. The supported codes are a subset of the Word RTF support. #### Ethercalc Record Format (ETH) -[Ethercalc](https://ethercalc.net/) is an open source web spreadsheet powered by -a record format reminiscent of SYLK wrapped in a MIME multi-part message. +Ethercalc was an open source web spreadsheet powered by a record format +reminiscent of SYLK wrapped in a MIME multi-part message. diff --git a/docz/docs/09-miscellany/02-errors.md b/docz/docs/09-miscellany/02-errors.md index 922f968..1946bd1 100644 --- a/docz/docs/09-miscellany/02-errors.md +++ b/docz/docs/09-miscellany/02-errors.md @@ -179,14 +179,13 @@ contexts, freeing up the renderer to update. #### Strange exported file names in the web browser JS and the DOM API do not have a standard approach for creating files. There was -a [`saveAs` proposal](https://www.w3.org/TR/2014/NOTE-file-writer-api-20140424/) -but it was abandoned in 2014. +a `saveAs` proposal as part of "File API: Writer" but it was abandoned in 2014. The library integrates a number of platform-specific techniques for different environments. In modern web browsers, the library uses the `download` attribute. -Third party libraries like [FileSaver](https://github.com/eligrey/FileSaver.js/) -provide an implementation of `saveAs` and may help in some cases. +Third party libraries like `FileSaver.js` provide an implementation of `saveAs` +that include more browser-specific workarounds.
FileSaver.js integration (click to show) diff --git a/docz/docs/09-miscellany/03-source.md b/docz/docs/09-miscellany/03-source.md index 69f7706..cbc2b34 100644 --- a/docz/docs/09-miscellany/03-source.md +++ b/docz/docs/09-miscellany/03-source.md @@ -6,14 +6,4 @@ hide_table_of_contents: true The official source code repository is -:::note Mirrors - -Older snapshots of the source code repository are available at various hosts: - -- [GitHub](https://github.com/sheetjs/sheetjs) -- [GitLab](https://gitlab.com/sheetjs/sheetjs) -- [BitBucket](https://bitbucket.org/sheetjs/sheetjs) - - is the authoritative repository. - -::: \ No newline at end of file +Issues should be raised at \ No newline at end of file diff --git a/docz/docs/09-miscellany/04-testing.md b/docz/docs/09-miscellany/04-testing.md index 6442c87..63a5d37 100644 --- a/docz/docs/09-miscellany/04-testing.md +++ b/docz/docs/09-miscellany/04-testing.md @@ -75,15 +75,24 @@ ExtendScript Toolkit 3.5 is available as a standalone download for Windows.
(click to show) - - NodeJS `0.8`, `0.10`, `0.12`, `4.x`, `5.x`, `6.x`, `7.x`, `8.x` +**Browsers** - IE 6/7/8/9/10/11 (IE 6-9 require shims) - - Chrome 24+ (including Android 4.0+) - - Safari 6+ (iOS and Desktop) - - Edge 13+, FF 18+, and Opera 12+ + - Chrome 26+ (including Android 6.0+) + - Safari 8+ (Desktop) and Safari 10+ (iOS) + - Edge 13-18 and 79+ + - FF Latest -Tests utilize the mocha testing framework. +The automated browser tests seek to test the latest patch version of each major +release of Chromium ending in `0` (starting from Chrome 30). - - for XLS\* modules using Sauce Labs +Edge originally was an independent browser, becoming a Chromium fork in version +79. Since the new releases should be nearly identical to the Chrome counterpart, +the Edge tests are run on major releases ending in `5` (starting from Edge 85). + +**Server Runtimes** + - NodeJS `0.8`, `0.10`, `0.12`, and every major version starting from `4` + - io.js 1/2/3 + - Deno latest The test suite also includes tests for various time zones. To change the timezone locally, set the `TZ` environment variable: @@ -99,13 +108,5 @@ $ env TZ="Asia/Kolkata" WTF=1 make test_misc Test files are housed in [another repo](https://github.com/SheetJS/test_files). Running `make init` will refresh the `test_files` submodule and get the files. -Note that this requires `svn`, `git`, `hg` and other commands that may not be -available. If `make init` fails, please download the latest version of the test -files snapshot from [the repo](https://github.com/SheetJS/test_files/releases) - -#### Latest Snapshot - - - -(download and unzip to the `test_files` subfolder) - +[The "OS-Specific Setup"](/docs/miscellany/contributing#os-specific-setup) +includes notes for installing the required dependencies. diff --git a/docz/docs/09-miscellany/05-contributing.md b/docz/docs/09-miscellany/05-contributing.md index 1a907d2..3505f65 100644 --- a/docz/docs/09-miscellany/05-contributing.md +++ b/docz/docs/09-miscellany/05-contributing.md @@ -62,8 +62,7 @@ sudo npm i -g n sudo n 16 ``` -3) Follow to -build and install a version of Git with proper SSL support: +3) Build and install a version of Git with proper SSL support: ```bash # Git does not support OpenSSL out of the box, must do this @@ -88,13 +87,13 @@ On Linux: sudo apt-get install mercurial subversion ``` -On MacOS, install using [`brew`](https://brew.sh/): +On MacOS, install using Homebrew: ```bash brew install mercurial subversion ``` -NodeJS installers can be found at +NodeJS installers can be found at the project homepage. 1) Install NodeJS modules for building the scripts diff --git a/docz/docusaurus.config.js b/docz/docusaurus.config.js index 1017402..f711642 100644 --- a/docz/docusaurus.config.js +++ b/docz/docusaurus.config.js @@ -80,7 +80,7 @@ const config = { position: 'right', }, { - href: 'https://docs.sheetjs.com/docs/miscellany/source/', + href: 'https://git.sheetjs.com/sheetjs/sheetjs', label: 'Source', position: 'right', }, @@ -132,7 +132,7 @@ const config = { }, { label: 'Source', - href: 'https://docs.sheetjs.com/docs/miscellany/source/', + href: 'https://git.sheetjs.com/sheetjs/sheetjs', }, ], }, diff --git a/docz/static/pres.xlsx b/docz/static/pres.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2dcc8f00f0cf750db9edda57c0958ec750d88b4b GIT binary patch literal 8750 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 A!vFvP literal 0 HcmV?d00001