@@ -34,14 +34,14 @@ Conversion of 'Pandoc' documents to EPUB.
3434module Text.Pandoc.Writers.EPUB ( writeEPUB2, writeEPUB3 ) where
3535import Codec.Archive.Zip (Entry, addEntryToArchive, eRelativePath, emptyArchive,
3636 fromArchive, fromEntry, toEntry)
37−import Control.Monad (mplus, when, zipWithM)
37+import Control.Monad (mplus, when, unless, zipWithM)
3838import Control.Monad.Except (catchError, throwError)
3939import Control.Monad.State.Strict (State, StateT, evalState, evalStateT, get, gets,
4040 lift, modify, put)
4141import qualified Data.ByteString.Lazy as B
4242import qualified Data.ByteString.Lazy.Char8 as B8
4343import qualified Data.Text.Lazy as TL
44−import Data.Char (isAlphaNum, isDigit, toLower)
44+import Data.Char (isAlphaNum, isDigit, toLower, isAscii)
4545import Data.List (intercalate, isInfixOf, isPrefixOf)
4646import qualified Data.Map as M
4747import Data.Maybe (catMaybes, fromMaybe)
@@ -80,7 +80,6 @@ data Chapter = Chapter (Maybe [Int]) [Block]
8080
8181data EPUBState = EPUBState {
8282 stMediaPaths :: [(FilePath, (FilePath, Maybe Entry))]
83− , stEPUBSubdir :: String
8483 }
8584
8685type E m = StateT EPUBState m
@@ -362,9 +361,7 @@ writeEPUB :: PandocMonad m
362361 -> Pandoc -- ^ Document to convert
363362 -> m B.ByteString
364363writeEPUB epubVersion opts doc =
365− let initState = EPUBState { stMediaPaths = []
366− , stEPUBSubdir = "EPUB"
367− }
364+ let initState = EPUBState { stMediaPaths = [] }
368365 in
369366 evalStateT (pandocToEPUB epubVersion opts doc)
370367 initState
@@ -375,7 +372,10 @@ pandocToEPUB :: PandocMonad m
375372 -> Pandoc
376373 -> E m B.ByteString
377374pandocToEPUB version opts doc@(Pandoc meta _) = do
378− epubSubdir <- gets stEPUBSubdir
375+ let epubSubdir = writerEpubSubdirectory opts
376+ -- sanity check on epubSubdir
377+ unless (all (\c -> isAscii c && isAlphaNum c) epubSubdir) $
378+ throwError $ PandocEpubSubdirectoryError epubSubdir
379379 let epub3 = version == EPUB3
380380 let writeHtml o = fmap (UTF8.fromTextLazy . TL.fromStrict) .
381381 writeHtmlStringForEPUB version o
@@ -888,7 +888,7 @@ modifyMediaRef :: PandocMonad m
888888modifyMediaRef _ "" = return ""
889889modifyMediaRef opts oldsrc = do
890890 media <- gets stMediaPaths
891− epubSubdir <- gets stEPUBSubdir
891+ let epubSubdir = writerEpubSubdirectory opts
892892 case lookup oldsrc media of
893893 Just (n,_) -> return n
894894 Nothing -> catchError