24 (unit -> unit) * (unit -> unit); |
24 (unit -> unit) * (unit -> unit); |
25 |
25 |
26 signature PRETTY = |
26 signature PRETTY = |
27 sig |
27 sig |
28 val default_indent: string -> int -> output |
28 val default_indent: string -> int -> output |
29 val default_markup: Markup.T -> output * output |
29 val add_mode: string -> (string -> int -> output) -> unit |
30 val mode_markup: Markup.T -> output * output |
|
31 val add_mode: string -> (string -> int -> output) -> (Markup.T -> output * output) -> unit |
|
32 type T |
30 type T |
33 val raw_str: output * int -> T |
31 val raw_str: output * int -> T |
34 val str: string -> T |
32 val str: string -> T |
35 val brk: int -> T |
33 val brk: int -> T |
36 val fbrk: T |
34 val fbrk: T |
85 struct |
83 struct |
86 |
84 |
87 (** print mode operations **) |
85 (** print mode operations **) |
88 |
86 |
89 fun default_indent (_: string) = Symbol.spaces; |
87 fun default_indent (_: string) = Symbol.spaces; |
90 fun default_markup (_: Markup.T) = ("", ""); |
|
91 |
88 |
92 local |
89 local |
93 val default = {indent = default_indent, markup = default_markup}; |
90 val default = {indent = default_indent}; |
94 val modes = ref (Symtab.make [("", default)]); |
91 val modes = ref (Symtab.make [("", default)]); |
95 in |
92 in |
96 fun add_mode name indent markup = |
93 fun add_mode name indent = |
97 change modes (Symtab.update_new (name, {indent = indent, markup = markup})); |
94 change modes (Symtab.update_new (name, {indent = indent})); |
98 fun get_mode () = |
95 fun get_mode () = |
99 the_default default (Library.get_first (Symtab.lookup (! modes)) (! print_mode)); |
96 the_default default (Library.get_first (Symtab.lookup (! modes)) (! print_mode)); |
100 end; |
97 end; |
101 |
98 |
102 fun mode_indent x y = #indent (get_mode ()) x y; |
99 fun mode_indent x y = #indent (get_mode ()) x y; |
103 |
|
104 fun mode_markup m = |
|
105 if m = Markup.none then ("", "") |
|
106 else #markup (get_mode ()) m; |
|
107 |
|
108 fun add_markup m add = |
|
109 let val (bg, en) = mode_markup m |
|
110 in Buffer.add bg #> add #> Buffer.add en end; |
|
111 |
100 |
112 val output_spaces = Output.output o Symbol.spaces; |
101 val output_spaces = Output.output o Symbol.spaces; |
113 val add_indent = Buffer.add o output_spaces; |
102 val add_indent = Buffer.add o output_spaces; |
114 |
103 |
115 |
104 |
279 val pos' = pos + indent; |
268 val pos' = pos + indent; |
280 val pos'' = pos' mod emergencypos; |
269 val pos'' = pos' mod emergencypos; |
281 val block' = |
270 val block' = |
282 if pos' < emergencypos then (ind |> add_indent indent, pos') |
271 if pos' < emergencypos then (ind |> add_indent indent, pos') |
283 else (add_indent pos'' Buffer.empty, pos''); |
272 else (add_indent pos'' Buffer.empty, pos''); |
284 val (bg, en) = mode_markup markup; |
273 val (bg, en) = Markup.output markup; |
285 val btext: text = text |
274 val btext: text = text |
286 |> control bg |
275 |> control bg |
287 |> format (bes, block', breakdist (es, after)) |
276 |> format (bes, block', breakdist (es, after)) |
288 |> control en; |
277 |> control en; |
289 (*if this block was broken then force the next break*) |
278 (*if this block was broken then force the next break*) |
308 end; |
297 end; |
309 |
298 |
310 |
299 |
311 (* special output *) |
300 (* special output *) |
312 |
301 |
|
302 fun add_markup m add = |
|
303 let val (bg, en) = Markup.output m |
|
304 in Buffer.add bg #> add #> Buffer.add en end; |
|
305 |
313 (*symbolic markup -- no formatting*) |
306 (*symbolic markup -- no formatting*) |
314 fun symbolic prt = |
307 fun symbolic prt = |
315 let |
308 let |
316 fun out (Block (m, [], _, _)) = add_markup m I |
309 fun out (Block (m, [], _, _)) = add_markup m I |
317 | out (Block (m, prts, indent, _)) = |
310 | out (Block (m, prts, indent, _)) = |