{-# LANGUAGE CPP                 #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TupleSections       #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE FlexibleContexts    #-}
{- |
   Module      : Text.Pandoc.App.CommandLineOptions
   Copyright   : Copyright (C) 2006-2024 John MacFarlane
   License     : GNU GPL, version 2 or above

   Maintainer  : John MacFarlane <jgm@berkeley@edu>
   Stability   : alpha
   Portability : portable

Does a pandoc conversion based on command-line options.
-}
module Text.Pandoc.App.CommandLineOptions (
            parseOptions
          , parseOptionsFromArgs
          , handleOptInfo
          , options
          , engines
          , setVariable
          , versionInfo
          ) where
import Control.Monad.Trans
import Control.Monad.State.Strict
import Data.Containers.ListUtils (nubOrd)
import Data.Aeson (eitherDecode)
import Data.Aeson.Encode.Pretty (encodePretty', Config(..), keyOrder,
         defConfig, Indent(..), NumberFormat(..))
import Data.Bifunctor (second)
import Data.Char (toLower)
import Data.List (intercalate, sort)
import qualified Data.List as L
#ifdef _WINDOWS
import Data.List (isPrefixOf)
#endif
import Data.Maybe (fromMaybe, isJust)
import Data.Text (Text)
import Safe (tailDef)
import Skylighting (Syntax (..), defaultSyntaxMap)
import System.Console.GetOpt
import System.Environment (getArgs, getProgName)
import System.Exit (exitSuccess)
import System.FilePath
import System.IO (stdout)
import Text.DocTemplates (Context (..), ToContext (toVal), Val (..))
import Text.Pandoc
import Text.Pandoc.Builder (setMeta)
import Data.Version (showVersion)
import Text.Pandoc.App.Opt (Opt (..), LineEnding (..), IpynbOutput (..),
                            DefaultsState (..), applyDefaults,
                            fullDefaultsPath, OptInfo(..))
import Text.Pandoc.Filter (Filter (..))
import Text.Pandoc.Highlighting (highlightingStyles, lookupHighlightingStyle)
import Text.Pandoc.Scripting (ScriptingEngine (..), customTemplate)
import Text.Pandoc.Shared (safeStrRead)
import Text.Printf
import qualified Control.Exception as E
import Control.Monad.Except (ExceptT(..), runExceptT, throwError)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as B
import qualified Data.Map as M
import qualified Data.Set as Set
import qualified Data.Text as T
import qualified Text.Pandoc.UTF8 as UTF8

parseOptions :: [OptDescr (Opt -> ExceptT OptInfo IO Opt)]
             -> Opt -> IO (Either OptInfo Opt)
parseOptions :: [OptDescr (Opt -> ExceptT OptInfo IO Opt)]
-> Opt -> IO (Either OptInfo Opt)
parseOptions [OptDescr (Opt -> ExceptT OptInfo IO Opt)]
options' Opt
defaults = do
  rawArgs <- IO [[Char]] -> IO [[Char]]
forall a. IO a -> IO a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO [[Char]]
getArgs
  prg <- liftIO getProgName
  parseOptionsFromArgs options' defaults prg rawArgs

parseOptionsFromArgs
  :: [OptDescr (Opt -> ExceptT OptInfo IO Opt)]
  -> Opt -> String -> [String] -> IO (Either OptInfo Opt)
parseOptionsFromArgs :: [OptDescr (Opt -> ExceptT OptInfo IO Opt)]
-> Opt -> [Char] -> [[Char]] -> IO (Either OptInfo Opt)
parseOptionsFromArgs [OptDescr (Opt -> ExceptT OptInfo IO Opt)]
options' Opt
defaults [Char]
prg [[Char]]
rawArgs = do
  let ([Opt -> ExceptT OptInfo IO Opt]
actions, [[Char]]
args, [[Char]]
unrecognizedOpts, [[Char]]
errors) =
           ArgOrder (Opt -> ExceptT OptInfo IO Opt)
-> [OptDescr (Opt -> ExceptT OptInfo IO Opt)]
-> [[Char]]
-> ([Opt -> ExceptT OptInfo IO Opt], [[Char]], [[Char]], [[Char]])
forall a.
ArgOrder a
-> [OptDescr a] -> [[Char]] -> ([a], [[Char]], [[Char]], [[Char]])
getOpt' ArgOrder (Opt -> ExceptT OptInfo IO Opt)
forall a. ArgOrder a
Permute [OptDescr (Opt -> ExceptT OptInfo IO Opt)]
options' ([[Char]] -> [[Char]]
preprocessArgs [[Char]]
rawArgs)

  let unknownOptionErrors :: [[Char]]
unknownOptionErrors =
       ([Char] -> [[Char]] -> [[Char]])
-> [[Char]] -> [[Char]] -> [[Char]]
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ([Char] -> [[Char]] -> [[Char]]
handleUnrecognizedOption ([Char] -> [[Char]] -> [[Char]])
-> ([Char] -> [Char]) -> [Char] -> [[Char]] -> [[Char]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> [Char] -> [Char]
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
'=')) []
       [[Char]]
unrecognizedOpts

  let mbArgs :: Maybe [[Char]]
mbArgs = case [[Char]]
args of
                 [] -> Maybe [[Char]]
forall a. Maybe a
Nothing
                 [[Char]]
xs -> [[Char]] -> Maybe [[Char]]
forall a. a -> Maybe a
Just [[Char]]
xs

  let adjustOpts :: Opt -> Opt
adjustOpts Opt
opts =
           Opt
opts{ optInputFiles =
                   map normalizePath <$> (optInputFiles opts <> mbArgs)
               , optStandalone = -- certain other options imply standalone
                   optStandalone opts ||
                     isJust (optTemplate opts) ||
                     optSelfContained opts ||
                     not (null (optIncludeInHeader opts)) ||
                     not (null (optIncludeBeforeBody opts)) ||
                     not (null (optIncludeAfterBody opts)) }

  if ([[Char]] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [[Char]]
errors Bool -> Bool -> Bool
&& [[Char]] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [[Char]]
unknownOptionErrors)
     then -- thread option data structure through all supplied option actions
       ExceptT OptInfo IO Opt -> IO (Either OptInfo Opt)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (ExceptT OptInfo IO Opt -> IO (Either OptInfo Opt))
-> ExceptT OptInfo IO Opt -> IO (Either OptInfo Opt)
forall a b. (a -> b) -> a -> b
$ Opt -> Opt
adjustOpts (Opt -> Opt) -> ExceptT OptInfo IO Opt -> ExceptT OptInfo IO Opt
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((ExceptT OptInfo IO Opt
 -> (Opt -> ExceptT OptInfo IO Opt) -> ExceptT OptInfo IO Opt)
-> ExceptT OptInfo IO Opt
-> [Opt -> ExceptT OptInfo IO Opt]
-> ExceptT OptInfo IO Opt
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
L.foldl' ExceptT OptInfo IO Opt
-> (Opt -> ExceptT OptInfo IO Opt) -> ExceptT OptInfo IO Opt
forall a b.
ExceptT OptInfo IO a
-> (a -> ExceptT OptInfo IO b) -> ExceptT OptInfo IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
(>>=) (Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
defaults) [Opt -> ExceptT OptInfo IO Opt]
actions)
     else Either OptInfo Opt -> IO (Either OptInfo Opt)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Either OptInfo Opt -> IO (Either OptInfo Opt))
-> Either OptInfo Opt -> IO (Either OptInfo Opt)
forall a b. (a -> b) -> a -> b
$ OptInfo -> Either OptInfo Opt
forall a b. a -> Either a b
Left (OptInfo -> Either OptInfo Opt) -> OptInfo -> Either OptInfo Opt
forall a b. (a -> b) -> a -> b
$ PandocError -> OptInfo
OptError (PandocError -> OptInfo) -> PandocError -> OptInfo
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError (Text -> PandocError) -> Text -> PandocError
forall a b. (a -> b) -> a -> b
$ [Char] -> Text
T.pack ([Char] -> Text) -> [Char] -> Text
forall a b. (a -> b) -> a -> b
$
             [[Char]] -> [Char]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Char]]
errors [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [[Char]] -> [Char]
unlines [[Char]]
unknownOptionErrors [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
             ([Char]
"Try " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
prg [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" --help for more information.")

-- | React to an 'OptInfo' by printing the requested information
-- and exiting or (if there was a parsing error) raising an error.
handleOptInfo :: ScriptingEngine -> OptInfo -> IO ()
handleOptInfo :: ScriptingEngine -> OptInfo -> IO ()
handleOptInfo ScriptingEngine
engine OptInfo
info = (PandocError -> IO ()) -> IO () -> IO ()
forall e a. Exception e => (e -> IO a) -> IO a -> IO a
E.handle (Either PandocError () -> IO ()
forall a. Either PandocError a -> IO a
handleError (Either PandocError () -> IO ())
-> (PandocError -> Either PandocError ()) -> PandocError -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PandocError -> Either PandocError ()
forall a b. a -> Either a b
Left) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
  case OptInfo
info of
    OptInfo
BashCompletion -> do
      datafiles <- IO [[Char]]
getDataFileNames
      tpl <- runIOorExplode $
               UTF8.toString <$>
                 readDefaultDataFile "bash_completion.tpl"
      let optnames (Option [Char]
shorts [[Char]]
longs ArgDescr a
_ [Char]
_) =
            (Char -> [Char]) -> [Char] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map (\Char
c -> [Char
'-',Char
c]) [Char]
shorts [[Char]] -> [[Char]] -> [[Char]]
forall a. [a] -> [a] -> [a]
++
            ([Char] -> [Char]) -> [[Char]] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map ([Char]
"--" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++) [[Char]]
longs
      let allopts = [[Char]] -> [Char]
unwords ((OptDescr (Opt -> ExceptT OptInfo IO Opt) -> [[Char]])
-> [OptDescr (Opt -> ExceptT OptInfo IO Opt)] -> [[Char]]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap OptDescr (Opt -> ExceptT OptInfo IO Opt) -> [[Char]]
forall {a}. OptDescr a -> [[Char]]
optnames [OptDescr (Opt -> ExceptT OptInfo IO Opt)]
options)
      UTF8.hPutStrLn stdout $ T.pack $ printf tpl allopts
          (T.unpack $ T.unwords readersNames)
          (T.unpack $ T.unwords writersNames)
          (T.unpack $ T.unwords $ map fst highlightingStyles)
          (unwords datafiles)
    OptInfo
ListInputFormats -> (Text -> IO ()) -> [Text] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Handle -> Text -> IO ()
UTF8.hPutStrLn Handle
stdout) [Text]
readersNames
    OptInfo
ListOutputFormats -> (Text -> IO ()) -> [Text] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Handle -> Text -> IO ()
UTF8.hPutStrLn Handle
stdout) [Text]
writersNames
    ListExtensions Maybe Text
mbfmt -> do
      let formatName :: Text
formatName = Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
"markdown" Maybe Text
mbfmt
      let allExts :: Extensions
allExts = Text -> Extensions
getAllExtensions Text
formatName
      if Text
formatName Text -> [Text] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem`
          (((Text, Reader PandocPure) -> Text)
-> [(Text, Reader PandocPure)] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map (Text, Reader PandocPure) -> Text
forall a b. (a, b) -> a
fst ([(Text, Reader PandocPure)]
forall (m :: * -> *). PandocMonad m => [(Text, Reader m)]
readers :: [(Text, Reader PandocPure)]) [Text] -> [Text] -> [Text]
forall a. [a] -> [a] -> [a]
++
           ((Text, Writer PandocPure) -> Text)
-> [(Text, Writer PandocPure)] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map (Text, Writer PandocPure) -> Text
forall a b. (a, b) -> a
fst ([(Text, Writer PandocPure)]
forall (m :: * -> *). PandocMonad m => [(Text, Writer m)]
writers :: [(Text, Writer PandocPure)]))
         then PandocError -> IO ()
forall e a. (HasCallStack, Exception e) => e -> IO a
E.throwIO (PandocError -> IO ()) -> PandocError -> IO ()
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError (Text -> PandocError) -> Text -> PandocError
forall a b. (a -> b) -> a -> b
$ Text
formatName Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>
                Text
" is not a recognized reader or writer format"
         else do
           let defExts :: Extensions
defExts = Text -> Extensions
getDefaultExtensions Text
formatName
           let showExt :: Extension -> [Char]
showExt Extension
x =
                (if Extension -> Extensions -> Bool
extensionEnabled Extension
x Extensions
defExts
                    then Char
'+'
                    else if Extension -> Extensions -> Bool
extensionEnabled Extension
x Extensions
allExts
                            then Char
'-'
                            else Char
' ') Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
: Int -> [Char] -> [Char]
forall a. Int -> [a] -> [a]
drop Int
4 (Extension -> [Char]
forall a. Show a => a -> [Char]
show Extension
x)
           (Extension -> IO ()) -> [Extension] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Handle -> Text -> IO ()
UTF8.hPutStrLn Handle
stdout (Text -> IO ()) -> (Extension -> Text) -> Extension -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack ([Char] -> Text) -> (Extension -> [Char]) -> Extension -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Extension -> [Char]
showExt)
              (Extensions -> [Extension]
extensionsToList Extensions
allExts)
    OptInfo
ListHighlightLanguages -> do
      let langs :: [[Char]]
langs = [ Text -> [Char]
T.unpack (Text -> Text
T.toLower (Syntax -> Text
sShortname Syntax
s))
                  | Syntax
s <- Map Text Syntax -> [Syntax]
forall k a. Map k a -> [a]
M.elems Map Text Syntax
defaultSyntaxMap
                  , Syntax -> Text
sShortname Syntax
s Text -> [Text] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem`
                     [[Char] -> Text
T.pack [Char]
"Alert", [Char] -> Text
T.pack [Char]
"Alert_indent"]
                  ]
      ([Char] -> IO ()) -> [[Char]] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Handle -> Text -> IO ()
UTF8.hPutStrLn Handle
stdout (Text -> IO ()) -> ([Char] -> Text) -> [Char] -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack) ([[Char]] -> [[Char]]
forall a. Ord a => [a] -> [a]
sort [[Char]]
langs)
    OptInfo
ListHighlightStyles -> do
      ((Text, Style) -> IO ()) -> [(Text, Style)] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Handle -> Text -> IO ()
UTF8.hPutStrLn Handle
stdout (Text -> IO ())
-> ((Text, Style) -> Text) -> (Text, Style) -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text, Style) -> Text
forall a b. (a, b) -> a
fst) [(Text, Style)]
highlightingStyles
    PrintDefaultTemplate Maybe [Char]
mbout Text
fmt -> do
      let write :: Text -> IO ()
write = (Text -> IO ())
-> ([Char] -> Text -> IO ()) -> Maybe [Char] -> Text -> IO ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Handle -> Text -> IO ()
UTF8.hPutStr Handle
stdout) ([Char] -> Text -> IO ()
UTF8.writeFile) Maybe [Char]
mbout

      templ <- PandocIO Text -> IO (Either PandocError Text)
forall a. PandocIO a -> IO (Either PandocError a)
runIO (PandocIO Text -> IO (Either PandocError Text))
-> PandocIO Text -> IO (Either PandocError Text)
forall a b. (a -> b) -> a -> b
$
               case [Char] -> ([Char], [Char])
splitExtension (Text -> [Char]
T.unpack Text
fmt) of
                    ([Char]
_, [Char]
"") -> do
                      -- built-in format
                      Maybe [Char] -> PandocIO ()
forall (m :: * -> *). PandocMonad m => Maybe [Char] -> m ()
setUserDataDir Maybe [Char]
forall a. Maybe a
Nothing
                      Text -> PandocIO Text
forall (m :: * -> *). PandocMonad m => Text -> m Text
getDefaultTemplate Text
fmt
                    ([Char], [Char])
_ -> do
                      -- format looks like a filepath => custom writer
                      components <- ScriptingEngine
-> forall (m :: * -> *).
   (PandocMonad m, MonadIO m) =>
   [Char] -> m (CustomComponents m)
engineLoadCustom ScriptingEngine
engine (Text -> [Char]
T.unpack Text
fmt)
                      case customTemplate components of
                        Just Text
t  -> Text -> PandocIO Text
forall a. a -> PandocIO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Text
t
                        Maybe Text
Nothing -> PandocError -> PandocIO Text
forall a e. (HasCallStack, Exception e) => e -> a
E.throw (PandocError -> PandocIO Text) -> PandocError -> PandocIO Text
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocNoTemplateError Text
fmt
      case templ of
           Right Text
t
             | Text -> Bool
T.null Text
t -> -- e.g. for docx, odt, json:
                 PandocError -> IO ()
forall e a. (HasCallStack, Exception e) => e -> IO a
E.throwIO (PandocError -> IO ()) -> PandocError -> IO ()
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocCouldNotFindDataFileError (Text -> PandocError) -> Text -> PandocError
forall a b. (a -> b) -> a -> b
$ [Char] -> Text
T.pack
                   ([Char]
"templates/default." [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Text -> [Char]
T.unpack Text
fmt)
             | Bool
otherwise -> Text -> IO ()
write Text
t
           Left PandocError
e  -> PandocError -> IO ()
forall e a. (HasCallStack, Exception e) => e -> IO a
E.throwIO PandocError
e
    PrintDefaultDataFile Maybe [Char]
mbout Text
f -> do
      let write :: ByteString -> IO ()
write = (ByteString -> IO ())
-> ([Char] -> ByteString -> IO ())
-> Maybe [Char]
-> ByteString
-> IO ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ByteString -> IO ()
BS.putStr [Char] -> ByteString -> IO ()
BS.writeFile Maybe [Char]
mbout
      PandocIO () -> IO ()
forall a. PandocIO a -> IO a
runIOorExplode (PandocIO () -> IO ()) -> PandocIO () -> IO ()
forall a b. (a -> b) -> a -> b
$ [Char] -> PandocIO ByteString
forall (m :: * -> *). PandocMonad m => [Char] -> m ByteString
readDefaultDataFile (Text -> [Char]
T.unpack Text
f) PandocIO ByteString -> (ByteString -> PandocIO ()) -> PandocIO ()
forall a b. PandocIO a -> (a -> PandocIO b) -> PandocIO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= IO () -> PandocIO ()
forall a. IO a -> PandocIO a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> PandocIO ())
-> (ByteString -> IO ()) -> ByteString -> PandocIO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> IO ()
write
    PrintHighlightStyle Maybe [Char]
mbout Text
styleName -> do
       let write :: ByteString -> IO ()
write = (ByteString -> IO ())
-> ([Char] -> ByteString -> IO ())
-> Maybe [Char]
-> ByteString
-> IO ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ByteString -> IO ()
B.putStr [Char] -> ByteString -> IO ()
B.writeFile Maybe [Char]
mbout
       sty <- PandocIO Style -> IO Style
forall a. PandocIO a -> IO a
runIOorExplode (PandocIO Style -> IO Style) -> PandocIO Style -> IO Style
forall a b. (a -> b) -> a -> b
$ [Char] -> PandocIO Style
forall (m :: * -> *). PandocMonad m => [Char] -> m Style
lookupHighlightingStyle (Text -> [Char]
T.unpack Text
styleName)
       write $ encodePretty'
         defConfig{confIndent = Spaces 4
                  ,confCompare = keyOrder
                    (map T.pack
                     ["text-color"
                     ,"background-color"
                     ,"line-number-color"
                     ,"line-number-background-color"
                     ,"bold"
                     ,"italic"
                     ,"underline"
                     ,"text-styles"])
                  ,confNumFormat = Generic
                  ,confTrailingNewline = True} sty
    OptInfo
VersionInfo -> [[Char]] -> Maybe [Char] -> [Char] -> IO ()
versionInfo [] Maybe [Char]
forall a. Maybe a
Nothing [Char]
""
    OptInfo
Help -> do
      prg <- IO [Char]
getProgName
      UTF8.hPutStr stdout (T.pack $ usageMessage prg options)
    OptError PandocError
e -> PandocError -> IO ()
forall e a. (HasCallStack, Exception e) => e -> IO a
E.throwIO PandocError
e
  IO ()
forall a. IO a
exitSuccess

-- | Supported LaTeX engines; the first item is used as default engine
-- when going through LaTeX.
latexEngines :: [String]
latexEngines :: [[Char]]
latexEngines  = [ [Char]
"pdflatex", [Char]
"lualatex", [Char]
"xelatex", [Char]
"latexmk", [Char]
"tectonic"
                , [Char]
"pdflatex-dev", [Char]
"lualatex-dev" ]

-- | Supported HTML PDF engines; the first item is used as default
-- engine when going through HTML.
htmlEngines :: [String]
htmlEngines :: [[Char]]
htmlEngines  = [[Char]
"weasyprint", [Char]
"wkhtmltopdf", [Char]
"pagedjs-cli", [Char]
"prince"]

engines :: [(Text, String)]
engines :: [(Text, [Char])]
engines = ([Char] -> (Text, [Char])) -> [[Char]] -> [(Text, [Char])]
forall a b. (a -> b) -> [a] -> [b]
map (Text
"html",) [[Char]]
htmlEngines [(Text, [Char])] -> [(Text, [Char])] -> [(Text, [Char])]
forall a. [a] -> [a] -> [a]
++
          ([Char] -> (Text, [Char])) -> [[Char]] -> [(Text, [Char])]
forall a b. (a -> b) -> [a] -> [b]
map (Text
"html5",) [[Char]]
htmlEngines [(Text, [Char])] -> [(Text, [Char])] -> [(Text, [Char])]
forall a. [a] -> [a] -> [a]
++
          ([Char] -> (Text, [Char])) -> [[Char]] -> [(Text, [Char])]
forall a b. (a -> b) -> [a] -> [b]
map (Text
"latex",) [[Char]]
latexEngines [(Text, [Char])] -> [(Text, [Char])] -> [(Text, [Char])]
forall a. [a] -> [a] -> [a]
++
          ([Char] -> (Text, [Char])) -> [[Char]] -> [(Text, [Char])]
forall a b. (a -> b) -> [a] -> [b]
map (Text
"beamer",) [[Char]]
latexEngines [(Text, [Char])] -> [(Text, [Char])] -> [(Text, [Char])]
forall a. [a] -> [a] -> [a]
++
          [ (Text
"ms", [Char]
"pdfroff")
          , (Text
"ms", [Char]
"groff")
          , (Text
"typst", [Char]
"typst")
          , (Text
"context", [Char]
"context")
          ]

pdfEngines :: [String]
pdfEngines :: [[Char]]
pdfEngines = [[Char]] -> [[Char]]
forall a. Ord a => [a] -> [a]
nubOrd ([[Char]] -> [[Char]]) -> [[Char]] -> [[Char]]
forall a b. (a -> b) -> a -> b
$ ((Text, [Char]) -> [Char]) -> [(Text, [Char])] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map (Text, [Char]) -> [Char]
forall a b. (a, b) -> b
snd [(Text, [Char])]
engines

-- For motivation see #8956.  We want to allow things like `-si` without
-- causing the `i` to be parsed as an optional boolean argument of `-s`.
-- This is for backwards compatibility given the addition of optional
-- boolean arguments in #8879.
preprocessArgs :: [String] -> [String]
preprocessArgs :: [[Char]] -> [[Char]]
preprocessArgs [] = []
preprocessArgs ([Char]
"--":[[Char]]
xs) = [Char]
"--" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [[Char]]
xs -- a bare '--' ends option parsing
-- note that -strue is interpreted as -strue while
-- -stmarkdown is interpreted as -s -tmarkdown
preprocessArgs ((Char
'-':Char
c:Char
d:[Char]
cs):[[Char]]
xs)
  | Char -> Bool
isShortBooleanOpt Char
c
  , case Char -> Char
toLower (Char -> Char) -> [Char] -> [Char]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char
dChar -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:[Char]
cs) of
      [Char]
"true" -> Bool
True
      [Char]
"false" -> Bool
True
      [Char]
_ -> Bool
False
    = (Char
'-'Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:Char
cChar -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:Char
dChar -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:[Char]
cs) [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [[Char]] -> [[Char]]
preprocessArgs [[Char]]
xs
  | Char -> Bool
isShortBooleanOpt Char
c
  , Char -> Bool
isShortOpt Char
d = [Char] -> [[Char]]
splitArg (Char
cChar -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:Char
dChar -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:[Char]
cs) [[Char]] -> [[Char]] -> [[Char]]
forall a. [a] -> [a] -> [a]
++ [[Char]] -> [[Char]]
preprocessArgs [[Char]]
xs
preprocessArgs ([Char]
x:[[Char]]
xs) = [Char]
x [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [[Char]] -> [[Char]]
preprocessArgs [[Char]]
xs

isShortBooleanOpt :: Char -> Bool
isShortBooleanOpt :: Char -> Bool
isShortBooleanOpt = (Char -> Set Char -> Bool
forall a. Ord a => a -> Set a -> Bool
`Set.member` Set Char
shortBooleanOpts)
 where
  shortBooleanOpts :: Set Char
shortBooleanOpts =
     [Char] -> Set Char
forall a. Ord a => [a] -> Set a
Set.fromList [Char
c | Option [Char
c] [[Char]]
_ (OptArg Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt
_ [Char]
"true|false") [Char]
_ <- [OptDescr (Opt -> ExceptT OptInfo IO Opt)]
options]

isShortOpt :: Char -> Bool
isShortOpt :: Char -> Bool
isShortOpt = (Char -> Set Char -> Bool
forall a. Ord a => a -> Set a -> Bool
`Set.member` Set Char
shortOpts)
 where
  shortOpts :: Set Char
shortOpts = [Char] -> Set Char
forall a. Ord a => [a] -> Set a
Set.fromList ([Char] -> Set Char) -> [Char] -> Set Char
forall a b. (a -> b) -> a -> b
$ [[Char]] -> [Char]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[Char]
cs | Option [Char]
cs [[Char]]
_ ArgDescr (Opt -> ExceptT OptInfo IO Opt)
_ [Char]
_ <- [OptDescr (Opt -> ExceptT OptInfo IO Opt)]
options]

splitArg :: String -> [String]
splitArg :: [Char] -> [[Char]]
splitArg (Char
c:Char
d:[Char]
cs)
  | Char -> Bool
isShortBooleanOpt Char
c
  , Char -> Bool
isShortOpt Char
d
  = [Char
'-',Char
c] [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
: [Char] -> [[Char]]
splitArg (Char
dChar -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:[Char]
cs)
splitArg (Char
c:[Char]
cs) = [Char
'-'Char -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:Char
cChar -> [Char] -> [Char]
forall a. a -> [a] -> [a]
:[Char]
cs]
splitArg [] = []

-- | A list of functions, each transforming the options data structure
--   in response to a command-line option.
options :: [OptDescr (Opt -> ExceptT OptInfo IO Opt)]
options :: [OptDescr (Opt -> ExceptT OptInfo IO Opt)]
options =
    [ [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"fr" [[Char]
"from",[Char]
"read"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optFrom = Just $ T.pack arg })
                  [Char]
"FORMAT")
                 [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"tw" [[Char]
"to",[Char]
"write"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optTo = Just $ T.pack arg })
                  [Char]
"FORMAT")
                 [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"o" [[Char]
"output"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optOutputFile =
                                             Just (normalizePath arg) })
                  [Char]
"FILE")
                 [Char]
"" -- "Name of output file"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"data-dir"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optDataDir =
                                  Just (normalizePath arg) })
                 [Char]
"DIRECTORY") -- "Directory containing pandoc data files."
                [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"M" [[Char]
"metadata"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> do
                     let ([Char]
key, [Char]
val) = [Char] -> ([Char], [Char])
splitField [Char]
arg
                     Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optMetadata = addMeta key val $
                                                 optMetadata opt })
                  [Char]
"KEY[:VALUE]")
                 [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"metadata-file"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optMetadataFiles =
                      optMetadataFiles opt ++ [normalizePath arg] })
                  [Char]
"FILE")
                 [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"d" [[Char]
"defaults"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> do
                     res <- IO (Either PandocError Opt)
-> ExceptT OptInfo IO (Either PandocError Opt)
forall a. IO a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either PandocError Opt)
 -> ExceptT OptInfo IO (Either PandocError Opt))
-> IO (Either PandocError Opt)
-> ExceptT OptInfo IO (Either PandocError Opt)
forall a b. (a -> b) -> a -> b
$ PandocIO Opt -> IO (Either PandocError Opt)
forall a. PandocIO a -> IO (Either PandocError a)
runIO (PandocIO Opt -> IO (Either PandocError Opt))
-> PandocIO Opt -> IO (Either PandocError Opt)
forall a b. (a -> b) -> a -> b
$ do
                       let defsState :: DefaultsState
defsState =
                             DefaultsState { curDefaults :: Maybe [Char]
curDefaults = Maybe [Char]
forall a. Maybe a
Nothing,
                                             inheritanceGraph :: [[[Char]]]
inheritanceGraph = [] }
                       fp <- Maybe [Char] -> [Char] -> PandocIO [Char]
forall (m :: * -> *).
(PandocMonad m, MonadIO m) =>
Maybe [Char] -> [Char] -> m [Char]
fullDefaultsPath (Opt -> Maybe [Char]
optDataDir Opt
opt) [Char]
arg
                       evalStateT (applyDefaults opt fp) defsState
                     case res of
                       Left PandocError
e -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError PandocError
e
                       Right Opt
x -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
x
                  )
                  [Char]
"FILE")
                [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"file-scope"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--file-scope" Maybe [Char]
arg
                        return opt { optFileScope = boolValue })
                  [Char]
"true|false")
                 [Char]
"" -- "Parse input files before combining"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"sandbox"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--sandbox" Maybe [Char]
arg
                        return opt { optSandbox = boolValue })
                  [Char]
"true|false")
                 [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"s" [[Char]
"standalone"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--standalone/-s" Maybe [Char]
arg
                        return opt { optStandalone = boolValue })
                  [Char]
"true|false")
                 [Char]
"" -- "Include needed header and footer on output"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"template"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                     Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optTemplate = Just (normalizePath arg) })
                  [Char]
"FILE")
                 [Char]
"" -- "Use custom template"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"V" [[Char]
"variable"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> do
                     let ([Char]
key, [Char]
val) = [Char] -> ([Char], [Char])
splitField [Char]
arg
                     Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optVariables =
                                  setVariable (T.pack key) (T.pack val) $
                                    optVariables opt })
                  [Char]
"KEY[:VALUE]")
                 [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"variable-json"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> do
                     let ([Char]
key, [Char]
json) = [Char] -> ([Char], [Char])
splitField [Char]
arg
                     case ByteString -> Either [Char] (Val Text)
forall a. FromJSON a => ByteString -> Either [Char] a
eitherDecode (ByteString -> ByteString
B.fromStrict (ByteString -> ByteString)
-> ([Char] -> ByteString) -> [Char] -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> ByteString
UTF8.fromString ([Char] -> ByteString) -> [Char] -> ByteString
forall a b. (a -> b) -> a -> b
$ [Char]
json) of
                       Right (Val Text
val :: Val Text) ->
                         Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optVariables =
                                      let Context m = optVariables opt
                                       in Context $ M.insert (T.pack key) val m }
                           -- note that this replaces any existing value, which
                           -- is different from what --variable does
                       Left [Char]
err'  -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError (Text -> PandocError) -> Text -> PandocError
forall a b. (a -> b) -> a -> b
$
                          Text
"Could not parse '" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> [Char] -> Text
T.pack [Char]
json Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"' as JSON:\n" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>
                           [Char] -> Text
T.pack [Char]
err')
                  [Char]
"KEY[:JSON]")
                 [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"wrap"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                    case [Char]
arg of
                      [Char]
"auto" -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optWrap = WrapAuto }
                      [Char]
"none" -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optWrap = WrapNone }
                      [Char]
"preserve" -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optWrap = WrapPreserve }
                      [Char]
_      -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError
                                 Text
"--wrap must be auto, none, or preserve")
                 [Char]
"auto|none|preserve")
                 [Char]
"" -- "Option for wrapping text in output"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"ascii"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--ascii" Maybe [Char]
arg
                        return opt { optAscii = boolValue })
                  [Char]
"true|false")
                 [Char]
""  -- "Prefer ASCII output"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"toc", [Char]
"table-of-contents"]
                ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                 (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--toc/--table-of-contents" Maybe [Char]
arg
                        return opt { optTableOfContents = boolValue })
                 [Char]
"true|false")
               [Char]
"" -- "Include table of contents"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"toc-depth"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                      case [Char] -> Maybe Int
forall (m :: * -> *) a. (MonadPlus m, Read a) => [Char] -> m a
safeStrRead [Char]
arg of
                           Just Int
t | Int
t Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
1 Bool -> Bool -> Bool
&& Int
t Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
6 ->
                                    Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optTOCDepth = t }
                           Maybe Int
_ -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError
                                Text
"Argument of --toc-depth must be a number 1-6")
                 [Char]
"NUMBER")
                 [Char]
"" -- "Number of levels to include in TOC"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"lof", [Char]
"list-of-figures"]
                ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                 (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--lof/--list-of-figures" Maybe [Char]
arg
                        return opt { optListOfFigures = boolValue })
                 [Char]
"true|false")
               [Char]
"" -- "Include list of figures"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"lot", [Char]
"list-of-tables"]
                ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                 (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--lot/--list-of-tables" Maybe [Char]
arg
                        return opt { optListOfTables = boolValue })
                 [Char]
"true|false")
               [Char]
"" -- "Include list of tables"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"N" [[Char]
"number-sections"]
                  ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                   (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--number-sections/-N" Maybe [Char]
arg
                        return opt { optNumberSections = boolValue })
                  [Char]
"true|false")
                 [Char]
"" -- "Number sections"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"number-offset"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                      case [Char] -> Maybe [Int]
forall (m :: * -> *) a. (MonadPlus m, Read a) => [Char] -> m a
safeStrRead ([Char]
"[" [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
arg [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
"]") of
                           Just [Int]
ns -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optNumberOffset = ns,
                                                   optNumberSections = True }
                           Maybe [Int]
_      -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError
                                       Text
"could not parse argument of --number-offset")
                 [Char]
"NUMBERS")
                 [Char]
"" -- "Starting number for sections, subsections, etc."

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"top-level-division"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                      case [Char]
arg of
                        [Char]
"section" -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optTopLevelDivision =
                                        TopLevelSection }
                        [Char]
"chapter" -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optTopLevelDivision =
                                        TopLevelChapter }
                        [Char]
"part"    -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optTopLevelDivision =
                                        TopLevelPart }
                        [Char]
"default" -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optTopLevelDivision =
                                        TopLevelDefault }
                        [Char]
_ -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError (Text -> PandocError) -> Text -> PandocError
forall a b. (a -> b) -> a -> b
$
                                Text
"Argument of --top-level division must be " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>
                                Text
"section,  chapter, part, or default" )
                   [Char]
"section|chapter|part")
                 [Char]
"" -- "Use top-level division type in LaTeX, ConTeXt, DocBook"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"extract-media"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                    Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optExtractMedia =
                                  Just (normalizePath arg) })
                  [Char]
"PATH")
                 [Char]
"" -- "Directory to which to extract embedded media"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"resource-path"]
                (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optResourcePath =
                                   splitSearchPath arg ++
                                    optResourcePath opt })
                   [Char]
"SEARCHPATH")
                  [Char]
"" -- "Paths to search for images and other resources"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"H" [[Char]
"include-in-header"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optIncludeInHeader =
                                             optIncludeInHeader opt ++
                                             [normalizePath arg] })
                  [Char]
"FILE")
                 [Char]
"" -- "File to include at end of header (implies -s)"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"B" [[Char]
"include-before-body"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optIncludeBeforeBody =
                                            optIncludeBeforeBody opt ++
                                            [normalizePath arg] })
                  [Char]
"FILE")
                 [Char]
"" -- "File to include before document body"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"A" [[Char]
"include-after-body"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optIncludeAfterBody =
                                            optIncludeAfterBody opt ++
                                            [normalizePath arg] })
                  [Char]
"FILE")
                 [Char]
"" -- "File to include after document body"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"no-highlight"]
                ((Opt -> ExceptT OptInfo IO Opt)
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. a -> ArgDescr a
NoArg
                 (\Opt
opt -> do
                     [Char] -> [Char] -> ExceptT OptInfo IO ()
deprecatedOption [Char]
"--no-highlight"
                       [Char]
"Use --syntax-highlighting=none instead."
                     Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optSyntaxHighlighting = NoHighlightingString }))
                 [Char]
"" -- "Don't highlight source code"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"highlight-style"]
                (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                 (\[Char]
arg Opt
opt -> do
                     [Char] -> [Char] -> ExceptT OptInfo IO ()
deprecatedOption [Char]
"--highlight-style"
                       [Char]
"Use --syntax-highlighting instead."
                     Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optSyntaxHighlighting =
                                 T.pack $ normalizePath arg })
                 [Char]
"STYLE|FILE")
                 [Char]
"" -- "Style for highlighted code"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"syntax-definition"]
                (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                 (\[Char]
arg Opt
opt ->
                   Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optSyntaxDefinitions = normalizePath arg :
                                optSyntaxDefinitions opt })
                 [Char]
"FILE")
                [Char]
"" -- "Syntax definition (xml) file"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"syntax-highlighting"]
                (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                 (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optSyntaxHighlighting =
                                 T.pack $ normalizePath arg })
                 [Char]
"none|default|idiomatic|<stylename>|<themepath>")
                 [Char]
"" -- "syntax highlighting method for code"


    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"dpi"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                    case [Char] -> Maybe Int
forall (m :: * -> *) a. (MonadPlus m, Read a) => [Char] -> m a
safeStrRead [Char]
arg of
                         Just Int
t | Int
t Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optDpi = t }
                         Maybe Int
_              -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError
                                        Text
"Argument of --dpi must be a number greater than 0")
                  [Char]
"NUMBER")
                 [Char]
"" -- "Dpi (default 96)"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"eol"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                    case Char -> Char
toLower (Char -> Char) -> [Char] -> [Char]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Char]
arg of
                      [Char]
"crlf"   -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optEol = CRLF }
                      [Char]
"lf"     -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optEol = LF }
                      [Char]
"native" -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optEol = Native }
                      -- mac-syntax (cr) is not supported in ghc-base.
                      [Char]
_      -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError
                                Text
"Argument of --eol must be crlf, lf, or native")
                  [Char]
"crlf|lf|native")
                 [Char]
"" -- "EOL (default OS-dependent)"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"columns"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                      case [Char] -> Maybe Int
forall (m :: * -> *) a. (MonadPlus m, Read a) => [Char] -> m a
safeStrRead [Char]
arg of
                           Just Int
t | Int
t Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optColumns = t }
                           Maybe Int
_              -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError
                                   Text
"Argument of --columns must be a number greater than 0")
                 [Char]
"NUMBER")
                 [Char]
"" -- "Length of line in characters"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"p" [[Char]
"preserve-tabs"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--preserve-tabs/-p" Maybe [Char]
arg
                        return opt { optPreserveTabs = boolValue })
                  [Char]
"true|false")
                 [Char]
"" -- "Preserve tabs instead of converting to spaces"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"tab-stop"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                      case [Char] -> Maybe Int
forall (m :: * -> *) a. (MonadPlus m, Read a) => [Char] -> m a
safeStrRead [Char]
arg of
                           Just Int
t | Int
t Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optTabStop = t }
                           Maybe Int
_              -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError
                                  Text
"Argument of --tab-stop must be a number greater than 0")
                  [Char]
"NUMBER")
                 [Char]
"" -- "Tab stop (default 4)"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"pdf-engine"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> do
                     let b :: [Char]
b = [Char] -> [Char]
takeBaseName [Char]
arg
                     if [Char]
b [Char] -> [[Char]] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [[Char]]
pdfEngines
                        then Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optPdfEngine = Just arg }
                        else PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$
                              Text -> PandocError
PandocOptionError (Text -> PandocError) -> Text -> PandocError
forall a b. (a -> b) -> a -> b
$ [Char] -> Text
T.pack ([Char] -> Text) -> [Char] -> Text
forall a b. (a -> b) -> a -> b
$
                              [Char]
"Argument of --pdf-engine must be one of\n"
                               [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ ([Char] -> [Char]) -> [[Char]] -> [Char]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\[Char]
e -> [Char]
"\t" [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
e [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
"\n") [[Char]]
pdfEngines)
                  [Char]
"PROGRAM")
                 [Char]
"" -- "Name of program to use in generating PDF"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"pdf-engine-opt"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> do
                      let oldArgs :: [[Char]]
oldArgs = Opt -> [[Char]]
optPdfEngineOpts Opt
opt
                      Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optPdfEngineOpts = oldArgs ++ [arg]})
                  [Char]
"STRING")
                 [Char]
"" -- "Flags to pass to the PDF-engine, all instances of this option are accumulated and used"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"reference-doc"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                    Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optReferenceDoc = Just $ normalizePath arg })
                  [Char]
"FILE")
                 [Char]
"" -- "Path of custom reference doc"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"self-contained"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        [Char] -> [Char] -> ExceptT OptInfo IO ()
deprecatedOption [Char]
"--self-contained" [Char]
"use --embed-resources --standalone"
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--self-contained" Maybe [Char]
arg
                        return opt { optSelfContained = boolValue })
                    [Char]
"true|false")
                 [Char]
"" -- "Make slide shows include all the needed js and css (deprecated)"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"embed-resources"] -- maybe True (\argStr -> argStr == "true") arg
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--embed-resources" Maybe [Char]
arg
                        return opt { optEmbedResources =  boolValue })
                  [Char]
"true|false")
                 [Char]
"" -- "Make slide shows include all the needed js and css"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"link-images"] -- maybe True (\argStr -> argStr == "true") arg
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--link-images" Maybe [Char]
arg
                        return opt { optLinkImages =  boolValue })
                  [Char]
"true|false")
                 [Char]
"" -- "Link images in ODT rather than embedding them"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"request-header"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> do
                     let ([Char]
key, [Char]
val) = [Char] -> ([Char], [Char])
splitField [Char]
arg
                     Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optRequestHeaders =
                       (T.pack key, T.pack val) : optRequestHeaders opt })
                  [Char]
"NAME:VALUE")
                 [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"no-check-certificate"]
                ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                 (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--no-check-certificate" Maybe [Char]
arg
                        return opt { optNoCheckCertificate = boolValue })
                 [Char]
"true|false")
                [Char]
"" -- "Disable certificate validation"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"abbreviations"]
                (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                 (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optAbbreviations =
                                            Just $ normalizePath arg })
                [Char]
"FILE")
                [Char]
"" -- "Specify file for custom abbreviations"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"indented-code-classes"]
                  (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                   (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optIndentedCodeClasses = T.words $
                                             T.map (\Char
c -> if Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
',' then Char
' ' else Char
c) $
                                             T.pack arg })
                   [Char]
"STRING")
                  [Char]
"" -- "Classes (whitespace- or comma-separated) to use for indented code-blocks"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"default-image-extension"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optDefaultImageExtension = T.pack arg })
                   [Char]
"extension")
                  [Char]
"" -- "Default extension for extensionless images"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"F" [[Char]
"filter"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optFilters =
                      optFilters opt ++ [JSONFilter (normalizePath arg)] })
                  [Char]
"PROGRAM")
                 [Char]
"" -- "External JSON filter"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"L" [[Char]
"lua-filter"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optFilters =
                      optFilters opt ++ [LuaFilter (normalizePath arg)] })
                  [Char]
"SCRIPTPATH")
                 [Char]
"" -- "Lua filter"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"shift-heading-level-by"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                      case [Char] -> Maybe Int
forall (m :: * -> *) a. (MonadPlus m, Read a) => [Char] -> m a
safeStrRead [Char]
arg of
                           Just Int
t ->
                               Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optShiftHeadingLevelBy = t }
                           Maybe Int
_              -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError
                                               Text
"Argument of --shift-heading-level-by must be an integer")
                  [Char]
"NUMBER")
                 [Char]
"" -- "Shift heading level"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"base-header-level"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> do
                      [Char] -> [Char] -> ExceptT OptInfo IO ()
deprecatedOption [Char]
"--base-header-level"
                        [Char]
"Use --shift-heading-level-by instead."
                      case [Char] -> Maybe Int
forall (m :: * -> *) a. (MonadPlus m, Read a) => [Char] -> m a
safeStrRead [Char]
arg of
                           Just Int
t | Int
t Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 Bool -> Bool -> Bool
&& Int
t Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
6 ->
                               Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optShiftHeadingLevelBy = t - 1 }
                           Maybe Int
_              -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError
                                               Text
"Argument of --base-header-level must be 1-5")
                  [Char]
"NUMBER")
                 [Char]
"" -- "Headers base level"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"track-changes"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> do
                     action <- case [Char]
arg of
                            [Char]
"accept" -> TrackChanges -> ExceptT OptInfo IO TrackChanges
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return TrackChanges
AcceptChanges
                            [Char]
"reject" -> TrackChanges -> ExceptT OptInfo IO TrackChanges
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return TrackChanges
RejectChanges
                            [Char]
"all"    -> TrackChanges -> ExceptT OptInfo IO TrackChanges
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return TrackChanges
AllChanges
                            [Char]
_        -> PandocError -> ExceptT OptInfo IO TrackChanges
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO TrackChanges)
-> PandocError -> ExceptT OptInfo IO TrackChanges
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError (Text -> PandocError) -> Text -> PandocError
forall a b. (a -> b) -> a -> b
$ [Char] -> Text
T.pack
                               [Char]
"Argument of --track-changes must be accept, reject, or all"
                     return opt { optTrackChanges = action })
                  [Char]
"accept|reject|all")
                 [Char]
"" -- "Accepting or reject MS Word track-changes.""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"strip-comments"]
                ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                 (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--strip-comments" Maybe [Char]
arg
                        return opt { optStripComments = boolValue })
                 [Char]
"true|false")
               [Char]
"" -- "Strip HTML comments"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"reference-links"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--reference-links" Maybe [Char]
arg
                        return opt { optReferenceLinks = boolValue })
                  [Char]
"true|false")
                 [Char]
"" -- "Use reference links in parsing HTML"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"reference-location"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> do
                     action <- case [Char]
arg of
                            [Char]
"block"    -> ReferenceLocation -> ExceptT OptInfo IO ReferenceLocation
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ReferenceLocation
EndOfBlock
                            [Char]
"section"  -> ReferenceLocation -> ExceptT OptInfo IO ReferenceLocation
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ReferenceLocation
EndOfSection
                            [Char]
"document" -> ReferenceLocation -> ExceptT OptInfo IO ReferenceLocation
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ReferenceLocation
EndOfDocument
                            [Char]
_        -> PandocError -> ExceptT OptInfo IO ReferenceLocation
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO ReferenceLocation)
-> PandocError -> ExceptT OptInfo IO ReferenceLocation
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError (Text -> PandocError) -> Text -> PandocError
forall a b. (a -> b) -> a -> b
$ [Char] -> Text
T.pack
                               [Char]
"Argument of --reference-location must be block, section, or document"
                     return opt { optReferenceLocation = action })
                  [Char]
"block|section|document")
                 [Char]
"" -- "Specify where reference links and footnotes go"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"figure-caption-position"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> do
                     pos <- case [Char]
arg of
                            [Char]
"above"  -> CaptionPosition -> ExceptT OptInfo IO CaptionPosition
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return CaptionPosition
CaptionAbove
                            [Char]
"below"  -> CaptionPosition -> ExceptT OptInfo IO CaptionPosition
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return CaptionPosition
CaptionBelow
                            [Char]
_        -> PandocError -> ExceptT OptInfo IO CaptionPosition
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO CaptionPosition)
-> PandocError -> ExceptT OptInfo IO CaptionPosition
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError (Text -> PandocError) -> Text -> PandocError
forall a b. (a -> b) -> a -> b
$ [Char] -> Text
T.pack
                               [Char]
"Argument of --figure-caption-position must be above or below"
                     return opt { optFigureCaptionPosition = pos })
                  [Char]
"above|below")
                 [Char]
"" -- "Specify where figure captions go"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"table-caption-position"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> do
                     pos <- case [Char]
arg of
                            [Char]
"above"  -> CaptionPosition -> ExceptT OptInfo IO CaptionPosition
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return CaptionPosition
CaptionAbove
                            [Char]
"below"  -> CaptionPosition -> ExceptT OptInfo IO CaptionPosition
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return CaptionPosition
CaptionBelow
                            [Char]
_        -> PandocError -> ExceptT OptInfo IO CaptionPosition
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO CaptionPosition)
-> PandocError -> ExceptT OptInfo IO CaptionPosition
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError (Text -> PandocError) -> Text -> PandocError
forall a b. (a -> b) -> a -> b
$ [Char] -> Text
T.pack
                               [Char]
"Argument of --table-caption-position must be above or below"
                     return opt { optTableCaptionPosition = pos })
                  [Char]
"above|below")
                 [Char]
"" -- "Specify where table captions go"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"markdown-headings"]
                  (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                    (\[Char]
arg Opt
opt -> do
                      headingFormat <- case [Char]
arg of
                        [Char]
"setext" -> Bool -> ExceptT OptInfo IO Bool
forall a. a -> ExceptT OptInfo IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
                        [Char]
"atx" -> Bool -> ExceptT OptInfo IO Bool
forall a. a -> ExceptT OptInfo IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
                        [Char]
_ -> PandocError -> ExceptT OptInfo IO Bool
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Bool)
-> PandocError -> ExceptT OptInfo IO Bool
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError (Text -> PandocError) -> Text -> PandocError
forall a b. (a -> b) -> a -> b
$ [Char] -> Text
T.pack
                          [Char]
"Argument of --markdown-headings must be setext or atx"
                      pure opt { optSetextHeaders = headingFormat }
                    )
                  [Char]
"setext|atx")
                  [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"list-tables"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--list-tables" Maybe [Char]
arg
                        return opt { optListTables = boolValue })
                  [Char]
"true|false")
                 [Char]
"" -- "Use list tables for RST"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"listings"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                      [Char] -> [Char] -> ExceptT OptInfo IO ()
deprecatedOption [Char]
"--listings"
                        [Char]
"Use --syntax-highlighting=idiomatic instead."
                      boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--listings" Maybe [Char]
arg
                      return $
                        if boolValue
                        then opt { optSyntaxHighlighting =
                                   IdiomaticHighlightingString }
                        else opt)
                  [Char]
"true|false")
                 [Char]
"" -- "Use listings package for LaTeX code blocks"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"i" [[Char]
"incremental"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--incremental/-i" Maybe [Char]
arg
                        return opt { optIncremental = boolValue })
                  [Char]
"true|false")
                 [Char]
"" -- "Make list items display incrementally in Slidy/Slideous/S5"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"slide-level"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                      case [Char] -> Maybe Int
forall (m :: * -> *) a. (MonadPlus m, Read a) => [Char] -> m a
safeStrRead [Char]
arg of
                           Just Int
t | Int
t Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0 Bool -> Bool -> Bool
&& Int
t Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
6 ->
                                    Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optSlideLevel = Just t }
                           Maybe Int
_      -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError
                                    Text
"Argument of --slide-level must be a number between 0 and 6")
                 [Char]
"NUMBER")
                 [Char]
"" -- "Force header level for slides"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"section-divs"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--section-divs" Maybe [Char]
arg
                        return opt { optSectionDivs = boolValue })
                  [Char]
"true|false")
                 [Char]
"" -- "Put sections in div tags in HTML"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"html-q-tags"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--html-q-tags" Maybe [Char]
arg
                        return opt { optHtmlQTags = boolValue })
                  [Char]
"true|false")
                 [Char]
"" -- "Use <q> tags for quotes in HTML"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"email-obfuscation"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> do
                     method <- case [Char]
arg of
                            [Char]
"references" -> ObfuscationMethod -> ExceptT OptInfo IO ObfuscationMethod
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ObfuscationMethod
ReferenceObfuscation
                            [Char]
"javascript" -> ObfuscationMethod -> ExceptT OptInfo IO ObfuscationMethod
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ObfuscationMethod
JavascriptObfuscation
                            [Char]
"none"       -> ObfuscationMethod -> ExceptT OptInfo IO ObfuscationMethod
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ObfuscationMethod
NoObfuscation
                            [Char]
_            -> PandocError -> ExceptT OptInfo IO ObfuscationMethod
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO ObfuscationMethod)
-> PandocError -> ExceptT OptInfo IO ObfuscationMethod
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError (Text -> PandocError) -> Text -> PandocError
forall a b. (a -> b) -> a -> b
$ [Char] -> Text
T.pack
                               [Char]
"Argument of --email-obfuscation must be references, javascript, or none"
                     return opt { optEmailObfuscation = method })
                  [Char]
"none|javascript|references")
                 [Char]
"" -- "Method for obfuscating email in HTML"

     , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"id-prefix"]
                  (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                   (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optIdentifierPrefix = T.pack arg })
                   [Char]
"STRING")
                  [Char]
"" -- "Prefix to add to automatically generated HTML identifiers"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"T" [[Char]
"title-prefix"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                    Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt {
                       optVariables =
                         setVariable "title-prefix" (T.pack arg) $
                           optVariables opt,
                       optStandalone = True })
                  [Char]
"STRING")
                 [Char]
"" -- "String to prefix to HTML window title"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"c" [[Char]
"css"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optCss = optCss opt ++ [arg] })
                  -- add new link to end, so it is included in proper order
                  [Char]
"URL")
                 [Char]
"" -- "Link to CSS style sheet"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"epub-subdirectory"]
             (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                     Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optEpubSubdirectory = arg })
                  [Char]
"DIRNAME")
                 [Char]
"" -- "Name of subdirectory for epub content in OCF container"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"epub-cover-image"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                     Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optVariables =
                       setVariable "epub-cover-image"
                         (T.pack $ normalizePath arg) $
                         optVariables opt })
                  [Char]
"FILE")
                 [Char]
"" -- "Path of epub cover image"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"epub-title-page"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                     boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--epub-title-page" Maybe [Char]
arg
                     return opt{ optEpubTitlePage = boolValue })
                 [Char]
"true|false")
                 [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"epub-metadata"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optEpubMetadata = Just $
                                             normalizePath arg })
                  [Char]
"FILE")
                 [Char]
"" -- "Path of epub metadata file"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"epub-embed-font"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                     Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optEpubFonts = normalizePath arg :
                                                optEpubFonts opt })
                  [Char]
"FILE")
                 [Char]
"" -- "Directory of fonts to embed"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"split-level"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                      case [Char] -> Maybe Int
forall (m :: * -> *) a. (MonadPlus m, Read a) => [Char] -> m a
safeStrRead [Char]
arg of
                           Just Int
t | Int
t Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
1 Bool -> Bool -> Bool
&& Int
t Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
6 ->
                                    Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optSplitLevel = t }
                           Maybe Int
_      -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError
                                    Text
"Argument of --split-level must be a number between 1 and 6")
                 [Char]
"NUMBER")
                 [Char]
"" -- "Header level at which to split documents in chunked HTML or EPUB"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"chunk-template"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                     Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optChunkTemplate = Just (T.pack arg) })
                 [Char]
"PATHTEMPLATE")
                 [Char]
"" -- "Template for file paths in chunkedhtml"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"epub-chapter-level"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> do
                      [Char] -> [Char] -> ExceptT OptInfo IO ()
deprecatedOption [Char]
"--epub-chapter-level"
                                       [Char]
"use --split-level"
                      case [Char] -> Maybe Int
forall (m :: * -> *) a. (MonadPlus m, Read a) => [Char] -> m a
safeStrRead [Char]
arg of
                           Just Int
t | Int
t Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
1 Bool -> Bool -> Bool
&& Int
t Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
6 ->
                                    Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optSplitLevel = t }
                           Maybe Int
_      -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError
                                    Text
"Argument of --epub-chapter-level must be a number between 1 and 6")
                 [Char]
"NUMBER")
                 [Char]
"" -- "Header level at which to split documents in chunked HTML or EPUB"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"ipynb-output"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                    case [Char]
arg of
                      [Char]
"all" -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optIpynbOutput = IpynbOutputAll }
                      [Char]
"best" -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optIpynbOutput = IpynbOutputBest }
                      [Char]
"none" -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optIpynbOutput = IpynbOutputNone }
                      [Char]
_ -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError
                             Text
"Argument of --ipynb-output must be all, none, or best")
                 [Char]
"all|none|best")
                 [Char]
"" -- "Starting number for sections, subsections, etc."

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"C" [[Char]
"citeproc"]
                 ((Opt -> ExceptT OptInfo IO Opt)
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optFilters =
                      optFilters opt ++ [CiteprocFilter] }))
                 [Char]
"" -- "Process citations"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"bibliography"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optMetadata =
                                            addMeta "bibliography"
                                              (normalizePath arg) $
                                              optMetadata opt })
                   [Char]
"FILE")
                 [Char]
""

     , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"csl"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> do
                    case Text -> Meta -> Maybe MetaValue
lookupMeta ([Char] -> Text
T.pack [Char]
"csl") (Meta -> Maybe MetaValue) -> Meta -> Maybe MetaValue
forall a b. (a -> b) -> a -> b
$ Opt -> Meta
optMetadata Opt
opt of
                      Just MetaValue
_ -> PandocError -> ExceptT OptInfo IO Opt
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Opt)
-> PandocError -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError
                                   Text
"--csl option can only be used once"
                      Maybe MetaValue
Nothing -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optMetadata = addMeta "csl" (normalizePath arg) $
                      optMetadata opt })
                   [Char]
"FILE")
                 [Char]
""

     , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"citation-abbreviations"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt ->
                     Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optMetadata =
                                  addMeta "citation-abbreviations"
                                    (normalizePath arg) $ optMetadata opt })
                   [Char]
"FILE")
                 [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"natbib"]
                 ((Opt -> ExceptT OptInfo IO Opt)
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optCiteMethod = Natbib }))
                 [Char]
"" -- "Use natbib cite commands in LaTeX output"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"biblatex"]
                 ((Opt -> ExceptT OptInfo IO Opt)
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optCiteMethod = Biblatex }))
                 [Char]
"" -- "Use biblatex cite commands in LaTeX output"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"mathml"]
                 ((Opt -> ExceptT OptInfo IO Opt)
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt ->
                      Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optHTMLMathMethod = MathML }))
                 [Char]
"" -- "Use mathml for HTML math"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"webtex"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                      let url' :: Text
url' = Text -> ([Char] -> Text) -> Maybe [Char] -> Text
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Text
defaultWebTeXURL [Char] -> Text
T.pack Maybe [Char]
arg
                      Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optHTMLMathMethod = WebTeX url' })
                  [Char]
"URL")
                 [Char]
"" -- "Use web service for HTML math"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"mathjax"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                      let url' :: Text
url' = Text -> ([Char] -> Text) -> Maybe [Char] -> Text
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Text
defaultMathJaxURL [Char] -> Text
T.pack Maybe [Char]
arg
                      Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optHTMLMathMethod = MathJax url'})
                  [Char]
"URL")
                 [Char]
"" -- "Use MathJax for HTML math"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"katex"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt ->
                      Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt
                        { optHTMLMathMethod = KaTeX $
                           maybe defaultKaTeXURL T.pack arg })
                  [Char]
"URL")
                  [Char]
"" -- Use KaTeX for HTML Math

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"gladtex"]
                 ((Opt -> ExceptT OptInfo IO Opt)
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt ->
                      Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optHTMLMathMethod = GladTeX }))
                 [Char]
"" -- "Use gladtex for HTML math"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"trace"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--trace" Maybe [Char]
arg
                        return opt { optTrace = boolValue })
                  [Char]
"true|false")
                 [Char]
"" -- "Turn on diagnostic tracing in readers."

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"dump-args"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--dump-args" Maybe [Char]
arg
                        return opt { optDumpArgs = boolValue })
                  [Char]
"true|false")
                 [Char]
"" -- "Print output filename and arguments to stdout."

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"ignore-args"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--ignore-args" Maybe [Char]
arg
                        return opt { optIgnoreArgs = boolValue })
                  [Char]
"true|false")
                 [Char]
"" -- "Ignore command-line arguments."

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"verbose"]
                 ((Opt -> ExceptT OptInfo IO Opt)
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optVerbosity = INFO }))
                 [Char]
"" -- "Verbose diagnostic output."

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"quiet"]
                 ((Opt -> ExceptT OptInfo IO Opt)
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optVerbosity = ERROR }))
                 [Char]
"" -- "Suppress warnings."

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"fail-if-warnings"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg
                  (\Maybe [Char]
arg Opt
opt -> do
                        boolValue <- Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
"--fail-if-warnings" Maybe [Char]
arg
                        return opt { optFailIfWarnings = boolValue })
                  [Char]
"true|false")
                 [Char]
"" -- "Exit with error status if there were  warnings."

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"log"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opt -> Opt -> ExceptT OptInfo IO Opt
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optLogFile = Just $
                                            normalizePath arg })
                [Char]
"FILE")
                [Char]
"" -- "Log messages in JSON format to this file."

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"bash-completion"]
                 ((Opt -> ExceptT OptInfo IO Opt)
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. a -> ArgDescr a
NoArg (\Opt
_ -> OptInfo -> ExceptT OptInfo IO Opt
forall a. OptInfo -> ExceptT OptInfo IO a
optInfo OptInfo
BashCompletion))
                 [Char]
"" -- "Print bash completion script"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"list-input-formats"]
                 ((Opt -> ExceptT OptInfo IO Opt)
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. a -> ArgDescr a
NoArg (\Opt
_ -> OptInfo -> ExceptT OptInfo IO Opt
forall a. OptInfo -> ExceptT OptInfo IO a
optInfo OptInfo
ListInputFormats))
                 [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"list-output-formats"]
                 ((Opt -> ExceptT OptInfo IO Opt)
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. a -> ArgDescr a
NoArg (\Opt
_ -> OptInfo -> ExceptT OptInfo IO Opt
forall a. OptInfo -> ExceptT OptInfo IO a
optInfo OptInfo
ListOutputFormats))
                 [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"list-extensions"]
                 ((Maybe [Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. (Maybe [Char] -> a) -> [Char] -> ArgDescr a
OptArg (\Maybe [Char]
arg Opt
_ -> OptInfo -> ExceptT OptInfo IO Opt
forall a. OptInfo -> ExceptT OptInfo IO a
optInfo (OptInfo -> ExceptT OptInfo IO Opt)
-> OptInfo -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Maybe Text -> OptInfo
ListExtensions (Maybe Text -> OptInfo) -> Maybe Text -> OptInfo
forall a b. (a -> b) -> a -> b
$ [Char] -> Text
T.pack ([Char] -> Text) -> Maybe [Char] -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe [Char]
arg)
                 [Char]
"FORMAT")
                 [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"list-highlight-languages"]
                 ((Opt -> ExceptT OptInfo IO Opt)
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. a -> ArgDescr a
NoArg (\Opt
_ -> OptInfo -> ExceptT OptInfo IO Opt
forall a. OptInfo -> ExceptT OptInfo IO a
optInfo OptInfo
ListHighlightLanguages))
                 [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"list-highlight-styles"]
                 ((Opt -> ExceptT OptInfo IO Opt)
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. a -> ArgDescr a
NoArg (\Opt
_ -> OptInfo -> ExceptT OptInfo IO Opt
forall a. OptInfo -> ExceptT OptInfo IO a
optInfo OptInfo
ListHighlightStyles))
                 [Char]
""

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"D" [[Char]
"print-default-template"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opts -> OptInfo -> ExceptT OptInfo IO Opt
forall a. OptInfo -> ExceptT OptInfo IO a
optInfo (OptInfo -> ExceptT OptInfo IO Opt)
-> OptInfo -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$
                    Maybe [Char] -> Text -> OptInfo
PrintDefaultTemplate (Opt -> Maybe [Char]
optOutputFile Opt
opts) ([Char] -> Text
T.pack [Char]
arg))
                 [Char]
"FORMAT")
                 [Char]
"" -- "Print default template for FORMAT"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"print-default-data-file"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opts -> OptInfo -> ExceptT OptInfo IO Opt
forall a. OptInfo -> ExceptT OptInfo IO a
optInfo (OptInfo -> ExceptT OptInfo IO Opt)
-> OptInfo -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$
                    Maybe [Char] -> Text -> OptInfo
PrintDefaultDataFile (Opt -> Maybe [Char]
optOutputFile Opt
opts) ([Char] -> Text
T.pack [Char]
arg))
                 [Char]
"FILE")
                  [Char]
"" -- "Print default data file"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"" [[Char]
"print-highlight-style"]
                 (([Char] -> Opt -> ExceptT OptInfo IO Opt)
-> [Char] -> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. ([Char] -> a) -> [Char] -> ArgDescr a
ReqArg
                  (\[Char]
arg Opt
opts ->
                    OptInfo -> ExceptT OptInfo IO Opt
forall a. OptInfo -> ExceptT OptInfo IO a
optInfo (OptInfo -> ExceptT OptInfo IO Opt)
-> OptInfo -> ExceptT OptInfo IO Opt
forall a b. (a -> b) -> a -> b
$ Maybe [Char] -> Text -> OptInfo
PrintHighlightStyle (Opt -> Maybe [Char]
optOutputFile Opt
opts)
                               ([Char] -> Text
T.pack [Char]
arg))
                  [Char]
"STYLE|FILE")
                 [Char]
"" -- "Print default template for FORMAT"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"v" [[Char]
"version"]
                 ((Opt -> ExceptT OptInfo IO Opt)
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. a -> ArgDescr a
NoArg (\Opt
_ -> OptInfo -> ExceptT OptInfo IO Opt
forall a. OptInfo -> ExceptT OptInfo IO a
optInfo OptInfo
VersionInfo))
                 [Char]
"" -- "Print version"

    , [Char]
-> [[Char]]
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
-> [Char]
-> OptDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. [Char] -> [[Char]] -> ArgDescr a -> [Char] -> OptDescr a
Option [Char]
"h" [[Char]
"help"]
                 ((Opt -> ExceptT OptInfo IO Opt)
-> ArgDescr (Opt -> ExceptT OptInfo IO Opt)
forall a. a -> ArgDescr a
NoArg (\Opt
_ -> OptInfo -> ExceptT OptInfo IO Opt
forall a. OptInfo -> ExceptT OptInfo IO a
optInfo OptInfo
Help))
                 [Char]
"" -- "Show help"
    ]

optError :: PandocError -> ExceptT OptInfo IO a
optError :: forall a. PandocError -> ExceptT OptInfo IO a
optError = OptInfo -> ExceptT OptInfo IO a
forall a. OptInfo -> ExceptT OptInfo IO a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (OptInfo -> ExceptT OptInfo IO a)
-> (PandocError -> OptInfo) -> PandocError -> ExceptT OptInfo IO a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PandocError -> OptInfo
OptError

optInfo :: OptInfo -> ExceptT OptInfo IO a
optInfo :: forall a. OptInfo -> ExceptT OptInfo IO a
optInfo = OptInfo -> ExceptT OptInfo IO a
forall a. OptInfo -> ExceptT OptInfo IO a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError

-- Returns usage message
usageMessage :: String -> [OptDescr (Opt -> ExceptT OptInfo IO Opt)] -> String
usageMessage :: [Char] -> [OptDescr (Opt -> ExceptT OptInfo IO Opt)] -> [Char]
usageMessage [Char]
programName = [Char] -> [OptDescr (Opt -> ExceptT OptInfo IO Opt)] -> [Char]
forall a. [Char] -> [OptDescr a] -> [Char]
usageInfo ([Char]
programName [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
" [OPTIONS] [FILES]")

copyrightMessage :: String
copyrightMessage :: [Char]
copyrightMessage = [Char] -> [[Char]] -> [Char]
forall a. [a] -> [[a]] -> [a]
intercalate [Char]
"\n" [
 [Char]
"Copyright (C) 2006-2025 John MacFarlane. Web:  https://pandoc.org",
 [Char]
"This is free software; see the source for copying conditions. There is no",
 [Char]
"warranty, not even for merchantability or fitness for a particular purpose." ]

handleUnrecognizedOption :: String -> [String] -> [String]
handleUnrecognizedOption :: [Char] -> [[Char]] -> [[Char]]
handleUnrecognizedOption [Char]
"--smart" =
  (([Char]
"--smart/-S has been removed.  Use +smart or -smart extension instead.\n" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++
    [Char]
"For example: pandoc -f markdown+smart -t markdown-smart.") [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
:)
handleUnrecognizedOption [Char]
"--normalize" =
  ([Char]
"--normalize has been removed.  Normalization is now automatic." [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
:)
handleUnrecognizedOption [Char]
"-S" = [Char] -> [[Char]] -> [[Char]]
handleUnrecognizedOption [Char]
"--smart"
handleUnrecognizedOption [Char]
"--old-dashes" =
  ([Char]
"--old-dashes has been removed.  Use +old_dashes extension instead." [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
:)
handleUnrecognizedOption [Char]
"--no-wrap" =
  ([Char]
"--no-wrap has been removed.  Use --wrap=none instead." [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
:)
handleUnrecognizedOption [Char]
"--latex-engine" =
  ([Char]
"--latex-engine has been removed.  Use --pdf-engine instead." [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
:)
handleUnrecognizedOption [Char]
"--latex-engine-opt" =
  ([Char]
"--latex-engine-opt has been removed.  Use --pdf-engine-opt instead." [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
:)
handleUnrecognizedOption [Char]
"--chapters" =
  ([Char]
"--chapters has been removed. Use --top-level-division=chapter instead." [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
:)
handleUnrecognizedOption [Char]
"--reference-docx" =
  ([Char]
"--reference-docx has been removed. Use --reference-doc instead." [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
:)
handleUnrecognizedOption [Char]
"--reference-odt" =
  ([Char]
"--reference-odt has been removed. Use --reference-doc instead." [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
:)
handleUnrecognizedOption [Char]
"--parse-raw" =
  ([Char]
"--parse-raw/-R has been removed. Use +raw_html or +raw_tex extension.\n" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
:)
handleUnrecognizedOption [Char]
"--epub-stylesheet" =
  ([Char]
"--epub-stylesheet has been removed. Use --css instead.\n" [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
:)
handleUnrecognizedOption [Char]
"-R" = [Char] -> [[Char]] -> [[Char]]
handleUnrecognizedOption [Char]
"--parse-raw"
handleUnrecognizedOption [Char]
x =
  (([Char]
"Unknown option " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
x [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
".") [Char] -> [[Char]] -> [[Char]]
forall a. a -> [a] -> [a]
:)

readersNames :: [Text]
readersNames :: [Text]
readersNames = [Text] -> [Text]
forall a. Ord a => [a] -> [a]
sort (((Text, Reader PandocIO) -> Text)
-> [(Text, Reader PandocIO)] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map (Text, Reader PandocIO) -> Text
forall a b. (a, b) -> a
fst ([(Text, Reader PandocIO)]
forall (m :: * -> *). PandocMonad m => [(Text, Reader m)]
readers :: [(Text, Reader PandocIO)]))

writersNames :: [Text]
writersNames :: [Text]
writersNames = [Text] -> [Text]
forall a. Ord a => [a] -> [a]
sort
  (Text
"pdf" Text -> [Text] -> [Text]
forall a. a -> [a] -> [a]
: ((Text, Writer PandocIO) -> Text)
-> [(Text, Writer PandocIO)] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map (Text, Writer PandocIO) -> Text
forall a b. (a, b) -> a
fst ([(Text, Writer PandocIO)]
forall (m :: * -> *). PandocMonad m => [(Text, Writer m)]
writers :: [(Text, Writer PandocIO)]))

splitField :: String -> (String, String)
splitField :: [Char] -> ([Char], [Char])
splitField = ([Char] -> [Char]) -> ([Char], [Char]) -> ([Char], [Char])
forall b c a. (b -> c) -> (a, b) -> (a, c)
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second ([Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
tailDef [Char]
"true") (([Char], [Char]) -> ([Char], [Char]))
-> ([Char] -> ([Char], [Char])) -> [Char] -> ([Char], [Char])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> [Char] -> ([Char], [Char])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (\Char
c -> Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
':' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'=')

deprecatedOption :: String -> String -> ExceptT OptInfo IO ()
deprecatedOption :: [Char] -> [Char] -> ExceptT OptInfo IO ()
deprecatedOption [Char]
o [Char]
msg = do
  res <- IO (Either PandocError ())
-> ExceptT OptInfo IO (Either PandocError ())
forall a. IO a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Either PandocError ())
 -> ExceptT OptInfo IO (Either PandocError ()))
-> IO (Either PandocError ())
-> ExceptT OptInfo IO (Either PandocError ())
forall a b. (a -> b) -> a -> b
$ PandocIO () -> IO (Either PandocError ())
forall a. PandocIO a -> IO (Either PandocError a)
runIO (LogMessage -> PandocIO ()
forall (m :: * -> *). PandocMonad m => LogMessage -> m ()
report (LogMessage -> PandocIO ()) -> LogMessage -> PandocIO ()
forall a b. (a -> b) -> a -> b
$ Text -> Text -> LogMessage
Deprecated ([Char] -> Text
T.pack [Char]
o) ([Char] -> Text
T.pack [Char]
msg))
  case res of
       Right () -> () -> ExceptT OptInfo IO ()
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
       Left PandocError
e   -> PandocError -> ExceptT OptInfo IO ()
forall a. PandocError -> ExceptT OptInfo IO a
optError PandocError
e

-- | Set text value in text context.  Create list if it has a value already,
-- or add to a list value.
setVariable :: Text -> Text -> Context Text -> Context Text
setVariable :: Text -> Text -> Context Text -> Context Text
setVariable Text
key Text
val (Context Map Text (Val Text)
ctx) = Map Text (Val Text) -> Context Text
forall a. Map Text (Val a) -> Context a
Context (Map Text (Val Text) -> Context Text)
-> Map Text (Val Text) -> Context Text
forall a b. (a -> b) -> a -> b
$ (Maybe (Val Text) -> Maybe (Val Text))
-> Text -> Map Text (Val Text) -> Map Text (Val Text)
forall k a.
Ord k =>
(Maybe a -> Maybe a) -> k -> Map k a -> Map k a
M.alter Maybe (Val Text) -> Maybe (Val Text)
forall {a}. ToContext a Text => Maybe (Val a) -> Maybe (Val a)
go Text
key Map Text (Val Text)
ctx
  where go :: Maybe (Val a) -> Maybe (Val a)
go Maybe (Val a)
Nothing             = Val a -> Maybe (Val a)
forall a. a -> Maybe a
Just (Val a -> Maybe (Val a)) -> Val a -> Maybe (Val a)
forall a b. (a -> b) -> a -> b
$ Text -> Val a
forall a b. ToContext a b => b -> Val a
toVal Text
val
        go (Just (ListVal [Val a]
xs)) = Val a -> Maybe (Val a)
forall a. a -> Maybe a
Just (Val a -> Maybe (Val a)) -> Val a -> Maybe (Val a)
forall a b. (a -> b) -> a -> b
$ [Val a] -> Val a
forall a. [Val a] -> Val a
ListVal ([Val a] -> Val a) -> [Val a] -> Val a
forall a b. (a -> b) -> a -> b
$ [Val a]
xs [Val a] -> [Val a] -> [Val a]
forall a. [a] -> [a] -> [a]
++ [Text -> Val a
forall a b. ToContext a b => b -> Val a
toVal Text
val]
        go (Just Val a
x)            = Val a -> Maybe (Val a)
forall a. a -> Maybe a
Just (Val a -> Maybe (Val a)) -> Val a -> Maybe (Val a)
forall a b. (a -> b) -> a -> b
$ [Val a] -> Val a
forall a. [Val a] -> Val a
ListVal [Val a
x, Text -> Val a
forall a b. ToContext a b => b -> Val a
toVal Text
val]

addMeta :: String -> String -> Meta -> Meta
addMeta :: [Char] -> [Char] -> Meta -> Meta
addMeta [Char]
k [Char]
v Meta
meta =
  case Text -> Meta -> Maybe MetaValue
lookupMeta Text
k' Meta
meta of
       Maybe MetaValue
Nothing -> Text -> MetaValue -> Meta -> Meta
forall a b. (HasMeta a, ToMetaValue b) => Text -> b -> a -> a
forall b. ToMetaValue b => Text -> b -> Meta -> Meta
setMeta Text
k' MetaValue
v' Meta
meta
       Just (MetaList [MetaValue]
xs) ->
                  Text -> MetaValue -> Meta -> Meta
forall a b. (HasMeta a, ToMetaValue b) => Text -> b -> a -> a
forall b. ToMetaValue b => Text -> b -> Meta -> Meta
setMeta Text
k' ([MetaValue] -> MetaValue
MetaList ([MetaValue]
xs [MetaValue] -> [MetaValue] -> [MetaValue]
forall a. [a] -> [a] -> [a]
++ [MetaValue
v'])) Meta
meta
       Just MetaValue
x  -> Text -> MetaValue -> Meta -> Meta
forall a b. (HasMeta a, ToMetaValue b) => Text -> b -> a -> a
forall b. ToMetaValue b => Text -> b -> Meta -> Meta
setMeta Text
k' ([MetaValue] -> MetaValue
MetaList [MetaValue
x, MetaValue
v']) Meta
meta
 where
  v' :: MetaValue
v' = [Char] -> MetaValue
readMetaValue [Char]
v
  k' :: Text
k' = [Char] -> Text
T.pack [Char]
k

readMetaValue :: String -> MetaValue
readMetaValue :: [Char] -> MetaValue
readMetaValue [Char]
s
  | [Char]
s [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"true"  = Bool -> MetaValue
MetaBool Bool
True
  | [Char]
s [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"True"  = Bool -> MetaValue
MetaBool Bool
True
  | [Char]
s [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"TRUE"  = Bool -> MetaValue
MetaBool Bool
True
  | [Char]
s [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"false" = Bool -> MetaValue
MetaBool Bool
False
  | [Char]
s [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"False" = Bool -> MetaValue
MetaBool Bool
False
  | [Char]
s [Char] -> [Char] -> Bool
forall a. Eq a => a -> a -> Bool
== [Char]
"FALSE" = Bool -> MetaValue
MetaBool Bool
False
  | Bool
otherwise    = Text -> MetaValue
MetaString (Text -> MetaValue) -> Text -> MetaValue
forall a b. (a -> b) -> a -> b
$ [Char] -> Text
T.pack [Char]
s

readBoolFromOptArg ::  Text -> Maybe String -> ExceptT OptInfo IO Bool
readBoolFromOptArg :: Text -> Maybe [Char] -> ExceptT OptInfo IO Bool
readBoolFromOptArg Text
opt = ExceptT OptInfo IO Bool
-> ([Char] -> ExceptT OptInfo IO Bool)
-> Maybe [Char]
-> ExceptT OptInfo IO Bool
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Bool -> ExceptT OptInfo IO Bool
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True) [Char] -> ExceptT OptInfo IO Bool
forall {f :: * -> *}.
(Functor f, Eq (f Char), IsString (f Char)) =>
f Char -> ExceptT OptInfo IO Bool
readBoolFromArg
    where readBoolFromArg :: f Char -> ExceptT OptInfo IO Bool
readBoolFromArg f Char
arg = case Char -> Char
toLower (Char -> Char) -> f Char -> f Char
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f Char
arg of
            f Char
"true"  -> Bool -> ExceptT OptInfo IO Bool
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
            f Char
"false" -> Bool -> ExceptT OptInfo IO Bool
forall a. a -> ExceptT OptInfo IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
            f Char
_       -> PandocError -> ExceptT OptInfo IO Bool
forall a. PandocError -> ExceptT OptInfo IO a
optError (PandocError -> ExceptT OptInfo IO Bool)
-> PandocError -> ExceptT OptInfo IO Bool
forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError (Text -> PandocError) -> Text -> PandocError
forall a b. (a -> b) -> a -> b
$
                        Text
"Argument of " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
opt Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" must be either true or false"

-- On Windows with ghc 8.6+, we need to rewrite paths
-- beginning with \\ to \\?\UNC\. -- See #5127.
normalizePath :: FilePath -> FilePath
#ifdef _WINDOWS
normalizePath fp =
  if "\\\\" `isPrefixOf` fp && not ("\\\\?\\" `isPrefixOf` fp)
    then "\\\\?\\UNC\\" ++ drop 2 fp
    else fp
#else
normalizePath :: [Char] -> [Char]
normalizePath = [Char] -> [Char]
forall a. a -> a
id
#endif

-- | Print version information with customizable features and scripting engine
versionInfo :: [String] -> Maybe String -> String -> IO ()
versionInfo :: [[Char]] -> Maybe [Char] -> [Char] -> IO ()
versionInfo [[Char]]
features Maybe [Char]
mbScriptingEngineName [Char]
suffix = do
  defaultDatadir <- IO [Char]
defaultUserDataDir
  let featuresLine = if [[Char]] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [[Char]]
features
                       then []
                       else [[Char]
"Features: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [[Char]] -> [Char]
unwords [[Char]]
features]
  let scriptingLine = case Maybe [Char]
mbScriptingEngineName of
                        Maybe [Char]
Nothing -> []
                        Just [Char]
name -> [[Char]
"Scripting engine: " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
name]
  UTF8.putStr $ T.unlines $ map T.pack $
    ["pandoc " ++ showVersion pandocVersion ++ suffix] ++
    featuresLine ++
    scriptingLine ++
    ["User data directory: " ++ defaultDatadir,
     copyrightMessage]
  exitSuccess