git.iko.soy/typeable/pandoc
on master help sign in
Lua modules: add function pandoc.utils.run_json_filter
8d5422fAlbert Krewinkel
doc/lua-filters.md+31
@@ -1433,6 +1433,37 @@ functions.
1433 print(table.concat(elements[1].numbering, '.')) -- 0.1
1433 print(table.concat(elements[1].numbering, '.')) -- 0.1
1434 print(table.concat(elements[2].numbering, '.')) -- 0.2
1434 print(table.concat(elements[2].numbering, '.')) -- 0.2
1435
1435
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+
1436[`normalize_date (date_string)`]{#utils-normalize_date}
1467[`normalize_date (date_string)`]{#utils-normalize_date}
1437
1468
1438: Parse a date and convert (if possible) to "YYYY-MM-DD"
1469: 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
30 ) where
30 ) where
31
31
32import Control.Applicative ((<|>))
32import Control.Applicative ((<|>))
33+import Data.Default (def)
33import Foreign.Lua (FromLuaStack, Lua, LuaInteger, NumResults)
34import Foreign.Lua (FromLuaStack, Lua, LuaInteger, NumResults)
35+import Text.Pandoc.Class (runIO, setUserDataDir)
34import Text.Pandoc.Definition (Pandoc, Meta, MetaValue, Block, Inline)
36import Text.Pandoc.Definition (Pandoc, Meta, MetaValue, Block, Inline)
35import Text.Pandoc.Lua.StackInstances ()
37import Text.Pandoc.Lua.StackInstances ()
36−import Text.Pandoc.Lua.Util (addFunction)
38+import Text.Pandoc.Lua.Util (addFunction, popValue)
37
39
38import qualified Data.Digest.Pure.SHA as SHA
40import qualified Data.Digest.Pure.SHA as SHA
39import qualified Data.ByteString.Lazy as BSL
41import qualified Data.ByteString.Lazy as BSL
40import qualified Foreign.Lua as Lua
42import qualified Foreign.Lua as Lua
43+import qualified Text.Pandoc.Filter.Json as JsonFilter
41import qualified Text.Pandoc.Shared as Shared
44import qualified Text.Pandoc.Shared as Shared
42
45
43-- | Push the "pandoc.utils" module to the lua stack.
46-- | Push the "pandoc.utils" module to the lua stack.
44−pushModule :: Lua NumResults
47+pushModule :: Maybe FilePath -> Lua NumResults
45−pushModule = do
48+pushModule mbDatadir = do
46 Lua.newtable
49 Lua.newtable
47 addFunction "hierarchicalize" hierarchicalize
50 addFunction "hierarchicalize" hierarchicalize
48 addFunction "normalize_date" normalizeDate
51 addFunction "normalize_date" normalizeDate
52+ addFunction "run_json_filter" (runJsonFilter mbDatadir)
49 addFunction "sha1" sha1
53 addFunction "sha1" sha1
50 addFunction "stringify" stringify
54 addFunction "stringify" stringify
51 addFunction "to_roman_numeral" toRomanNumeral
55 addFunction "to_roman_numeral" toRomanNumeral
@@ -62,6 +66,25 @@ hierarchicalize = return . Shared.hierarchicalize
62normalizeDate :: String -> Lua (Lua.Optional String)
66normalizeDate :: String -> Lua (Lua.Optional String)
63normalizeDate = return . Lua.Optional . Shared.normalizeDate
67normalizeDate = return . Lua.Optional . Shared.normalizeDate
64
68
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+
65-- | Calculate the hash of the given contents.
88-- | Calculate the hash of the given contents.
66sha1 :: BSL.ByteString
89sha1 :: BSL.ByteString
67 -> Lua String
90 -> Lua String
src/Text/Pandoc/Lua/Packages.hs+2−1
@@ -78,7 +78,8 @@ pandocPackageSearcher luaPkgParams pkgName =
78 "pandoc.mediabag" -> let st = luaPkgCommonState luaPkgParams
78 "pandoc.mediabag" -> let st = luaPkgCommonState luaPkgParams
79 mbRef = luaPkgMediaBag luaPkgParams
79 mbRef = luaPkgMediaBag luaPkgParams
80 in pushWrappedHsFun (MediaBag.pushModule st mbRef)
80 in pushWrappedHsFun (MediaBag.pushModule st mbRef)
81+ "pandoc.utils" -> let datadirMb = luaPkgDataDir luaPkgParams
81− "pandoc.utils" -> pushWrappedHsFun Utils.pushModule
82+ in pushWrappedHsFun (Utils.pushModule datadirMb)
82 _ -> searchPureLuaLoader
83 _ -> searchPureLuaLoader
83 where
84 where
84 pushWrappedHsFun f = do
85 pushWrappedHsFun f = do