fur_cli/renderer/
markdown.rs

1use std::fs;
2use std::path::Path;
3use serde_json::Value;
4
5use crate::commands::timeline::TimelineArgs;
6use crate::renderer::utils::load_message;
7
8pub fn render_message_md(
9    fur_dir: &Path,
10    msg_id: &str,
11    label: String,
12    args: &TimelineArgs,
13    avatars: &Value,
14    out: &mut String,
15) {
16    let Some(msg) = load_message(fur_dir, msg_id, avatars) else { return };
17
18    if let Some(att) = msg.attachment {
19        if att.ends_with(".png")
20            || att.ends_with(".jpg")
21            || att.ends_with(".jpeg")
22            || att.ends_with(".gif")
23        {
24            out.push_str(&format!("\n![attachment]({})\n\n", att));
25        } else if att.ends_with(".pdf") {
26            // Markdown can't inline PDFs → make it a link
27            out.push_str(&format!(
28                "\n[Attached PDF: {}]({})\n\n",
29                Path::new(&att).file_name().unwrap().to_string_lossy(),
30                att
31            ));
32        } else {
33            out.push_str(&format!("\n[Attachment: {}]\n\n", att));
34        }
35    }
36
37    out.push_str(&format!("**{} [{}]:** {}\n", msg.name, msg.emoji, msg.text));
38    out.push_str(&format!("_{} {} - {}_\n\n", msg.date_str, msg.time_str, label));
39
40    if args.verbose || args.contents {
41        if let Some(path_str) = msg.markdown {
42            if let Ok(contents) = fs::read_to_string(path_str) {
43                out.push_str(&format!("\n{}\n", contents));
44            }
45        }
46    }
47
48    // ✅ Correct branch numbering: one label per branch block
49    for (bi, block) in msg.branches.iter().enumerate() {
50        let branch_label = format!("{} - Branch {}", label, bi + 1);
51
52        for cid in block {
53            render_message_md(fur_dir, cid, branch_label.clone(), args, avatars, out);
54        }
55    }
56}