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