PR comments

This commit is contained in:
Bernard Xie 2022-11-21 10:46:54 -08:00
parent 24aa08bb2b
commit 233fc76e7f
No known key found for this signature in database
GPG key ID: 3C3E0036CE0F892C
5 changed files with 31 additions and 52 deletions

View file

@ -9,7 +9,9 @@
.Op Fl -watch Ar false .Op Fl -watch Ar false
.Op Fl -theme Em 0 .Op Fl -theme Em 0
.Ar file.d2 .Ar file.d2
.Op Ar file.svg|file.png .Op Ar file.svg
|
.Op Ar file.png
.Nm d2 .Nm d2
.Op Fl -watch Ar false .Op Fl -watch Ar false
.Op Fl -theme Em 0 .Op Fl -theme Em 0
@ -21,7 +23,11 @@
.Nm .Nm
compiles and renders compiles and renders
.Ar file.d2 .Ar file.d2
to svg or png. to
.Ar file.svg
,
.Ar file.png
.Ns .
.Pp .Pp
Pass - to have Pass - to have
.Nm .Nm

View file

@ -17,7 +17,7 @@ func help(ms *xmain.State) {
fmt.Fprintf(ms.Stdout, `Usage: fmt.Fprintf(ms.Stdout, `Usage:
%s [--watch=false] [--theme=0] file.d2 [file.svg|file.png] %s [--watch=false] [--theme=0] file.d2 [file.svg|file.png]
%[1]s compiles and renders file.d2 to svg or png. %[1]s compiles and renders file.d2 to file.svg, file.png.
Use - to have d2 read from stdin or write to stdout. Use - to have d2 read from stdin or write to stdout.
Flags: Flags:

View file

@ -119,11 +119,12 @@ func run(ctx context.Context, ms *xmain.State) (err error) {
if err != nil { if err != nil {
return err return err
} }
defer func() { defer func() error {
cleanupErr := pw.Cleanup() err = pw.Cleanup()
if cleanupErr != nil { if err != nil {
ms.Log.Error.Printf("error cleaning up Playwright: %v", cleanupErr.Error()) return err
} }
return nil
}() }()
} }
@ -180,23 +181,23 @@ func compile(ctx context.Context, ms *xmain.State, plugin d2plugin.Plugin, input
if err != nil { if err != nil {
return nil, err return nil, err
} }
outputImage, err := plugin.PostProcess(ctx, svg) out, err := plugin.PostProcess(ctx, svg)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if filepath.Ext(outputPath) == ".png" { if filepath.Ext(outputPath) == ".png" {
outputImage, err = png.ConvertSVG(ms, page, outputImage) out, err = png.ConvertSVG(ms, page, out)
if err != nil { if err != nil {
return nil, err return nil, err
} }
} }
err = ms.WritePath(outputPath, outputImage) err = ms.WritePath(outputPath, out)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return svg, nil return out, nil
} }
// newExt must include leading . // newExt must include leading .

View file

@ -337,7 +337,7 @@ func (w *watcher) compileLoop(ctx context.Context) error {
w.broadcast(&compileResult{ w.broadcast(&compileResult{
Err: broadcastErr.Error(), Err: broadcastErr.Error(),
}) })
return fmt.Errorf("Playwright could not be restarted: %w", err) continue
} }
w.pw = newPW w.pw = newPW
} }

View file

@ -1,11 +1,8 @@
package png package png
import ( import (
"bytes"
"encoding/base64" "encoding/base64"
"fmt" "fmt"
"os"
"os/exec"
"strings" "strings"
_ "embed" _ "embed"
@ -20,19 +17,19 @@ type Playwright struct {
Page playwright.Page Page playwright.Page
} }
func (pw *Playwright) RestartBrowser() (newPW Playwright, err error) { func (pw *Playwright) RestartBrowser() (Playwright, error) {
if err = pw.Browser.Close(); err != nil { if err := pw.Browser.Close(); err != nil {
return Playwright{}, err return Playwright{}, fmt.Errorf("failed to close Playwright browser: %w", err)
} }
return startPlaywright(pw.PW) return startPlaywright(pw.PW)
} }
func (pw *Playwright) Cleanup() error { func (pw *Playwright) Cleanup() error {
if err := pw.Browser.Close(); err != nil { if err := pw.Browser.Close(); err != nil {
return err return fmt.Errorf("failed to close Playwright browser: %w", err)
} }
if err := pw.PW.Stop(); err != nil { if err := pw.PW.Stop(); err != nil {
return err return fmt.Errorf("failed to stop Playwright: %w", err)
} }
return nil return nil
} }
@ -40,15 +37,15 @@ func (pw *Playwright) Cleanup() error {
func startPlaywright(pw *playwright.Playwright) (Playwright, error) { func startPlaywright(pw *playwright.Playwright) (Playwright, error) {
browser, err := pw.Chromium.Launch() browser, err := pw.Chromium.Launch()
if err != nil { if err != nil {
return Playwright{}, err return Playwright{}, fmt.Errorf("failed to launch Chromium: %w", err)
} }
context, err := browser.NewContext() context, err := browser.NewContext()
if err != nil { if err != nil {
return Playwright{}, err return Playwright{}, fmt.Errorf("failed to start new Playwright browser context: %w", err)
} }
page, err := context.NewPage() page, err := context.NewPage()
if err != nil { if err != nil {
return Playwright{}, err return Playwright{}, fmt.Errorf("failed to start new Playwright page: %w", err)
} }
return Playwright{ return Playwright{
PW: pw, PW: pw,
@ -58,39 +55,14 @@ func startPlaywright(pw *playwright.Playwright) (Playwright, error) {
} }
func InitPlaywright() (Playwright, error) { func InitPlaywright() (Playwright, error) {
// check if playwright driver/browsers are installed and up to date err := playwright.Install(&playwright.RunOptions{Verbose: false})
// https://github.com/playwright-community/playwright-go/blob/8e8f670b5fa7ba5365ae4bfc123fea4aac359763/run.go#L64.
driver, err := playwright.NewDriver(&playwright.RunOptions{})
if err != nil { if err != nil {
return Playwright{}, err return Playwright{}, fmt.Errorf("failed to install Playwright: %w", err)
}
_, err = os.Stat(driver.DriverBinaryLocation)
if err != nil {
if os.IsNotExist(err) {
err = playwright.Install()
if err != nil {
return Playwright{}, err
}
} else {
return Playwright{}, fmt.Errorf("could not access Playwright binary location: %v\nerror: %w\nplease report this issue here: https://github.com/terrastruct/d2/issues/new", driver.DriverBinaryLocation, err)
}
}
cmd := exec.Command(driver.DriverBinaryLocation, "--version")
output, err := cmd.Output()
if err != nil {
return Playwright{}, fmt.Errorf("error getting Playwright version: %w\nplease report this issue here: https://github.com/terrastruct/d2/issues/new", err)
}
if !bytes.Contains(output, []byte(driver.Version)) {
err = playwright.Install()
if err != nil {
return Playwright{}, err
}
} }
pw, err := playwright.Run() pw, err := playwright.Run()
if err != nil { if err != nil {
return Playwright{}, err return Playwright{}, fmt.Errorf("failed to run Playwright: %w", err)
} }
return startPlaywright(pw) return startPlaywright(pw)
} }
@ -100,7 +72,7 @@ var genPNGScript string
const pngPrefix = "data:image/png;base64," const pngPrefix = "data:image/png;base64,"
func ConvertSVG(ms *xmain.State, page playwright.Page, svg []byte) (outputImage []byte, err error) { func ConvertSVG(ms *xmain.State, page playwright.Page, svg []byte) ([]byte, error) {
encodedSVG := base64.StdEncoding.EncodeToString(svg) encodedSVG := base64.StdEncoding.EncodeToString(svg)
pngInterface, err := page.Evaluate(genPNGScript, "data:image/svg+xml;charset=utf-8;base64,"+encodedSVG) pngInterface, err := page.Evaluate(genPNGScript, "data:image/svg+xml;charset=utf-8;base64,"+encodedSVG)
if err != nil { if err != nil {