mirror of
https://github.com/zoriya/telescope.nvim.git
synced 2025-12-06 06:46:10 +00:00
fix(previewer): improve binary mime type check (#3083)
* fix(previewer): improve binary mime type check
Problem: mime type for a ts/js file can either return `text/plain` or
`application/javascript` based on the contents of the file.
Previously, this meant `application/javascript` would be considered
"possibly binary". This, in conjunction with how `vim.filetype.match`
does not give a result for a filename that ends in `.ts`, would lead to
a typescript file taking the path of `check_mime_type` and eventually
`mime_hook`.
Solution: Include `application/javascript` as a non-binary file type
during mime type check.
* [docgen] Update doc/telescope.txt
skip-checks: true
---------
Co-authored-by: Github Actions <actions@github>
(cherry picked from commit fac83a556e)
This commit is contained in:
@@ -2296,9 +2296,9 @@ utils.transform_path({opts}, {path}) *telescope.utils.transform_path()*
|
||||
|
||||
|
||||
Parameters: ~
|
||||
{opts} (table) The opts the users passed into the picker. Might
|
||||
contains a path_display key
|
||||
{path} (string?) The path that should be formatted
|
||||
{opts} (table) The opts the users passed into the picker. Might
|
||||
contains a path_display key
|
||||
{path} (string|nil) The path that should be formatted
|
||||
|
||||
Return: ~
|
||||
string: The transformed path ready to be displayed
|
||||
|
||||
@@ -192,9 +192,8 @@ previewers.file_maker = function(filepath, bufnr, opts)
|
||||
else
|
||||
if opts.preview.check_mime_type == true and has_file and opts.ft == "" then
|
||||
-- avoid SIGABRT in buffer previewer happening with utils.get_os_command_output
|
||||
local output = capture(string.format([[file --mime-type -b "%s"]], filepath))
|
||||
local mime_type = vim.split(output, "/")
|
||||
if mime_type[1] ~= "text" and mime_type[1] ~= "inode" and mime_type[2] ~= "json" then
|
||||
local mime_type = capture(string.format([[file --mime-type -b "%s"]], filepath))
|
||||
if putils.binary_mime_type(mime_type) then
|
||||
if type(opts.preview.mime_hook) == "function" then
|
||||
vim.schedule_wrap(opts.preview.mime_hook)(filepath, bufnr, opts)
|
||||
else
|
||||
|
||||
@@ -3,6 +3,7 @@ local utils = require "telescope.utils"
|
||||
local Path = require "plenary.path"
|
||||
local from_entry = require "telescope.from_entry"
|
||||
local Previewer = require "telescope.previewers.previewer"
|
||||
local putil = require "telescope.previewers.utils"
|
||||
|
||||
local defaulter = utils.make_default_callable
|
||||
|
||||
@@ -65,9 +66,8 @@ local cat_maker = function(filename, _, start, _)
|
||||
end
|
||||
|
||||
if 1 == vim.fn.executable "file" then
|
||||
local output = utils.get_os_command_output { "file", "--mime-type", "-b", filename }
|
||||
local mime_type = vim.split(output[1], "/")[1]
|
||||
if mime_type ~= "text" then
|
||||
local mime_type = utils.get_os_command_output({ "file", "--mime-type", "-b", filename })[1]
|
||||
if putil.binary_mime_type(mime_type) then
|
||||
return { "echo", "Binary file found. These files cannot be displayed!" }
|
||||
end
|
||||
end
|
||||
|
||||
@@ -212,4 +212,21 @@ utils.set_preview_message = function(bufnr, winid, message, fillchar)
|
||||
end
|
||||
end
|
||||
|
||||
--- Check if mime type is binary.
|
||||
--- NOT an exhaustive check, may get false negatives. Ideally should check
|
||||
--- filetype with `vim.filetype.match` or `filetype_detect` first for filetype
|
||||
--- info.
|
||||
---@param mime_type string
|
||||
---@return boolean
|
||||
utils.binary_mime_type = function(mime_type)
|
||||
local type_, subtype = unpack(vim.split(mime_type, "/"))
|
||||
if vim.tbl_contains({ "text", "inode" }, type_) then
|
||||
return false
|
||||
end
|
||||
if vim.tbl_contains({ "json", "javascript" }, subtype) then
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
return utils
|
||||
|
||||
Reference in New Issue
Block a user