sig
  module Escape :
    sig
      val ( ~% ) : ('a, unit, string) format -> 'a
      val p : string -> unit
      val string_of_char : char -> string
      val replace_string :
        src:string -> find:string -> replace_with:string -> string
      val replace_chars :
        src:string -> patterns:(char * string) list -> string
      val is_white_space : string -> bool
      val clean_string : string -> string
    end
  module Generic_printer :
    sig
      module Commands :
        sig
          val ( ~% ) : ('a, unit, string) format -> 'a
          module Error :
            sig
              type gravity = [ `error | `fatal_error | `warning ]
              type message =
                  [ `bad_size_specification_in_image of string
                  | `begin_without_arg
                  | `cell_inside_cell
                  | `cell_out_of_table
                  | `closing_brace_matching_begin
                  | `command_shouldnot_have_args of string
                  | `end_of_input_not_in_text of string
                  | `ignored_text_after_verbatim_begin of string
                  | `invalid_end_pattern of string
                  | `item_out_of_list
                  | `malformed_verbatim_begin
                  | `non_matching_end
                  | `nothing_to_end_with_brace
                  | `terminating_with_open_environments of string list
                  | `transformer_lost of string
                  | `unknown_command of string
                  | `unknown_list_style of string
                  | `unknown_quotation_style of string ]
              type location =
                Bracetax_error.location = {
                l_line : int;
                l_char : int;
                l_file : string;
              }
              type error =
                  [ `message of location * gravity * message
                  | `undefined of string ]
              type error_fun = error -> unit
              val mk : location -> gravity -> message -> error
              val to_string :
                location * [< `error | `fatal_error | `warning ] * message ->
                string
            end
          module Raw :
            sig
              type t = [ `bypass | `code | `ignore | `text ]
              val str_of_raw_cmd : t -> string
              val raw_cmd_of_str : string -> t
              val is_raw_cmd : string -> bool
              val default_raw_end : '-> string
            end
          module Link :
            sig
              type kind = [ `generic | `local ]
              type t =
                Bracetax_commands.Link.t = {
                kind : kind;
                linkto : string option;
                other_args : string list;
                contents : Buffer.t;
              }
              val get_kind : string -> [> `generic | `local ] * string
              val create :
                ?kind:kind ->
                ?linkto:string -> ?other_args:string list -> unit -> t
              val start :
                ?url_hook:(string -> string) ->
                string list -> [> `link of t ] * (string -> unit)
              val stop : t -> kind * string option * string option
              val unparse :
                [< `generic | `local ] ->
                string option -> string option -> string
            end
          module Stack :
            sig
              type image_size = [ `none | `wpercent of int | `wpx of int ]
              type environment =
                  [ `authors
                  | `bold
                  | `bypass
                  | `cell of bool * int * [ `center | `left | `right ]
                  | `close_brace
                  | `cmd_begin of string * string list
                  | `cmd_end
                  | `cmd_inside of environment
                  | `code of string list
                  | `em_dash
                  | `en_dash
                  | `header
                  | `horizontal_ellipsis
                  | `ignore
                  | `image of string * image_size * string
                  | `italic
                  | `item
                  | `link of Link.t
                  | `list of
                      [ `itemize | `numbered ] * string list * bool ref
                  | `mono_space
                  | `new_line
                  | `non_break_space
                  | `note
                  | `open_brace
                  | `paragraph
                  | `quotation of string * string
                  | `quote
                  | `section of int * string
                  | `sharp
                  | `subscript
                  | `subtitle
                  | `superscript
                  | `table of int * string option
                  | `text
                  | `title
                  | `unknown of string * string list
                  | `utf8_char of int ]
              type t = environment list ref
              val empty : unit -> 'a list ref
              val push : 'a list ref -> '-> unit
              val pop : 'a list ref -> 'a option
              val head : 'a list ref -> 'a option
              val to_list : 'a ref -> 'a
            end
          module Names :
            sig
              val is_italic : string -> bool
              val is_bold : string -> bool
              val is_mono_space : string -> bool
              val is_superscript : string -> bool
              val is_subscript : string -> bool
              val is_quotation : string -> bool
              val is_non_break_space : string -> bool
              val is_ellipsis : string -> bool
              val is_en_dash : string -> bool
              val is_em_dash : string -> bool
              val is_open_brace : string -> bool
              val is_close_brace : string -> bool
              val is_sharp : string -> bool
              val is_paragraph : string -> bool
              val is_new_line : string -> bool
              val is_utf8_char : string -> bool
              val is_begin : string -> bool
              val is_end : string -> bool
              val is_list : string -> bool
              val list_style :
                (Error.message -> unit) ->
                string -> [> `itemize | `numbered ]
              val is_item : string -> bool
              val is_section : string -> bool
              val section_params : string list -> int * string
              val is_link : string -> bool
              val is_image : string -> bool
              val image_params :
                ?img_hook:(string -> string) ->
                (Error.message -> unit) ->
                string list -> string * Stack.image_size * string
              val is_header : string -> bool
              val is_title : string -> bool
              val is_authors : string -> bool
              val is_subtitle : string -> bool
              val is_table : string -> bool
              val is_cell : string -> bool
              val is_note : string -> bool
              val is_quote : string -> bool
            end
          val non_env_cmd_of_name :
            string -> string list -> Stack.environment
          val env_to_string : Stack.environment -> string
          module Table :
            sig
              type alignment = [ `center | `left | `right ]
              type cell =
                Bracetax_commands.Table.cell = {
                is_head : bool;
                cols_used : int;
                rows_used : int;
                align : alignment;
                cell_text : Buffer.t;
              }
              val default_default_align : alignment
              type table =
                Bracetax_commands.Table.table = {
                col_nb : int;
                label : string option;
                mutable cells : cell list;
                mutable current_cell : cell option;
                caption : Buffer.t;
                default_align : alignment;
              }
              val table_args : string list -> int * string option * alignment
              val cell_arguments :
                table -> string list -> bool * int * int * alignment
              val write : table -> string -> unit
              val start :
                string list ->
                table * [> `table of int * string option ] * (string -> unit)
              val cell_start :
                loc:Error.location ->
                error:Error.error_fun ->
                table -> string list -> [> `cell of bool * int * alignment ]
              val cell_stop :
                loc:'-> error:Error.error_fun -> table -> unit
              module Util :
                sig
                  val nb_rows : table -> int
                  val make_riddle : table -> (int * int) array array
                  val fill_riddle :
                    (int * int) array array ->
                    int -> int -> int -> int -> unit
                  val next_coordinates :
                    (int * int) array array ->
                    table -> int -> int -> int * int
                  type in_table =
                      [ `cell of cell | `filed of int * int | `none ]
                  val matrix_next_coordinates :
                    [> `none ] array array ->
                    table -> int -> int -> int * int
                  val cells_to_matrix :
                    table ->
                    int * int *
                    [> `cell of cell | `filled of int * int | `none ] array
                    array
                end
            end
        end
      module Error :
        sig
          type gravity = [ `error | `fatal_error | `warning ]
          type message =
              [ `bad_size_specification_in_image of string
              | `begin_without_arg
              | `cell_inside_cell
              | `cell_out_of_table
              | `closing_brace_matching_begin
              | `command_shouldnot_have_args of string
              | `end_of_input_not_in_text of string
              | `ignored_text_after_verbatim_begin of string
              | `invalid_end_pattern of string
              | `item_out_of_list
              | `malformed_verbatim_begin
              | `non_matching_end
              | `nothing_to_end_with_brace
              | `terminating_with_open_environments of string list
              | `transformer_lost of string
              | `unknown_command of string
              | `unknown_list_style of string
              | `unknown_quotation_style of string ]
          type location =
            Bracetax_error.location = {
            l_line : int;
            l_char : int;
            l_file : string;
          }
          type error =
              [ `message of location * gravity * message
              | `undefined of string ]
          type error_fun = error -> unit
          val mk : location -> gravity -> message -> error
          val to_string :
            location * [< `error | `fatal_error | `warning ] * message ->
            string
        end
      module Signatures :
        sig
          module Error :
            sig
              type gravity = [ `error | `fatal_error | `warning ]
              type message =
                  [ `bad_size_specification_in_image of string
                  | `begin_without_arg
                  | `cell_inside_cell
                  | `cell_out_of_table
                  | `closing_brace_matching_begin
                  | `command_shouldnot_have_args of string
                  | `end_of_input_not_in_text of string
                  | `ignored_text_after_verbatim_begin of string
                  | `invalid_end_pattern of string
                  | `item_out_of_list
                  | `malformed_verbatim_begin
                  | `non_matching_end
                  | `nothing_to_end_with_brace
                  | `terminating_with_open_environments of string list
                  | `transformer_lost of string
                  | `unknown_command of string
                  | `unknown_list_style of string
                  | `unknown_quotation_style of string ]
              type location =
                Bracetax_error.location = {
                l_line : int;
                l_char : int;
                l_file : string;
              }
              type error =
                  [ `message of location * gravity * message
                  | `undefined of string ]
              type error_fun = error -> unit
              val mk : location -> gravity -> message -> error
              val to_string :
                location * [< `error | `fatal_error | `warning ] * message ->
                string
            end
          type writer =
            Bracetax_signatures.writer = {
            w_write : string -> unit;
            w_error : Error.error -> unit;
          }
          val make_writer :
            write:(string -> unit) -> error:(Error.error -> unit) -> writer
          type printer =
            Bracetax_signatures.printer = {
            print_comment : Error.location -> string -> unit;
            print_text : Error.location -> string -> unit;
            enter_cmd : Error.location -> string -> string list -> unit;
            leave_cmd : Error.location -> unit;
            terminate : Error.location -> unit;
            is_raw : string -> bool;
            default_raw_end : string -> string;
            enter_raw : Error.location -> string -> string list -> unit;
            print_raw : Error.location -> string -> unit;
            leave_raw : Error.location -> unit;
            error : Error.error -> unit;
          }
        end
      module Escape :
        sig
          val ( ~% ) : ('a, unit, string) format -> 'a
          val p : string -> unit
          val string_of_char : char -> string
          val replace_string :
            src:string -> find:string -> replace_with:string -> string
          val replace_chars :
            src:string -> patterns:(char * string) list -> string
          val is_white_space : string -> bool
          val clean_string : string -> string
        end
      type write_fun = string -> unit
      type string_of_args_fun = string list -> string
      type string_fun = unit -> string
      type transform_string_fun = string -> string
      type output_t =
        Bracetax_generic_printer.output_t = {
        start_text : string_fun;
        terminate : string_fun;
        start_raw : Commands.Raw.t -> string option -> string;
        raw_line : Commands.Raw.t -> transform_string_fun;
        stop_raw : Commands.Raw.t -> string option -> string;
        line : transform_string_fun;
        comment_line : transform_string_fun;
        quotation_open : string -> string;
        quotation_close : string -> string;
        start_italic : string_fun;
        start_bold : string_fun;
        start_type : string_fun;
        start_sup : string_fun;
        start_sub : string_fun;
        stop_italic : string_fun;
        stop_bold : string_fun;
        stop_type : string_fun;
        stop_sup : string_fun;
        stop_sub : string_fun;
        list_start : [ `itemize | `numbered ] -> string;
        list_first_item : [ `itemize | `numbered ] -> string;
        list_item : [ `itemize | `numbered ] -> string;
        list_stop : [ `itemize | `numbered ] -> string;
        section_start : int -> string -> string;
        section_stop : int -> string -> string;
        paragraph : string_fun;
        new_line : string_fun;
        non_break_space : string_fun;
        horizontal_ellipsis : string_fun;
        en_dash : string_fun;
        em_dash : string_fun;
        open_brace : string_fun;
        close_brace : string_fun;
        sharp : string_fun;
        utf8_char : int -> string;
        link : Commands.Link.kind -> string option -> string option -> string;
        start_header : string_fun;
        start_title : string_fun;
        start_authors : string_fun;
        start_subtitle : string_fun;
        stop_header : string_fun;
        stop_title : string_fun;
        stop_authors : string_fun;
        stop_subtitle : string_fun;
        start_image : string -> Commands.Stack.image_size -> string -> string;
        stop_image : string -> Commands.Stack.image_size -> string -> string;
        print_table : (string -> unit) -> Commands.Table.table -> unit;
        start_note : string_fun;
        stop_note : string_fun;
        start_quote : string_fun;
        stop_quote : string_fun;
      }
      type t =
        Bracetax_generic_printer.t = {
        stack : Commands.Stack.t;
        mutable write : write_fun;
        write_mem : write_fun Stack.t;
        mutable started_text : bool;
        mutable inside_header : bool;
        mutable current_table : Commands.Table.table option;
        error : Error.error -> unit;
        mutable loc : Error.location;
        mutable output : output_t;
      }
      module CS :
        sig
          type image_size = [ `none | `wpercent of int | `wpx of int ]
          type environment =
              [ `authors
              | `bold
              | `bypass
              | `cell of bool * int * [ `center | `left | `right ]
              | `close_brace
              | `cmd_begin of string * string list
              | `cmd_end
              | `cmd_inside of environment
              | `code of string list
              | `em_dash
              | `en_dash
              | `header
              | `horizontal_ellipsis
              | `ignore
              | `image of string * image_size * string
              | `italic
              | `item
              | `link of Commands.Link.t
              | `list of [ `itemize | `numbered ] * string list * bool ref
              | `mono_space
              | `new_line
              | `non_break_space
              | `note
              | `open_brace
              | `paragraph
              | `quotation of string * string
              | `quote
              | `section of int * string
              | `sharp
              | `subscript
              | `subtitle
              | `superscript
              | `table of int * string option
              | `text
              | `title
              | `unknown of string * string list
              | `utf8_char of int ]
          type t = environment list ref
          val empty : unit -> 'a list ref
          val push : 'a list ref -> '-> unit
          val pop : 'a list ref -> 'a option
          val head : 'a list ref -> 'a option
          val to_list : 'a ref -> 'a
        end
      val spr : ('a, unit, string) format -> 'a
      val create : writer:Bracetax_signatures.writer -> output_t -> t
      val start_environment :
        ?is_begin:bool ->
        t -> Error.location -> string -> string list -> unit
      val start_command :
        t -> Error.location -> string -> string list -> unit
      val stop_command : t -> Error.location -> unit
      val handle_comment_line : t -> Error.location -> string -> unit
      val handle_text : t -> Error.location -> string -> unit
      val terminate : t -> Error.location -> unit
      val start_raw_mode :
        t -> Error.location -> string -> string list -> unit
      val handle_raw_text : t -> Error.location -> string -> unit
      val stop_raw_mode : t -> Error.location -> unit
      val build :
        ?print_comments:bool ->
        writer:Signatures.writer ->
        output_funs:output_t -> unit -> Signatures.printer
    end
  val spr : ('a, unit, string) format -> 'a
  type inside =
    Bracetax_TOC_output.inside = {
    mutable current : (int * string option) option;
    title_buffer : Buffer.t;
    mutable sections : (int * string option * string) list;
    make_links : [ `always | `never | `when_labeled ];
    list_type : [ `enum | `item ];
    numbering : [ `integers | `none ];
  }
  val store_opt : inside -> string -> unit -> string
  val store_opt_nonunit : inside -> string -> string
  val start_section : inside -> int -> string -> string
  val stop_section : inside -> '-> '-> string
  val termination : inside -> unit -> string
  val create :
    ?make_links:[ `always | `never | `when_labeled ] ->
    ?list_type:[ `enum | `item ] ->
    ?numbering:[ `integers | `none ] -> unit -> Generic_printer.output_t
end