diff --git a/d2cli/main.go b/d2cli/main.go index 56aed09e9..52f3a2ed0 100644 --- a/d2cli/main.go +++ b/d2cli/main.go @@ -37,6 +37,7 @@ import ( "oss.terrastruct.com/d2/lib/pdf" "oss.terrastruct.com/d2/lib/png" "oss.terrastruct.com/d2/lib/pptx" + "oss.terrastruct.com/d2/lib/simplelog" "oss.terrastruct.com/d2/lib/textmeasure" timelib "oss.terrastruct.com/d2/lib/time" "oss.terrastruct.com/d2/lib/version" @@ -434,7 +435,7 @@ func compile(ctx context.Context, ms *xmain.State, plugins []d2plugin.Plugin, la if err != nil { return nil, false, err } - out, err := xgif.AnimatePNGs(ms, pngs, int(animateInterval)) + out, err := AnimatePNGs(ms, pngs, int(animateInterval)) if err != nil { return nil, false, err } @@ -748,10 +749,12 @@ func _render(ctx context.Context, ms *xmain.State, plugin d2plugin.Plugin, opts return svg, err } - svg, bundleErr := imgbundler.BundleLocal(ctx, ms, svg) + cacheImages := ms.Env.Getenv("IMG_CACHE") == "1" + l := simplelog.FromCmdLog(ms.Log) + svg, bundleErr := imgbundler.BundleLocal(ctx, l, svg, cacheImages) if bundle { var bundleErr2 error - svg, bundleErr2 = imgbundler.BundleRemote(ctx, ms, svg) + svg, bundleErr2 = imgbundler.BundleRemote(ctx, l, svg, cacheImages) bundleErr = multierr.Combine(bundleErr, bundleErr2) } if forceAppendix && !toPNG { @@ -764,11 +767,11 @@ func _render(ctx context.Context, ms *xmain.State, plugin d2plugin.Plugin, opts if !bundle { var bundleErr2 error - svg, bundleErr2 = imgbundler.BundleRemote(ctx, ms, svg) + svg, bundleErr2 = imgbundler.BundleRemote(ctx, l, svg, cacheImages) bundleErr = multierr.Combine(bundleErr, bundleErr2) } - out, err = png.ConvertSVG(ms, page, svg) + out, err = ConvertSVG(ms, page, svg) if err != nil { return svg, err } @@ -833,15 +836,17 @@ func renderPDF(ctx context.Context, ms *xmain.State, plugin d2plugin.Plugin, opt return svg, err } - svg, bundleErr := imgbundler.BundleLocal(ctx, ms, svg) - svg, bundleErr2 := imgbundler.BundleRemote(ctx, ms, svg) + cacheImages := ms.Env.Getenv("IMG_CACHE") == "1" + l := simplelog.FromCmdLog(ms.Log) + svg, bundleErr := imgbundler.BundleLocal(ctx, l, svg, cacheImages) + svg, bundleErr2 := imgbundler.BundleRemote(ctx, l, svg, cacheImages) bundleErr = multierr.Combine(bundleErr, bundleErr2) if bundleErr != nil { return svg, bundleErr } svg = appendix.Append(diagram, ruler, svg) - pngImg, err := png.ConvertSVG(ms, page, svg) + pngImg, err := ConvertSVG(ms, page, svg) if err != nil { return svg, err } @@ -933,8 +938,10 @@ func renderPPTX(ctx context.Context, ms *xmain.State, presentation *pptx.Present return nil, err } - svg, bundleErr := imgbundler.BundleLocal(ctx, ms, svg) - svg, bundleErr2 := imgbundler.BundleRemote(ctx, ms, svg) + cacheImages := ms.Env.Getenv("IMG_CACHE") == "1" + l := simplelog.FromCmdLog(ms.Log) + svg, bundleErr := imgbundler.BundleLocal(ctx, l, svg, cacheImages) + svg, bundleErr2 := imgbundler.BundleRemote(ctx, l, svg, cacheImages) bundleErr = multierr.Combine(bundleErr, bundleErr2) if bundleErr != nil { return nil, bundleErr @@ -942,7 +949,7 @@ func renderPPTX(ctx context.Context, ms *xmain.State, presentation *pptx.Present svg = appendix.Append(diagram, ruler, svg) - pngImg, err := png.ConvertSVG(ms, page, svg) + pngImg, err := ConvertSVG(ms, page, svg) if err != nil { return nil, err } @@ -1178,8 +1185,10 @@ func renderPNGsForGIF(ctx context.Context, ms *xmain.State, plugin d2plugin.Plug return nil, nil, err } - svg, bundleErr := imgbundler.BundleLocal(ctx, ms, svg) - svg, bundleErr2 := imgbundler.BundleRemote(ctx, ms, svg) + cacheImages := ms.Env.Getenv("IMG_CACHE") == "1" + l := simplelog.FromCmdLog(ms.Log) + svg, bundleErr := imgbundler.BundleLocal(ctx, l, svg, cacheImages) + svg, bundleErr2 := imgbundler.BundleRemote(ctx, l, svg, cacheImages) bundleErr = multierr.Combine(bundleErr, bundleErr2) if bundleErr != nil { return nil, nil, bundleErr @@ -1187,7 +1196,7 @@ func renderPNGsForGIF(ctx context.Context, ms *xmain.State, plugin d2plugin.Plug svg = appendix.Append(diagram, ruler, svg) - pngImg, err := png.ConvertSVG(ms, page, svg) + pngImg, err := ConvertSVG(ms, page, svg) if err != nil { return nil, nil, err } @@ -1218,3 +1227,21 @@ func renderPNGsForGIF(ctx context.Context, ms *xmain.State, plugin d2plugin.Plug return svg, pngs, nil } + +func ConvertSVG(ms *xmain.State, page playwright.Page, svg []byte) ([]byte, error) { + cancel := background.Repeat(func() { + ms.Log.Info.Printf("converting to PNG...") + }, time.Second*5) + defer cancel() + + return png.ConvertSVG(page, svg) +} + +func AnimatePNGs(ms *xmain.State, pngs [][]byte, animIntervalMs int) ([]byte, error) { + cancel := background.Repeat(func() { + ms.Log.Info.Printf("generating GIF...") + }, time.Second*5) + defer cancel() + + return xgif.AnimatePNGs(pngs, animIntervalMs) +} diff --git a/lib/imgbundler/imgbundler.go b/lib/imgbundler/imgbundler.go index 526f3bf8d..08488df10 100644 --- a/lib/imgbundler/imgbundler.go +++ b/lib/imgbundler/imgbundler.go @@ -19,8 +19,8 @@ import ( "golang.org/x/xerrors" + "oss.terrastruct.com/d2/lib/simplelog" "oss.terrastruct.com/util-go/xdefer" - "oss.terrastruct.com/util-go/xmain" ) var imgCache sync.Map @@ -29,12 +29,12 @@ const maxImageSize int64 = 1 << 25 // 33_554_432 var imageRegex = regexp.MustCompile(` 0 { @@ -150,8 +150,8 @@ func runWorkers(ctx context.Context, ms *xmain.State, svg []byte, imgs [][][]byt } } -func worker(ctx context.Context, ms *xmain.State, href []byte, isRemote bool) ([]byte, error) { - if ms.Env.Getenv("IMG_CACHE") == "1" { +func worker(ctx context.Context, l simplelog.Logger, href []byte, isRemote, cacheImages bool) ([]byte, error) { + if cacheImages { if hit, ok := imgCache.Load(string(href)); ok { return hit.([]byte), nil } @@ -160,10 +160,10 @@ func worker(ctx context.Context, ms *xmain.State, href []byte, isRemote bool) ([ var mimeType string var err error if isRemote { - ms.Log.Debug.Printf("fetching %s remotely", string(href)) + l.Debug(fmt.Sprintf("fetching %s remotely", string(href))) buf, mimeType, err = httpGet(ctx, html.UnescapeString(string(href))) } else { - ms.Log.Debug.Printf("reading %s from disk", string(href)) + l.Debug(fmt.Sprintf("reading %s from disk", string(href))) buf, err = os.ReadFile(html.UnescapeString(string(href))) } if err != nil { @@ -177,7 +177,7 @@ func worker(ctx context.Context, ms *xmain.State, href []byte, isRemote bool) ([ b64 := base64.StdEncoding.EncodeToString(buf) out := []byte(fmt.Sprintf(` `, svgURL, pngURL) - ms := &xmain.State{ - Name: "test", - - Stdin: os.Stdin, - Stdout: os.Stdout, - Stderr: os.Stderr, - - Env: xos.NewEnv(os.Environ()), - } - ms.Log = cmdlog.NewTB(ms.Env, t) - httpClient.Transport = roundTripFunc(func(req *http.Request) *http.Response { respRecorder := httptest.NewRecorder() switch req.URL.String() { @@ -109,7 +97,8 @@ width="328" height="587" viewBox="-100 -131 328 587"> `, svgURL, pngURL) - ms := &xmain.State{ - Name: "test", - - Stdin: os.Stdin, - Stdout: os.Stdout, - Stderr: os.Stderr, - - Env: xos.NewEnv(os.Environ()), - } - ms.Log = cmdlog.NewTB(ms.Env, t) - out, err := BundleLocal(ctx, ms, []byte(sampleSVG)) + l := simplelog.FromLibLog(ctx) + out, err := BundleLocal(ctx, l, []byte(sampleSVG), false) if err != nil { t.Fatal(err) } @@ -233,7 +213,7 @@ width="328" height="587" viewBox="-100 -131 328 587"> `, url1, url2) - ms := &xmain.State{ - Name: "test", - - Stdin: os.Stdin, - Stdout: os.Stdout, - Stderr: os.Stderr, - - Env: xos.NewEnv(os.Environ()), - } - ms.Log = cmdlog.NewTB(ms.Env, t) - count := 0 httpClient.Transport = roundTripFunc(func(req *http.Request) *http.Response { @@ -285,7 +254,8 @@ width="328" height="587" viewBox="-100 -131 328 587"> `, url1, url2) - ms := &xmain.State{ - Name: "test", - - Stdin: os.Stdin, - Stdout: os.Stdout, - Stderr: os.Stderr, - - Env: xos.NewEnv(os.Environ()), - } - ms.Log = cmdlog.NewTB(ms.Env, t) - count := 0 httpClient.Transport = roundTripFunc(func(req *http.Request) *http.Response { @@ -350,26 +309,25 @@ width="328" height="587" viewBox="-100 -131 328 587">