1{-# LANGUAGE LambdaCase           #-}
2{-# LANGUAGE OverloadedStrings    #-}
3{-# LANGUAGE ScopedTypeVariables  #-}
4{-# OPTIONS_GHC -fno-warn-orphans #-}
5{- |
6   Module      : Text.Pandoc.Lua.Marshaling.ReaderOptions
7   Copyright   : © 2012-2021 John MacFarlane
8                 © 2017-2021 Albert Krewinkel
9   License     : GNU GPL, version 2 or above
10
11   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
12   Stability   : alpha
13
14Marshaling instance for ReaderOptions and its components.
15-}
16module Text.Pandoc.Lua.Marshaling.ReaderOptions () where
17
18import Data.Data (showConstr, toConstr)
19import Foreign.Lua (Lua, Pushable)
20import Text.Pandoc.Extensions (Extensions)
21import Text.Pandoc.Lua.Marshaling.AnyValue (AnyValue (..))
22import Text.Pandoc.Lua.Marshaling.CommonState ()
23import Text.Pandoc.Options (ReaderOptions (..), TrackChanges)
24
25import qualified Data.Set as Set
26import qualified Data.Text as Text
27import qualified Foreign.Lua as Lua
28import qualified Text.Pandoc.Lua.Util as LuaUtil
29
30--
31-- Reader Options
32--
33instance Pushable Extensions where
34  push exts = Lua.push (show exts)
35
36instance Pushable TrackChanges where
37  push = Lua.push . showConstr . toConstr
38
39instance Pushable ReaderOptions where
40  push ro = do
41    let ReaderOptions
42          (extensions            :: Extensions)
43          (standalone            :: Bool)
44          (columns               :: Int)
45          (tabStop               :: Int)
46          (indentedCodeClasses   :: [Text.Text])
47          (abbreviations         :: Set.Set Text.Text)
48          (defaultImageExtension :: Text.Text)
49          (trackChanges          :: TrackChanges)
50          (stripComments         :: Bool)
51          = ro
52    Lua.newtable
53    LuaUtil.addField "extensions" extensions
54    LuaUtil.addField "standalone" standalone
55    LuaUtil.addField "columns" columns
56    LuaUtil.addField "tab_stop" tabStop
57    LuaUtil.addField "indented_code_classes" indentedCodeClasses
58    LuaUtil.addField "abbreviations" abbreviations
59    LuaUtil.addField "default_image_extension" defaultImageExtension
60    LuaUtil.addField "track_changes" trackChanges
61    LuaUtil.addField "strip_comments" stripComments
62
63    -- add metatable
64    let indexReaderOptions :: AnyValue -> AnyValue -> Lua Lua.NumResults
65        indexReaderOptions _tbl (AnyValue key) = do
66          Lua.ltype key >>= \case
67            Lua.TypeString -> Lua.peek key >>= \case
68              ("defaultImageExtension" :: Text.Text)
69                                    -> Lua.push defaultImageExtension
70              "indentedCodeClasses" -> Lua.push indentedCodeClasses
71              "stripComments" -> Lua.push stripComments
72              "tabStop" -> Lua.push tabStop
73              "trackChanges" -> Lua.push trackChanges
74              _ -> Lua.pushnil
75            _ -> Lua.pushnil
76          return 1
77    Lua.newtable
78    LuaUtil.addFunction "__index" indexReaderOptions
79    Lua.setmetatable (Lua.nthFromTop 2)
80