Source file RenderJson.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
open Prelude
open Core
module E = RenderEff.Perform
module Printer =
struct
module P0 =
struct
type out = Format.formatter
let text txt fmt =
Format.fprintf fmt "%s" txt
end
include PrinterKit.Kit (P0)
let contents (printer : t) : string =
Format.asprintf "%a" (fun fmt _ -> printer fmt) ()
end
let squares x =
Printer.seq ~sep:Printer.space
[Printer.text "["; x; Printer.text "]"]
let braces x =
Printer.seq ~sep:Printer.space
[Printer.text "{"; x; Printer.text "}"]
let comma = Printer.text ", "
let render_string_literal body =
Printer.seq [Printer.text "\""; body; Printer.text "\""]
let render_key k p =
Printer.seq ~sep:Printer.space
[render_string_literal @@ Printer.text k;
Printer.text ":";
p]
let escape =
Str.global_substitute (Str.regexp {|"|}) @@
fun _ -> {|\"|}
let rec render nodes : Printer.t =
Printer.iter render_node nodes
and render_node : Sem.node -> Printer.t =
function
| Sem.Text txt -> Printer.text @@ escape @@ StringUtil.sentence_case txt
| Sem.Tag (_,body) -> render body
| Sem.Link {title; _} -> render title
| Sem.Transclude _ | Sem.EmbedTeX _ | Sem.Math _ | Sem.Block _ | Sem.Query _ -> Printer.nil
let render_doc (doc : Sem.doc) : Printer.t =
match doc.addr with
| None -> Printer.nil
| Some addr ->
render_key addr @@ braces @@
Printer.iter ~sep:comma (fun (k, x) -> render_key k x)
["title",
begin
match doc.title with
| None -> Printer.text "null"
| Some title -> render_string_literal @@ render title
end;
"taxon",
begin
match doc.taxon with
| None -> Printer.text "null"
| Some taxon -> render_string_literal @@ Printer.text @@ StringUtil.sentence_case taxon
end;
"route",
render_string_literal @@ Printer.text @@
E.route addr]
let render_docs (docs : Sem.doc list) : Printer.t =
braces @@ Printer.iter ~sep:comma render_doc docs