diff options
author | Jesse Rosenthal <jrosenthal@jhu.edu> | 2016-11-21 10:12:42 -0500 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2017-01-25 17:07:39 +0100 |
commit | 957eee24ec9037a31574503fa1ca939567f23a90 (patch) | |
tree | 01ce8d5b1c253e12de840fed6be6dd102d525239 /src/Text/Pandoc/Writers/EPUB.hs | |
parent | 239880f412f89a6647368d313e21718ade4d89fd (diff) | |
download | pandoc-957eee24ec9037a31574503fa1ca939567f23a90.tar.gz |
Convert writers to use PandocMonad typeclass.
Instead of Free Monad with runIO
Diffstat (limited to 'src/Text/Pandoc/Writers/EPUB.hs')
-rw-r--r-- | src/Text/Pandoc/Writers/EPUB.hs | 49 |
1 files changed, 25 insertions, 24 deletions
diff --git a/src/Text/Pandoc/Writers/EPUB.hs b/src/Text/Pandoc/Writers/EPUB.hs index a0991e27b..397aa5847 100644 --- a/src/Text/Pandoc/Writers/EPUB.hs +++ b/src/Text/Pandoc/Writers/EPUB.hs @@ -28,7 +28,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Conversion of 'Pandoc' documents to EPUB. -} -module Text.Pandoc.Writers.EPUB ( writeEPUB, writeEPUBPure ) where +module Text.Pandoc.Writers.EPUB ( writeEPUB ) where import qualified Data.Map as M import qualified Data.Set as Set import Data.Maybe ( fromMaybe, catMaybes ) @@ -64,8 +64,8 @@ import Data.Char ( toLower, isDigit, isAlphaNum ) import Text.Pandoc.MIME (MimeType, getMimeType, extensionFromMimeType) import Text.Blaze.Html.Renderer.Utf8 (renderHtml) import Text.HTML.TagSoup (Tag(TagOpen), fromAttrib, parseTags) -import Text.Pandoc.Free (PandocAction, runIO) -import qualified Text.Pandoc.Free as P +import Text.Pandoc.Class (PandocMonad) +import qualified Text.Pandoc.Class as P -- A Chapter includes a list of blocks and maybe a section -- number offset. Note, some chapters are unnumbered. The section @@ -76,7 +76,7 @@ data Chapter = Chapter (Maybe [Int]) [Block] data EPUBState = EPUBState { stMediaPaths :: [(FilePath, (FilePath, Maybe Entry))] } -type E = StateT EPUBState PandocAction +type E m = StateT EPUBState m data EPUBMetadata = EPUBMetadata{ epubIdentifier :: [Identifier] @@ -145,7 +145,7 @@ removeNote :: Inline -> Inline removeNote (Note _) = Str "" removeNote x = x -getEPUBMetadata :: WriterOptions -> Meta -> E EPUBMetadata +getEPUBMetadata :: PandocMonad m => WriterOptions -> Meta -> E m EPUBMetadata getEPUBMetadata opts meta = do let md = metadataFromMeta opts meta let elts = onlyElems $ parseXML $ writerEpubMetadata opts @@ -335,23 +335,20 @@ metadataFromMeta opts meta = EPUBMetadata{ _ -> Nothing -- | Produce an EPUB file from a Pandoc document. -writeEPUB :: WriterOptions -- ^ Writer options +writeEPUB :: PandocMonad m + => WriterOptions -- ^ Writer options -> Pandoc -- ^ Document to convert - -> IO B.ByteString -writeEPUB opts doc = runIO $ writeEPUBPure opts doc - -writeEPUBPure :: WriterOptions -- ^ Writer options - -> Pandoc -- ^ Document to convert - -> PandocAction B.ByteString -writeEPUBPure opts doc = + -> m B.ByteString +writeEPUB opts doc = let initState = EPUBState { stMediaPaths = [] } in evalStateT (pandocToEPUB opts doc) initState -pandocToEPUB :: WriterOptions - -> Pandoc - -> E B.ByteString +pandocToEPUB :: PandocMonad m + => WriterOptions + -> Pandoc + -> E m B.ByteString pandocToEPUB opts doc@(Pandoc meta _) = do let version = fromMaybe EPUB2 (writerEpubVersion opts) let epub3 = version == EPUB3 @@ -829,10 +826,11 @@ metadataElement version md currentTime = showDateTimeISO8601 :: UTCTime -> String showDateTimeISO8601 = formatTime defaultTimeLocale "%FT%TZ" -transformTag :: WriterOptions +transformTag :: PandocMonad m + => WriterOptions -- -> IORef [(FilePath, (FilePath, Maybe Entry))] -- ^ (oldpath, newpath, entry) media -> Tag String - -> E (Tag String) + -> E m (Tag String) transformTag opts tag@(TagOpen name attr) | name `elem` ["video", "source", "img", "audio"] && lookup "data-external" attr == Nothing = do @@ -846,9 +844,10 @@ transformTag opts tag@(TagOpen name attr) return $ TagOpen name attr' transformTag _ tag = return tag -modifyMediaRef :: WriterOptions +modifyMediaRef :: PandocMonad m + => WriterOptions -> FilePath - -> E FilePath + -> E m FilePath modifyMediaRef _ "" = return "" modifyMediaRef opts oldsrc = do media <- gets stMediaPaths @@ -872,10 +871,11 @@ modifyMediaRef opts oldsrc = do modify $ \st -> st{ stMediaPaths = (oldsrc, (new, mbEntry)):media} return new -transformBlock :: WriterOptions +transformBlock :: PandocMonad m + => WriterOptions -- -> IORef [(FilePath, (FilePath, Maybe Entry))] -- ^ (oldpath, newpath, entry) media -> Block - -> E Block + -> E m Block transformBlock opts (RawBlock fmt raw) | fmt == Format "html" = do let tags = parseTags raw @@ -883,10 +883,11 @@ transformBlock opts (RawBlock fmt raw) return $ RawBlock fmt (renderTags' tags') transformBlock _ b = return b -transformInline :: WriterOptions +transformInline :: PandocMonad m + => WriterOptions -- -> IORef [(FilePath, (FilePath, Maybe Entry))] -- ^ (oldpath, newpath) media -> Inline - -> E Inline + -> E m Inline transformInline opts (Image attr lab (src,tit)) = do newsrc <- modifyMediaRef opts src return $ Image attr lab (newsrc, tit) |