Hello, I would like to know what is the recommended way to use attributes in Context. I manage to use use them with numbers, i.e. : in Context : \attribute123=1 in Lua : has_attribute(my_node, 123) But I would like to make that cleaner and use named attributes. What is the Context way to declare and set attributes? Is it something like this? \defineattribute[myattr] \dosetattribute{myattr}{1} And how do I then access them from Lua? Should it look like has_attribute(mynode, attributes.myattr) or has_attribute(mynode, attributes.xxxxx("myattr")) or something else? Goodbye, Stéphane.
On 4/20/2014 3:14 PM, Stéphane Goujet wrote:
Hello,
I would like to know what is the recommended way to use attributes in Context.
I manage to use use them with numbers, i.e. : in Context : \attribute123=1 in Lua : has_attribute(my_node, 123)
But I would like to make that cleaner and use named attributes. What is the Context way to declare and set attributes? Is it something like this? \defineattribute[myattr] \dosetattribute{myattr}{1}
And how do I then access them from Lua? Should it look like has_attribute(mynode, attributes.myattr) or has_attribute(mynode, attributes.xxxxx("myattr")) or something else?
attributes.names[...] attributes.numbers[...] ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | voip: 087 875 68 74 | www.pragma-ade.com | www.pragma-pod.nl -----------------------------------------------------------------
On Tue, 22 Apr 2014, Hans Hagen wrote:
On 4/20/2014 3:14 PM, Stéphane Goujet wrote:
I would like to know what is the recommended way to use attributes in Context. What is the Context way to declare and set attributes? Is it something like this? \defineattribute[myattr] \dosetattribute{myattr}{1}
And how do I then access them from Lua? Should it look like has_attribute(mynode, attributes.myattr) or has_attribute(mynode, attributes.xxxxx("myattr")) or something else?
attributes.names[...] attributes.numbers[...]
Please have a look at my example (it is a bit long because it shows various possibilities) and its result. When I have not yet done a \defineattribute[myattr], node.has_attribute returns 0 when I thought it should return nil. When I do \defineattribute[...], every attribute seems to get the same number (1024), but now node.has_attribute returns nil ... ========================= Example ========================= \starttext \startluacode mycallback=function(head) if attributes.names==nil then print "No attribute names at all" end if attributes.numbers==nil then print "No attribute numbers at all" end for mynode in node.traverse_id(node.id("glyph"), head) do if string.match("0ABCDEabcdefg", unicode.utf8.char(mynode.char)) then print ("Glyph = "..unicode.utf8.char(mynode.char)) if attributes.numbers["myattr"]==nil then print "No attribute number for myattr" else print ("myattr : number = "..(attributes.numbers["myattr"])) end if attributes.numbers["myattrb"]==nil then print "No attribute number for myattrb" else print ("myattrb : number = "..(attributes.numbers["myattrb"])) end if node.has_attribute(mynode, attributes.numbers["myattr"]) then print ("Attribute myattr = "..(node.has_attribute(mynode, attributes.numbers["myattr"]))) else print "No attribute myattr" end if node.has_attribute(mynode, attributes.numbers["myattrb"]) then print ("Attribute myattrb = "..(node.has_attribute(mynode, attributes.numbers["myattrb"]))) else print "No attribute myattrb" end if node.has_attribute(mynode, 111) then print ("Attribute 111 = "..(node.has_attribute(mynode, 111))) else print "No attribute 111" end end end return head end nodes.tasks.appendaction("processors", "before", "mycallback") \stopluacode 0 \attribute111=-1 A \attribute111=200 B \attribute111=202 C \attribute111=-1 D \attribute111=-"7FFFFFFF E \defineattribute[myattr] \defineattribute[myattrb] a \doresetattribute{myattr} b \dosetattribute{myattr}{500} c \dosetattribute{myattr}{502} d \doresetattribute{myattr} e \stoptext ====================== ====================== Result : ====================== Glyph = 0 No attribute number for myattr No attribute number for myattrb Attribute myattr = 0 Attribute myattrb = 0 No attribute 111 Glyph = A No attribute number for myattr No attribute number for myattrb Attribute myattr = 0 Attribute myattrb = 0 Attribute 111 = -1 Glyph = B No attribute number for myattr No attribute number for myattrb Attribute myattr = 0 Attribute myattrb = 0 Attribute 111 = 200 Glyph = C No attribute number for myattr No attribute number for myattrb Attribute myattr = 0 Attribute myattrb = 0 Attribute 111 = 202 Glyph = D No attribute number for myattr No attribute number for myattrb Attribute myattr = 0 Attribute myattrb = 0 Attribute 111 = -1 Glyph = E No attribute number for myattr No attribute number for myattrb Attribute myattr = 0 Attribute myattrb = 0 No attribute 111 Glyph = a myattr : number = 1024 myattrb : number = 1024 No attribute myattr No attribute myattrb No attribute 111 Glyph = b myattr : number = 1024 myattrb : number = 1024 No attribute myattr No attribute myattrb No attribute 111 Glyph = c myattr : number = 1024 myattrb : number = 1024 No attribute myattr No attribute myattrb No attribute 111 Glyph = d myattr : number = 1024 myattrb : number = 1024 No attribute myattr No attribute myattrb No attribute 111 Glyph = e myattr : number = 1024 myattrb : number = 1024 No attribute myattr No attribute myattrb No attribute 111 ====================== Goodbye, Stéphane.
On 4/22/2014 8:10 PM, Stéphane Goujet wrote:
On Tue, 22 Apr 2014, Hans Hagen wrote:
On 4/20/2014 3:14 PM, Stéphane Goujet wrote:
I would like to know what is the recommended way to use attributes in Context. What is the Context way to declare and set attributes? Is it something like this? \defineattribute[myattr] \dosetattribute{myattr}{1}
And how do I then access them from Lua? Should it look like has_attribute(mynode, attributes.myattr) or has_attribute(mynode, attributes.xxxxx("myattr")) or something else?
attributes.names[...] attributes.numbers[...]
Please have a look at my example (it is a bit long because it shows various possibilities) and its result. When I have not yet done a \defineattribute[myattr], node.has_attribute returns 0 when I thought it should return nil. When I do \defineattribute[...], every attribute seems to get the same number (1024), but now node.has_attribute returns nil ...
change this is syst-ini.mkiv: \normalprotected\def\newattribute{\syst_basics_allocate\c_syst_last_allocated_attribute\attribute\attributedef\c_syst_max_allocated_register}
========================= Example ========================= \starttext
\startluacode mycallback=function(head) if attributes.names==nil then print "No attribute names at all" end if attributes.numbers==nil then print "No attribute numbers at all" end for mynode in node.traverse_id(node.id("glyph"), head) do if string.match("0ABCDEabcdefg", unicode.utf8.char(mynode.char)) then print ("Glyph = "..unicode.utf8.char(mynode.char)) if attributes.numbers["myattr"]==nil then print "No attribute number for myattr" else print ("myattr : number = "..(attributes.numbers["myattr"])) end if attributes.numbers["myattrb"]==nil then print "No attribute number for myattrb" else print ("myattrb : number = "..(attributes.numbers["myattrb"])) end if node.has_attribute(mynode, attributes.numbers["myattr"]) then print ("Attribute myattr = "..(node.has_attribute(mynode, attributes.numbers["myattr"]))) else print "No attribute myattr" end if node.has_attribute(mynode, attributes.numbers["myattrb"]) then print ("Attribute myattrb = "..(node.has_attribute(mynode, attributes.numbers["myattrb"]))) else print "No attribute myattrb" end if node.has_attribute(mynode, 111) then print ("Attribute 111 = "..(node.has_attribute(mynode, 111))) else print "No attribute 111" end end end return head end
nodes.tasks.appendaction("processors", "before", "mycallback") \stopluacode
0
\attribute111=-1 A
\attribute111=200 B
\attribute111=202 C
\attribute111=-1 D
\attribute111=-"7FFFFFFF E
\defineattribute[myattr] \defineattribute[myattrb] a
\doresetattribute{myattr} b
\dosetattribute{myattr}{500} c
\dosetattribute{myattr}{502} d
\doresetattribute{myattr} e
\stoptext ======================
====================== Result : ====================== Glyph = 0 No attribute number for myattr No attribute number for myattrb Attribute myattr = 0 Attribute myattrb = 0 No attribute 111 Glyph = A No attribute number for myattr No attribute number for myattrb Attribute myattr = 0 Attribute myattrb = 0 Attribute 111 = -1 Glyph = B No attribute number for myattr No attribute number for myattrb Attribute myattr = 0 Attribute myattrb = 0 Attribute 111 = 200 Glyph = C No attribute number for myattr No attribute number for myattrb Attribute myattr = 0 Attribute myattrb = 0 Attribute 111 = 202 Glyph = D No attribute number for myattr No attribute number for myattrb Attribute myattr = 0 Attribute myattrb = 0 Attribute 111 = -1 Glyph = E No attribute number for myattr No attribute number for myattrb Attribute myattr = 0 Attribute myattrb = 0 No attribute 111 Glyph = a myattr : number = 1024 myattrb : number = 1024 No attribute myattr No attribute myattrb No attribute 111 Glyph = b myattr : number = 1024 myattrb : number = 1024 No attribute myattr No attribute myattrb No attribute 111 Glyph = c myattr : number = 1024 myattrb : number = 1024 No attribute myattr No attribute myattrb No attribute 111 Glyph = d myattr : number = 1024 myattrb : number = 1024 No attribute myattr No attribute myattrb No attribute 111 Glyph = e myattr : number = 1024 myattrb : number = 1024 No attribute myattr No attribute myattrb No attribute 111 ======================
Goodbye, Stéphane.
___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://tex.aanhet.net archive : http://foundry.supelec.fr/projects/contextrev/ wiki : http://contextgarden.net ___________________________________________________________________________________
-- ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | voip: 087 875 68 74 | www.pragma-ade.com | www.pragma-pod.nl -----------------------------------------------------------------
On Wed, 23 Apr 2014, Hans Hagen wrote:
On 4/22/2014 8:10 PM, Stéphane Goujet wrote:
Please have a look at my example (it is a bit long because it shows various possibilities) and its result. When I have not yet done a \defineattribute[myattr], node.has_attribute returns 0 when I thought it should return nil. When I do \defineattribute[...], every attribute seems to get the same number (1024), but now node.has_attribute returns nil ...
change this is syst-ini.mkiv:
\normalprotected\def\newattribute{\syst_basics_allocate\c_syst_last_allocated_attribute\attribute\attributedef\c_syst_max_allocated_register}
Thank you, it seems to work much better ! There is still the problem that "node.has_attribute" does not return "nil" when I expect it should, but that is luatex problem (a check that a parameter is really an integer should be performed before calling lua_tointeger), so I will change mailing-list in order to report it. Faithfully yours, Stéphane Goujet.
On 4/23/2014 3:07 PM, Stéphane Goujet wrote:
On Wed, 23 Apr 2014, Hans Hagen wrote:
On 4/22/2014 8:10 PM, Stéphane Goujet wrote:
Please have a look at my example (it is a bit long because it shows various possibilities) and its result. When I have not yet done a \defineattribute[myattr], node.has_attribute returns 0 when I thought it should return nil. When I do \defineattribute[...], every attribute seems to get the same number (1024), but now node.has_attribute returns nil ...
change this is syst-ini.mkiv:
\normalprotected\def\newattribute{\syst_basics_allocate\c_syst_last_allocated_attribute\attribute\attributedef\c_syst_max_allocated_register}
Thank you, it seems to work much better !
There is still the problem that "node.has_attribute" does not return "nil" when I expect it should, but that is luatex problem (a check that a parameter is really an integer should be performed before calling lua_tointeger), so I will change mailing-list in order to report it.
that interface is unlikely to change (e.g. because of performance reasons) ... you'd better check at your end btw, you can try: mynode[123] which is more efficient ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | voip: 087 875 68 74 | www.pragma-ade.com | www.pragma-pod.nl -----------------------------------------------------------------
On Wed, 23 Apr 2014, Hans Hagen wrote:
On 4/23/2014 3:07 PM, Stéphane Goujet wrote:
There is still the problem that "node.has_attribute" does not return "nil" when I expect it should, but that is luatex problem (a check that a parameter is really an integer should be performed before calling lua_tointeger), so I will change mailing-list in order to report it.
that interface is unlikely to change (e.g. because of performance reasons)
Er... well, the other parameter is already checked, with a check_isnode() which is heavier than a lua_isnumber() or lua_isnil(). It is possible that the former one is not inlined when the other ones are (I did not verify either of these hypotheses). Anyway, if you do not want to make this change in the code, you should change the specification, because now, Luatex reference manual says "It returns the value, or, if no match is found, nil", whereas when we supply an attribute number which is nil or not a number (therefore it cannot ever match), it returns a non-nil value (which, moreover, means "true"). Something like adding "If id is nil or if id is not an integer, the result is unspecified", perhaps. Goodbye, Stéphane.
On 4/24/2014 1:39 AM, Stéphane Goujet wrote:
On Wed, 23 Apr 2014, Hans Hagen wrote:
On 4/23/2014 3:07 PM, Stéphane Goujet wrote:
There is still the problem that "node.has_attribute" does not return "nil" when I expect it should, but that is luatex problem (a check that a parameter is really an integer should be performed before calling lua_tointeger), so I will change mailing-list in order to report it.
that interface is unlikely to change (e.g. because of performance reasons)
Er... well, the other parameter is already checked, with a check_isnode() which is heavier than a lua_isnumber() or lua_isnil(). It is possible that the former one is not inlined when the other ones are (I did not verify either of these hypotheses).
Anyway, if you do not want to make this change in the code, you should change the specification, because now, Luatex reference manual says "It returns the value, or, if no match is found, nil", whereas when we supply an attribute number which is nil or not a number (therefore it cannot ever match), it returns a non-nil value (which, moreover, means "true"). Something like adding "If id is nil or if id is not an integer, the result is unspecified", perhaps.
I've added a tracker item and will look at it later (no more changed at this moment to the code as we're closing in on release i.e. texlive code freeze). Hans ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | voip: 087 875 68 74 | www.pragma-ade.com | www.pragma-pod.nl -----------------------------------------------------------------
participants (2)
-
Hans Hagen
-
Stéphane Goujet