[Seaside] [GOODIE] HTML Builder

Avi Bryant avi@beta4.com
Wed, 5 Jun 2002 02:54:31 -0700 (PDT)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--1293455216-2133609522-1023270871=:3450
Content-Type: TEXT/PLAIN; charset=US-ASCII

This is just a quick offshoot of some ideas I'm playing with for Seaside.
It pulls DNU tricks to allow easy embedding of html within smalltalk
code (as opposed to SSP, which is the other way around).  For example,

h := HTMLBuilder new.

h form action: 'foo.cgi'.
  h input type: 'text'; name: 'amount'; close.
  h input type: submit; close.
h close form.

h stream contents
'<form action="foo.cgi"><input type="text" name="amount"></input>
 <input type="submit"></input></form>'

I think the 'h close form' is especially cute; you could also just write
'h close' but this way you get error checking.
Look at the test case for more examples.

Enjoy,
Avi

--1293455216-2133609522-1023270871=:3450
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="Seaside-Experimental.st"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.30.0206050254310.3450@cable.beta4.com>
Content-Description: 
Content-Disposition: attachment; filename="Seaside-Experimental.st"

T2JqZWN0IHN1YmNsYXNzOiAjSFRNTEJ1aWxkZXINCWluc3RhbmNlVmFyaWFi
bGVOYW1lczogJ3RhZ1N0YWNrIHN0cmVhbSAnDQljbGFzc1ZhcmlhYmxlTmFt
ZXM6ICcnDQlwb29sRGljdGlvbmFyaWVzOiAnJw0JY2F0ZWdvcnk6ICdTZWFz
aWRlLUV4cGVyaW1lbnRhbCchDQ0hSFRNTEJ1aWxkZXIgbWV0aG9kc0Zvcjog
J2FzIHlldCB1bmNsYXNzaWZpZWQnIHN0YW1wOiAnYWIgNi81LzIwMDIgMDI6
MDQnIQ1jbG9zZQ0JfHRhZ3wNCXNlbGYgZW5zdXJlTGFzdFRhZ09wZW5lZC4N
CXRhZyBfIHRhZ1N0YWNrIHJlbW92ZUxhc3QuDQl0YWcgd3JpdGVDbG9zZVRh
Z1RvU3RyZWFtOiBzdHJlYW0uDQleIEhUTUxDbG9zZVRhZ0NoZWNrZXIgbmV3
IG5hbWU6IHRhZyB0YWdOYW1lISAhDQ0hSFRNTEJ1aWxkZXIgbWV0aG9kc0Zv
cjogJ2FzIHlldCB1bmNsYXNzaWZpZWQnIHN0YW1wOiAnYWIgNi81LzIwMDIg
MDI6MDEnIQ1kb2VzTm90VW5kZXJzdGFuZDogYU1lc3NhZ2UNCV4gYU1lc3Nh
Z2Ugc2VsZWN0b3IgbnVtQXJncyA9IDANCQlpZlRydWU6IFtzZWxmIHRhZ05h
bWVkOiBhTWVzc2FnZSBzZWxlY3Rvcl0NCQlpZkZhbHNlOg0JCQlbKGFNZXNz
YWdlIHNlbGVjdG9yIG51bUFyZ3MgPSAxKQ0JCQkJaWZUcnVlOiBbc2VsZiB0
YWdOYW1lZDogYU1lc3NhZ2Ugc2VsZWN0b3IgYWxsQnV0TGFzdA0JCQkJCQkJ
ICB3aXRoVGV4dDogYU1lc3NhZ2UgYXJndW1lbnRdDQkJCQlpZkZhbHNlOiBb
c3VwZXIgZG9lc05vdFVuZGVyc3RhbmQ6IGFNZXNzYWdlXV0hICENDSFIVE1M
QnVpbGRlciBtZXRob2RzRm9yOiAnYXMgeWV0IHVuY2xhc3NpZmllZCcgc3Rh
bXA6ICdhYiA2LzUvMjAwMiAwMTo1NichDWVuZA0Jc2VsZiBlbnN1cmVMYXN0
VGFnT3BlbmVkLg0JdGFnU3RhY2sgcmVtb3ZlTGFzdCEgIQ0NIUhUTUxCdWls
ZGVyIG1ldGhvZHNGb3I6ICdhcyB5ZXQgdW5jbGFzc2lmaWVkJyBzdGFtcDog
J2FiIDYvNS8yMDAyIDAxOjU1JyENZW5zdXJlTGFzdFRhZ09wZW5lZA0JKHRh
Z1N0YWNrIGlzRW1wdHkgbm90IGFuZDogW3RhZ1N0YWNrIGxhc3Qgb3BlbmVk
IG5vdF0pDQkJaWZUcnVlOiBbdGFnU3RhY2sgbGFzdCB3cml0ZU9wZW5UYWdU
b1N0cmVhbTogc3RyZWFtXSEgIQ0NIUhUTUxCdWlsZGVyIG1ldGhvZHNGb3I6
ICdhcyB5ZXQgdW5jbGFzc2lmaWVkJyBzdGFtcDogJ2FiIDYvNS8yMDAyIDAx
OjE1JyENaW5pdGlhbGl6ZQ0JdGFnU3RhY2sgXyBPcmRlcmVkQ29sbGVjdGlv
biBuZXcuDQlzdHJlYW0gXyBXcml0ZVN0cmVhbSBvbjogU3RyaW5nIG5ldyEg
IQ0NIUhUTUxCdWlsZGVyIG1ldGhvZHNGb3I6ICdhcyB5ZXQgdW5jbGFzc2lm
aWVkJyBzdGFtcDogJ2FiIDYvNS8yMDAyIDAxOjE1JyENc3RyZWFtDQleIHN0
cmVhbSEgIQ0NIUhUTUxCdWlsZGVyIG1ldGhvZHNGb3I6ICdhcyB5ZXQgdW5j
bGFzc2lmaWVkJyBzdGFtcDogJ2FiIDYvNS8yMDAyIDAxOjE1JyENc3RyZWFt
OiBhU3RyZWFtDQlzdHJlYW0gXyBhU3RyZWFtISAhDQ0hSFRNTEJ1aWxkZXIg
bWV0aG9kc0ZvcjogJ2FzIHlldCB1bmNsYXNzaWZpZWQnIHN0YW1wOiAnYWIg
Ni81LzIwMDIgMDI6MDQnIQ10YWdOYW1lZDogdGFnTmFtZQ0JfHRhZ3wNCXNl
bGYgZW5zdXJlTGFzdFRhZ09wZW5lZC4NCXRhZyBfIEhUTUxCdWlsZGVyVGFn
IG5ldyB0YWdOYW1lOiB0YWdOYW1lOyBwYXJlbnQ6IHNlbGYuDQl0YWdTdGFj
ayBhZGRMYXN0OiB0YWcuDQleIHRhZyEgIQ0NIUhUTUxCdWlsZGVyIG1ldGhv
ZHNGb3I6ICdhcyB5ZXQgdW5jbGFzc2lmaWVkJyBzdGFtcDogJ2FiIDYvNS8y
MDAyIDAxOjU5JyENdGFnTmFtZWQ6IHRhZ05hbWUgd2l0aFRleHQ6IGFTdHJp
bmcNCXNlbGYgdGFnTmFtZWQ6IHRhZ05hbWUuDQlzZWxmIHRleHQ6IGFTdHJp
bmcuDQlzZWxmIGNsb3NlLiEgIQ0NIUhUTUxCdWlsZGVyIG1ldGhvZHNGb3I6
ICdhcyB5ZXQgdW5jbGFzc2lmaWVkJyBzdGFtcDogJ2FiIDYvNS8yMDAyIDAx
OjU5JyENdGV4dDogYVN0cmluZw0Jc2VsZiBlbnN1cmVMYXN0VGFnT3BlbmVk
Lg0Jc3RyZWFtIG5leHRQdXRBbGw6IGFTdHJpbmcgYXNTdHJpbmchICENDSIt
LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
LSAtLSAtLSAiIQ0NSFRNTEJ1aWxkZXIgY2xhc3MNCWluc3RhbmNlVmFyaWFi
bGVOYW1lczogJychDQ0hSFRNTEJ1aWxkZXIgY2xhc3MgbWV0aG9kc0Zvcjog
J2FzIHlldCB1bmNsYXNzaWZpZWQnIHN0YW1wOiAnYWIgNi81LzIwMDIgMDA6
NTEnIQ1uZXcNCV4gc3VwZXIgbmV3IGluaXRpYWxpemUhICENDSFIVE1MQnVp
bGRlciBjbGFzcyBtZXRob2RzRm9yOiAnYXMgeWV0IHVuY2xhc3NpZmllZCcg
c3RhbXA6ICdhYiA2LzUvMjAwMiAwMjoxNichDW9uOiBhU3RyZWFtDQleIHNl
bGYgbmV3IHN0cmVhbTogYVN0cmVhbSEgIQ0NDA1PYmplY3Qgc3ViY2xhc3M6
ICNIVE1MQnVpbGRlclRhZw0JaW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAncGFy
ZW50IG5hbWUgYXR0cmlidXRlcyBvcGVuZWQgJw0JY2xhc3NWYXJpYWJsZU5h
bWVzOiAnJw0JcG9vbERpY3Rpb25hcmllczogJycNCWNhdGVnb3J5OiAnU2Vh
c2lkZS1FeHBlcmltZW50YWwnIQ0NIUhUTUxCdWlsZGVyVGFnIG1ldGhvZHNG
b3I6ICdhcyB5ZXQgdW5jbGFzc2lmaWVkJyBzdGFtcDogJ2FiIDYvNS8yMDAy
IDAxOjM2JyENYXR0cmlidXRlQXQ6IGtleSBwdXQ6IHZhbHVlDQlhdHRyaWJ1
dGVzIGlmTmlsOiBbYXR0cmlidXRlcyBfIE9yZGVyZWRDb2xsZWN0aW9uIG5l
d10uDQlhdHRyaWJ1dGVzIGFkZDoga2V5IC0+IHZhbHVlISAhDQ0hSFRNTEJ1
aWxkZXJUYWcgbWV0aG9kc0ZvcjogJ2FzIHlldCB1bmNsYXNzaWZpZWQnIHN0
YW1wOiAnYWIgNi81LzIwMDIgMDE6MjAnIQ1jbG9zZQ0JcGFyZW50IGNsb3Nl
ISAhDQ0hSFRNTEJ1aWxkZXJUYWcgbWV0aG9kc0ZvcjogJ2FzIHlldCB1bmNs
YXNzaWZpZWQnIHN0YW1wOiAnYWIgNi81LzIwMDIgMDE6MTgnIQ1kb2VzTm90
VW5kZXJzdGFuZDogYU1lc3NhZ2UNCV4gYU1lc3NhZ2Ugc2VsZWN0b3IgbnVt
QXJncyA9IDENCQlpZlRydWU6IFtzZWxmIGF0dHJpYnV0ZUF0OiBhTWVzc2Fn
ZSBzZWxlY3RvciBhbGxCdXRMYXN0IHB1dDogYU1lc3NhZ2UgYXJndW1lbnRd
DQkJaWZGYWxzZTogW3N1cGVyIGRvZXNOb3RVbmRlcnN0YW5kOiBhTWVzc2Fn
ZV0hICENDSFIVE1MQnVpbGRlclRhZyBtZXRob2RzRm9yOiAnYXMgeWV0IHVu
Y2xhc3NpZmllZCcgc3RhbXA6ICdhYiA2LzUvMjAwMiAwMTo0MychDWVuZA0J
cGFyZW50IGVuZCEgIQ0NIUhUTUxCdWlsZGVyVGFnIG1ldGhvZHNGb3I6ICdh
cyB5ZXQgdW5jbGFzc2lmaWVkJyBzdGFtcDogJ2FiIDYvNS8yMDAyIDAxOjQ0
JyENb3BlbmVkDQleIG9wZW5lZCBpZk5pbDogW29wZW5lZCBfIGZhbHNlXSEg
IQ0NIUhUTUxCdWlsZGVyVGFnIG1ldGhvZHNGb3I6ICdhcyB5ZXQgdW5jbGFz
c2lmaWVkJyBzdGFtcDogJ2FiIDYvNS8yMDAyIDAwOjUyJyENcGFyZW50OiBh
QnVpbGRlcg0JcGFyZW50IF8gYUJ1aWxkZXIhICENDSFIVE1MQnVpbGRlclRh
ZyBtZXRob2RzRm9yOiAnYXMgeWV0IHVuY2xhc3NpZmllZCcgc3RhbXA6ICdh
YiA2LzUvMjAwMiAwMTo0MichDXRhZ05hbWUNCV4gbmFtZSEgIQ0NIUhUTUxC
dWlsZGVyVGFnIG1ldGhvZHNGb3I6ICdhcyB5ZXQgdW5jbGFzc2lmaWVkJyBz
dGFtcDogJ2FiIDYvNS8yMDAyIDAxOjQyJyENdGFnTmFtZTogdGFnTmFtZQ0J
bmFtZSBfIHRhZ05hbWUhICENDSFIVE1MQnVpbGRlclRhZyBtZXRob2RzRm9y
OiAnYXMgeWV0IHVuY2xhc3NpZmllZCcgc3RhbXA6ICdhYiA2LzUvMjAwMiAw
MTozMichDXdyaXRlQ2xvc2VUYWdUb1N0cmVhbTogYVN0cmVhbQ0JYVN0cmVh
bSBuZXh0UHV0QWxsOiAnPC8nOyBuZXh0UHV0QWxsOiBuYW1lOyBuZXh0UHV0
OiAkPiEgIQ0NIUhUTUxCdWlsZGVyVGFnIG1ldGhvZHNGb3I6ICdhcyB5ZXQg
dW5jbGFzc2lmaWVkJyBzdGFtcDogJ2FiIDYvNS8yMDAyIDAxOjQ4JyENd3Jp
dGVPcGVuVGFnVG9TdHJlYW06IGFTdHJlYW0NCW9wZW5lZCBfIHRydWUuDQkN
CWFTdHJlYW0gbmV4dFB1dDogJDw7IG5leHRQdXRBbGw6IG5hbWUuDQlhdHRy
aWJ1dGVzIGlmTm90TmlsOg0JCVthdHRyaWJ1dGVzIGFzc29jaWF0aW9uc0Rv
Og0JCQlbOmFzc29jIHwNCQkJKGFzc29jIHZhbHVlID0gdHJ1ZSkNCQkJCWlm
VHJ1ZTogW2FTdHJlYW0gbmV4dFB1dEFsbDogJyAnLCBhc3NvYyBrZXldDQkJ
CQlpZkZhbHNlOg0JCQkJCVthc3NvYyB2YWx1ZSA9IGZhbHNlIGlmRmFsc2U6
DQkJCQkJCVthU3RyZWFtIG5leHRQdXRBbGw6ICcgJzsNCQkJCQkJCW5leHRQ
dXRBbGw6IGFzc29jIGtleTsNCQkJCQkJCW5leHRQdXRBbGw6ICc9Iic7DQkJ
CQkJCQluZXh0UHV0QWxsOiBhc3NvYyB2YWx1ZSBhc1N0cmluZzsNCQkJCQkJ
CW5leHRQdXQ6ICQiXV1dXS4NCWFTdHJlYW0gbmV4dFB1dDogJD4uISAhDQ0M
DVRlc3RDYXNlIHN1YmNsYXNzOiAjSFRNTEJ1aWxkZXJUZXN0DQlpbnN0YW5j
ZVZhcmlhYmxlTmFtZXM6ICdiICcNCWNsYXNzVmFyaWFibGVOYW1lczogJycN
CXBvb2xEaWN0aW9uYXJpZXM6ICcnDQljYXRlZ29yeTogJ1NlYXNpZGUtRXhw
ZXJpbWVudGFsJyENDSFIVE1MQnVpbGRlclRlc3QgbWV0aG9kc0ZvcjogJ2Fz
IHlldCB1bmNsYXNzaWZpZWQnIHN0YW1wOiAnYWIgNi81LzIwMDIgMDE6NDIn
IQ1hc3NlcnRIdG1sOiBhU3RyaW5nDQlUcmFuc2NyaXB0IGNyOyBzaG93OiBh
U3RyaW5nOyBjcjsgc2hvdzogYiBzdHJlYW0gY29udGVudHMuDQlzZWxmIGFz
c2VydDogYVN0cmluZyA9IGIgc3RyZWFtIGNvbnRlbnRzISAhDQ0hSFRNTEJ1
aWxkZXJUZXN0IG1ldGhvZHNGb3I6ICdhcyB5ZXQgdW5jbGFzc2lmaWVkJyBz
dGFtcDogJ2FiIDYvNS8yMDAyIDAyOjAzJyENc2V0VXANCWIgXyBIVE1MQnVp
bGRlciBuZXchICENDSFIVE1MQnVpbGRlclRlc3QgbWV0aG9kc0ZvcjogJ2Fz
IHlldCB1bmNsYXNzaWZpZWQnIHN0YW1wOiAnYWIgNi81LzIwMDIgMDE6NTAn
IQ10ZXN0Q2hlY2tlZENsb3NlCQ0Jc2VsZiBzaG91bGRudDoNCQlbYiBmb3Jt
Lg0JCQliIHRleHQ6ICdmb28nLg0JCWIgY2xvc2UgZm9ybV0NCQlyYWlzZTog
RXJyb3IuDQlzZWxmIHNob3VsZDoNCQlbYiBmb3JtLg0JCQliIHRleHQ6ICdm
b28nLg0JCQliIHVsLg0JCWIgY2xvc2UgZm9ybV0NCQlyYWlzZTogRXJyb3Iu
ISAhDQ0hSFRNTEJ1aWxkZXJUZXN0IG1ldGhvZHNGb3I6ICdhcyB5ZXQgdW5j
bGFzc2lmaWVkJyBzdGFtcDogJ2FiIDYvNS8yMDAyIDAxOjQxJyENdGVzdEZv
cm0NCWIgZm9ybSBuYW1lOiAnZm9vJzsgYWN0aW9uOiAnYmFyJy4NCQliIGlu
cHV0IHR5cGU6ICd0ZXh0JzsgdmFsdWU6ICdmb28nOyBlbmQuDQkJYiBpbnB1
dCB0eXBlOiAnY2hlY2tib3gnOyBjaGVja2VkOiB0cnVlOyBlbmQuDQliIGNs
b3NlLg0JDQlzZWxmIGFzc2VydEh0bWw6ICc8Zm9ybSBuYW1lPSJmb28iIGFj
dGlvbj0iYmFyIj48aW5wdXQgdHlwZT0idGV4dCIgdmFsdWU9ImZvbyI+PGlu
cHV0IHR5cGU9ImNoZWNrYm94IiBjaGVja2VkPjwvZm9ybT4nLiEgIQ0NIUhU
TUxCdWlsZGVyVGVzdCBtZXRob2RzRm9yOiAnYXMgeWV0IHVuY2xhc3NpZmll
ZCcgc3RhbXA6ICdhYiA2LzUvMjAwMiAwMTozOSchDXRlc3RGb3JtYXR0aW5n
DQliIGI7IGk7IHRleHQ6ICdmb28nOyBjbG9zZTsgY2xvc2UuDQkNCXNlbGYg
YXNzZXJ0SHRtbDogJzxiPjxpPmZvbzwvaT48L2I+Jy4hICENDSFIVE1MQnVp
bGRlclRlc3QgbWV0aG9kc0ZvcjogJ2FzIHlldCB1bmNsYXNzaWZpZWQnIHN0
YW1wOiAnYWIgNi81LzIwMDIgMDI6MDInIQ10ZXN0T3JkZXJlZExpc3QNCWIg
dWwuDQkxIHRvOiAzIGRvOg0JCVs6aSB8IGIgbGk6IGldLg0JYiBjbG9zZSB1
bC4NCQ0Jc2VsZiBhc3NlcnRIdG1sOiAnPHVsPjxsaT4xPC9saT48bGk+Mjwv
bGk+PGxpPjM8L2xpPjwvdWw+JyEgIQ0NIUhUTUxCdWlsZGVyVGVzdCBtZXRo
b2RzRm9yOiAnYXMgeWV0IHVuY2xhc3NpZmllZCcgc3RhbXA6ICdhYiA2LzUv
MjAwMiAwMTozNSchDXRlc3RTaW1wbGVBbmNob3INCWIgYSBocmVmOiAnZm9v
Jy4NCQliIHRleHQ6ICdoZWxsbyB3b3JsZCcuDQliIGNsb3NlLg0JDQlzZWxm
IGFzc2VydEh0bWw6ICc8YSBocmVmPSJmb28iPmhlbGxvIHdvcmxkPC9hPicu
ISAhDQ0MDU9iamVjdCBzdWJjbGFzczogI0hUTUxDbG9zZVRhZ0NoZWNrZXIN
CWluc3RhbmNlVmFyaWFibGVOYW1lczogJ25hbWUgJw0JY2xhc3NWYXJpYWJs
ZU5hbWVzOiAnJw0JcG9vbERpY3Rpb25hcmllczogJycNCWNhdGVnb3J5OiAn
U2Vhc2lkZS1FeHBlcmltZW50YWwnIQ0NIUhUTUxDbG9zZVRhZ0NoZWNrZXIg
bWV0aG9kc0ZvcjogJ2FzIHlldCB1bmNsYXNzaWZpZWQnIHN0YW1wOiAnYWIg
Ni81LzIwMDIgMDE6MjMnIQ1jaGVja0Nsb3NlVGFnOiBhU3RyaW5nDQluYW1l
ID0gYVN0cmluZyBpZkZhbHNlOiBbc2VsZiBlcnJvcjogJ1RyeWluZyB0byBj
bG9zZSAnLCBuYW1lLCAnIHdpdGggJywgYVN0cmluZ10uISAhDQ0hSFRNTENs
b3NlVGFnQ2hlY2tlciBtZXRob2RzRm9yOiAnYXMgeWV0IHVuY2xhc3NpZmll
ZCcgc3RhbXA6ICdhYiA2LzUvMjAwMiAwMToyNichDWRvZXNOb3RVbmRlcnN0
YW5kOiBhTWVzc2FnZQ0JYU1lc3NhZ2Ugc2VsZWN0b3IgbnVtQXJncyA9IDAN
CQlpZlRydWU6IFtzZWxmIGNoZWNrQ2xvc2VUYWc6IGFNZXNzYWdlIHNlbGVj
dG9yXQ0JCWlmRmFsc2U6IFtzdXBlciBkb2VzTm90VW5kZXJzdGFuZDogYU1l
c3NhZ2VdISAhDQ0hSFRNTENsb3NlVGFnQ2hlY2tlciBtZXRob2RzRm9yOiAn
YXMgeWV0IHVuY2xhc3NpZmllZCcgc3RhbXA6ICdhYiA2LzUvMjAwMiAwMToy
MichDW5hbWU6IGFTdHJpbmcNCW5hbWUgXyBhU3RyaW5nISAhDQ==
--1293455216-2133609522-1023270871=:3450--