notion-to-md 2.5.6 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +101 -42
- package/build/notion-to-md.d.ts +4 -2
- package/build/notion-to-md.d.ts.map +1 -1
- package/build/notion-to-md.js +59 -65
- package/build/notion-to-md.js.map +1 -1
- package/build/types/index.d.ts +7 -2
- package/build/types/index.d.ts.map +1 -1
- package/build/types/index.js.map +1 -1
- package/build/utils/md.js +1 -1
- package/build/utils/md.js.map +1 -1
- package/build/utils/misc.d.ts +2 -0
- package/build/utils/misc.d.ts.map +1 -0
- package/build/utils/misc.js +10 -0
- package/build/utils/misc.js.map +1 -0
- package/build/utils/notion.d.ts.map +1 -1
- package/build/utils/notion.js.map +1 -1
- package/package.json +3 -1
package/README.md
CHANGED
|
@@ -1,37 +1,32 @@
|
|
|
1
|
-
<img src="https://imgur.com/WgXdz9r.png" />
|
|
2
1
|
|
|
3
|
-
|
|
2
|
+
<!--
|
|
3
|
+
💡 For better readability and detailed instructions head over to the [wiki](https://github.com/souvikinator/notion-to-md/wiki).
|
|
4
|
+
-->
|
|
5
|
+
<h1 align="center">
|
|
6
|
+
<br>
|
|
7
|
+
<img src="https://imgur.com/WgXdz9r.png" alt="notion-to-md banner" width="750" />
|
|
8
|
+
<br>
|
|
9
|
+
<b>Notion-to-MD</b>
|
|
10
|
+
<br>
|
|
11
|
+
<sub><sup><b>(Notion to Markdown)</b></sup></sub>
|
|
12
|
+
<br>
|
|
13
|
+
</h1>
|
|
4
14
|
|
|
5
|
-
|
|
15
|
+
<p align="center">
|
|
16
|
+
Notion-to-MD is a Node.js package that allows you to convert Notion pages to Markdown format.
|
|
17
|
+
</p>
|
|
18
|
+
<p align="center">
|
|
19
|
+
Convert notion pages, block and list of blocks to markdown (supports nesting) using <a href="https://github.com/makenotion/notion-sdk-js">notion-sdk-js</a>
|
|
20
|
+
</p>
|
|
21
|
+
<p align="center">
|
|
22
|
+
<img src="https://img.shields.io/github/stars/souvikinator/notion-to-md?style=for-the-badge"
|
|
23
|
+
alt="">
|
|
24
|
+
<a href="https://www.producthunt.com/products/notion-to-md?utm_source=badge-follow&utm_medium=badge&utm_souce=badge-notion-to-md" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/follow.svg?product_id=486574&theme=light&size=small" alt="notion-to-md - Programmatically convert notion pages to markdown | Product Hunt" style="width: 86px; height: 32px;" width="86" height="32" /></a>
|
|
25
|
+
|
|
26
|
+
</p>
|
|
6
27
|
|
|
7
|
-
Convert notion pages, block and list of blocks to markdown (supports nesting) using **[notion-sdk-js](https://github.com/makenotion/notion-sdk-js)**
|
|
8
28
|
|
|
9
|
-
> **Note:** Before getting started, create [an integration and find the token](https://www.notion.so/my-integrations).
|
|
10
29
|
|
|
11
|
-
<a href="https://www.producthunt.com/posts/notion-to-md?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-notion-to-md" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=351669&theme=light" alt="notion-to-md - Programmatically convert notion pages to markdown | Product Hunt" style="width: 250px; height: 54px;" width="250" height="54" /></a>
|
|
12
|
-
|
|
13
|
-
[](https://ko-fi.com/O5O1AFCJR)
|
|
14
|
-
|
|
15
|
-
## Todo
|
|
16
|
-
|
|
17
|
-
- [x] heading
|
|
18
|
-
- [x] images
|
|
19
|
-
- [x] quotes
|
|
20
|
-
- [x] links
|
|
21
|
-
- [x] bullets
|
|
22
|
-
- [x] todo
|
|
23
|
-
- [x] inline code
|
|
24
|
-
- [x] code block
|
|
25
|
-
- [x] strikethrough, underline, bold, italic
|
|
26
|
-
- [x] nested blocks
|
|
27
|
-
- [x] embeds, bookmarks, videos, files (converted to links)
|
|
28
|
-
- [x] simple tables
|
|
29
|
-
- [x] toggle
|
|
30
|
-
- [x] divider
|
|
31
|
-
- [x] equation block (converted to code blocks)
|
|
32
|
-
- [x] convert returned markdown object to string (`toMarkdownString()`)
|
|
33
|
-
- [x] typescript support
|
|
34
|
-
- [x] add tests
|
|
35
30
|
|
|
36
31
|
## Install
|
|
37
32
|
|
|
@@ -40,18 +35,19 @@ npm install notion-to-md
|
|
|
40
35
|
```
|
|
41
36
|
|
|
42
37
|
## Usage
|
|
38
|
+
> **Note:** Before getting started, create [an integration and find the token](https://www.notion.so/my-integrations).
|
|
39
|
+
> Details on methods can be found in [API section](https://github.com/souvikinator/notion-to-md#api)
|
|
43
40
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
### converting markdown objects to markdown string
|
|
41
|
+
## converting markdown objects to markdown string
|
|
47
42
|
|
|
48
43
|
This is how the notion page looks for this example:
|
|
49
44
|
|
|
50
|
-
|
|
45
|
+
<img src="https://imgur.com/O6bKCmH.png" width="500" />
|
|
51
46
|
|
|
52
|
-
```
|
|
47
|
+
```javascript
|
|
53
48
|
const { Client } = require("@notionhq/client");
|
|
54
49
|
const { NotionToMarkdown } = require("notion-to-md");
|
|
50
|
+
const fs = require('fs');
|
|
55
51
|
// or
|
|
56
52
|
// import {NotionToMarkdown} from "notion-to-md";
|
|
57
53
|
|
|
@@ -65,23 +61,88 @@ const n2m = new NotionToMarkdown({ notionClient: notion });
|
|
|
65
61
|
(async () => {
|
|
66
62
|
const mdblocks = await n2m.pageToMarkdown("target_page_id");
|
|
67
63
|
const mdString = n2m.toMarkdownString(mdblocks);
|
|
64
|
+
console.log(mdString);
|
|
65
|
+
})();
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**Output:**
|
|
69
|
+
|
|
70
|
+
<img src="https://imgur.com/XrUYrZ0.png" width="500" />
|
|
71
|
+
|
|
72
|
+
## Save content to file
|
|
73
|
+
|
|
74
|
+
**parent page content:**
|
|
68
75
|
|
|
76
|
+
<img src="https://user-images.githubusercontent.com/64456160/236519171-b32d8f62-1e2c-4897-a302-ae0dd85adef9.png" width="500" />
|
|
77
|
+
|
|
78
|
+
**child page content:**
|
|
79
|
+
|
|
80
|
+
<img src="https://user-images.githubusercontent.com/64456160/236519726-37513735-db0c-4643-9c89-f8deb355a6d3.png" width="500" />
|
|
81
|
+
|
|
82
|
+
### Saving page to a file
|
|
83
|
+
|
|
84
|
+
Simply saving `mdString` from above code to a file does the work like so
|
|
85
|
+
|
|
86
|
+
```javascript
|
|
69
87
|
//writing to file
|
|
70
88
|
fs.writeFile("test.md", mdString, (err) => {
|
|
71
89
|
console.log(err);
|
|
72
90
|
});
|
|
91
|
+
```
|
|
92
|
+
> ⚠️ **Note**: with this the `child_page` content is merged in the same file.
|
|
93
|
+
|
|
94
|
+
**Output:**
|
|
95
|
+
|
|
96
|
+
<img src="https://user-images.githubusercontent.com/64456160/236520621-fc1d328f-51e3-4e39-a529-7ef1b9f75ab3.png" width="500" />
|
|
97
|
+
|
|
98
|
+
### Saving `child_page` to separate file
|
|
99
|
+
|
|
100
|
+
`NotionToMarkdown` takes second argument, `config`
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
```javascript
|
|
104
|
+
const { Client } = require("@notionhq/client");
|
|
105
|
+
const { NotionToMarkdown } = require("notion-to-md");
|
|
106
|
+
const fs = require('fs');
|
|
107
|
+
// or
|
|
108
|
+
// import {NotionToMarkdown} from "notion-to-md";
|
|
109
|
+
|
|
110
|
+
const notion = new Client({
|
|
111
|
+
auth: "your integration token",
|
|
112
|
+
config:{
|
|
113
|
+
saveChildPage: true, //default: false
|
|
114
|
+
saveToDir: "path/to/output/dir", //default: current directory
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// passing notion client to the option
|
|
119
|
+
const n2m = new NotionToMarkdown({ notionClient: notion });
|
|
120
|
+
|
|
121
|
+
(async () => {
|
|
122
|
+
const mdblocks = await n2m.pageToMarkdown("target_page_id");
|
|
123
|
+
const mdString = n2m.toMarkdownString(mdblocks);
|
|
124
|
+
|
|
125
|
+
// writing parent page content to file
|
|
126
|
+
// where the child pages will be saved
|
|
127
|
+
// the child page will be linked to the parent page
|
|
128
|
+
fs.writeFile("test.md", mdString, (err) => {
|
|
129
|
+
console.log(err);
|
|
130
|
+
});
|
|
73
131
|
})();
|
|
74
132
|
```
|
|
75
133
|
|
|
76
134
|
**Output:**
|
|
77
135
|
|
|
78
|
-
|
|
136
|
+
> ⚠️ **Note:** make sure to save parent page in the same directory as that of child page
|
|
137
|
+
> for the link from parent to child page to work.
|
|
79
138
|
|
|
80
|
-
|
|
139
|
+
<img src="https://user-images.githubusercontent.com/64456160/236521464-fd137be9-ade1-444b-86fc-562d5ad06568.png" width="500" />
|
|
140
|
+
<img src="https://user-images.githubusercontent.com/64456160/236521541-c08d6062-9229-4429-96d5-78ab699600a1.png" width="500" />
|
|
81
141
|
|
|
82
|
-
|
|
142
|
+
## converting page to markdown object
|
|
83
143
|
|
|
84
|
-
|
|
144
|
+
**Example notion page:**
|
|
145
|
+
<img src="https://imgur.com/9iqRpBl.png" width="500" />
|
|
85
146
|
|
|
86
147
|
```js
|
|
87
148
|
const { Client } = require("@notionhq/client");
|
|
@@ -146,9 +207,7 @@ const n2m = new NotionToMarkdown({ notionClient: notion });
|
|
|
146
207
|
]
|
|
147
208
|
```
|
|
148
209
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
same notion page as before
|
|
210
|
+
## converting list of blocks to markdown object
|
|
152
211
|
|
|
153
212
|
```js
|
|
154
213
|
const { Client } = require("@notionhq/client");
|
|
@@ -175,7 +234,7 @@ const n2m = new NotionToMarkdown({ notionClient: notion });
|
|
|
175
234
|
|
|
176
235
|
**Output**: same as before
|
|
177
236
|
|
|
178
|
-
|
|
237
|
+
## Converting a single block to markdown string
|
|
179
238
|
|
|
180
239
|
- only takes a single notion block and returns corresponding markdown string
|
|
181
240
|
- nesting is ignored
|
package/build/notion-to-md.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { Annotations, CustomTransformer, ListBlockChildrenResponseResult, ListBlockChildrenResponseResults, MdBlock, NotionToMarkdownOptions } from
|
|
1
|
+
import { Annotations, CustomTransformer, ListBlockChildrenResponseResult, ListBlockChildrenResponseResults, MdBlock, NotionToMarkdownOptions } from "./types";
|
|
2
2
|
/**
|
|
3
3
|
* Converts a Notion page to Markdown.
|
|
4
4
|
*/
|
|
5
5
|
export declare class NotionToMarkdown {
|
|
6
6
|
private notionClient;
|
|
7
|
+
private config;
|
|
8
|
+
private targetPage;
|
|
7
9
|
private customTransformers;
|
|
8
10
|
constructor(options: NotionToMarkdownOptions);
|
|
9
11
|
setCustomTransformer(type: string, transformer: CustomTransformer): NotionToMarkdown;
|
|
@@ -13,7 +15,7 @@ export declare class NotionToMarkdown {
|
|
|
13
15
|
* @param {number} nestingLevel - Defines max depth of nesting
|
|
14
16
|
* @returns {string} - Returns markdown string
|
|
15
17
|
*/
|
|
16
|
-
toMarkdownString(mdBlocks?: MdBlock[], nestingLevel?: number): string;
|
|
18
|
+
toMarkdownString(mdBlocks?: MdBlock[], pageName?: string, nestingLevel?: number): string;
|
|
17
19
|
/**
|
|
18
20
|
* Retrieves Notion Blocks based on ID and converts them to Markdown Blocks
|
|
19
21
|
* @param {string} id - notion page id (not database id)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notion-to-md.d.ts","sourceRoot":"","sources":["../src/notion-to-md.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"notion-to-md.d.ts","sourceRoot":"","sources":["../src/notion-to-md.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,+BAA+B,EAC/B,gCAAgC,EAChC,OAAO,EACP,uBAAuB,EAIxB,MAAM,SAAS,CAAC;AAKjB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAAoC;gBAElD,OAAO,EAAE,uBAAuB;IAW5C,oBAAoB,CAClB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,iBAAiB,GAC7B,gBAAgB;IAMnB;;;;;OAKG;IACH,gBAAgB,CACd,QAAQ,GAAE,OAAO,EAAO,EACxB,QAAQ,CAAC,EAAE,MAAM,EACjB,YAAY,GAAE,MAAU,GACvB,MAAM;IAmET;;;;;OAKG;IACG,cAAc,CAClB,EAAE,EAAE,MAAM,EACV,SAAS,GAAE,MAAM,GAAG,IAAW,GAC9B,OAAO,CAAC,OAAO,EAAE,CAAC;IAcrB;;;;;;OAMG;IACG,gBAAgB,CACpB,MAAM,CAAC,EAAE,gCAAgC,EACzC,SAAS,GAAE,MAAM,GAAG,IAAW,EAC/B,QAAQ,GAAE,OAAO,EAAO,GACvB,OAAO,CAAC,OAAO,EAAE,CAAC;IAkDrB;;;;OAIG;IACG,eAAe,CAAC,KAAK,EAAE,+BAA+B;IA4P5D;;;;;OAKG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM;CAsBlE"}
|
package/build/notion-to-md.js
CHANGED
|
@@ -24,14 +24,23 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.NotionToMarkdown = void 0;
|
|
27
|
+
const fs_extra_1 = require("fs-extra");
|
|
28
|
+
const path = __importStar(require("path"));
|
|
27
29
|
const md = __importStar(require("./utils/md"));
|
|
28
30
|
const notion_1 = require("./utils/notion");
|
|
31
|
+
const misc_1 = require("./utils/misc");
|
|
29
32
|
/**
|
|
30
33
|
* Converts a Notion page to Markdown.
|
|
31
34
|
*/
|
|
32
35
|
class NotionToMarkdown {
|
|
33
36
|
constructor(options) {
|
|
34
37
|
this.notionClient = options.notionClient;
|
|
38
|
+
const defaultConfig = {
|
|
39
|
+
saveChildPage: false,
|
|
40
|
+
saveToDir: ".",
|
|
41
|
+
};
|
|
42
|
+
this.targetPage = "";
|
|
43
|
+
this.config = { ...defaultConfig, ...options.config };
|
|
35
44
|
this.customTransformers = {};
|
|
36
45
|
}
|
|
37
46
|
setCustomTransformer(type, transformer) {
|
|
@@ -44,11 +53,14 @@ class NotionToMarkdown {
|
|
|
44
53
|
* @param {number} nestingLevel - Defines max depth of nesting
|
|
45
54
|
* @returns {string} - Returns markdown string
|
|
46
55
|
*/
|
|
47
|
-
toMarkdownString(mdBlocks = [], nestingLevel = 0) {
|
|
56
|
+
toMarkdownString(mdBlocks = [], pageName, nestingLevel = 0) {
|
|
48
57
|
let mdString = "";
|
|
49
58
|
mdBlocks.forEach((mdBlocks) => {
|
|
59
|
+
// NOTE: toggle in the child blocks logic
|
|
60
|
+
// adding a toggle check prevents duplicate
|
|
61
|
+
// rendering of toggle title
|
|
50
62
|
// process parent blocks
|
|
51
|
-
if (mdBlocks.parent) {
|
|
63
|
+
if (mdBlocks.parent && mdBlocks.type !== "toggle") {
|
|
52
64
|
if (mdBlocks.type !== "to_do" &&
|
|
53
65
|
mdBlocks.type !== "bulleted_list_item" &&
|
|
54
66
|
mdBlocks.type !== "numbered_list_item") {
|
|
@@ -62,15 +74,34 @@ class NotionToMarkdown {
|
|
|
62
74
|
// process child blocks
|
|
63
75
|
if (mdBlocks.children && mdBlocks.children.length > 0) {
|
|
64
76
|
if (mdBlocks.type === "synced_block" ||
|
|
65
|
-
mdBlocks.type === "
|
|
77
|
+
mdBlocks.type === "column_list" ||
|
|
78
|
+
mdBlocks.type === "column") {
|
|
66
79
|
let mdstr = this.toMarkdownString(mdBlocks.children);
|
|
67
|
-
// console.log(mdstr);
|
|
68
80
|
mdString += mdstr;
|
|
69
81
|
}
|
|
82
|
+
else if (mdBlocks.type === "child_page") {
|
|
83
|
+
let mdstr = this.toMarkdownString(mdBlocks.children);
|
|
84
|
+
if (this.config.saveChildPage && this.config.saveToDir) {
|
|
85
|
+
const childPageTitle = (0, misc_1.extractTitleFromMdLink)(mdBlocks.parent);
|
|
86
|
+
const fileName = childPageTitle.split(" ").join("-");
|
|
87
|
+
const filePath = path.join(this.config.saveToDir, `${fileName}.md`);
|
|
88
|
+
// save to file
|
|
89
|
+
(0, fs_extra_1.ensureFile)(filePath).then(() => {
|
|
90
|
+
(0, fs_extra_1.writeFile)(filePath, mdstr);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
mdString += mdstr;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else if (mdBlocks.type === "toggle") {
|
|
98
|
+
// convert children md object to md string
|
|
99
|
+
const toggle_children_md_string = this.toMarkdownString(mdBlocks.children);
|
|
100
|
+
mdString += md.toggle(mdBlocks.parent, toggle_children_md_string);
|
|
101
|
+
}
|
|
70
102
|
else {
|
|
71
|
-
let mdstr = this.toMarkdownString(mdBlocks.children, nestingLevel + 1);
|
|
103
|
+
let mdstr = this.toMarkdownString(mdBlocks.children, pageName, nestingLevel + 1);
|
|
72
104
|
mdString += mdstr;
|
|
73
|
-
// console.log(mdstr);
|
|
74
105
|
}
|
|
75
106
|
}
|
|
76
107
|
});
|
|
@@ -86,9 +117,9 @@ class NotionToMarkdown {
|
|
|
86
117
|
if (!this.notionClient) {
|
|
87
118
|
throw new Error("notion client is not provided, for more details check out https://github.com/souvikinator/notion-to-md");
|
|
88
119
|
}
|
|
120
|
+
this.targetPage = id;
|
|
89
121
|
const blocks = await (0, notion_1.getBlockChildren)(this.notionClient, id, totalPage);
|
|
90
122
|
const parsedData = await this.blocksToMarkdown(blocks);
|
|
91
|
-
// console.log(JSON.stringify(parsedData, null, 4));
|
|
92
123
|
return parsedData;
|
|
93
124
|
}
|
|
94
125
|
/**
|
|
@@ -106,11 +137,7 @@ class NotionToMarkdown {
|
|
|
106
137
|
return mdBlocks;
|
|
107
138
|
for (let i = 0; i < blocks.length; i++) {
|
|
108
139
|
let block = blocks[i];
|
|
109
|
-
if ("has_children" in block &&
|
|
110
|
-
block.has_children &&
|
|
111
|
-
block.type !== "column_list" &&
|
|
112
|
-
block.type !== "toggle" &&
|
|
113
|
-
block.type !== "callout") {
|
|
140
|
+
if ("has_children" in block && block.has_children) {
|
|
114
141
|
// Get children of this block.
|
|
115
142
|
let child_blocks = await (0, notion_1.getBlockChildren)(this.notionClient, block.id, totalPage);
|
|
116
143
|
// Push this block to mdBlocks.
|
|
@@ -126,13 +153,12 @@ class NotionToMarkdown {
|
|
|
126
153
|
continue;
|
|
127
154
|
}
|
|
128
155
|
let tmp = await this.blockToMarkdown(block);
|
|
129
|
-
// console.log(block);
|
|
130
156
|
mdBlocks.push({
|
|
131
157
|
// @ts-ignore
|
|
132
158
|
type: block.type,
|
|
133
159
|
blockId: block.id,
|
|
134
160
|
parent: tmp,
|
|
135
|
-
children: []
|
|
161
|
+
children: [],
|
|
136
162
|
});
|
|
137
163
|
}
|
|
138
164
|
return mdBlocks;
|
|
@@ -143,7 +169,6 @@ class NotionToMarkdown {
|
|
|
143
169
|
* @returns {string} corresponding markdown string of the passed block
|
|
144
170
|
*/
|
|
145
171
|
async blockToMarkdown(block) {
|
|
146
|
-
var _a;
|
|
147
172
|
if (typeof block !== "object" || !("type" in block))
|
|
148
173
|
return "";
|
|
149
174
|
let parsedData = "";
|
|
@@ -170,7 +195,7 @@ class NotionToMarkdown {
|
|
|
170
195
|
case "divider": {
|
|
171
196
|
return md.divider();
|
|
172
197
|
}
|
|
173
|
-
case
|
|
198
|
+
case "equation": {
|
|
174
199
|
return md.equation(block.equation.expression);
|
|
175
200
|
}
|
|
176
201
|
case "video":
|
|
@@ -197,8 +222,6 @@ class NotionToMarkdown {
|
|
|
197
222
|
case "embed":
|
|
198
223
|
case "link_preview":
|
|
199
224
|
case "link_to_page":
|
|
200
|
-
case "child_page":
|
|
201
|
-
case "child_database":
|
|
202
225
|
{
|
|
203
226
|
let blockContent;
|
|
204
227
|
let title = type;
|
|
@@ -212,24 +235,32 @@ class NotionToMarkdown {
|
|
|
212
235
|
block.link_to_page.type === "page_id") {
|
|
213
236
|
blockContent = { url: block.link_to_page.page_id };
|
|
214
237
|
}
|
|
215
|
-
if (type === "child_page") {
|
|
216
|
-
blockContent = { url: block.id };
|
|
217
|
-
title = block.child_page.title;
|
|
218
|
-
}
|
|
219
|
-
if (type === "child_database") {
|
|
220
|
-
blockContent = { url: block.id };
|
|
221
|
-
title = block.child_database.title || "child_database";
|
|
222
|
-
}
|
|
223
238
|
if (blockContent)
|
|
224
239
|
return md.link(title, blockContent.url);
|
|
225
240
|
}
|
|
226
241
|
break;
|
|
242
|
+
case "child_page":
|
|
243
|
+
{
|
|
244
|
+
let pageTitle = block.child_page.title;
|
|
245
|
+
if (this.config.saveChildPage) {
|
|
246
|
+
const fileName = pageTitle.split(" ").join("-");
|
|
247
|
+
const filePath = `${fileName}.md`;
|
|
248
|
+
return md.link(pageTitle, filePath);
|
|
249
|
+
}
|
|
250
|
+
return md.heading2(pageTitle);
|
|
251
|
+
}
|
|
252
|
+
break;
|
|
253
|
+
case "child_database":
|
|
254
|
+
{
|
|
255
|
+
let pageTitle = block.child_database.title || `child_database`;
|
|
256
|
+
return pageTitle;
|
|
257
|
+
}
|
|
258
|
+
break;
|
|
227
259
|
case "table": {
|
|
228
260
|
const { id, has_children } = block;
|
|
229
261
|
let tableArr = [];
|
|
230
262
|
if (has_children) {
|
|
231
263
|
const tableRows = await (0, notion_1.getBlockChildren)(this.notionClient, id, 100);
|
|
232
|
-
// console.log(">>", tableRows);
|
|
233
264
|
let rowsPromise = tableRows === null || tableRows === void 0 ? void 0 : tableRows.map(async (row) => {
|
|
234
265
|
const { type } = row;
|
|
235
266
|
const cells = row[type]["cells"];
|
|
@@ -243,47 +274,12 @@ class NotionToMarkdown {
|
|
|
243
274
|
paragraph: { rich_text: cell },
|
|
244
275
|
}));
|
|
245
276
|
const cellStringArr = await Promise.all(cellStringPromise);
|
|
246
|
-
// console.log("~~", cellStringArr);
|
|
247
277
|
tableArr.push(cellStringArr);
|
|
248
|
-
// console.log(tableArr);
|
|
249
278
|
});
|
|
250
279
|
await Promise.all(rowsPromise || []);
|
|
251
280
|
}
|
|
252
281
|
return md.table(tableArr);
|
|
253
282
|
}
|
|
254
|
-
// NOTE: column_list is parent of columns
|
|
255
|
-
case "column_list": {
|
|
256
|
-
const { id, has_children } = block;
|
|
257
|
-
if (!has_children)
|
|
258
|
-
return "";
|
|
259
|
-
const column_list_children = await (0, notion_1.getBlockChildren)(this.notionClient, id, 100);
|
|
260
|
-
let column_list_promise = column_list_children.map(async (column) => await this.blockToMarkdown(column));
|
|
261
|
-
let column_list = await Promise.all(column_list_promise);
|
|
262
|
-
return column_list.join("\n\n");
|
|
263
|
-
}
|
|
264
|
-
case "column": {
|
|
265
|
-
const { id, has_children } = block;
|
|
266
|
-
if (!has_children)
|
|
267
|
-
return "";
|
|
268
|
-
const column_children = await (0, notion_1.getBlockChildren)(this.notionClient, id, 100);
|
|
269
|
-
let column_children_mdBlocks = await this.blocksToMarkdown(column_children);
|
|
270
|
-
let column_string = this.toMarkdownString(column_children_mdBlocks);
|
|
271
|
-
return column_string;
|
|
272
|
-
}
|
|
273
|
-
case "toggle": {
|
|
274
|
-
const { id, has_children } = block;
|
|
275
|
-
const toggle_summary = (_a = block.toggle.rich_text[0]) === null || _a === void 0 ? void 0 : _a.plain_text;
|
|
276
|
-
// empty toggle
|
|
277
|
-
if (!has_children) {
|
|
278
|
-
return md.toggle(toggle_summary);
|
|
279
|
-
}
|
|
280
|
-
const toggle_children_object = await (0, notion_1.getBlockChildren)(this.notionClient, id, 100);
|
|
281
|
-
// parse children blocks to md object
|
|
282
|
-
const toggle_children = await this.blocksToMarkdown(toggle_children_object);
|
|
283
|
-
// convert children md object to md string
|
|
284
|
-
const toggle_children_md_string = this.toMarkdownString(toggle_children);
|
|
285
|
-
return md.toggle(toggle_summary, toggle_children_md_string);
|
|
286
|
-
}
|
|
287
283
|
// Rest of the types
|
|
288
284
|
// "paragraph"
|
|
289
285
|
// "heading_1"
|
|
@@ -301,8 +297,6 @@ class NotionToMarkdown {
|
|
|
301
297
|
// "callout"
|
|
302
298
|
// "breadcrumb"
|
|
303
299
|
// "table_of_contents"
|
|
304
|
-
// "column_list"
|
|
305
|
-
// "column"
|
|
306
300
|
// "link_to_page"
|
|
307
301
|
// "audio"
|
|
308
302
|
// "unsupported"
|
|
@@ -311,7 +305,7 @@ class NotionToMarkdown {
|
|
|
311
305
|
// @ts-ignore
|
|
312
306
|
let blockContent = block[type].text || block[type].rich_text || [];
|
|
313
307
|
blockContent.map((content) => {
|
|
314
|
-
if (content.type ===
|
|
308
|
+
if (content.type === "equation") {
|
|
315
309
|
parsedData += md.inlineEquation(content.equation.expression);
|
|
316
310
|
return;
|
|
317
311
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notion-to-md.js","sourceRoot":"","sources":["../src/notion-to-md.ts"],"names":[],"mappings":"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","sourcesContent":["import { Client } from '@notionhq/client';\n\nimport {\n Annotations,\n CustomTransformer,\n ListBlockChildrenResponseResult,\n ListBlockChildrenResponseResults,\n MdBlock,\n NotionToMarkdownOptions,\n Equation,\n Text,\n} from './types';\nimport * as md from './utils/md';\nimport { getBlockChildren } from './utils/notion';\n\n/**\n * Converts a Notion page to Markdown.\n */\nexport class NotionToMarkdown {\n private notionClient: Client;\n private customTransformers: Record<string, CustomTransformer>;\n constructor(options: NotionToMarkdownOptions) {\n this.notionClient = options.notionClient;\n this.customTransformers = {};\n }\n setCustomTransformer(\n type: string,\n transformer: CustomTransformer\n ): NotionToMarkdown {\n this.customTransformers[type] = transformer;\n\n return this;\n }\n /**\n * Converts Markdown Blocks to string\n * @param {MdBlock[]} mdBlocks - Array of markdown blocks\n * @param {number} nestingLevel - Defines max depth of nesting\n * @returns {string} - Returns markdown string\n */\n toMarkdownString(mdBlocks: MdBlock[] = [], nestingLevel: number = 0): string {\n let mdString = \"\";\n mdBlocks.forEach((mdBlocks) => {\n // process parent blocks\n if (mdBlocks.parent) {\n if (\n mdBlocks.type !== \"to_do\" &&\n mdBlocks.type !== \"bulleted_list_item\" &&\n mdBlocks.type !== \"numbered_list_item\"\n ) {\n // add extra line breaks non list blocks\n mdString += `\\n${md.addTabSpace(mdBlocks.parent, nestingLevel)}\\n\\n`;\n } else {\n mdString += `${md.addTabSpace(mdBlocks.parent, nestingLevel)}\\n`;\n }\n }\n\n // process child blocks\n if (mdBlocks.children && mdBlocks.children.length > 0) {\n if (\n mdBlocks.type === \"synced_block\" ||\n mdBlocks.type === \"child_page\"\n ) {\n let mdstr = this.toMarkdownString(mdBlocks.children);\n // console.log(mdstr);\n mdString += mdstr;\n } else {\n let mdstr = this.toMarkdownString(\n mdBlocks.children,\n nestingLevel + 1\n );\n mdString += mdstr;\n // console.log(mdstr);\n }\n }\n });\n return mdString;\n }\n\n /**\n * Retrieves Notion Blocks based on ID and converts them to Markdown Blocks\n * @param {string} id - notion page id (not database id)\n * @param {number} totalPage - Retrieve block children request number, page_size Maximum = totalPage * 100 (Default=null)\n * @returns {Promise<MdBlock[]>} - List of markdown blocks\n */\n async pageToMarkdown(\n id: string,\n totalPage: number | null = null\n ): Promise<MdBlock[]> {\n if (!this.notionClient) {\n throw new Error(\n \"notion client is not provided, for more details check out https://github.com/souvikinator/notion-to-md\"\n );\n }\n\n const blocks = await getBlockChildren(this.notionClient, id, totalPage);\n\n const parsedData = await this.blocksToMarkdown(blocks);\n\n // console.log(JSON.stringify(parsedData, null, 4));\n\n return parsedData;\n }\n\n /**\n * Converts list of Notion Blocks to Markdown Blocks\n * @param {ListBlockChildrenResponseResults | undefined} blocks - List of notion blocks\n * @param {number} totalPage - Retrieve block children request number, page_size Maximum = totalPage * 100\n * @param {MdBlock[]} mdBlocks - Defines max depth of nesting\n * @returns {Promise<MdBlock[]>} - Array of markdown blocks with their children\n */\n async blocksToMarkdown(\n blocks?: ListBlockChildrenResponseResults,\n totalPage: number | null = null,\n mdBlocks: MdBlock[] = []\n ): Promise<MdBlock[]> {\n if (!this.notionClient) {\n throw new Error(\n \"notion client is not provided, for more details check out https://github.com/souvikinator/notion-to-md\"\n );\n }\n\n if (!blocks) return mdBlocks;\n\n for (let i = 0; i < blocks.length; i++) {\n let block = blocks[i];\n if (\n \"has_children\" in block &&\n block.has_children &&\n block.type !== \"column_list\" &&\n block.type !== \"toggle\" &&\n block.type !== \"callout\"\n ) {\n // Get children of this block.\n let child_blocks = await getBlockChildren(\n this.notionClient,\n block.id,\n totalPage\n );\n\n // Push this block to mdBlocks.\n mdBlocks.push({\n type: block.type,\n blockId: block.id,\n parent: await this.blockToMarkdown(block),\n children: [],\n });\n\n // Recursively call blocksToMarkdown to get children of this block.\n let l = mdBlocks.length;\n await this.blocksToMarkdown(\n child_blocks,\n totalPage,\n mdBlocks[l - 1].children\n );\n continue;\n }\n let tmp = await this.blockToMarkdown(block);\n // console.log(block);\n mdBlocks.push({\n // @ts-ignore\n type: block.type,\n blockId: block.id,\n parent: tmp,\n children: []\n });\n }\n return mdBlocks;\n }\n\n /**\n * Converts a Notion Block to a Markdown Block\n * @param {ListBlockChildrenResponseResult} block - single notion block\n * @returns {string} corresponding markdown string of the passed block\n */\n async blockToMarkdown(block: ListBlockChildrenResponseResult) {\n if (typeof block !== \"object\" || !(\"type\" in block)) return \"\";\n\n let parsedData = \"\";\n const { type } = block;\n if (type in this.customTransformers && !!this.customTransformers[type]) {\n const customTransformerValue = await this.customTransformers[type](block);\n if (!!customTransformerValue || customTransformerValue === \"\")\n return customTransformerValue;\n }\n\n switch (type) {\n case \"image\":\n {\n let blockContent = block.image;\n const image_caption_plain = blockContent.caption\n .map((item) => item.plain_text)\n .join(\"\");\n const image_type = blockContent.type;\n if (image_type === \"external\")\n return md.image(image_caption_plain, blockContent.external.url);\n if (image_type === \"file\")\n return md.image(image_caption_plain, blockContent.file.url);\n }\n break;\n\n case \"divider\": {\n return md.divider();\n }\n\n case 'equation': {\n return md.equation(block.equation.expression);\n }\n\n case \"video\":\n case \"file\":\n case \"pdf\":\n {\n let blockContent;\n if (type === \"video\") blockContent = block.video;\n if (type === \"file\") blockContent = block.file;\n if (type === \"pdf\") blockContent = block.pdf;\n if (blockContent) {\n const file_type = blockContent.type;\n if (file_type === \"external\")\n return md.link(\"image\", blockContent.external.url);\n if (file_type === \"file\")\n return md.link(\"image\", blockContent.file.url);\n }\n }\n break;\n\n case \"bookmark\":\n case \"embed\":\n case \"link_preview\":\n case \"link_to_page\":\n case \"child_page\":\n case \"child_database\":\n {\n let blockContent;\n let title: string = type;\n if (type === \"bookmark\") blockContent = block.bookmark;\n if (type === \"embed\") blockContent = block.embed;\n if (type === \"link_preview\") blockContent = block.link_preview;\n if (\n type === \"link_to_page\" &&\n block.link_to_page.type === \"page_id\"\n ) {\n blockContent = { url: block.link_to_page.page_id };\n }\n\n if (type === \"child_page\") {\n blockContent = { url: block.id };\n title = block.child_page.title;\n }\n\n if (type === \"child_database\") {\n blockContent = { url: block.id };\n title = block.child_database.title || \"child_database\";\n }\n\n if (blockContent) return md.link(title, blockContent.url);\n }\n break;\n\n case \"table\": {\n const { id, has_children } = block;\n let tableArr: string[][] = [];\n if (has_children) {\n const tableRows = await getBlockChildren(this.notionClient, id, 100);\n // console.log(\">>\", tableRows);\n let rowsPromise = tableRows?.map(async (row) => {\n const { type } = row as any;\n const cells = (row as any)[type][\"cells\"];\n\n /**\n * this is more like a hack since matching the type text was\n * difficult. So converting each cell to paragraph type to\n * reuse the blockToMarkdown function\n */\n let cellStringPromise = cells.map(\n async (cell: any) =>\n await this.blockToMarkdown({\n type: \"paragraph\",\n paragraph: { rich_text: cell },\n } as ListBlockChildrenResponseResult)\n );\n\n const cellStringArr = await Promise.all(cellStringPromise);\n // console.log(\"~~\", cellStringArr);\n tableArr.push(cellStringArr);\n // console.log(tableArr);\n });\n await Promise.all(rowsPromise || []);\n }\n return md.table(tableArr);\n }\n\n // NOTE: column_list is parent of columns\n case \"column_list\": {\n const { id, has_children } = block;\n\n if (!has_children) return \"\";\n\n const column_list_children = await getBlockChildren(\n this.notionClient,\n id,\n 100\n );\n\n let column_list_promise = column_list_children.map(\n async (column) => await this.blockToMarkdown(column)\n );\n\n let column_list: string[] = await Promise.all(column_list_promise);\n\n return column_list.join(\"\\n\\n\");\n }\n\n case \"column\": {\n const { id, has_children } = block;\n if (!has_children) return \"\";\n\n const column_children = await getBlockChildren(\n this.notionClient,\n id,\n 100\n );\n\n let column_children_mdBlocks = await this.blocksToMarkdown(\n column_children\n );\n\n let column_string = this.toMarkdownString(column_children_mdBlocks);\n\n return column_string;\n }\n\n case \"toggle\": {\n const { id, has_children } = block;\n\n const toggle_summary = block.toggle.rich_text[0]?.plain_text;\n\n // empty toggle\n if (!has_children) {\n return md.toggle(toggle_summary);\n }\n\n const toggle_children_object = await getBlockChildren(\n this.notionClient,\n id,\n 100\n );\n\n // parse children blocks to md object\n const toggle_children = await this.blocksToMarkdown(\n toggle_children_object\n );\n\n // convert children md object to md string\n const toggle_children_md_string =\n this.toMarkdownString(toggle_children);\n\n return md.toggle(toggle_summary, toggle_children_md_string);\n }\n // Rest of the types\n // \"paragraph\"\n // \"heading_1\"\n // \"heading_2\"\n // \"heading_3\"\n // \"bulleted_list_item\"\n // \"numbered_list_item\"\n // \"quote\"\n // \"to_do\"\n // \"template\"\n // \"synced_block\"\n // \"child_page\"\n // \"child_database\"\n // \"code\"\n // \"callout\"\n // \"breadcrumb\"\n // \"table_of_contents\"\n // \"column_list\"\n // \"column\"\n // \"link_to_page\"\n // \"audio\"\n // \"unsupported\"\n\n default: {\n // In this case typescript is not able to index the types properly, hence ignoring the error\n // @ts-ignore\n let blockContent = block[type].text || block[type].rich_text || [];\n blockContent.map((content: Text | Equation) => {\n if (content.type === 'equation') {\n parsedData += md.inlineEquation(content.equation.expression);\n return;\n }\n \n const annotations = content.annotations;\n let plain_text = content.plain_text;\n\n plain_text = this.annotatePlainText(plain_text, annotations);\n\n if (content[\"href\"])\n plain_text = md.link(plain_text, content[\"href\"]);\n\n parsedData += plain_text;\n });\n }\n }\n\n switch (type) {\n case \"code\":\n {\n parsedData = md.codeBlock(parsedData, block[type].language);\n }\n break;\n\n case \"heading_1\":\n {\n parsedData = md.heading1(parsedData);\n }\n break;\n\n case \"heading_2\":\n {\n parsedData = md.heading2(parsedData);\n }\n break;\n\n case \"heading_3\":\n {\n parsedData = md.heading3(parsedData);\n }\n break;\n\n case \"quote\":\n {\n parsedData = md.quote(parsedData);\n }\n break;\n\n case \"callout\":\n {\n const { id, has_children } = block;\n let callout_string = \"\";\n\n if (!has_children) {\n return md.callout(parsedData, block[type].icon);\n }\n\n const callout_children_object = await getBlockChildren(\n this.notionClient,\n id,\n 100\n );\n\n // // parse children blocks to md object\n const callout_children = await this.blocksToMarkdown(\n callout_children_object\n );\n\n callout_string += `${parsedData}\\n`;\n callout_children.map((child) => {\n callout_string += `${child.parent}\\n\\n`;\n });\n\n parsedData = md.callout(callout_string.trim(), block[type].icon);\n }\n break;\n\n case \"bulleted_list_item\":\n {\n parsedData = md.bullet(parsedData);\n }\n break;\n\n case \"numbered_list_item\":\n {\n parsedData = md.bullet(parsedData, block.numbered_list_item.number);\n }\n break;\n\n case \"to_do\":\n {\n parsedData = md.todo(parsedData, block.to_do.checked);\n }\n break;\n }\n\n return parsedData;\n }\n\n /**\n * Annoate text using provided annotations\n * @param {string} text - String to be annotated\n * @param {Annotations} annotations - Annotation object of a notion block\n * @returns {string} - Annotated text\n */\n annotatePlainText(text: string, annotations: Annotations): string {\n // if text is all spaces, don't annotate\n if (text.match(/^\\s*$/)) return text;\n\n const leadingSpaceMatch = text.match(/^(\\s*)/);\n const trailingSpaceMatch = text.match(/(\\s*)$/);\n\n const leading_space = leadingSpaceMatch ? leadingSpaceMatch[0] : \"\";\n const trailing_space = trailingSpaceMatch ? trailingSpaceMatch[0] : \"\";\n\n text = text.trim();\n\n if (text !== \"\") {\n if (annotations.code) text = md.inlineCode(text);\n if (annotations.bold) text = md.bold(text);\n if (annotations.italic) text = md.italic(text);\n if (annotations.strikethrough) text = md.strikethrough(text);\n if (annotations.underline) text = md.underline(text);\n }\n\n return leading_space + text + trailing_space;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"notion-to-md.js","sourceRoot":"","sources":["../src/notion-to-md.ts"],"names":[],"mappings":"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","sourcesContent":["import { Client } from \"@notionhq/client\";\nimport { ensureFile, writeFile } from \"fs-extra\";\nimport * as path from \"path\";\n\nimport {\n Annotations,\n CustomTransformer,\n ListBlockChildrenResponseResult,\n ListBlockChildrenResponseResults,\n MdBlock,\n NotionToMarkdownOptions,\n Equation,\n Text,\n ConfigurationOptions,\n} from \"./types\";\nimport * as md from \"./utils/md\";\nimport { getBlockChildren } from \"./utils/notion\";\nimport { extractTitleFromMdLink } from \"./utils/misc\";\n\n/**\n * Converts a Notion page to Markdown.\n */\nexport class NotionToMarkdown {\n private notionClient: Client;\n private config: ConfigurationOptions;\n private targetPage: string;\n private customTransformers: Record<string, CustomTransformer>;\n\n constructor(options: NotionToMarkdownOptions) {\n this.notionClient = options.notionClient;\n const defaultConfig: ConfigurationOptions = {\n saveChildPage: false,\n saveToDir: \".\",\n };\n this.targetPage = \"\";\n this.config = { ...defaultConfig, ...options.config };\n this.customTransformers = {};\n }\n\n setCustomTransformer(\n type: string,\n transformer: CustomTransformer\n ): NotionToMarkdown {\n this.customTransformers[type] = transformer;\n\n return this;\n }\n\n /**\n * Converts Markdown Blocks to string\n * @param {MdBlock[]} mdBlocks - Array of markdown blocks\n * @param {number} nestingLevel - Defines max depth of nesting\n * @returns {string} - Returns markdown string\n */\n toMarkdownString(\n mdBlocks: MdBlock[] = [],\n pageName?: string,\n nestingLevel: number = 0\n ): string {\n let mdString = \"\";\n mdBlocks.forEach((mdBlocks) => {\n // NOTE: toggle in the child blocks logic\n // adding a toggle check prevents duplicate\n // rendering of toggle title\n\n // process parent blocks\n if (mdBlocks.parent && mdBlocks.type !== \"toggle\") {\n if (\n mdBlocks.type !== \"to_do\" &&\n mdBlocks.type !== \"bulleted_list_item\" &&\n mdBlocks.type !== \"numbered_list_item\"\n ) {\n // add extra line breaks non list blocks\n mdString += `\\n${md.addTabSpace(mdBlocks.parent, nestingLevel)}\\n\\n`;\n } else {\n mdString += `${md.addTabSpace(mdBlocks.parent, nestingLevel)}\\n`;\n }\n }\n\n // process child blocks\n if (mdBlocks.children && mdBlocks.children.length > 0) {\n if (\n mdBlocks.type === \"synced_block\" ||\n mdBlocks.type === \"column_list\" ||\n mdBlocks.type === \"column\"\n ) {\n let mdstr = this.toMarkdownString(mdBlocks.children);\n mdString += mdstr;\n } else if (mdBlocks.type === \"child_page\") {\n let mdstr = this.toMarkdownString(mdBlocks.children);\n\n if (this.config.saveChildPage && this.config.saveToDir) {\n const childPageTitle = extractTitleFromMdLink(mdBlocks.parent);\n\n const fileName = childPageTitle.split(\" \").join(\"-\");\n const filePath = path.join(this.config.saveToDir, `${fileName}.md`);\n\n // save to file\n ensureFile(filePath).then(() => {\n writeFile(filePath, mdstr);\n });\n } else {\n mdString += mdstr;\n }\n } else if (mdBlocks.type === \"toggle\") {\n // convert children md object to md string\n const toggle_children_md_string = this.toMarkdownString(\n mdBlocks.children\n );\n\n mdString += md.toggle(mdBlocks.parent, toggle_children_md_string);\n } else {\n let mdstr = this.toMarkdownString(\n mdBlocks.children,\n pageName,\n nestingLevel + 1\n );\n mdString += mdstr;\n }\n }\n });\n\n return mdString;\n }\n\n /**\n * Retrieves Notion Blocks based on ID and converts them to Markdown Blocks\n * @param {string} id - notion page id (not database id)\n * @param {number} totalPage - Retrieve block children request number, page_size Maximum = totalPage * 100 (Default=null)\n * @returns {Promise<MdBlock[]>} - List of markdown blocks\n */\n async pageToMarkdown(\n id: string,\n totalPage: number | null = null\n ): Promise<MdBlock[]> {\n if (!this.notionClient) {\n throw new Error(\n \"notion client is not provided, for more details check out https://github.com/souvikinator/notion-to-md\"\n );\n }\n this.targetPage = id;\n const blocks = await getBlockChildren(this.notionClient, id, totalPage);\n\n const parsedData = await this.blocksToMarkdown(blocks);\n\n return parsedData;\n }\n\n /**\n * Converts list of Notion Blocks to Markdown Blocks\n * @param {ListBlockChildrenResponseResults | undefined} blocks - List of notion blocks\n * @param {number} totalPage - Retrieve block children request number, page_size Maximum = totalPage * 100\n * @param {MdBlock[]} mdBlocks - Defines max depth of nesting\n * @returns {Promise<MdBlock[]>} - Array of markdown blocks with their children\n */\n async blocksToMarkdown(\n blocks?: ListBlockChildrenResponseResults,\n totalPage: number | null = null,\n mdBlocks: MdBlock[] = []\n ): Promise<MdBlock[]> {\n if (!this.notionClient) {\n throw new Error(\n \"notion client is not provided, for more details check out https://github.com/souvikinator/notion-to-md\"\n );\n }\n\n if (!blocks) return mdBlocks;\n\n for (let i = 0; i < blocks.length; i++) {\n let block = blocks[i];\n\n if (\"has_children\" in block && block.has_children) {\n // Get children of this block.\n let child_blocks = await getBlockChildren(\n this.notionClient,\n block.id,\n totalPage\n );\n\n // Push this block to mdBlocks.\n mdBlocks.push({\n type: block.type,\n blockId: block.id,\n parent: await this.blockToMarkdown(block),\n children: [],\n });\n\n // Recursively call blocksToMarkdown to get children of this block.\n let l = mdBlocks.length;\n await this.blocksToMarkdown(\n child_blocks,\n totalPage,\n mdBlocks[l - 1].children\n );\n continue;\n }\n\n let tmp = await this.blockToMarkdown(block);\n mdBlocks.push({\n // @ts-ignore\n type: block.type,\n blockId: block.id,\n parent: tmp,\n children: [],\n });\n }\n return mdBlocks;\n }\n\n /**\n * Converts a Notion Block to a Markdown Block\n * @param {ListBlockChildrenResponseResult} block - single notion block\n * @returns {string} corresponding markdown string of the passed block\n */\n async blockToMarkdown(block: ListBlockChildrenResponseResult) {\n if (typeof block !== \"object\" || !(\"type\" in block)) return \"\";\n\n let parsedData = \"\";\n const { type } = block;\n if (type in this.customTransformers && !!this.customTransformers[type]) {\n const customTransformerValue = await this.customTransformers[type](block);\n if (!!customTransformerValue || customTransformerValue === \"\")\n return customTransformerValue;\n }\n\n switch (type) {\n case \"image\":\n {\n let blockContent = block.image;\n\n const image_caption_plain = blockContent.caption\n .map((item: any) => item.plain_text)\n .join(\"\");\n\n const image_type = blockContent.type;\n\n if (image_type === \"external\")\n return md.image(image_caption_plain, blockContent.external.url);\n\n if (image_type === \"file\")\n return md.image(image_caption_plain, blockContent.file.url);\n }\n break;\n\n case \"divider\": {\n return md.divider();\n }\n\n case \"equation\": {\n return md.equation(block.equation.expression);\n }\n\n case \"video\":\n case \"file\":\n case \"pdf\":\n {\n let blockContent;\n if (type === \"video\") blockContent = block.video;\n if (type === \"file\") blockContent = block.file;\n if (type === \"pdf\") blockContent = block.pdf;\n if (blockContent) {\n const file_type = blockContent.type;\n if (file_type === \"external\")\n return md.link(\"image\", blockContent.external.url);\n if (file_type === \"file\")\n return md.link(\"image\", blockContent.file.url);\n }\n }\n break;\n\n case \"bookmark\":\n case \"embed\":\n case \"link_preview\":\n case \"link_to_page\":\n {\n let blockContent;\n let title: string = type;\n if (type === \"bookmark\") blockContent = block.bookmark;\n if (type === \"embed\") blockContent = block.embed;\n if (type === \"link_preview\") blockContent = block.link_preview;\n if (\n type === \"link_to_page\" &&\n block.link_to_page.type === \"page_id\"\n ) {\n blockContent = { url: block.link_to_page.page_id };\n }\n\n if (blockContent) return md.link(title, blockContent.url);\n }\n break;\n\n case \"child_page\":\n {\n let pageTitle: string = block.child_page.title;\n\n if (this.config.saveChildPage) {\n const fileName = pageTitle.split(\" \").join(\"-\");\n const filePath = `${fileName}.md`;\n return md.link(pageTitle, filePath);\n }\n\n return md.heading2(pageTitle);\n }\n break;\n case \"child_database\":\n {\n let pageTitle = block.child_database.title || `child_database`;\n return pageTitle;\n }\n break;\n\n case \"table\": {\n const { id, has_children } = block;\n let tableArr: string[][] = [];\n if (has_children) {\n const tableRows = await getBlockChildren(this.notionClient, id, 100);\n let rowsPromise = tableRows?.map(async (row) => {\n const { type } = row as any;\n const cells = (row as any)[type][\"cells\"];\n\n /**\n * this is more like a hack since matching the type text was\n * difficult. So converting each cell to paragraph type to\n * reuse the blockToMarkdown function\n */\n let cellStringPromise = cells.map(\n async (cell: any) =>\n await this.blockToMarkdown({\n type: \"paragraph\",\n paragraph: { rich_text: cell },\n } as ListBlockChildrenResponseResult)\n );\n\n const cellStringArr = await Promise.all(cellStringPromise);\n tableArr.push(cellStringArr);\n });\n await Promise.all(rowsPromise || []);\n }\n return md.table(tableArr);\n }\n // Rest of the types\n // \"paragraph\"\n // \"heading_1\"\n // \"heading_2\"\n // \"heading_3\"\n // \"bulleted_list_item\"\n // \"numbered_list_item\"\n // \"quote\"\n // \"to_do\"\n // \"template\"\n // \"synced_block\"\n // \"child_page\"\n // \"child_database\"\n // \"code\"\n // \"callout\"\n // \"breadcrumb\"\n // \"table_of_contents\"\n // \"link_to_page\"\n // \"audio\"\n // \"unsupported\"\n\n default: {\n // In this case typescript is not able to index the types properly, hence ignoring the error\n // @ts-ignore\n let blockContent = block[type].text || block[type].rich_text || [];\n blockContent.map((content: Text | Equation) => {\n if (content.type === \"equation\") {\n parsedData += md.inlineEquation(content.equation.expression);\n return;\n }\n\n const annotations = content.annotations;\n let plain_text = content.plain_text;\n\n plain_text = this.annotatePlainText(plain_text, annotations);\n\n if (content[\"href\"])\n plain_text = md.link(plain_text, content[\"href\"]);\n\n parsedData += plain_text;\n });\n }\n }\n\n switch (type) {\n case \"code\":\n {\n parsedData = md.codeBlock(parsedData, block[type].language);\n }\n break;\n\n case \"heading_1\":\n {\n parsedData = md.heading1(parsedData);\n }\n break;\n\n case \"heading_2\":\n {\n parsedData = md.heading2(parsedData);\n }\n break;\n\n case \"heading_3\":\n {\n parsedData = md.heading3(parsedData);\n }\n break;\n\n case \"quote\":\n {\n parsedData = md.quote(parsedData);\n }\n break;\n\n case \"callout\":\n {\n const { id, has_children } = block;\n let callout_string = \"\";\n\n if (!has_children) {\n return md.callout(parsedData, block[type].icon);\n }\n\n const callout_children_object = await getBlockChildren(\n this.notionClient,\n id,\n 100\n );\n\n // // parse children blocks to md object\n const callout_children = await this.blocksToMarkdown(\n callout_children_object\n );\n\n callout_string += `${parsedData}\\n`;\n callout_children.map((child) => {\n callout_string += `${child.parent}\\n\\n`;\n });\n\n parsedData = md.callout(callout_string.trim(), block[type].icon);\n }\n break;\n\n case \"bulleted_list_item\":\n {\n parsedData = md.bullet(parsedData);\n }\n break;\n\n case \"numbered_list_item\":\n {\n parsedData = md.bullet(parsedData, block.numbered_list_item.number);\n }\n break;\n\n case \"to_do\":\n {\n parsedData = md.todo(parsedData, block.to_do.checked);\n }\n break;\n }\n\n return parsedData;\n }\n\n /**\n * Annoate text using provided annotations\n * @param {string} text - String to be annotated\n * @param {Annotations} annotations - Annotation object of a notion block\n * @returns {string} - Annotated text\n */\n annotatePlainText(text: string, annotations: Annotations): string {\n // if text is all spaces, don't annotate\n if (text.match(/^\\s*$/)) return text;\n\n const leadingSpaceMatch = text.match(/^(\\s*)/);\n const trailingSpaceMatch = text.match(/(\\s*)$/);\n\n const leading_space = leadingSpaceMatch ? leadingSpaceMatch[0] : \"\";\n const trailing_space = trailingSpaceMatch ? trailingSpaceMatch[0] : \"\";\n\n text = text.trim();\n\n if (text !== \"\") {\n if (annotations.code) text = md.inlineCode(text);\n if (annotations.bold) text = md.bold(text);\n if (annotations.italic) text = md.italic(text);\n if (annotations.strikethrough) text = md.strikethrough(text);\n if (annotations.underline) text = md.underline(text);\n }\n\n return leading_space + text + trailing_space;\n }\n}\n"]}
|
package/build/types/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Client } from
|
|
2
|
-
import { ListBlockChildrenResponse } from
|
|
1
|
+
import { Client } from "@notionhq/client";
|
|
2
|
+
import { ListBlockChildrenResponse } from "@notionhq/client/build/src/api-endpoints";
|
|
3
3
|
export type BlockAttributes = {
|
|
4
4
|
numbered_list_item?: {
|
|
5
5
|
number?: number;
|
|
@@ -8,8 +8,13 @@ export type BlockAttributes = {
|
|
|
8
8
|
export type ListBlockChildrenResponseResults = ListBlockChildrenResponse["results"] & BlockAttributes;
|
|
9
9
|
export type ListBlockChildrenResponseResult = ListBlockChildrenResponseResults[0] & BlockAttributes;
|
|
10
10
|
export type TextRequest = string;
|
|
11
|
+
export type ConfigurationOptions = {
|
|
12
|
+
saveToDir?: string;
|
|
13
|
+
saveChildPage?: boolean;
|
|
14
|
+
};
|
|
11
15
|
export interface NotionToMarkdownOptions {
|
|
12
16
|
notionClient: Client;
|
|
17
|
+
config?: ConfigurationOptions;
|
|
13
18
|
}
|
|
14
19
|
export type MdBlock = {
|
|
15
20
|
type?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/build/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"","sourcesContent":["import { Client } from
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"","sourcesContent":["import { Client } from \"@notionhq/client\";\nimport { ListBlockChildrenResponse } from \"@notionhq/client/build/src/api-endpoints\";\n\nexport type BlockAttributes = {\n numbered_list_item?: {\n number?: number;\n };\n};\nexport type ListBlockChildrenResponseResults =\n ListBlockChildrenResponse[\"results\"] & BlockAttributes;\n\nexport type ListBlockChildrenResponseResult =\n ListBlockChildrenResponseResults[0] & BlockAttributes;\n\nexport type TextRequest = string;\n\nexport type ConfigurationOptions = {\n saveToDir?: string;\n saveChildPage?: boolean;\n};\nexport interface NotionToMarkdownOptions {\n notionClient: Client;\n config?: ConfigurationOptions;\n}\n\nexport type MdBlock = {\n type?: string;\n blockId: string;\n parent: string;\n children: MdBlock[];\n};\n\nexport type Annotations = {\n bold: boolean;\n italic: boolean;\n strikethrough: boolean;\n underline: boolean;\n code: boolean;\n color:\n | \"default\"\n | \"gray\"\n | \"brown\"\n | \"orange\"\n | \"yellow\"\n | \"green\"\n | \"blue\"\n | \"purple\"\n | \"pink\"\n | \"red\"\n | \"gray_background\"\n | \"brown_background\"\n | \"orange_background\"\n | \"yellow_background\"\n | \"green_background\"\n | \"blue_background\"\n | \"purple_background\"\n | \"pink_background\"\n | \"red_background\";\n};\n\nexport type Text = {\n type: \"text\";\n text: {\n content: string;\n link: {\n url: TextRequest;\n } | null;\n };\n annotations: Annotations;\n plain_text: string;\n href: string | null;\n};\n\nexport type Equation = {\n type: \"equation\";\n equation: {\n expression: string;\n };\n annotations: {\n bold: false;\n italic: false;\n strikethrough: false;\n underline: false;\n code: false;\n color: \"default\";\n };\n plain_text: string;\n href: null;\n};\n\nexport type CalloutIcon =\n | { type: \"emoji\"; emoji?: string }\n | { type: \"external\"; external?: { url: string } }\n | { type: \"file\"; file: { url: string; expiry_time: string } }\n | null;\n\nexport type CustomTransformer = (\n block: ListBlockChildrenResponseResult\n) => string | Promise<string>;\n"]}
|
package/build/utils/md.js
CHANGED
|
@@ -90,7 +90,7 @@ const addTabSpace = (text, n = 0) => {
|
|
|
90
90
|
const tab = " ";
|
|
91
91
|
for (let i = 0; i < n; i++) {
|
|
92
92
|
if (text.includes("\n")) {
|
|
93
|
-
const multiLineText = text.split(/(
|
|
93
|
+
const multiLineText = text.split(/(?:^|\n)/).join(`\n${tab}`);
|
|
94
94
|
text = tab + multiLineText;
|
|
95
95
|
}
|
|
96
96
|
else
|
package/build/utils/md.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"md.js","sourceRoot":"","sources":["../../src/utils/md.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"md.js","sourceRoot":"","sources":["../../src/utils/md.ts"],"names":[],"mappings":"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","sourcesContent":["import { CalloutIcon } from \"../types\";\nimport markdownTable from \"markdown-table\";\n\nexport const inlineCode = (text: string) => {\n return `\\`${text}\\``;\n};\n\nexport const inlineEquation = (text: string) => {\n return `$${text}$`;\n};\n\nexport const bold = (text: string) => {\n return `**${text}**`;\n};\n\nexport const italic = (text: string) => {\n return `_${text}_`;\n};\n\nexport const strikethrough = (text: string) => {\n return `~~${text}~~`;\n};\n\nexport const underline = (text: string) => {\n return `<u>${text}</u>`;\n};\n\nexport const link = (text: string, href: string) => {\n return `[${text}](${href})`;\n};\n\nexport const codeBlock = (text: string, language?: string) => {\n if (language === \"plain text\") language = \"text\";\n\n return `\\`\\`\\`${language}\n${text}\n\\`\\`\\``;\n};\n\nexport const equation = (text: string) => {\n return `$$\n${text}\n$$`;\n};\n\nexport const heading1 = (text: string) => {\n return `# ${text}`;\n};\n\nexport const heading2 = (text: string) => {\n return `## ${text}`;\n};\n\nexport const heading3 = (text: string) => {\n return `### ${text}`;\n};\n\nexport const quote = (text: string) => {\n // the replace is done to handle multiple lines\n return `> ${text.replace(/\\n/g, \" \\n> \")}`;\n};\n\nexport const callout = (text: string, icon?: CalloutIcon) => {\n let emoji: string | undefined;\n if (icon?.type === \"emoji\") {\n emoji = icon.emoji;\n }\n\n // the replace is done to handle multiple lines\n return `> ${emoji ? emoji + \" \" : \"\"}${text.replace(/\\n/g, \" \\n> \")}`;\n};\n\nexport const bullet = (text: string, count?: number) => {\n let renderText = text.trim();\n return count ? `${count}. ${renderText}` : `- ${renderText}`;\n};\n\nexport const todo = (text: string, checked: boolean) => {\n return checked ? `- [x] ${text}` : `- [ ] ${text}`;\n};\n\nexport const image = (alt: string, href: string) => {\n return ``;\n};\n\nexport const addTabSpace = (text: string, n = 0) => {\n const tab = \"\t\";\n for (let i = 0; i < n; i++) {\n if (text.includes(\"\\n\")) {\n const multiLineText = text.split(/(?:^|\\n)/).join(`\\n${tab}`);\n text = tab + multiLineText;\n } else text = tab + text;\n }\n return text;\n};\n\nexport const divider = () => {\n return \"---\";\n};\n\nexport const toggle = (summary?: string, children?: string) => {\n if (!summary) return children || \"\";\n return `<details>\n <summary>${summary}</summary>\n\n${children || \"\"}\n\n </details>`;\n};\n\nexport const table = (cells: string[][]) => {\n return markdownTable(cells);\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../src/utils/misc.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,WAAY,MAAM,WAIpD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractTitleFromMdLink = void 0;
|
|
4
|
+
const extractTitleFromMdLink = (mdLink) => {
|
|
5
|
+
const regex = /\[(.*?)\]/;
|
|
6
|
+
const match = regex.exec(mdLink);
|
|
7
|
+
return match ? match[1] : "";
|
|
8
|
+
};
|
|
9
|
+
exports.extractTitleFromMdLink = extractTitleFromMdLink;
|
|
10
|
+
//# sourceMappingURL=misc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/utils/misc.ts"],"names":[],"mappings":";;;AAAO,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAAE,EAAE;IACvD,MAAM,KAAK,GAAG,WAAW,CAAC;IAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/B,CAAC,CAAC;AAJW,QAAA,sBAAsB,0BAIjC","sourcesContent":["export const extractTitleFromMdLink = (mdLink: string) => {\n const regex = /\\[(.*?)\\]/;\n const match = regex.exec(mdLink);\n return match ? match[1] : \"\";\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notion.d.ts","sourceRoot":"","sources":["../../src/utils/notion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,gCAAgC,EAAE,MAAM,UAAU,CAAC;AAE5D,eAAO,MAAM,gBAAgB,iBACb,MAAM,YACV,MAAM,aACL,MAAM,GAAG,IAAI,8CA2BzB,CAAC;AAEF,eAAO,MAAM,wBAAwB,WAC3B,gCAAgC,
|
|
1
|
+
{"version":3,"file":"notion.d.ts","sourceRoot":"","sources":["../../src/utils/notion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,gCAAgC,EAAE,MAAM,UAAU,CAAC;AAE5D,eAAO,MAAM,gBAAgB,iBACb,MAAM,YACV,MAAM,aACL,MAAM,GAAG,IAAI,8CA2BzB,CAAC;AAEF,eAAO,MAAM,wBAAwB,WAC3B,gCAAgC,SAazC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notion.js","sourceRoot":"","sources":["../../src/utils/notion.ts"],"names":[],"mappings":";;;AAIO,MAAM,gBAAgB,GAAG,KAAK,EACnC,YAAoB,EACpB,QAAgB,EAChB,SAAwB,EACxB,EAAE;IACF,IAAI;QACF,IAAI,MAAM,GAAqC,EAAE,CAAC;QAClD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,YAAY,GAAG,SAAS,CAAC;QAE7B,GAAG;YACD,MAAM,QAAQ,GAAG,CAAC,MAAM,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACxD,YAAY,EAAE,YAAY;gBAC1B,QAAQ,EAAE,QAAQ;aACnB,CAAC,CAA8B,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEjC,YAAY,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,WAAW,CAAC;YACrC,SAAS,IAAI,CAAC,CAAC;SAChB,QACC,YAAY,IAAI,IAAI;YACpB,CAAC,SAAS,IAAI,IAAI,IAAI,SAAS,GAAG,SAAS,CAAC,EAC5C;QAEF,IAAA,gCAAwB,EAAC,MAAM,CAAC,CAAC;QACjC,OAAO,MAAM,CAAC;KACf;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACf,OAAO,EAAE,CAAC;KACX;AACH,CAAC,CAAC;AA9BW,QAAA,gBAAgB,oBA8B3B;AAEK,MAAM,wBAAwB,GAAG,CACtC,MAAwC,EACxC,EAAE;IACF,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE;YAC1D,cAAc;YACd,aAAa;YACb,KAAK,CAAC,kBAAkB,CAAC,MAAM,GAAG,EAAE,iBAAiB,CAAC;SACvD;
|
|
1
|
+
{"version":3,"file":"notion.js","sourceRoot":"","sources":["../../src/utils/notion.ts"],"names":[],"mappings":";;;AAIO,MAAM,gBAAgB,GAAG,KAAK,EACnC,YAAoB,EACpB,QAAgB,EAChB,SAAwB,EACxB,EAAE;IACF,IAAI;QACF,IAAI,MAAM,GAAqC,EAAE,CAAC;QAClD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,YAAY,GAAG,SAAS,CAAC;QAE7B,GAAG;YACD,MAAM,QAAQ,GAAG,CAAC,MAAM,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACxD,YAAY,EAAE,YAAY;gBAC1B,QAAQ,EAAE,QAAQ;aACnB,CAAC,CAA8B,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEjC,YAAY,GAAG,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,WAAW,CAAC;YACrC,SAAS,IAAI,CAAC,CAAC;SAChB,QACC,YAAY,IAAI,IAAI;YACpB,CAAC,SAAS,IAAI,IAAI,IAAI,SAAS,GAAG,SAAS,CAAC,EAC5C;QAEF,IAAA,gCAAwB,EAAC,MAAM,CAAC,CAAC;QACjC,OAAO,MAAM,CAAC;KACf;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACf,OAAO,EAAE,CAAC;KACX;AACH,CAAC,CAAC;AA9BW,QAAA,gBAAgB,oBA8B3B;AAEK,MAAM,wBAAwB,GAAG,CACtC,MAAwC,EACxC,EAAE;IACF,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE;YAC1D,cAAc;YACd,aAAa;YACb,KAAK,CAAC,kBAAkB,CAAC,MAAM,GAAG,EAAE,iBAAiB,CAAC;SACvD;aAAM;YACL,iBAAiB,GAAG,CAAC,CAAC;SACvB;KACF;AACH,CAAC,CAAC;AAdW,QAAA,wBAAwB,4BAcnC","sourcesContent":["import { Client } from \"@notionhq/client\";\nimport { ListBlockChildrenResponse } from \"@notionhq/client/build/src/api-endpoints\";\nimport { ListBlockChildrenResponseResults } from \"../types\";\n\nexport const getBlockChildren = async (\n notionClient: Client,\n block_id: string,\n totalPage: number | null\n) => {\n try {\n let result: ListBlockChildrenResponseResults = [];\n let pageCount = 0;\n let start_cursor = undefined;\n\n do {\n const response = (await notionClient.blocks.children.list({\n start_cursor: start_cursor,\n block_id: block_id,\n })) as ListBlockChildrenResponse;\n result.push(...response.results);\n\n start_cursor = response?.next_cursor;\n pageCount += 1;\n } while (\n start_cursor != null &&\n (totalPage == null || pageCount < totalPage)\n );\n\n modifyNumberedListObject(result);\n return result;\n } catch (e) {\n console.log(e);\n return [];\n }\n};\n\nexport const modifyNumberedListObject = (\n blocks: ListBlockChildrenResponseResults\n) => {\n let numberedListIndex = 0;\n\n for (const block of blocks) {\n if (\"type\" in block && block.type === \"numbered_list_item\") {\n // add numbers\n // @ts-ignore\n block.numbered_list_item.number = ++numberedListIndex;\n } else {\n numberedListIndex = 0;\n }\n }\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "notion-to-md",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.6.0",
|
|
4
4
|
"engines": {
|
|
5
5
|
"node": ">=12"
|
|
6
6
|
},
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
"description": "convert notion pages, block and list of blocks to markdown (supports nesting)",
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@notionhq/client": "^1.0.1",
|
|
42
|
+
"@types/fs-extra": "^11.0.1",
|
|
42
43
|
"@types/jest": "^27.4.1",
|
|
43
44
|
"@types/markdown-table": "^2.0.0",
|
|
44
45
|
"jest": "^27.4.7",
|
|
@@ -46,6 +47,7 @@
|
|
|
46
47
|
"typescript": "^4.5.4"
|
|
47
48
|
},
|
|
48
49
|
"dependencies": {
|
|
50
|
+
"fs-extra": "^11.1.1",
|
|
49
51
|
"markdown-table": "^2.0.0"
|
|
50
52
|
}
|
|
51
53
|
}
|