1
1
import {
2
- Block as PublicBlock ,
3
- BlockBase ,
4
- Emoji ,
5
- ExternalFile ,
6
- ExternalFileWithCaption ,
7
- File ,
8
- FileWithCaption ,
9
- ImageBlock ,
10
- RichText ,
11
- } from "@notionhq/client/build/src/api-types" ;
12
-
13
- import { AssetWriter } from "./AssetWriter" ;
14
- import { DeferredRenderer } from "./DeferredRenderer" ;
15
- import { logger } from "./logger" ;
16
- import { RichTextRenderer } from "./RichTextRenderer" ;
2
+ Block as PublicBlock , BlockBase , Emoji , ExternalFile , ExternalFileWithCaption , File ,
3
+ FileWithCaption , ImageBlock , RichText
4
+ } from '@notionhq/client/build/src/api-types' ;
5
+
6
+ import { AssetWriter } from './AssetWriter' ;
7
+ import { DeferredRenderer } from './DeferredRenderer' ;
8
+ import { logger } from './logger' ;
9
+ import { RichTextRenderer } from './RichTextRenderer' ;
17
10
18
11
const debug = require ( "debug" ) ( "blocks" ) ;
19
12
@@ -60,69 +53,82 @@ export type Block =
60
53
| DividerBlock
61
54
| ChildDatabaseBlock ;
62
55
56
+
57
+ export interface BlockRenderResult {
58
+ lines : string ;
59
+ childIndent ?: number ;
60
+ }
63
61
export class BlockRenderer {
64
62
constructor (
65
63
private readonly richText : RichTextRenderer ,
66
64
private readonly deferredRenderer : DeferredRenderer
67
- ) { }
65
+ ) { }
68
66
69
- async renderBlock ( block : Block , assets : AssetWriter ) : Promise < string > {
67
+ async renderBlock ( block : Block , assets : AssetWriter ) : Promise < BlockRenderResult > {
70
68
switch ( block . type ) {
71
69
case "paragraph" :
72
- return await this . richText . renderMarkdown ( block . paragraph . text ) ;
70
+ return {
71
+ lines : await this . richText . renderMarkdown ( block . paragraph . text )
72
+ }
73
73
// note: render headings +1 level, because h1 is reserved for page titles
74
74
case "heading_1" :
75
- return (
76
- "## " + ( await this . richText . renderMarkdown ( block . heading_1 . text ) )
77
- ) ;
75
+ return {
76
+ lines : "## " + ( await this . richText . renderMarkdown ( block . heading_1 . text ) )
77
+ } ;
78
78
case "heading_2" :
79
- return (
80
- "### " + ( await this . richText . renderMarkdown ( block . heading_2 . text ) )
81
- ) ;
79
+ return {
80
+ lines : "### " + ( await this . richText . renderMarkdown ( block . heading_2 . text ) )
81
+ } ;
82
82
case "heading_3" :
83
- return (
84
- "#### " + ( await this . richText . renderMarkdown ( block . heading_3 . text ) )
85
- ) ;
83
+ return {
84
+ lines : "#### " + ( await this . richText . renderMarkdown ( block . heading_3 . text ) )
85
+ } ;
86
86
case "bulleted_list_item" :
87
- return (
88
- "- " +
89
- ( await this . richText . renderMarkdown ( block . bulleted_list_item . text ) )
90
- ) ;
87
+ return {
88
+ lines : "- " + await this . richText . renderMarkdown ( block . bulleted_list_item . text ) ,
89
+ childIndent : 4
90
+ } ;
91
91
case "numbered_list_item" :
92
- return (
93
- "1. " +
94
- ( await this . richText . renderMarkdown ( block . numbered_list_item . text ) )
95
- ) ;
92
+ return {
93
+ lines : "1. " + await this . richText . renderMarkdown ( block . numbered_list_item . text ) ,
94
+ childIndent : 4
95
+ } ;
96
96
case "to_do" :
97
- return "[ ] " + ( await this . richText . renderMarkdown ( block . to_do . text ) ) ;
97
+ return {
98
+ lines : "[ ] " + ( await this . richText . renderMarkdown ( block . to_do . text ) )
99
+ } ;
98
100
case "image" :
99
- return await this . renderImage ( block , assets ) ;
101
+ return {
102
+ lines : await this . renderImage ( block , assets )
103
+ }
100
104
case "quote" :
101
105
block as any ;
102
- return (
103
- "> " + ( await this . richText . renderMarkdown ( ( block as any ) . quote . text ) )
104
- ) ;
106
+ return {
107
+ lines : "> " + ( await this . richText . renderMarkdown ( ( block as any ) . quote . text ) )
108
+ } ;
105
109
case "code" :
106
- return (
107
- "```" +
108
- block . code . language +
109
- "\n" +
110
- ( await this . richText . renderMarkdown ( block . code . text ) ) +
111
- "\n```"
112
- ) ;
110
+ return {
111
+ lines :
112
+ "```" +
113
+ block . code . language +
114
+ "\n" +
115
+ ( await this . richText . renderMarkdown ( block . code . text ) ) +
116
+ "\n```"
117
+ } ;
113
118
case "callout" :
114
- return (
115
- "> " +
116
- this . renderIcon ( block . callout . icon ) +
117
- " " +
118
- ( await this . richText . renderMarkdown ( block . callout . text ) )
119
- ) ;
119
+ return {
120
+ lines :
121
+ "> " +
122
+ this . renderIcon ( block . callout . icon ) +
123
+ " " +
124
+ ( await this . richText . renderMarkdown ( block . callout . text ) )
125
+ } ;
120
126
case "divider" :
121
- return "---" ;
127
+ return { lines : "---" } ;
122
128
case "child_database" :
123
129
const msg = `<!-- included database ${ block . id } -->\n` ;
124
130
const db = await this . deferredRenderer . renderChildDatabase ( block . id ) ;
125
- return msg + db . markdown ;
131
+ return { lines : msg + db . markdown } ;
126
132
case "toggle" :
127
133
case "child_page" :
128
134
case "embed" :
@@ -133,10 +139,9 @@ export class BlockRenderer {
133
139
case "audio" :
134
140
case "unsupported" :
135
141
default :
136
- return this . renderUnsupported (
137
- `unsupported block type: ${ block . type } ` ,
138
- block
139
- ) ;
142
+ return {
143
+ lines : this . renderUnsupported ( `unsupported block type: ${ block . type } ` , block )
144
+ }
140
145
}
141
146
}
142
147
0 commit comments