@@ -45,6 +45,8 @@ module Text.Pandoc.Writers.HTML (
4545 ) where
4646import Control.Monad.State
4747import Data.Char (ord, toLower)
48+import Data.Text (Text)
49+import qualified Data.Text.Lazy as TL
4850import Data.List (intersperse, isPrefixOf)
4951import Data.Maybe (catMaybes, fromMaybe, isJust, isNothing)
5052import Data.Monoid ((<>))
@@ -67,7 +69,7 @@ import Text.Pandoc.Writers.Shared
6769import Text.Pandoc.XML (escapeStringForXML, fromEntities)
6870#if MIN_VERSION_blaze_markup(0,6,3)
6971#else
70−import Text.Blaze.Internal (preEscapedString)
72+import Text.Blaze.Internal (preEscapedString, preEscapedText)
7173#endif
7274#if MIN_VERSION_blaze_html(0,5,1)
7375import qualified Text.Blaze.XHtml5 as H5
@@ -77,7 +79,7 @@ import qualified Text.Blaze.Html5 as H5
7779import Control.Monad.Except (throwError)
7880import Data.Aeson (Value)
7981import System.FilePath (takeExtension, takeBaseName)
80−import Text.Blaze.Html.Renderer.String (renderHtml)
82+import Text.Blaze.Html.Renderer.Text (renderHtml)
8183import qualified Text.Blaze.XHtml1.Transitional as H
8284import qualified Text.Blaze.XHtml1.Transitional.Attributes as A
8385import Text.Pandoc.Class (PandocMonad, report)
@@ -123,7 +125,7 @@ nl opts = if writerWrapText opts == WrapNone
123125 else preEscapedString "\n"
124126
125127-- | Convert Pandoc document to Html 5 string.
126−writeHtml5String :: PandocMonad m => WriterOptions -> Pandoc -> m String
128+writeHtml5String :: PandocMonad m => WriterOptions -> Pandoc -> m Text
127129writeHtml5String = writeHtmlString'
128130 defaultWriterState{ stHtml5 = True }
129131
@@ -132,7 +134,7 @@ writeHtml5 :: PandocMonad m => WriterOptions -> Pandoc -> m Html
132134writeHtml5 = writeHtml' defaultWriterState{ stHtml5 = True }
133135
134136-- | Convert Pandoc document to Html 4 string.
135−writeHtml4String :: PandocMonad m => WriterOptions -> Pandoc -> m String
137+writeHtml4String :: PandocMonad m => WriterOptions -> Pandoc -> m Text
136138writeHtml4String = writeHtmlString'
137139 defaultWriterState{ stHtml5 = False }
138140
@@ -142,38 +144,39 @@ writeHtml4 = writeHtml' defaultWriterState{ stHtml5 = False }
142144
143145-- | Convert Pandoc document to Html appropriate for an epub version.
144146writeHtmlStringForEPUB :: PandocMonad m
145− => EPUBVersion -> WriterOptions -> Pandoc -> m String
146−writeHtmlStringForEPUB version = writeHtmlString'
147+ => EPUBVersion -> WriterOptions -> Pandoc
148+ -> m Text
149+writeHtmlStringForEPUB version o = writeHtmlString'
147150 defaultWriterState{ stHtml5 = version == EPUB3,
148− stEPUBVersion = Just version }
151+ stEPUBVersion = Just version } o
149152
150153-- | Convert Pandoc document to Reveal JS HTML slide show.
151154writeRevealJs :: PandocMonad m
152− => WriterOptions -> Pandoc -> m String
155+ => WriterOptions -> Pandoc -> m Text
153156writeRevealJs = writeHtmlSlideShow' RevealJsSlides
154157
155158-- | Convert Pandoc document to S5 HTML slide show.
156159writeS5 :: PandocMonad m
157− => WriterOptions -> Pandoc -> m String
160+ => WriterOptions -> Pandoc -> m Text
158161writeS5 = writeHtmlSlideShow' S5Slides
159162
160163-- | Convert Pandoc document to Slidy HTML slide show.
161164writeSlidy :: PandocMonad m
162− => WriterOptions -> Pandoc -> m String
165+ => WriterOptions -> Pandoc -> m Text
163166writeSlidy = writeHtmlSlideShow' SlidySlides
164167
165168-- | Convert Pandoc document to Slideous HTML slide show.
166169writeSlideous :: PandocMonad m
167− => WriterOptions -> Pandoc -> m String
170+ => WriterOptions -> Pandoc -> m Text
168171writeSlideous = writeHtmlSlideShow' SlideousSlides
169172
170173-- | Convert Pandoc document to DZSlides HTML slide show.
171174writeDZSlides :: PandocMonad m
172− => WriterOptions -> Pandoc -> m String
175+ => WriterOptions -> Pandoc -> m Text
173176writeDZSlides = writeHtmlSlideShow' DZSlides
174177
175178writeHtmlSlideShow' :: PandocMonad m
176− => HTMLSlideVariant -> WriterOptions -> Pandoc -> m String
179+ => HTMLSlideVariant -> WriterOptions -> Pandoc -> m Text
177180writeHtmlSlideShow' variant = writeHtmlString'
178181 defaultWriterState{ stSlideVariant = variant
179182 , stHtml5 = case variant of
@@ -185,12 +188,15 @@ writeHtmlSlideShow' variant = writeHtmlString'
185188 NoSlides -> False
186189 }
187190
191+renderHtml' :: Html -> Text
192+renderHtml' = TL.toStrict . renderHtml
193+
188194writeHtmlString' :: PandocMonad m
189− => WriterState -> WriterOptions -> Pandoc -> m String
195+ => WriterState -> WriterOptions -> Pandoc -> m Text
190196writeHtmlString' st opts d = do
191197 (body, context) <- evalStateT (pandocToHtml opts d) st
192198 case writerTemplate opts of
193− Nothing -> return $ renderHtml body
199+ Nothing -> return $ renderHtml' body
194200 Just tpl -> do
195201 -- warn if empty lang
196202 when (isNothing (getField "lang" context :: Maybe String)) $
@@ -205,12 +211,12 @@ writeHtmlString' st opts d = do
205211 report $ NoTitleElement fallback
206212 return $ resetField "pagetitle" fallback context
207213 return $ renderTemplate' tpl $
208− defField "body" (renderHtml body) context'
214+ defField "body" (renderHtml' body) context'
209215
210216writeHtml' :: PandocMonad m => WriterState -> WriterOptions -> Pandoc -> m Html
211217writeHtml' st opts d = do
212218 case writerTemplate opts of
213− Just _ -> preEscapedString <$> writeHtmlString' st opts d
219+ Just _ -> preEscapedText <$> writeHtmlString' st opts d
214220 Nothing -> do
215221 (body, _) <- evalStateT (pandocToHtml opts d) st
216222 return body
@@ -222,8 +228,8 @@ pandocToHtml :: PandocMonad m
222228 -> StateT WriterState m (Html, Value)
223229pandocToHtml opts (Pandoc meta blocks) = do
224230 metadata <- metaToJSON opts
225− (fmap renderHtml . blockListToHtml opts)
226− (fmap renderHtml . inlineListToHtml opts)
231+ (fmap renderHtml' . blockListToHtml opts)
232+ (fmap renderHtml' . inlineListToHtml opts)
227233 meta
228234 let stringifyHTML = escapeStringForXML . stringify
229235 let authsMeta = map stringifyHTML $ docAuthors meta
@@ -277,10 +283,10 @@ pandocToHtml opts (Pandoc meta blocks) = do
277283 Nothing -> id
278284 else id) $
279285 (if stMath st
280− then defField "math" (renderHtml math)
286+ then defField "math" (renderHtml' math)
281287 else id) $
282288 defField "quotes" (stQuotes st) $
283− maybe id (defField "toc" . renderHtml) toc $
289+ maybe id (defField "toc" . renderHtml') toc $
284290 defField "author-meta" authsMeta $
285291 maybe id (defField "date-meta") (normalizeDate dateMeta) $
286292 defField "pagetitle" (stringifyHTML (docTitle meta)) $
@@ -463,7 +469,7 @@ parseMailto s = do
463469obfuscateLink :: PandocMonad m => WriterOptions -> Attr -> Html -> String -> m Html
464470obfuscateLink opts attr txt s | writerEmailObfuscation opts == NoObfuscation =
465471 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 =
467473 let meth = writerEmailObfuscation opts
468474 s' = map toLower (take 7 s) ++ drop 7 s
469475 in case parseMailto s' of