From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from mail4-relais-sop.national.inria.fr (mail4-relais-sop.national.inria.fr [192.134.164.105]) by yquem.inria.fr (Postfix) with ESMTP id 10140BBAF for ; Tue, 23 Nov 2010 16:25:21 +0100 (CET) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjkDACNr60zU4367kGdsb2JhbACDTpBjjTd9FQEBAQEJCQwHEQMfrQmQcQKBIHOCQ3MEhw2GYA X-IronPort-AV: E=Sophos;i="4.59,242,1288566000"; d="scan'208,217";a="80054935" Received: from moutng.kundenserver.de ([212.227.126.187]) by mail4-smtp-sop.national.inria.fr with ESMTP; 23 Nov 2010 16:25:19 +0100 Received: from office1.lan.sumadev.de (dslb-094-219-215-222.pools.arcor-ip.net [94.219.215.222]) by mrelayeu.kundenserver.de (node=mrbap0) with ESMTP (Nemesis) id 0McxnO-1P2hMy1bRi-00IHho; Tue, 23 Nov 2010 16:25:18 +0100 Received: from [192.168.5.106] (dslb-094-219-215-222.pools.arcor-ip.net [94.219.215.222]) by office1.lan.sumadev.de (Postfix) with ESMTPA id 160BF5F701; Tue, 23 Nov 2010 16:25:18 +0100 (CET) Subject: Re: [Caml-list] [ANN] HTCaML / CaSS From: Gerd Stolpmann To: Thomas Gazagnaire Cc: caml-list@yquem.inria.fr In-Reply-To: <1290520881.4734.124.camel@saorge.inria.fr> References: <1290517554.4734.103.camel@saorge.inria.fr> <1681920730.765376.1290518571583.JavaMail.root@zmbs4.inria.fr> <1290520881.4734.124.camel@saorge.inria.fr> Content-Type: text/plain; charset="UTF-8" Date: Tue, 23 Nov 2010 16:25:17 +0100 Message-ID: <1290525917.16005.384.camel@thinkpad> Mime-Version: 1.0 X-Mailer: Evolution 2.28.1 Content-Transfer-Encoding: 7bit X-Provags-ID: V02:K0:4ONxf8WiPVnYLBA5/F4FiAY7hcztBrGDVy422dwHYuA suu5HtvEvpfFceVd5cROeH9RB/12+twXBta/LBBlrr6U2knx9Y +c+5p9K/Pyk06Pdye4MaNm6SKo4ZrFsN8/epD7WSkGJS+fyPEr u3DH5x5JNDMqw6RxdcLJSn/5bdmfhjsplN1qQ6UT+vuCv3st7D KksplauvmRXHhciv+mnwg== X-Spam: no; 0.00; gerd:01 stolpmann:01 pxp:01 ocaml:01 pxp-:01 syntax:01 pxp:01 runtime:01 error-prone:01 foo:01 foo:01 gerd:01 syntax:01 node:01 nodes:01 Am Dienstag, den 23.11.2010, 15:01 +0100 schrieb Thomas Gazagnaire: > > Have you seen that there is a preprocessor for PXP that allows you to > > embed XML in ocaml? > > > > http://projects.camlcity.org/projects/dl/pxp-1.2.1/doc/manual/html/ref/Intro_preprocessor.html > > > > No, I didn't know about that. And there is also a syntax extension in > Eliom to do the same kind of things. > > However, the two things I am really happy with HTCaML (and apparently it > is not possible to do the same thing in PXP nor Eliom) are : > i) you can easily mix auto-generated and hand-crafted code to create > XHTML fragments (no more tedious conversion functions); and Don't know whether this is good or bad - having everything as XML means you can also type-check the emitted XML (e.g. against the DTD). It's only at runtime, but might still be helpful. In PXP you would have to use a custom XML writer to merge in hand-crafted HTML. Btw, there are some subtle differences between real XHTML (with an XML-ish content type) and "HTML that looks like XML". For example, in real XML SCRIPT or STYLE sections need to be quoted like other data sections whereas HTML sees these as exceptions to the normal rules (e.g. in XML and in HTML). This is something that makes mixing in HTML error-prone. > ii) you can write in the same part of your file (ie. in the same module) > the css and xhtml generator for a given type definition. That means that > you can do web-programming as you are used to : think about type > definitions first, and then write your code to reason by induction on > these defintions. > > for example, you can have: > > type foo = (* some random type *) > let html_of_foo : Html.t = (* some random code of type Html.t = (`a > Xml.frag as `a) Xmlm.frag list *) > let foo_css = (* some random, possibly nested, CSS *) > > and : > > type bar = { foo : foo; complex types } with html > let bar_css = <:css< .foo { $foo_css$; ... } >> > > In the later case, you don't have to write manually the code for > html_of_bar as it will be done automatically by HTCaML, by looking at > the structure of bar; and it will pick your own definition of > html_of_foo. Also, nested declarations in bar_css will be automatically > unrolled to generate valid CSS fragments. Interesting idea - data-centric HTML generation. Gerd > > > I'm happily using this for dynamic web pages. The syntax is more > > light-weight, though, e.g. you write > > > I don't really call this dynamic web pages, but yea, that's the same > idea :-) > > -- > Thomas > > > >
[ ... ] > > > > instead of
...
, and there is a distinction in the syntax > > between node and list of nodes, e.g. > > > >
list > > > > but > > > >
[ node1 node2 ... ] > > > > Gerd > > > > Am Dienstag, den 23.11.2010, 14:05 +0100 schrieb Thomas Gazagnaire: > > > I am happy to announce the first official release of HTCaML[1] and > > > CaSS[2], two small libraries which make the writing of static web pages > > > easy in OCaml. > > > > > > HTCaML enables the embedding of XHTML fragments in your OCaml program > > > (the EDSL translates directly to Xmlm) using quotations. It also allows > > > you to auto-generate boilerplate XHTML fragments from type definitions. > > > In the same way, CaSS enables the embedding of CSS fragments in your > > > OCaml program using quotations. > > > > > > A quick example: > > > > > > module Box = struct > > > type t = { title: string; date: string; contents: Html.t } with html > > > let css fg bg = <:css< > > > color: $fg$; > > > background-color: $bg$; > > > $Css.rounded$; > > > .title { color: $bg$; background-color: $fg$; } > > > >> > > > end > > > > > > let my_html boxes = Html.to_string <:html< > > > > > > > > >
> > > $list:List.map Box.html_of_t boxes$ > > >
> > > > > > > > > >> > > > > > > let my_css = Css.to_string <:css< > > > .boxes { $Box.css <:css< blue >> <:css< white >> $ } > > > >> > > > > > > You can find a quick introduction to HTCaML (and maybe soon to CaSS) on > > > the mirage blog[3]. > > > > > > Cheers, > > > Thomas > > > > > > [1] https://github.com/samoht/htcaml > > > [2] https://github.com/samoht/cass > > > [3] http://www.openmirage.org/blog/introduction-to-htcaml > > > > > > _______________________________________________ > > > Caml-list mailing list. Subscription management: > > > http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list > > > Archives: http://caml.inria.fr > > > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > > > Bug reports: http://caml.inria.fr/bin/caml-bugs > > > > > > > > > > _______________________________________________ > Caml-list mailing list. Subscription management: > http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list > Archives: http://caml.inria.fr > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs > -- ------------------------------------------------------------ Gerd Stolpmann, Bad Nauheimer Str.3, 64289 Darmstadt,Germany gerd@gerd-stolpmann.de http://www.gerd-stolpmann.de Phone: +49-6151-153855 Fax: +49-6151-997714 ------------------------------------------------------------