109 lines
3.5 KiB
Haskell
109 lines
3.5 KiB
Haskell
{-
|
|
Copyright © 2017 Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
-}
|
|
{- |
|
|
Module : Text.Pandoc.Lua.Module.MediaBag
|
|
Copyright : Copyright © 2017 Albert Krewinkel
|
|
License : GNU GPL, version 2 or above
|
|
|
|
Maintainer : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
|
|
Stability : alpha
|
|
|
|
The lua module @pandoc.mediabag@.
|
|
-}
|
|
module Text.Pandoc.Lua.Module.MediaBag
|
|
( pushModule
|
|
) where
|
|
|
|
import Control.Monad (zipWithM_)
|
|
import Data.IORef (IORef, modifyIORef', readIORef)
|
|
import Data.Maybe (fromMaybe)
|
|
import Foreign.Lua (Lua, NumResults, Optional, liftIO)
|
|
import Text.Pandoc.Class (CommonState (..), fetchItem, putCommonState,
|
|
runIOorExplode, setMediaBag)
|
|
import Text.Pandoc.Lua.StackInstances ()
|
|
import Text.Pandoc.Lua.Util (addFunction)
|
|
import Text.Pandoc.MIME (MimeType)
|
|
|
|
import qualified Data.ByteString.Lazy as BL
|
|
import qualified Foreign.Lua as Lua
|
|
import qualified Text.Pandoc.MediaBag as MB
|
|
|
|
--
|
|
-- MediaBag submodule
|
|
--
|
|
pushModule :: CommonState -> IORef MB.MediaBag -> Lua NumResults
|
|
pushModule commonState mediaBagRef = do
|
|
Lua.newtable
|
|
addFunction "insert" (insertMediaFn mediaBagRef)
|
|
addFunction "lookup" (lookupMediaFn mediaBagRef)
|
|
addFunction "list" (mediaDirectoryFn mediaBagRef)
|
|
addFunction "fetch" (fetch commonState mediaBagRef)
|
|
return 1
|
|
|
|
insertMediaFn :: IORef MB.MediaBag
|
|
-> FilePath
|
|
-> Optional MimeType
|
|
-> BL.ByteString
|
|
-> Lua NumResults
|
|
insertMediaFn mbRef fp optionalMime contents = do
|
|
liftIO . modifyIORef' mbRef $
|
|
MB.insertMedia fp (Lua.fromOptional optionalMime) contents
|
|
return 0
|
|
|
|
lookupMediaFn :: IORef MB.MediaBag
|
|
-> FilePath
|
|
-> Lua NumResults
|
|
lookupMediaFn mbRef fp = do
|
|
res <- MB.lookupMedia fp <$> liftIO (readIORef mbRef)
|
|
case res of
|
|
Nothing -> Lua.pushnil *> return 1
|
|
Just (mimeType, contents) -> do
|
|
Lua.push mimeType
|
|
Lua.push contents
|
|
return 2
|
|
|
|
mediaDirectoryFn :: IORef MB.MediaBag
|
|
-> Lua NumResults
|
|
mediaDirectoryFn mbRef = do
|
|
dirContents <- MB.mediaDirectory <$> liftIO (readIORef mbRef)
|
|
Lua.newtable
|
|
zipWithM_ addEntry [1..] dirContents
|
|
return 1
|
|
where
|
|
addEntry :: Int -> (FilePath, MimeType, Int) -> Lua ()
|
|
addEntry idx (fp, mimeType, contentLength) = do
|
|
Lua.newtable
|
|
Lua.push "path" *> Lua.push fp *> Lua.rawset (-3)
|
|
Lua.push "type" *> Lua.push mimeType *> Lua.rawset (-3)
|
|
Lua.push "length" *> Lua.push contentLength *> Lua.rawset (-3)
|
|
Lua.rawseti (-2) idx
|
|
|
|
fetch :: CommonState
|
|
-> IORef MB.MediaBag
|
|
-> String
|
|
-> Lua NumResults
|
|
fetch commonState mbRef src = do
|
|
mediaBag <- liftIO $ readIORef mbRef
|
|
(bs, mimeType) <- liftIO . runIOorExplode $ do
|
|
putCommonState commonState
|
|
setMediaBag mediaBag
|
|
fetchItem src
|
|
Lua.push $ fromMaybe "" mimeType
|
|
Lua.push bs
|
|
return 2 -- returns 2 values: contents, mimetype
|