git.iko.soy/typeable/pandoc
on master help sign in
Lua filters: make PANDOC_READER_OPTIONS available
5b852f8Albert Krewinkel
src/Text/Pandoc/App.hs+2−2
@@ -855,12 +855,12 @@ applyFilter :: ReaderOptions
855 -> Filter
855 -> Filter
856 -> Pandoc
856 -> Pandoc
857 -> PandocIO Pandoc
857 -> PandocIO Pandoc
858−applyFilter _ropts args (LuaFilter f) d = do
858+applyFilter ropts args (LuaFilter f) d = do
859 f' <- expandFilterPath f
859 f' <- expandFilterPath f
860 let format = case args of
860 let format = case args of
861 (x:_) -> x
861 (x:_) -> x
862 _ -> error "Format not supplied for lua filter"
862 _ -> error "Format not supplied for lua filter"
863− res <- runLuaFilter f' format d
863+ res <- runLuaFilter ropts f' format d
864 case res of
864 case res of
865 Right x -> return x
865 Right x -> return x
866 Left (LuaException s) -> E.throw (PandocFilterError f s)
866 Left (LuaException s) -> E.throw (PandocFilterError f s)
src/Text/Pandoc/Lua.hs+11−6
@@ -39,21 +39,22 @@ import Text.Pandoc.Definition (Pandoc)
39import Text.Pandoc.Lua.Filter (LuaFilter, walkMWithLuaFilter)
39import Text.Pandoc.Lua.Filter (LuaFilter, walkMWithLuaFilter)
40import Text.Pandoc.Lua.Init (runPandocLua)
40import Text.Pandoc.Lua.Init (runPandocLua)
41import Text.Pandoc.Lua.Util (popValue)
41import Text.Pandoc.Lua.Util (popValue)
42+import Text.Pandoc.Options (ReaderOptions)
42import qualified Foreign.Lua as Lua
43import qualified Foreign.Lua as Lua
43
44
44-- | Run the Lua filter in @filterPath@ for a transformation to target
45-- | Run the Lua filter in @filterPath@ for a transformation to target
45-- format @format@. Pandoc uses Lua init files to setup the Lua
46-- format @format@. Pandoc uses Lua init files to setup the Lua
46-- interpreter.
47-- interpreter.
47−runLuaFilter :: FilePath -> String
48+runLuaFilter :: ReaderOptions -> FilePath -> String
48 -> Pandoc -> PandocIO (Either LuaException Pandoc)
49 -> Pandoc -> PandocIO (Either LuaException Pandoc)
49−runLuaFilter filterPath format doc =
50+runLuaFilter ropts filterPath format doc =
50− runPandocLua (runLuaFilter' filterPath format doc)
51+ runPandocLua (runLuaFilter' ropts filterPath format doc)
51
52
52−runLuaFilter' :: FilePath -> String
53+runLuaFilter' :: ReaderOptions -> FilePath -> String
53 -> Pandoc -> Lua Pandoc
54 -> Pandoc -> Lua Pandoc
54−runLuaFilter' filterPath format pd = do
55+runLuaFilter' ropts filterPath format pd = do
55− -- store module in global "pandoc"
56 registerFormat
56 registerFormat
57+ registerReaderOptions
57 top <- Lua.gettop
58 top <- Lua.gettop
58 stat <- Lua.dofile filterPath
59 stat <- Lua.dofile filterPath
59 if stat /= OK
60 if stat /= OK
@@ -73,5 +74,9 @@ runLuaFilter' filterPath format pd = do
73 push format
74 push format
74 Lua.setglobal "FORMAT"
75 Lua.setglobal "FORMAT"
75
76
77+ registerReaderOptions = do
78+ push ropts
79+ Lua.setglobal "PANDOC_READER_OPTIONS"
80+
76runAll :: [LuaFilter] -> Pandoc -> Lua Pandoc
81runAll :: [LuaFilter] -> Pandoc -> Lua Pandoc
77runAll = foldr ((>=>) . walkMWithLuaFilter) return
82runAll = foldr ((>=>) . walkMWithLuaFilter) return
src/Text/Pandoc/Lua/StackInstances.hs+48−2
@@ -16,8 +16,9 @@ You should have received a copy of the GNU General Public License
16along with this program; if not, write to the Free Software
16along with this program; if not, write to the Free Software
17Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18-}
18-}
19−{-# LANGUAGE FlexibleInstances #-}
19+{-# LANGUAGE FlexibleInstances #-}
20−{-# LANGUAGE LambdaCase #-}
20+{-# LANGUAGE LambdaCase #-}
21+{-# LANGUAGE ScopedTypeVariables #-}
21{-# OPTIONS_GHC -fno-warn-orphans #-}
22{-# OPTIONS_GHC -fno-warn-orphans #-}
22{- |
23{- |
23 Module : Text.Pandoc.Lua.StackInstances
24 Module : Text.Pandoc.Lua.StackInstances
@@ -34,13 +35,18 @@ module Text.Pandoc.Lua.StackInstances () where
34
35
35import Control.Applicative ((<|>))
36import Control.Applicative ((<|>))
36import Control.Monad (when)
37import Control.Monad (when)
38+import Data.Data (showConstr, toConstr)
39+import Data.Foldable (forM_)
37import Foreign.Lua (FromLuaStack (peek), Lua, LuaInteger, LuaNumber, StackIndex,
40import Foreign.Lua (FromLuaStack (peek), Lua, LuaInteger, LuaNumber, StackIndex,
38 ToLuaStack (push), Type (..), throwLuaError, tryLua)
41 ToLuaStack (push), Type (..), throwLuaError, tryLua)
39import Text.Pandoc.Definition
42import Text.Pandoc.Definition
43+import Text.Pandoc.Extensions (Extensions)
40import Text.Pandoc.Lua.Util (adjustIndexBy, getTable, pushViaConstructor)
44import Text.Pandoc.Lua.Util (adjustIndexBy, getTable, pushViaConstructor)
45+import Text.Pandoc.Options (ReaderOptions (..), TrackChanges)
41import Text.Pandoc.Shared (Element (Blk, Sec), safeRead)
46import Text.Pandoc.Shared (Element (Blk, Sec), safeRead)
42
47
43import qualified Foreign.Lua as Lua
48import qualified Foreign.Lua as Lua
49+import qualified Data.Set as Set
44import qualified Text.Pandoc.Lua.Util as LuaUtil
50import qualified Text.Pandoc.Lua.Util as LuaUtil
45
51
46instance ToLuaStack Pandoc where
52instance ToLuaStack Pandoc where
@@ -332,3 +338,43 @@ instance ToLuaStack Element where
332 Lua.push "__index"
338 Lua.push "__index"
333 Lua.pushvalue (-2)
339 Lua.pushvalue (-2)
334 Lua.rawset (-3)
340 Lua.rawset (-3)
341+
342+
343+--
344+-- Reader Options
345+--
346+instance ToLuaStack Extensions where
347+ push exts = push (show exts)
348+
349+instance ToLuaStack TrackChanges where
350+ push = push . showConstr . toConstr
351+
352+instance ToLuaStack a => ToLuaStack (Set.Set a) where
353+ push set = do
354+ Lua.newtable
355+ forM_ set (`LuaUtil.addValue` True)
356+
357+instance ToLuaStack ReaderOptions where
358+ push ro = do
359+ let ReaderOptions
360+ (extensions :: Extensions)
361+ (standalone :: Bool)
362+ (columns :: Int)
363+ (tabStop :: Int)
364+ (indentedCodeClasses :: [String])
365+ (abbreviations :: Set.Set String)
366+ (defaultImageExtension :: String)
367+ (trackChanges :: TrackChanges)
368+ (stripComments :: Bool)
369+ = ro
370+ Lua.newtable
371+ LuaUtil.addValue "extensions" extensions
372+ LuaUtil.addValue "standalone" standalone
373+ LuaUtil.addValue "columns" columns
374+ LuaUtil.addValue "tabStop" tabStop
375+ LuaUtil.addValue "indentedCodeClasses" indentedCodeClasses
376+ LuaUtil.addValue "abbreviations" abbreviations
377+ LuaUtil.addValue "defaultImageExtension" defaultImageExtension
378+ LuaUtil.addValue "trackChanges" trackChanges
379+ LuaUtil.addValue "stripComments" stripComments
380+
test/Tests/Lua.hs+2−1
@@ -14,6 +14,7 @@ import Text.Pandoc.Builder (bulletList, divWith, doc, doubleQuoted, emph,
14import Text.Pandoc.Class (runIOorExplode, setUserDataDir)
14import Text.Pandoc.Class (runIOorExplode, setUserDataDir)
15import Text.Pandoc.Definition (Block, Inline, Meta, Pandoc, pandocTypesVersion)
15import Text.Pandoc.Definition (Block, Inline, Meta, Pandoc, pandocTypesVersion)
16import Text.Pandoc.Lua (runLuaFilter, runPandocLua)
16import Text.Pandoc.Lua (runLuaFilter, runPandocLua)
17+import Text.Pandoc.Options (def)
17import Text.Pandoc.Shared (pandocVersion)
18import Text.Pandoc.Shared (pandocVersion)
18
19
19import qualified Foreign.Lua as Lua
20import qualified Foreign.Lua as Lua
@@ -128,7 +129,7 @@ assertFilterConversion :: String -> FilePath -> Pandoc -> Pandoc -> Assertion
128assertFilterConversion msg filterPath docIn docExpected = do
129assertFilterConversion msg filterPath docIn docExpected = do
129 docEither <- runIOorExplode $ do
130 docEither <- runIOorExplode $ do
130 setUserDataDir (Just "../data")
131 setUserDataDir (Just "../data")
131− runLuaFilter ("lua" </> filterPath) [] docIn
132+ runLuaFilter def ("lua" </> filterPath) [] docIn
132 case docEither of
133 case docEither of
133 Left _ -> fail "lua filter failed"
134 Left _ -> fail "lua filter failed"
134 Right docRes -> assertEqual msg docExpected docRes
135 Right docRes -> assertEqual msg docExpected docRes