[NTG-context] Attributes

St├ęphane Goujet stephane.goujet at wanadoo.fr
Tue Apr 22 20:10:49 CEST 2014


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.


More information about the ntg-context mailing list