(Updated with a little more explanation as to what's going on.)
The Spyce Active Tag compiler is coming along nicely. Spyce has had active tags since 1.3.0 (current active release is 1.3.13; it's very, very stable by now), but writing a tag library shares a lot of the problems that JSP 1.x tag libraries had; it takes a lot of code to get something done.
Now, I've updated the Spyce compiler to be able to compile tag libaries, and tied it in to the active handler feature as a bonus. Meaning, tags can wrapping their control logic together with the view so all the user has to write is a single tag, like "<chat:boxlet />" below. (You could put the controller logic into another module and write handler="foo.addLine" instead of self, but I'm keeping it simple here.)
Here's a simple example that defines and uses a chatbox component. Chat state is stored in the server globals area for simplicity. This code is running (for the next few days at least) over here. Update: original demo is down, but a slightly more sophisticated version (showing two chatboxes on the same page) is up at the spyce 2.0 prerelease site.
(I hope to get a beta of the next Spyce release (1.4? 2.0?) out later this week.)
(chatbox.spy)
[[.tagcollection ]] [[.begin name=boxlet singleton=True ]] [[.attr name=width default=300 ]] [[.attr name=lines default=5 ]] [[\ # this code runs when user hits Send def addLine(self): # (use get() in case server restarted) request._api.getServerGlobals().get('chatlines', []).append(request['newline']) ]] [[.import names="pool"]] [[-- creates pool alias for request._api.getServerGlobals() --]] <div width="[[= width ]]"> [[ i = -int(lines) line = None # for first export ]] [[ for line in pool.setdefault('chatlines', [])[i:]:{ ]] <div>[[= line ]]</div> [[ } ]] <div> <f:text name=newline /> <f:submit handler='self.addLine' value="Send" /> <f:submit value="Refresh" /> </div> </div> [[.export var=line as=last ]] [[-- sends this variable to the calling scope --]] [[.end]]
(demo.spy)
[[.taglib as='chat' from='chatbox.spy']] <html> <head> <title>Active tag handler test</title> </head> <body> <f:form> <chat:boxlet /> The last line in chat is: [[= last ]] </f:form> </body> </html>
(whitenoise added to keep blogger from screwing up my formatting...)
Comments