melib: Add parameters field in ContentType::Text

Intending to add the option to set the parameter format=flowed in the
next commits
jmap
Manos Pitsidianakis 2019-11-17 13:24:19 +02:00
parent 62f3d12253
commit 953c3aa9d0
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
3 changed files with 34 additions and 16 deletions

View File

@ -140,6 +140,7 @@ impl From<&[u8]> for MultipartType {
pub enum ContentType {
Text {
kind: Text,
parameters: Vec<(Vec<u8>, Vec<u8>)>,
charset: Charset,
},
Multipart {
@ -162,6 +163,7 @@ impl Default for ContentType {
fn default() -> Self {
ContentType::Text {
kind: Text::Plain,
parameters: Vec::new(),
charset: Charset::UTF8,
}
}

View File

@ -131,10 +131,7 @@ impl AttachmentBuilder {
parts,
};
} else if ct.eq_ignore_ascii_case(b"text") {
self.content_type = ContentType::Text {
kind: Text::Plain,
charset: Charset::UTF8,
};
self.content_type = ContentType::default();
for (n, v) in params {
if n.eq_ignore_ascii_case(b"charset") {
if let ContentType::Text {
@ -143,7 +140,13 @@ impl AttachmentBuilder {
{
*c = Charset::from(v);
}
break;
}
if let ContentType::Text {
parameters: ref mut p,
..
} = self.content_type
{
p.push((n.to_vec(), v.to_vec()));
}
}
if cst.eq_ignore_ascii_case(b"html") {
@ -587,11 +590,28 @@ impl Attachment {
.chars(),
);
match &a.content_type {
ContentType::Text { kind: _, charset } => {
ContentType::Text {
kind: _,
parameters,
charset,
} => {
ret.extend(
format!("Content-Type: {}; charset={}\n\n", a.content_type, charset)
.chars(),
format!("Content-Type: {}; charset={}", a.content_type, charset).chars(),
);
for (n, v) in parameters {
ret.push_str("; ");
ret.extend(String::from_utf8_lossy(n).chars());
ret.push_str("=");
if v.contains(&b' ') {
ret.push_str("\"");
}
ret.extend(String::from_utf8_lossy(v).chars());
if v.contains(&b' ') {
ret.push_str("\"");
}
}
ret.push_str("\n\n");
ret.extend(String::from_utf8_lossy(a.body()).chars());
}
ContentType::Multipart {

View File

@ -329,18 +329,14 @@ fn build_multipart(ret: &mut String, kind: MultipartType, parts: Vec<AttachmentB
ContentType::Text {
kind: crate::email::attachment_types::Text::Plain,
charset: Charset::UTF8,
} => {
parameters: ref v,
} if v.is_empty() => {
ret.push('\n');
ret.push_str(&String::from_utf8_lossy(sub.raw()));
ret.push('\n');
}
Text {
ref kind,
charset: _,
} => {
ret.extend(format!("Content-Type: {}; charset=\"utf-8\"\n", kind).chars());
ret.push('\n');
ret.push_str(&String::from_utf8_lossy(sub.raw()));
Text { .. } => {
ret.extend(sub.build().into_raw().chars());
ret.push('\n');
}
Multipart {