diff --git a/src/lib.rs b/src/lib.rs index c66b6dd..4d0e8dd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -219,9 +219,11 @@ mod config; pub mod elements; pub mod export; +mod node; mod org; mod parsers; pub use config::ParseConfig; pub use elements::Element; +pub use node::HeadlineNode; pub use org::Org; diff --git a/src/node.rs b/src/node.rs new file mode 100644 index 0000000..a229f66 --- /dev/null +++ b/src/node.rs @@ -0,0 +1,27 @@ +use indextree::NodeId; + +use crate::elements::{Element, Title}; +use crate::Org; + +#[derive(Copy, Clone)] +pub struct HeadlineNode(pub(crate) NodeId); + +impl HeadlineNode { + pub fn get_title<'a>(self, org: &'a Org<'a>) -> &'a Title<'a> { + let title_node = org.arena[self.0].first_child().unwrap(); + if let Element::Title(title) = org.arena[title_node].get() { + title + } else { + unreachable!() + } + } + + pub fn get_title_mut<'a>(self, org: &'a mut Org<'a>) -> &'a mut Title<'a> { + let title_node = org.arena[self.0].first_child().unwrap(); + if let Element::Title(title) = org.arena[title_node].get_mut() { + title + } else { + unreachable!() + } + } +} diff --git a/src/org.rs b/src/org.rs index ecd6315..0b41698 100644 --- a/src/org.rs +++ b/src/org.rs @@ -2,12 +2,13 @@ use indextree::{Arena, NodeEdge, NodeId}; use std::io::{Error, Write}; use crate::config::ParseConfig; -use crate::elements::*; +use crate::elements::Element; use crate::export::*; +use crate::node::HeadlineNode; use crate::parsers::*; pub struct Org<'a> { - arena: Arena>, + pub(crate) arena: Arena>, document: NodeId, } @@ -68,6 +69,18 @@ impl Org<'_> { }) } + pub fn headlines(&self) -> Vec { + self.document + .descendants(&self.arena) + .skip(1) + .filter(|&node| match self.arena[node].get() { + Element::Headline => true, + _ => false, + }) + .map(|node| HeadlineNode(node)) + .collect() + } + pub fn html(&self, wrtier: W) -> Result<(), Error> { self.html_with_handler(wrtier, DefaultHtmlHandler) }