@@ -24,22 +24,19 @@ use quarto_markdown_pandoc::wasm_entry_points;
2424use quarto_markdown_pandoc:: writers;
2525use wasm_bindgen:: prelude:: * ;
2626
27- #[ wasm_bindgen]
28- extern "C" {
29- fn alert ( s : & str ) ;
30- }
31-
32- #[ wasm_bindgen]
33- pub fn greet ( ) {
34- alert ( "Hello, wasm-qmd-parser!" ) ;
35- }
36-
3727#[ wasm_bindgen( start) ]
3828pub fn run ( ) {
3929 // Set a panic hook on program start that prints panics to the console
4030 panic:: set_hook ( Box :: new ( console_error_panic_hook:: hook) ) ;
4131}
4232
33+ fn json_to_pandoc ( input : & str ) -> Result < quarto_markdown_pandoc:: pandoc:: Pandoc , String > {
34+ match readers:: json:: read ( & mut input. as_bytes ( ) ) {
35+ Ok ( doc) => Ok ( doc) ,
36+ Err ( err) => Err ( format ! ( "Unable to read as json: {:?}" , err) ) ,
37+ }
38+ }
39+
4340fn pandoc_to_json ( doc : & quarto_markdown_pandoc:: pandoc:: Pandoc ) -> Result < String , String > {
4441 let mut buf = Vec :: new ( ) ;
4542 match writers:: json:: write ( doc, & mut buf) {
@@ -57,27 +54,60 @@ fn pandoc_to_json(doc: &quarto_markdown_pandoc::pandoc::Pandoc) -> Result<String
5754 }
5855}
5956
57+ fn pandoc_to_qmd ( doc : & quarto_markdown_pandoc:: pandoc:: Pandoc ) -> Result < String , String > {
58+ let mut buf = Vec :: new ( ) ;
59+ match writers:: qmd:: write ( doc, & mut buf) {
60+ Ok ( _) => {
61+ // Nothing to do
62+ }
63+ Err ( err) => {
64+ return Err ( format ! ( "Unable to write as qmd: {:?}" , err) ) ;
65+ }
66+ }
67+
68+ match String :: from_utf8 ( buf) {
69+ Ok ( qmd) => Ok ( qmd) ,
70+ Err ( err) => Err ( format ! ( "Unable to convert qmd to string: {:?}" , err) ) ,
71+ }
72+ }
73+
6074#[ wasm_bindgen]
6175pub fn parse_qmd ( input : JsValue ) -> JsValue {
62- let input = match input. as_string ( ) {
63- Some ( input) => input,
64- None => panic ! ( "Unable to parse `input` as a `String`." ) ,
65- } ;
76+ let input = as_string ( & input, "input" ) ;
6677 let json = wasm_entry_points:: parse_qmd ( input. as_bytes ( ) ) ;
6778 JsValue :: from_str ( & json)
6879}
6980
7081#[ wasm_bindgen]
7182pub fn write_qmd ( input : JsValue ) -> JsValue {
72- let input = match input. as_string ( ) {
73- Some ( input) => input,
74- None => panic ! ( "Unable to parse `input` as a `String`." ) ,
75- } ;
76- let result = match readers:: json:: read ( & mut input. as_bytes ( ) ) {
77- Ok ( result) => result,
78- Err ( err) => panic ! ( "Unable to read as json:\n {}" , err) ,
79- } ;
83+ let input = as_string ( & input, "input" ) ;
84+ let result = json_to_pandoc ( & input) . unwrap ( ) ;
8085
8186 let json = pandoc_to_json ( & result) . unwrap ( ) ;
8287 JsValue :: from_str ( & json)
8388}
89+
90+ #[ wasm_bindgen]
91+ pub fn convert ( document : JsValue , input_format : JsValue , output_format : JsValue ) -> JsValue {
92+ let input = as_string ( & document, "document" ) ;
93+ let input_format = as_string ( & input_format, "input_format" ) ;
94+ let output_format = as_string ( & output_format, "output_format" ) ;
95+ let doc = match input_format. as_str ( ) {
96+ "qmd" => wasm_entry_points:: qmd_to_pandoc ( & input. as_bytes ( ) ) . unwrap ( ) ,
97+ "json" => json_to_pandoc ( & input) . unwrap ( ) ,
98+ _ => panic ! ( "Unsupported input format: {}" , input_format) ,
99+ } ;
100+ let output = match output_format. as_str ( ) {
101+ "qmd" => pandoc_to_qmd ( & doc) . unwrap ( ) ,
102+ "json" => pandoc_to_json ( & doc) . unwrap ( ) ,
103+ _ => panic ! ( "Unsupported output format: {}" , output_format) ,
104+ } ;
105+ JsValue :: from_str ( & output)
106+ }
107+
108+ fn as_string ( value : & JsValue , name : & str ) -> String {
109+ match value. as_string ( ) {
110+ Some ( s) => s,
111+ None => panic ! ( "Unable to parse `{}` as a `String`." , name) ,
112+ }
113+ }
0 commit comments