fix(yazi): update plugins

This commit is contained in:
2025-04-28 19:57:56 +03:00
parent 94fabd2f50
commit 473d4a771a
61 changed files with 5624 additions and 6531 deletions

View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 yazi-rs
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,76 @@
<div align="center">
# office.yazi
### A plugin to preview office documents in <a href="https://github.com/sxyazi/yazi">Yazi <img src="https://github.com/sxyazi/yazi/blob/main/assets/logo.png?raw=true" alt="a duck" width="24px" height="24px"></a>
<img src="https://github.com/macydnah/office.yazi/blob/assets/preview_test.gif" alt="preview test" width="88%">
##
</div>
## Installation
> [!TIP]
> Installing this plugin with `ya` will conveniently clone the plugin from GitHub,
> copy it to your plugins directory, and update the `package.toml` to lock its version [^1].
>
> To install it with `ya` run:
> ```sh
> ya pack -a macydnah/office
> ```
> Or if you prefer a manual approach:
> ```sh
> ## For linux and MacOS
> git clone https://github.com/macydnah/office.yazi.git ~/.config/yazi/plugins/office.yazi
>
> ## For Windows
> git clone https://github.com/macydnah/office.yazi.git %AppData%\yazi\config\plugins\office.yazi
> ```
## Usage
In your `yazi.toml` add rules to preloaders[^2] and previewers[^3] to run `office` plugin with office documents.
> [!NOTE]
> Your config may be different depending if you're *appending*, *prepending* or *overriding* default rules.
> If unsure, take a look at [Configuration](https://yazi-rs.github.io/docs/configuration/overview)[^4]
> and [Configuration mixing](https://yazi-rs.github.io/docs/configuration/overview#mixing)[^5]
For a general usecase, you may use the following rules
```toml
[plugin]
prepend_preloaders = [
# Office Documents
{ mime = "application/openxmlformats-officedocument.*", run = "office" },
{ mime = "application/oasis.opendocument.*", run = "office" },
{ mime = "application/ms-*", run = "office" },
{ mime = "application/msword", run = "office" },
{ name = "*.docx", run = "office" },
]
prepend_previewers = [
# Office Documents
{ mime = "application/openxmlformats-officedocument.*", run = "office" },
{ mime = "application/oasis.opendocument.*", run = "office" },
{ mime = "application/ms-*", run = "office" },
{ mime = "application/msword", run = "office" },
{ name = "*.docx", run = "office" },
]
```
## Dependencies
> [!IMPORTANT]
> Make sure that these commands are installed in your system and can be found in `PATH`:
>
> - `libreoffice`
> - `pdftoppm`
## License
office.yazi is licensed under the terms of the [MIT License](LICENSE)
[^1]: [The official package manager for Yazi](https://yazi-rs.github.io/docs/cli)
[^2]: [Preloaders rules](https://yazi-rs.github.io/docs/configuration/yazi#plugin.preloaders)
[^3]: [Previewers rules](https://yazi-rs.github.io/docs/configuration/yazi#plugin.previewers)
[^4]: [Configuration](https://yazi-rs.github.io/docs/configuration/overview)
[^5]: [Configuration mixing](https://yazi-rs.github.io/docs/configuration/overview#mixing)

View File

@@ -0,0 +1,114 @@
--- @since 25.2.7
local M = {}
function M:peek(job)
local start, cache = os.clock(), ya.file_cache(job)
if not cache then
return
end
local ok, err = self:preload(job)
if not ok or err then
return
end
ya.sleep(math.max(0, rt.preview.image_delay / 1000 + start - os.clock()))
ya.image_show(cache, job.area)
ya.preview_widgets(job, {})
end
function M:seek(job)
local h = cx.active.current.hovered
if h and h.url == job.file.url then
local step = ya.clamp(-1, job.units, 1)
ya.manager_emit("peek", { math.max(0, cx.active.preview.skip + step), only_if = job.file.url })
end
end
function M:doc2pdf(job)
local tmp = "/tmp/yazi-" .. ya.uid() .. "/" .. ya.hash("office.yazi") .. "/"
--[[ For Future Reference: Regarding `libreoffice` as preconverter
1. It prints errors to stdout (always, doesn't matter if it succeeded or it failed)
2. Always writes the converted files to the filesystem, so no "Mario|Bros|Piping|Magic" for the data stream (https://ask.libreoffice.org/t/using-convert-to-output-to-stdout/38753)
3. The `pdf:draw_pdf_Export` filter needs literal double quotes when defining its options (https://help.libreoffice.org/latest/en-US/text/shared/guide/pdf_params.html?&DbPAR=SHARED&System=UNIX#generaltext/shared/guide/pdf_params.xhp)
3.1 Regarding double quotes and Lua strings, see https://www.lua.org/manual/5.1/manual.html#2.1 --]]
local libreoffice = Command("libreoffice")
:args({
"--headless",
"--convert-to",
"pdf:draw_pdf_Export:{" ..
"\"PageRange\":{" ..
"\"type\":\"string\"," ..
"\"value\":" .. "\"" .. job.skip + 1 .. "\"" ..
"}" ..
"}",
"--outdir",
tmp,
tostring(job.file.url)
})
:stdin(Command.NULL)
:stdout(Command.PIPED)
:stderr(Command.NULL)
:output()
if not libreoffice.status.success then
ya.err(libreoffice.stdout:match("LibreOffice .+"):gsub("%\n.*", "") .. " " .. libreoffice.stdout:match("Error .+"):gsub("%\n.*", ""))
return nil, Err("Failed to preconvert `%s` to a temporary PDF", job.file.name)
end
local tmp = tmp .. job.file.name:gsub("%.[^%.]+$", ".pdf")
local read_permission = io.open(tmp, "r")
if not read_permission then
return nil, Err("Failed to read `%s`: make sure file exists and have read access", tmp)
end
read_permission:close()
return tmp
end
function M:preload(job)
local cache = ya.file_cache(job)
if not cache or fs.cha(cache) then
return true
end
local tmp_pdf, err = self:doc2pdf(job)
if not tmp_pdf then
return true, Err(" " .. "%s", err)
end
local output, err = Command("pdftoppm")
:args({
"-singlefile",
"-jpeg",
"-jpegopt",
"quality=" .. rt.preview.image_quality,
"-f",
1,
tostring(tmp_pdf),
})
:stdout(Command.PIPED)
:stderr(Command.PIPED)
:output()
local rm_tmp_pdf, rm_err = fs.remove("file", Url(tmp_pdf))
if not rm_tmp_pdf then
return true, Err("Failed to remove %s, error: %s", tmp_pdf, rm_err)
end
if not output then
return true, Err("Failed to start `pdftoppm`, error: %s", err)
elseif not output.status.success then
local pages = tonumber(output.stderr:match("the last page %((%d+)%)")) or 0
if job.skip > 0 and pages > 0 then
ya.mgr_emit("peek", { math.max(0, pages - 1), only_if = job.file.url, upper_bound = true })
end
return true, Err("Failed to convert %s to image, stderr: %s", tmp_pdf, output.stderr)
end
return fs.write(cache, output.stdout)
end
return M