{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
module Text.Pandoc.Options ( module Text.Pandoc.Extensions
, ReaderOptions(..)
, HTMLMathMethod (..)
, CiteMethod (..)
, ObfuscationMethod (..)
, HTMLSlideVariant (..)
, EPUBVersion (..)
, WrapOption (..)
, TopLevelDivision (..)
, WriterOptions (..)
, TrackChanges (..)
, ReferenceLocation (..)
, def
, isEnabled
, defaultMathJaxURL
, defaultKaTeXURL
) where
import Control.Applicative ((<|>))
import Data.Char (toLower)
import Data.Maybe (fromMaybe)
import Data.Data (Data)
import Data.Default
import Data.Text (Text)
import qualified Data.Set as Set
import Data.Typeable (Typeable)
import GHC.Generics (Generic)
import Skylighting (SyntaxMap, defaultSyntaxMap)
import Text.DocTemplates (Context(..), Template)
import Text.Pandoc.Extensions
import Text.Pandoc.Highlighting (Style, pygments)
import Text.Pandoc.Shared (camelCaseStrToHyphenated)
import Data.Aeson.TH (deriveJSON, defaultOptions, Options(..),
SumEncoding(..))
import Data.YAML
class HasSyntaxExtensions a where
getExtensions :: a -> Extensions
data ReaderOptions = ReaderOptions{
readerExtensions :: Extensions
, readerStandalone :: Bool
, readerColumns :: Int
, readerTabStop :: Int
, readerIndentedCodeClasses :: [Text]
, readerAbbreviations :: Set.Set Text
, readerDefaultImageExtension :: Text
, readerTrackChanges :: TrackChanges
, readerStripComments :: Bool
} deriving (Show, Read, Data, Typeable, Generic)
instance HasSyntaxExtensions ReaderOptions where
getExtensions opts = readerExtensions opts
instance Default ReaderOptions
where def = ReaderOptions{
readerExtensions = emptyExtensions
, readerStandalone = False
, readerColumns = 80
, readerTabStop = 4
, readerIndentedCodeClasses = []
, readerAbbreviations = defaultAbbrevs
, readerDefaultImageExtension = ""
, readerTrackChanges = AcceptChanges
, readerStripComments = False
}
defaultAbbrevs :: Set.Set Text
defaultAbbrevs = Set.fromList
[ "Mr.", "Mrs.", "Ms.", "Capt.", "Dr.", "Prof.",
"Gen.", "Gov.", "e.g.", "i.e.", "Sgt.", "St.",
"vol.", "vs.", "Sen.", "Rep.", "Pres.", "Hon.",
"Rev.", "Ph.D.", "M.D.", "M.A.", "p.", "pp.",
"ch.", "sec.", "cf.", "cp."]
data EPUBVersion = EPUB2 | EPUB3 deriving (Eq, Show, Read, Data, Typeable, Generic)
data HTMLMathMethod = PlainMath
| WebTeX Text
| GladTeX
| MathML
| MathJax Text
| KaTeX Text
deriving (Show, Read, Eq, Data, Typeable, Generic)
instance FromYAML HTMLMathMethod where
parseYAML node =
(withMap "HTMLMathMethod" $ \m -> do
method <- m .: "method"
mburl <- m .:? "url"
case method :: Text of
"plain" -> return PlainMath
"webtex" -> return $ WebTeX $ fromMaybe "" mburl
"gladtex" -> return GladTeX
"mathml" -> return MathML
"mathjax" -> return $ MathJax $
fromMaybe defaultMathJaxURL mburl
"katex" -> return $ KaTeX $
fromMaybe defaultKaTeXURL mburl
_ -> fail $ "Unknown HTML math method " ++ show method) node
<|> (withStr "HTMLMathMethod" $ \method ->
case method of
"plain" -> return PlainMath
"webtex" -> return $ WebTeX ""
"gladtex" -> return GladTeX
"mathml" -> return MathML
"mathjax" -> return $ MathJax defaultMathJaxURL
"katex" -> return $ KaTeX defaultKaTeXURL
_ -> fail $ "Unknown HTML math method " ++ show method) node
data CiteMethod = Citeproc
| Natbib
| Biblatex
deriving (Show, Read, Eq, Data, Typeable, Generic)
instance FromYAML CiteMethod where
parseYAML = withStr "Citeproc" $ \t ->
case t of
"citeproc" -> return Citeproc
"natbib" -> return Natbib
"biblatex" -> return Biblatex
_ -> fail $ "Unknown citation method " ++ show t
data ObfuscationMethod = NoObfuscation
| ReferenceObfuscation
| JavascriptObfuscation
deriving (Show, Read, Eq, Data, Typeable, Generic)
instance FromYAML ObfuscationMethod where
parseYAML = withStr "Citeproc" $ \t ->
case t of
"none" -> return NoObfuscation
"references" -> return ReferenceObfuscation
"javascript" -> return JavascriptObfuscation
_ -> fail $ "Unknown obfuscation method " ++ show t
data HTMLSlideVariant = S5Slides
| SlidySlides
| SlideousSlides
| DZSlides
| RevealJsSlides
| NoSlides
deriving (Show, Read, Eq, Data, Typeable, Generic)
data TrackChanges = AcceptChanges
| RejectChanges
| AllChanges
deriving (Show, Read, Eq, Data, Typeable, Generic)
instance FromYAML TrackChanges where
parseYAML = withStr "TrackChanges" $ \t ->
case t of
"accept" -> return AcceptChanges
"reject" -> return RejectChanges
"all" -> return AllChanges
_ -> fail $ "Unknown track changes method " ++ show t
data WrapOption = WrapAuto
| WrapNone
| WrapPreserve
deriving (Show, Read, Eq, Data, Typeable, Generic)
instance FromYAML WrapOption where
parseYAML = withStr "WrapOption" $ \t ->
case t of
"auto" -> return WrapAuto
"none" -> return WrapNone
"preserve" -> return WrapPreserve
_ -> fail $ "Unknown wrap method " ++ show t
data TopLevelDivision = TopLevelPart
| TopLevelChapter
| TopLevelSection
| TopLevelDefault
deriving (Show, Read, Eq, Data, Typeable, Generic)
instance FromYAML TopLevelDivision where
parseYAML = withStr "TopLevelDivision" $ \t ->
case t of
"part" -> return TopLevelPart
"chapter" -> return TopLevelChapter
"section" -> return TopLevelSection
"default" -> return TopLevelDefault
_ -> fail $ "Unknown top level division " ++ show t
data ReferenceLocation = EndOfBlock
| EndOfSection
| EndOfDocument
deriving (Show, Read, Eq, Data, Typeable, Generic)
instance FromYAML ReferenceLocation where
parseYAML = withStr "ReferenceLocation" $ \t ->
case t of
"block" -> return EndOfBlock
"section" -> return EndOfSection
"document" -> return EndOfDocument
_ -> fail $ "Unknown reference location " ++ show t
data WriterOptions = WriterOptions
{ writerTemplate :: Maybe (Template Text)
, writerVariables :: Context Text
, writerTabStop :: Int
, writerTableOfContents :: Bool
, writerIncremental :: Bool
, writerHTMLMathMethod :: HTMLMathMethod
, writerNumberSections :: Bool
, writerNumberOffset :: [Int]
, writerSectionDivs :: Bool
, writerExtensions :: Extensions
, writerReferenceLinks :: Bool
, writerDpi :: Int
, writerWrapText :: WrapOption
, writerColumns :: Int
, writerEmailObfuscation :: ObfuscationMethod
, writerIdentifierPrefix :: Text
, writerCiteMethod :: CiteMethod
, writerHtmlQTags :: Bool
, writerSlideLevel :: Maybe Int
, writerTopLevelDivision :: TopLevelDivision
, writerListings :: Bool
, writerHighlightStyle :: Maybe Style
, writerSetextHeaders :: Bool
, writerEpubSubdirectory :: Text
, writerEpubMetadata :: Maybe Text
, writerEpubFonts :: [FilePath]
, writerEpubChapterLevel :: Int
, writerTOCDepth :: Int
, writerReferenceDoc :: Maybe FilePath
, writerReferenceLocation :: ReferenceLocation
, writerSyntaxMap :: SyntaxMap
, writerPreferAscii :: Bool
} deriving (Show, Data, Typeable, Generic)
instance Default WriterOptions where
def = WriterOptions { writerTemplate = Nothing
, writerVariables = mempty
, writerTabStop = 4
, writerTableOfContents = False
, writerIncremental = False
, writerHTMLMathMethod = PlainMath
, writerNumberSections = False
, writerNumberOffset = [0,0,0,0,0,0]
, writerSectionDivs = False
, writerExtensions = emptyExtensions
, writerReferenceLinks = False
, writerDpi = 96
, writerWrapText = WrapAuto
, writerColumns = 72
, writerEmailObfuscation = NoObfuscation
, writerIdentifierPrefix = ""
, writerCiteMethod = Citeproc
, writerHtmlQTags = False
, writerSlideLevel = Nothing
, writerTopLevelDivision = TopLevelDefault
, writerListings = False
, writerHighlightStyle = Just pygments
, writerSetextHeaders = True
, writerEpubSubdirectory = "EPUB"
, writerEpubMetadata = Nothing
, writerEpubFonts = []
, writerEpubChapterLevel = 1
, writerTOCDepth = 3
, writerReferenceDoc = Nothing
, writerReferenceLocation = EndOfDocument
, writerSyntaxMap = defaultSyntaxMap
, writerPreferAscii = False
}
instance HasSyntaxExtensions WriterOptions where
getExtensions opts = writerExtensions opts
isEnabled :: HasSyntaxExtensions a => Extension -> a -> Bool
isEnabled ext opts = ext `extensionEnabled` getExtensions opts
defaultMathJaxURL :: Text
defaultMathJaxURL = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/"
defaultKaTeXURL :: Text
defaultKaTeXURL = "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/"
$(deriveJSON defaultOptions ''ReaderOptions)
$(deriveJSON defaultOptions{
constructorTagModifier = map toLower,
sumEncoding = TaggedObject{
tagFieldName = "method",
contentsFieldName = "url" }
} ''HTMLMathMethod)
$(deriveJSON defaultOptions{ constructorTagModifier =
camelCaseStrToHyphenated
} ''CiteMethod)
$(deriveJSON defaultOptions{ constructorTagModifier =
\t -> case t of
"NoObfuscation" -> "none"
"ReferenceObfuscation" -> "references"
"JavascriptObfuscation" -> "javascript"
_ -> "none"
} ''ObfuscationMethod)
$(deriveJSON defaultOptions ''HTMLSlideVariant)
$(deriveJSON defaultOptions{ constructorTagModifier =
camelCaseStrToHyphenated
} ''TrackChanges)
$(deriveJSON defaultOptions{ constructorTagModifier =
camelCaseStrToHyphenated
} ''WrapOption)
$(deriveJSON defaultOptions{ constructorTagModifier =
camelCaseStrToHyphenated . drop 8
} ''TopLevelDivision)
$(deriveJSON defaultOptions{ constructorTagModifier =
camelCaseStrToHyphenated
} ''ReferenceLocation)