Thank you both for the helpful replies; I don't fully understand how these boolean tables are used in Lua (clearly it works, I just don't fully get it), but it seems to be an important concept so I'll read up on it. Thanks, baptiste On Friday, 4 November 2022 at 08:39:29 UTC+13 fiddlosopher wrote: > > > > On Nov 2, 2022, at 6:20 PM, bapt a wrote: > > > > Hi all, > > > > I've started writing a technical book using Quarto markdown, which uses > pandoc with Lua filters under the hood to produce a website as well as the > publisher's pdf format (via LaTeX). > > I quite like to keep the source document as plain as possible, and I'm > wondering if I could avoid the use of [concept]{.index}, which gets turned > into \index{concept}, and instead write a Lua filter with my custom list of > keywords, and have pandoc automatically match them as they appear in the > text. > > As a proof of principle I wrote the following code (see below), which > matches specific keywords, and reformats them as small-caps. I quickly > realised that trailing punctuation, such as "concept, ..." will fail to > match, so I'm using gsub to strip such punctuation before matching. It > works, but I'm a bit worried: > > > > - what's the overhead of such a filter, in practice? From what I > understand, every single string element in the AST will be processed by > gsub then tested for a match. Are Lua filters walking down the AST fast > enough that I shouldn't worry about it? (as far as I can tell on small > examples, it seems fine) > > The AST walking is very fast. See the benchmarks at the beginning of > https://pandoc.org/lua-filters.html for one example. > > > - assuming this idea is reasonable, I might want to do a few similar > operations, e.g. reformatting program languages (as in this example code), > wrapping keywords in \index{}, etc., and the exact format will often depend > on the output target (html vs TeX etc.). Is there a better construct for > this than successive if/else statements to look for matches? (I don't know > much Lua) > > In lua you can do > > string.gusb(val, [“(%l*)”], function (word) > if indexable[word] then > .. whatever .. > end > end) > > This will run the function on every group of letters in the matched string. > Here I’m assuming you have a lua table indexable that maps words to true, > e.g. > > { cow: true, horse: true } > > That will be much faster than iterating through an array as you’re doing > here. > > -- You received this message because you are subscribed to the Google Groups "pandoc-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To view this discussion on the web visit https://groups.google.com/d/msgid/pandoc-discuss/23ccfb2a-c458-49e1-a275-dad452f5d2e3n%40googlegroups.com.