git.iko.soy/typeable/pandoc
on master help sign in
Lua modules: add function pandoc.utils.run_json_filter

Runs a JSON filter on a Pandoc document.

commit8d5422f36b28bab67b4d13e4a3d2154d0c5024f8 authorAlbert Krewinkel <albert@zeitkraut.de> dateWed 10 Jan 2018, 22:26 (9 years ago) parent5d49cbd
3 files changed+59−4
doc/lua-filters.md+31 src/Text/Pandoc/Lua/Module/Utils.hs+26−3 src/Text/Pandoc/Lua/Packages.hs+2−1
doc/lua-filters.md+31
@@ -1433,6 +1433,37 @@ functions.
14331433 print(table.concat(elements[1].numbering, '.')) -- 0.1
14341434 print(table.concat(elements[2].numbering, '.')) -- 0.2
14351435
1436+[`run_json_filter (doc, filter[, args])`]{#utils-run_json_filter}
1437+
1438+: Filter the given doc by passing it through the a JSON filter.
1439+
1440+ Parameters:
1441+
1442+ `doc`:
1443+ : the Pandoc document to filter
1444+
1445+ `filter`:
1446+ : filter to run
1447+
1448+ `args`:
1449+ : list of arguments passed to the filter. Defaults to
1450+ `{FORMAT}`.
1451+
1452+ Returns:
1453+
1454+ - ([Pandoc](#Pandoc)) Filtered document
1455+
1456+ Usage:
1457+
1458+ -- Assumes `some_blocks` contains blocks for which a
1459+ -- separate literature section is required.
1460+ local sub_doc = pandoc.Pandoc(some_blocks, metadata)
1461+ sub_doc_with_bib = pandoc.utils.run_json_filter(
1462+ sub_doc,
1463+ 'pandoc-citeproc'
1464+ )
1465+ some_blocks = sub_doc.blocks -- some blocks with bib
1466+
14361467[`normalize_date (date_string)`]{#utils-normalize_date}
14371468
14381469: Parse a date and convert (if possible) to "YYYY-MM-DD"
src/Text/Pandoc/Lua/Module/Utils.hs+26−3
@@ -30,22 +30,26 @@ module Text.Pandoc.Lua.Module.Utils
3030 ) where
3131
3232import Control.Applicative ((<|>))
33+import Data.Default (def)
3334import Foreign.Lua (FromLuaStack, Lua, LuaInteger, NumResults)
35+import Text.Pandoc.Class (runIO, setUserDataDir)
3436import Text.Pandoc.Definition (Pandoc, Meta, MetaValue, Block, Inline)
3537import Text.Pandoc.Lua.StackInstances ()
36−import Text.Pandoc.Lua.Util (addFunction)
38+import Text.Pandoc.Lua.Util (addFunction, popValue)
3739
3840import qualified Data.Digest.Pure.SHA as SHA
3941import qualified Data.ByteString.Lazy as BSL
4042import qualified Foreign.Lua as Lua
43+import qualified Text.Pandoc.Filter.Json as JsonFilter
4144import qualified Text.Pandoc.Shared as Shared
4245
4346-- | Push the "pandoc.utils" module to the lua stack.
44−pushModule :: Lua NumResults
45−pushModule = do
47+pushModule :: Maybe FilePath -> Lua NumResults
48+pushModule mbDatadir = do
4649 Lua.newtable
4750 addFunction "hierarchicalize" hierarchicalize
4851 addFunction "normalize_date" normalizeDate
52+ addFunction "run_json_filter" (runJsonFilter mbDatadir)
4953 addFunction "sha1" sha1
5054 addFunction "stringify" stringify
5155 addFunction "to_roman_numeral" toRomanNumeral
@@ -62,6 +66,25 @@ hierarchicalize = return . Shared.hierarchicalize
6266normalizeDate :: String -> Lua (Lua.Optional String)
6367normalizeDate = return . Lua.Optional . Shared.normalizeDate
6468
69+-- | Run a JSON filter on the given document.
70+runJsonFilter :: Maybe FilePath
71+ -> Pandoc
72+ -> FilePath
73+ -> Lua.Optional [String]
74+ -> Lua NumResults
75+runJsonFilter mbDatadir doc filterFile optArgs = do
76+ args <- case Lua.fromOptional optArgs of
77+ Just x -> return x
78+ Nothing -> do
79+ Lua.getglobal "FORMAT"
80+ (:[]) <$> popValue
81+ filterRes <- Lua.liftIO . runIO $ do
82+ setUserDataDir mbDatadir
83+ JsonFilter.apply def args filterFile doc
84+ case filterRes of
85+ Left err -> Lua.raiseError (show err)
86+ Right d -> (1 :: NumResults) <$ Lua.push d
87+
6588-- | Calculate the hash of the given contents.
6689sha1 :: BSL.ByteString
6790 -> Lua String
src/Text/Pandoc/Lua/Packages.hs+2−1
@@ -78,7 +78,8 @@ pandocPackageSearcher luaPkgParams pkgName =
7878 "pandoc.mediabag" -> let st = luaPkgCommonState luaPkgParams
7979 mbRef = luaPkgMediaBag luaPkgParams
8080 in pushWrappedHsFun (MediaBag.pushModule st mbRef)
81− "pandoc.utils" -> pushWrappedHsFun Utils.pushModule
81+ "pandoc.utils" -> let datadirMb = luaPkgDataDir luaPkgParams
82+ in pushWrappedHsFun (Utils.pushModule datadirMb)
8283 _ -> searchPureLuaLoader
8384 where
8485 pushWrappedHsFun f = do