From 6ca4a052ac44f754bc7796acbe44d3fb7c4a0a6e Mon Sep 17 00:00:00 2001 From: Krzysztof Dajka Date: Sat, 30 May 2026 22:10:45 +0200 Subject: [PATCH] feat(image): add support for d2 diagrams in markdown --- lua/snacks/image/convert.lua | 9 +++++++++ lua/snacks/image/init.lua | 14 +++++++++++++- queries/markdown/images.scm | 8 ++++++++ tests/image/test-d2.md | 10 ++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 tests/image/test-d2.md diff --git a/lua/snacks/image/convert.lua b/lua/snacks/image/convert.lua index e2aaa44e6..320dec50e 100644 --- a/lua/snacks/image/convert.lua +++ b/lua/snacks/image/convert.lua @@ -117,6 +117,15 @@ local commands = { end end, }, + d2 = { + cmd = { + cmd = "d2", + args = Snacks.image.config.convert.d2, + }, + file = function(convert, ctx) + return convert:tmpfile(vim.o.background .. ".png") + end, + }, mmd = { cmd = { cmd = "mmdc", diff --git a/lua/snacks/image/init.lua b/lua/snacks/image/init.lua index 038016e1c..3b6896846 100644 --- a/lua/snacks/image/init.lua +++ b/lua/snacks/image/init.lua @@ -121,8 +121,20 @@ local defaults = { ---@class snacks.image.convert.Config convert = { notify = false, -- show a notification on error + ---@class snacks.image.d2.Opts + d2_opts = { + layout = "dagre", -- default layout engine + theme = nil + }, + ---@type snacks.image.args + d2 = function () + local opts = M.config.convert.d2_opts + local theme = opts.theme or (vim.o.background == "light" and "0" or "200") + local layout = M.config.convert.d2_opts.layout + return { "{src}", "{file}", "--layout", layout, "--theme", theme, "--scale", "{scale}" } + end, ---@type snacks.image.args - mermaid = function() + mermaid = function () local theme = vim.o.background == "light" and "neutral" or "dark" return { "-i", "{src}", "-o", "{file}", "-b", "transparent", "-t", theme, "-s", "{scale}" } end, diff --git a/queries/markdown/images.scm b/queries/markdown/images.scm index 01264d978..82dd52b84 100644 --- a/queries/markdown/images.scm +++ b/queries/markdown/images.scm @@ -15,3 +15,11 @@ (#set! injection.language "mermaid") (#set! image.ext "chart.mmd") ) @image + +(fenced_code_block + (info_string (language) @lang) + (#eq? @lang "d2") + (code_fence_content) @image.content + (#set! injection.language "d2") + (#set! image.ext "chart.d2") +) @image diff --git a/tests/image/test-d2.md b/tests/image/test-d2.md new file mode 100644 index 000000000..278929cc8 --- /dev/null +++ b/tests/image/test-d2.md @@ -0,0 +1,10 @@ +```d2 +good chips: { + doritos + ruffles +} +bad chips.lays +bad chips.pringles + +chocolate.chip.cookies +```