2023-05-07 13:58:36 +00:00
|
|
|
---
|
|
|
|
title: Eleventy
|
|
|
|
pagination_prev: demos/net/index
|
|
|
|
pagination_next: demos/mobile/index
|
|
|
|
---
|
|
|
|
|
|
|
|
import current from '/version.js';
|
|
|
|
import CodeBlock from '@theme/CodeBlock';
|
|
|
|
|
|
|
|
Eleventy is a static site generator.
|
|
|
|
|
|
|
|
The [NodeJS module](/docs/getting-started/installation/nodejs) can be loaded in
|
|
|
|
`.eleventy.js` and used in custom data file format parsers.
|
|
|
|
|
2023-05-25 01:36:15 +00:00
|
|
|
The following diagram depicts the workbook waltz:
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
flowchart LR
|
|
|
|
file[(workbook\nfile)]
|
|
|
|
subgraph SheetJS operations
|
|
|
|
buffer(NodeJS\nBuffer)
|
|
|
|
aoo(array of\nobjects)
|
|
|
|
end
|
|
|
|
html{{HTML\nTABLE}}
|
|
|
|
file --> |.eleventy.js\ncustom parser| buffer
|
|
|
|
buffer --> |.eleventy.js\ncustom parser| aoo
|
|
|
|
aoo --> |index.njk\ntemplate| html
|
|
|
|
```
|
|
|
|
|
2023-05-07 13:58:36 +00:00
|
|
|
## Integration Details
|
|
|
|
|
|
|
|
### Data File Parser
|
|
|
|
|
|
|
|
Custom data file parsers must be registered in `.eleventy.js`
|
|
|
|
|
|
|
|
`addDataExtension` accepts a list of file extensions and a parser object.
|
|
|
|
|
|
|
|
The parser object must include the options `read: true` and `encoding: null` .
|
|
|
|
Eleventy will read files and pass raw `Buffer` objects to the parser callback.
|
|
|
|
|
|
|
|
The `parser` callback can parse the data with `XLSX.read`. In this demo, the
|
|
|
|
parser will generate an array of row objects using `XLSX.utils.sheet_to_json`:
|
|
|
|
|
|
|
|
```js title=".eleventy.js"
|
|
|
|
const XLSX = require("xlsx");
|
|
|
|
|
|
|
|
/* list of file extensions */
|
|
|
|
const exts = [ "numbers", "xlsx", "xlsb", "xls" ].join(", ");
|
|
|
|
|
|
|
|
module.exports = (eleventyConfig) => {
|
|
|
|
eleventyConfig.addDataExtension(exts, {
|
|
|
|
/* read file and pass raw Buffer object to parser */
|
|
|
|
// highlight-next-line
|
|
|
|
encoding: null, read: true,
|
|
|
|
|
|
|
|
/* parser callback */
|
|
|
|
parser: (contents) => {
|
|
|
|
/* contents is the data stored as a Buffer */
|
|
|
|
// highlight-next-line
|
|
|
|
const wb = XLSX.read(contents);
|
|
|
|
/* generate array of row objects from first worksheet */
|
|
|
|
return XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
```
|
|
|
|
|
|
|
|
### Usage
|
|
|
|
|
|
|
|
Spreadsheet files added in the `_data` subdirectory are accessible from template
|
|
|
|
files using the name stem.
|
|
|
|
|
|
|
|
For example, [`pres.numbers`](https://sheetjs.com/pres.numbers) can be accessed
|
|
|
|
using the variable `pres` in a template:
|
|
|
|
|
|
|
|
```liquid title="index.njk"
|
|
|
|
<table><thead><th>Name</th><th>Index</th></thead>
|
|
|
|
<tbody>
|
|
|
|
{% for row in pres %}
|
|
|
|
<tr>
|
|
|
|
<td>{{ row.Name }}</td>
|
|
|
|
<td>{{ row.Index }}</td>
|
|
|
|
</tr>
|
|
|
|
{% endfor %}
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Complete Example
|
|
|
|
|
|
|
|
:::note
|
|
|
|
|
|
|
|
This demo was tested on 2023 May 07 using Eleventy `2.0.1`
|
|
|
|
|
|
|
|
:::
|
|
|
|
|
|
|
|
### Project Setup
|
|
|
|
|
|
|
|
1) Create a new project:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
mkdir sheetjs-11ty
|
|
|
|
cd sheetjs-11ty
|
|
|
|
npm init -y
|
|
|
|
```
|
|
|
|
|
|
|
|
2) Install Eleventy and SheetJS libraries:
|
|
|
|
|
|
|
|
<CodeBlock language="bash">{`\
|
|
|
|
npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz @11ty/eleventy`}
|
|
|
|
</CodeBlock>
|
|
|
|
|
|
|
|
3) Make a new `_data` subdirectory in the project. Download the example file
|
|
|
|
[`pres.xlsx`](https://sheetjs.com/pres.xlsx) into `_data`:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
mkdir _data
|
|
|
|
curl -Lo _data/pres.xlsx https://sheetjs.com/pres.xlsx
|
|
|
|
```
|
|
|
|
|
|
|
|
4) Download the following files to the project folder:
|
|
|
|
|
|
|
|
- [`_eleventy.js`](pathname:///eleventy/_eleventy.js) (rename to `.eleventy.js`)
|
|
|
|
- [`index.njk`](pathname:///eleventy/index.njk)
|
|
|
|
|
|
|
|
```bash
|
|
|
|
curl -L -o .eleventy.js https://docs.sheetjs.com/eleventy/_eleventy.js
|
|
|
|
curl -LO https://docs.sheetjs.com/eleventy/index.njk
|
|
|
|
```
|
|
|
|
|
|
|
|
### Live Reload
|
|
|
|
|
|
|
|
5) Start the live reloading server:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
npx @11ty/eleventy --serve
|
|
|
|
```
|
|
|
|
|
|
|
|
The server will generate `index.html` from `index.njk` and show the server URL:
|
|
|
|
|
|
|
|
```
|
|
|
|
[11ty] Writing _site/index.html from ./index.njk
|
|
|
|
[11ty] Wrote 1 file in 0.23 seconds (v2.0.1)
|
|
|
|
[11ty] Watching…
|
|
|
|
[11ty] Server at http://localhost:8080/ <-- this is the URL
|
|
|
|
```
|
|
|
|
|
|
|
|
6) Open the URL in a web browser. The page should include a table.
|
|
|
|
|
|
|
|
7) Open `_data/pres.xlsx` in a spreadsheet editor. Add a new row to the end
|
|
|
|
of the list and save the file.
|
|
|
|
|
|
|
|
The server log will note that the file changed:
|
|
|
|
|
|
|
|
```
|
|
|
|
[11ty] File changed: _data/pres.xlsx
|
|
|
|
[11ty] Writing _site/index.html from ./index.njk
|
|
|
|
```
|
|
|
|
|
|
|
|
The browser will refresh to show the new data.
|
|
|
|
|
|
|
|
### Static Site
|
|
|
|
|
|
|
|
8) Stop the live reload server and build the static site:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
npx @11ty/eleventy
|
|
|
|
```
|
|
|
|
|
|
|
|
Eleventy will place the generated site in the `_site` subfolder.
|
|
|
|
|
|
|
|
9) Start a web server to host the static site:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
npx http-server _site
|
|
|
|
```
|
|
|
|
|
|
|
|
Open a web browser and access the displayed URL ( `http://localhost:8080` ).
|
|
|
|
View the page source and confirm that no JS was added to the page. It only
|
|
|
|
contains the content from the file in an HTML table.
|