[NTG-context] Get list of all buffer names from lua

Stanislav Sokolenko stanislav at sokolenko.net
Tue Jan 8 02:29:03 CET 2019


On 2019-01-07 9:06 p.m., Henri Menke wrote:

> On 8/01/19 1:37 PM, Stanislav Sokolenko wrote:
>> Dear list,
>>
>> As the subject line states, I am looking for a means of retrieving a
>> table of all saved buffer names from lua. A MNWE would looks like:
> It's not so easy because ConTeXt stores the buffers in a local variable
> `cache` which is an upvalue for all the other functions.  However, you
> can use the Lua `debug` library to access upvalues.  I access the first
> upvalue of `buffers.erase`, because it only has a single upvalue which
> is `cache`.  Then I can easily extract all the names from that.  You
> can't get them in the order of declaration because `cache` is a hashmap
> and not an array.  Moreover, ConTeXt is usually in sandboxing mode.  To
> get access to the `debug` library you have to run ConTeXt with
>
>      context --debug test.tex
>
> MWE:
>
> \starttext
> \startbuffer[ex1]
> Buffer 1
> \stopbuffer
> \startbuffer[ex2]
> Buffer 2
> \stopbuffer
> % Should return {ex1, ex2} or similar
> \startluacode
> local _, cache = debug.getupvalue(buffers.erase,1)
> local names = {}
> for name,_ in pairs(cache) do
>      names[#names+1] = name
> end
> context(table.concat(names,", "))
> \stopluacode
> \stoptext

That's perfect, thank you! I did see the cache variable in buff-ini.lua 
but didn't realize it was being used as an upvalue in a closure. Is 
there a specific reason for using the --debug flag rather than just 
loading the debug module directly in the code? The following seems to 
work without the --debug flag but I want to make sure I'm not causing 
some sort of side effect.

\starttext
\startbuffer[ex1]
Buffer 1
\stopbuffer
\startbuffer[ex2]
Buffer 2
\stopbuffer
% Should return {ex1, ex2} or similar
\startluacode
local debug = require('debug')
local _, cache = debug.getupvalue(buffers.erase,1)
local names = {}
for name,_ in pairs(cache) do
     names[#names+1] = name
end
context(table.concat(names,", "))
\stopluacode
\stoptext

>
>> \starttext
>> \startbuffer[ex1]
>> Buffer 1
>> \stopbuffer
>> \startbuffer[ex2]
>> Buffer 2
>> \stopbuffer
>> % Should return {ex1, ex2} or similar
>> \ctxlua{context(...)}
>> \stoptext
>>
>> The underlying idea is to store a large number of example problems in
>> individual buffers that could be retrieved either by specific name or as
>> a complete list. I'm having a problem with the latter as it seems like
>> all the lua buffer commands I've encountered assume that buffer names
>> are known in advance:
>>
>> buffers.getcontent(b)
>> buffers.raw(b)
>> buffers.getlines(b)
>> buffers.erase(b)
>> buffers.assign(b, text, catcodes)
>> buffers.append(b, text)
>> buffers.exists(b)
>> buffers.collectcontent(names, seperator)
>>
>> Thanks,
>>
>> Stan
>>
>>
>>
>> ___________________________________________________________________________________
>>
>> If your question is of interest to others as well, please add an entry
>> to the Wiki!
>>
>> maillist : ntg-context at ntg.nl /
>> http://www.ntg.nl/mailman/listinfo/ntg-context
>> webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
>> archive  : https://bitbucket.org/phg/context-mirror/commits/
>> wiki     : http://contextgarden.net
>> ___________________________________________________________________________________
> ___________________________________________________________________________________
> If your question is of interest to others as well, please add an entry to the Wiki!
>
> maillist : ntg-context at ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
> webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
> archive  : https://bitbucket.org/phg/context-mirror/commits/
> wiki     : http://contextgarden.net
> ___________________________________________________________________________________


More information about the ntg-context mailing list