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.
___________________________________________________________________________________
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
___________________________________________________________________________________

Reply via email to