From 8d5422f36b28bab67b4d13e4a3d2154d0c5024f8 Mon Sep 17 00:00:00 2001
From: Albert Krewinkel <albert@zeitkraut.de>
Date: Wed, 10 Jan 2018 22:26:12 +0100
Subject: Lua modules: add function pandoc.utils.run_json_filter

Runs a JSON filter on a Pandoc document.
---
 src/Text/Pandoc/Lua/Module/Utils.hs | 29 ++++++++++++++++++++++++++---
 src/Text/Pandoc/Lua/Packages.hs     |  3 ++-
 2 files changed, 28 insertions(+), 4 deletions(-)

(limited to 'src/Text/Pandoc/Lua')

diff --git a/src/Text/Pandoc/Lua/Module/Utils.hs b/src/Text/Pandoc/Lua/Module/Utils.hs
index b453b38d7..ab29cc0c7 100644
--- a/src/Text/Pandoc/Lua/Module/Utils.hs
+++ b/src/Text/Pandoc/Lua/Module/Utils.hs
@@ -30,22 +30,26 @@ module Text.Pandoc.Lua.Module.Utils
   ) where
 
 import Control.Applicative ((<|>))
+import Data.Default (def)
 import Foreign.Lua (FromLuaStack, Lua, LuaInteger, NumResults)
+import Text.Pandoc.Class (runIO, setUserDataDir)
 import Text.Pandoc.Definition (Pandoc, Meta, MetaValue, Block, Inline)
 import Text.Pandoc.Lua.StackInstances ()
-import Text.Pandoc.Lua.Util (addFunction)
+import Text.Pandoc.Lua.Util (addFunction, popValue)
 
 import qualified Data.Digest.Pure.SHA as SHA
 import qualified Data.ByteString.Lazy as BSL
 import qualified Foreign.Lua as Lua
+import qualified Text.Pandoc.Filter.Json as JsonFilter
 import qualified Text.Pandoc.Shared as Shared
 
 -- | Push the "pandoc.utils" module to the lua stack.
-pushModule :: Lua NumResults
-pushModule = do
+pushModule :: Maybe FilePath -> Lua NumResults
+pushModule mbDatadir = do
   Lua.newtable
   addFunction "hierarchicalize" hierarchicalize
   addFunction "normalize_date" normalizeDate
+  addFunction "run_json_filter" (runJsonFilter mbDatadir)
   addFunction "sha1" sha1
   addFunction "stringify" stringify
   addFunction "to_roman_numeral" toRomanNumeral
@@ -62,6 +66,25 @@ hierarchicalize = return . Shared.hierarchicalize
 normalizeDate :: String -> Lua (Lua.Optional String)
 normalizeDate = return . Lua.Optional . Shared.normalizeDate
 
+-- | Run a JSON filter on the given document.
+runJsonFilter :: Maybe FilePath
+              -> Pandoc
+              -> FilePath
+              -> Lua.Optional [String]
+              -> Lua NumResults
+runJsonFilter mbDatadir doc filterFile optArgs = do
+  args <- case Lua.fromOptional optArgs of
+            Just x -> return x
+            Nothing -> do
+              Lua.getglobal "FORMAT"
+              (:[]) <$> popValue
+  filterRes <- Lua.liftIO . runIO $ do
+    setUserDataDir mbDatadir
+    JsonFilter.apply def args filterFile doc
+  case filterRes of
+    Left err -> Lua.raiseError (show err)
+    Right d -> (1 :: NumResults) <$ Lua.push d
+
 -- | Calculate the hash of the given contents.
 sha1 :: BSL.ByteString
      -> Lua String
diff --git a/src/Text/Pandoc/Lua/Packages.hs b/src/Text/Pandoc/Lua/Packages.hs
index dda2dd2fe..0169d0045 100644
--- a/src/Text/Pandoc/Lua/Packages.hs
+++ b/src/Text/Pandoc/Lua/Packages.hs
@@ -78,7 +78,8 @@ pandocPackageSearcher luaPkgParams pkgName =
     "pandoc.mediabag" -> let st    = luaPkgCommonState luaPkgParams
                              mbRef = luaPkgMediaBag luaPkgParams
                          in pushWrappedHsFun (MediaBag.pushModule st mbRef)
-    "pandoc.utils"    -> pushWrappedHsFun Utils.pushModule
+    "pandoc.utils"    -> let datadirMb = luaPkgDataDir luaPkgParams
+                         in pushWrappedHsFun (Utils.pushModule datadirMb)
     _ -> searchPureLuaLoader
  where
   pushWrappedHsFun f = do
-- 
cgit v1.2.3