@@ -114,6 +114,7 @@ type t = {
114114 os_type_enabled : bool ;
115115 set_variables : (string * string ) list ;
116116 unset_variables : string list ;
117+ delim : string option ;
117118 value : value ;
118119}
119120
@@ -160,19 +161,61 @@ let rec error_padding = function
160161 let xs = error_padding xs in
161162 x :: xs
162163
163- let pp_errors ppf t =
164+ let compute_delimiter ~base_delim outputs =
165+ let s =
166+ Format. asprintf " %a" (Format. pp_print_list (Output. pp ~pad: 0 )) outputs
167+ in
168+ let is_inadequate delim =
169+ Astring.String. is_infix ~affix: (" ]" ^ delim ^ " }" ) s
170+ in
171+ let rec loop n =
172+ let delim =
173+ match n with 0 -> base_delim | n -> Format. sprintf " %s_%d" base_delim n
174+ in
175+ if is_inadequate delim then loop (n + 1 ) else delim
176+ in
177+ loop 0
178+
179+ let pp_error ?syntax ?delim ppf outputs =
180+ match syntax with
181+ | Some Syntax. Markdown ->
182+ Fmt. pf ppf " ```\n ```mdx-error\n %a\n "
183+ Fmt. (list ~sep: (any " \n " ) Output. pp)
184+ outputs
185+ | Some Syntax. Mli | Some Syntax. Mld ->
186+ let err_delim = compute_delimiter ~base_delim: " err" outputs in
187+ Fmt. pf ppf " ]%a[\n {%s@mdx-error[\n %a\n ]%s}"
188+ Fmt. (option string )
189+ delim err_delim
190+ Fmt. (list ~sep: (any " \n " ) Output. pp)
191+ outputs err_delim
192+ | _ -> ()
193+
194+ let has_output t =
195+ match t.value with
196+ | OCaml { errors = [] ; _ } -> false
197+ | OCaml { errors = _ ; _ } -> true
198+ | _ -> false
199+
200+ let pp_value ?syntax ppf t =
201+ let delim = t.delim in
164202 match t.value with
165203 | OCaml { errors = [] ; _ } -> ()
166204 | OCaml { errors; _ } ->
167205 let errors = error_padding errors in
168- Fmt. pf ppf " ```mdx-error\n %a\n ```\n "
169- Fmt. (list ~sep: (any " \n " ) Output. pp)
170- errors
206+ pp_error ?syntax ?delim ppf errors
171207 | _ -> ()
172208
173- let pp_footer ?syntax ppf _ =
209+ let pp_footer ?syntax ppf t =
210+ let delim =
211+ if has_output t then (
212+ pp_value ?syntax ppf t;
213+ None )
214+ else t.delim
215+ in
174216 match syntax with
175- | Some Syntax. Mli | Some Syntax. Mld -> Fmt. string ppf " ]}"
217+ | Some Syntax. Mli | Some Syntax. Mld ->
218+ Fmt. pf ppf " ]%a}" Fmt. (option string ) delim
176219 | Some Syntax. Cram -> Fmt. string ppf " \n "
177220 | Some Syntax. Markdown | None -> Fmt. string ppf " ```\n "
178221
@@ -216,7 +259,9 @@ let pp_header ?syntax ppf t =
216259 | [] -> ()
217260 | labels -> Fmt. pf ppf " %a" (pp_labels ?syntax) labels
218261 in
219- Fmt. pf ppf " {%a%a[" pp_lang_header lang_headers pp_labels other_labels
262+ Fmt. pf ppf " {%a%a%a["
263+ Fmt. (option string )
264+ t.delim pp_lang_header lang_headers pp_labels other_labels
220265 | Some Syntax. Cram -> pp_labels ?syntax ppf t.labels
221266 | Some Syntax. Markdown | None ->
222267 if t.legacy_labels then
@@ -231,8 +276,7 @@ let pp_header ?syntax ppf t =
231276let pp ?syntax ppf b =
232277 pp_header ?syntax ppf b;
233278 pp_contents ?syntax ppf b;
234- pp_footer ?syntax ppf b;
235- pp_errors ppf b
279+ pp_footer ?syntax ppf b
236280
237281let directory t = t.dir
238282let file t = match t.value with Include t -> Some t.file_included | _ -> None
@@ -415,7 +459,7 @@ let infer_block ~loc ~config ~header ~contents ~errors =
415459 let + () = check_no_errors ~loc errors in
416460 Raw { header })
417461
418- let mk ~loc ~section ~labels ~legacy_labels ~header ~contents ~errors =
462+ let mk ~loc ~section ~labels ~legacy_labels ~header ~delim ~ contents ~errors =
419463 let block_kind =
420464 get_label (function Block_kind x -> Some x | _ -> None ) labels
421465 in
@@ -442,6 +486,7 @@ let mk ~loc ~section ~labels ~legacy_labels ~header ~contents ~errors =
442486 os_type_enabled;
443487 set_variables = config.set_variables;
444488 unset_variables = config.unset_variables;
489+ delim;
445490 value;
446491 }
447492
@@ -450,7 +495,7 @@ let mk_include ~loc ~section ~labels =
450495 | Some file_inc ->
451496 let header = Header. infer_from_file file_inc in
452497 mk ~loc ~section ~labels ~legacy_labels: false ~header ~contents: []
453- ~errors: []
498+ ~errors: [] ~delim: None
454499 | None -> label_required ~loc ~label: " file" ~kind: " include"
455500
456501let parse_labels ~label_cmt ~legacy_labels =
@@ -476,6 +521,7 @@ let from_raw raw =
476521 in
477522 Util.Result. to_error_list
478523 @@ mk ~loc ~section ~header ~contents ~labels ~legacy_labels ~errors
524+ ~delim: None
479525
480526let is_active ?section :s t =
481527 let active =
0 commit comments