public inbox archive for pandoc-discuss@googlegroups.com
 help / color / mirror / Atom feed
From: Bastien DUMONT <bastien.dumont-VwIFZPTo/vqsTnJN9+BGXg@public.gmane.org>
To: pandoc-discuss-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
Subject: Re: Lua filter to automatically tag keywords for TeX indexing
Date: Thu,  3 Nov 2022 19:18:20 +0000	[thread overview]
Message-ID: <Y2QT/FV43helVxE0@localhost> (raw)
In-Reply-To: <7f570676-2876-4e29-a8c0-9a765617f141n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>

Iterating over all possible values at every string can be expensive. You can speed up the process by rewriting Includes like this:

```
local bool_tables = {}

function Includes(tab, val)
  -- strip trailing punctuation before matching
  local bare = string.gsub(val,"[%.|,|;|:]", "")
  -- The first time a given value of tab is tested in Includes,
  -- a table is added in bool_tables which contains
  -- a boolean key-value entry for each element in tab.
  if not bool_tables[tab] then
    bool_tables[tab] = {}
    for _, elem in ipairs(tab) do
      bool_tables[tab][elem] = true
    end
  end
  -- So we only have to test once for the key-value entry
  -- instead of iterating over all elements in tab
  -- every time Inclues is called.
  return bool_tables[tab][val]
end
```


Le Wednesday 02 November 2022 à 06:20:37PM, bapt a a écrit :
> 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)
> 
> - 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)
> 
> Best regards,
> 
> baptiste
> 
> Lua filter:
> -----
> 
> local text = require 'text'
> local pandoc = require 'pandoc'
> 
> -- keywords to look for in the document
> local langs = {"Matlab", "R", "Julia", "C++"}
> 
> function Includes(tab, val)
> -- strip trailing punctuation before matching
> local bare = string.gsub(val,"[%.|,|;|:]", "")
> 
> for index, value in ipairs(tab) do
> if value == bare then
> return true
> end
> end
> 
> return false
> end
> 
> function Replace_langname(elem)
> if Includes(langs, elem.text) then
> return pandoc.SmallCaps(text.lower(elem.text))
> else
> return elem
> end
> end
> 
> return {{Str = Replace_langname}}
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> --
> 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 [1]pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
> To view this discussion on the web visit [2]https://groups.google.com/d/msgid/
> pandoc-discuss/7f570676-2876-4e29-a8c0-9a765617f141n%40googlegroups.com.
> 
> References:
> 
> [1] mailto:pandoc-discuss+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
> [2] https://groups.google.com/d/msgid/pandoc-discuss/7f570676-2876-4e29-a8c0-9a765617f141n%40googlegroups.com?utm_medium=email&utm_source=footer

-- 
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/Y2QT/FV43helVxE0%40localhost.


  parent reply	other threads:[~2022-11-03 19:18 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-03  1:20 bapt a
     [not found] ` <7f570676-2876-4e29-a8c0-9a765617f141n-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org>
2022-11-03 19:18   ` Bastien DUMONT [this message]
2022-11-03 19:39   ` John MacFarlane
     [not found]     ` <ECDE1635-3DD4-4E57-8D66-E546B4742622-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2022-11-04 21:26       ` bapt a

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Y2QT/FV43helVxE0@localhost \
    --to=bastien.dumont-vwifzpto/vqstnjn9+bgxg@public.gmane.org \
    --cc=pandoc-discuss-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).