git.iko.soy/typeable/pandoc
on master help sign in
Allow `${.}` in defaults files paths...
1aeb2beJohn MacFarlane
MANUAL.txt+13
@@ -1684,6 +1684,19 @@ user data directory that is current when the defaults file is
1684parsed, regardless of the setting of the environment
1684parsed, regardless of the setting of the environment
1685variable `USERDATA`.
1685variable `USERDATA`.
1686
1686
1687+`${.}` will resolve to the directory containing the default
1688+file itself. This allows you to refer to resources contained
1689+in that directory:
1690+
1691+``` yaml
1692+epub-cover-image: ${.}/cover.jpg
1693+epub-metadata: ${.}/meta.xml
1694+resource-path:
1695+- . # the working directory from which pandoc is run
1696+- ${.}/images # the images subdirectory of the directory
1697+ # containing this defaults file
1698+```
1699+
1687This environment variable interpolation syntax *only* works in
1700This environment variable interpolation syntax *only* works in
1688fields that expect file paths.
1701fields that expect file paths.
1689
1702
src/Text/Pandoc/App/Opt.hs+11−2
@@ -27,7 +27,8 @@ module Text.Pandoc.App.Opt (
27 ) where
27 ) where
28import Control.Monad.Except (MonadIO, liftIO, throwError, (>=>), foldM)
28import Control.Monad.Except (MonadIO, liftIO, throwError, (>=>), foldM)
29import Control.Monad.State.Strict (StateT, modify, gets)
29import Control.Monad.State.Strict (StateT, modify, gets)
30−import System.FilePath ( addExtension, (</>), takeExtension )
30+import System.FilePath ( addExtension, (</>), takeExtension, takeDirectory )
31+import System.Directory ( canonicalizePath )
31import Data.Char (isLower, toLower)
32import Data.Char (isLower, toLower)
32import Data.Maybe (fromMaybe)
33import Data.Maybe (fromMaybe)
33import GHC.Generics hiding (Meta)
34import GHC.Generics hiding (Meta)
@@ -189,7 +190,8 @@ instance (PandocMonad m, MonadIO m)
189 toText _ = ""
190 toText _ = ""
190 parseYAML n = failAtNode n "Expected a mapping"
191 parseYAML n = failAtNode n "Expected a mapping"
191
192
192−resolveVarsInOpt :: (PandocMonad m, MonadIO m) => Opt -> m Opt
193+resolveVarsInOpt :: forall m. (PandocMonad m, MonadIO m)
194+ => Opt -> StateT DefaultsState m Opt
193resolveVarsInOpt
195resolveVarsInOpt
194 opt@Opt
196 opt@Opt
195 { optTemplate = oTemplate
197 { optTemplate = oTemplate
@@ -263,6 +265,7 @@ resolveVarsInOpt
263 }
265 }
264
266
265 where
267 where
268+ resolveVars :: FilePath -> StateT DefaultsState m FilePath
266 resolveVars [] = return []
269 resolveVars [] = return []
267 resolveVars ('$':'{':xs) =
270 resolveVars ('$':'{':xs) =
268 let (ys, zs) = break (=='}') xs
271 let (ys, zs) = break (=='}') xs
@@ -272,6 +275,12 @@ resolveVarsInOpt
272 val <- lookupEnv' ys
275 val <- lookupEnv' ys
273 (val ++) <$> resolveVars (drop 1 zs)
276 (val ++) <$> resolveVars (drop 1 zs)
274 resolveVars (c:cs) = (c:) <$> resolveVars cs
277 resolveVars (c:cs) = (c:) <$> resolveVars cs
278+ lookupEnv' :: String -> StateT DefaultsState m String
279+ lookupEnv' "." = do
280+ mbCurDefaults <- gets curDefaults
281+ maybe (return "")
282+ (fmap takeDirectory . liftIO . canonicalizePath)
283+ mbCurDefaults
275 lookupEnv' "USERDATA" = do
284 lookupEnv' "USERDATA" = do
276 mbodatadir <- mapM resolveVars oDataDir
285 mbodatadir <- mapM resolveVars oDataDir
277 mbdatadir <- getUserDataDir
286 mbdatadir <- getUserDataDir