From e22d1fbb144d63d595c5db9225dd912b09fd938f Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Mon, 29 Mar 2021 14:56:44 -0700
Subject: Powerpoint writer: allow monofont to be specified in metadata...

...not just using `--variable` on the command line (as in
other writers).  Closes #7187.
---
 src/Text/Pandoc/Writers/Powerpoint.hs        |  2 +-
 src/Text/Pandoc/Writers/Powerpoint/Output.hs | 23 ++++++++++++++++++-----
 2 files changed, 19 insertions(+), 6 deletions(-)

(limited to 'src')

diff --git a/src/Text/Pandoc/Writers/Powerpoint.hs b/src/Text/Pandoc/Writers/Powerpoint.hs
index ca3b74a1d..e0573beca 100644
--- a/src/Text/Pandoc/Writers/Powerpoint.hs
+++ b/src/Text/Pandoc/Writers/Powerpoint.hs
@@ -39,5 +39,5 @@ writePowerpoint opts (Pandoc meta blks) = do
   let blks' = walk fixDisplayMath blks
   let (pres, logMsgs) = documentToPresentation opts (Pandoc meta blks')
   mapM_ report logMsgs
-  archv <- presentationToArchive opts pres
+  archv <- presentationToArchive opts meta pres
   return $ fromArchive archv
diff --git a/src/Text/Pandoc/Writers/Powerpoint/Output.hs b/src/Text/Pandoc/Writers/Powerpoint/Output.hs
index 0e515b3c2..f2f54a91c 100644
--- a/src/Text/Pandoc/Writers/Powerpoint/Output.hs
+++ b/src/Text/Pandoc/Writers/Powerpoint/Output.hs
@@ -38,17 +38,19 @@ import qualified Text.Pandoc.Class.PandocMonad as P
 import Text.Pandoc.Options
 import Text.Pandoc.MIME
 import qualified Data.ByteString.Lazy as BL
+import Text.Pandoc.Writers.Shared (metaToContext)
 import Text.Pandoc.Writers.OOXML
 import qualified Data.Map as M
 import Data.Maybe (mapMaybe, listToMaybe, fromMaybe, maybeToList, catMaybes, isJust)
 import Text.Pandoc.ImageSize
 import Control.Applicative ((<|>))
 import System.FilePath.Glob
-import Text.DocTemplates (FromContext(lookupContext))
+import Text.DocTemplates (FromContext(lookupContext), Context)
+import Text.DocLayout (literal)
 import Text.TeXMath
 import Text.Pandoc.Writers.Math (convertMath)
 import Text.Pandoc.Writers.Powerpoint.Presentation
-import Text.Pandoc.Shared (tshow)
+import Text.Pandoc.Shared (tshow, stringify)
 import Skylighting (fromColor)
 import Data.List.NonEmpty (nonEmpty)
 
@@ -97,6 +99,7 @@ data WriterEnv = WriterEnv { envRefArchive :: Archive
                            , envDistArchive :: Archive
                            , envUTCTime :: UTCTime
                            , envOpts :: WriterOptions
+                           , envContext :: Context Text
                            , envPresentationSize :: (Integer, Integer)
                            , envSlideHasHeader :: Bool
                            , envInList :: Bool
@@ -122,6 +125,7 @@ instance Default WriterEnv where
                   , envDistArchive = emptyArchive
                   , envUTCTime = posixSecondsToUTCTime 0
                   , envOpts = def
+                  , envContext = mempty
                   , envPresentationSize = (720, 540)
                   , envSlideHasHeader = False
                   , envInList = False
@@ -168,7 +172,7 @@ runP env st p = evalStateT (runReaderT p env) st
 
 monospaceFont :: Monad m => P m T.Text
 monospaceFont = do
-  vars <- writerVariables <$> asks envOpts
+  vars <- asks envContext
   case lookupContext "monofont" vars of
     Just s -> return s
     Nothing -> return "Courier"
@@ -304,8 +308,9 @@ makeSpeakerNotesMap (Presentation _ slides) =
                                  then Nothing
                                  else Just n
 
-presentationToArchive :: PandocMonad m => WriterOptions -> Presentation -> m Archive
-presentationToArchive opts pres = do
+presentationToArchive :: PandocMonad m
+                      => WriterOptions -> Meta -> Presentation -> m Archive
+presentationToArchive opts meta pres = do
   distArchive <- toArchive . BL.fromStrict <$>
                       P.readDefaultDataFile "reference.pptx"
   refArchive <- case writerReferenceDoc opts of
@@ -321,10 +326,18 @@ presentationToArchive opts pres = do
                            PandocSomeError
                            "Could not determine presentation size"
 
+  -- note, we need writerTemplate to be Just _ or metaToContext does
+  -- nothing
+  context <- metaToContext opts{ writerTemplate =
+                                  writerTemplate opts <|> Just mempty }
+                (return . literal . stringify)
+                (return . literal . stringify) meta
+
   let env = def { envRefArchive = refArchive
                 , envDistArchive = distArchive
                 , envUTCTime = utctime
                 , envOpts = opts
+                , envContext = context
                 , envPresentationSize = presSize
                 , envSlideIdMap = makeSlideIdMap pres
                 , envSpeakerNotesIdMap = makeSpeakerNotesMap pres
-- 
cgit v1.2.3