src/Pure/General/pretty.ML
changeset 23698 af84f2f13d4d
parent 23660 18765718cf62
child 23787 4868d3913961
equal deleted inserted replaced
23697:63e3b2e383dd 23698:af84f2f13d4d
    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, _)) =