igumnoff / shiva

Shiva library: Implementation in Rust of a parser and generator for documents of any type
https://docs.rs/shiva
GNU General Public License v3.0
159 stars 10 forks source link

Markdown generate function need rewrite with "comrak" crate #105

Open evgenyigumnov opened 1 month ago

evgenyigumnov commented 1 month ago

Example code:

use comrak::nodes::{AstNode, NodeHeading, NodeList, NodeTable, NodeValue};
use comrak::{Options, format_commonmark};
fn generate_md() -> String {

    let root = AstNode::from(NodeValue::Document);

    let h1 = AstNode::from(NodeValue::Heading(NodeHeading { level: 1 , setext: true}));
    let h1_text = AstNode::from(NodeValue::Text("Header text".to_string()));
    h1.append(&h1_text);
    root.append(&h1);
    let p = AstNode::from(NodeValue::Paragraph);
    let text = AstNode::from(NodeValue::Text("Hello, world".to_string()));
    p.append(&text);
    root.append(&p);

    let table = AstNode::from(NodeValue::Table(NodeTable { alignments: vec![], num_columns: 2, num_rows: 2, num_nonempty_cells: 4 }));
    let tr = AstNode::from(NodeValue::TableRow(false));
    let td = AstNode::from(NodeValue::TableCell);
    let td_text = AstNode::from(NodeValue::Text("Cell 1".to_string()));
    td.append(&td_text);
    tr.append(&td);
    let td = AstNode::from(NodeValue::TableCell);
    let td_text = AstNode::from(NodeValue::Text("Cell 2".to_string()));
    td.append(&td_text);
    tr.append(&td);
    table.append(&tr);
    let tr = AstNode::from(NodeValue::TableRow(false));
    let td = AstNode::from(NodeValue::TableCell);
    let td_text = AstNode::from(NodeValue::Text("Cell 3".to_string()));
    td.append(&td_text);
    tr.append(&td);
    let td = AstNode::from(NodeValue::TableCell);
    let td_text = AstNode::from(NodeValue::Text("Cell 4".to_string()));
    td.append(&td_text);
    tr.append(&td);
    table.append(&tr);
    root.append(&table);

    let list = AstNode::from(NodeValue::List(NodeList { list_type: Default::default(), marker_offset: 0, padding: 0, start: 0, delimiter: Default::default(), bullet_char: 0, tight: false }));
    let item = AstNode::from(NodeValue::Item(NodeList { list_type: Default::default(), marker_offset: 0, padding: 0, start: 0, delimiter: Default::default(), bullet_char: 0, tight: false }));
    let p = AstNode::from(NodeValue::Paragraph);
    let text = AstNode::from(NodeValue::Text("List item 1".to_string()));
    p.append(&text);
    item.append(&p);
    list.append(&item);
    let item = AstNode::from(NodeValue::Item(NodeList { list_type: Default::default(), marker_offset: 0, padding: 0, start: 0, delimiter: Default::default(), bullet_char: 0, tight: false }));
    let p = AstNode::from(NodeValue::Paragraph);
    let text = AstNode::from(NodeValue::Text("List item 2".to_string()));
    p.append(&text);
    item.append(&p);
    list.append(&item);

    root.append(&list);

    println!("{:#?}", root);

    let mut md = vec![];
    format_commonmark(&root, &Options::default(), &mut md).unwrap();

    String::from_utf8(md).unwrap()
}

fn main() {
    let md = generate_md();

    println!("{}", md);
}