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.