@@ -68,6 +68,7 @@ data Chapter = Chapter (Maybe [Int]) [Block]
6868
6969data EPUBState = EPUBState {
7070 stMediaPaths :: [(FilePath, (FilePath, Maybe Entry))]
71+ , stMediaNextId :: Int
7172 , stEpubSubdir :: String
7273 }
7374
@@ -391,7 +392,7 @@ writeEPUB epubVersion opts doc = do
391392 -- sanity check on epubSubdir
392393 unless (all (\c -> isAscii c && isAlphaNum c) epubSubdir) $
393394 throwError $ PandocEpubSubdirectoryError epubSubdir
394− let initState = EPUBState { stMediaPaths = [], stEpubSubdir = epubSubdir }
395+ let initState = EPUBState { stMediaPaths = [], stMediaNextId = 0, stEpubSubdir = epubSubdir }
395396 evalStateT (pandocToEPUB epubVersion opts doc) initState
396397
397398pandocToEPUB :: PandocMonad m
@@ -1004,17 +1005,25 @@ modifyMediaRef oldsrc = do
10041005 Just (n,_) -> return n
10051006 Nothing -> catchError
10061007 (do (img, mbMime) <- P.fetchItem oldsrc
1007− let new = "media/file" ++ show (length media) ++
1008− fromMaybe (takeExtension (takeWhile (/='?') oldsrc))
1009− (('.':) <$> (mbMime >>= extensionFromMimeType))
1010− entry <- mkEntry new (B.fromChunks . (:[]) $ img)
1008+ let ext = fromMaybe (takeExtension (takeWhile (/='?') oldsrc))
1009+ (('.':) <$> (mbMime >>= extensionFromMimeType))
1010+ newName <- getMediaNextNewName ext
1011+ let newPath = "media/" ++ newName
1012+ entry <- mkEntry newPath (B.fromChunks . (:[]) $ img)
10111013 modify $ \st -> st{ stMediaPaths =
1012− (oldsrc, (new, Just entry)):media}
1013− return new)
1014+ (oldsrc, (newPath, Just entry)):media}
1015+ return newPath)
10141016 (\e -> do
10151017 report $ CouldNotFetchResource oldsrc (show e)
10161018 return oldsrc)
10171019
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)
1026+
10181027transformBlock :: PandocMonad m
10191028 => Block
10201029 -> E m Block