1:- module(st_white, [
    2    st_strip_indent/2
    3]).

Whitespace handling

Removes indents and collapses extra line ends. */

   10:- use_module(library(dcg/basics)).
 st_strip_indent(+Codes, -StrippedCodes) is det
Removes indents and collapses extra line ends.
   16st_strip_indent(Codes, Stripped):-
   17    phrase(strip_rest(Tmp), Codes),
   18    phrase(collapse(Out), Tmp), !,
   19    Stripped = Out.
   20
   21strip_rest([0'\n|Codes]) -->
   22    whites, ln, whites, !,
   23    strip_rest(Codes).
   24
   25strip_rest([]) -->
   26    eos, !.
   27
   28strip_rest([Code|Codes]) -->
   29    [Code], strip_rest(Codes).
   30
   31% Collapses duplicate line ends.
   32% Assumes that line ends are normalized
   33% to \n.
   34
   35collapse([0'\n|Codes]) -->
   36    line_ends, !, collapse(Codes).
   37
   38collapse([Code|Codes]) -->
   39    [Code], !, collapse(Codes).
   40
   41collapse([]) --> "".
   42
   43line_ends -->
   44    "\n", line_ends.
   45
   46line_ends -->
   47    "\n".
   48
   49ln --> "\r\n", !.
   50ln --> "\n", !.
   51ln --> "\r"