feat(mime-ext): make FILES and EXTS configurable, add option to fallback to preset mime plugin (#26)
Co-authored-by: sxyazi <sxyazi@gmail.com>
This commit is contained in:
@@ -23,9 +23,32 @@ run = "mime-ext"
|
|||||||
prio = "high"
|
prio = "high"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Advanced
|
||||||
|
|
||||||
|
Or you can customize it in your `~/.config/yazi/init.lua`:
|
||||||
|
|
||||||
|
```lua
|
||||||
|
require("mime-ext"):setup {
|
||||||
|
-- Expand the existing filename database (lowercase), for example:
|
||||||
|
with_files = {
|
||||||
|
makefile = "text/x-makefile",
|
||||||
|
-- ...
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Expand the existing extension database (lowercase), for example:
|
||||||
|
with_exts = {
|
||||||
|
mk = "text/x-makefile",
|
||||||
|
-- ...
|
||||||
|
},
|
||||||
|
|
||||||
|
-- If the mime-type is not in both filename and extension databases,
|
||||||
|
-- then fallback to Yazi's preset `mime` plugin, which uses `file(1)`
|
||||||
|
fallback_file1 = false,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
|
|
||||||
- Add more file types (PRs welcome!).
|
- Add more file types (PRs welcome!).
|
||||||
- Allow configuring the plugin and overriding some of its rules.
|
|
||||||
- Eliminating `x-` as part of Yazi v0.4 as it's discouraged as per [rfc6838#section-3.4](https://datatracker.ietf.org/doc/html/rfc6838#section-3.4)
|
- Eliminating `x-` as part of Yazi v0.4 as it's discouraged as per [rfc6838#section-3.4](https://datatracker.ietf.org/doc/html/rfc6838#section-3.4)
|
||||||
- Compress mime-type tables.
|
- Compress mime-type tables.
|
||||||
|
|||||||
@@ -1026,18 +1026,45 @@ local EXTS = {
|
|||||||
zsh = "text/shellscript",
|
zsh = "text/shellscript",
|
||||||
}
|
}
|
||||||
|
|
||||||
local function fetch(self)
|
local options = ya.sync(
|
||||||
local updates = {}
|
function(st)
|
||||||
|
return {
|
||||||
|
with_files = st.with_files,
|
||||||
|
with_exts = st.with_exts,
|
||||||
|
fallback_file1 = st.fallback_file1,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
)
|
||||||
|
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
function M:setup(opts)
|
||||||
|
opts = opts or {}
|
||||||
|
|
||||||
|
self.with_files = opts.with_files
|
||||||
|
self.with_exts = opts.with_exts
|
||||||
|
self.fallback_file1 = opts.fallback_file1
|
||||||
|
end
|
||||||
|
|
||||||
|
function M:fetch()
|
||||||
|
local opts = options()
|
||||||
|
local merged_files = ya.dict_merge(FILES, opts.with_files or {})
|
||||||
|
local merged_exts = ya.dict_merge(EXTS, opts.with_exts or {})
|
||||||
|
|
||||||
|
local updates, unknown = {}, {}
|
||||||
for _, file in ipairs(self.files) do
|
for _, file in ipairs(self.files) do
|
||||||
local mime
|
local mime
|
||||||
if file.cha.len == 0 then
|
if file.cha.len == 0 then
|
||||||
mime = "inode/x-empty"
|
mime = "inode/x-empty"
|
||||||
else
|
else
|
||||||
mime = FILES[(file.url:name() or ""):lower()]
|
mime = merged_files[(file.url:name() or ""):lower()]
|
||||||
mime = mime or EXTS[(file.url:ext() or ""):lower()]
|
mime = mime or merged_exts[(file.url:ext() or ""):lower()]
|
||||||
end
|
end
|
||||||
|
|
||||||
if mime then
|
if mime then
|
||||||
updates[tostring(file.url)] = mime
|
updates[tostring(file.url)] = mime
|
||||||
|
elseif opts.fallback_file1 then
|
||||||
|
unknown[#unknown + 1] = file
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1045,7 +1072,12 @@ local function fetch(self)
|
|||||||
ya.manager_emit("update_mimetype", { updates = updates })
|
ya.manager_emit("update_mimetype", { updates = updates })
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if #unknown > 0 then
|
||||||
|
self.files = unknown
|
||||||
|
return require("mime").fetch(self)
|
||||||
|
end
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
end
|
end
|
||||||
|
|
||||||
return { fetch = fetch }
|
return M
|
||||||
|
|||||||
Reference in New Issue
Block a user