1use badascii::{render::RenderJob, text_buffer::TextBuffer};
2use proc_macro::TokenStream;
3use quote::quote;
4use syn::{LitStr, parse_macro_input};
5
6fn strip_outer(x: &str) -> String {
7 let x = x
8 .chars()
9 .skip_while(|&c| c != '"')
10 .skip(1)
11 .collect::<String>();
12 let x = x
13 .chars()
14 .rev()
15 .skip_while(|&c| c != '"')
16 .skip(1)
17 .collect::<String>();
18 x.chars().rev().collect()
19}
20
21fn get_text_buffer(input: LitStr) -> TextBuffer {
22 let input = input.token().to_string();
23 let input = strip_outer(&input);
24 TextBuffer::with_text(&input)
25}
26
27#[proc_macro]
28pub fn badascii_formal(input: TokenStream) -> TokenStream {
29 let input = parse_macro_input!(input as LitStr);
30 let text_buffer = get_text_buffer(input);
31 let job = RenderJob::formal(text_buffer);
32 let svg = badascii::svg::render(&job, "currentColor", "none");
33 let svg = format!("<p></p><div style=\"text-align:center;\">{svg}</div><p></p>");
34 quote!(#svg).into()
35}
36
37#[proc_macro]
38pub fn badascii(input: TokenStream) -> TokenStream {
39 let input = parse_macro_input!(input as LitStr);
40 let text_buffer = get_text_buffer(input);
41 let job = RenderJob::rough(text_buffer);
42 let svg = badascii::svg::render(&job, "currentColor", "none");
43 let svg = format!("<p></p><div style=\"text-align:center;\">{svg}</div><p></p>");
44 quote!(#svg).into()
45}