panache_parser/parser/utils/
inline_emission.rs1use crate::options::ParserOptions;
12use crate::parser::inlines::core;
13use rowan::GreenNodeBuilder;
14
15pub fn emit_inlines(
37 builder: &mut GreenNodeBuilder,
38 text: &str,
39 config: &ParserOptions,
40 suppress_footnote_refs: bool,
41) {
42 log::trace!(
43 "emit_inlines: {:?} ({} bytes)",
44 &text[..text.len().min(40)],
45 text.len()
46 );
47
48 core::parse_inline_text_recursive(builder, text, config, suppress_footnote_refs);
50}
51
52#[cfg(test)]
53mod tests {
54 use super::*;
55 use crate::options::ParserOptions;
56 use crate::syntax::{SyntaxKind, SyntaxNode};
57 use rowan::GreenNodeBuilder;
58
59 #[test]
61 fn test_emit_inlines_basic() {
62 let config = ParserOptions::default();
63 let test_cases = vec",
69 "mixed *emph* and **strong** and `code`",
70 "nested *emphasis with `code` inside*",
71 "multiple *a* and *b* emphasis",
72 ];
73
74 for text in test_cases {
75 let mut builder_new = GreenNodeBuilder::new();
77 builder_new.start_node(SyntaxKind::HEADING_CONTENT.into());
78 emit_inlines(&mut builder_new, text, &config, false);
79 builder_new.finish_node();
80 let green_new = builder_new.finish();
81 let tree_new = SyntaxNode::new_root(green_new);
82
83 assert_eq!(
85 tree_new.text().to_string(),
86 text,
87 "Losslessness check failed for: {:?}",
88 text
89 );
90 }
91 }
92
93 #[test]
95 fn test_emit_inlines_empty() {
96 let config = ParserOptions::default();
97 let mut builder = GreenNodeBuilder::new();
98 builder.start_node(SyntaxKind::HEADING_CONTENT.into());
99 emit_inlines(&mut builder, "", &config, false);
100 builder.finish_node();
101 let green = builder.finish();
102 let tree = SyntaxNode::new_root(green);
103
104 assert_eq!(tree.kind(), SyntaxKind::HEADING_CONTENT);
106 assert_eq!(tree.children_with_tokens().count(), 0);
107 }
108
109 #[test]
111 fn test_emit_inlines_preserves_whitespace() {
112 let config = ParserOptions::default();
113 let text = " leading and trailing ";
114
115 let mut builder = GreenNodeBuilder::new();
116 builder.start_node(SyntaxKind::HEADING_CONTENT.into());
117 emit_inlines(&mut builder, text, &config, false);
118 builder.finish_node();
119 let green = builder.finish();
120 let tree = SyntaxNode::new_root(green);
121
122 assert_eq!(tree.text().to_string(), text);
124 }
125}