git.iko.soy/typeable/pandoc
on master help sign in
Lua modules: make a Haskell module for each Lua module

Definitions for the `pandoc.mediabag` modules are moved to a separate Haskell module. Change: minor

commit5ad719c1fb6dbf06cbf4f48e57ae4a6d187e0a5e authorAlbert Krewinkel <albert@zeitkraut.de> dateThu 21 Dec 2017, 22:17 (9 years ago) parentab3c506
4 files changed+113−74
pandoc.cabal+1 src/Text/Pandoc/Lua/Module/MediaBag.hs+108 src/Text/Pandoc/Lua/Module/Pandoc.hs+2−72 src/Text/Pandoc/Lua/Packages.hs+2−2
pandoc.cabal+1
@@ -523,6 +523,7 @@ library
523523 Text.Pandoc.Readers.Org.Shared,
524524 Text.Pandoc.Lua.Filter,
525525 Text.Pandoc.Lua.Init,
526+ Text.Pandoc.Lua.Module.MediaBag,
526527 Text.Pandoc.Lua.Module.Pandoc,
527528 Text.Pandoc.Lua.Packages,
528529 Text.Pandoc.Lua.StackInstances,
src/Text/Pandoc/Lua/Module/MediaBag.hsnew file+108
@@ -0,0 +1,108 @@
1+{-
2+Copyright © 2017 Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
3+
4+This program is free software; you can redistribute it and/or modify
5+it under the terms of the GNU General Public License as published by
6+the Free Software Foundation; either version 2 of the License, or
7+(at your option) any later version.
8+
9+This program is distributed in the hope that it will be useful,
10+but WITHOUT ANY WARRANTY; without even the implied warranty of
11+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+GNU General Public License for more details.
13+
14+You should have received a copy of the GNU General Public License
15+along with this program; if not, write to the Free Software
16+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17+-}
18+{- |
19+ Module : Text.Pandoc.Lua.Module.MediaBag
20+ Copyright : Copyright © 2017 Albert Krewinkel
21+ License : GNU GPL, version 2 or above
22+
23+ Maintainer : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
24+ Stability : alpha
25+
26+The lua module @pandoc.mediabag@.
27+-}
28+module Text.Pandoc.Lua.Module.MediaBag
29+ ( pushModule
30+ ) where
31+
32+import Control.Monad (zipWithM_)
33+import Data.IORef (IORef, modifyIORef', readIORef)
34+import Data.Maybe (fromMaybe)
35+import Foreign.Lua (Lua, NumResults, liftIO)
36+import Text.Pandoc.Class (CommonState (..), fetchItem, putCommonState,
37+ runIOorExplode, setMediaBag)
38+import Text.Pandoc.Lua.StackInstances ()
39+import Text.Pandoc.Lua.Util (OrNil (toMaybe), addFunction)
40+import Text.Pandoc.MIME (MimeType)
41+
42+import qualified Data.ByteString.Lazy as BL
43+import qualified Foreign.Lua as Lua
44+import qualified Text.Pandoc.MediaBag as MB
45+
46+--
47+-- MediaBag submodule
48+--
49+pushModule :: CommonState -> IORef MB.MediaBag -> Lua NumResults
50+pushModule commonState mediaBagRef = do
51+ Lua.newtable
52+ addFunction "insert" (insertMediaFn mediaBagRef)
53+ addFunction "lookup" (lookupMediaFn mediaBagRef)
54+ addFunction "list" (mediaDirectoryFn mediaBagRef)
55+ addFunction "fetch" (fetch commonState mediaBagRef)
56+ return 1
57+
58+insertMediaFn :: IORef MB.MediaBag
59+ -> FilePath
60+ -> OrNil MimeType
61+ -> BL.ByteString
62+ -> Lua NumResults
63+insertMediaFn mbRef fp nilOrMime contents = do
64+ liftIO . modifyIORef' mbRef $
65+ MB.insertMedia fp (toMaybe nilOrMime) contents
66+ return 0
67+
68+lookupMediaFn :: IORef MB.MediaBag
69+ -> FilePath
70+ -> Lua NumResults
71+lookupMediaFn mbRef fp = do
72+ res <- MB.lookupMedia fp <$> liftIO (readIORef mbRef)
73+ case res of
74+ Nothing -> Lua.pushnil *> return 1
75+ Just (mimeType, contents) -> do
76+ Lua.push mimeType
77+ Lua.push contents
78+ return 2
79+
80+mediaDirectoryFn :: IORef MB.MediaBag
81+ -> Lua NumResults
82+mediaDirectoryFn mbRef = do
83+ dirContents <- MB.mediaDirectory <$> liftIO (readIORef mbRef)
84+ Lua.newtable
85+ zipWithM_ addEntry [1..] dirContents
86+ return 1
87+ where
88+ addEntry :: Int -> (FilePath, MimeType, Int) -> Lua ()
89+ addEntry idx (fp, mimeType, contentLength) = do
90+ Lua.newtable
91+ Lua.push "path" *> Lua.push fp *> Lua.rawset (-3)
92+ Lua.push "type" *> Lua.push mimeType *> Lua.rawset (-3)
93+ Lua.push "length" *> Lua.push contentLength *> Lua.rawset (-3)
94+ Lua.rawseti (-2) idx
95+
96+fetch :: CommonState
97+ -> IORef MB.MediaBag
98+ -> String
99+ -> Lua NumResults
100+fetch commonState mbRef src = do
101+ mediaBag <- liftIO $ readIORef mbRef
102+ (bs, mimeType) <- liftIO . runIOorExplode $ do
103+ putCommonState commonState
104+ setMediaBag mediaBag
105+ fetchItem src
106+ Lua.push $ fromMaybe "" mimeType
107+ Lua.push bs
108+ return 2 -- returns 2 values: contents, mimetype
src/Text/Pandoc/Lua/Module/Pandoc.hs+2−72
@@ -28,26 +28,22 @@ Pandoc module for lua.
2828-}
2929module Text.Pandoc.Lua.Module.Pandoc
3030 ( pushModule
31− , pushMediaBagModule
3231 ) where
3332
34−import Control.Monad (when, zipWithM_)
33+import Control.Monad (when)
3534import Data.Default (Default (..))
3635import Data.Digest.Pure.SHA (sha1, showDigest)
37−import Data.IORef (IORef, modifyIORef', readIORef)
3836import Data.Maybe (fromMaybe)
3937import Data.Text (pack)
4038import Foreign.Lua (ToLuaStack, FromLuaStack, Lua, NumResults, liftIO)
4139import System.Exit (ExitCode (..))
42−import Text.Pandoc.Class (CommonState (..), fetchItem, putCommonState,
43− runIO, runIOorExplode, setMediaBag)
40+import Text.Pandoc.Class (runIO)
4441import Text.Pandoc.Definition (Block, Inline)
4542import Text.Pandoc.Lua.Filter (walkInlines, walkBlocks, LuaFilter)
4643import Text.Pandoc.Lua.StackInstances ()
4744import Text.Pandoc.Lua.Util (OrNil (toMaybe), addFunction, addValue,
4845 loadScriptFromDataDir, raiseError)
4946import Text.Pandoc.Walk (Walkable)
50−import Text.Pandoc.MIME (MimeType)
5147import Text.Pandoc.Options (ReaderOptions (readerExtensions))
5248import Text.Pandoc.Process (pipeProcess)
5349import Text.Pandoc.Readers (Reader (..), getReader)
@@ -55,7 +51,6 @@ import Text.Pandoc.Readers (Reader (..), getReader)
5551import qualified Data.ByteString.Lazy as BL
5652import qualified Data.ByteString.Lazy.Char8 as BSL
5753import qualified Foreign.Lua as Lua
58−import qualified Text.Pandoc.MediaBag as MB
5954
6055-- | Push the "pandoc" on the lua stack. Requires the `list` module to be
6156-- loaded.
@@ -93,18 +88,6 @@ readDoc content formatSpecOrNil = do
9388 Left s -> raiseError (show s) -- error while reading
9489 _ -> raiseError "Only string formats are supported at the moment."
9590
96−--
97−-- MediaBag submodule
98−--
99−pushMediaBagModule :: CommonState -> IORef MB.MediaBag -> Lua NumResults
100−pushMediaBagModule commonState mediaBagRef = do
101− Lua.newtable
102− addFunction "insert" (insertMediaFn mediaBagRef)
103− addFunction "lookup" (lookupMediaFn mediaBagRef)
104− addFunction "list" (mediaDirectoryFn mediaBagRef)
105− addFunction "fetch" (fetch commonState mediaBagRef)
106− return 1
107−
10891sha1HashFn :: BL.ByteString
10992 -> Lua NumResults
11093sha1HashFn contents = do
@@ -158,56 +141,3 @@ instance ToLuaStack PipeError where
158141 , BSL.pack "): "
159142 , if output == mempty then BSL.pack "<no output>" else output
160143 ]
161−-- end: pipe
162−
163−insertMediaFn :: IORef MB.MediaBag
164− -> FilePath
165− -> OrNil MimeType
166− -> BL.ByteString
167− -> Lua NumResults
168−insertMediaFn mbRef fp nilOrMime contents = do
169− liftIO . modifyIORef' mbRef $
170− MB.insertMedia fp (toMaybe nilOrMime) contents
171− return 0
172−
173−lookupMediaFn :: IORef MB.MediaBag
174− -> FilePath
175− -> Lua NumResults
176−lookupMediaFn mbRef fp = do
177− res <- MB.lookupMedia fp <$> liftIO (readIORef mbRef)
178− case res of
179− Nothing -> Lua.pushnil *> return 1
180− Just (mimeType, contents) -> do
181− Lua.push mimeType
182− Lua.push contents
183− return 2
184−
185−mediaDirectoryFn :: IORef MB.MediaBag
186− -> Lua NumResults
187−mediaDirectoryFn mbRef = do
188− dirContents <- MB.mediaDirectory <$> liftIO (readIORef mbRef)
189− Lua.newtable
190− zipWithM_ addEntry [1..] dirContents
191− return 1
192− where
193− addEntry :: Int -> (FilePath, MimeType, Int) -> Lua ()
194− addEntry idx (fp, mimeType, contentLength) = do
195− Lua.newtable
196− Lua.push "path" *> Lua.push fp *> Lua.rawset (-3)
197− Lua.push "type" *> Lua.push mimeType *> Lua.rawset (-3)
198− Lua.push "length" *> Lua.push contentLength *> Lua.rawset (-3)
199− Lua.rawseti (-2) idx
200−
201−fetch :: CommonState
202− -> IORef MB.MediaBag
203− -> String
204− -> Lua NumResults
205−fetch commonState mbRef src = do
206− mediaBag <- liftIO $ readIORef mbRef
207− (bs, mimeType) <- liftIO . runIOorExplode $ do
208− putCommonState commonState
209− setMediaBag mediaBag
210− fetchItem src
211− Lua.push $ fromMaybe "" mimeType
212− Lua.push bs
213− return 2 -- returns 2 values: contents, mimetype
src/Text/Pandoc/Lua/Packages.hs+2−2
@@ -38,11 +38,11 @@ import Data.IORef (IORef)
3838import Foreign.Lua (Lua, NumResults, liftIO)
3939import Text.Pandoc.Class (CommonState, readDataFile, runIO, setUserDataDir)
4040import Text.Pandoc.MediaBag (MediaBag)
41−import Text.Pandoc.Lua.Module.Pandoc (pushMediaBagModule)
4241import Text.Pandoc.Lua.Util (dostring')
4342
4443import qualified Foreign.Lua as Lua
4544import Text.Pandoc.Lua.Module.Pandoc as Pandoc
45+import Text.Pandoc.Lua.Module.MediaBag as MediaBag
4646
4747-- | Parameters used to create lua packages/modules.
4848data LuaPackageParams = LuaPackageParams
@@ -76,7 +76,7 @@ pandocPackageSearcher luaPkgParams pkgName =
7676 in pushWrappedHsFun (Pandoc.pushModule datadir)
7777 "pandoc.mediabag" -> let st = luaPkgCommonState luaPkgParams
7878 mbRef = luaPkgMediaBag luaPkgParams
79− in pushWrappedHsFun (pushMediaBagModule st mbRef)
79+ in pushWrappedHsFun (MediaBag.pushModule st mbRef)
8080 _ -> searchPureLuaLoader
8181 where
8282 pushWrappedHsFun f = do