From 9cf85c09d2f0c2a9267ac7e50e7e4c8a02b5cd7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E9=9B=85=20=C2=B7=20Misaki=20Masa?= Date: Sun, 25 Aug 2024 02:56:38 +0800 Subject: [PATCH] feat: make the builtin `code` previewer handle invalid carriage return chars and binary streams better (#1550) --- yazi-plugin/preset/components/entity.lua | 2 +- yazi-plugin/preset/plugins/code.lua | 6 ++- yazi-plugin/preset/plugins/empty.lua | 2 +- yazi-plugin/preset/plugins/json.lua | 6 ++- yazi-plugin/src/elements/line.rs | 2 + yazi-plugin/src/elements/paragraph.rs | 17 ++++---- yazi-plugin/src/elements/span.rs | 50 +--------------------- yazi-plugin/src/elements/style.rs | 50 +--------------------- yazi-plugin/src/external/highlighter.rs | 8 ++++ yazi-plugin/src/lib.rs | 1 + yazi-plugin/src/macros.rs | 53 ++++++++++++++++++++++++ yazi-plugin/src/utils/preview.rs | 8 ++-- yazi-shared/src/errors/peek.rs | 4 +- 13 files changed, 94 insertions(+), 115 deletions(-) create mode 100644 yazi-plugin/src/macros.rs diff --git a/yazi-plugin/preset/components/entity.lua b/yazi-plugin/preset/components/entity.lua index 2faada58..a0a6dfc6 100644 --- a/yazi-plugin/preset/components/entity.lua +++ b/yazi-plugin/preset/components/entity.lua @@ -70,7 +70,7 @@ function Entity:symlink() end local to = self._file.link_to - return ui.Line(to and { ui.Span(" -> " .. tostring(to)):italic() } or {}) + return to and ui.Line(" -> " .. tostring(to)):italic() or ui.Line {} end function Entity:render() diff --git a/yazi-plugin/preset/plugins/code.lua b/yazi-plugin/preset/plugins/code.lua index f8c8e930..05e0b212 100644 --- a/yazi-plugin/preset/plugins/code.lua +++ b/yazi-plugin/preset/plugins/code.lua @@ -1,9 +1,13 @@ local M = {} function M:peek() - local _, bound = ya.preview_code(self) + local err, bound = ya.preview_code(self) if bound then ya.manager_emit("peek", { bound, only_if = self.file.url, upper_bound = true }) + elseif err then + ya.preview_widgets(self, { + ui.Paragraph(self.area, { ui.Line(err):reverse() }), + }) end end diff --git a/yazi-plugin/preset/plugins/empty.lua b/yazi-plugin/preset/plugins/empty.lua index 5d2e9b46..8b8946a4 100644 --- a/yazi-plugin/preset/plugins/empty.lua +++ b/yazi-plugin/preset/plugins/empty.lua @@ -2,7 +2,7 @@ local M = {} function M:msg(s) local p = ui.Paragraph(self.area, { - ui.Line { ui.Span(s):reverse() }, + ui.Line(s):reverse(), }) ya.preview_widgets(self, { p:wrap(ui.Paragraph.WRAP) }) end diff --git a/yazi-plugin/preset/plugins/json.lua b/yazi-plugin/preset/plugins/json.lua index bca3ebb5..32314c4d 100644 --- a/yazi-plugin/preset/plugins/json.lua +++ b/yazi-plugin/preset/plugins/json.lua @@ -53,9 +53,13 @@ function M:seek(units) end function M:fallback_to_builtin() - local _, bound = ya.preview_code(self) + local err, bound = ya.preview_code(self) if bound then ya.manager_emit("peek", { bound, only_if = self.file.url, upper_bound = true }) + elseif err then + ya.preview_widgets(self, { + ui.Paragraph(self.area, { ui.Line(err):reverse() }), + }) end end diff --git a/yazi-plugin/src/elements/line.rs b/yazi-plugin/src/elements/line.rs index fcf74b24..16a76562 100644 --- a/yazi-plugin/src/elements/line.rs +++ b/yazi-plugin/src/elements/line.rs @@ -82,6 +82,8 @@ impl Line { impl UserData for Line { fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) { + crate::impl_style_shorthands!(methods, 0.style); + methods.add_function("width", |_, ud: AnyUserData| Ok(ud.borrow_mut::()?.0.width())); methods.add_function("style", |_, (ud, value): (AnyUserData, Value)| { { diff --git a/yazi-plugin/src/elements/paragraph.rs b/yazi-plugin/src/elements/paragraph.rs index 38070e2a..fc44d589 100644 --- a/yazi-plugin/src/elements/paragraph.rs +++ b/yazi-plugin/src/elements/paragraph.rs @@ -19,7 +19,7 @@ pub struct Paragraph { pub area: ratatui::layout::Rect, pub text: ratatui::text::Text<'static>, - pub style: Option, + pub style: ratatui::style::Style, pub alignment: ratatui::layout::Alignment, pub wrap: u8, } @@ -29,7 +29,7 @@ impl Paragraph { let new = lua.create_function(|_, (_, area, lines): (Table, RectRef, Vec)| { Ok(Paragraph { area: *area, - text: lines.into_iter().map(|s| s.0).collect::>().into(), + text: lines.into_iter().map(|s| s.0).collect(), ..Default::default() }) })?; @@ -58,13 +58,15 @@ impl Paragraph { impl UserData for Paragraph { fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) { + crate::impl_style_shorthands!(methods, style); + methods.add_function("style", |_, (ud, value): (AnyUserData, Value)| { { let mut me = ud.borrow_mut::()?; match value { - Value::Nil => me.style = None, - Value::Table(tb) => me.style = Some(Style::try_from(tb)?.0), - Value::UserData(ud) => me.style = Some(ud.borrow::