From b5104290d489c4998aac1685d1bdd3c17dc1f5d2 Mon Sep 17 00:00:00 2001 From: robin Date: Fri, 27 Apr 2018 15:00:13 +0700 Subject: [PATCH] [Added] support for ods file. --- samples/sample.ods | Bin 0 -> 46456 bytes src/lib.rs | 4 +- src/ods.rs | 113 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 samples/sample.ods create mode 100644 src/ods.rs diff --git a/samples/sample.ods b/samples/sample.ods new file mode 100644 index 0000000000000000000000000000000000000000..9d25185a97bbef13165c3673b162e8b538e5d29e GIT binary patch literal 46456 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 literal 0 HcmV?d00001 diff --git a/src/lib.rs b/src/lib.rs index 6b7b043..53c2a3c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -32,10 +32,12 @@ pub mod xlsx; pub mod pptx; pub mod odt; pub mod odp; +pub mod ods; pub use doc::MsDoc; pub use docx::Docx; pub use xlsx::Xlsx; pub use pptx::Pptx; pub use odt::Odt; -pub use odp::Odp; \ No newline at end of file +pub use odp::Odp; +pub use ods::Ods; diff --git a/src/ods.rs b/src/ods.rs new file mode 100644 index 0000000..af79e84 --- /dev/null +++ b/src/ods.rs @@ -0,0 +1,113 @@ + +use zip::ZipArchive; + +use xml::reader::Reader; +use xml::events::Event; + +use std::path::{Path, PathBuf}; +use std::fs::File; +use std::io::prelude::*; +use std::io::Cursor; +use std::io; +use std::clone::Clone; +use zip::read::ZipFile; + +use doc::{OpenOfficeDoc, HasKind}; + +pub struct Ods { + path: PathBuf, + data: Cursor +} + +impl HasKind for Ods { + fn kind(&self) -> &'static str { + "Open Office Spreadsheet" + } + + fn ext(&self) -> &'static str { + "ods" + } +} + +impl OpenOfficeDoc for Ods { + + fn open>(path: P) -> io::Result { + let file = File::open(path.as_ref())?; + let mut archive = ZipArchive::new(file)?; + + let mut xml_data = String::new(); + + for i in 0..archive.len(){ + let mut c_file = archive.by_index(i).unwrap(); + if c_file.name() == "content.xml" { + c_file.read_to_string(&mut xml_data); + break + } + } + + let mut xml_reader = Reader::from_str(xml_data.as_ref()); + + let mut buf = Vec::new(); + let mut txt = Vec::new(); + + if xml_data.len() > 0 { + let mut to_read = false; + loop { + match xml_reader.read_event(&mut buf){ + Ok(Event::Start(ref e)) => { + match e.name() { + b"text:p" => { + to_read = true; + txt.push("\n\n".to_string()); + }, + _ => (), + } + }, + Ok(Event::Text(e)) => { + if to_read { + txt.push(e.unescape_and_decode(&xml_reader).unwrap()); + to_read = false; + } + }, + Ok(Event::Eof) => break, + Err(e) => panic!("Error at position {}: {:?}", xml_reader.buffer_position(), e), + _ => (), + } + } + } + + Ok( + Ods { + path: path.as_ref().to_path_buf(), + data: Cursor::new(txt.join("")) + } + ) + } +} + +impl Read for Ods { + fn read(&mut self, buf: &mut [u8]) -> io::Result { + self.data.read(buf) + } +} + + +#[cfg(test)] +mod tests { + use std::path::{Path, PathBuf}; + use super::*; + + #[test] + fn instantiate(){ + let _ = Ods::open(Path::new("samples/sample.ods")); + } + + #[test] + fn read(){ + let mut f = Ods::open(Path::new("samples/sample.ods")).unwrap(); + + let mut data = String::new(); + let len = f.read_to_string(&mut data).unwrap(); + println!("len: {}, data: {}", len, data); + } +}