git.iko.soy/typeable/pandoc
on master help sign in
T.P.Lua: expose more useful internals (API change)

Newly exported from Text.Pandoc.Lua: - `runFilterFile` to run a Lua filter from file; - data type `Global` and its constructors; and - `setGlobals` to add globals to a Lua environment. This module also contains `Pushable` and `Peekable` instances required to get pandoc's data types to and from Lua. Low-level Lua operation remain hidden in Text.Pandoc.Lua.

commitf6124213073cf162bd3cfa5e6d455807e8a502a9 authorAlbert Krewinkel <albert@zeitkraut.de> dateFri 26 Oct 2018, 23:45 (8 years ago) parent6f29e1c
5 files changed+37−30
src/Text/Pandoc/Filter/Lua.hs+3−22 src/Text/Pandoc/Lua.hs+11−3 src/Text/Pandoc/Lua/Filter.hs+20 src/Text/Pandoc/Lua/Init.hs+1−2 src/Text/Pandoc/Writers/Custom.hs+2−3
src/Text/Pandoc/Filter/Lua.hs+3−22
@@ -33,19 +33,14 @@ module Text.Pandoc.Filter.Lua (apply) where
3333import Prelude
3434import Control.Exception (throw)
3535import Control.Monad ((>=>))
36−import Foreign.Lua (Lua)
3736import Text.Pandoc.Class (PandocIO)
3837import Text.Pandoc.Definition (Pandoc)
3938import Text.Pandoc.Error (PandocError (PandocFilterError))
4039import Text.Pandoc.Filter.Path (expandFilterPath)
41−import Text.Pandoc.Lua (LuaException (..), runLua)
42−import Text.Pandoc.Lua.Filter (LuaFilter, walkMWithLuaFilter)
43−import Text.Pandoc.Lua.Global (Global (..), setGlobals)
44−import Text.Pandoc.Lua.Util (dofileWithTraceback)
40+import Text.Pandoc.Lua (Global (..), LuaException (..),
41+ runLua, runFilterFile, setGlobals)
4542import Text.Pandoc.Options (ReaderOptions)
4643
47−import qualified Foreign.Lua as Lua
48−
4944-- | Run the Lua filter in @filterPath@ for a transformation to the
5045-- target format (first element in args). Pandoc uses Lua init files to
5146-- setup the Lua interpreter.
@@ -64,23 +59,9 @@ apply ropts args f doc = do
6459 , PANDOC_READER_OPTIONS ropts
6560 , PANDOC_SCRIPT_FILE filterPath
6661 ]
67− top <- Lua.gettop
68− stat <- dofileWithTraceback filterPath
69− if stat /= Lua.OK
70− then Lua.throwTopMessage
71− else do
72− newtop <- Lua.gettop
73− -- Use the returned filters, or the implicitly defined global
74− -- filter if nothing was returned.
75− luaFilters <- if newtop - top >= 1
76− then Lua.peek Lua.stackTop
77− else Lua.pushglobaltable *> fmap (:[]) Lua.popValue
78− runAll luaFilters doc
62+ runFilterFile filterPath doc
7963
8064forceResult :: FilePath -> Either LuaException Pandoc -> PandocIO Pandoc
8165forceResult fp eitherResult = case eitherResult of
8266 Right x -> return x
8367 Left (LuaException s) -> throw (PandocFilterError fp s)
84−
85−runAll :: [LuaFilter] -> Pandoc -> Lua Pandoc
86−runAll = foldr ((>=>) . walkMWithLuaFilter) return
src/Text/Pandoc/Lua.hs+11−3
@@ -1,3 +1,4 @@
1+{-# LANGUAGE NoImplicitPrelude #-}
12{-
23Copyright © 2017–2018 Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
34
@@ -15,7 +16,6 @@ You should have received a copy of the GNU General Public License
1516along with this program; if not, write to the Free Software
1617Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1718-}
18−{-# LANGUAGE NoImplicitPrelude #-}
1919{- |
2020 Module : Text.Pandoc.Lua
2121 Copyright : Copyright © 2017–2018 Albert Krewinkel
@@ -27,9 +27,17 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2727Running pandoc Lua filters.
2828-}
2929module Text.Pandoc.Lua
30− ( LuaException (..)
31− , runLua
30+ ( runLua
31+ , LuaException (..)
32+ -- * Lua globals
33+ , Global (..)
34+ , setGlobals
35+ -- * Filters
36+ , runFilterFile
3237 ) where
3338
39+import Text.Pandoc.Lua.Filter (runFilterFile)
40+import Text.Pandoc.Lua.Global (Global (..), setGlobals)
3441import Text.Pandoc.Lua.Init (LuaException (..), runLua)
42+import Text.Pandoc.Lua.StackInstances ()
3543
src/Text/Pandoc/Lua/Filter.hs+20
@@ -30,6 +30,7 @@ Types and functions for running Lua filters.
3030-}
3131module Text.Pandoc.Lua.Filter ( LuaFilterFunction
3232 , LuaFilter
33+ , runFilterFile
3334 , tryFilter
3435 , runFilterFunction
3536 , walkMWithLuaFilter
@@ -54,6 +55,25 @@ import qualified Data.Map.Strict as Map
5455import qualified Foreign.Lua as Lua
5556import qualified Text.Pandoc.Lua.Util as LuaUtil
5657
58+-- | Transform document using the filter defined in the given file.
59+runFilterFile :: FilePath -> Pandoc -> Lua Pandoc
60+runFilterFile filterPath doc = do
61+ top <- Lua.gettop
62+ stat <- LuaUtil.dofileWithTraceback filterPath
63+ if stat /= Lua.OK
64+ then Lua.throwTopMessage
65+ else do
66+ newtop <- Lua.gettop
67+ -- Use the returned filters, or the implicitly defined global
68+ -- filter if nothing was returned.
69+ luaFilters <- if newtop - top >= 1
70+ then Lua.peek Lua.stackTop
71+ else Lua.pushglobaltable *> fmap (:[]) Lua.popValue
72+ runAll luaFilters doc
73+
74+runAll :: [LuaFilter] -> Pandoc -> Lua Pandoc
75+runAll = foldr ((>=>) . walkMWithLuaFilter) return
76+
5777-- | Filter function stored in the registry
5878newtype LuaFilterFunction = LuaFilterFunction Lua.Reference
5979
src/Text/Pandoc/Lua/Init.hs+1−2
@@ -30,7 +30,6 @@ module Text.Pandoc.Lua.Init
3030 ( LuaException (..)
3131 , LuaPackageParams (..)
3232 , runLua
33− , initLuaState
3433 , luaPackageParams
3534 ) where
3635
@@ -94,7 +93,7 @@ luaPackageParams = do
9493 , luaPkgMediaBag = mbRef
9594 }
9695
97−-- Initialize the lua state with all required values
96+-- | Initialize the lua state with all required values
9897initLuaState :: LuaPackageParams -> Lua ()
9998initLuaState luaPkgParams = do
10099 Lua.openlibs
src/Text/Pandoc/Writers/Custom.hs+2−3
@@ -43,9 +43,8 @@ import Foreign.Lua (Lua, Pushable)
4343import Text.Pandoc.Class (PandocIO)
4444import Text.Pandoc.Definition
4545import Text.Pandoc.Error
46−import Text.Pandoc.Lua.Global (Global (..), setGlobals)
47−import Text.Pandoc.Lua.Init (LuaException (LuaException), runLua)
48−import Text.Pandoc.Lua.StackInstances ()
46+import Text.Pandoc.Lua (Global (..), LuaException (LuaException),
47+ runLua, setGlobals)
4948import Text.Pandoc.Lua.Util (addField, dofileWithTraceback)
5049import Text.Pandoc.Options
5150import Text.Pandoc.Templates