data Doc = <document> (<title>(String) .
                       Chp*
                      );
data Chp = <chapter>( 
                      <title>(String) .
                      Paragraphs .
                      Sec*
                    );
data Sec = <section>( <title>(String). Paragraphs );


data Paragraphs = (<para>(V) | <note>(V)) . Paragraphs | $;

data V = (String | <emph>(String) ) . V | $ ;


main(<document>( <title>(t::String) . (chapters :: Chp*) )) = 
 <html>(
  <head>(<title>("Test")) .
  <body>(<h1>(t).
    f( chapters )
  )
 );

f($) = $;
f( <chapter>( <title>(t :: String) . (p :: Paragraphs) . (secs :: Sec*) ) . (chapters :: Chp*) ) = 
 <h2>(t) .
 h(p) .
 g(secs) . 
 f(chapters);

g($) = $;
g(<section>( <title>(t :: String) . (p :: Paragraphs) ) .  (secs :: Sec*) ) = 
  <h3>(t) . 
  h(p) . 
  g(secs);

h(<note>(v :: V)) = <p>{class: "note"} (k(v));
h(<para>(v :: V)) = <p>(k(v));

k($) = $;
k((t :: (_ . String)). (tt :: (<emph>(String). V | $))) = t . k'(tt);
k(<emph>(s :: String) .  (tt :: ((String.V) | $))) = <em>(s) . k(tt);

k'($) = $;
k'(<emph>(s :: String) . (tt :: ((String.V) | $))) = <em>(s) . k(tt);
