{-# LANGUAGE CPP #-} {-# LANGUAGE OverloadedStrings #-} {-| Module : Graphics.Vega.VegaLite.Output Copyright : (c) Douglas Burke, 2018-2019 License : BSD3 Maintainer : dburke.gw@gmail.com Stability : unstable Portability : CPP, OverloadedStrings Write out the VegaLite specification. -} module Graphics.Vega.VegaLite.Output ( toHtml , toHtmlFile , toHtmlWith , toHtmlFileWith ) where import qualified Data.Aeson.Text as A import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy.IO as TL import Data.Aeson (Value) #if !(MIN_VERSION_base(4, 12, 0)) import Data.Monoid ((<>)) #endif import Graphics.Vega.VegaLite.Specification (VegaLite, fromVL) {-| Converts VegaLite to html Text. Uses Vega-Embed with the default options. See 'toHtmlWith' for more control. @since 0.2.1.0 -} toHtml :: VegaLite -> TL.Text toHtml = toHtmlWith Nothing {-| Converts VegaLite to an html file. Uses Vega-Embed with the default options. See 'toHtmlFileWith' for more control. @since 0.2.1.0 -} toHtmlFile :: FilePath -> VegaLite -> IO () toHtmlFile file = TL.writeFile file . toHtml {-| Converts VegaLite to html Text. Uses Vega-Embed and is for when some control is needed over the output: 'toHtml' is a simpler form which just uses the default Vega-Embed options. The render you use to view the output file must support Javascript, since it is needed to create the visualization from the Vega-Lite specification. The Vega and Vega-Lite Javascript versions are pegged to 5 and 4, but no limit is applied to the Vega-Embed library. @since 0.4.0.0 -} toHtmlWith :: Maybe Value -- ^ The options to pass to the Vega-Embed @embed@ routine. See -- <https://github.com/vega/vega-embed#options> for the -- supported options. -> VegaLite -- ^ The Vega-Lite specification to display. -> TL.Text toHtmlWith mopts vl = let spec = A.encodeToLazyText (fromVL vl) opts = maybe "" (\o -> "," <> A.encodeToLazyText o) mopts in TL.unlines [ "<!DOCTYPE html>" , "<html>" , "<head>" -- versions are fixed at vega 5, vega-lite 4 , " <script src=\"https://cdn.jsdelivr.net/npm/vega@5\"></script>" , " <script src=\"https://cdn.jsdelivr.net/npm/vega-lite@4\"></script>" , " <script src=\"https://cdn.jsdelivr.net/npm/vega-embed\"></script>" , "</head>" , "<body>" , "<div id=\"vis\"></div>" , "<script type=\"text/javascript\">" , " var spec = " <> spec <> ";" , " vegaEmbed(\'#vis\', spec" <> opts <> ").then(function(result) {" , " // Access the Vega view instance (https://vega.github.io/vega/docs/api/view/) as result.view" , " }).catch(console.error);" , "</script>" , "</body>" , "</html>" ] {-| Converts VegaLite to an html file. Uses Vega-Embed and is for when some control is needed over the output: 'toHtmlFile' is a simpler form which just uses the default Vega-Embed options. @since 0.4.0.0 -} toHtmlFileWith :: Maybe Value -- ^ The options to pass to the Vega-Embed @embed@ routine. See -- <https://github.com/vega/vega-embed#options> for the -- supported options. -> FilePath -- ^ The output file name (it will be over-written if it already exists). -> VegaLite -- ^ The Vega-Lite specification to display. -> IO () toHtmlFileWith mopts file = TL.writeFile file . toHtmlWith mopts