Skip to content

Commit 95befb3

Browse files
committed
remove write_qmd entry point, add convert entry point
1 parent a17ddf6 commit 95befb3

File tree

2 files changed

+59
-31
lines changed
  • crates
    • quarto-markdown-pandoc/src/wasm_entry_points
    • wasm-qmd-parser/src

2 files changed

+59
-31
lines changed

crates/quarto-markdown-pandoc/src/wasm_entry_points/mod.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@
33
* Copyright (c) 2025 Posit, PBC
44
*/
55

6-
use std::{io, panic};
7-
86
use crate::readers;
97
use crate::utils::output::VerboseOutput;
108
use crate::utils::tree_sitter_log_observer::TreeSitterLogObserver;
9+
use std::io;
1110

1211
fn pandoc_to_json(doc: &crate::pandoc::Pandoc) -> Result<String, String> {
1312
let mut buf = Vec::new();
@@ -26,18 +25,17 @@ fn pandoc_to_json(doc: &crate::pandoc::Pandoc) -> Result<String, String> {
2625
}
2726
}
2827

29-
pub fn parse_qmd(input: &[u8]) -> String {
28+
pub fn qmd_to_pandoc(input: &[u8]) -> Result<crate::pandoc::Pandoc, Vec<String>> {
3029
let mut output = VerboseOutput::Sink(io::sink());
31-
let result = match readers::qmd::read(
30+
readers::qmd::read(
3231
input,
3332
false,
3433
"<input>",
3534
&mut output,
3635
None::<fn(&[u8], &TreeSitterLogObserver, &str) -> Vec<String>>,
37-
) {
38-
Ok(result) => result,
39-
Err(err) => panic!("Unable to read as a qmd:\n{}", err.join("\n")),
40-
};
36+
)
37+
}
4138

42-
pandoc_to_json(&result).unwrap()
39+
pub fn parse_qmd(input: &[u8]) -> String {
40+
pandoc_to_json(&qmd_to_pandoc(input).unwrap()).unwrap()
4341
}

crates/wasm-qmd-parser/src/lib.rs

Lines changed: 52 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,19 @@ use quarto_markdown_pandoc::wasm_entry_points;
2424
use quarto_markdown_pandoc::writers;
2525
use 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)]
3828
pub 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+
4340
fn 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]
6175
pub 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]
7182
pub 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

Comments
 (0)