@@ -35,7 +35,7 @@ import Data.Maybe ( fromMaybe )
3535import Data.List ( isInfixOf, intercalate )
3636import System.Environment ( getEnv )
3737import Text.Printf (printf)
38−import System.FilePath ( (</>), takeBaseName, takeExtension, takeFileName )
38+import System.FilePath ( (</>), takeExtension, takeFileName )
3939import qualified Data.ByteString.Lazy as B
4040import qualified Data.ByteString.Lazy.Char8 as B8
4141import qualified Text.Pandoc.UTF8 as UTF8
@@ -56,7 +56,7 @@ import Text.XML.Light hiding (ppTopElement)
5656import Text.Pandoc.UUID
5757import Text.Pandoc.Writers.HTML
5858import Text.Pandoc.Writers.Markdown ( writePlain )
59−import Data.Char ( toLower, isDigit )
59+import Data.Char ( toLower, isDigit, isAlphaNum )
6060import Network.URI ( unEscapeString )
6161import Text.Pandoc.MIME (getMimeType)
6262#if MIN_VERSION_base(4,6,0)
@@ -132,6 +132,11 @@ removeNote :: Inline -> Inline
132132removeNote (Note _) = Str ""
133133removeNote x = x
134134
135+toId :: FilePath -> String
136+toId = map (\x -> if isAlphaNum x || x == '-' || x == '_'
137+ then x
138+ else '_') . takeFileName
139+
135140getEPUBMetadata :: WriterOptions -> Meta -> IO EPUBMetadata
136141getEPUBMetadata opts meta = do
137142 let md = metadataFromMeta opts meta
@@ -427,7 +432,7 @@ writeEPUB opts doc@(Pandoc meta _) = do
427432
428433 -- contents.opf
429434 let chapterNode ent = unode "item" !
430− ([("id", takeBaseName $ eRelativePath ent),
435+ ([("id", toId $ eRelativePath ent),
431436 ("href", eRelativePath ent),
432437 ("media-type", "application/xhtml+xml")]
433438 ++ case props ent of
@@ -435,14 +440,14 @@ writeEPUB opts doc@(Pandoc meta _) = do
435440 xs -> [("properties", unwords xs)])
436441 $ ()
437442 let chapterRefNode ent = unode "itemref" !
438− [("idref", takeBaseName $ eRelativePath ent)] $ ()
443+ [("idref", takeFileName $ eRelativePath ent)] $ ()
439444 let pictureNode ent = unode "item" !
440− [("id", takeBaseName $ eRelativePath ent),
445+ [("id", toId $ eRelativePath ent),
441446 ("href", eRelativePath ent),
442447 ("media-type", fromMaybe "application/octet-stream"
443448 $ mediaTypeOf $ eRelativePath ent)] $ ()
444449 let fontNode ent = unode "item" !
445− [("id", takeBaseName $ eRelativePath ent),
450+ [("id", toId $ eRelativePath ent),
446451 ("href", eRelativePath ent),
447452 ("media-type", fromMaybe "" $ getMimeType $ eRelativePath ent)] $ ()
448453 let plainTitle = case docTitle meta of