aboutsummaryrefslogtreecommitdiff
path: root/web/mastosan/src/main.rs
blob: 80658b00784727461a495fd105ed81e2b1c1e9e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
use lol_html::{element, html_content::ContentType, HtmlRewriter, Settings};
use std::env::args;
use std::io::{self, prelude::*, stdin, stdout};

fn main() -> io::Result<()> {
    let mode = match args().nth(1) {
        None => {
            return Err(io::Error::new(
                io::ErrorKind::InvalidInput,
                "usage: mastosan [markdown|slackdown|text]",
            ))
        }
        Some(mode) => mode,
    };

    let mut output = Vec::new();
    let mut rewriter = HtmlRewriter::new(
        Settings {
            element_content_handlers: vec![
                element!("span", |el| {
                    el.remove_and_keep_content();
                    Ok(())
                }),
                element!("p", |el| {
                    el.append("\n\n", ContentType::Html);
                    el.remove_and_keep_content();
                    Ok(())
                }),
                element!("br", |el| {
                    el.append("\n\n", ContentType::Html);
                    el.remove_and_keep_content();
                    Ok(())
                }),
                element!("a[href]", |el| {
                    let href = el.get_attribute("href").unwrap();
                    match mode.as_str() {
                        "slackdown" => {
                            el.prepend("|", ContentType::Html);
                            el.prepend(&href, ContentType::Html);
                            el.prepend("<", ContentType::Html);
                            el.append(">", ContentType::Html);
                        }
                        "markdown" => {
                            el.prepend("](", ContentType::Html);
                            el.prepend(&href, ContentType::Html);
                            el.prepend("[", ContentType::Html);
                            el.append(")", ContentType::Html);
                        }
                        _ => {}
                    }
                    el.remove_and_keep_content();

                    Ok(())
                }),
            ],
            ..Settings::default()
        },
        |c: &[u8]| output.extend_from_slice(c),
    );

    let mut input = Vec::new();
    let mut fin = stdin().lock();
    fin.read_to_end(&mut input)?;

    rewriter.write(&input).unwrap();
    rewriter.end().unwrap();

    let mut fout = stdout().lock();
    fout.write(&output)?;

    Ok(())
}