From 1999f8052dcd466b689ee9f1507a2ac1259cd77a Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Thu, 23 Jan 2025 20:49:15 -0800 Subject: [PATCH 1/3] save --- ci/release/template/man/d2.1 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ci/release/template/man/d2.1 b/ci/release/template/man/d2.1 index a3bf928c03..0aadfd3b57 100644 --- a/ci/release/template/man/d2.1 +++ b/ci/release/template/man/d2.1 @@ -151,6 +151,9 @@ Lists available themes .Ns . .It Ar fmt Ar file.d2 ... Format all passed files +.It Fl -no-xml-tag Ar false +Omit XML tag () from output SVG files. Useful when generating SVGs for direct HTML embedding +.Ns . .Ns . .El .Sh ENVIRONMENT VARIABLES @@ -202,6 +205,8 @@ See -p[ort] flag. See --browser flag. .It Ev Sy D2_STDOUT_FORMAT See --stdout-format flag. +.It Ev Sy D2_NO_XML_TAG +See --no-xml-tag flag. .El .Sh SEE ALSO .Xr d2plugin-tala 1 From 83b96c27349cbfa514506a0fc33bf67846af173f Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Thu, 23 Jan 2025 22:27:34 -0700 Subject: [PATCH 2/3] d2cli: no-xml-tag --- d2cli/main.go | 7 +++++++ d2renderers/d2svg/d2svg.go | 5 ++++- e2etests-cli/main_test.go | 23 +++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/d2cli/main.go b/d2cli/main.go index 4f6ec54c2e..8f8f878e34 100644 --- a/d2cli/main.go +++ b/d2cli/main.go @@ -129,6 +129,11 @@ func Run(ctx context.Context, ms *xmain.State) (err error) { return err } + noXMLTagFlag, err := ms.Opts.Bool("D2_NO_XML_TAG", "no-xml-tag", "", false, "suppress the XML declaration in SVG output") + if err != nil { + return err + } + plugins, err := d2plugin.ListPlugins(ctx) if err != nil { return err @@ -318,6 +323,7 @@ func Run(ctx context.Context, ms *xmain.State) (err error) { ThemeID: themeFlag, DarkThemeID: darkThemeFlag, Scale: scale, + NoXMLTag: noXMLTagFlag, } if *watchFlag { @@ -868,6 +874,7 @@ func _render(ctx context.Context, ms *xmain.State, plugin d2plugin.Plugin, opts DarkThemeID: opts.DarkThemeID, ThemeOverrides: opts.ThemeOverrides, DarkThemeOverrides: opts.DarkThemeOverrides, + NoXMLTag: opts.NoXMLTag, Scale: scale, }) if err != nil { diff --git a/d2renderers/d2svg/d2svg.go b/d2renderers/d2svg/d2svg.go index 3857085fa2..b9857bac03 100644 --- a/d2renderers/d2svg/d2svg.go +++ b/d2renderers/d2svg/d2svg.go @@ -86,6 +86,7 @@ type RenderOpts struct { // MasterID is passed when the diagram should use something other than its own hash for unique targeting // Currently, that's when multi-boards are collapsed MasterID string + NoXMLTag *bool } func dimensions(diagram *d2target.Diagram, pad int) (left, top, width, height int) { @@ -2117,7 +2118,9 @@ func Render(diagram *d2target.Diagram, opts *RenderOpts) ([]byte, error) { w, h, dimensions, ) - xmlTag = `` + if opts.NoXMLTag == nil || !*opts.NoXMLTag { + xmlTag = `` + } fitToScreenWrapperClosing = "" idAttr = `id="d2-svg"` tag = "svg" diff --git a/e2etests-cli/main_test.go b/e2etests-cli/main_test.go index 3c300b3374..262d5b3039 100644 --- a/e2etests-cli/main_test.go +++ b/e2etests-cli/main_test.go @@ -982,6 +982,29 @@ layers: { testdataIgnoreDiff(t, ".pptx", file) }, }, + { + name: "no_xml_tag", + run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) { + writeFile(t, dir, "test.d2", `x -> y`) + err := runTestMain(t, ctx, dir, env, "--no-xml-tag", "test.d2", "no-xml.svg") + assert.Success(t, err) + noXMLSvg := readFile(t, dir, "no-xml.svg") + assert.False(t, strings.Contains(string(noXMLSvg), " y`) + err = runTestMain(t, ctx, dir, env, "test.d2", "with-xml.svg") + assert.Success(t, err) + withXMLSvg := readFile(t, dir, "with-xml.svg") + assert.True(t, strings.Contains(string(withXMLSvg), " y`) + err = runTestMain(t, ctx, dir, env, "test.d2", "no-xml-env.svg") + assert.Success(t, err) + noXMLEnvSvg := readFile(t, dir, "no-xml-env.svg") + assert.False(t, strings.Contains(string(noXMLEnvSvg), " Date: Thu, 23 Jan 2025 22:30:22 -0700 Subject: [PATCH 3/3] next --- ci/release/changelogs/next.md | 1 + d2cli/main.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ci/release/changelogs/next.md b/ci/release/changelogs/next.md index 806b4951e5..3909f48a91 100644 --- a/ci/release/changelogs/next.md +++ b/ci/release/changelogs/next.md @@ -7,6 +7,7 @@ - `d2 fmt` now supports a `--check` flag [#2253](https://github.com/terrastruct/d2/pull/2253) - CLI: PNG output to stdout is supported using `--stdout-format png -` [#2291](https://github.com/terrastruct/d2/pull/2291) - Globs: `&connected` and `&leaf` filters are implemented [#2299](https://github.com/terrastruct/d2/pull/2299) +- CLI: add --no-xml-tag for direct HTML embedding [#2302](https://github.com/terrastruct/d2/pull/2302) #### Improvements 🧹 diff --git a/d2cli/main.go b/d2cli/main.go index 8f8f878e34..d2b56aedbf 100644 --- a/d2cli/main.go +++ b/d2cli/main.go @@ -129,7 +129,7 @@ func Run(ctx context.Context, ms *xmain.State) (err error) { return err } - noXMLTagFlag, err := ms.Opts.Bool("D2_NO_XML_TAG", "no-xml-tag", "", false, "suppress the XML declaration in SVG output") + noXMLTagFlag, err := ms.Opts.Bool("D2_NO_XML_TAG", "no-xml-tag", "", false, "omit XML tag () from output SVG files. Useful when generating SVGs for direct HTML embedding") if err != nil { return err }