git.iko.soy/typeable/pandoc
on master help sign in
EPUB writer: include extension in epub ids.
e068871John MacFarlane
src/Text/Pandoc/Writers/EPUB.hs+11−6
@@ -35,7 +35,7 @@ import Data.Maybe ( fromMaybe )
35import Data.List ( isInfixOf, intercalate )
35import Data.List ( isInfixOf, intercalate )
36import System.Environment ( getEnv )
36import System.Environment ( getEnv )
37import Text.Printf (printf)
37import Text.Printf (printf)
38−import System.FilePath ( (</>), takeBaseName, takeExtension, takeFileName )
38+import System.FilePath ( (</>), takeExtension, takeFileName )
39import qualified Data.ByteString.Lazy as B
39import qualified Data.ByteString.Lazy as B
40import qualified Data.ByteString.Lazy.Char8 as B8
40import qualified Data.ByteString.Lazy.Char8 as B8
41import qualified Text.Pandoc.UTF8 as UTF8
41import qualified Text.Pandoc.UTF8 as UTF8
@@ -56,7 +56,7 @@ import Text.XML.Light hiding (ppTopElement)
56import Text.Pandoc.UUID
56import Text.Pandoc.UUID
57import Text.Pandoc.Writers.HTML
57import Text.Pandoc.Writers.HTML
58import Text.Pandoc.Writers.Markdown ( writePlain )
58import Text.Pandoc.Writers.Markdown ( writePlain )
59−import Data.Char ( toLower, isDigit )
59+import Data.Char ( toLower, isDigit, isAlphaNum )
60import Network.URI ( unEscapeString )
60import Network.URI ( unEscapeString )
61import Text.Pandoc.MIME (getMimeType)
61import Text.Pandoc.MIME (getMimeType)
62#if MIN_VERSION_base(4,6,0)
62#if MIN_VERSION_base(4,6,0)
@@ -132,6 +132,11 @@ removeNote :: Inline -> Inline
132removeNote (Note _) = Str ""
132removeNote (Note _) = Str ""
133removeNote x = x
133removeNote x = x
134
134
135+toId :: FilePath -> String
136+toId = map (\x -> if isAlphaNum x || x == '-' || x == '_'
137+ then x
138+ else '_') . takeFileName
139+
135getEPUBMetadata :: WriterOptions -> Meta -> IO EPUBMetadata
140getEPUBMetadata :: WriterOptions -> Meta -> IO EPUBMetadata
136getEPUBMetadata opts meta = do
141getEPUBMetadata opts meta = do
137 let md = metadataFromMeta opts meta
142 let md = metadataFromMeta opts meta
@@ -427,7 +432,7 @@ writeEPUB opts doc@(Pandoc meta _) = do
427
432
428 -- contents.opf
433 -- contents.opf
429 let chapterNode ent = unode "item" !
434 let chapterNode ent = unode "item" !
430− ([("id", takeBaseName $ eRelativePath ent),
435+ ([("id", toId $ eRelativePath ent),
431 ("href", eRelativePath ent),
436 ("href", eRelativePath ent),
432 ("media-type", "application/xhtml+xml")]
437 ("media-type", "application/xhtml+xml")]
433 ++ case props ent of
438 ++ case props ent of
@@ -435,14 +440,14 @@ writeEPUB opts doc@(Pandoc meta _) = do
435 xs -> [("properties", unwords xs)])
440 xs -> [("properties", unwords xs)])
436 $ ()
441 $ ()
437 let chapterRefNode ent = unode "itemref" !
442 let chapterRefNode ent = unode "itemref" !
438− [("idref", takeBaseName $ eRelativePath ent)] $ ()
443+ [("idref", takeFileName $ eRelativePath ent)] $ ()
439 let pictureNode ent = unode "item" !
444 let pictureNode ent = unode "item" !
440− [("id", takeBaseName $ eRelativePath ent),
445+ [("id", toId $ eRelativePath ent),
441 ("href", eRelativePath ent),
446 ("href", eRelativePath ent),
442 ("media-type", fromMaybe "application/octet-stream"
447 ("media-type", fromMaybe "application/octet-stream"
443 $ mediaTypeOf $ eRelativePath ent)] $ ()
448 $ mediaTypeOf $ eRelativePath ent)] $ ()
444 let fontNode ent = unode "item" !
449 let fontNode ent = unode "item" !
445− [("id", takeBaseName $ eRelativePath ent),
450+ [("id", toId $ eRelativePath ent),
446 ("href", eRelativePath ent),
451 ("href", eRelativePath ent),
447 ("media-type", fromMaybe "" $ getMimeType $ eRelativePath ent)] $ ()
452 ("media-type", fromMaybe "" $ getMimeType $ eRelativePath ent)] $ ()
448 let plainTitle = case docTitle meta of
453 let plainTitle = case docTitle meta of