(** 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 six 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 | 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