package forester

  1. Overview
  2. Docs

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
OCaml

Innovation. Community. Security.