equal
deleted
inserted
replaced
181 let |
181 let |
182 val raw0 = enclose "\\<^raw:" ">"; |
182 val raw0 = enclose "\\<^raw:" ">"; |
183 val raw1 = raw0 o implode; |
183 val raw1 = raw0 o implode; |
184 val raw2 = enclose "\\<^raw" ">" o string_of_int o ord; |
184 val raw2 = enclose "\\<^raw" ">" o string_of_int o ord; |
185 |
185 |
186 fun encode cs = enc (Library.take_prefix raw_chr cs) |
186 fun encode cs = enc (take_prefix raw_chr cs) |
187 and enc ([], []) = [] |
187 and enc ([], []) = [] |
188 | enc (cs, []) = [raw1 cs] |
188 | enc (cs, []) = [raw1 cs] |
189 | enc ([], d :: ds) = raw2 d :: encode ds |
189 | enc ([], d :: ds) = raw2 d :: encode ds |
190 | enc (cs, d :: ds) = raw1 cs :: raw2 d :: encode ds; |
190 | enc (cs, d :: ds) = raw1 cs :: raw2 d :: encode ds; |
191 in |
191 in |
196 |
196 |
197 (* diagnostics *) |
197 (* diagnostics *) |
198 |
198 |
199 fun beginning n cs = |
199 fun beginning n cs = |
200 let |
200 let |
201 val drop_blanks = #1 o Library.take_suffix is_ascii_blank; |
201 val drop_blanks = #1 o take_suffix is_ascii_blank; |
202 val all_cs = drop_blanks cs; |
202 val all_cs = drop_blanks cs; |
203 val dots = if length all_cs > n then " ..." else ""; |
203 val dots = if length all_cs > n then " ..." else ""; |
204 in |
204 in |
205 (drop_blanks (Library.take (n, all_cs)) |
205 (drop_blanks (take n all_cs) |
206 |> map (fn c => if is_ascii_blank c then space else c) |
206 |> map (fn c => if is_ascii_blank c then space else c) |
207 |> implode) ^ dots |
207 |> implode) ^ dots |
208 end; |
208 end; |
209 |
209 |
210 |
210 |
489 |
489 |
490 (* blanks *) |
490 (* blanks *) |
491 |
491 |
492 fun strip_blanks s = |
492 fun strip_blanks s = |
493 sym_explode s |
493 sym_explode s |
494 |> Library.take_prefix is_blank |> #2 |
494 |> take_prefix is_blank |> #2 |
495 |> Library.take_suffix is_blank |> #1 |
495 |> take_suffix is_blank |> #1 |
496 |> implode; |
496 |> implode; |
497 |
497 |
498 |
498 |
499 (* bump string -- treat as base 26 or base 1 numbers *) |
499 (* bump string -- treat as base 26 or base 1 numbers *) |
500 |
500 |
514 | bump (s :: ss) = |
514 | bump (s :: ss) = |
515 if is_char s andalso ord "a" <= ord s andalso ord s < ord "z" |
515 if is_char s andalso ord "a" <= ord s andalso ord s < ord "z" |
516 then chr (ord s + 1) :: ss |
516 then chr (ord s + 1) :: ss |
517 else "a" :: s :: ss; |
517 else "a" :: s :: ss; |
518 |
518 |
519 val (ss, qs) = apfst rev (Library.take_suffix is_quasi (sym_explode str)); |
519 val (ss, qs) = apfst rev (take_suffix is_quasi (sym_explode str)); |
520 val ss' = if symbolic_end ss then "'" :: ss else bump ss; |
520 val ss' = if symbolic_end ss then "'" :: ss else bump ss; |
521 in implode (rev ss' @ qs) end; |
521 in implode (rev ss' @ qs) end; |
522 |
522 |
523 |
523 |
524 |
524 |