Jaws - coming soon - testers and advice wanted

Joe Armstrong (AL/EAB) <>
Mon Feb 20 10:14:17 CET 2006


 
Hello,

Progress report - jaws (yaws + templates) is progressing nicely.
I have finally "made up my mind" (TM) and decided on a template syntax
(two years thought and half a dozen prototypes "down the drain") -
a compiler for this syntax has now been up and running for a few weeks
and I am finalising the Ajax support.

jaws is a template language for yaws (jaws is inspired by PHP, velocity
and AJAX)
- this posting contains a "first look" at the syntax. I'm not going to
describe the semantics - you have to *guess* - it's rather easy.
(Hints all webpages and templates get compiled to single functions)

A *single* jaws file contains templates for *many* webpages - so that an
entire application can be shipped as a single file.

Here's a simple example, assumed to be in the file foo.jaws

      @module foo
	
	@webPage test(_)
	<? N = 25, "" ?>

	<P>factorial <? N ?> is <? fac(N) ?>
	
	@erl
	fac(0) -> 1;
	fac(N) -> N * fac(N-1).

	@webPage form(A)
	<form method="post" action="./foo.jaws?page=posted">
       <input name="fac" size="20">
	</form>

	@webPage posted(A)
	<? {ok, X} = yaws_api:postvar(A, "fac"), 
         N = list_to_integer(N), "" ?>

      <? banner([{"name","joe"},{"likes", "Erlang"}]) ?>

	<p>Fac <? N ?> is <? red(fac(N)) ?>

	@template red(X)
	<font color="red"><? X ?></font>

	@template banner(X)

	<p>Hello ${name:X} i hear you like ${likes:X}

      @webPage ajax(A)
	<div id="tag1">
	...
	</div>

	<a href='javascript:erlcall'("foo", "myfunc", "")'>update</a>

	@webPage myfunc(A)
	
	myfunc(Args) ->
	   [replace_contents("tag1", "<h1>Hi .... "].

	@webPage redirect(A)
	<? Headers = [{"redirect", "http:// ..."}], "" ?>

	<h1> You'll soon be redirected.

This defines eight webpages and two templates in one jaws file. It
gives examples of

	- template expansion
	- form handling
	- ajax
	- header manipulation (in the redirect example)

<< computationally <? fac(N) ?> is about 10-20 times faster than PHP
and it works for bignums :-) >>

It seems to me to be desirable to have the code which handles a form
*immediately after the code which defines the form* (and not in another
file) - it also seems desirable to be able to program HTML with
subroutines, like this:

	@webPage foo(A)

	Some html <? fancy_box(A) ?>
	... <? fancy_box(B) ?> ...

	@template fancy_box(A)
	<table> .... <? A ?> ... </table>

Note also how the site of ajax call is lexically near to the code which
handles the call. 

javascript:erlcall(M, F, A) allows javascript to call an arbitary Erlang
{M,F,A}
This is achieved with ajax and a JSON encoding. MFA returns a list
of actions that are to be performed on the webpage - ie
(replace_contents("tag1" , HTML))
sets the innerHTML field of tag1 to HTML.

At this stage I need two things:
	1) Testers - a few good people who are interested in this kind
of
	   stuff
	2) javascript help - the result of myfunc(Args) is a list of
actions to be 
	   performed on a web page. A typical example is

	   replace_contents(Tag, Html) 

	   When this is called in Erlang a JSON encoded term is sent
back to the
web page and after a little trickery

	jsReplaceContents(tag, html) is called

where

	function jsReplaceContents(tag, html) {
		document.getElementById(tag).innerHTML = html;
	}

I have defined a few simple functions (replace_contents(tag, HTML),
delete_tag(Tag) etc.

But I am really stretching my knowledge of javascript here.

If any javascript guru wants to help please contact me. 

In particular does anybody have any ideas how to do this?

If I have this

         <div id="foo">
          ....
          ...  <a href="javascript:bar()">click</a>

         </div>

 I want bar() to compute the id if the nearest containing div - in this 
case "foo" any ideas how to do this? - do I really have to "walk the
tree" from the root of the DOM tree?

/Joe



More information about the erlang-questions mailing list