Torben, I'm very excited by this. I've been looking into building frontends that vary greatly from the standard wave client, but still utilize the power of the underlying Wave technology. I think this is a great enabler for that.
Many thanks, Anthony On Jun 16, 9:25 am, Torben Weis <[email protected]> wrote: > Hi, > > I want to announce a new wave-related open source project: "Wala", a > programming language for writing web-based wave frontends. > You can find the sources at: > > http://code.google.com/p/wala-compile<http://code.google.com/p/wala-compiler/admin> > r > > It is already partially working, but keep in mind that it is still closer to > a research project than a productive system. The aim is of course to get it > polished and stable in the months ahead. > > In the past I got many requests of how to reuse the QWaveClient code to > build custom wave applications. This includes applications that use a > different schema, i.e. neither blips nor threads. My own experiments have > shown that the code re-use was quite limited, because only the raw data > model, OT and network protocols could be re-used. > > However, there is a lot of code that deals with question such as: How to > detect when a blip is inserted or removed and how to update the UI? How to > detect that a thread has been created and where to display it? What to do if > all blips of a thread have been deleted? Efficiently displaying digest > changes, and so on ... When using a new data schema all these questions turn > up again. The more complicated the schema, the more difficult it becomes to > ensure that all possibilities have been taken care of. > > I failed to abstract these things away in an easy to use framework. So my > idea was to create a language that makes it easy to describe such > applications. Wala is therefore a combination of a client-side template > engine and functional programming. Basically, a wala program specifies how > to map a wave to the UI. Currently I support HTML as a UI, because the > entire Wala stuff is web-based. > > The trick is that the wala compiler figures out how to update the UI when > the wave changes! This was exactly the complicated part that I could not > encapsulate in an OO framework. Now instead, the compiler does the nasty > job. Below I attached a sample Wala program that yields a web-based wave > client. It shows a digest, clicking on a wave in the digest shows the > wavelet. It supports blips and threads. The UI updates the digest and blips > as users are typing. Even more, it features a web-based rich text editor > that allows for concurrent wave editing and last not least it supports a > login screen. > > A core concept of Wala are XPath-alike live queries such as: > > $wave/doc("conversation")/conversation/blip > > $wave is some variable and the query searches for all root blips in the > conversation document. As the document mutates, the query updates itself. As > a result all templates that depend on this query are updated as well. Et > voila, the UI automatically adapts if new blips arrive, change or are > removed. > > Some more explanations can be found at the Wala > websitehttp://code.google.com/p/wala-compile<http://code.google.com/p/wala-compiler/admin>r > . It is still very rough on the edges. But since I got a wave web client up > and running with it last night, I thought it might be appropriate to show > it. Needless to say that I welcome any participation in the project. > > PS: What does this mean for QWaveClient? I am still using and maintaining > it. However, for me wave as a platform is much much more interesting than > the current Google Wave frontend with its blips and threads. I still like > it, but I think the wave platform is extremely powerful. I hope that Wala > makes it much easier to write cool apps for this platform. > > Greetings > Torben > > ==================================================================== > > var $status = "anonymous"; > var $wave = false; > > template digest() > { > @foreach( $d in wave("!indexwave", > "wave1.vs.uni-due.de")/wavelets()/doc("digest") > ) > { > <p class="digest" onclick={{ openWave($d) }} >Wave: {{ text($d) }}</p> > } > > } > > template thread($t) > { > <div class="thread">Thread {{ $t.id }}: > @foreach( $b in $t/blip ) > { > �...@blip($b) > } > </div> > > } > > template blip($b) > { > <div class="blip">Blip {{$b.id}}: > @component(editor $e element={{ $wave/doc($b.id)/body }} ) > @foreach( $t in $b/thread ) > { > @thread($t) > } > </div> > > } > > template main() > { > @if ( $status == "anonymous" ) > { > <h1>Please log in</h1> > <input type="text" id="username" />\[email protected] > <input type="button" value="Log in" onclick="login();" /> > } > @else > { > @digest() > @foreach( $b in $wave/doc("conversation")/conversation/blip ) > { > @blip( $b ) > } > } > > } > > function login() > { > var username = document.getElementById("username").value; > JSOT.Rpc.login( username + "@wave1.vs.uni-due.de", onLogin ); > > } > > function onLogin() > { > JSOT.Path.LocalState.setValue( '$status', "loggedin" ); > > } > > function openWave($d) > { > var w = JSOT.Rpc.openWavelet( "wave://" + $d.wavelet.domain + "/" + $ > d.wavelet.id + "/conv+root" ); > JSOT.Path.LocalState.setValue( '$wave', w ); > > > > } -- You received this message because you are subscribed to the Google Groups "Wave Protocol" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/wave-protocol?hl=en.
