@@ -2,7 +2,7 @@ import { URL } from 'url'
2
2
import type { Marp , MarpOptions } from '@marp-team/marp-core'
3
3
import { Marpit , Options as MarpitOptions } from '@marp-team/marpit'
4
4
import chalk from 'chalk'
5
- import type { Browser , Page , HTTPRequest } from 'puppeteer-core'
5
+ import type { Browser , Page , HTTPRequest , WaitForOptions } from 'puppeteer-core'
6
6
import { silence , warn } from './cli'
7
7
import { Engine , ResolvedEngine } from './engine'
8
8
import { generateOverrideGlobalDirectivesPlugin } from './engine/directive-plugin'
@@ -297,8 +297,8 @@ export class Converter {
297
297
298
298
let outlineData : OutlineData | undefined
299
299
300
- ret . buffer = await this . usePuppeteer ( html , async ( page , uri ) => {
301
- await page . goto ( uri , { waitUntil : [ 'domcontentloaded' , 'networkidle0' ] } )
300
+ ret . buffer = await this . usePuppeteer ( html , async ( page , { render } ) => {
301
+ await render ( )
302
302
303
303
if ( tpl . rendered . outline ) {
304
304
outlineData = await page . evaluate (
@@ -384,34 +384,29 @@ export class Converter {
384
384
385
385
const files : File [ ] = [ ]
386
386
387
- await this . usePuppeteer ( html , async ( page , uri ) => {
387
+ await this . usePuppeteer ( html , async ( page , { render } ) => {
388
388
await page . setViewport ( {
389
389
...tpl . rendered . size ,
390
390
deviceScaleFactor : opts . scale ?? 1 ,
391
391
} )
392
- await page . goto ( uri , { waitUntil : [ 'domcontentloaded' , 'networkidle0' ] } )
392
+ await render ( )
393
393
await page . emulateMediaType ( 'print' )
394
394
395
395
const screenshot = async ( pageNumber = 1 ) => {
396
- // for Chrome < 89 (TODO: Remove this script evaluation in future)
397
- await page . evaluate (
398
- `window.scrollTo(0,${ ( pageNumber - 1 ) * tpl . rendered . size . height } )`
399
- )
400
-
401
396
const clip = {
402
397
x : 0 ,
403
398
y : ( pageNumber - 1 ) * tpl . rendered . size . height ,
404
399
...tpl . rendered . size ,
405
400
} as const
406
401
407
402
if ( opts . type === ConvertType . jpeg )
408
- return ( await page . screenshot ( {
403
+ return await page . screenshot ( {
409
404
clip,
410
405
quality : opts . quality ,
411
406
type : 'jpeg' ,
412
- } ) ) as Buffer
407
+ } )
413
408
414
- return ( await page . screenshot ( { clip, type : 'png' } ) ) as Buffer
409
+ return await page . screenshot ( { clip, type : 'png' } )
415
410
}
416
411
417
412
if ( opts . pages ) {
@@ -532,7 +527,10 @@ export class Converter {
532
527
533
528
private async usePuppeteer < T > (
534
529
baseFile : File ,
535
- processer : ( page : Page , uri : string ) => Promise < T >
530
+ processer : (
531
+ page : Page ,
532
+ helpers : { render : ( ) => Promise < void > }
533
+ ) => Promise < T >
536
534
) {
537
535
const tmpFile : File . TmpFileInterface | undefined = await ( ( ) => {
538
536
if ( ! this . options . allowLocalFiles ) return undefined
@@ -563,7 +561,7 @@ export class Converter {
563
561
}
564
562
return `file://${ tmpFile . path } `
565
563
}
566
- return `data:text/html;base64, ${ baseFile . buffer ! . toString ( 'base64' ) } `
564
+ return undefined
567
565
} ) ( )
568
566
569
567
const page = await browser . newPage ( )
@@ -572,8 +570,21 @@ export class Converter {
572
570
const { missingFileSet, failedFileSet } =
573
571
this . trackFailedLocalFileAccess ( page )
574
572
573
+ const render = async ( ) => {
574
+ const waitForOptions : WaitForOptions = {
575
+ waitUntil : [ 'domcontentloaded' , 'networkidle0' ] ,
576
+ }
577
+
578
+ if ( uri ) {
579
+ await page . goto ( uri , waitForOptions )
580
+ } else {
581
+ await page . goto ( 'data:text/html,' )
582
+ await page . setContent ( baseFile . buffer ! . toString ( ) , waitForOptions )
583
+ }
584
+ }
585
+
575
586
try {
576
- return await processer ( page , uri )
587
+ return await processer ( page , { render } )
577
588
} finally {
578
589
if ( missingFileSet . size > 0 ) {
579
590
warn (
0 commit comments