diff options
author | Albert Krewinkel <albert@zeitkraut.de> | 2017-12-22 20:08:51 +0100 |
---|---|---|
committer | Albert Krewinkel <albert@zeitkraut.de> | 2017-12-22 20:09:37 +0100 |
commit | 23edb958dbf0210ff82fd0284563c8280ab79bf1 (patch) | |
tree | 6b99135e1a074c58a3d6eba6e823a39c7d49491b /src/Text/Pandoc/Lua | |
parent | 9ddf84072b27553e9ffd578ae40003108f51015a (diff) | |
download | pandoc-23edb958dbf0210ff82fd0284563c8280ab79bf1.tar.gz |
Lua modules: add stringify function to pandoc.utils
The new function `pandoc.utils.stringify` converts any AST element to a
string with formatting removed.
Diffstat (limited to 'src/Text/Pandoc/Lua')
-rw-r--r-- | src/Text/Pandoc/Lua/Module/Utils.hs | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/src/Text/Pandoc/Lua/Module/Utils.hs b/src/Text/Pandoc/Lua/Module/Utils.hs index 496fdbc0a..3a3727355 100644 --- a/src/Text/Pandoc/Lua/Module/Utils.hs +++ b/src/Text/Pandoc/Lua/Module/Utils.hs @@ -29,22 +29,51 @@ module Text.Pandoc.Lua.Module.Utils ( pushModule ) where -import Data.Digest.Pure.SHA (sha1, showDigest) -import Foreign.Lua (Lua, NumResults) +import Control.Applicative ((<|>)) +import Foreign.Lua (FromLuaStack, Lua, NumResults) +import Text.Pandoc.Definition (Pandoc, Meta, Block, Inline) import Text.Pandoc.Lua.StackInstances () import Text.Pandoc.Lua.Util (addFunction) +import qualified Data.Digest.Pure.SHA as SHA import qualified Data.ByteString.Lazy as BSL import qualified Foreign.Lua as Lua +import qualified Text.Pandoc.Shared as Shared -- | Push the "pandoc.utils" module to the lua stack. pushModule :: Lua NumResults pushModule = do Lua.newtable - addFunction "sha1" sha1HashFn + addFunction "sha1" sha1 + addFunction "stringify" stringify return 1 -- | Calculate the hash of the given contents. -sha1HashFn :: BSL.ByteString - -> Lua String -sha1HashFn = return . showDigest . sha1 +sha1 :: BSL.ByteString + -> Lua String +sha1 = return . SHA.showDigest . SHA.sha1 + +stringify :: AstElement -> Lua String +stringify el = return $ case el of + PandocElement pd -> Shared.stringify pd + InlineElement i -> Shared.stringify i + BlockElement b -> Shared.stringify b + MetaElement m -> Shared.stringify m + +data AstElement + = PandocElement Pandoc + | MetaElement Meta + | BlockElement Block + | InlineElement Inline + deriving (Show) + +instance FromLuaStack AstElement where + peek idx = do + res <- Lua.tryLua $ (PandocElement <$> Lua.peek idx) + <|> (InlineElement <$> Lua.peek idx) + <|> (BlockElement <$> Lua.peek idx) + <|> (MetaElement <$> Lua.peek idx) + case res of + Right x -> return x + Left _ -> Lua.throwLuaError + "Expected an AST element, but could not parse value as such." |