Source file wktxt_output.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
open Wktxt_type

let rec output_document out doc :(unit)= List.iter (output_block out) doc

and display_item : 'a. ((string -> unit) -> 'a -> unit) -> string -> (string -> unit) -> 'a list -> unit =
  fun displayer tag_name out content ->
    begin
    out ("<" ^ tag_name ^ ">") ;
    List.iter (displayer out) content ;
    out ("</" ^ tag_name ^ ">")
    end

and output_inline out inl :(unit)=
  match inl with
  | Bold (content) ->
    display_item output_inline "b" out content
  | Italic (content) ->
    display_item output_inline "i" out content
  | String str | Link (_, str) -> out str

and output_block out blck :(unit)=
  match blck with
  | Header (lvl, content) ->
    display_item output_inline ("h" ^ string_of_int lvl) out content
  | Hrule -> out "<hr>"
  | Paragraph (content) ->
    display_item output_inline "p" out content
  | List (content_list) ->
    display_item (display_item output_block "li") "ul" out content_list
  | NumList (content_list) ->
    display_item (display_item output_block "li") "ol" out content_list
  | DefList (content_list) ->
    let output_def_list_item out item = match item with
      | ([],[]) -> ()
      | (term, []) -> display_item output_inline "dt" out term
      | ([], desc) -> display_item output_block "dd" out desc
      | (term, desc) ->
        display_item output_inline "dt" out term ;
        display_item output_block "dd" out desc
    in
    display_item output_def_list_item "dl" out content_list
  | Table (title, content_list) ->
    out "<table>" ;
    if title <> [] then display_item output_inline "caption" out title ;
    let output_table_block out table_block = match table_block with
      | TableHead content -> display_item output_inline "th" out content
      | TableItem content -> display_item output_inline "td" out content
    in
    display_item (display_item output_table_block "tr") "tbody" out content_list ;
    out "</table>"