server: render calendar summary before any pre-existing text

This commit is contained in:
2025-08-19 11:17:11 -07:00
parent cc994df4e5
commit a8a5089ed3
3 changed files with 146 additions and 24 deletions

View File

@@ -12,6 +12,7 @@ version.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
html2text = "0.6"
ammonia = "4.1.0"
anyhow = "1.0.98"
askama = { version = "0.14.0", features = ["derive"] }

View File

@@ -328,25 +328,43 @@ pub fn extract_alternative(
return extract_related(sp, part_addr);
}
}
let mut ical_summary: Option<String> = None;
for sp in &m.subparts {
if sp.ctype.mimetype.as_str() == TEXT_CALENDAR {
let body = sp.get_body()?;
let summary = render_ical_summary(&body)?;
return Ok(Body::html(summary));
ical_summary = Some(summary);
break;
}
}
for sp in &m.subparts {
if sp.ctype.mimetype.as_str() == TEXT_HTML {
let body = sp.get_body()?;
return Ok(Body::html(body));
if let Some(ref summary) = ical_summary {
// Prepend summary to HTML body
let combined = format!("{}<hr>{}", summary, body);
return Ok(Body::html(combined));
} else {
return Ok(Body::html(body));
}
}
}
for sp in &m.subparts {
if sp.ctype.mimetype.as_str() == TEXT_PLAIN {
let body = sp.get_body()?;
return Ok(Body::text(body));
if let Some(ref summary) = ical_summary {
// Prepend summary to plain text body (strip HTML tags)
let summary_text = html2text::from_read(summary.as_bytes(), 80);
let combined = format!("{}\n\n{}", summary_text.trim(), body);
return Ok(Body::text(combined));
} else {
return Ok(Body::text(body));
}
}
}
if let Some(summary) = ical_summary {
return Ok(Body::html(summary));
}
Err(ServerError::StringError(format!(
"extract_alternative failed to find suitable subpart, searched: {:?}",
handled_types