git.iko.soy/typeable/pandoc
on master help sign in
T.P.Lua: expose more useful internals (API change)
f612421Albert Krewinkel
src/Text/Pandoc/Filter/Lua.hs+3−22
@@ -33,19 +33,14 @@ module Text.Pandoc.Filter.Lua (apply) where
33import Prelude
33import Prelude
34import Control.Exception (throw)
34import Control.Exception (throw)
35import Control.Monad ((>=>))
35import Control.Monad ((>=>))
36−import Foreign.Lua (Lua)
37import Text.Pandoc.Class (PandocIO)
36import Text.Pandoc.Class (PandocIO)
38import Text.Pandoc.Definition (Pandoc)
37import Text.Pandoc.Definition (Pandoc)
39import Text.Pandoc.Error (PandocError (PandocFilterError))
38import Text.Pandoc.Error (PandocError (PandocFilterError))
40import Text.Pandoc.Filter.Path (expandFilterPath)
39import Text.Pandoc.Filter.Path (expandFilterPath)
41−import Text.Pandoc.Lua (LuaException (..), runLua)
40+import Text.Pandoc.Lua (Global (..), LuaException (..),
42−import Text.Pandoc.Lua.Filter (LuaFilter, walkMWithLuaFilter)
41+ runLua, runFilterFile, setGlobals)
43−import Text.Pandoc.Lua.Global (Global (..), setGlobals)
44−import Text.Pandoc.Lua.Util (dofileWithTraceback)
45import Text.Pandoc.Options (ReaderOptions)
42import Text.Pandoc.Options (ReaderOptions)
46
43
47−import qualified Foreign.Lua as Lua
48−
49-- | Run the Lua filter in @filterPath@ for a transformation to the
44-- | Run the Lua filter in @filterPath@ for a transformation to the
50-- target format (first element in args). Pandoc uses Lua init files to
45-- target format (first element in args). Pandoc uses Lua init files to
51-- setup the Lua interpreter.
46-- setup the Lua interpreter.
@@ -64,23 +59,9 @@ apply ropts args f doc = do
64 , PANDOC_READER_OPTIONS ropts
59 , PANDOC_READER_OPTIONS ropts
65 , PANDOC_SCRIPT_FILE filterPath
60 , PANDOC_SCRIPT_FILE filterPath
66 ]
61 ]
67− top <- Lua.gettop
62+ runFilterFile filterPath doc
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
79
63
80forceResult :: FilePath -> Either LuaException Pandoc -> PandocIO Pandoc
64forceResult :: FilePath -> Either LuaException Pandoc -> PandocIO Pandoc
81forceResult fp eitherResult = case eitherResult of
65forceResult fp eitherResult = case eitherResult of
82 Right x -> return x
66 Right x -> return x
83 Left (LuaException s) -> throw (PandocFilterError fp s)
67 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 #-}
1{-
2{-
2Copyright © 2017–2018 Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
3Copyright © 2017–2018 Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
3
4
@@ -15,7 +16,6 @@ You should have received a copy of the GNU General Public License
15along with this program; if not, write to the Free Software
16along with this program; if not, write to the Free Software
16Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17-}
18-}
18−{-# LANGUAGE NoImplicitPrelude #-}
19{- |
19{- |
20 Module : Text.Pandoc.Lua
20 Module : Text.Pandoc.Lua
21 Copyright : Copyright © 2017–2018 Albert Krewinkel
21 Copyright : Copyright © 2017–2018 Albert Krewinkel
@@ -27,9 +27,17 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27Running pandoc Lua filters.
27Running pandoc Lua filters.
28-}
28-}
29module Text.Pandoc.Lua
29module Text.Pandoc.Lua
30+ ( runLua
30− ( LuaException (..)
31+ , LuaException (..)
31− , runLua
32+ -- * Lua globals
33+ , Global (..)
34+ , setGlobals
35+ -- * Filters
36+ , runFilterFile
32 ) where
37 ) where
33
38
39+import Text.Pandoc.Lua.Filter (runFilterFile)
40+import Text.Pandoc.Lua.Global (Global (..), setGlobals)
34import Text.Pandoc.Lua.Init (LuaException (..), runLua)
41import Text.Pandoc.Lua.Init (LuaException (..), runLua)
42+import Text.Pandoc.Lua.StackInstances ()
35
43
src/Text/Pandoc/Lua/Filter.hs+20
@@ -30,6 +30,7 @@ Types and functions for running Lua filters.
30-}
30-}
31module Text.Pandoc.Lua.Filter ( LuaFilterFunction
31module Text.Pandoc.Lua.Filter ( LuaFilterFunction
32 , LuaFilter
32 , LuaFilter
33+ , runFilterFile
33 , tryFilter
34 , tryFilter
34 , runFilterFunction
35 , runFilterFunction
35 , walkMWithLuaFilter
36 , walkMWithLuaFilter
@@ -54,6 +55,25 @@ import qualified Data.Map.Strict as Map
54import qualified Foreign.Lua as Lua
55import qualified Foreign.Lua as Lua
55import qualified Text.Pandoc.Lua.Util as LuaUtil
56import qualified Text.Pandoc.Lua.Util as LuaUtil
56
57
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+
57-- | Filter function stored in the registry
77-- | Filter function stored in the registry
58newtype LuaFilterFunction = LuaFilterFunction Lua.Reference
78newtype LuaFilterFunction = LuaFilterFunction Lua.Reference
59
79
src/Text/Pandoc/Lua/Init.hs+1−2
@@ -30,7 +30,6 @@ module Text.Pandoc.Lua.Init
30 ( LuaException (..)
30 ( LuaException (..)
31 , LuaPackageParams (..)
31 , LuaPackageParams (..)
32 , runLua
32 , runLua
33− , initLuaState
34 , luaPackageParams
33 , luaPackageParams
35 ) where
34 ) where
36
35
@@ -94,7 +93,7 @@ luaPackageParams = do
94 , luaPkgMediaBag = mbRef
93 , luaPkgMediaBag = mbRef
95 }
94 }
96
95
97−-- Initialize the lua state with all required values
96+-- | Initialize the lua state with all required values
98initLuaState :: LuaPackageParams -> Lua ()
97initLuaState :: LuaPackageParams -> Lua ()
99initLuaState luaPkgParams = do
98initLuaState luaPkgParams = do
100 Lua.openlibs
99 Lua.openlibs
src/Text/Pandoc/Writers/Custom.hs+2−3
@@ -43,9 +43,8 @@ import Foreign.Lua (Lua, Pushable)
43import Text.Pandoc.Class (PandocIO)
43import Text.Pandoc.Class (PandocIO)
44import Text.Pandoc.Definition
44import Text.Pandoc.Definition
45import Text.Pandoc.Error
45import Text.Pandoc.Error
46−import Text.Pandoc.Lua.Global (Global (..), setGlobals)
46+import Text.Pandoc.Lua (Global (..), LuaException (LuaException),
47−import Text.Pandoc.Lua.Init (LuaException (LuaException), runLua)
47+ runLua, setGlobals)
48−import Text.Pandoc.Lua.StackInstances ()
49import Text.Pandoc.Lua.Util (addField, dofileWithTraceback)
48import Text.Pandoc.Lua.Util (addField, dofileWithTraceback)
50import Text.Pandoc.Options
49import Text.Pandoc.Options
51import Text.Pandoc.Templates
50import Text.Pandoc.Templates