From 4cf6ddb027cdc262e34dea50ec77f3fcdbc517d2 Mon Sep 17 00:00:00 2001 From: Albert Krewinkel Date: Tue, 1 Oct 2024 12:08:00 +0200 Subject: Lua: allow returning a single filter from filter files It is now possible to return a single filter from a filter file, e.g. ``` lua -- Switch single- and double quotes return { Quoted = function (q) elem.quotetype = elem.quotetype == 'SingleQuote' and 'DoubleQuote' or 'SingleQuote' return elem end } The filter must not contain numerical indexes, or it might be treated as a list of filters. --- doc/lua-filters.md | 10 ++++------ pandoc-lua-engine/src/Text/Pandoc/Lua/Filter.hs | 5 ++++- pandoc-lua-engine/test/lua/single-to-double-quoted.lua | 2 -- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/doc/lua-filters.md b/doc/lua-filters.md index 8b8dbfc47..0ac8a22f0 100644 --- a/doc/lua-filters.md +++ b/doc/lua-filters.md @@ -40,11 +40,9 @@ to small caps: ``` lua return { - { - Strong = function (elem) - return pandoc.SmallCaps(elem.content) - end, - } + Strong = function (elem) + return pandoc.SmallCaps(elem.content) + end, } ``` @@ -187,7 +185,7 @@ local filter = { traverse = 'topdown', -- ... filter functions ... } -return {filter} +return filter ``` Support for this was added in pandoc 2.17; previous versions diff --git a/pandoc-lua-engine/src/Text/Pandoc/Lua/Filter.hs b/pandoc-lua-engine/src/Text/Pandoc/Lua/Filter.hs index 4728f961e..40ccb2f8f 100644 --- a/pandoc-lua-engine/src/Text/Pandoc/Lua/Filter.hs +++ b/pandoc-lua-engine/src/Text/Pandoc/Lua/Filter.hs @@ -43,7 +43,10 @@ runFilterFile' envIdx filterPath doc = do -- filter if nothing was returned. luaFilters <- forcePeek $ if newtop - oldtop >= 1 - then peekList peekFilter top -- get from explicit filter table + then liftLua (rawlen top) >>= \case + -- explicitly returned filter, either a single one or a list + 0 -> (:[]) <$!> peekFilter top -- single filter + _ -> peekList peekFilter top -- list of explicit filters else (:[]) <$!> peekFilter envIdx -- get the implicit filter in _ENV settop oldtop runAll luaFilters doc diff --git a/pandoc-lua-engine/test/lua/single-to-double-quoted.lua b/pandoc-lua-engine/test/lua/single-to-double-quoted.lua index b985b215c..29843df06 100644 --- a/pandoc-lua-engine/test/lua/single-to-double-quoted.lua +++ b/pandoc-lua-engine/test/lua/single-to-double-quoted.lua @@ -1,10 +1,8 @@ return { - { Quoted = function (elem) if elem.quotetype == "SingleQuote" then elem.quotetype = "DoubleQuote" end return elem end, - } } -- cgit v1.2.3