@@ -47,6 +47,7 @@ import Text.Pandoc.Builder (Blocks, HasMeta (..), Inlines, trimInlines)
4747import qualified Text.Pandoc.Builder as B
4848import Text.Pandoc.Class.PandocMonad (PandocMonad (..))
4949import Text.Pandoc.CSS (foldOrElse, pickStyleAttrProps)
50+import qualified Text.Pandoc.UTF8 as UTF8
5051import Text.Pandoc.Definition
5152import Text.Pandoc.Readers.LaTeX (rawLaTeXInline)
5253import Text.Pandoc.Readers.LaTeX.Types (Macro)
@@ -65,6 +66,7 @@ import Text.Pandoc.Shared (addMetaField, blocksToInlines', crFilter, escapeURI,
6566import Text.Pandoc.Walk
6667import Text.Parsec.Error
6768import Text.TeXMath (readMathML, writeTeX)
69+import Data.ByteString.Base64 (encode)
6870
6971-- | Convert HTML-formatted string to 'Pandoc' document.
7072readHtml :: PandocMonad m
@@ -655,6 +657,7 @@ inline = choice
655657 , pLineBreak
656658 , pLink
657659 , pImage
660+ , pSvg
658661 , pBdo
659662 , pCode
660663 , pCodeWithClass [("samp","sample"),("var","variable")]
@@ -793,6 +796,20 @@ pImage = do
793796 let kvs = concatMap getAtt ["width", "height", "sizes", "srcset"]
794797 return $ B.imageWith (uid, cls, kvs) (escapeURI url) title (B.text alt)
795798
799+pSvg :: PandocMonad m => TagParser m Inlines
800+pSvg = do
801+ exts <- getOption readerExtensions
802+ -- if raw_html enabled, parse svg tag as raw
803+ guard $ not (extensionEnabled Ext_raw_html exts)
804+ opent@(TagOpen _ attr') <- pSatisfy (matchTagOpen "svg" [])
805+ let (ident,cls,_) = toAttr attr'
806+ contents <- many (notFollowedBy (pCloses "svg") >> pAny)
807+ closet <- TagClose "svg" <$ (pCloses "svg" <|> eof)
808+ let rawText = T.strip $ renderTags' (opent : contents ++ [closet])
809+ let svgData = "data:image/svg+xml;base64," <>
810+ UTF8.toText (encode $ UTF8.fromText rawText)
811+ return $ B.imageWith (ident,cls,[]) svgData mempty mempty
812+
796813pCodeWithClass :: PandocMonad m => [(T.Text,Text)] -> TagParser m Inlines
797814pCodeWithClass elemToClass = try $ do
798815 let tagTest = flip elem . fmap fst $ elemToClass