diff --git a/src/parser/document.rs b/src/parser/document.rs index 0f11d885..65aabc38 100644 --- a/src/parser/document.rs +++ b/src/parser/document.rs @@ -181,8 +181,10 @@ fn _document<'b, 'g, 'r, 's>( let zeroth_section_matcher = parser_with_context!(zeroth_section)(context); let heading_matcher = parser_with_context!(heading(0))(context); let (remaining, _blank_lines) = many0(blank_line)(input)?; + let contents_begin = remaining; let (remaining, zeroth_section) = opt(zeroth_section_matcher)(remaining)?; let (remaining, children) = many0(heading_matcher)(remaining)?; + let contents = get_consumed(contents_begin, remaining); let source = get_consumed(input, remaining); Ok(( remaining, @@ -192,6 +194,11 @@ fn _document<'b, 'g, 'r, 's>( path: None, zeroth_section, children, + contents: if contents.len() > 0 { + Some(Into::<&str>::into(contents)) + } else { + None + }, }, )) } diff --git a/src/types/document.rs b/src/types/document.rs index bfe00833..df27ff76 100644 --- a/src/types/document.rs +++ b/src/types/document.rs @@ -1,6 +1,5 @@ use std::path::PathBuf; -use super::remove_trailing::RemoveTrailing; use super::Element; use super::NodeProperty; use super::Object; @@ -18,6 +17,7 @@ pub struct Document<'s> { pub path: Option, pub zeroth_section: Option>, pub children: Vec>, + pub contents: Option<&'s str>, } #[derive(Debug)] @@ -63,28 +63,7 @@ impl<'s> StandardProperties<'s> for Document<'s> { } fn get_contents<'b>(&'b self) -> Option<&'s str> { - let post_blank = self.get_post_blank(); - let mut content_lines = self - .source - .split_inclusive('\n') - .remove_trailing(post_blank); - let first_line = content_lines.next(); - let last_line = content_lines.last().or(first_line); - match (first_line, last_line) { - (None, None) => None, - (None, Some(_)) | (Some(_), None) => unreachable!(), - (Some(first_line), Some(last_line)) => { - let first_line_offset = first_line.as_ptr() as usize; - let last_line_offset = last_line.as_ptr() as usize + last_line.len(); - let source_offset = self.source.as_ptr() as usize; - debug_assert!(super::lesser_element::is_slice_of(self.source, first_line)); - debug_assert!(super::lesser_element::is_slice_of(self.source, last_line)); - Some( - &self.source[(first_line_offset - source_offset) - ..(last_line_offset - first_line_offset)], - ) - } - } + self.contents } fn get_post_blank(&self) -> PostBlank {