aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2020-10-23 21:56:12 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2020-10-23 22:09:39 -0700
commit4bf171e11dd324f5c65e15da17717b701e961b17 (patch)
tree266853e5c04711cdede60e6b0290710a00a4ed87
parent90f25c7d1c90fb772fdf8aacae793784fd9f6733 (diff)
downloadpandoc-4bf171e11dd324f5c65e15da17717b701e961b17.tar.gz
HTML reader: parse inline svg as image...
...unless `raw_html` is set in the reader (in which case the svg is passed through as raw HTML). Closes #6770.
-rw-r--r--src/Text/Pandoc/Readers/HTML.hs17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/Text/Pandoc/Readers/HTML.hs b/src/Text/Pandoc/Readers/HTML.hs
index 11b8516ea..05c29d922 100644
--- a/src/Text/Pandoc/Readers/HTML.hs
+++ b/src/Text/Pandoc/Readers/HTML.hs
@@ -47,6 +47,7 @@ import Text.Pandoc.Builder (Blocks, HasMeta (..), Inlines, trimInlines)
import qualified Text.Pandoc.Builder as B
import Text.Pandoc.Class.PandocMonad (PandocMonad (..))
import Text.Pandoc.CSS (foldOrElse, pickStyleAttrProps)
+import qualified Text.Pandoc.UTF8 as UTF8
import Text.Pandoc.Definition
import Text.Pandoc.Readers.LaTeX (rawLaTeXInline)
import Text.Pandoc.Readers.LaTeX.Types (Macro)
@@ -65,6 +66,7 @@ import Text.Pandoc.Shared (addMetaField, blocksToInlines', crFilter, escapeURI,
import Text.Pandoc.Walk
import Text.Parsec.Error
import Text.TeXMath (readMathML, writeTeX)
+import Data.ByteString.Base64 (encode)
-- | Convert HTML-formatted string to 'Pandoc' document.
readHtml :: PandocMonad m
@@ -655,6 +657,7 @@ inline = choice
, pLineBreak
, pLink
, pImage
+ , pSvg
, pBdo
, pCode
, pCodeWithClass [("samp","sample"),("var","variable")]
@@ -793,6 +796,20 @@ pImage = do
let kvs = concatMap getAtt ["width", "height", "sizes", "srcset"]
return $ B.imageWith (uid, cls, kvs) (escapeURI url) title (B.text alt)
+pSvg :: PandocMonad m => TagParser m Inlines
+pSvg = do
+ exts <- getOption readerExtensions
+ -- if raw_html enabled, parse svg tag as raw
+ guard $ not (extensionEnabled Ext_raw_html exts)
+ opent@(TagOpen _ attr') <- pSatisfy (matchTagOpen "svg" [])
+ let (ident,cls,_) = toAttr attr'
+ contents <- many (notFollowedBy (pCloses "svg") >> pAny)
+ closet <- TagClose "svg" <$ (pCloses "svg" <|> eof)
+ let rawText = T.strip $ renderTags' (opent : contents ++ [closet])
+ let svgData = "data:image/svg+xml;base64," <>
+ UTF8.toText (encode $ UTF8.fromText rawText)
+ return $ B.imageWith (ident,cls,[]) svgData mempty mempty
+
pCodeWithClass :: PandocMonad m => [(T.Text,Text)] -> TagParser m Inlines
pCodeWithClass elemToClass = try $ do
let tagTest = flip elem . fmap fst $ elemToClass