@@ -30,22 +30,26 @@ module Text.Pandoc.Lua.Module.Utils
3030 ) where
3131
3232import Control.Applicative ((<|>))
33+import Data.Default (def)
3334import Foreign.Lua (FromLuaStack, Lua, LuaInteger, NumResults)
35+import Text.Pandoc.Class (runIO, setUserDataDir)
3436import Text.Pandoc.Definition (Pandoc, Meta, MetaValue, Block, Inline)
3537import Text.Pandoc.Lua.StackInstances ()
36−import Text.Pandoc.Lua.Util (addFunction)
38+import Text.Pandoc.Lua.Util (addFunction, popValue)
3739
3840import qualified Data.Digest.Pure.SHA as SHA
3941import qualified Data.ByteString.Lazy as BSL
4042import qualified Foreign.Lua as Lua
43+import qualified Text.Pandoc.Filter.Json as JsonFilter
4144import qualified Text.Pandoc.Shared as Shared
4245
4346-- | Push the "pandoc.utils" module to the lua stack.
44−pushModule :: Lua NumResults
45−pushModule = do
47+pushModule :: Maybe FilePath -> Lua NumResults
48+pushModule mbDatadir = do
4649 Lua.newtable
4750 addFunction "hierarchicalize" hierarchicalize
4851 addFunction "normalize_date" normalizeDate
52+ addFunction "run_json_filter" (runJsonFilter mbDatadir)
4953 addFunction "sha1" sha1
5054 addFunction "stringify" stringify
5155 addFunction "to_roman_numeral" toRomanNumeral
@@ -62,6 +66,25 @@ hierarchicalize = return . Shared.hierarchicalize
6266normalizeDate :: String -> Lua (Lua.Optional String)
6367normalizeDate = return . Lua.Optional . Shared.normalizeDate
6468
69+-- | Run a JSON filter on the given document.
70+runJsonFilter :: Maybe FilePath
71+ -> Pandoc
72+ -> FilePath
73+ -> Lua.Optional [String]
74+ -> Lua NumResults
75+runJsonFilter mbDatadir doc filterFile optArgs = do
76+ args <- case Lua.fromOptional optArgs of
77+ Just x -> return x
78+ Nothing -> do
79+ Lua.getglobal "FORMAT"
80+ (:[]) <$> popValue
81+ filterRes <- Lua.liftIO . runIO $ do
82+ setUserDataDir mbDatadir
83+ JsonFilter.apply def args filterFile doc
84+ case filterRes of
85+ Left err -> Lua.raiseError (show err)
86+ Right d -> (1 :: NumResults) <$ Lua.push d
87+
6588-- | Calculate the hash of the given contents.
6689sha1 :: BSL.ByteString
6790 -> Lua String