diff --git a/src/lib.rs b/src/lib.rs index 13a99c4..19944bb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,9 +6,8 @@ use jotdown::{Container, Event, ListKind}; pub use jotdown; use range_map::RangeMap; -pub struct JotdownBufferIter<'a, 'b, T: Iterator>> { +pub struct JotdownBufferIter<'a, T: Iterator>> { djot: T, - font_system: &'b mut FontSystem, width: f32, metrics: Metrics, indent: Vec, @@ -16,7 +15,7 @@ pub struct JotdownBufferIter<'a, 'b, T: Iterator>> { struct JotdownIntoBuffer<'a, 'b, T: Iterator>> { djot: &'b mut T, - attrs: Attrs<'a>, + attrs: Attrs<'static>, metrics: Metrics, indent: &'b mut Vec, image_url: Option>, @@ -35,7 +34,7 @@ pub struct Indent { pub const INDENT_AMOUNT: f32 = 18.0; impl<'a, 'b, T: Iterator>> Iterator for JotdownIntoBuffer<'a, 'b, T> { - type Item = (&'a str, Attrs<'a>); + type Item = (&'a str, Attrs<'static>); fn next(&mut self) -> Option { while let Some(event) = self.djot.next() { @@ -138,17 +137,34 @@ impl<'a, 'b, T: Iterator>> Iterator for JotdownIntoBuffer<'a, ' pub struct JotdownItem<'a> { pub indent: Indent, - pub buffer: Buffer, + pub buffer: Vec<(&'a str, Attrs<'static>)>, + pub metrics: Metrics, pub image_url: Option>, pub url_map: Option>, + pub width: f32, } -impl<'a, 'b, T: Iterator>> Iterator for JotdownBufferIter<'a, 'b, T> { +impl<'a> JotdownItem<'a> { + pub fn make_buffer(&self, font_system: &mut FontSystem) -> Buffer { + let mut buffer = Buffer::new(font_system, self.metrics); + buffer.set_rich_text( + font_system, + self.buffer.iter().cloned(), + Attrs::new().family(Family::SansSerif), + Shaping::Advanced, + ); + + buffer.set_wrap(font_system, cosmic_text::Wrap::WordOrGlyph); + buffer.set_size(font_system, self.width - self.indent.indent, f32::MAX); + buffer.shape_until_scroll(font_system, false); + buffer + } +} + +impl<'a, T: Iterator>> Iterator for JotdownBufferIter<'a, T> { type Item = JotdownItem<'a>; fn next(&mut self) -> Option { - let mut buffer = Buffer::new(&mut self.font_system, self.metrics); - let mut jot = JotdownIntoBuffer { djot: &mut self.djot, attrs: Attrs::new().family(Family::SansSerif), @@ -161,25 +177,15 @@ impl<'a, 'b, T: Iterator>> Iterator for JotdownBufferIter<'a, ' urls: Vec::new(), }; - buffer.set_rich_text( - &mut self.font_system, - &mut jot, - Attrs::new().family(Family::SansSerif), - Shaping::Advanced, - ); - - buffer.set_wrap(&mut self.font_system, cosmic_text::Wrap::WordOrGlyph); - buffer.set_metrics(&mut self.font_system, jot.metrics); + let buffer: Vec<(&str, Attrs<'static>)> = (&mut jot).collect(); let image_url = jot.image_url; let urls = jot.urls; let added = jot.added; + let metrics = jot.metrics; let indent = self.indent.last().copied().unwrap_or_default(); - buffer.set_size(&mut self.font_system, self.width - indent.indent, f32::MAX); - if !added { return None; } else { - buffer.shape_until_scroll(&mut self.font_system, true); return Some(JotdownItem { indent, url_map: if urls.is_empty() { @@ -189,20 +195,20 @@ impl<'a, 'b, T: Iterator>> Iterator for JotdownBufferIter<'a, ' }, buffer, image_url, + metrics, + width: self.width, }); } } } -pub fn jotdown_into_buffers<'a, 'b, T: Iterator>>( +pub fn jotdown_into_buffers<'a, T: Iterator>>( djot: T, - font_system: &'b mut FontSystem, metrics: Metrics, width: f32, -) -> JotdownBufferIter<'a, 'b, T> { +) -> JotdownBufferIter<'a, T> { JotdownBufferIter { djot, - font_system, width, metrics, indent: Vec::new(),