From 8a284872dccd4bf2e60f4963df63c45888b71a83 Mon Sep 17 00:00:00 2001 From: Alyssa Date: Wed, 21 Jan 2026 12:01:18 -0600 Subject: [PATCH 1/2] use ncx file path as base path for toc --- src/doc.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/doc.rs b/src/doc.rs index 5a52a59..0415769 100644 --- a/src/doc.rs +++ b/src/doc.rs @@ -964,6 +964,12 @@ impl EpubDoc { fn fill_toc(&mut self, id: &str) -> Result<(), DocError> { let toc_res = self.resources.get(id).ok_or(DocError::InvalidEpub)?; // this should be turned into it's own error type, but + let toc_base_path = self.resources.iter().find_map(|(resource_id, resource)| { + match id == resource_id { + true => resource.path.parent(), + false => None, + } + }).ok_or(DocError::InvalidEpub)?; let container = self.archive.get_entry(&toc_res.path)?; let root = xmlutils::XMLReader::parse(container.as_slice())?; @@ -984,14 +990,14 @@ impl EpubDoc { .find("navMap") .ok_or_else(|| XMLError::AttrNotFound("navMap".into()))?; - self.toc.append(&mut self.get_navpoints(&mapnode.borrow())); + self.toc.append(&mut self.get_navpoints(toc_base_path, &mapnode.borrow())); self.toc.sort(); Ok(()) } /// Recursively extract all navpoints from a node. - fn get_navpoints(&self, parent: &xmlutils::XMLNode) -> Vec { + fn get_navpoints(&self, ncx_base_path: &Path, parent: &xmlutils::XMLNode) -> Vec { let mut navpoints = Vec::new(); // TODO: parse metadata (dtb:totalPageCount, dtb:depth, dtb:maxPageNumber) @@ -1006,7 +1012,7 @@ impl EpubDoc { .and_then(|n| n.parse::().ok()); let content = item .find("content") - .and_then(|c| c.borrow().get_attr("src").map(|p| self.root_base.join(p))); + .and_then(|c| c.borrow().get_attr("src").map(|p| ncx_base_path.join(p))); let label = item.find("navLabel").and_then(|l| { l.borrow() @@ -1019,7 +1025,7 @@ impl EpubDoc { let navpoint = NavPoint { label: label_text.clone(), content: content_path.clone(), - children: self.get_navpoints(&item), + children: self.get_navpoints(ncx_base_path, &item), play_order: order, }; navpoints.push(navpoint); From 4612c30bc5655dd46800e3aa12fb548ec659c9b8 Mon Sep 17 00:00:00 2001 From: Alyssa Date: Thu, 22 Jan 2026 10:19:16 -0600 Subject: [PATCH 2/2] simplify toc base path retrieval --- src/doc.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/doc.rs b/src/doc.rs index 0415769..d4f56ba 100644 --- a/src/doc.rs +++ b/src/doc.rs @@ -964,12 +964,7 @@ impl EpubDoc { fn fill_toc(&mut self, id: &str) -> Result<(), DocError> { let toc_res = self.resources.get(id).ok_or(DocError::InvalidEpub)?; // this should be turned into it's own error type, but - let toc_base_path = self.resources.iter().find_map(|(resource_id, resource)| { - match id == resource_id { - true => resource.path.parent(), - false => None, - } - }).ok_or(DocError::InvalidEpub)?; + let toc_base_path = toc_res.path.parent().ok_or(DocError::InvalidEpub)?; let container = self.archive.get_entry(&toc_res.path)?; let root = xmlutils::XMLReader::parse(container.as_slice())?;