@@ -67,6 +67,7 @@ data Chapter = Chapter (Maybe [Int]) [Block]
68data EPUBState = EPUBState {
68data EPUBState = EPUBState {
69 stMediaPaths :: [(FilePath, (FilePath, Maybe Entry))]
69 stMediaPaths :: [(FilePath, (FilePath, Maybe Entry))]
70+ , stMediaNextId :: Int
70 , stEpubSubdir :: String
71 , stEpubSubdir :: String
@@ -390,7 +391,7 @@ writeEPUB epubVersion opts doc = do
390 -- sanity check on epubSubdir
391 -- sanity check on epubSubdir
391 unless (all (\c -> isAscii c && isAlphaNum c) epubSubdir) $
392 unless (all (\c -> isAscii c && isAlphaNum c) epubSubdir) $
392 throwError $ PandocEpubSubdirectoryError epubSubdir
393 throwError $ PandocEpubSubdirectoryError epubSubdir
393− let initState = EPUBState { stMediaPaths = [], stEpubSubdir = epubSubdir }
394+ let initState = EPUBState { stMediaPaths = [], stMediaNextId = 0, stEpubSubdir = epubSubdir }
394 evalStateT (pandocToEPUB epubVersion opts doc) initState
395 evalStateT (pandocToEPUB epubVersion opts doc) initState
396pandocToEPUB :: PandocMonad m
397pandocToEPUB :: PandocMonad m
@@ -994,17 +995,25 @@ modifyMediaRef oldsrc = do
994 Just (n,_) -> return n
995 Just (n,_) -> return n
995 Nothing -> catchError
996 Nothing -> catchError
996 (do (img, mbMime) <- P.fetchItem oldsrc
997 (do (img, mbMime) <- P.fetchItem oldsrc
997− let new = "media/file" ++ show (length media) ++
998− fromMaybe (takeExtension (takeWhile (/='?') oldsrc))
998+ let ext = fromMaybe (takeExtension (takeWhile (/='?') oldsrc))
999− (('.':) <$> (mbMime >>= extensionFromMimeType))
999+ (('.':) <$> (mbMime >>= extensionFromMimeType))
1000+ newName <- getMediaNextNewName ext
1001+ let newPath = "media/" ++ newName
1000− entry <- mkEntry new (B.fromChunks . (:[]) $ img)
1002+ entry <- mkEntry newPath (B.fromChunks . (:[]) $ img)
1001 modify $ \st -> st{ stMediaPaths =
1003 modify $ \st -> st{ stMediaPaths =
1002− (oldsrc, (new, Just entry)):media}
1004+ (oldsrc, (newPath, Just entry)):media}
1003− return new)
1005+ return newPath)
1004 (\e -> do
1006 (\e -> do
1005 report $ CouldNotFetchResource oldsrc (show e)
1007 report $ CouldNotFetchResource oldsrc (show e)
1006 return oldsrc)
1008 return oldsrc)
1010+getMediaNextNewName :: PandocMonad m => String -> E m String
1011+getMediaNextNewName ext = do
1012+ nextId <- gets stMediaNextId
1013+ modify $ \st -> st { stMediaNextId = nextId + 1 }
1014+ let nextName = "file" ++ show nextId ++ ext
1015+ (P.fetchItem nextName >> getMediaNextNewName ext) `catchError` const (return nextName)
1008transformBlock :: PandocMonad m
1017transformBlock :: PandocMonad m
1009 => Block
1018 => Block
1010 -> E m Block
1019 -> E m Block