From: David N. W. <da...@ei...> - 2004-06-11 11:01:59
Attachments:
two-mode-mode.el
|
Hi, I have been thinking some about erlang, yaws, and the creation of web pages. I have some experience in the field of web work, and wanted to fire off a few ideas regarding yaws: * Templates should be in HTML, so that people used to working with HTML may easily modify and update them. Often, in the larger world, these people don't have much programming experience. * Templates shouldn't have too much code in them. Mixing lots of code and HTML is ugly and difficult to maintain. * Variable substitution is good, but limited. The first time you make a table, you face the problem that either 1) you "hand off" a variable that contains the whole table to the template or 2) put some code, most likely looping constructs, in the HTML. Option 1 is less than ideal, because you have taken away control of the look and feel from your HTML person (well, with style sheets, it's not quite bad, but still...). Option 2 isn't great, but can be managed successfully. * <?tag ?> should be used to delimit "processing instructions" from HTML/XML, where tag is something like php, erl, tcl. So, with these things in mind, I'd like to think about Yaws some. I have written a small parser that deals with <?tag ?> style templates (how easy and clean it was in erlang is very impressive) that turns <html>blah blah <? Foo ?> blah blah into "<html>blah blah" ++ tostr(Foo) ++ "blah blah" which is fairly successful for creating HTML templates. The way it works is that the .yaws file contains logic, that fills in the variables and calls the template: {html, parser:parsefile("/var/yaws/www/eelconf/ec.etl", [{'Foo', "bar"}, {'Answer', 42}])}. I'm not satisfied with how it handles inline code, though. In part because after using Tcl a lot for web stuff, something very text oriented with less syntax just feels more natural. Maybe a little language like jakarta's Velocity is in order? Stuff like that makes me suspicious though, because little languages tend to grow... Any thoughts? Would something like this be of interest? A few more considerations: with a system like the above, it should also be possible to have 'raw erlang' files where the <erl> </erl> tags aren't included. These files would be pure code, and call out to templates as needs be. Another thing that was bugging me: I wanted to include a library of code in the ebin_dir = /var/yaws/ebin/ directory. Is there a way to make yaws reload this every now and then if it's out of date? It might be handy to have while developing an app. As a bonus for those who have read this far, here is two-mode-mode.el, which can be used for editing .yaws files. It switches back and forth between HTML and Erlang modes, depending where you are in the text. I *think* the license (ASF 2) should permit its inclusion in yaws, should someone so desire. Thanks for your time! -- David N. Welton da...@ei... |
From: David N. W. <da...@ei...> - 2004-06-11 15:32:38
|
kl...@hy... wrote: > So we (or rather Jocke Greben=F6) at Nortel/Bluetail have been faced=20 > with exactly the same problems the last year. Jocke has been working > together with an HTML "artist" kinda person who doesn't know any > erlang/yaws whatsoever. Exactly. > Anyway, we've been toying with and adding some different constructs > to yaws lateley in order to aid this process. The latest addition > by jocke was the ability to have ssi with the expanded variable=20 > an ehtml construct instead of just ascci.=20 > I don't know exactly how jocke and the HTML person are in detail=20 > using this feature though ...... > (I've asked Jocke to write down something on this ....) >> .... > Wouldn't the above be extremely slow. To do the parsing for every > page or am I missing something here ..... It is a proof of concept. Theoretically it could be cached along with=20 everything else, no? I'd like to get it right, then make it fast:-) >>I'm not satisfied with how it handles inline code, though. In part=20 >>because after using Tcl a lot for web stuff, something very text=20 >>oriented with less syntax just feels more natural. Maybe a little=20 >>language like jakarta's Velocity is in order? Stuff like that makes me= =20 >>suspicious though, because little languages tend to grow... >> >>Any thoughts? Would something like this be of interest? > So what the difference between the above and > {ssi, "ec.etl" "@@" , [{"Foo", "bar"}, {"Answer", "42"}]} Well, the heart of my system has an actual erl_eval, and it attempts to=20 turn everything into a string. That means you, the programmer, don't=20 have to do that yourself when you pass the variables off to the template=20 file. > except that the delimeters are "<?" and "?>" as opposed > to "@@" and "@@". Is it better (more external tools friendly) to > use <foo .... foo> than to use i.e.: @@ .... @@ >=20 > ?? Probably yes. <? ?> are XML processing instructions, which is why they are used by=20 systems like PHP, Rivet, and others. One of the benefits is that it's=20 standard, and tools friendly, yes. > The cool thing about ssi as it stands today is that it's super fast. > The file is parsed once and for all and when we're about to ship a page > the static parts of the page are already known and we know at what posi= tions=20 > in the file to insert the dynamic parts. This is extremely fast. We could do some caching to speed up the <? ?> style files, but I=20 thought I'd think about that later. I'd rather have easy to work with=20 than fast at the moment. > So would it suffice if we expanded ssi to handle: >=20 > {ssi, File, StartDelimiter, StopDelimiter, Bindings} >=20 > Then we could have: >=20 > {ssi, "file.html", "<?", "?>", [{"myvar", {ehtml, FatsoStructure}} ...]= } > ??? I think having a way to do the equivalent of at least if, foreach and a=20 few other things: http://jakarta.apache.org/velocity/user-guide.html A system like this has the disadvantage that it starts small, but keeps=20 growing as people ask "well couldn't we just have this?". So I think=20 the ideal thing would be to find a way to do erlang code, although a lot=20 of attention needs to be dedicated to make it less 'intimidating' for=20 someone who maybe knows a little bit of basic, php, javascript or things=20 of that ilk, and even for reasonably good programmers, to make things=20 very immediate: #foreach( $something in $somelist ) <tr><td bgcolor=3D$color>$something</td></tr> #end or foreach something $somelist { puts <tr><td bgcolor=3D$color>$something</td></tr> } Are pretty easy to explain compared to: lists:map(fun(A) -> "<tr><td bgcolor=3D" ++ Color ++">" ++ A ++ "</td></tr>" end, Somelist) IMO, at least. I don't know if erlang will ever be the ideal language=20 for this type of work, but I think it's flexible and powerful enough to=20 come up with something a little bit simpler for basic functions like this= =2E One idea I had was this, that takes a deep list, or list of tuples, or=20 whatever, and applies functions to the elements at varying depths: drill(erlang:memory(), {fun table/1, fun tr/1, fun td/1}) Although I fear that it's still too 'weird' for non-programmer types. >>Another thing that was bugging me: I wanted to include a library of cod= e=20 >>in the ebin_dir =3D /var/yaws/ebin/ directory. Is there a way to make=20 >>yaws reload this every now and then if it's out of date? It might be=20 >>handy to have while developing an app. >=20 > No way to make yaws do it. No. Ok... at the very least, can the programmer accomplish it by means of l()= ? > Nice, this was indeed bugging me all the time as well. I'll add it > to the yaws CVS. Thanks. Sure! Thanks, --=20 David N. Welton da...@ei... |
From: Einar K. <eka...@cs...> - 2004-06-11 19:53:03
|
On 11.06 13:01, David N. Welton wrote: > * Templates should be in HTML, so that people used to working with HTML > may easily modify and update them. Often, in the larger world, these > people don't have much programming experience. Another angle is internalisation which desperately needs sepate templates. > * Variable substitution is good, but limited. The first time you make a > table, you face the problem that either 1) you "hand off" a variable > that contains the whole table to the template or 2) put some code, most > likely looping constructs, in the HTML. Option 1 is less than ideal, > because you have taken away control of the look and feel from your HTML > person (well, with style sheets, it's not quite bad, but still...). > Option 2 isn't great, but can be managed successfully. A more powerfull version of variable substitution would be more than enough for most people. The most common thing needed is "list of things" e.g. a row. Out of these are composed "lists of lists of things" namely tables. Amrita is a quite nice templating system for Ruby: http://www.brain-tokyo.jp/research/amrita/rdocs/files/docs/QuickStart.html It solves the issues quite cleanly and is nice to use, the only problem seems to be that erlang has no nice equivalent for ruby hash tables (proplists maybe). Here is an example for the table case from the page: <table border="1"> <tr><th>name</th><th>author</th></tr> <tr id="table1"> <td id="name"><td id="author"> </tr> </table> data = { :table1=>[ { :name=>"Ruby", :author=>"matz" }, { :name=>"perl", :author=>"Larry Wall" }, { :name=>"python", :author=>"Guido van Rossum" }, ] } - Einar Karttunen |
From: David N. W. <da...@ei...> - 2004-06-14 08:57:38
|
> A more powerfull version of variable substitution would be more than > enough for most people. The most common thing needed is "list of > things" e.g. a row. Out of these are composed "lists of lists of things" > namely tables. Sure, although conditionals are pretty important too, I think. > Amrita is a quite nice templating system for Ruby: > http://www.brain-tokyo.jp/research/amrita/rdocs/files/docs/QuickStart.html > It solves the issues quite cleanly and is nice to use, the > only problem seems to be that erlang has no nice equivalent > for ruby hash tables (proplists maybe). It looks pretty good, but I'm a bit skeptical about the conditionals. The HTML guy is not going to have any clue aside from id="foo" that an element may not be included in the generated page. For lists, I think it would work pretty well. Also in the negative category for me is that it's harder to implement because it needs to understand the HTML it's dealing with. I do like that it appears as real HTML, though, I think that's important. -- David N. Welton da...@ei... |
From: Taavi T. <ta...@un...> - 2004-06-14 19:37:22
|
On Fri, 11 Jun 2004, David N. Welton wrote: > I have been thinking some about erlang, yaws, and the creation of web > pages. I have some experience in the field of web work, and wanted to > fire off a few ideas regarding yaws: > > * Templates should be in HTML, so that people used to working with HTML > may easily modify and update them. Often, in the larger world, these > people don't have much programming experience. > > * Templates shouldn't have too much code in them. Mixing lots of code > and HTML is ugly and difficult to maintain. > > * Variable substitution is good, but limited. The first time you make a > table, you face the problem that either 1) you "hand off" a variable > that contains the whole table to the template or 2) put some code, most > likely looping constructs, in the HTML. Option 1 is less than ideal, > because you have taken away control of the look and feel from your HTML > person (well, with style sheets, it's not quite bad, but still...). > Option 2 isn't great, but can be managed successfully. I am using rip off of the Joe Armstrongs *.ehtml with variable substitution (http://home.uninet.ee/~taavi/files/erlang/ehtml/) quite suceessfully. best regards, taavi |
From: David N. W. <da...@ei...> - 2004-06-15 09:49:23
|
> I am using rip off of the Joe Armstrongs *.ehtml with variable > substitution (http://home.uninet.ee/~taavi/files/erlang/ehtml/) quite > suceessfully. That looks like some pretty good code to work from. I'd still rather see <? ?> than one-off tags, though. -- David N. Welton da...@ei... |
From: Sean H. <sea...@t-...> - 2004-06-16 11:28:57
|
And we use a rip off of Joes esp - this allows variable substitution and embedded code. Attached. Sean |
From: Luke G. <lu...@bl...> - 2004-06-14 20:13:39
|
"David N. Welton" <da...@ei...> writes: > ;; two-mode-mode.el -- switches between tcl and sgml(html) modes Great idea! |
From: David N. W. <da...@ei...> - 2004-06-22 10:00:20
|
>>Another thing that was bugging me: I wanted to include a library of code >>in the ebin_dir = /var/yaws/ebin/ directory. Is there a way to make >>yaws reload this every now and then if it's out of date? It might be >>handy to have while developing an app. > No way to make yaws do it. No. I created a page for my own use where I click on a module and it does: case queryvar(A, "reload") of {ok, Mod} -> code:purge(Mod), code:load_file(Mod), Reload = {reload, Mod}; _ -> Reload = {reload, "false"} it's useful, because I like to keep my code in modules. -- David N. Welton da...@ei... |
From: Carsten S. <ca...@co...> - 2004-06-22 10:14:35
|
My apologies for the subject line. On Tue, Jun 22, 2004 at 12:00:08PM +0200, David N. Welton wrote: > >>Another thing that was bugging me: I wanted to include a library of cod= e=20 > >>in the ebin_dir =3D /var/yaws/ebin/ directory. Is there a way to make= =20 > >>yaws reload this every now and then if it's out of date? It might be= =20 > >>handy to have while developing an app. >=20 > >No way to make yaws do it. No. >=20 > I created a page for my own use where I click on a module and it does: >=20 > case queryvar(A, "reload") of > {ok, Mod} -> > code:purge(Mod), > code:load_file(Mod), > Reload =3D {reload, Mod}; > _ -> > Reload =3D {reload, "false"} >=20 > it's useful, because I like to keep my code in modules. Another non-automatic way to do it was to use `yaws -load modules', but I think it's broken at the moment. Greetings, Carsten --=20 Carsten Schultz (2:38, 33:47), FB Mathematik, FU Berlin http://carsten.codimi.de/ PGP/GPG key on the pgp.net key servers,=20 fingerprint on my home page. |