On 9/19/2014 9:30 AM, Christoph Reller wrote:
Hi,
\installcommandhandler nicely provides (among others) \define<name> and \setup<name> commands. Thus it is easy to provide a key with \setup<name>[key=value] and to read the value of such a key with \<name>parameter{key}.
My question is: How do I read the value of a key defined with \setup...[key=value] on the lua side? If I use context.<name>parameter("key") then the value of key is printed directly. I want to be able to read that value and use it in lua with something like myvariable = context.?whatfunction?("key")
Here is some example code:
\unprotect
\startluacode function myfun(parameters,content) context("From lua: Parameters: ") context(parameters) context.elemparameter("gkey") -- directly prints the parameter context.par() end \stopluacode
\installnamespace{elem} \installcommandhandler \????elem {elem} \????elem \appendtoks \setuevalue{\currentelem}{\elem_cmd{\currentelem}}% \to \everydefineelem
\unexpanded\def\elem_cmd#environment{% \edef\currentelem{#environment}% \dosingleempty\elem_cmd_parameters}
\def\elem_cmd_parameters[#parameters]#content{% \setupcurrentelem[#parameters] From \TeX\: Parameters: key=\elemparameter{key}, gkey=\elemparameter{gkey}\par
\ctxlua{myfun(\!!bs#parameters\!!es,\!!bs\normalunexpanded{#content}\!!es)}
}
\defineelem[base] \setupelem[gkey=gval]
\protect
\starttext
\base[key=val]{Hello}
\stoptext
Thank you for any feedback,
On Fri, Sep 19, 2014 at 12:00 PM, Hans Hagen wrote:
something like this ... keep in mind that there is no grouping in lua
% macros=mkvi
\unprotect
\installnamespace{elem}
\installcommandhandler \????elem {elem} \????elem
\startluacode userdata.elem = { data = { [""] = { } } }
function userdata.elem.define(namespace,parent) print("define",namespace,parent) userdata.elem.data[namespace] = { } if namespace ~= parent then
table.setmetatableindex(userdata.elem.data[namespace],userdata.elem.data[parent])
end end
function userdata.elem.setup(namespace,key,gkey) print("setup",namespace,key,gkey) userdata.elem.data[namespace].key = key userdata.elem.data[namespace].gkey = gkey end
function userdata.myfun(namespace,one,two) context.par() context("elem: one=%s",userdata.elem.data[namespace][one]) context.par() context("elem: two=%s",userdata.elem.data[namespace][two]) context.par() end \stopluacode
\appendtoks \setuevalue{\currentelem}{\elem_cmd{\currentelem}}% \ctxlua{userdata.elem.define("\currentelem","\currentelemparent")}% \to \everydefineelem
\appendtoks
\ctxlua{userdata.elem.setup("\currentelem","\elemparameter{key}","\elemparameter{gkey}")}%
\to \everysetupelem
\unexpanded\def\elem_cmd#environment% {\edef\currentelem{#environment}% \dosingleempty\elem_cmd_parameters}
\def\elem_cmd_parameters[#parameters]#content% {\setupelem[\currentelem][#parameters] From \TeX\: Parameters: key=\elemparameter{key}, gkey=\elemparameter{gkey}\par \ctxlua{userdata.myfun("\currentelem","key","gkey")}}
\defineelem[base] \setupelem[gkey=gval]
\protect
\starttext
\base[key=val]{Hello}
\stoptext
A simpler alternative is:
% macros=mkvi
\unprotect
\installnamespace{elem}
\installcommandhandler \????elem {elem} \????elem
\startluacode userdata.elem = { data = { } }
function userdata.elem.sync(key,gkey) userdata.elem.data.key = key userdata.elem.data.gkey = gkey end
function userdata.myfun(one,two) context.par() context("elem: one=%s",userdata.elem.data[one]) context.par() context("elem: two=%s",userdata.elem.data[two]) context.par() end \stopluacode
\appendtoks \setuevalue{\currentelem}{\elem_cmd{\currentelem}}% \to \everydefineelem
\unexpanded\def\elem_cmd#environment% {\edef\currentelem{#environment}% \dosingleempty\elem_cmd_parameters}
\unexpanded\def\elem_sync
{\ctxlua{userdata.elem.sync("\elemparameter{key}","\elemparameter{gkey}")}}
\def\elem_cmd_parameters[#parameters]#content% {\setupcurrentelem[#parameters] \elem_sync From \TeX\: Parameters: key=\elemparameter{key}, gkey=\elemparameter{gkey}\par \ctxlua{userdata.myfun("key","gkey")}}
\defineelem[base] \setupelem[gkey=gval]
\protect
\starttext
\base[key=val]{Hello}
\stoptext
Thank you Hans! Two general questions arise (if your permit): 1. Where are the key-value pairs stored? In your first solution you handle the key setting by explicitly calling lua on every \setup<name> call. It seems that all key-value pairs (that are set with \installcommandhandler-generated \setup<name>) are stored on the TeX side and not on the lua side. Is this correct? 2. Calling \ctxlua from lua. I was tempted to add another level of indirection to your second (the "synchronize") solution. I.e: in the lua code (in a separate lua file to avoid the do ... end introduced by \startluacode ... \stopluacode) I have: n = "" v = "" function getkey(name,value) n = name v = value end function myfun(parameters,content) context([[\ctxlua{getkey("gkey","\elemparameter{gkey}")}]]) context(" name=") context(n) context(", value=") context(v) end The above does not work because the value obtained "lags behind", i.e. initially v will be "", on the second call v will have the value of the first \setupelem[gkey=gval], and so on. I guess this lag is due to the way TeX and lua communicate to each other? A small question: What do you mean by "there is no grouping in lua"? Thank you anyway for your valuable input. Regards, Christoph