@@ -45,6 +45,8 @@ module Text.Pandoc.Writers.HTML (
46import Control.Monad.State
46import Control.Monad.State
47import Data.Char (ord, toLower)
47import Data.Char (ord, toLower)
48+import Data.Text (Text)
49+import qualified Data.Text.Lazy as TL
48import Data.List (intersperse, isPrefixOf)
50import Data.List (intersperse, isPrefixOf)
49import Data.Maybe (catMaybes, fromMaybe, isJust, isNothing)
51import Data.Maybe (catMaybes, fromMaybe, isJust, isNothing)
50import Data.Monoid ((<>))
52import Data.Monoid ((<>))
@@ -67,7 +69,7 @@ import Text.Pandoc.Writers.Shared
67import Text.Pandoc.XML (escapeStringForXML, fromEntities)
69import Text.Pandoc.XML (escapeStringForXML, fromEntities)
68#if MIN_VERSION_blaze_markup(0,6,3)
70#if MIN_VERSION_blaze_markup(0,6,3)
70−import Text.Blaze.Internal (preEscapedString)
72+import Text.Blaze.Internal (preEscapedString, preEscapedText)
72#if MIN_VERSION_blaze_html(0,5,1)
74#if MIN_VERSION_blaze_html(0,5,1)
73import qualified Text.Blaze.XHtml5 as H5
75import qualified Text.Blaze.XHtml5 as H5
@@ -77,7 +79,7 @@ import qualified Text.Blaze.Html5 as H5
77import Control.Monad.Except (throwError)
79import Control.Monad.Except (throwError)
78import Data.Aeson (Value)
80import Data.Aeson (Value)
79import System.FilePath (takeExtension, takeBaseName)
81import System.FilePath (takeExtension, takeBaseName)
80−import Text.Blaze.Html.Renderer.String (renderHtml)
82+import Text.Blaze.Html.Renderer.Text (renderHtml)
81import qualified Text.Blaze.XHtml1.Transitional as H
83import qualified Text.Blaze.XHtml1.Transitional as H
82import qualified Text.Blaze.XHtml1.Transitional.Attributes as A
84import qualified Text.Blaze.XHtml1.Transitional.Attributes as A
83import Text.Pandoc.Class (PandocMonad, report)
85import Text.Pandoc.Class (PandocMonad, report)
@@ -123,7 +125,7 @@ nl opts = if writerWrapText opts == WrapNone
123 else preEscapedString "\n"
125 else preEscapedString "\n"
125-- | Convert Pandoc document to Html 5 string.
127-- | Convert Pandoc document to Html 5 string.
126−writeHtml5String :: PandocMonad m => WriterOptions -> Pandoc -> m String
128+writeHtml5String :: PandocMonad m => WriterOptions -> Pandoc -> m Text
127writeHtml5String = writeHtmlString'
129writeHtml5String = writeHtmlString'
128 defaultWriterState{ stHtml5 = True }
130 defaultWriterState{ stHtml5 = True }
@@ -132,7 +134,7 @@ writeHtml5 :: PandocMonad m => WriterOptions -> Pandoc -> m Html
132writeHtml5 = writeHtml' defaultWriterState{ stHtml5 = True }
134writeHtml5 = writeHtml' defaultWriterState{ stHtml5 = True }
134-- | Convert Pandoc document to Html 4 string.
136-- | Convert Pandoc document to Html 4 string.
135−writeHtml4String :: PandocMonad m => WriterOptions -> Pandoc -> m String
137+writeHtml4String :: PandocMonad m => WriterOptions -> Pandoc -> m Text
136writeHtml4String = writeHtmlString'
138writeHtml4String = writeHtmlString'
137 defaultWriterState{ stHtml5 = False }
139 defaultWriterState{ stHtml5 = False }
@@ -142,38 +144,39 @@ writeHtml4 = writeHtml' defaultWriterState{ stHtml5 = False }
143-- | Convert Pandoc document to Html appropriate for an epub version.
145-- | Convert Pandoc document to Html appropriate for an epub version.
144writeHtmlStringForEPUB :: PandocMonad m
146writeHtmlStringForEPUB :: PandocMonad m
145− => EPUBVersion -> WriterOptions -> Pandoc -> m String
147+ => EPUBVersion -> WriterOptions -> Pandoc
146−writeHtmlStringForEPUB version = writeHtmlString'
149+writeHtmlStringForEPUB version o = writeHtmlString'
147 defaultWriterState{ stHtml5 = version == EPUB3,
150 defaultWriterState{ stHtml5 = version == EPUB3,
148− stEPUBVersion = Just version }
151+ stEPUBVersion = Just version } o
150-- | Convert Pandoc document to Reveal JS HTML slide show.
153-- | Convert Pandoc document to Reveal JS HTML slide show.
151writeRevealJs :: PandocMonad m
154writeRevealJs :: PandocMonad m
152− => WriterOptions -> Pandoc -> m String
155+ => WriterOptions -> Pandoc -> m Text
153writeRevealJs = writeHtmlSlideShow' RevealJsSlides
156writeRevealJs = writeHtmlSlideShow' RevealJsSlides
155-- | Convert Pandoc document to S5 HTML slide show.
158-- | Convert Pandoc document to S5 HTML slide show.
156writeS5 :: PandocMonad m
159writeS5 :: PandocMonad m
157− => WriterOptions -> Pandoc -> m String
160+ => WriterOptions -> Pandoc -> m Text
158writeS5 = writeHtmlSlideShow' S5Slides
161writeS5 = writeHtmlSlideShow' S5Slides
160-- | Convert Pandoc document to Slidy HTML slide show.
163-- | Convert Pandoc document to Slidy HTML slide show.
161writeSlidy :: PandocMonad m
164writeSlidy :: PandocMonad m
162− => WriterOptions -> Pandoc -> m String
165+ => WriterOptions -> Pandoc -> m Text
163writeSlidy = writeHtmlSlideShow' SlidySlides
166writeSlidy = writeHtmlSlideShow' SlidySlides
165-- | Convert Pandoc document to Slideous HTML slide show.
168-- | Convert Pandoc document to Slideous HTML slide show.
166writeSlideous :: PandocMonad m
169writeSlideous :: PandocMonad m
167− => WriterOptions -> Pandoc -> m String
170+ => WriterOptions -> Pandoc -> m Text
168writeSlideous = writeHtmlSlideShow' SlideousSlides
171writeSlideous = writeHtmlSlideShow' SlideousSlides
170-- | Convert Pandoc document to DZSlides HTML slide show.
173-- | Convert Pandoc document to DZSlides HTML slide show.
171writeDZSlides :: PandocMonad m
174writeDZSlides :: PandocMonad m
172− => WriterOptions -> Pandoc -> m String
175+ => WriterOptions -> Pandoc -> m Text
173writeDZSlides = writeHtmlSlideShow' DZSlides
176writeDZSlides = writeHtmlSlideShow' DZSlides
175writeHtmlSlideShow' :: PandocMonad m
178writeHtmlSlideShow' :: PandocMonad m
176− => HTMLSlideVariant -> WriterOptions -> Pandoc -> m String
179+ => HTMLSlideVariant -> WriterOptions -> Pandoc -> m Text
177writeHtmlSlideShow' variant = writeHtmlString'
180writeHtmlSlideShow' variant = writeHtmlString'
178 defaultWriterState{ stSlideVariant = variant
181 defaultWriterState{ stSlideVariant = variant
179 , stHtml5 = case variant of
182 , stHtml5 = case variant of
@@ -185,12 +188,15 @@ writeHtmlSlideShow' variant = writeHtmlString'
185 NoSlides -> False
188 NoSlides -> False
191+renderHtml' :: Html -> Text
192+renderHtml' = TL.toStrict . renderHtml
188writeHtmlString' :: PandocMonad m
194writeHtmlString' :: PandocMonad m
189− => WriterState -> WriterOptions -> Pandoc -> m String
195+ => WriterState -> WriterOptions -> Pandoc -> m Text
190writeHtmlString' st opts d = do
196writeHtmlString' st opts d = do
191 (body, context) <- evalStateT (pandocToHtml opts d) st
197 (body, context) <- evalStateT (pandocToHtml opts d) st
192 case writerTemplate opts of
198 case writerTemplate opts of
193− Nothing -> return $ renderHtml body
199+ Nothing -> return $ renderHtml' body
194 Just tpl -> do
200 Just tpl -> do
195 -- warn if empty lang
201 -- warn if empty lang
196 when (isNothing (getField "lang" context :: Maybe String)) $
202 when (isNothing (getField "lang" context :: Maybe String)) $
@@ -205,12 +211,12 @@ writeHtmlString' st opts d = do
205 report $ NoTitleElement fallback
211 report $ NoTitleElement fallback
206 return $ resetField "pagetitle" fallback context
212 return $ resetField "pagetitle" fallback context
207 return $ renderTemplate' tpl $
213 return $ renderTemplate' tpl $
208− defField "body" (renderHtml body) context'
214+ defField "body" (renderHtml' body) context'
210writeHtml' :: PandocMonad m => WriterState -> WriterOptions -> Pandoc -> m Html
216writeHtml' :: PandocMonad m => WriterState -> WriterOptions -> Pandoc -> m Html
211writeHtml' st opts d = do
217writeHtml' st opts d = do
212 case writerTemplate opts of
218 case writerTemplate opts of
213− Just _ -> preEscapedString <$> writeHtmlString' st opts d
219+ Just _ -> preEscapedText <$> writeHtmlString' st opts d
214 Nothing -> do
220 Nothing -> do
215 (body, _) <- evalStateT (pandocToHtml opts d) st
221 (body, _) <- evalStateT (pandocToHtml opts d) st
216 return body
222 return body
@@ -222,8 +228,8 @@ pandocToHtml :: PandocMonad m
222 -> StateT WriterState m (Html, Value)
228 -> StateT WriterState m (Html, Value)
223pandocToHtml opts (Pandoc meta blocks) = do
229pandocToHtml opts (Pandoc meta blocks) = do
224 metadata <- metaToJSON opts
230 metadata <- metaToJSON opts
225− (fmap renderHtml . blockListToHtml opts)
231+ (fmap renderHtml' . blockListToHtml opts)
226− (fmap renderHtml . inlineListToHtml opts)
232+ (fmap renderHtml' . inlineListToHtml opts)
228 let stringifyHTML = escapeStringForXML . stringify
234 let stringifyHTML = escapeStringForXML . stringify
229 let authsMeta = map stringifyHTML $ docAuthors meta
235 let authsMeta = map stringifyHTML $ docAuthors meta
@@ -277,10 +283,10 @@ pandocToHtml opts (Pandoc meta blocks) = do
277 Nothing -> id
283 Nothing -> id
278 else id) $
284 else id) $
279 (if stMath st
285 (if stMath st
280− then defField "math" (renderHtml math)
286+ then defField "math" (renderHtml' math)
281 else id) $
287 else id) $
282 defField "quotes" (stQuotes st) $
288 defField "quotes" (stQuotes st) $
283− maybe id (defField "toc" . renderHtml) toc $
289+ maybe id (defField "toc" . renderHtml') toc $
284 defField "author-meta" authsMeta $
290 defField "author-meta" authsMeta $
285 maybe id (defField "date-meta") (normalizeDate dateMeta) $
291 maybe id (defField "date-meta") (normalizeDate dateMeta) $
286 defField "pagetitle" (stringifyHTML (docTitle meta)) $
292 defField "pagetitle" (stringifyHTML (docTitle meta)) $
@@ -463,7 +469,7 @@ parseMailto s = do
463obfuscateLink :: PandocMonad m => WriterOptions -> Attr -> Html -> String -> m Html
469obfuscateLink :: PandocMonad m => WriterOptions -> Attr -> Html -> String -> m Html
464obfuscateLink opts attr txt s | writerEmailObfuscation opts == NoObfuscation =
470obfuscateLink opts attr txt s | writerEmailObfuscation opts == NoObfuscation =
465 return $ addAttrs opts attr $ H.a ! A.href (toValue s) $ txt
471 return $ addAttrs opts attr $ H.a ! A.href (toValue s) $ txt
466−obfuscateLink opts attr (renderHtml -> txt) s =
472+obfuscateLink opts attr (TL.unpack . renderHtml -> txt) s =
467 let meth = writerEmailObfuscation opts
473 let meth = writerEmailObfuscation opts
468 s' = map toLower (take 7 s) ++ drop 7 s
474 s' = map toLower (take 7 s) ++ drop 7 s
469 in case parseMailto s' of
475 in case parseMailto s' of