git.iko.soy/typeable/pandoc
on master help sign in
HTML writer: export writeHtmlStringForEPUB.

Options: Remove writerEPUBVersion.

commitf5dd1238198450c4917707214f19e2f0da8c3cb4 authorJohn MacFarlane <jgm@berkeley.edu> dateFri 27 Jan 2017, 10:27 (10 years ago) parentb6c1d49
3 files changed+42−28
src/Text/Pandoc/Options.hs−2 src/Text/Pandoc/Writers/EPUB.hs+16−20 src/Text/Pandoc/Writers/HTML.hs+26−6
src/Text/Pandoc/Options.hs−2
@@ -175,7 +175,6 @@ data WriterOptions = WriterOptions
175175 , writerHighlightStyle :: Maybe Style -- ^ Style to use for highlighting
176176 -- (Nothing = no highlighting)
177177 , writerSetextHeaders :: Bool -- ^ Use setext headers for levels 1-2 in markdown
178− , writerEpubVersion :: Maybe EPUBVersion -- ^ Nothing or EPUB version
179178 , writerEpubMetadata :: String -- ^ Metadata to include in EPUB
180179 , writerEpubStylesheet :: Maybe String -- ^ EPUB stylesheet specified at command line
181180 , writerEpubFonts :: [FilePath] -- ^ Paths to fonts to embed
@@ -214,7 +213,6 @@ instance Default WriterOptions where
214213 , writerListings = False
215214 , writerHighlightStyle = Just pygments
216215 , writerSetextHeaders = True
217− , writerEpubVersion = Nothing
218216 , writerEpubMetadata = ""
219217 , writerEpubStylesheet = Nothing
220218 , writerEpubFonts = []
src/Text/Pandoc/Writers/EPUB.hs+16−20
@@ -59,10 +59,9 @@ import Control.Monad (mplus, when, zipWithM)
5959import Text.XML.Light ( unode, Element(..), unqual, Attr(..), add_attrs
6060 , strContent, lookupAttr, Node(..), QName(..), parseXML
6161 , onlyElems, node, ppElement)
62−import Text.Pandoc.Writers.HTML ( writeHtml4, writeHtml5 )
62+import Text.Pandoc.Writers.HTML ( writeHtmlStringForEPUB )
6363import Data.Char ( toLower, isDigit, isAlphaNum )
6464import Text.Pandoc.MIME (MimeType, getMimeType, extensionFromMimeType)
65−import Text.Blaze.Html.Renderer.Utf8 (renderHtml)
6665import Text.HTML.TagSoup (Tag(TagOpen), fromAttrib, parseTags)
6766import Control.Monad.Except (throwError, catchError)
6867import Text.Pandoc.Error
@@ -361,16 +360,18 @@ writeEPUB epubVersion opts doc =
361360 let initState = EPUBState { stMediaPaths = []
362361 }
363362 in
364− evalStateT (pandocToEPUB opts{ writerEpubVersion = Just epubVersion } doc)
363+ evalStateT (pandocToEPUB epubVersion opts doc)
365364 initState
366365
367366pandocToEPUB :: PandocMonad m
368− => WriterOptions
367+ => EPUBVersion
368+ -> WriterOptions
369369 -> Pandoc
370370 -> E m B.ByteString
371−pandocToEPUB opts doc@(Pandoc meta _) = do
372− let version = fromMaybe EPUB2 (writerEpubVersion opts)
373− let epub3 = writerEpubVersion opts == Just EPUB3
371+pandocToEPUB version opts doc@(Pandoc meta _) = do
372+ let epub3 = version == EPUB3
373+ let writeHtml o = fmap UTF8.fromStringLazy .
374+ writeHtmlStringForEPUB version o
374375 epochtime <- floor <$> lift P.getPOSIXTime
375376 let mkEntry path content = toEntry path epochtime content
376377 let vars = ("epub3", if epub3 then "true" else "false")
@@ -384,9 +385,6 @@ pandocToEPUB opts doc@(Pandoc meta _) = do
384385 then MathML Nothing
385386 else writerHTMLMathMethod opts
386387 , writerWrapText = WrapAuto }
387− let writeHtml = if epub3
388− then writeHtml5
389− else writeHtml4
390388 metadata <- getEPUBMetadata opts' meta
391389
392390 -- cover page
@@ -395,17 +393,17 @@ pandocToEPUB opts doc@(Pandoc meta _) = do
395393 Nothing -> return ([],[])
396394 Just img -> do
397395 let coverImage = "media/" ++ takeFileName img
398− cpContent <- renderHtml <$> (lift $ writeHtml
396+ cpContent <- lift $ writeHtml
399397 opts'{ writerVariables = ("coverpage","true"):vars }
400− (Pandoc meta [RawBlock (Format "html") $ "<div id=\"cover-image\">\n<img src=\"" ++ coverImage ++ "\" alt=\"cover image\" />\n</div>"]))
398+ (Pandoc meta [RawBlock (Format "html") $ "<div id=\"cover-image\">\n<img src=\"" ++ coverImage ++ "\" alt=\"cover image\" />\n</div>"])
401399 imgContent <- lift $ P.readFileLazy img
402400 return ( [mkEntry "cover.xhtml" cpContent]
403401 , [mkEntry coverImage imgContent] )
404402
405403 -- title page
406− tpContent <- renderHtml <$> (lift $ writeHtml opts'{
404+ tpContent <- lift $ writeHtml opts'{
407405 writerVariables = ("titlepage","true"):vars }
408− (Pandoc meta []))
406+ (Pandoc meta [])
409407 let tpEntry = mkEntry "title_page.xhtml" tpContent
410408
411409 -- handle pictures
@@ -504,9 +502,8 @@ pandocToEPUB opts doc@(Pandoc meta _) = do
504502 chapters'
505503
506504 let chapToEntry num (Chapter mbnum bs) =
507− (mkEntry (showChapter num) . renderHtml) <$>
508− (writeHtml opts'{ writerNumberOffset =
509− fromMaybe [] mbnum }
505+ mkEntry (showChapter num) <$>
506+ (writeHtml opts'{ writerNumberOffset = fromMaybe [] mbnum }
510507 $ case bs of
511508 (Header _ _ xs : _) ->
512509 -- remove notes or we get doubled footnotes
@@ -702,11 +699,10 @@ pandocToEPUB opts doc@(Pandoc meta _) = do
702699 ]
703700 ]
704701 else []
705− navData <- renderHtml <$> (lift $ writeHtml
706− opts'{ writerVariables = ("navpage","true"):vars }
702+ navData <- lift $ writeHtml opts'{ writerVariables = ("navpage","true"):vars }
707703 (Pandoc (setMeta "title"
708704 (walk removeNote $ fromList $ docTitle' meta) nullMeta)
709− (navBlocks ++ landmarks)))
705+ (navBlocks ++ landmarks))
710706 let navEntry = mkEntry "nav.xhtml" navData
711707
712708 -- mimetype
src/Text/Pandoc/Writers/HTML.hs+26−6
@@ -29,8 +29,12 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2929Conversion of 'Pandoc' documents to HTML.
3030-}
3131module Text.Pandoc.Writers.HTML (
32− writeHtml4, writeHtml4String,
33− writeHtml5, writeHtml5String ) where
32+ writeHtml4,
33+ writeHtml4String,
34+ writeHtml5,
35+ writeHtml5String,
36+ writeHtmlStringForEPUB
37+ ) where
3438import Text.Pandoc.Definition
3539import Text.Pandoc.Walk
3640import Data.Monoid ((<>))
@@ -83,12 +87,14 @@ data WriterState = WriterState
8387 , stSecNum :: [Int] -- ^ Number of current section
8488 , stElement :: Bool -- ^ Processing an Element
8589 , stHtml5 :: Bool -- ^ Use HTML5
90+ , stEPUBVersion :: Maybe EPUBVersion -- ^ EPUB version if for epub
8691 }
8792
8893defaultWriterState :: WriterState
8994defaultWriterState = WriterState {stNotes= [], stMath = False, stQuotes = False,
9095 stHighlighting = False, stSecNum = [],
91− stElement = False, stHtml5 = False}
96+ stElement = False, stHtml5 = False,
97+ stEPUBVersion = Nothing}
9298
9399-- Helpers to render HTML with the appropriate function.
94100
@@ -121,6 +127,18 @@ writeHtml4String = writeHtmlString' False
121127writeHtml4 :: PandocMonad m => WriterOptions -> Pandoc -> m Html
122128writeHtml4 = writeHtml' False
123129
130+-- | Convert Pandoc document to Html appropriate for an epub version.
131+writeHtmlStringForEPUB :: PandocMonad m
132+ => EPUBVersion -> WriterOptions -> Pandoc -> m String
133+writeHtmlStringForEPUB version opts d = do
134+ (body, context) <- evalStateT (pandocToHtml opts d)
135+ defaultWriterState{ stHtml5 = version == EPUB3,
136+ stEPUBVersion = Just version }
137+ return $ case writerTemplate opts of
138+ Nothing -> renderHtml body
139+ Just tpl -> renderTemplate' tpl $
140+ defField "body" (renderHtml body) context
141+
124142writeHtmlString' :: PandocMonad m => Bool -> WriterOptions -> Pandoc -> m String
125143writeHtmlString' html5 opts d = do
126144 (body, context) <- evalStateT (pandocToHtml opts d)
@@ -892,6 +910,7 @@ inlineToHtml opts inline = do
892910 let number = (length notes) + 1
893911 let ref = show number
894912 htmlContents <- blockListToNote opts ref contents
913+ epubVersion <- gets stEPUBVersion
895914 -- push contents onto front of notes
896915 modify $ \st -> st {stNotes = (htmlContents:notes)}
897916 let revealSlash = ['/' | writerSlideVariant opts
@@ -901,11 +920,11 @@ inlineToHtml opts inline = do
901920 writerIdentifierPrefix opts ++ "fn" ++ ref)
902921 ! A.class_ "footnoteRef"
903922 ! prefixedId opts ("fnref" ++ ref)
904− $ (if isJust (writerEpubVersion opts)
923+ $ (if isJust epubVersion
905924 then id
906925 else H.sup)
907926 $ toHtml ref
908− return $ case writerEpubVersion opts of
927+ return $ case epubVersion of
909928 Just EPUB3 -> link ! customAttribute "epub:type" "noteref"
910929 _ -> link
911930 (Cite cits il)-> do contents <- inlineListToHtml opts il
@@ -933,7 +952,8 @@ blockListToNote opts ref blocks =
933952 Plain backlink]
934953 in do contents <- blockListToHtml opts blocks'
935954 let noteItem = H.li ! (prefixedId opts ("fn" ++ ref)) $ contents
936− let noteItem' = case writerEpubVersion opts of
955+ epubVersion <- gets stEPUBVersion
956+ let noteItem' = case epubVersion of
937957 Just EPUB3 -> noteItem ! customAttribute "epub:type" "footnote"
938958 _ -> noteItem
939959 return $ nl opts >> noteItem'