[Ur] Defining new tags like <pre>...
Adam Chlipala
adamc at impredicative.com
Fri Mar 5 08:24:36 EST 2010
Michael Stone wrote:
> Second, in the course of playing with Ur/Web over the last few hours,
> I encountered a need to produce an HTML<pre> tag in a page.
>
> I was able to accomplish this objective by adding an entry to
> lib/ur/basis.urs like so:
>
> val div : bodyTag boxAttrs
> val span : bodyTag boxAttrs
> + val pre : bodyTag boxAttrs
>
> Unfortunately, I don't fully understand why making this change has the
> desired effect. Would you mind saying a few words about why defining
> this value "just works"?
>
The short answer is: the Ur/Web compiler is specialized to the standard
library. It compiles anything with a tag type like an XML tag. You
gave <pre> a tag type, so you got the behavior you wanted. :-)
It's worth pointing out that you will still encounter some friction from
the optimizer, which doesn't know that whitespace inside <pre> has
special semantics. Every sequence of whitespace will be collapsed into
one. More special compiler support would really be needed to avoid
this. (Or I could turn off that optimization, but it's just so much
fun. :])
I'll also point out that it's easy to implement a function that provides
<pre>-like functionality without a native browser tag, by replacing
newlines with <br>, spaces with one of a variety of tricks for explicit
space in HTML, etc..
More information about the Ur
mailing list