{-# LANGUAGE CPP                 #-}
{-# LANGUAGE TemplateHaskell     #-}
{-# LANGUAGE LambdaCase          #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TupleSections       #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE FlexibleContexts    #-}
{-# LANGUAGE TypeApplications    #-}
{- |
   Module      : Text.Pandoc.App.CommandLineOptions
   Copyright   : Copyright (C) 2006-2022 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
          , options
          , engines
          , setVariable
          ) where
import Control.Monad
import Control.Monad.Trans
import Control.Monad.State.Strict
import Data.Aeson.Encode.Pretty (encodePretty', Config(..), keyOrder,
         defConfig, Indent(..), NumberFormat(..))
import Data.Bifunctor (second)
import Data.Char (toLower)
import Data.List (intercalate, sort, foldl')
#ifdef _WINDOWS
import Data.List (isPrefixOf)
#endif
import Data.Maybe (fromMaybe, isJust)
import Data.Text (Text)
import HsLua (Exception, getglobal, openlibs, peek, run, top)
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 Text.Pandoc.App.Opt (Opt (..), LineEnding (..), IpynbOutput (..),
                            DefaultsState (..), applyDefaults,
                            fullDefaultsPath)
import Text.Pandoc.Filter (Filter (..))
import Text.Pandoc.Highlighting (highlightingStyles, lookupHighlightingStyle)
import Text.Pandoc.Shared (ordNub, elemText, safeStrRead, defaultUserDataDir)
import Text.Printf

#ifdef EMBED_DATA_FILES
import Text.Pandoc.Data (dataFiles)
#else
import Paths_pandoc (getDataDir)
import System.Directory (getDirectoryContents)
#endif

import qualified Control.Exception as E
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as B
import qualified Data.Map as M
import qualified Data.Text as T
import qualified Text.Pandoc.UTF8 as UTF8

#ifdef NIGHTLY
import qualified Language.Haskell.TH as TH
import Data.Time
#endif

#ifdef NIGHTLY
versionSuffix :: String
versionSuffix = "-nightly-" ++
  $(TH.stringE =<<
    TH.runIO (formatTime defaultTimeLocale "%F" <$> Data.Time.getCurrentTime))
#else
versionSuffix :: String
versionSuffix :: String
versionSuffix = String
""
#endif

parseOptions :: [OptDescr (Opt -> IO Opt)] -> Opt -> IO Opt
parseOptions :: [OptDescr (Opt -> IO Opt)] -> Opt -> IO Opt
parseOptions [OptDescr (Opt -> IO Opt)]
options' Opt
defaults = do
  [String]
rawArgs <- forall a b. (a -> b) -> [a] -> [b]
map String -> String
UTF8.decodeArg forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO [String]
getArgs
  String
prg <- IO String
getProgName
  [OptDescr (Opt -> IO Opt)] -> Opt -> String -> [String] -> IO Opt
parseOptionsFromArgs [OptDescr (Opt -> IO Opt)]
options' Opt
defaults String
prg [String]
rawArgs

parseOptionsFromArgs
  :: [OptDescr (Opt -> IO Opt)] -> Opt -> String -> [String] -> IO Opt
parseOptionsFromArgs :: [OptDescr (Opt -> IO Opt)] -> Opt -> String -> [String] -> IO Opt
parseOptionsFromArgs [OptDescr (Opt -> IO Opt)]
options' Opt
defaults String
prg [String]
rawArgs = do
  let ([Opt -> IO Opt]
actions, [String]
args, [String]
unrecognizedOpts, [String]
errors) =
           forall a.
ArgOrder a
-> [OptDescr a] -> [String] -> ([a], [String], [String], [String])
getOpt' forall a. ArgOrder a
Permute [OptDescr (Opt -> IO Opt)]
options' (forall a b. (a -> b) -> [a] -> [b]
map String -> String
UTF8.decodeArg [String]
rawArgs)

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

  forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
errors Bool -> Bool -> Bool
&& forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
unknownOptionErrors) forall a b. (a -> b) -> a -> b
$
     forall e a. Exception e => e -> IO a
E.throwIO forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError forall a b. (a -> b) -> a -> b
$ String -> Text
T.pack forall a b. (a -> b) -> a -> b
$
        forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [String]
errors forall a. [a] -> [a] -> [a]
++ [String] -> String
unlines [String]
unknownOptionErrors forall a. [a] -> [a] -> [a]
++
        (String
"Try " forall a. [a] -> [a] -> [a]
++ String
prg forall a. [a] -> [a] -> [a]
++ String
" --help for more information.")

  -- thread option data structure through all supplied option actions
  Opt
opts <- forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
(>>=) (forall (m :: * -> *) a. Monad m => a -> m a
return Opt
defaults) [Opt -> IO Opt]
actions
  let mbArgs :: Maybe [String]
mbArgs = case [String]
args of
                 [] -> forall a. Maybe a
Nothing
                 [String]
xs -> forall a. a -> Maybe a
Just [String]
xs
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Opt
opts{ optInputFiles :: Maybe [String]
optInputFiles =
                   forall a b. (a -> b) -> [a] -> [b]
map String -> String
normalizePath forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Opt -> Maybe [String]
optInputFiles Opt
opts forall a. Semigroup a => a -> a -> a
<> Maybe [String]
mbArgs)
               , optStandalone :: Bool
optStandalone = -- certain other options imply standalone
                   Opt -> Bool
optStandalone Opt
opts Bool -> Bool -> Bool
||
                     forall a. Maybe a -> Bool
isJust (Opt -> Maybe String
optTemplate Opt
opts) Bool -> Bool -> Bool
||
                     Opt -> Bool
optSelfContained Opt
opts Bool -> Bool -> Bool
||
                     Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Opt -> [String]
optIncludeInHeader Opt
opts)) Bool -> Bool -> Bool
||
                     Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Opt -> [String]
optIncludeBeforeBody Opt
opts)) Bool -> Bool -> Bool
||
                     Bool -> Bool
not (forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Opt -> [String]
optIncludeAfterBody Opt
opts)) }

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

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

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

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

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

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

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

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

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

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

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"d" [String
"defaults"]
                 (forall a. (String -> a) -> String -> ArgDescr a
ReqArg
                  (\String
arg Opt
opt -> forall a. PandocIO a -> IO a
runIOorExplode forall a b. (a -> b) -> a -> b
$ do
                     let defsState :: DefaultsState
defsState = DefaultsState { curDefaults :: Maybe String
curDefaults = forall a. Maybe a
Nothing,
                                                     inheritanceGraph :: [[String]]
inheritanceGraph = [] }
                     String
fp <- forall (m :: * -> *).
(PandocMonad m, MonadIO m) =>
Maybe String -> String -> m String
fullDefaultsPath (Opt -> Maybe String
optDataDir Opt
opt) String
arg
                     forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT (forall (m :: * -> *).
(PandocMonad m, MonadIO m) =>
Opt -> String -> StateT DefaultsState m Opt
applyDefaults Opt
opt String
fp) DefaultsState
defsState
                  )
                  String
"FILE")
                String
""

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"file-scope"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optFileScope :: Bool
optFileScope = Bool
True }))
                 String
"" -- "Parse input files before combining"

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"sandbox"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optSandbox :: Bool
optSandbox = Bool
True }))
                 String
""

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"s" [String
"standalone"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optStandalone :: Bool
optStandalone = Bool
True }))
                 String
"" -- "Include needed header and footer on output"

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

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

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

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"ascii"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optAscii :: Bool
optAscii = Bool
True }))
                 String
""  -- "Prefer ASCII output"

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"toc", String
"table-of-contents"]
                (forall a. a -> ArgDescr a
NoArg
                 (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optTableOfContents :: Bool
optTableOfContents = Bool
True }))
               String
"" -- "Include table of contents"

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

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"N" [String
"number-sections"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optNumberSections :: Bool
optNumberSections = Bool
True }))
                 String
"" -- "Number sections"

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

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

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

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

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

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

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

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"no-highlight"]
                (forall a. a -> ArgDescr a
NoArg
                 (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optHighlightStyle :: Maybe Text
optHighlightStyle = forall a. Maybe a
Nothing }))
                 String
"" -- "Don't highlight source code"

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"highlight-style"]
                (forall a. (String -> a) -> String -> ArgDescr a
ReqArg
                 (\String
arg Opt
opt ->
                     forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optHighlightStyle :: Maybe Text
optHighlightStyle = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$
                                 String -> Text
T.pack forall a b. (a -> b) -> a -> b
$ String -> String
normalizePath String
arg })
                 String
"STYLE|FILE")
                 String
"" -- "Style for highlighted code"

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

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

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

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

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"p" [String
"preserve-tabs"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optPreserveTabs :: Bool
optPreserveTabs = Bool
True }))
                 String
"" -- "Preserve tabs instead of converting to spaces"

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

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

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

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

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"self-contained"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> do
                    String -> String -> IO ()
deprecatedOption String
"--self-contained" String
"use --embed-resources --standalone"
                    forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optSelfContained :: Bool
optSelfContained = Bool
True }))
                 String
"" -- "Make slide shows include all the needed js and css (deprecated)"

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"embed-resources"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optEmbedResources :: Bool
optEmbedResources = Bool
True }))
                 String
"" -- "Make slide shows include all the needed js and css"

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

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"no-check-certificate"]
                (forall a. a -> ArgDescr a
NoArg
                 (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optNoCheckCertificate :: Bool
optNoCheckCertificate = Bool
True }))
                String
"" -- "Disable certificate validation"

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

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

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

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

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

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"shift-heading-level-by"]
                 (forall a. (String -> a) -> String -> ArgDescr a
ReqArg
                  (\String
arg Opt
opt ->
                      case forall (m :: * -> *) a. (MonadPlus m, Read a) => String -> m a
safeStrRead String
arg of
                           Just Int
t ->
                               forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optShiftHeadingLevelBy :: Int
optShiftHeadingLevelBy = Int
t }
                           Maybe Int
_              -> forall e a. Exception e => e -> IO a
E.throwIO forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError
                                               Text
"shift-heading-level-by takes an integer argument")
                  String
"NUMBER")
                 String
"" -- "Shift heading level"

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

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"strip-empty-paragraphs"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> do
                      String -> String -> IO ()
deprecatedOption String
"--strip-empty-paragraphs"
                        String
"Use +empty_paragraphs extension."
                      forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optStripEmptyParagraphs :: Bool
optStripEmptyParagraphs = Bool
True }))
                 String
"" -- "Strip empty paragraphs"

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"track-changes"]
                 (forall a. (String -> a) -> String -> ArgDescr a
ReqArg
                  (\String
arg Opt
opt -> do
                     TrackChanges
action <- case String
arg of
                            String
"accept" -> forall (m :: * -> *) a. Monad m => a -> m a
return TrackChanges
AcceptChanges
                            String
"reject" -> forall (m :: * -> *) a. Monad m => a -> m a
return TrackChanges
RejectChanges
                            String
"all"    -> forall (m :: * -> *) a. Monad m => a -> m a
return TrackChanges
AllChanges
                            String
_        -> forall e a. Exception e => e -> IO a
E.throwIO forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError forall a b. (a -> b) -> a -> b
$ String -> Text
T.pack
                               (String
"Unknown option for track-changes: " forall a. [a] -> [a] -> [a]
++ String
arg)
                     forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optTrackChanges :: TrackChanges
optTrackChanges = TrackChanges
action })
                  String
"accept|reject|all")
                 String
"" -- "Accepting or reject MS Word track-changes.""

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"strip-comments"]
                (forall a. a -> ArgDescr a
NoArg
                 (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optStripComments :: Bool
optStripComments = Bool
True }))
               String
"" -- "Strip HTML comments"

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"reference-links"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optReferenceLinks :: Bool
optReferenceLinks = Bool
True } ))
                 String
"" -- "Use reference links in parsing HTML"

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"reference-location"]
                 (forall a. (String -> a) -> String -> ArgDescr a
ReqArg
                  (\String
arg Opt
opt -> do
                     ReferenceLocation
action <- case String
arg of
                            String
"block"    -> forall (m :: * -> *) a. Monad m => a -> m a
return ReferenceLocation
EndOfBlock
                            String
"section"  -> forall (m :: * -> *) a. Monad m => a -> m a
return ReferenceLocation
EndOfSection
                            String
"document" -> forall (m :: * -> *) a. Monad m => a -> m a
return ReferenceLocation
EndOfDocument
                            String
_        -> forall e a. Exception e => e -> IO a
E.throwIO forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError forall a b. (a -> b) -> a -> b
$ String -> Text
T.pack
                               (String
"Unknown option for reference-location: " forall a. [a] -> [a] -> [a]
++ String
arg)
                     forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optReferenceLocation :: ReferenceLocation
optReferenceLocation = ReferenceLocation
action })
                  String
"block|section|document")
                 String
"" -- "Accepting or reject MS Word track-changes.""

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"atx-headers"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> do
                    String -> String -> IO ()
deprecatedOption String
"--atx-headers"
                      String
"Use --markdown-headings=atx instead."
                    forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optSetextHeaders :: Bool
optSetextHeaders = Bool
False } ))
                 String
"" -- "Use atx-style headers for markdown"

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"markdown-headings"]
                  (forall a. (String -> a) -> String -> ArgDescr a
ReqArg
                    (\String
arg Opt
opt -> do
                      Bool
headingFormat <- case String
arg of
                        String
"setext" -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
                        String
"atx" -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
                        String
_ -> forall e a. Exception e => e -> IO a
E.throwIO forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError forall a b. (a -> b) -> a -> b
$ String -> Text
T.pack
                          (String
"Unknown markdown heading format: " forall a. [a] -> [a] -> [a]
++ String
arg forall a. [a] -> [a] -> [a]
++
                            String
". Expecting atx or setext")
                      forall (f :: * -> *) a. Applicative f => a -> f a
pure Opt
opt { optSetextHeaders :: Bool
optSetextHeaders = Bool
headingFormat }
                    )
                  String
"setext|atx")
                  String
""

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"listings"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optListings :: Bool
optListings = Bool
True }))
                 String
"" -- "Use listings package for LaTeX code blocks"

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"i" [String
"incremental"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optIncremental :: Bool
optIncremental = Bool
True }))
                 String
"" -- "Make list items display incrementally in Slidy/Slideous/S5"

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

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"section-divs"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optSectionDivs :: Bool
optSectionDivs = Bool
True }))
                 String
"" -- "Put sections in div tags in HTML"

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"html-q-tags"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt ->
                     forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optHtmlQTags :: Bool
optHtmlQTags = Bool
True }))
                 String
"" -- "Use <q> tags for quotes in HTML"

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"email-obfuscation"]
                 (forall a. (String -> a) -> String -> ArgDescr a
ReqArg
                  (\String
arg Opt
opt -> do
                     ObfuscationMethod
method <- case String
arg of
                            String
"references" -> forall (m :: * -> *) a. Monad m => a -> m a
return ObfuscationMethod
ReferenceObfuscation
                            String
"javascript" -> forall (m :: * -> *) a. Monad m => a -> m a
return ObfuscationMethod
JavascriptObfuscation
                            String
"none"       -> forall (m :: * -> *) a. Monad m => a -> m a
return ObfuscationMethod
NoObfuscation
                            String
_            -> forall e a. Exception e => e -> IO a
E.throwIO forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError forall a b. (a -> b) -> a -> b
$ String -> Text
T.pack
                               (String
"Unknown obfuscation method: " forall a. [a] -> [a] -> [a]
++ String
arg)
                     forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optEmailObfuscation :: ObfuscationMethod
optEmailObfuscation = ObfuscationMethod
method })
                  String
"none|javascript|references")
                 String
"" -- "Method for obfuscating email in HTML"

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

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

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

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

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

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

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

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"epub-chapter-level"]
                 (forall a. (String -> a) -> String -> ArgDescr a
ReqArg
                  (\String
arg Opt
opt ->
                      case forall (m :: * -> *) a. (MonadPlus m, Read a) => String -> m a
safeStrRead String
arg of
                           Just Int
t | Int
t forall a. Ord a => a -> a -> Bool
>= Int
1 Bool -> Bool -> Bool
&& Int
t forall a. Ord a => a -> a -> Bool
<= Int
6 ->
                                    forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optEpubChapterLevel :: Int
optEpubChapterLevel = Int
t }
                           Maybe Int
_      -> forall e a. Exception e => e -> IO a
E.throwIO forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError
                                    Text
"chapter level must be a number between 1 and 6")
                 String
"NUMBER")
                 String
"" -- "Header level at which to split chapters in EPUB"

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

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

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

     , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"csl"]
                 (forall a. (String -> a) -> String -> ArgDescr a
ReqArg
                  (\String
arg Opt
opt ->
                     forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt{ optMetadata :: Meta
optMetadata =
                                   String -> String -> Meta -> Meta
addMeta String
"csl" (String -> String
normalizePath String
arg) forall a b. (a -> b) -> a -> b
$
                                   Opt -> Meta
optMetadata Opt
opt })
                   String
"FILE")
                 String
""

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

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

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

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

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"webtex"]
                 (forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg
                  (\Maybe String
arg Opt
opt -> do
                      let url' :: String
url' = forall a. a -> Maybe a -> a
fromMaybe String
"https://latex.codecogs.com/png.latex?" Maybe String
arg
                      forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optHTMLMathMethod :: HTMLMathMethod
optHTMLMathMethod = Text -> HTMLMathMethod
WebTeX forall a b. (a -> b) -> a -> b
$ String -> Text
T.pack String
url' })
                  String
"URL")
                 String
"" -- "Use web service for HTML math"

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

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

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

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"trace"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optTrace :: Bool
optTrace = Bool
True }))
                 String
"" -- "Turn on diagnostic tracing in readers."

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"dump-args"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optDumpArgs :: Bool
optDumpArgs = Bool
True }))
                 String
"" -- "Print output filename and arguments to stdout."

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"ignore-args"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optIgnoreArgs :: Bool
optIgnoreArgs = Bool
True }))
                 String
"" -- "Ignore command-line arguments."

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

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

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"fail-if-warnings"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
opt -> forall (m :: * -> *) a. Monad m => a -> m a
return Opt
opt { optFailIfWarnings :: Bool
optFailIfWarnings = Bool
True }))
                 String
"" -- "Exit with error status if there were  warnings."

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

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"bash-completion"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
_ -> do
                     [String]
datafiles <- IO [String]
getDataFileNames
                     String
tpl <- forall a. PandocIO a -> IO a
runIOorExplode forall a b. (a -> b) -> a -> b
$
                              ByteString -> String
UTF8.toString forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                                forall (m :: * -> *). PandocMonad m => String -> m ByteString
readDefaultDataFile String
"bash_completion.tpl"
                     let optnames :: OptDescr a -> [String]
optnames (Option String
shorts [String]
longs ArgDescr a
_ String
_) =
                           forall a b. (a -> b) -> [a] -> [b]
map (\Char
c -> [Char
'-',Char
c]) String
shorts forall a. [a] -> [a] -> [a]
++
                           forall a b. (a -> b) -> [a] -> [b]
map (String
"--" forall a. [a] -> [a] -> [a]
++) [String]
longs
                     let allopts :: String
allopts = [String] -> String
unwords (forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap forall {a}. OptDescr a -> [String]
optnames [OptDescr (Opt -> IO Opt)]
options)
                     Handle -> Text -> IO ()
UTF8.hPutStrLn Handle
stdout forall a b. (a -> b) -> a -> b
$ String -> Text
T.pack forall a b. (a -> b) -> a -> b
$ forall r. PrintfType r => String -> r
printf String
tpl String
allopts
                         (Text -> String
T.unpack forall a b. (a -> b) -> a -> b
$ [Text] -> Text
T.unwords [Text]
readersNames)
                         (Text -> String
T.unpack forall a b. (a -> b) -> a -> b
$ [Text] -> Text
T.unwords [Text]
writersNames)
                         (Text -> String
T.unpack forall a b. (a -> b) -> a -> b
$ [Text] -> Text
T.unwords forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> a
fst [(Text, Style)]
highlightingStyles)
                         ([String] -> String
unwords [String]
datafiles)
                     forall a. IO a
exitSuccess ))
                 String
"" -- "Print bash completion script"

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"list-input-formats"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
_ -> do
                     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
                     forall a. IO a
exitSuccess ))
                 String
""

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"list-output-formats"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
_ -> do
                     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
                     forall a. IO a
exitSuccess ))
                 String
""

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"list-extensions"]
                 (forall a. (Maybe String -> a) -> String -> ArgDescr a
OptArg
                  (\Maybe String
arg Opt
_ -> do
                     let extList :: [Extension]
                         extList :: [Extension]
extList = [forall a. Bounded a => a
minBound..forall a. Bounded a => a
maxBound]
                     let allExts :: Extensions
allExts =
                           case Maybe String
arg of
                             Maybe String
Nothing  -> [Extension] -> Extensions
extensionsFromList [Extension]
extList
                             Just String
fmt -> Text -> Extensions
getAllExtensions forall a b. (a -> b) -> a -> b
$ String -> Text
T.pack String
fmt
                     let formatName :: Text
formatName = forall b a. b -> (a -> b) -> Maybe a -> b
maybe Text
"markdown" String -> Text
T.pack Maybe String
arg
                     if Text
formatName forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem`
                         (forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> a
fst (forall (m :: * -> *). PandocMonad m => [(Text, Reader m)]
readers :: [(Text, Reader PandocPure)]) forall a. [a] -> [a] -> [a]
++
                          forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> a
fst (forall (m :: * -> *). PandocMonad m => [(Text, Writer m)]
writers :: [(Text, Writer PandocPure)]))
                        then forall e a. Exception e => e -> IO a
E.throwIO forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocOptionError forall a b. (a -> b) -> a -> b
$ Text
formatName 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 -> String
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
' ') forall a. a -> [a] -> [a]
: forall a. Int -> [a] -> [a]
drop Int
4 (forall a. Show a => a -> String
show Extension
x)
                          forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Handle -> Text -> IO ()
UTF8.hPutStrLn Handle
stdout forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack forall b c a. (b -> c) -> (a -> b) -> a -> c
. Extension -> String
showExt)
                             [Extension
ex | Extension
ex <- [Extension]
extList, Extension -> Extensions -> Bool
extensionEnabled Extension
ex Extensions
allExts]
                          forall a. IO a
exitSuccess )
                  String
"FORMAT")
                 String
""

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"list-highlight-languages"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
_ -> do
                     let langs :: [String]
langs = [ Text -> String
T.unpack (Text -> Text
T.toLower (Syntax -> Text
sShortname Syntax
s))
                                 | Syntax
s <- forall k a. Map k a -> [a]
M.elems SyntaxMap
defaultSyntaxMap
                                 , Syntax -> Text
sShortname Syntax
s forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem`
                                    [String -> Text
T.pack String
"Alert", String -> Text
T.pack String
"Alert_indent"]
                                 ]
                     forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Handle -> Text -> IO ()
UTF8.hPutStrLn Handle
stdout forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack) (forall a. Ord a => [a] -> [a]
sort [String]
langs)
                     forall a. IO a
exitSuccess ))
                 String
""

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"list-highlight-styles"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
_ -> do
                     forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (Handle -> Text -> IO ()
UTF8.hPutStrLn Handle
stdout forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> a
fst) [(Text, Style)]
highlightingStyles
                     forall a. IO a
exitSuccess ))
                 String
""

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"D" [String
"print-default-template"]
                 (forall a. (String -> a) -> String -> ArgDescr a
ReqArg
                  (\String
arg Opt
opt -> do
                     let write :: Text -> IO ()
write = case Opt -> Maybe String
optOutputFile Opt
opt of
                                        Just String
f  -> String -> Text -> IO ()
UTF8.writeFile String
f
                                        Maybe String
Nothing -> Handle -> Text -> IO ()
UTF8.hPutStr Handle
stdout
                     Either PandocError Text
templ <- forall a. PandocIO a -> IO (Either PandocError a)
runIO forall a b. (a -> b) -> a -> b
$ do
                                forall (m :: * -> *). PandocMonad m => Maybe String -> m ()
setUserDataDir forall a. Maybe a
Nothing
                                forall (m :: * -> *). PandocMonad m => Text -> m Text
getDefaultTemplate (String -> Text
T.pack String
arg)
                     case Either PandocError Text
templ of
                          Right Text
t
                            | Text -> Bool
T.null Text
t -> -- e.g. for docx, odt, json:
                                forall e a. Exception e => e -> IO a
E.throwIO forall a b. (a -> b) -> a -> b
$ Text -> PandocError
PandocCouldNotFindDataFileError forall a b. (a -> b) -> a -> b
$ String -> Text
T.pack
                                  (String
"templates/default." forall a. [a] -> [a] -> [a]
++ String
arg)
                            | Bool
otherwise -> Text -> IO ()
write Text
t
                          Left PandocError
e  -> forall e a. Exception e => e -> IO a
E.throwIO PandocError
e
                     forall a. IO a
exitSuccess)
                  String
"FORMAT")
                 String
"" -- "Print default template for FORMAT"

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"print-default-data-file"]
                 (forall a. (String -> a) -> String -> ArgDescr a
ReqArg
                  (\String
arg Opt
opt -> do
                     let write :: ByteString -> IO ()
write = case Opt -> Maybe String
optOutputFile Opt
opt of
                                        Just String
f  -> String -> ByteString -> IO ()
BS.writeFile String
f
                                        Maybe String
Nothing -> Handle -> ByteString -> IO ()
BS.hPutStr Handle
stdout
                     forall a. PandocIO a -> IO a
runIOorExplode forall a b. (a -> b) -> a -> b
$
                       forall (m :: * -> *). PandocMonad m => String -> m ByteString
readDefaultDataFile String
arg forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> IO ()
write
                     forall a. IO a
exitSuccess)
                  String
"FILE")
                  String
"" -- "Print default data file"

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"" [String
"print-highlight-style"]
                 (forall a. (String -> a) -> String -> ArgDescr a
ReqArg
                  (\String
arg Opt
opt -> do
                     let write :: ByteString -> IO ()
write = forall b a. b -> (a -> b) -> Maybe a -> b
maybe ByteString -> IO ()
B.putStr String -> ByteString -> IO ()
B.writeFile forall a b. (a -> b) -> a -> b
$ Opt -> Maybe String
optOutputFile Opt
opt
                     Style
sty <- forall a. PandocIO a -> IO a
runIOorExplode forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *). PandocMonad m => String -> m Style
lookupHighlightingStyle String
arg
                     ByteString -> IO ()
write forall a b. (a -> b) -> a -> b
$ forall a. ToJSON a => Config -> a -> ByteString
encodePretty'
                       Config
defConfig{confIndent :: Indent
confIndent = Int -> Indent
Spaces Int
4
                                ,confCompare :: Text -> Text -> Ordering
confCompare = [Text] -> Text -> Text -> Ordering
keyOrder
                                  (forall a b. (a -> b) -> [a] -> [b]
map String -> Text
T.pack
                                   [String
"text-color"
                                   ,String
"background-color"
                                   ,String
"line-number-color"
                                   ,String
"line-number-background-color"
                                   ,String
"bold"
                                   ,String
"italic"
                                   ,String
"underline"
                                   ,String
"text-styles"])
                                ,confNumFormat :: NumberFormat
confNumFormat = NumberFormat
Generic
                                ,confTrailingNewline :: Bool
confTrailingNewline = Bool
True} Style
sty
                     forall a. IO a
exitSuccess)
                  String
"STYLE|FILE")
                 String
"" -- "Print default template for FORMAT"


    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"v" [String
"version"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
_ -> do
                     String
prg <- IO String
getProgName
                     String
defaultDatadir <- IO String
defaultUserDataDir
                     String
luaVersion <- forall e a. LuaE e a -> IO a
HsLua.run @HsLua.Exception forall a b. (a -> b) -> a -> b
$ do
                       forall e. LuaE e ()
openlibs
                       forall e. LuaError e => Name -> LuaE e Type
getglobal Name
"_VERSION"
                       forall a e. (LuaError e, Peekable a) => StackIndex -> LuaE e a
peek StackIndex
top
                     Handle -> Text -> IO ()
UTF8.hPutStrLn Handle
stdout
                      forall a b. (a -> b) -> a -> b
$ String -> Text
T.pack
                      forall a b. (a -> b) -> a -> b
$ String
prg forall a. [a] -> [a] -> [a]
++ String
" " forall a. [a] -> [a] -> [a]
++ Text -> String
T.unpack Text
pandocVersion forall a. [a] -> [a] -> [a]
++ String
versionSuffix forall a. [a] -> [a] -> [a]
++
                        String
compileInfo forall a. [a] -> [a] -> [a]
++ String
"\nScripting engine: " forall a. [a] -> [a] -> [a]
++ String
luaVersion forall a. [a] -> [a] -> [a]
++
                        String
"\nUser data directory: " forall a. [a] -> [a] -> [a]
++ String
defaultDatadir forall a. [a] -> [a] -> [a]
++
                        (Char
'\n'forall a. a -> [a] -> [a]
:String
copyrightMessage)
                     forall a. IO a
exitSuccess ))
                 String
"" -- "Print version"

    , forall a. String -> [String] -> ArgDescr a -> String -> OptDescr a
Option String
"h" [String
"help"]
                 (forall a. a -> ArgDescr a
NoArg
                  (\Opt
_ -> do
                     String
prg <- IO String
getProgName
                     Handle -> Text -> IO ()
UTF8.hPutStr Handle
stdout (String -> Text
T.pack forall a b. (a -> b) -> a -> b
$ String -> [OptDescr (Opt -> IO Opt)] -> String
usageMessage String
prg [OptDescr (Opt -> IO Opt)]
options)
                     forall a. IO a
exitSuccess ))
                 String
"" -- "Show help"
    ]

getDataFileNames :: IO [FilePath]
getDataFileNames :: IO [String]
getDataFileNames = do
#ifdef EMBED_DATA_FILES
  let allDataFiles :: [String]
allDataFiles = forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> a
fst [(String, ByteString)]
dataFiles
#else
  allDataFiles <- filter (\x -> x /= "." && x /= "..") <$>
                      (getDataDir >>= getDirectoryContents)
#endif
  forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ String
"reference.docx" forall a. a -> [a] -> [a]
: String
"reference.odt" forall a. a -> [a] -> [a]
: String
"reference.pptx" forall a. a -> [a] -> [a]
: [String]
allDataFiles

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

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

compileInfo :: String
compileInfo :: String
compileInfo =
  String
"\nCompiled with pandoc-types " forall a. [a] -> [a] -> [a]
++ VERSION_pandoc_types ++
  String
", texmath " forall a. [a] -> [a] -> [a]
++ VERSION_texmath ++ ", skylighting " ++
  VERSION_skylighting ++ ",\nciteproc " ++ VERSION_citeproc ++
  ", ipynb " ++ VERSION_ipynb ++ ", hslua " ++ VERSION_hslua

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

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

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

splitField :: String -> (String, String)
splitField :: String -> (String, String)
splitField = forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (forall a. [a] -> [a] -> [a]
tailDef String
"true") forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Char -> Text -> Bool
`elemText` Text
":=")

deprecatedOption :: String -> String -> IO ()
deprecatedOption :: String -> String -> IO ()
deprecatedOption String
o String
msg =
  forall a. PandocIO a -> IO (Either PandocError a)
runIO (forall (m :: * -> *). PandocMonad m => LogMessage -> m ()
report forall a b. (a -> b) -> a -> b
$ Text -> Text -> LogMessage
Deprecated (String -> Text
T.pack String
o) (String -> Text
T.pack String
msg)) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
    \case
       Right () -> forall (m :: * -> *) a. Monad m => a -> m a
return ()
       Left PandocError
e   -> forall e a. Exception e => e -> IO a
E.throwIO PandocError
e

-- | Set text value in text context.
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) = forall a. Map Text (Val a) -> Context a
Context forall a b. (a -> b) -> a -> b
$ forall k a.
Ord k =>
(Maybe a -> Maybe a) -> k -> Map k a -> Map k a
M.alter 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             = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a b. ToContext a b => b -> Val a
toVal Text
val
        go (Just (ListVal [Val a]
xs)) = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. [Val a] -> Val a
ListVal forall a b. (a -> b) -> a -> b
$ [Val a]
xs forall a. [a] -> [a] -> [a]
++ [forall a b. ToContext a b => b -> Val a
toVal Text
val]
        go (Just Val a
x)            = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. [Val a] -> Val a
ListVal [Val a
x, forall a b. ToContext a b => b -> Val a
toVal Text
val]

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

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

-- 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 :: String -> String
normalizePath = forall a. a -> a
id
#endif