aboutsummaryrefslogtreecommitdiff
path: root/lib/render/escape.mli
blob: ee1e20b9172b060dbadcab5ff6ce2a89ac7fd6fe (plain) (blame)
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
(** Per-flavour escaping for the template engine, plus RFC 5545 line folding.

    Knows nothing about calendars. Pure and total: every function is defined on
    every string, and none reads the clock, the environment or the filesystem. *)

(** The seven escaping modes. Markdown, AsciiDoc and plain text all use
    [None_]: their metacharacter sets are context-dependent, and escaping
    them aggressively produces worse output than not escaping at all (spec
    section 5). This is a documented limitation of those flavours. *)
type flavour = Latex | Typst | Groff | Html | Xml | Ics | None_

val all : flavour list
val to_string : flavour -> string
val of_string : string -> flavour option

(** [of_extension ".tex"] is [Some Latex]. Returns [None] for an unrecognised
    extension: the caller must treat that as an error, never as a fallback to
    [None_] (spec section 5 -- guessing wrong here produces malformed output
    that looks fine until it does not). *)
val of_extension : string -> flavour option

(** Escape one interpolated value for [flavour]. *)
val apply : flavour -> string -> string

(** Fold one unfolded content line per RFC 5545 section 3.1: at most 75 octets
    per line, continuation lines prefixed with one space, CRLF terminators,
    never splitting a UTF-8 sequence. The returned string ends with CRLF. *)
val fold_ics : string -> string