PR comments
This commit is contained in:
parent
24aa08bb2b
commit
233fc76e7f
5 changed files with 31 additions and 52 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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 .
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue