[web-devel] VXML - validating XHTML library
P. R. Stanley
prstanley at ntlworld.com
Fri Sep 12 20:05:04 EDT 2008
Just out of interest, why DTD and not XSchema? I would have thought
the latter were more complete in many respects.
Paul
At 00:15 13/09/2008, you wrote:
>Hi @ll.
>
>Those of you reading the haskelcafe mailinglist already know that I've
>been working on vxml. It's a library letting you write XHTML code
>validating the result at compilation time against a given dtd.
>
>How does it work?
>Given a doctype like this :
>
> <!ELEMENT root (y*,z)*>
> <!ELEMENT y EMPTY>
> <!ELEMENT z EMPTY>
>
>results in a set of state transformation rules. A new empty root tag
>starts with the State1. From that on it's fed with either y or z (using
>functional dependencies) resulting a new state 1 or 7. If you add an
>subelement y the state changes to 7 which is not endable forcing you to
>add another element. etc..
>
> State 1
> endable : True
> y -> St 7
> z -> St 1
>
> State2 :7
> endable : False
> y -> St 7
> z -> St 1
>
>Use this on a xhtml dtd and you'll get about 500 different states and a
>lot of instances. Luckily most elements are described this way:
>(PCDATA|div|form|...)*
>this means that the sate does not change after an element which should
>enable you to use foldr functions or such without type hackery (? I have
>to verify this)..
>
>Validation errors are denoted this way:
>
> * wrong element (1):
> "No instance for (Consume State4 (Elem B_T) st')"
>
> * more elements expected (1):
> "No instance for (ElEndable Root_T State4)"
>
> * invalid attribute:
> "No instance for (AttrOk Root_T AAttr_A)"
>
> * duplicate attribute:
> "No instance for (Text.XML.Validated.Types.DuplicateAttribute
> A_T AAttr_A)"
>
> * missing required attributes:
> "No instance for (Text.XML.Validated.Types.RequiredAttributesMissing
> Root_T (HCons (A RootAttr_A) HNil))"
>
>
>Using ghc head you can rebind >>= and >> and use a do like notation:
>
> #if (__GLASGOW_HASKELL__ > 608)
> #include "vxmldos.h"
> tDo $ runHtmlDoc $ vdo
> head $ title $ text "text"
> body $ vdo
> script $ X.type "text/javascript" >> text "document.writeln('hi');"
> h2 $ text "That's a headline, hello and how do you do?"
> -- br e eg a <br/> is not allowed here
> div $ vdo
> onclick "alert('clicked');"
> styleA "color:#F79"
> text "text within the div"
> div e
> return "That's nice, isn't it?"
>
> resulting in:
> returned value : "That's nice, isn't it?"
> xml : <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
> <html><head><title>text</title></head><body><script
> type="text/javascript">document.writeln('hi');</script><h2>That's a
> headline, hello and how do you do?</h2><div
> onclick="alert('clicked');" style="color:#F79">text within the
> div</div><div/></body></html>
>
>where vxmldos.h includes some macros rebinding >>=, >>, return and lift
>
>If you want to jump in, test and give some feedback you're welcome.
>Grab the code from git://mawercer.de/vxml
>If you feel there is some documentation missing just ask.
>
>Sincerly
> Marc Weber
>_______________________________________________
>web-devel mailing list
>web-devel at haskell.org
>http://www.haskell.org/mailman/listinfo/web-devel
More information about the web-devel
mailing list