View decoded email source by default

Toggle between decoded/raw source with view_raw_source shortcut, default
M-r
memfd
Manos Pitsidianakis 2020-02-23 10:42:29 +02:00
parent 44da24fc96
commit 68007a0842
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
3 changed files with 68 additions and 15 deletions

View File

@ -913,10 +913,10 @@ pub fn phrase(input: &[u8]) -> IResult<&[u8], Vec<u8>> {
ptr += 1;
}
ascii_e = ptr;
while ptr < input.len() && (is_whitespace!(input[ptr])) {
ptr += 1;
}
ascii_e = ptr;
if ptr >= input.len() {
acc.extend(
ascii_token(&input[ascii_s..ascii_e])

View File

@ -38,12 +38,18 @@ pub use self::envelope::*;
use linkify::{Link, LinkFinder};
use xdg_utils::query_default_app;
#[derive(PartialEq, Copy, Clone, Debug)]
enum Source {
Decoded,
Raw,
}
#[derive(PartialEq, Debug)]
enum ViewMode {
Normal,
Url,
Attachment(usize),
Raw,
Source(Source),
Ansi(RawBuffer),
Subview,
ContactSelector(UIDialog<Card>),
@ -228,7 +234,10 @@ impl MailView {
))
.into_owned();
match self.mode {
ViewMode::Normal | ViewMode::Subview | ViewMode::ContactSelector(_) => {
ViewMode::Normal
| ViewMode::Subview
| ViewMode::ContactSelector(_)
| ViewMode::Source(Source::Decoded) => {
let mut t = body_text.to_string();
t.push('\n');
if body.count_attachments() > 1 {
@ -294,7 +303,7 @@ impl MailView {
}
t
}
ViewMode::Raw => String::from_utf8_lossy(body.body()).into_owned(),
ViewMode::Source(Source::Raw) => String::from_utf8_lossy(body.body()).into_owned(),
ViewMode::Url => {
let mut t = body_text.to_string();
for (lidx, l) in finder.links(&body.text()).enumerate() {
@ -376,7 +385,7 @@ impl Component for MailView {
let headers = crate::conf::value(context, "mail.view.headers");
if self.mode == ViewMode::Raw {
if let ViewMode::Source(_) = self.mode {
clear_area(grid, area, self.theme_default);
context.dirty_areas.push_back(area);
get_y(upper_left)
@ -652,14 +661,50 @@ impl Component for MailView {
self.mode = ViewMode::Subview;
}
ViewMode::Subview | ViewMode::ContactSelector(_) => {}
ViewMode::Raw => {
ViewMode::Source(source) => {
let text = {
let account = &mut context.accounts[self.coordinates.0];
let account = &context.accounts[self.coordinates.0];
let envelope: EnvelopeRef = account.collection.get_env(self.coordinates.2);
let mut op = account.operation(envelope.hash());
op.as_bytes()
.map(|v| String::from_utf8_lossy(v).into_owned())
.unwrap_or_else(|e| e.to_string())
if source == Source::Raw {
op.as_bytes()
.map(|v| String::from_utf8_lossy(v).into_owned())
.unwrap_or_else(|e| e.to_string())
} else {
/* Decode each header value */
let mut ret = op
.as_bytes()
.and_then(|b| {
melib::email::parser::headers(b)
.to_full_result()
.map_err(|err| err.into())
})
.and_then(|headers| {
Ok(headers
.into_iter()
.map(|(h, v)| {
melib::email::parser::phrase(v)
.to_full_result()
.map(|v| {
let mut h = h.to_vec();
h.push(b':');
h.push(b' ');
h.extend(v.into_iter());
h
})
.map_err(|err| err.into())
})
.collect::<Result<Vec<Vec<u8>>>>()?
.join(&b"\n"[..]))
})
.map(|v| String::from_utf8_lossy(&v).into_owned())
.unwrap_or_else(|e| e.to_string());
drop(envelope);
drop(account);
ret.push_str("\n\n");
ret.extend(self.attachment_to_text(&body, context).chars());
ret
}
};
let colors = crate::conf::value(context, "mail.view.body");
self.pager = Pager::from_string(text, Some(context), None, None, colors);
@ -860,10 +905,16 @@ impl Component for MailView {
return true;
}
UIEvent::Input(ref key)
if (self.mode == ViewMode::Normal || self.mode == ViewMode::Subview)
if (self.mode == ViewMode::Normal
|| self.mode == ViewMode::Subview
|| self.mode == ViewMode::Source(Source::Decoded)
|| self.mode == ViewMode::Source(Source::Raw))
&& shortcut!(key == shortcuts[MailView::DESCRIPTION]["view_raw_source"]) =>
{
self.mode = ViewMode::Raw;
self.mode = match self.mode {
ViewMode::Source(Source::Decoded) => ViewMode::Source(Source::Raw),
_ => ViewMode::Source(Source::Decoded),
};
self.set_dirty(true);
return true;
}
@ -872,7 +923,8 @@ impl Component for MailView {
|| self.mode.is_ansi()
|| self.mode == ViewMode::Subview
|| self.mode == ViewMode::Url
|| self.mode == ViewMode::Raw)
|| self.mode == ViewMode::Source(Source::Decoded)
|| self.mode == ViewMode::Source(Source::Raw))
&& shortcut!(
key == shortcuts[MailView::DESCRIPTION]["return_to_normal_view"]
) =>
@ -1448,7 +1500,8 @@ impl Component for MailView {
if !(self.mode.is_attachment()
|| self.mode.is_ansi()
|| self.mode == ViewMode::Subview
|| self.mode == ViewMode::Raw
|| self.mode == ViewMode::Source(Source::Decoded)
|| self.mode == ViewMode::Source(Source::Raw)
|| self.mode == ViewMode::Url)
{
our_map.remove("return_to_normal_view");

View File

@ -176,7 +176,7 @@ shortcut_key_values! { "envelope-view",
return_to_normal_view |> "Return to envelope if viewing raw source or attachment." |> Key::Char('r'),
toggle_expand_headers |> "Expand extra headers (References and others)." |> Key::Char('h'),
toggle_url_mode |> "Toggles url open mode." |> Key::Char('u'),
view_raw_source |> "View raw envelope source in a pager." |> Key::Alt('r')
view_raw_source |> "View envelope source in a pager. (toggles between raw and decoded source)" |> Key::Alt('r')
}
}