{-# LANGUAGE LambdaCase           #-}
{-# LANGUAGE OverloadedStrings    #-}
{-# LANGUAGE ScopedTypeVariables  #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{- |
   Module      : Text.Pandoc.Lua.Marshaling.WriterOptions
   Copyright   : © 2021-2022 Albert Krewinkel, John MacFarlane
   License     : GNU GPL, version 2 or above

   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
   Stability   : alpha

Marshaling instance for WriterOptions and its components.
-}
module Text.Pandoc.Lua.Marshal.WriterOptions
  ( peekWriterOptions
  , pushWriterOptions
  ) where

import Control.Applicative (optional)
import Data.Default (def)
import HsLua as Lua
import HsLua.Aeson (peekViaJSON, pushViaJSON)
import Text.Pandoc.Lua.Marshal.List (pushPandocList)
import Text.Pandoc.Lua.Marshal.Template (peekTemplate, pushTemplate)
import Text.Pandoc.Options (WriterOptions (..))

--
-- Writer Options
--

-- | Retrieve a WriterOptions value, either from a normal WriterOptions
-- value, from a read-only object, or from a table with the same
-- keys as a WriterOptions object.
peekWriterOptions :: LuaError e => Peeker e WriterOptions
peekWriterOptions :: Peeker e WriterOptions
peekWriterOptions = Name -> Peek e WriterOptions -> Peek e WriterOptions
forall e a. Name -> Peek e a -> Peek e a
retrieving Name
"WriterOptions" (Peek e WriterOptions -> Peek e WriterOptions)
-> Peeker e WriterOptions -> Peeker e WriterOptions
forall b c a. (b -> c) -> (a -> b) -> a -> c
. \StackIndex
idx ->
  LuaE e Type -> Peek e Type
forall e a. LuaE e a -> Peek e a
liftLua (StackIndex -> LuaE e Type
forall e. StackIndex -> LuaE e Type
ltype StackIndex
idx) Peek e Type
-> (Type -> Peek e WriterOptions) -> Peek e WriterOptions
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    Type
TypeUserdata -> UDTypeWithList e (DocumentedFunction e) WriterOptions Void
-> Peeker e WriterOptions
forall e fn a itemtype.
LuaError e =>
UDTypeWithList e fn a itemtype -> Peeker e a
peekUD UDTypeWithList e (DocumentedFunction e) WriterOptions Void
forall e. LuaError e => DocumentedType e WriterOptions
typeWriterOptions StackIndex
idx
    Type
TypeTable    -> Peeker e WriterOptions
forall e. LuaError e => Peeker e WriterOptions
peekWriterOptionsTable StackIndex
idx
    Type
_            -> ByteString -> Peek e WriterOptions
forall a e. ByteString -> Peek e a
failPeek (ByteString -> Peek e WriterOptions)
-> Peek e ByteString -> Peek e WriterOptions
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<
                    Name -> StackIndex -> Peek e ByteString
forall e. Name -> StackIndex -> Peek e ByteString
typeMismatchMessage Name
"WriterOptions userdata or table" StackIndex
idx

-- | Pushes a WriterOptions value as userdata object.
pushWriterOptions :: LuaError e => Pusher e WriterOptions
pushWriterOptions :: Pusher e WriterOptions
pushWriterOptions = UDTypeWithList e (DocumentedFunction e) WriterOptions Void
-> Pusher e WriterOptions
forall e fn a itemtype.
LuaError e =>
UDTypeWithList e fn a itemtype -> a -> LuaE e ()
pushUD UDTypeWithList e (DocumentedFunction e) WriterOptions Void
forall e. LuaError e => DocumentedType e WriterOptions
typeWriterOptions

-- | 'WriterOptions' object type.
typeWriterOptions :: LuaError e => DocumentedType e WriterOptions
typeWriterOptions :: DocumentedType e WriterOptions
typeWriterOptions = Name
-> [(Operation, DocumentedFunction e)]
-> [Member e (DocumentedFunction e) WriterOptions]
-> DocumentedType e WriterOptions
forall e a.
LuaError e =>
Name
-> [(Operation, DocumentedFunction e)]
-> [Member e (DocumentedFunction e) a]
-> DocumentedType e a
deftype Name
"WriterOptions"
  [ Operation
-> DocumentedFunction e -> (Operation, DocumentedFunction e)
forall e.
Operation
-> DocumentedFunction e -> (Operation, DocumentedFunction e)
operation Operation
Tostring (DocumentedFunction e -> (Operation, DocumentedFunction e))
-> DocumentedFunction e -> (Operation, DocumentedFunction e)
forall a b. (a -> b) -> a -> b
$ (WriterOptions -> LuaE e String)
-> HsFnPrecursor e (WriterOptions -> LuaE e String)
forall a e. a -> HsFnPrecursor e a
lambda
    ### liftPure show
    HsFnPrecursor e (WriterOptions -> LuaE e String)
-> Parameter e WriterOptions -> HsFnPrecursor e (LuaE e String)
forall e a b.
HsFnPrecursor e (a -> b) -> Parameter e a -> HsFnPrecursor e b
<#> DocumentedType e WriterOptions
-> Text -> Text -> Parameter e WriterOptions
forall e a itemtype.
LuaError e =>
DocumentedTypeWithList e a itemtype
-> Text -> Text -> Parameter e a
udparam DocumentedType e WriterOptions
forall e. LuaError e => DocumentedType e WriterOptions
typeWriterOptions Text
"opts" Text
"options to print in native format"
    HsFnPrecursor e (LuaE e String)
-> FunctionResults e String -> DocumentedFunction e
forall e a.
HsFnPrecursor e (LuaE e a)
-> FunctionResults e a -> DocumentedFunction e
=#> Pusher e String -> Text -> Text -> FunctionResults e String
forall e a. Pusher e a -> Text -> Text -> FunctionResults e a
functionResult Pusher e String
forall e. String -> LuaE e ()
pushString Text
"string" Text
"Haskell representation"
  ]
  [ Name
-> Text
-> (Pusher e CiteMethod, WriterOptions -> CiteMethod)
-> (Peeker e CiteMethod,
    WriterOptions -> CiteMethod -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"cite_method"
    Text
"How to print cites"
    (Pusher e CiteMethod
forall a e. (ToJSON a, LuaError e) => Pusher e a
pushViaJSON, WriterOptions -> CiteMethod
writerCiteMethod)
    (Peeker e CiteMethod
forall a e. (FromJSON a, LuaError e) => Peeker e a
peekViaJSON, \WriterOptions
opts CiteMethod
x -> WriterOptions
opts{ writerCiteMethod :: CiteMethod
writerCiteMethod = CiteMethod
x })

  , Name
-> Text
-> (Pusher e Int, WriterOptions -> Int)
-> (Peeker e Int, WriterOptions -> Int -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"columns"
    Text
"Characters in a line (for text wrapping)"
    (Pusher e Int
forall a e. (Integral a, Show a) => a -> LuaE e ()
pushIntegral, WriterOptions -> Int
writerColumns)
    (Peeker e Int
forall a e. (Integral a, Read a) => Peeker e a
peekIntegral, \WriterOptions
opts Int
x -> WriterOptions
opts{ writerColumns :: Int
writerColumns = Int
x })

  , Name
-> Text
-> (Pusher e Int, WriterOptions -> Int)
-> (Peeker e Int, WriterOptions -> Int -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"dpi"
    Text
"DPI for pixel to/from inch/cm conversions"
    (Pusher e Int
forall a e. (Integral a, Show a) => a -> LuaE e ()
pushIntegral, WriterOptions -> Int
writerDpi)
    (Peeker e Int
forall a e. (Integral a, Read a) => Peeker e a
peekIntegral, \WriterOptions
opts Int
x -> WriterOptions
opts{ writerDpi :: Int
writerDpi = Int
x })

  , Name
-> Text
-> (Pusher e ObfuscationMethod, WriterOptions -> ObfuscationMethod)
-> (Peeker e ObfuscationMethod,
    WriterOptions -> ObfuscationMethod -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"email_obfuscation"
    Text
"How to obfuscate emails"
    (Pusher e ObfuscationMethod
forall a e. (ToJSON a, LuaError e) => Pusher e a
pushViaJSON, WriterOptions -> ObfuscationMethod
writerEmailObfuscation)
    (Peeker e ObfuscationMethod
forall a e. (FromJSON a, LuaError e) => Peeker e a
peekViaJSON, \WriterOptions
opts ObfuscationMethod
x -> WriterOptions
opts{ writerEmailObfuscation :: ObfuscationMethod
writerEmailObfuscation = ObfuscationMethod
x })

  , Name
-> Text
-> (Pusher e Int, WriterOptions -> Int)
-> (Peeker e Int, WriterOptions -> Int -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"epub_chapter_level"
    Text
"Header level for chapters (separate files)"
    (Pusher e Int
forall a e. (Integral a, Show a) => a -> LuaE e ()
pushIntegral, WriterOptions -> Int
writerEpubChapterLevel)
    (Peeker e Int
forall a e. (Integral a, Read a) => Peeker e a
peekIntegral, \WriterOptions
opts Int
x -> WriterOptions
opts{ writerEpubChapterLevel :: Int
writerEpubChapterLevel = Int
x })

  , Name
-> Text
-> (Pusher e [String], WriterOptions -> [String])
-> (Peeker e [String], WriterOptions -> [String] -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"epub_fonts"
    Text
"Paths to fonts to embed"
    (Pusher e String -> Pusher e [String]
forall e a. LuaError e => Pusher e a -> Pusher e [a]
pushPandocList Pusher e String
forall e. String -> LuaE e ()
pushString, WriterOptions -> [String]
writerEpubFonts)
    (Peeker e String -> Peeker e [String]
forall a e. LuaError e => Peeker e a -> Peeker e [a]
peekList Peeker e String
forall e. Peeker e String
peekString, \WriterOptions
opts [String]
x -> WriterOptions
opts{ writerEpubFonts :: [String]
writerEpubFonts = [String]
x })

  , Name
-> Text
-> (Pusher e (Maybe Text), WriterOptions -> Maybe Text)
-> (Peeker e (Maybe Text),
    WriterOptions -> Maybe Text -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"epub_metadata"
    Text
"Metadata to include in EPUB"
    (LuaE e () -> (Text -> LuaE e ()) -> Pusher e (Maybe Text)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe LuaE e ()
forall e. LuaE e ()
pushnil Text -> LuaE e ()
forall e. Pusher e Text
pushText, WriterOptions -> Maybe Text
writerEpubMetadata)
    (Peek e Text -> Peek e (Maybe Text)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Peek e Text -> Peek e (Maybe Text))
-> (StackIndex -> Peek e Text) -> Peeker e (Maybe Text)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StackIndex -> Peek e Text
forall e. Peeker e Text
peekText, \WriterOptions
opts Maybe Text
x -> WriterOptions
opts{ writerEpubMetadata :: Maybe Text
writerEpubMetadata = Maybe Text
x })

  , Name
-> Text
-> (Text -> LuaE e (), WriterOptions -> Text)
-> (StackIndex -> Peek e Text,
    WriterOptions -> Text -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"epub_subdirectory"
    Text
"Subdir for epub in OCF"
    (Text -> LuaE e ()
forall e. Pusher e Text
pushText, WriterOptions -> Text
writerEpubSubdirectory)
    (StackIndex -> Peek e Text
forall e. Peeker e Text
peekText, \WriterOptions
opts Text
x -> WriterOptions
opts{ writerEpubSubdirectory :: Text
writerEpubSubdirectory = Text
x })

  , Name
-> Text
-> (Pusher e Extensions, WriterOptions -> Extensions)
-> (Peeker e Extensions,
    WriterOptions -> Extensions -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"extensions"
    Text
"Markdown extensions that can be used"
    (Pusher e Extensions
forall a e. (ToJSON a, LuaError e) => Pusher e a
pushViaJSON, WriterOptions -> Extensions
writerExtensions)
    (Peeker e Extensions
forall a e. (FromJSON a, LuaError e) => Peeker e a
peekViaJSON, \WriterOptions
opts Extensions
x -> WriterOptions
opts{ writerExtensions :: Extensions
writerExtensions = Extensions
x })

  , Name
-> Text
-> (Pusher e (Maybe Style), WriterOptions -> Maybe Style)
-> (Peeker e (Maybe Style),
    WriterOptions -> Maybe Style -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"highlight_style"
    Text
"Style to use for highlighting (nil = no highlighting)"
    (LuaE e () -> (Style -> LuaE e ()) -> Pusher e (Maybe Style)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe LuaE e ()
forall e. LuaE e ()
pushnil Style -> LuaE e ()
forall a e. (ToJSON a, LuaError e) => Pusher e a
pushViaJSON, WriterOptions -> Maybe Style
writerHighlightStyle)
    (Peek e Style -> Peek e (Maybe Style)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Peek e Style -> Peek e (Maybe Style))
-> (StackIndex -> Peek e Style) -> Peeker e (Maybe Style)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StackIndex -> Peek e Style
forall a e. (FromJSON a, LuaError e) => Peeker e a
peekViaJSON, \WriterOptions
opts Maybe Style
x -> WriterOptions
opts{ writerHighlightStyle :: Maybe Style
writerHighlightStyle = Maybe Style
x })

  , Name
-> Text
-> (Pusher e HTMLMathMethod, WriterOptions -> HTMLMathMethod)
-> (Peeker e HTMLMathMethod,
    WriterOptions -> HTMLMathMethod -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"html_math_method"
    Text
"How to print math in HTML"
    (Pusher e HTMLMathMethod
forall a e. (ToJSON a, LuaError e) => Pusher e a
pushViaJSON, WriterOptions -> HTMLMathMethod
writerHTMLMathMethod)
    (Peeker e HTMLMathMethod
forall a e. (FromJSON a, LuaError e) => Peeker e a
peekViaJSON, \WriterOptions
opts HTMLMathMethod
x -> WriterOptions
opts{ writerHTMLMathMethod :: HTMLMathMethod
writerHTMLMathMethod = HTMLMathMethod
x })

  , Name
-> Text
-> (Pusher e Bool, WriterOptions -> Bool)
-> (Peeker e Bool, WriterOptions -> Bool -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"html_q_tags"
    Text
"Use @<q>@ tags for quotes in HTML"
    (Pusher e Bool
forall e. Pusher e Bool
pushBool, WriterOptions -> Bool
writerHtmlQTags)
    (Peeker e Bool
forall e. Peeker e Bool
peekBool, \WriterOptions
opts Bool
x -> WriterOptions
opts{ writerHtmlQTags :: Bool
writerHtmlQTags = Bool
x })

  , Name
-> Text
-> (Text -> LuaE e (), WriterOptions -> Text)
-> (StackIndex -> Peek e Text,
    WriterOptions -> Text -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"identifier_prefix"
    Text
"Prefix for section & note ids in HTML and for footnote marks in markdown"
    (Text -> LuaE e ()
forall e. Pusher e Text
pushText, WriterOptions -> Text
writerIdentifierPrefix)
    (StackIndex -> Peek e Text
forall e. Peeker e Text
peekText, \WriterOptions
opts Text
x -> WriterOptions
opts{ writerIdentifierPrefix :: Text
writerIdentifierPrefix = Text
x })

  , Name
-> Text
-> (Pusher e Bool, WriterOptions -> Bool)
-> (Peeker e Bool, WriterOptions -> Bool -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"incremental"
    Text
"True if lists should be incremental"
    (Pusher e Bool
forall e. Pusher e Bool
pushBool, WriterOptions -> Bool
writerIncremental)
    (Peeker e Bool
forall e. Peeker e Bool
peekBool, \WriterOptions
opts Bool
x -> WriterOptions
opts{ writerIncremental :: Bool
writerIncremental = Bool
x })

  , Name
-> Text
-> (Pusher e Bool, WriterOptions -> Bool)
-> (Peeker e Bool, WriterOptions -> Bool -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"listings"
    Text
"Use listings package for code"
    (Pusher e Bool
forall e. Pusher e Bool
pushBool, WriterOptions -> Bool
writerListings)
    (Peeker e Bool
forall e. Peeker e Bool
peekBool, \WriterOptions
opts Bool
x -> WriterOptions
opts{ writerListings :: Bool
writerListings = Bool
x })

  , Name
-> Text
-> (Pusher e [Int], WriterOptions -> [Int])
-> (Peeker e [Int], WriterOptions -> [Int] -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"number_offset"
    Text
"Starting number for section, subsection, ..."
    (Pusher e Int -> Pusher e [Int]
forall e a. LuaError e => Pusher e a -> Pusher e [a]
pushPandocList Pusher e Int
forall a e. (Integral a, Show a) => a -> LuaE e ()
pushIntegral, WriterOptions -> [Int]
writerNumberOffset)
    (Peeker e Int -> Peeker e [Int]
forall a e. LuaError e => Peeker e a -> Peeker e [a]
peekList Peeker e Int
forall a e. (Integral a, Read a) => Peeker e a
peekIntegral, \WriterOptions
opts [Int]
x -> WriterOptions
opts{ writerNumberOffset :: [Int]
writerNumberOffset = [Int]
x })

  , Name
-> Text
-> (Pusher e Bool, WriterOptions -> Bool)
-> (Peeker e Bool, WriterOptions -> Bool -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"number_sections"
    Text
"Number sections in LaTeX"
    (Pusher e Bool
forall e. Pusher e Bool
pushBool, WriterOptions -> Bool
writerNumberSections)
    (Peeker e Bool
forall e. Peeker e Bool
peekBool, \WriterOptions
opts Bool
x -> WriterOptions
opts{ writerNumberSections :: Bool
writerNumberSections = Bool
x })

  , Name
-> Text
-> (Pusher e Bool, WriterOptions -> Bool)
-> (Peeker e Bool, WriterOptions -> Bool -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"prefer_ascii"
    Text
"Prefer ASCII representations of characters when possible"
    (Pusher e Bool
forall e. Pusher e Bool
pushBool, WriterOptions -> Bool
writerPreferAscii)
    (Peeker e Bool
forall e. Peeker e Bool
peekBool, \WriterOptions
opts Bool
x -> WriterOptions
opts{ writerPreferAscii :: Bool
writerPreferAscii = Bool
x })

  , Name
-> Text
-> (Pusher e (Maybe String), WriterOptions -> Maybe String)
-> (Peeker e (Maybe String),
    WriterOptions -> Maybe String -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"reference_doc"
    Text
"Path to reference document if specified"
    (LuaE e () -> Pusher e String -> Pusher e (Maybe String)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe LuaE e ()
forall e. LuaE e ()
pushnil Pusher e String
forall e. String -> LuaE e ()
pushString, WriterOptions -> Maybe String
writerReferenceDoc)
    (Peek e String -> Peek e (Maybe String)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Peek e String -> Peek e (Maybe String))
-> Peeker e String -> Peeker e (Maybe String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Peeker e String
forall e. Peeker e String
peekString, \WriterOptions
opts Maybe String
x -> WriterOptions
opts{ writerReferenceDoc :: Maybe String
writerReferenceDoc = Maybe String
x })

  , Name
-> Text
-> (Pusher e Bool, WriterOptions -> Bool)
-> (Peeker e Bool, WriterOptions -> Bool -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"reference_links"
    Text
"Use reference links in writing markdown, rst"
    (Pusher e Bool
forall e. Pusher e Bool
pushBool, WriterOptions -> Bool
writerReferenceLinks)
    (Peeker e Bool
forall e. Peeker e Bool
peekBool, \WriterOptions
opts Bool
x -> WriterOptions
opts{ writerReferenceLinks :: Bool
writerReferenceLinks = Bool
x })

  , Name
-> Text
-> (Pusher e ReferenceLocation, WriterOptions -> ReferenceLocation)
-> (Peeker e ReferenceLocation,
    WriterOptions -> ReferenceLocation -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"reference_location"
    Text
"Location of footnotes and references for writing markdown"
    (Pusher e ReferenceLocation
forall a e. (ToJSON a, LuaError e) => Pusher e a
pushViaJSON, WriterOptions -> ReferenceLocation
writerReferenceLocation)
    (Peeker e ReferenceLocation
forall a e. (FromJSON a, LuaError e) => Peeker e a
peekViaJSON, \WriterOptions
opts ReferenceLocation
x -> WriterOptions
opts{ writerReferenceLocation :: ReferenceLocation
writerReferenceLocation = ReferenceLocation
x })

  , Name
-> Text
-> (Pusher e Bool, WriterOptions -> Bool)
-> (Peeker e Bool, WriterOptions -> Bool -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"section_divs"
    Text
"Put sections in div tags in HTML"
    (Pusher e Bool
forall e. Pusher e Bool
pushBool, WriterOptions -> Bool
writerSectionDivs)
    (Peeker e Bool
forall e. Peeker e Bool
peekBool, \WriterOptions
opts Bool
x -> WriterOptions
opts{ writerSectionDivs :: Bool
writerSectionDivs = Bool
x })

  , Name
-> Text
-> (Pusher e Bool, WriterOptions -> Bool)
-> (Peeker e Bool, WriterOptions -> Bool -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"setext_headers"
    Text
"Use setext headers for levels 1-2 in markdown"
    (Pusher e Bool
forall e. Pusher e Bool
pushBool, WriterOptions -> Bool
writerSetextHeaders)
    (Peeker e Bool
forall e. Peeker e Bool
peekBool, \WriterOptions
opts Bool
x -> WriterOptions
opts{ writerSetextHeaders :: Bool
writerSetextHeaders = Bool
x })

  , Name
-> Text
-> (Pusher e (Maybe Int), WriterOptions -> Maybe Int)
-> (Peeker e (Maybe Int),
    WriterOptions -> Maybe Int -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"slide_level"
    Text
"Force header level of slides"
    (LuaE e () -> Pusher e Int -> Pusher e (Maybe Int)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe LuaE e ()
forall e. LuaE e ()
pushnil Pusher e Int
forall a e. (Integral a, Show a) => a -> LuaE e ()
pushIntegral, WriterOptions -> Maybe Int
writerSlideLevel)
    (Peek e Int -> Peek e (Maybe Int)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Peek e Int -> Peek e (Maybe Int))
-> Peeker e Int -> Peeker e (Maybe Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Peeker e Int
forall a e. (Integral a, Read a) => Peeker e a
peekIntegral, \WriterOptions
opts Maybe Int
x -> WriterOptions
opts{ writerSlideLevel :: Maybe Int
writerSlideLevel = Maybe Int
x })

  -- , property "syntax_map" "Syntax highlighting definition"
  --   (pushViaJSON, writerSyntaxMap)
  --   (peekViaJSON, \opts x -> opts{ writerSyntaxMap = x })
    -- :: SyntaxMap

  , Name
-> Text
-> (Pusher e Int, WriterOptions -> Int)
-> (Peeker e Int, WriterOptions -> Int -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"tab_stop"
    Text
"Tabstop for conversion btw spaces and tabs"
    (Pusher e Int
forall a e. (Integral a, Show a) => a -> LuaE e ()
pushIntegral, WriterOptions -> Int
writerTabStop)
    (Peeker e Int
forall a e. (Integral a, Read a) => Peeker e a
peekIntegral, \WriterOptions
opts Int
x -> WriterOptions
opts{ writerTabStop :: Int
writerTabStop = Int
x })

  , Name
-> Text
-> (Pusher e Bool, WriterOptions -> Bool)
-> (Peeker e Bool, WriterOptions -> Bool -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"table_of_contents"
    Text
"Include table of contents"
    (Pusher e Bool
forall e. Pusher e Bool
pushBool, WriterOptions -> Bool
writerTableOfContents)
    (Peeker e Bool
forall e. Peeker e Bool
peekBool, \WriterOptions
opts Bool
x -> WriterOptions
opts{ writerTableOfContents :: Bool
writerTableOfContents = Bool
x })

  , Name
-> Text
-> (Pusher e (Maybe (Template Text)),
    WriterOptions -> Maybe (Template Text))
-> (Peeker e (Maybe (Template Text)),
    WriterOptions -> Maybe (Template Text) -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"template"
    Text
"Template to use"
    (LuaE e ()
-> (Template Text -> LuaE e ()) -> Pusher e (Maybe (Template Text))
forall b a. b -> (a -> b) -> Maybe a -> b
maybe LuaE e ()
forall e. LuaE e ()
pushnil Template Text -> LuaE e ()
forall e. LuaError e => Pusher e (Template Text)
pushTemplate, WriterOptions -> Maybe (Template Text)
writerTemplate)
    (Peek e (Template Text) -> Peek e (Maybe (Template Text))
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional (Peek e (Template Text) -> Peek e (Maybe (Template Text)))
-> (StackIndex -> Peek e (Template Text))
-> Peeker e (Maybe (Template Text))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StackIndex -> Peek e (Template Text)
forall e. LuaError e => Peeker e (Template Text)
peekTemplate, \WriterOptions
opts Maybe (Template Text)
x -> WriterOptions
opts{ writerTemplate :: Maybe (Template Text)
writerTemplate = Maybe (Template Text)
x })
    -- :: Maybe (Template Text)

  , Name
-> Text
-> (Pusher e Int, WriterOptions -> Int)
-> (Peeker e Int, WriterOptions -> Int -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"toc_depth"
    Text
"Number of levels to include in TOC"
    (Pusher e Int
forall a e. (Integral a, Show a) => a -> LuaE e ()
pushIntegral, WriterOptions -> Int
writerTOCDepth)
    (Peeker e Int
forall a e. (Integral a, Read a) => Peeker e a
peekIntegral, \WriterOptions
opts Int
x -> WriterOptions
opts{ writerTOCDepth :: Int
writerTOCDepth = Int
x })

  , Name
-> Text
-> (Pusher e TopLevelDivision, WriterOptions -> TopLevelDivision)
-> (Peeker e TopLevelDivision,
    WriterOptions -> TopLevelDivision -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"top_level_division"
    Text
"Type of top-level divisions"
    (Pusher e TopLevelDivision
forall a e. (ToJSON a, LuaError e) => Pusher e a
pushViaJSON, WriterOptions -> TopLevelDivision
writerTopLevelDivision)
    (Peeker e TopLevelDivision
forall a e. (FromJSON a, LuaError e) => Peeker e a
peekViaJSON, \WriterOptions
opts TopLevelDivision
x -> WriterOptions
opts{ writerTopLevelDivision :: TopLevelDivision
writerTopLevelDivision = TopLevelDivision
x })

  , Name
-> Text
-> (Pusher e (Context Text), WriterOptions -> Context Text)
-> (Peeker e (Context Text),
    WriterOptions -> Context Text -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"variables"
    Text
"Variables to set in template"
    (Pusher e (Context Text)
forall a e. (ToJSON a, LuaError e) => Pusher e a
pushViaJSON, WriterOptions -> Context Text
writerVariables)
    (Peeker e (Context Text)
forall a e. (FromJSON a, LuaError e) => Peeker e a
peekViaJSON, \WriterOptions
opts Context Text
x -> WriterOptions
opts{ writerVariables :: Context Text
writerVariables = Context Text
x })

  , Name
-> Text
-> (Pusher e WrapOption, WriterOptions -> WrapOption)
-> (Peeker e WrapOption,
    WriterOptions -> WrapOption -> WriterOptions)
-> Member e (DocumentedFunction e) WriterOptions
forall e b a fn.
LuaError e =>
Name
-> Text
-> (Pusher e b, a -> b)
-> (Peeker e b, a -> b -> a)
-> Member e fn a
property Name
"wrap_text"
    Text
"Option for wrapping text"
    (Pusher e WrapOption
forall a e. (ToJSON a, LuaError e) => Pusher e a
pushViaJSON, WriterOptions -> WrapOption
writerWrapText)
    (Peeker e WrapOption
forall a e. (FromJSON a, LuaError e) => Peeker e a
peekViaJSON, \WriterOptions
opts WrapOption
x -> WriterOptions
opts{ writerWrapText :: WrapOption
writerWrapText = WrapOption
x })
  ]

-- | Retrieves a 'WriterOptions' object from a table on the stack, using
-- the default values for all missing fields.
--
-- Internally, this pushes the default writer options, sets each
-- key/value pair of the table in the userdata value, then retrieves the
-- object again. This will update all fields and complain about unknown
-- keys.
peekWriterOptionsTable :: LuaError e => Peeker e WriterOptions
peekWriterOptionsTable :: Peeker e WriterOptions
peekWriterOptionsTable StackIndex
idx = Name -> Peek e WriterOptions -> Peek e WriterOptions
forall e a. Name -> Peek e a -> Peek e a
retrieving Name
"WriterOptions (table)" (Peek e WriterOptions -> Peek e WriterOptions)
-> Peek e WriterOptions -> Peek e WriterOptions
forall a b. (a -> b) -> a -> b
$ do
  LuaE e () -> Peek e ()
forall e a. LuaE e a -> Peek e a
liftLua (LuaE e () -> Peek e ()) -> LuaE e () -> Peek e ()
forall a b. (a -> b) -> a -> b
$ do
    StackIndex
absidx <- StackIndex -> LuaE e StackIndex
forall e. StackIndex -> LuaE e StackIndex
absindex StackIndex
idx
    UDTypeWithList e (DocumentedFunction e) WriterOptions Void
-> WriterOptions -> LuaE e ()
forall e fn a itemtype.
LuaError e =>
UDTypeWithList e fn a itemtype -> a -> LuaE e ()
pushUD UDTypeWithList e (DocumentedFunction e) WriterOptions Void
forall e. LuaError e => DocumentedType e WriterOptions
typeWriterOptions WriterOptions
forall a. Default a => a
def
    let setFields :: LuaE e ()
setFields = do
          StackIndex -> LuaE e Bool
forall e. LuaError e => StackIndex -> LuaE e Bool
next StackIndex
absidx LuaE e Bool -> (Bool -> LuaE e ()) -> LuaE e ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
            Bool
False -> () -> LuaE e ()
forall (m :: * -> *) a. Monad m => a -> m a
return () -- all fields were copied
            Bool
True -> do
              StackIndex -> LuaE e ()
forall e. StackIndex -> LuaE e ()
pushvalue (CInt -> StackIndex
nth CInt
2) LuaE e () -> LuaE e () -> LuaE e ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> StackIndex -> LuaE e ()
forall e. StackIndex -> LuaE e ()
insert (CInt -> StackIndex
nth CInt
2)
              StackIndex -> LuaE e ()
forall e. LuaError e => StackIndex -> LuaE e ()
settable (CInt -> StackIndex
nth CInt
4) -- set in userdata object
              LuaE e ()
setFields
    LuaE e ()
forall e. LuaE e ()
pushnil -- first key
    LuaE e ()
setFields
  UDTypeWithList e (DocumentedFunction e) WriterOptions Void
-> Peeker e WriterOptions
forall e fn a itemtype.
LuaError e =>
UDTypeWithList e fn a itemtype -> Peeker e a
peekUD UDTypeWithList e (DocumentedFunction e) WriterOptions Void
forall e. LuaError e => DocumentedType e WriterOptions
typeWriterOptions StackIndex
top Peek e WriterOptions -> LuaE e () -> Peek e WriterOptions
forall e a b. Peek e a -> LuaE e b -> Peek e a
`lastly` Int -> LuaE e ()
forall e. Int -> LuaE e ()
pop Int
1

instance Pushable WriterOptions where
  push :: WriterOptions -> LuaE e ()
push = WriterOptions -> LuaE e ()
forall e. LuaError e => WriterOptions -> LuaE e ()
pushWriterOptions