use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn render_surfdoc(source: &str) -> String {
let result = crate::parse::parse(source);
result.doc.to_html_fragment()
}
#[wasm_bindgen]
pub fn render_surfdoc_full(source: &str) -> String {
let result = crate::parse::parse(source);
result.doc.to_html_page(&crate::PageConfig::default())
}
#[wasm_bindgen]
pub fn parse_metadata(source: &str) -> String {
let result = crate::parse::parse(source);
let title = result
.doc
.front_matter
.as_ref()
.and_then(|fm| fm.title.clone())
.unwrap_or_default();
let summary = result
.doc
.blocks
.iter()
.find_map(|b| {
if let crate::types::Block::Summary { content, .. } = b {
Some(content.clone())
} else {
None
}
})
.unwrap_or_default();
let doc_type = result
.doc
.front_matter
.as_ref()
.and_then(|fm| fm.doc_type.as_ref())
.map(|dt| format!("{dt:?}").to_lowercase())
.unwrap_or_default();
let tags: Vec<String> = result
.doc
.front_matter
.as_ref()
.and_then(|fm| fm.tags.clone())
.unwrap_or_default();
serde_json::json!({
"title": title,
"summary": summary,
"doc_type": doc_type,
"tags": tags,
})
.to_string()
}
#[wasm_bindgen]
pub fn check_json(input: &str) -> String {
let report = crate::lint::check(input);
crate::lint::reports_to_json(&[(None, &report)]).to_string()
}
#[wasm_bindgen]
pub fn fix_source(input: &str, include_suggested: bool) -> String {
let safety = if include_suggested {
crate::error::FixSafety::Suggested
} else {
crate::error::FixSafety::Safe
};
crate::lint::apply_fixes(input, safety).source
}
#[wasm_bindgen]
pub fn parse_diagnostics(source: &str) -> String {
let result = crate::parse::parse(source);
let diags: Vec<serde_json::Value> = result
.diagnostics
.iter()
.map(|d| {
serde_json::json!({
"severity": format!("{:?}", d.severity).to_lowercase(),
"message": d.message,
"line": d.span.as_ref().map(|s| s.start_line),
})
})
.collect();
serde_json::Value::Array(diags).to_string()
}