@@ -4,6 +4,7 @@ import puppeteer from 'puppeteer';
4
4
import fs from 'fs/promises' ;
5
5
import { Liquid } from 'liquidjs' ;
6
6
import crypto from 'crypto' ;
7
+ import { type CreateFeedItemsFn } from '@docusaurus/plugin-content-blog' ;
7
8
8
9
const liquid = new Liquid ( ) ;
9
10
@@ -21,17 +22,14 @@ async function path_exists(path: string) {
21
22
}
22
23
23
24
type RenderOptions = {
25
+ browser : Awaited < ReturnType < typeof puppeteer . launch > > ;
24
26
title : string ;
25
27
fullname : string ;
26
28
avatar : string ;
27
29
slug : string ;
28
30
date : Date
29
31
} ;
30
32
31
- const browser = puppeteer . launch ( {
32
- headless : true
33
- } ) ;
34
-
35
33
function formatDate ( lang : string , date : Date ) {
36
34
const options = { year : 'numeric' , month : 'short' , day : 'numeric' } as const ;
37
35
return date . toLocaleDateString ( lang , options ) ;
@@ -44,7 +42,7 @@ function mktemp(suffix: string) {
44
42
return path . join ( os . tmpdir ( ) , `${ prefix } -${ suffix } ` ) ;
45
43
}
46
44
47
- export default async function render ( { title, fullname, avatar, slug, date } : RenderOptions ) {
45
+ export async function render ( { title, browser , fullname, avatar, slug, date } : RenderOptions ) {
48
46
const output_svg = await liquid . render ( await svg , {
49
47
fullname,
50
48
title,
@@ -58,7 +56,7 @@ export default async function render({ title, fullname, avatar, slug, date }: Re
58
56
await fs . mkdir ( directory , { recursive : true } ) ;
59
57
}
60
58
const filename = `${ directory } ${ slug } .png` ;
61
- const page = await ( await browser ) . newPage ( ) ;
59
+ const page = await browser . newPage ( ) ;
62
60
await page . setViewport ( {
63
61
height : 630 ,
64
62
width : 1200
@@ -74,3 +72,28 @@ export default async function render({ title, fullname, avatar, slug, date }: Re
74
72
console . log ( `[Docusaurs] Writing ${ filename } ` ) ;
75
73
await page . close ( ) ;
76
74
}
75
+
76
+ type BlogPosts = Parameters < CreateFeedItemsFn > [ 0 ] [ 'blogPosts' ] ;
77
+
78
+ export default async function renderBlogArticles ( posts : BlogPosts ) {
79
+ const browser = await puppeteer . launch ( {
80
+ headless : true
81
+ } ) ;
82
+ for ( const post of posts ) {
83
+ const author = post . metadata . authors [ 0 ] ;
84
+ const slug = post . metadata . permalink . replace ( / ^ .* \/ / , '' ) ;
85
+ const title = post . metadata . title ;
86
+ const fullname = author . name ;
87
+ const avatar = author . imageURL ;
88
+ const date = post . metadata . date ;
89
+ await render ( {
90
+ browser,
91
+ title,
92
+ fullname,
93
+ avatar,
94
+ slug,
95
+ date : new Date ( date )
96
+ } ) ;
97
+ }
98
+ await browser . close ( ) ;
99
+ }
0 commit comments