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 SageMath figures
  module Text.Pandoc.Filter.Plot.Renderers.SageMath
    ( sagemath,
      sagemathSupportedSaveFormats,
    )
  where
  
  import Text.Pandoc.Filter.Plot.Renderers.Prelude
  
  sagemath :: PlotM Renderer
  sagemath = do
    cmdargs <- asksConfig sagemathCmdArgs
    return
      $ Renderer
        { rendererToolkit = SageMath,
          rendererCapture = sagemathCapture,
          rendererCommand = sagemathCommand cmdargs,
          rendererAvailability = CommandSuccess $ \exe -> [st|#{pathToExe exe} -v|],
          rendererSupportedSaveFormats = sagemathSupportedSaveFormats,
          rendererChecks = mempty,
          rendererLanguage = "sagemath",
          rendererComment = mappend "# ",
          rendererScriptExtension = ".sage"
        }
  
  -- See here:
  -- https://doc.sagemath.org/html/en/reference/plotting/sage/plot/graphics.html#sage.plot.graphics.Graphics.save
  sagemathSupportedSaveFormats :: [SaveFormat]
  sagemathSupportedSaveFormats = [EPS, PDF, PNG, SVG]
  
  sagemathCommand :: Text -> OutputSpec -> Text
  sagemathCommand cmdargs OutputSpec {..} = [st|#{pathToExe oExecutable} #{cmdargs} "#{oScriptPath}"|]
  
  sagemathCapture :: FigureSpec -> FilePath -> Script
  sagemathCapture = appendCapture sagemathCaptureFragment
  
  -- This capture fragment is a bit ugly because sage does not have the
  -- equivalent of matplotlib's `plt.gca()` to get a pointer to the most
  -- recent graphical object. We must search for it
  sagemathCaptureFragment :: FigureSpec -> FilePath -> Script
  sagemathCaptureFragment FigureSpec {..} fname =
    [st|
  import sage.plot.graphics as go
  import sage.plot.plot3d.base as go3d
  import builtins
  # Try to concatenate 3D graphics objects first; if this doesn't work, then 
  # concatenate all 2D graphic objects.
  __all_graphics = builtins.sum( (obj for obj in globals().values() if isinstance(obj, go3d.Graphics3d)))
  if not __all_graphics:
      __all_graphics = builtins.sum( (obj for obj in globals().values() if isinstance(obj, go.Graphics)))
  if not __all_graphics:
      raise RuntimeError(''.join([
          "No plotting objects detected. ",
          "Make sure that all of your plotting objects are named, e.g. `G = plot(...)` rather than just `plot(...)`. ",
          "This is a limitation specific to the interaction between sage and pandoc-plot."
      ]))
  __all_graphics.save_image(r"#{fname}", dpi=#{dpi})
  |]
  