diff --git a/lua/image/init.lua b/lua/image/init.lua index 39d5ddc..0eef300 100644 --- a/lua/image/init.lua +++ b/lua/image/init.lua @@ -8,6 +8,9 @@ local default_options = { markdown = { enabled = true, }, + typst = { + enabled = true, + }, neorg = { enabled = true, }, diff --git a/lua/image/integrations/typst.lua b/lua/image/integrations/typst.lua new file mode 100644 index 0000000..e7e156c --- /dev/null +++ b/lua/image/integrations/typst.lua @@ -0,0 +1,46 @@ +local document = require("image/utils/document") +return document.create_document_integration({ + name = "typst", + -- debug = true, + default_options = { + clear_in_insert_mode = false, + download_remote_images = true, + only_render_image_at_cursor = false, + filetypes = { "typst" }, + }, + query_buffer_images = function(buffer) + local buf = buffer or vim.api.nvim_get_current_buf() + + local parser = vim.treesitter.get_parser(buf, "typst") + local root = parser:parse()[1]:root() + local query = + vim.treesitter.query.parse("typst", '(call item: (ident) @name (#eq? @name "image") (group (string) @url))') + + local images = {} + local current_image = nil + + ---@diagnostic disable-next-line: missing-parameter + for id, node in query:iter_captures(root, 0) do + local capture = query.captures[id] + local value = vim.treesitter.get_node_text(node, buf) + + if capture == "name" then + -- Get the parent since we want the "call" and not only the "ident" + local start_row, start_col, end_row, end_col = node:parent():range() + current_image = { + node = node, + range = { start_row = start_row, start_col = start_col, end_row = end_row, end_col = end_col }, + } + elseif current_image and capture == "url" then + -- We need to remove the quotes from the string + -- '"The URL"' -> "The URL" + current_image.url = string.sub(value, 2, -2) + + table.insert(images, current_image) + current_image = nil + end + end + + return images + end, +})