docx_reader/reader/
read_zip.rs

1use std::io::{Cursor, Read};
2
3use super::ReaderError;
4
5pub fn read_zip(
6	archive: &mut zip::read::ZipArchive<Cursor<&[u8]>>,
7	name: &str,
8) -> Result<Vec<u8>, ReaderError> {
9	let p = name.to_owned();
10	// Archives zipped on Windows keep '\' in paths, replace them to avoid zip error.
11	let mut p = str::replace(&p, "\\", "/");
12	if p.starts_with('/') {
13		p.remove(0);
14	}
15	let mut xml = archive.by_name(&p)?;
16	let mut data = vec![];
17	xml.read_to_end(&mut data).unwrap();
18	// Remove BOM
19	if (data[0] == 0xef) && (data[1] == 0xbb) && (data[2] == 0xbf) {
20		data.remove(0);
21		data.remove(0);
22		data.remove(0);
23	}
24	Ok(data)
25}