1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
pub mod code_ast;
mod common;

use std::collections::HashMap;

pub use common::*;
pub mod notebook;
pub mod raw;

pub mod parser;
#[cfg(feature = "scripting")]
pub mod scripting;

fn parse_raw(doc: RawDocument) -> anyhow::Result<Document<Vec<Node>>> {
    let composed = ComposedMarkdown::from(doc.src);
    let code_outputs = composed
        .children
        .iter()
        .filter_map(|c| match &c.elem {
            Special::CodeBlock {  .. } => Some((c.label.to_string(), CodeOutput::default())), // todo: implement functionality
            _ => None,
        })
        .collect();

    let nodes: Vec<Node> = Vec::from(composed);

    let doc = Document {
        content: nodes,
        meta: doc.meta.map_or(
            Ok::<Metadata, serde_yaml::Error>(Metadata::default()),
            |meta| serde_yaml::from_str(&meta),
        )?,
        code_outputs,
        data: HashMap::new(),
    };

    Ok(doc)
}

pub fn try_doc_from_str(value: &str) -> anyhow::Result<Document<Vec<Node>>> {
    let raw = parse_to_doc(value)?;
    parse_raw(raw)
}

use crate::raw::{parse_to_doc, ComposedMarkdown, RawDocument, Special};
use cdoc_base::document::{CodeOutput, Document, Metadata};
use cdoc_base::node::Node;
#[cfg(test)]
use pest_test_gen::pest_tests;

#[pest_tests(
    crate::raw::RawDocParser,
    crate::raw::Rule,
    "doc",
    dir = "tests/pest/doc",
    strict = false,
    lazy_static = true
)]
#[cfg(test)]
mod raw_doc_tests {}