content: {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE QuasiQuotes #-}
  {-# LANGUAGE RecordWildCards #-}
  {-# LANGUAGE NoImplicitPrelude #-}
  
  -- |
  -- Module      : $header$
  -- Copyright   : (c) Laurent P René de Cotret, 2019 - present
  -- License     : GNU GPL, version 2 or above
  -- Maintainer  : laurent.decotret@outlook.com
  -- Stability   : internal
  -- Portability : portable
  --
  -- Rendering Plotly-python code blocks
  module Text.Pandoc.Filter.Plot.Renderers.PlotlyPython
    ( plotlyPython,
      plotlyPythonSupportedSaveFormats,
    )
  where
  
  import Text.Pandoc.Filter.Plot.Renderers.Prelude
  
  plotlyPython :: PlotM Renderer
  plotlyPython = do
    cmdargs <- asksConfig plotlyPythonCmdArgs
    return
      $ Renderer
        { rendererToolkit = PlotlyPython,
          rendererCapture = plotlyPythonCapture,
          rendererCommand = plotlyPythonCommand cmdargs,
          rendererAvailability = CommandSuccess $ \exe -> [st|#{pathToExe exe} -c "import plotly.graph_objects"|],
          rendererSupportedSaveFormats = plotlyPythonSupportedSaveFormats,
          rendererChecks = mempty,
          rendererLanguage = "python",
          rendererComment = mappend "# ",
          rendererScriptExtension = ".py"
        }
  
  plotlyPythonSupportedSaveFormats :: [SaveFormat]
  plotlyPythonSupportedSaveFormats = [PNG, JPG, WEBP, PDF, SVG, EPS, HTML]
  
  plotlyPythonCommand :: Text -> OutputSpec -> Text
  plotlyPythonCommand cmdargs OutputSpec {..} = [st|#{pathToExe oExecutable} #{cmdargs} "#{oScriptPath}"|]
  
  plotlyPythonCapture :: FigureSpec -> FilePath -> Script
  plotlyPythonCapture = appendCapture plotlyPythonCaptureFragment
  
  plotlyPythonCaptureFragment :: FigureSpec -> FilePath -> Script
  plotlyPythonCaptureFragment FigureSpec {..} fname =
    [st|
  import plotly.graph_objects as go
  __current_plotly_figure = next(obj for obj in globals().values() if type(obj) == go.Figure)
  __current_plotly_figure.#{write_method}(r"#{fname}"#{extra_args})
  |]
    where
      -- Note: the default behaviour for HTML export is
      --       to embed the entire Plotly.js content. This means
      --       that the resulting file can be used completely offline
      write_method = case saveFormat of
        HTML -> "write_html" :: Text
        _ -> "write_image"
      extra_args = case saveFormat of
        HTML -> ", include_plotlyjs='cdn'" :: Text
        _ -> mempty
  