Skip to main content

nargo_parser/vutex/
document.rs

1use crate::vutex::FrontMatterParser;
2use nargo_types::{Document, FrontMatter, Result};
3
4/// 从 Markdown 内容中提取第一个标题
5fn 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
19/// 解析文档
20///
21/// # Arguments
22///
23/// * `source` - 完整的文档内容,包含可选的 frontmatter 和 markdown
24/// * `path` - 文档路径
25///
26/// # Returns
27///
28/// 解析后的文档
29pub 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
46/// 仅解析 frontmatter
47///
48/// # Arguments
49///
50/// * `source` - 文档内容
51///
52/// # Returns
53///
54/// 解析后的 frontmatter 和内容起始位置
55pub fn parse_frontmatter(source: &str) -> Result<(FrontMatter, usize)> {
56    FrontMatterParser::parse(source)
57}