nargo_parser/vutex/
document.rs1use crate::vutex::FrontMatterParser;
2use nargo_types::{Document, FrontMatter, Result};
3
4fn extract_first_heading(content: &str) -> Option<String> {
6 for line in content.lines() {
7 let line = line.trim();
8 if line.starts_with('#') {
9 let mut heading = line.trim_start_matches('#').trim();
10 if heading.is_empty() {
11 continue;
12 }
13 return Some(heading.to_string());
14 }
15 }
16 None
17}
18
19pub fn parse_document(source: &str, path: &str) -> Result<Document> {
30 let (frontmatter, content_start) = FrontMatterParser::parse(source)?;
31
32 let content = if content_start < source.len() { source[content_start..].to_string() } else { String::new() };
33
34 let mut doc = Document::new().with_path(path.to_string()).with_frontmatter(frontmatter).with_content(content);
35
36 if doc.frontmatter.title.is_none() {
37 doc.meta.title = extract_first_heading(&doc.content);
38 }
39 else {
40 doc.meta.title = doc.frontmatter.title.clone();
41 }
42
43 Ok(doc)
44}
45
46pub fn parse_frontmatter(source: &str) -> Result<(FrontMatter, usize)> {
56 FrontMatterParser::parse(source)
57}