0.0.3 • Published 4 years ago
aabbccdd1234 v0.0.3
Notion to Markdown
Convert notion pages, block and list of blocks to markdown (supports nesting) using notion-sdk-js
Note: Before getting started, create an integration and find the token.
Todo
- heading
- images
- quotes
- links
- bullets
- todo
- inline code
- code block
- strikethrough, underline, bold, italic
- nested blocks
- pages inside pages/child page
- embeds, bookmarks, videos, files (converted to links)
- tables
- divider
- equation block (converted to code blocks)
- convert returned markdown object to string (
toMarkdownString()) - typescript support
- add tests
Install
$ npm install notion-to-mdUsage
Note: Details on methods can be found in API section
converting markdown objects to markdown string
This is how the notion page looks for this example:

const { Client } = require("@notionhq/client");
const { NotionToMarkdown } = require("notion-to-md");
const notion = new Client({
auth: "your integration token",
});
// passing notion client to the option
const n2m = new NotionToMarkdown({ notionClient: notion });
(async () => {
const mdblocks = await n2m.pageToMarkdown("target_page_id");
const mdString = n2m.toMarkdownString(mdblocks);
//writing to file
fs.writeFile("test.md", mdString, (err) => {
console.log(err);
});
})();Output:

converting page to markdown object
Example notion page:

const { Client } = require("@notionhq/client");
const { NotionToMarkdown } = require("notion-to-md");
const notion = new Client({
auth: "your integration token",
});
// passing notion client to the option
const n2m = new NotionToMarkdown({ notionClient: notion });
(async () => {
// notice second argument, totalPage.
const x = await n2m.pageToMarkdown("target_page_id", 2);
console.log(x);
})();Output:
[
{
"parent": "# heading 1",
"children": []
},
{
"parent": "- bullet 1",
"children": [
{
"parent": "- bullet 1.1",
"children": []
},
{
"parent": "- bullet 1.2",
"children": []
}
]
},
{
"parent": "- bullet 2",
"children": []
},
{
"parent": "- [ ] check box 1",
"children": [
{
"parent": "- [x] check box 1.2",
"children": []
},
{
"parent": "- [ ] check box 1.3",
"children": []
}
]
},
{
"parent": "- [ ] checkbox 2",
"children": []
}
]converting list of blocks to markdown object
same notion page as before
const { Client } = require("@notionhq/client");
const notion2md = require("notion-to-md");
const notion = new Client({
auth: "your integration token",
});
// passing notion client to the option
const n2m = new notion2md({ notionClient: notion });
(async () => {
// get all blocks in the page
const { results } = await notion.blocks.children.list({
block_id,
});
//convert to markdown
const x = await n2m.blocksToMarkdown(results);
console.log(x);
})();Output: same as before
Converting a single block to markdown string
- only takes a single notion block and returns corresponding markdown string
- nesting is ignored
- independent of @notionhq/client
const notion2md = require("notion-to-md");
// notion client not required
const n2m = new notion2md();
const result = n2m.blockToMarkdown(block);
console.log(result);result:
API
toMarkdownString(mdBlock[])
- takes output of
pageToMarkdownorblocksToMarkdownas argument- converts to markdown string.
pageToMarkdown(id,totalPage)
- Uses
blocksToMarkdowninternally.id(pageid) as input and converts all the blocks in the page to corresponding markdown objecttotalPageis the retrieve block children request number i.epage_size Maximum = totalPage * 100.totalPage
Default value is
1which means only100blocks will be converted to markdown and rest will be ignored (due to notion api limitations, ref: #9).How to use
totalPagearg ?
- if the notion page contains less than or equal
100blocks thentotalPagearg is not required.- if the notion page contains
150blocks thentotalPageargument should be greater than or equal to2leading topageSize = 2 * 100and rendering all150blocks.
blocksToMarkdown(blocks,totalPage)Note: requires notion-sdk-js unlike
blockToMarkdown
blocks: array of notion blockstotalPage: the retrieve block children request number i.epage_size Maximum = totalPage * 100.- deals with nested blocks
- uses
blockToMarkdowninternally.
blockToMarkdown(block)
- Takes single notion block and converts to markdown string
- does not deal with nested notion blocks
- This method doesn't require the
notion-sdk-js.- Refer docs to know more about notion blocks
Contribution
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change. Please make sure to update tests as appropriate.