diff --git a/lua/image/utils/magic.lua b/lua/image/utils/magic.lua index 077102e..f07e4d4 100644 --- a/lua/image/utils/magic.lua +++ b/lua/image/utils/magic.lua @@ -15,6 +15,11 @@ local image_signatures = { pdf = "%PDF", } +local jxl_signatures = { + "\xFF\x0A", + "\x00\x00\x00\x0CJXL \x0D\x0A\x87\x0A", +} + local function read_file_header(file, num_bytes) if not file then return nil end local current_pos = file:seek() @@ -68,6 +73,13 @@ M.detect_format = function(path) return nil end + for _, signature in ipairs(jxl_signatures) do + if check_signature_match(header, "jxl", signature) then + file:close() + return "jxl" + end + end + for format, signature in pairs(image_signatures) do if check_signature_match(header, format, signature) then if format == "jpeg" then diff --git a/tests/utils/magic_spec.lua b/tests/utils/magic_spec.lua index 14b6a54..9d95e13 100644 --- a/tests/utils/magic_spec.lua +++ b/tests/utils/magic_spec.lua @@ -52,6 +52,23 @@ describe("magic", function() end) end + it("detects JPEG XL codestream and container signatures", function() + local signatures = { + "\xFF\x0A", + "\x00\x00\x00\x0CJXL \x0D\x0A\x87\x0A", + } + + for _, signature in ipairs(signatures) do + local path = vim.fn.tempname() + local file = assert(io.open(path, "wb")) + file:write(signature) + file:close() + assert.are.same("jxl", detect_format(path)) + assert.is_true(require("image/utils/magic").is_image(path)) + vim.fn.delete(path) + end + end) + it("returns nil for non-existent files", function() assert.is_nil(detect_format("tests/test_data/nonexistent.png")) end)