package forester

  1. Overview
  2. Docs
Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source

Source file Render_TeX_like.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
open Forester_prelude
open Forester_core

module Printer =
struct
  module P0 =
  struct
    type out = Format.formatter
    let text txt fmt =
      Format.fprintf fmt "%s" txt
  end

  include Printer_kit.Kit (P0)

  let contents (printer : t) : string =
    Format.asprintf "%a" (fun fmt _ -> printer fmt) ()
end

type cfg = {tex : bool}

(* TeXBook Ch. 3 *)
type cs_type = Word | Symbol

let cs_symbol_rx = Str.regexp {|^[^A-Za-z]$|}

let cs_type name =
  if Str.string_match cs_symbol_rx name 0 then
    Symbol
  else
    Word

let cs_separator =
  function
  | Word -> Printer.space
  | Symbol -> Printer.nil

let rec render_node ~cfg : Sem.node Range.located -> Printer.t =
  fun located ->
  match located.value with
  | Sem.Text txt | Sem.Verbatim txt ->
    Printer.text txt
  | Sem.Math (mode, xs) ->
    render ~cfg xs;
  | Sem.Xml_tag (_, _, body) ->
    render ~cfg body
  | Sem.TeX_cs (Symbol x) ->
    Printer.text @@ Format.sprintf "\\%c" x
  | Sem.TeX_cs (Word x) ->
    Printer.text @@ Format.sprintf "\\%s " x
  | node ->
    Reporter.fatalf ?loc:located.loc Type_error "Render_TeX_like: cannot render this kind of object"

and render ~cfg =
  Printer.iter (render_node ~cfg)
OCaml

Innovation. Community. Security.