diff --git a/src/elements/mod.rs b/src/elements/mod.rs index 3aae97c..32c2d57 100644 --- a/src/elements/mod.rs +++ b/src/elements/mod.rs @@ -89,6 +89,7 @@ pub struct Header { pub(crate) size: u8, pub(crate) line: Line, pub(crate) anchor: String, + pub(crate) plain: String, } #[derive(Clone, Debug)] @@ -508,11 +509,12 @@ impl Section { } impl Header { - pub fn new(content: Line, anchor: String) -> Self { + pub fn new(content: Line, anchor: String, plain: String) -> Self { Self { size: 0, anchor, line: content, + plain, } } diff --git a/src/format/epub/epub_writer.rs b/src/format/epub/epub_writer.rs index 7b6b914..33358d9 100644 --- a/src/format/epub/epub_writer.rs +++ b/src/format/epub/epub_writer.rs @@ -1,4 +1,5 @@ use epub_builder::{EpubBuilder, EpubContent, ReferenceType, Result, ZipLibrary}; +use htmlescape::{encode_attribute, encode_minimal}; use std::cmp::max; use std::collections::HashMap; use std::io; @@ -18,13 +19,13 @@ impl Default for Buffer { impl Read for Buffer { fn read(&mut self, buf: &mut [u8]) -> io::Result { - let length = buf.len(); - let available = self.inner.len(); - let writable = max(length, available); - buf.copy_from_slice(&self.inner[0..writable]); - self.inner = self.inner[writable..self.inner.len()].to_vec(); + let written = buf.write(&self.inner[self.position..])?; - Ok(writable) + self.inner.reverse(); + self.inner.truncate(self.inner.len() - written); + self.inner.reverse(); + + Ok(written) } } @@ -103,6 +104,14 @@ impl EpubWriter { .append(&mut content.as_bytes().to_vec()); } + pub fn escaped_content(&mut self, content: String) { + self.content(encode_minimal(content.as_str())); + } + + pub fn escaped_attribute_content(&mut self, content: String) { + self.content(encode_attribute(content.as_str())); + } + /// Finishes writing the epub pub fn finish(&mut self) -> Result<()> { self.builder.generate(&mut self.inner)?; diff --git a/src/format/epub/mod.rs b/src/format/epub/mod.rs index 4d5fa8b..021c092 100644 --- a/src/format/epub/mod.rs +++ b/src/format/epub/mod.rs @@ -2,7 +2,4 @@ use crate::format::epub::epub_writer::EpubWriter; use std::io; pub mod epub_writer; - -pub trait ToEpub { - fn to_epub(&self, writer: &EpubWriter) -> io::Result<()>; -} +pub mod to_epub; diff --git a/src/parser/line.rs b/src/parser/line.rs index aa9170b..723cefb 100644 --- a/src/parser/line.rs +++ b/src/parser/line.rs @@ -50,12 +50,15 @@ impl ParseLine for Parser { let start_index = self.ctm.get_index(); let line = self.parse_line()?; let mut anchor = String::new(); + self.ctm.get_text()[start_index..self.ctm.get_index()] .iter() .for_each(|e| anchor.push(*e)); + let plain = anchor.clone(); anchor.retain(|c| !c.is_whitespace()); + log::trace!("Line::Header"); - Ok(Header::new(line, anchor)) + Ok(Header::new(line, anchor, plain)) } /// parses a single list item defined with -