caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] Format & breaking
@ 2006-07-08 19:38 Jonathan Roewen
  2006-07-09  7:04 ` Nicolas Pouillard
  0 siblings, 1 reply; 2+ messages in thread
From: Jonathan Roewen @ 2006-07-08 19:38 UTC (permalink / raw)
  To: OCaml

Hi,

I have a small question about format module, and pretty-printing XHTML.

Basically, I want to print something like:

<div>
  <p>....</p>
  <p>....</p> // when content fits on a single line..
  <p> // when content doesn't fit on a single line...
    ....
  </p>
</div>

but I can't get it to generate that. I was reading about the
structural hovboxes, but the behaviour it describes doesn't seem to
work -- at least with xhtml tags.

For example, the above would be printed as:
<div>
  <p>....</p>
  <p>....</p> // when content fits on a single line..
  <p> // when content doesn't fit on a single line...
    ....</p></div>

which is frustrating. Or else I'm just misunderstanding the semantics
of the Format module, which wouldn't surprise me ;-)

Jonathan


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [Caml-list] Format & breaking
  2006-07-08 19:38 [Caml-list] Format & breaking Jonathan Roewen
@ 2006-07-09  7:04 ` Nicolas Pouillard
  0 siblings, 0 replies; 2+ messages in thread
From: Nicolas Pouillard @ 2006-07-09  7:04 UTC (permalink / raw)
  To: Jonathan Roewen; +Cc: OCaml

On 7/8/06, Jonathan Roewen <jonathan.roewen@gmail.com> wrote:
> Hi,
>
> I have a small question about format module, and pretty-printing XHTML.
>
> Basically, I want to print something like:
>
> <div>
>   <p>....</p>
>   <p>....</p> // when content fits on a single line..
>   <p> // when content doesn't fit on a single line...
>     ....
>   </p>
> </div>
>
> but I can't get it to generate that. I was reading about the
> structural hovboxes, but the behaviour it describes doesn't seem to
> work -- at least with xhtml tags.
>
> For example, the above would be printed as:
> <div>
>   <p>....</p>
>   <p>....</p> // when content fits on a single line..
>   <p> // when content doesn't fit on a single line...
>     ....</p></div>
>
> which is frustrating. Or else I'm just misunderstanding the semantics
> of the Format module, which wouldn't surprise me ;-)
>

To do that you need two boxes:

"@[<hv0>@[<hv2><p>@,...@]@,</p>@]"

Here a more complete example:

type xml = Elt of string * xml list | Pcdata of string

let pp = Format.fprintf

let rec print_elt f =
  function
  | Elt (tag, contents) ->
      pp f "@[<hv0>@[<hv2><%s>@,%a@]@,</%s>@]"
        tag print_list_elts contents tag
  | Pcdata s ->
      Format.pp_print_string f s

and print_list_elts f =
    let rec loop =
      function
      | [] -> ()
      | x::xs -> (pp f "@,"; print_elt f x; loop xs) in
    function
    | [] -> ()
    | [x] -> print_elt f x
    | x::xs -> (print_elt f x; loop xs)

let tree =
  Elt ("div", [
     Elt ("p", [Pcdata "a short text"]);
     Elt ("p", [Pcdata "a
looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong
text"])
  ])

let () = Format.printf "%a@." print_elt tree

Regards,

-- 
Nicolas Pouillard


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-07-09  7:04 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-07-08 19:38 [Caml-list] Format & breaking Jonathan Roewen
2006-07-09  7:04 ` Nicolas Pouillard

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).