use crate::options::ParserOptions;
use crate::parser::inlines::core;
use rowan::GreenNodeBuilder;
pub fn emit_inlines(builder: &mut GreenNodeBuilder, text: &str, config: &ParserOptions) {
log::trace!(
"emit_inlines: {:?} ({} bytes)",
&text[..text.len().min(40)],
text.len()
);
core::parse_inline_text_recursive(builder, text, config);
}
#[cfg(test)]
mod tests {
use super::*;
use crate::options::ParserOptions;
use crate::syntax::{SyntaxKind, SyntaxNode};
use rowan::GreenNodeBuilder;
#[test]
fn test_emit_inlines_basic() {
let config = ParserOptions::default();
let test_cases = vec",
"mixed *emph* and **strong** and `code`",
"nested *emphasis with `code` inside*",
"multiple *a* and *b* emphasis",
];
for text in test_cases {
let mut builder_new = GreenNodeBuilder::new();
builder_new.start_node(SyntaxKind::HEADING_CONTENT.into());
emit_inlines(&mut builder_new, text, &config);
builder_new.finish_node();
let green_new = builder_new.finish();
let tree_new = SyntaxNode::new_root(green_new);
assert_eq!(
tree_new.text().to_string(),
text,
"Losslessness check failed for: {:?}",
text
);
}
}
#[test]
fn test_emit_inlines_empty() {
let config = ParserOptions::default();
let mut builder = GreenNodeBuilder::new();
builder.start_node(SyntaxKind::HEADING_CONTENT.into());
emit_inlines(&mut builder, "", &config);
builder.finish_node();
let green = builder.finish();
let tree = SyntaxNode::new_root(green);
assert_eq!(tree.kind(), SyntaxKind::HEADING_CONTENT);
assert_eq!(tree.children_with_tokens().count(), 0);
}
#[test]
fn test_emit_inlines_preserves_whitespace() {
let config = ParserOptions::default();
let text = " leading and trailing ";
let mut builder = GreenNodeBuilder::new();
builder.start_node(SyntaxKind::HEADING_CONTENT.into());
emit_inlines(&mut builder, text, &config);
builder.finish_node();
let green = builder.finish();
let tree = SyntaxNode::new_root(green);
assert_eq!(tree.text().to_string(), text);
}
}