Skip to content

Commit 3513b3d

Browse files
Merge pull request #6 from dewkul/feat/bookmark
feat: support bookmark block
2 parents c4e004b + 2c11274 commit 3513b3d

File tree

3 files changed

+42
-25
lines changed

3 files changed

+42
-25
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ The following [Notion API block object types](https://developers.notion.com/refe
4141
| Video | ❌ Missing | |
4242
| File | ❌ Missing | |
4343
| PDF | ❌ Missing | |
44-
| Bookmark | ❌ Missing | |
44+
| Bookmark | ✅ Yes | use a caption as a link name | |
4545
| Equation | ❌ Missing | |
4646
| Divider | ✅ Yes | |
4747
| Table Of Contents | ❌ not planned | static site generators have their own ToC implementations |

src/BlockRenderer.ts

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { DeferredRenderer } from "./DeferredRenderer";
1414
import { RenderingContextLogger } from "./RenderingContextLogger";
1515
import { RichTextRenderer } from "./RichTextRenderer";
1616
import { RenderingContext } from "./RenderingContext";
17+
import { LinkRenderer } from "./LinkRenderer";
1718

1819
const debug = require("debug")("blocks");
1920

@@ -24,7 +25,8 @@ export interface BlockRenderResult {
2425
export class BlockRenderer {
2526
constructor(
2627
private readonly richText: RichTextRenderer,
27-
private readonly deferredRenderer: DeferredRenderer
28+
private readonly deferredRenderer: DeferredRenderer,
29+
private readonly link: LinkRenderer
2830
) {}
2931

3032
async renderBlock(
@@ -102,16 +104,27 @@ export class BlockRenderer {
102104
return { lines: "---" };
103105
case "child_database":
104106
const msg = `<!-- included database ${block.id} -->\n`;
105-
const db = await this.deferredRenderer.renderChildDatabase(block.id, context.linkResolver);
107+
const db = await this.deferredRenderer.renderChildDatabase(
108+
block.id,
109+
context.linkResolver
110+
);
106111
return { lines: msg + db.markdown };
107112
case "synced_block":
108113
// nothing to render, only the contents of the synced block are relevant
109114
// however, these are children nöpcl, and thus retrieved by recursion in RecusivveBodyRenderer
110115
return null;
116+
case "bookmark":
117+
// render caption (if provided) as a link name
118+
const caption = block.bookmark.caption || [];
119+
let title = block.bookmark.url;
120+
if (caption.length > 0)
121+
title = await this.richText.renderPlainText(caption);
122+
return {
123+
lines: this.link.renderUrlLink(title, block.bookmark.url),
124+
};
111125
case "toggle":
112126
case "child_page":
113127
case "embed":
114-
case "bookmark":
115128
case "video":
116129
case "file":
117130
case "pdf":
@@ -145,10 +158,7 @@ export class BlockRenderer {
145158
}
146159
}
147160

148-
async renderImage(
149-
block: ImageBlock,
150-
assets: AssetWriter
151-
): Promise<string> {
161+
async renderImage(block: ImageBlock, assets: AssetWriter): Promise<string> {
152162
const url = this.parseUrl(block.image);
153163

154164
const imageFile = await assets.download(url, block.id);

src/sync.ts

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
import { BlockRenderer } from './BlockRenderer';
2-
import { ChildDatabaseRenderer } from './ChildDatabaseRenderer';
3-
import { DatabaseEntryRenderer } from './DatabaseEntryRenderer';
4-
import { DatabasePageRenderer } from './DatabasePageRenderer';
5-
import { DatabaseViewRenderer } from './DatabaseViewRenderer';
6-
import { DeferredRenderer } from './DeferredRenderer';
7-
import { FrontmatterRenderer } from './FrontmatterRenderer';
8-
import { LinkRenderer } from './LinkRenderer';
9-
import { MentionedPageRenderer } from './MentionedPageRenderer';
10-
import { NotionApiFacade } from './NotionApiFacade';
11-
import { PageLinkResolver } from './PageLinkResolver';
12-
import { PropertiesParser } from './PropertiesParser';
13-
import { RecursiveBodyRenderer } from './RecursiveBodyRenderer';
14-
import { RichTextRenderer } from './RichTextRenderer';
15-
import { SyncConfig } from './SyncConfig';
1+
import { BlockRenderer } from "./BlockRenderer";
2+
import { ChildDatabaseRenderer } from "./ChildDatabaseRenderer";
3+
import { DatabaseEntryRenderer } from "./DatabaseEntryRenderer";
4+
import { DatabasePageRenderer } from "./DatabasePageRenderer";
5+
import { DatabaseViewRenderer } from "./DatabaseViewRenderer";
6+
import { DeferredRenderer } from "./DeferredRenderer";
7+
import { FrontmatterRenderer } from "./FrontmatterRenderer";
8+
import { LinkRenderer } from "./LinkRenderer";
9+
import { MentionedPageRenderer } from "./MentionedPageRenderer";
10+
import { NotionApiFacade } from "./NotionApiFacade";
11+
import { PageLinkResolver } from "./PageLinkResolver";
12+
import { PropertiesParser } from "./PropertiesParser";
13+
import { RecursiveBodyRenderer } from "./RecursiveBodyRenderer";
14+
import { RichTextRenderer } from "./RichTextRenderer";
15+
import { SyncConfig } from "./SyncConfig";
1616

1717
export async function sync(notionApiToken: string, config: SyncConfig) {
1818
const publicApi = new NotionApiFacade(notionApiToken);
@@ -32,7 +32,11 @@ export async function sync(notionApiToken: string, config: SyncConfig) {
3232
linkRenderer
3333
);
3434
const propertiesParser = new PropertiesParser(richTextRenderer);
35-
const blockRenderer = new BlockRenderer(richTextRenderer, deferredRenderer);
35+
const blockRenderer = new BlockRenderer(
36+
richTextRenderer,
37+
deferredRenderer,
38+
linkRenderer
39+
);
3640
const bodyRenderer = new RecursiveBodyRenderer(publicApi, blockRenderer);
3741
const entryRenderer = new DatabaseEntryRenderer(propertiesParser);
3842
const pageRenderer = new DatabasePageRenderer(
@@ -52,7 +56,10 @@ export async function sync(notionApiToken: string, config: SyncConfig) {
5256

5357
// seed it with the root database
5458
const rootLinkResolver = new PageLinkResolver(".");
55-
await deferredRenderer.renderChildDatabase(config.cmsDatabaseId, rootLinkResolver);
59+
await deferredRenderer.renderChildDatabase(
60+
config.cmsDatabaseId,
61+
rootLinkResolver
62+
);
5663
await deferredRenderer.process();
5764

5865
const rendered = deferredRenderer.getRenderedPages();

0 commit comments

Comments
 (0)