poloto_evcxr/
lib.rs

1use tagu::{elem::Locked, prelude::Elem};
2
3pub mod prelude {
4    pub use super::RenderEvcxr;
5}
6
7pub trait RenderEvcxr {
8    fn render_evcxr(self);
9    fn render_evcxr_img(self);
10}
11
12impl<R: Elem + Locked> RenderEvcxr for poloto::render::Stage4<R> {
13    fn render_evcxr(self) {
14        evcxr_display_svg(self)
15    }
16    fn render_evcxr_img(self) {
17        evcxr_display_img(self)
18    }
19}
20
21pub fn encode_svg_as_img<R: Elem + Locked>(elem: R) -> impl Elem + Locked {
22    let mut s = String::new();
23    tagu::render(elem.inline(), &mut s).unwrap();
24
25    //inline css part as well.
26    let s = s.replace("\n", "");
27
28    use base64::Engine;
29    let s = format!(
30        "data:image/svg+xml;base64,{}",
31        base64::engine::general_purpose::STANDARD.encode(&s)
32    );
33    tagu::build::single("img").with(("src", s))
34}
35
36// pub fn encode_svg_as_img_escapable<R:Elem>(elem:R)-> impl Elem{
37//     let mut s = String::new();
38//     tagu::render_escapable(elem.inline(), &mut s).unwrap();
39
40//     //inline css part as well.
41//     let s = s.replace("\n", "");
42
43//     use base64::Engine;
44//     let s=format!("data:image/svg+xml;base64,{}",base64::engine::general_purpose::STANDARD.encode(&s));
45//     tagu::build::single("img").with(("src",s))
46// }
47
48pub fn evcxr_disp_elem<E: Elem + Locked>(elem: E) {
49    let mut s = String::new();
50    tagu::render(elem, &mut s).unwrap();
51    evcxr_disp(s);
52}
53
54pub fn evcxr_disp<D: std::fmt::Display>(s: D) {
55    println!("EVCXR_BEGIN_CONTENT text/html\n{}\nEVCXR_END_CONTENT", s);
56}
57
58pub fn evcxr_display_img<R: Elem>(elem: R) {
59    let mut s = String::new();
60    tagu::render_escapable(elem.inline(), &mut s).unwrap();
61
62    //inline css part as well.
63    let s = s.replace("\n", "");
64
65    use base64::Engine;
66    let s = format!(
67        "data:image/svg+xml;base64,{}",
68        base64::engine::general_purpose::STANDARD.encode(&s)
69    );
70    let r = tagu::build::single("img").with(("src", s));
71    let mut s = String::new();
72    tagu::render(r, &mut s).unwrap();
73    evcxr_disp(s);
74}
75
76///
77/// the css is inlined so that github viewer will work
78/// image/svg+xml cell with plain text
79///
80pub fn evcxr_display_svg<R: Elem>(elem: R) {
81    let mut s = String::new();
82    tagu::render_escapable(elem.inline(), &mut s).unwrap();
83
84    //inline css part as well.
85    let s = s.replace("\n", "");
86
87    // use base64::Engine;
88    // let s=format!("data:image/svg+xml;base64,{}",base64::engine::general_purpose::STANDARD.encode(&s));
89    // let r=tagu::build::single("img").with(("src",s));
90    // let mut s=String::new();
91    // tagu::render(r,&mut s).unwrap();
92
93    // let s=format!("data:image/svg+xml;ascii,{}",s);
94    // let r=tagu::build::single("img").with(("src",s));
95    // let mut s=String::new();
96    // tagu::render(r,&mut s).unwrap();
97    evcxr_disp(s);
98}
99
100// ///
101// /// html cell with image/svg+xml mime with base64 encoding
102// ///
103// pub fn evcxr_display<R:Elem+Locked>(elem:R){
104//     let a=encode(elem);
105//     let mut s = String::new();
106//     tagu::render(a, &mut s).unwrap();
107//     println!("EVCXR_BEGIN_CONTENT text/html\n{}\nEVCXR_END_CONTENT", s);
108// }
109
110// pub fn encode<R:Elem+Locked>(a:R)->impl Elem+Locked{
111//     let mut s=String::new();
112//     tagu::render(a,&mut s).unwrap();
113//     use base64::Engine;
114//     let s=format!("data:image/svg+xml;base64,{}",base64::engine::general_purpose::STANDARD.encode(&s));
115//     tagu::build::single("img").with(("src",s))
116// }