{-# LANGUAGE ExtendedDefaultRules #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
module Knit.Report.Input.Visualization.Diagrams
(
addDiagramAsSVG
, module Diagrams.Prelude
, module Diagrams.Backend.SVG
)
where
import Knit.Report.Input.Html.Blaze ( addBlaze )
import Text.Blaze.Html ( preEscapedLazyText
, toValue
)
import qualified Text.Blaze.Html5 as BH
import qualified Text.Blaze.Html5.Attributes as BHA
import qualified Data.Text as T
import qualified Diagrams.Prelude as D
import Diagrams.Prelude hiding ( trace )
import qualified Diagrams.Backend.SVG as DSVG
import Diagrams.Backend.SVG
import qualified Graphics.Svg as SVG
import qualified Polysemy as P
import qualified Knit.Effect.Pandoc as PE
import qualified Knit.Effect.PandocMonad as PM
import qualified Knit.Effect.UnusedId as KUI
addDiagramAsSVG
:: ( PM.PandocEffects effs
, P.Member PE.ToPandoc effs
, P.Member KUI.UnusedId effs
)
=> Maybe T.Text
-> Maybe T.Text
-> Double
-> Double
-> D.QDiagram DSVG.SVG D.V2 Double D.Any
-> P.Sem effs T.Text
addDiagramAsSVG idTextM captionTextM wPixels hPixels diagram = do
idText <- maybe (KUI.getNextUnusedId "figure") return idTextM
let svgOptions =
DSVG.SVGOptions (D.dims2D wPixels hPixels) Nothing idText [] False
addDiagramAsSVGWithOptions (Just idText) captionTextM svgOptions diagram
addDiagramAsSVGWithOptions
:: ( PM.PandocEffects effs
, P.Member PE.ToPandoc effs
, P.Member KUI.UnusedId effs
)
=> Maybe T.Text
-> Maybe T.Text
-> DSVG.Options DSVG.SVG D.V2 Double
-> D.QDiagram DSVG.SVG D.V2 Double D.Any
-> P.Sem effs T.Text
addDiagramAsSVGWithOptions idTextM captionTextM svgOptions diagram = do
idText <- maybe (KUI.getNextUnusedId "figure") return idTextM
addBlaze $ BH.figure BH.! BHA.id (toValue idText) $ do
preEscapedLazyText $ SVG.renderText $ D.renderDia DSVG.SVG
svgOptions
diagram
maybe (return ()) (BH.figcaption . BH.toHtml) captionTextM
return idText