@@ -42,12 +42,13 @@ import System.FilePath
42import System.IO (stdout)
42import System.IO (stdout)
43import Text.Pandoc
43import Text.Pandoc
44import Text.Pandoc.Builder (setMeta)
44import Text.Pandoc.Builder (setMeta)
45−import Text.Pandoc.App.Opt (Opt (..), LineEnding (..), defaultOpts)
45+import Text.Pandoc.App.Opt (Opt (..), LineEnding (..))
46import Text.Pandoc.Filter (Filter (..))
46import Text.Pandoc.Filter (Filter (..))
47import Text.Pandoc.Highlighting (highlightingStyles)
47import Text.Pandoc.Highlighting (highlightingStyles)
48import Text.Pandoc.Writers.Math (defaultMathJaxURL, defaultKaTeXURL)
48import Text.Pandoc.Writers.Math (defaultMathJaxURL, defaultKaTeXURL)
49import Text.Pandoc.Shared (ordNub, safeRead, defaultUserDataDirs)
49import Text.Pandoc.Shared (ordNub, safeRead, defaultUserDataDirs)
50import Text.Printf
50import Text.Printf
51+import Text.Pandoc.Class (runIOorExplode, PandocMonad(..))
52#ifdef EMBED_DATA_FILES
53#ifdef EMBED_DATA_FILES
53import Text.Pandoc.Data (dataFiles)
54import Text.Pandoc.Data (dataFiles)
@@ -106,25 +107,41 @@ engines = map ("html",) htmlEngines ++
106pdfEngines :: [String]
107pdfEngines :: [String]
107pdfEngines = ordNub $ map snd engines
108pdfEngines = ordNub $ map snd engines
110+findFile :: PandocMonad m => [FilePath] -> m (Maybe FilePath)
111+findFile [] = return Nothing
113+ exists <- fileExists f
115+ then return $ Just f
109-- | A list of functions, each transforming the options data structure
118-- | A list of functions, each transforming the options data structure
110-- in response to a command-line option.
119-- in response to a command-line option.
111options :: [OptDescr (Opt -> IO Opt)]
120options :: [OptDescr (Opt -> IO Opt)]
113 [ Option "" ["defaults"]
122 [ Option "" ["defaults"]
115− (\arg _opt -> do
124+ (\arg opt -> runIOorExplode $ do
125+ setVerbosity $ optVerbosity opt
126+ let fp = if null (takeExtension arg)
127+ then addExtension arg "yaml"
129+ dataDirs <- liftIO defaultUserDataDirs
130+ let fps = case optDataDir opt of
131+ Nothing -> (fp : map (</> ("defaults" </> fp))
133+ Just dd -> [fp, dd </> "defaults" </> fp]
134+ fp' <- fromMaybe fp <$> findFile fps
135+ inp <- readFileLazy fp'
116− let defaults = YA.encode1 defaultOpts
136+ let defaults = YA.encode1 opt
117− inp <- E.catch (B.readFile arg)
118− (\e -> E.throwIO $ PandocIOError
119− "Error reading defaults file" e)
120 case YA.decode1 (defaults <> inp) of
137 case YA.decode1 (defaults <> inp) of
121− Right (newopts :: Opt) -> do
138+ Right (newopts :: Opt) -> return newopts
123− Left (errpos, errmsg) -> E.throwIO $
139+ Left (errpos, errmsg) -> throwError $
124− PandocParseError $ "Error parsing " ++ arg ++
140+ PandocParseError $
141+ "Error parsing " ++ fp' ++
125− " (line " ++ show (Y.posLine errpos) ++
142+ " (line " ++ show (Y.posLine errpos) ++
126− " column " ++ show (Y.posColumn errpos) ++ ")\n"
143+ " column " ++ show (Y.posColumn errpos) ++
127− ++ errmsg
144+ ")\n" ++ errmsg