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// }