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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
use crateAST;
use crateToHTML;
/*
impl ToHTML for AST {
fn to_html(&self) -> String {
match self {
AST::Statements(e) => {
let mut text = String::new();
for node in e {
text += &node.to_html()
}
let trimmed: Vec<_> = text.lines().map(|s| s.trim()).collect();
trimmed.join("\n")
}
AST::Header(e, level) => format!("<h{0}>{1}</h{0}>", level, e.to_html()),
AST::Paragraph(p) => format!("<p>{}</p>", p.to_html()),
AST::Normal(s) => s.to_owned(),
AST::Strong(s) => format!("<b>{}</b>", s.to_html()),
AST::Emphasis(s) => format!("<i>{}</i>", s.to_html()),
AST::Underline(s) => format!("<u>{}</u>", s.to_html()),
AST::Strikethrough(s) => format!("<del>{}</del>", s.to_html()),
AST::Undercover(s) => format!("<ast.span class=\"undercover\">{}</ast.span>", s.to_html()),
/*
AST::Table { head, align, terms, column } => {
let align_iter = align.iter().chain(repeat(&align[align.len() - 1]));
let thead = {
let mut head = head.iter().chain(repeat(&AST::Space));
let mut align = align_iter.clone();
let mut thead = String::new();
for _ in 0..*column {
let h = head.next().unwrap().to_html();
let a = *align.next().unwrap();
thead.push_str(&format!("{}", build_th(&h, a)))
}
format!("<thead>{}</thead>", thead)
};
let mut trs = vec![];
for term in terms {
let mut head = term.iter().chain(repeat(&AST::Space));
let mut align = align_iter.clone();
let mut thead = String::new();
for _ in 0..*column {
let h = head.next().unwrap().to_html();
let a = *align.next().unwrap();
thead.push_str(&format!("{}", build_td(&h, a)))
}
trs.push(format!("<tr>{}</tr>", thead))
}
format!("<table>{}<tbody>{}</tbody></table>", thead, trs.join(""))
}
AST::Quote { body, style } => {
let quote = body.iter().map(|s| s.to_html()).collect::<Vec<String>>().join("");
match style.as_str() {
"info" | "danger" | "warning" | "success" => {
format!("<blockquote class=\"fancyquote {}\">{}</blockquote>", style, quote)
}
_ => format!("<blockquote>{}</blockquote>", quote),
}
}
AST::Ordered(v) => {
let quote = v.iter().map(|s| format!("<li>{}</li>", s.to_html())).collect::<Vec<String>>().join("");
format!("<ol>{}</ol>", quote)
}
AST::Orderless(v) => {
let quote = v.iter().map(|s| format!("<li>{}</li>", s.to_html())).collect::<Vec<String>>().join("");
format!("<ul>{}</ul>", quote)
}
AST::Command(s, keys, values) => {
let ref cfg = GLOBAL_CONFIG.lock().unwrap();
format!("cmd: {}\narg: {:?}\nkvs: {:?}", s, keys, values)
}
*/
AST::None => String::from(""),
AST::Newline => String::from("</br>"),
AST::Raw(s) => format!("<pre>{}</pre>", s),
AST::Code(s) => format!("<code>{}</code>", s),
//#[cfg(feature = "default")]
AST::MathInline(s) => format!("<span class=\"math\">${}$</span> ", s),
// #[cfg(feature = "desktop")]
// AST::MathInline(s) => utils::rex_math_inline(s),
//#[cfg(feature = "default")]
AST::MathDisplay(s) => format!("<p class=\"math\">$${}$$</p> ", s),
// #[cfg(feature = "desktop")]
// AST::MathDisplay(s) => utils::rex_math_display(s),
_ => {
let a = format!("HTML unimplemented AST::{:?}", self);
println!("{}", a.split("(").next().unwrap_or("Unknown"));
format!("{:?}", self);
unreachable!()
}
}
}
}
impl ToHTML for Vec<AST> {
fn to_html(&self) -> String {
let v: Vec<_> = self.iter().map(ToHTML::to_html).collect();
v.join("")
}
}
*/