Skip to main content

flexvg/
lib.rs

1#[cfg_attr(feature = "serde", macro_use)]
2#[cfg(feature = "serde")]
3extern crate serde;
4
5pub mod error;
6pub mod prelude;
7pub mod svg;
8pub mod types;
9
10use std::path::Path;
11
12use log::debug;
13use prelude::*;
14use taffy::prelude::Number as SprawlNumber;
15use taffy::prelude::Size as SprawlSize;
16use taffy::prelude::Style as SprawlStyle;
17use taffy::Taffy;
18
19pub fn compute_svg_string(
20    root: FlexNode,
21    base_path: Option<&Path>,
22) -> Result<String, Error> {
23    debug!("root: {:#?}", root);
24    let layout_root = compute_layout_root(root)?;
25    crate::svg::compute_svg_string(layout_root, base_path)
26}
27
28fn compute_layout_root(node: FlexNode) -> Result<FlexGeomNode, Error> {
29    let size = SprawlSize {
30        height: SprawlNumber::Defined(100.0),
31        width: SprawlNumber::Defined(100.0),
32    };
33    let mut taffy = Taffy::new();
34    let stacked_sprawl_root =
35        compute_stacked_sprawl_recursive(node, &mut taffy)?;
36    taffy.compute_layout(stacked_sprawl_root.taffy_node, size)?;
37    let root = compute_layout_root_recursive(stacked_sprawl_root, &mut taffy)?;
38    Ok(root)
39}
40
41fn compute_layout_root_recursive(
42    parent: FlexTaffyNode,
43    taffy: &mut Taffy,
44) -> Result<FlexGeomNode, Error> {
45    let mut children_nodes = vec![];
46    for child in parent.nodes {
47        let layout_node = compute_layout_root_recursive(child, taffy)?;
48        children_nodes.push(layout_node);
49    }
50    let sprawl_layout = taffy.layout(parent.taffy_node)?;
51
52    Ok(FlexGeomNode {
53        element: parent.element,
54        position: FlexPoint {
55            x: sprawl_layout.location.x,
56            y: sprawl_layout.location.y,
57        },
58        width: sprawl_layout.size.width,
59        height: sprawl_layout.size.height,
60        root: parent.root,
61        nodes: children_nodes,
62    })
63}
64
65fn compute_stacked_sprawl_recursive(
66    parent: FlexNode,
67    taffy: &mut Taffy,
68) -> Result<FlexTaffyNode, Error> {
69    let child_len = parent.nodes.len();
70    let mut stacked_sprawl_children = Vec::with_capacity(child_len);
71    let mut sprawl_children = Vec::with_capacity(child_len);
72
73    for child in parent.nodes {
74        let child = compute_stacked_sprawl_recursive(child, taffy)?;
75        sprawl_children.push(child.taffy_node);
76        stacked_sprawl_children.push(child);
77    }
78    let sprawl_node =
79        taffy.new_node(SprawlStyle::from(parent.layout), &sprawl_children)?;
80    debug!("{:?}, {:?}", &sprawl_node, sprawl_children);
81    Ok(FlexTaffyNode {
82        taffy_node: sprawl_node,
83        element: parent.element,
84        root: parent.root,
85        nodes: stacked_sprawl_children,
86    })
87}
88
89#[cfg(test)]
90mod tests {
91
92    use std::sync::Once;
93
94    //use crate::{compute_layout_root, compute_svg_string, StackedConfigNode};
95
96    static INIT: Once = Once::new();
97
98    pub fn initialize() {
99        INIT.call_once(|| {
100            env_logger::init();
101        });
102    }
103
104    #[test]
105    fn simple_diagram_0() {
106        initialize();
107        /*
108               let b = include_bytes!("../examples/hello-world.yaml");
109               let deserialized_point: StackedConfigNode =
110                   serde_yaml::from_slice(b).expect("deserialize from yaml");
111               let node = compute_layout_root(deserialized_point).expect("computed");
112               let svg = svg_string(&node).expect("svg");
113               std::fs::write("tmp.svg", svg).expect("Unable to write file");
114        */
115    }
116}