From 0a43a512053a2f1fa4e9e91837b52bec3b88c461 Mon Sep 17 00:00:00 2001 From: Marko Andjelic Date: Wed, 11 Feb 2026 03:07:49 +0000 Subject: [PATCH] epub3 nav support --- app/EpubParser.hs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/EpubParser.hs b/app/EpubParser.hs index b15c958..68ab427 100644 --- a/app/EpubParser.hs +++ b/app/EpubParser.hs @@ -25,7 +25,7 @@ import Data.Maybe (fromMaybe) import qualified Data.Text as T import qualified Data.Text.Encoding as TE import System.FilePath (normalise, takeDirectory, ()) -import Text.HTML.Scalpel (Scraper, ScraperT, anySelector, attr, chroot, chroots, html, innerHTML, scrapeStringLike, text) +import Text.HTML.Scalpel (Scraper, ScraperT, anySelector, attr, chroot, chroots, html, innerHTML, scrapeStringLike, text, (@:), (@=)) import Types (Chapter (..), EpubAction, EpubEnv (..)) openEpub :: FilePath -> IO (Either String EpubEnv) @@ -87,6 +87,7 @@ resolveSpine = do Right (DSpin.Spine maybeTocId refs) -> do let lookupHref ident = DMan.mfiHref <$> find (\mi -> DMan.mfiId mi == ident) items let maybeTocPath = lookupHref maybeTocId + let mNav = scrapeStringLike xmlStr navFinder tocMap <- case maybeTocPath of Nothing -> pure [] @@ -156,3 +157,7 @@ chapterScraper = do title <- chTitleScraper <|> pure "Untitled Chapter" content <- chroot "body" (innerHTML anySelector) <|> innerHTML anySelector pure (title, content) + +-- needed for epub3 support, find the nav file +navFinder :: Scraper String FilePath +navFinder = attr "href" ("item" @: ["properties" @= "nav"])