@@ -30,22 +30,26 @@ module Text.Pandoc.Lua.Module.Utils
32import Control.Applicative ((<|>))
32import Control.Applicative ((<|>))
33+import Data.Default (def)
33import Foreign.Lua (FromLuaStack, Lua, LuaInteger, NumResults)
34import Foreign.Lua (FromLuaStack, Lua, LuaInteger, NumResults)
35+import Text.Pandoc.Class (runIO, setUserDataDir)
34import Text.Pandoc.Definition (Pandoc, Meta, MetaValue, Block, Inline)
36import Text.Pandoc.Definition (Pandoc, Meta, MetaValue, Block, Inline)
35import Text.Pandoc.Lua.StackInstances ()
37import Text.Pandoc.Lua.StackInstances ()
36−import Text.Pandoc.Lua.Util (addFunction)
38+import Text.Pandoc.Lua.Util (addFunction, popValue)
38import qualified Data.Digest.Pure.SHA as SHA
40import qualified Data.Digest.Pure.SHA as SHA
39import qualified Data.ByteString.Lazy as BSL
41import qualified Data.ByteString.Lazy as BSL
40import qualified Foreign.Lua as Lua
42import qualified Foreign.Lua as Lua
43+import qualified Text.Pandoc.Filter.Json as JsonFilter
41import qualified Text.Pandoc.Shared as Shared
44import qualified Text.Pandoc.Shared as Shared
43-- | Push the "pandoc.utils" module to the lua stack.
46-- | Push the "pandoc.utils" module to the lua stack.
44−pushModule :: Lua NumResults
47+pushModule :: Maybe FilePath -> Lua NumResults
45−pushModule = do
48+pushModule mbDatadir = do
46 Lua.newtable
49 Lua.newtable
47 addFunction "hierarchicalize" hierarchicalize
50 addFunction "hierarchicalize" hierarchicalize
48 addFunction "normalize_date" normalizeDate
51 addFunction "normalize_date" normalizeDate
52+ addFunction "run_json_filter" (runJsonFilter mbDatadir)
49 addFunction "sha1" sha1
53 addFunction "sha1" sha1
50 addFunction "stringify" stringify
54 addFunction "stringify" stringify
51 addFunction "to_roman_numeral" toRomanNumeral
55 addFunction "to_roman_numeral" toRomanNumeral
@@ -62,6 +66,25 @@ hierarchicalize = return . Shared.hierarchicalize
62normalizeDate :: String -> Lua (Lua.Optional String)
66normalizeDate :: String -> Lua (Lua.Optional String)
63normalizeDate = return . Lua.Optional . Shared.normalizeDate
67normalizeDate = return . Lua.Optional . Shared.normalizeDate
69+-- | Run a JSON filter on the given document.
70+runJsonFilter :: Maybe FilePath
73+ -> Lua.Optional [String]
75+runJsonFilter mbDatadir doc filterFile optArgs = do
76+ args <- case Lua.fromOptional optArgs of
79+ Lua.getglobal "FORMAT"
81+ filterRes <- Lua.liftIO . runIO $ do
82+ setUserDataDir mbDatadir
83+ JsonFilter.apply def args filterFile doc
85+ Left err -> Lua.raiseError (show err)
86+ Right d -> (1 :: NumResults) <$ Lua.push d
65-- | Calculate the hash of the given contents.
88-- | Calculate the hash of the given contents.
66sha1 :: BSL.ByteString
89sha1 :: BSL.ByteString
67 -> Lua String
90 -> Lua String