JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 63
  • Score
    100M100P100Q67255F
  • License ISC

Zero dependency library to generate HTML from Notion Api blocks

Package Exports

  • notion-html-blocks
  • notion-html-blocks/dist/index.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (notion-html-blocks) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

notion-html-blocks

notion-html-blocks is a zero-dependency library capable of rendering blocks from the Notion API into HTML. Through the use of the Notion SDK for JavaScript it's possible to extract specific page blocks which then can be converted into HTML.

Motivation

It`s could be useful when you want to use Notion like CMS for your project

How to use

import { renderBlocks } from 'notion-html-block'

// use notion SDK to get blocks
const pageBlocks = await notion.blocks.children.list({ block_id: id });

// retrieve nested blocks
for (const block of pageBlocks.results) {
  if (block.has_children) {
    block.children = await getPageBlocks(block.id);
  }
}

// get html for blocks list
const content = renderBlocks(pageBlocks.results);

Example output for toggleable heading block:

<div class="n-toggle-heading">
    <h1 class="n-heading-1 n-toggleable n-toggleable-closed">Toggle Heading</h1>
    <p class="n-paragraph">Hidden content</p>
</div>

Also, it's possible to render one certain block:

const block = {
  "object": "block",
  "type": "paragraph",
  "paragraph": {
    "rich_text": [
        //...
    ],
  }
  //...
};

const content = renderBlock(block)

Recipes

Generate static files for your static site generator:

import fs from "fs";
const content = renderBlocks(blocks);

fs.writeFile('./blocks.html', content)
fs.writeFile('./blocks.json', JSON.stringify({blocks: content}))

If you need to insert output HTML to DOM, you cna use DOMParser:

const parser = new DOMParser();

const html = parser.parseFromString(`<div id="my-content">${renderBlocks(blocks)}</div>`, 'text/html');
const content = html.getElementById("my-content")
document.body.append(content);

or <template> element:

const template = document.createElement('template');
template.innerHTML = renderBlock(block);

const html = template.content.children;
document.body.append(html);

Supported types:

  • heading_1
  • heading_2
  • heading_3
  • code
  • image
  • bulleted_list_item
  • numbered_list_item
  • paragraph
  • quote
  • toggle
  • table
  • columns
  • callout
  • divider