summaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Templates.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Text/Pandoc/Templates.hs')
-rw-r--r--src/Text/Pandoc/Templates.hs82
1 files changed, 46 insertions, 36 deletions
diff --git a/src/Text/Pandoc/Templates.hs b/src/Text/Pandoc/Templates.hs
index d15d27438..4be0d081c 100644
--- a/src/Text/Pandoc/Templates.hs
+++ b/src/Text/Pandoc/Templates.hs
@@ -1,7 +1,9 @@
-{-# LANGUAGE TypeSynonymInstances, FlexibleInstances,
- OverloadedStrings, GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE FlexibleInstances #-}
+
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeSynonymInstances #-}
{-
-Copyright (C) 2009-2016 John MacFarlane <jgm@berkeley.edu>
+Copyright (C) 2009-2018 John MacFarlane <jgm@berkeley.edu>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -20,7 +22,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
{- |
Module : Text.Pandoc.Templates
- Copyright : Copyright (C) 2009-2016 John MacFarlane
+ Copyright : Copyright (C) 2009-2018 John MacFarlane
License : GNU GPL, version 2 or above
Maintainer : John MacFarlane <jgm@berkeley.edu>
@@ -31,44 +33,52 @@ A simple templating system with variable substitution and conditionals.
-}
-module Text.Pandoc.Templates ( renderTemplate
+module Text.Pandoc.Templates ( module Text.DocTemplates
, renderTemplate'
- , TemplateTarget
- , varListToJSON
- , compileTemplate
- , Template
- , getDefaultTemplate ) where
+ , getDefaultTemplate
+ ) where
-import Text.DocTemplates (Template, TemplateTarget, compileTemplate,
- renderTemplate, applyTemplate,
- varListToJSON)
-import Data.Aeson (ToJSON(..))
+import Control.Monad.Except (throwError)
+import Data.Aeson (ToJSON (..))
import qualified Data.Text as T
-import System.FilePath ((</>), (<.>))
-import qualified Control.Exception.Extensible as E (try, IOException)
-import Text.Pandoc.Shared (readDataFileUTF8)
+import System.FilePath ((<.>), (</>))
+import Text.DocTemplates (Template, TemplateTarget, applyTemplate,
+ compileTemplate, renderTemplate, varListToJSON)
+import Text.Pandoc.Class (PandocMonad, readDataFile)
+import Text.Pandoc.Error
+import qualified Text.Pandoc.UTF8 as UTF8
-- | Get default template for the specified writer.
-getDefaultTemplate :: (Maybe FilePath) -- ^ User data directory to search first
- -> String -- ^ Name of writer
- -> IO (Either E.IOException String)
-getDefaultTemplate user writer = do
+getDefaultTemplate :: PandocMonad m
+ => String -- ^ Name of writer
+ -> m String
+getDefaultTemplate writer = do
let format = takeWhile (`notElem` ("+-" :: String)) writer -- strip off extensions
case format of
- "native" -> return $ Right ""
- "json" -> return $ Right ""
- "docx" -> return $ Right ""
- "fb2" -> return $ Right ""
- "odt" -> getDefaultTemplate user "opendocument"
- "markdown_strict" -> getDefaultTemplate user "markdown"
- "multimarkdown" -> getDefaultTemplate user "markdown"
- "markdown_github" -> getDefaultTemplate user "markdown"
- "markdown_mmd" -> getDefaultTemplate user "markdown"
- "markdown_phpextra" -> getDefaultTemplate user "markdown"
+ "native" -> return ""
+ "json" -> return ""
+ "docx" -> return ""
+ "fb2" -> return ""
+ "pptx" -> return ""
+ "odt" -> getDefaultTemplate "opendocument"
+ "html" -> getDefaultTemplate "html5"
+ "docbook" -> getDefaultTemplate "docbook5"
+ "epub" -> getDefaultTemplate "epub3"
+ "beamer" -> getDefaultTemplate "latex"
+ "markdown_strict" -> getDefaultTemplate "markdown"
+ "multimarkdown" -> getDefaultTemplate "markdown"
+ "markdown_github" -> getDefaultTemplate "markdown"
+ "markdown_mmd" -> getDefaultTemplate "markdown"
+ "markdown_phpextra" -> getDefaultTemplate "markdown"
+ "gfm" -> getDefaultTemplate "commonmark"
_ -> let fname = "templates" </> "default" <.> format
- in E.try $ readDataFileUTF8 user fname
-
--- | Like 'applyTemplate', but raising an error if compilation fails.
-renderTemplate' :: (ToJSON a, TemplateTarget b) => String -> a -> b
-renderTemplate' template = either error id . applyTemplate (T.pack template)
+ in UTF8.toString <$> readDataFile fname
+-- | Like 'applyTemplate', but runs in PandocMonad and
+-- raises an error if compilation fails.
+renderTemplate' :: (PandocMonad m, ToJSON a, TemplateTarget b)
+ => String -> a -> m b
+renderTemplate' template context =
+ case applyTemplate (T.pack template) context of
+ Left e -> throwError (PandocTemplateError e)
+ Right r -> return r