<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <br>
    <br>
    <div class="moz-cite-prefix">On 4/22/2019 11:26 AM, Jim Laskey
      wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:61B62FDA-D4EB-443C-9A8F-6D39D93F656F@oracle.com">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <div class="">
        <div class=""><font class="" face="Courier New">Current "strip
            incidentals" algorithm as captured in String::align
            (string-tapas branch)</font></div>
        <div class=""><font class="" face="Courier New"><br class="">
          </font></div>
        <div class=""><font class="" face="Courier New">    public
            String align(int n) {</font></div>
        <div class=""><font class="" face="Courier New">        if
            (isEmpty()) {</font></div>
        <div class=""><font class="" face="Courier New">           
            return "";</font></div>
        <div class=""><font class="" face="Courier New">        }</font></div>
        <div class=""><font class="" face="Courier New">        long
            count = lines().count();</font></div>
        <div class=""><font class="" face="Courier New">        if
            (count == 1) {</font></div>
        <div class=""><font class="" face="Courier New">           
            return strip();</font></div>
        <div class=""><font class="" face="Courier New">        }</font></div>
        <div class=""><font class="" face="Courier New">        int
            outdent = lines().skip(1)</font></div>
        <div class=""><font class="" face="Courier New">               
                         .filter(not(String::isBlank))</font></div>
        <div class=""><font class="" face="Courier New">               
                         .mapToInt(String::indexOfNonWhitespace)</font></div>
        <div class=""><font class="" face="Courier New">               
                         .min()</font></div>
        <div class=""><font class="" face="Courier New">               
                         .orElse(0);</font></div>
        <div class=""><font class="" face="Courier New">        String
            last = lines().skip(count - 1).findFirst().orElse("");</font></div>
        <div class=""><font class="" face="Courier New">        boolean
            lastIsBlank = last.isBlank();</font></div>
        <div class=""><font class="" face="Courier New">        if
            (lastIsBlank) {</font></div>
        <div class=""><font class="" face="Courier New">           
            outdent = Integer.min(outdent, last.length());</font></div>
        <div class=""><font class="" face="Courier New">        }</font></div>
        <div class=""><font class="" face="Courier New">        return
            indentStream(lines(1, 1), n - outdent).map(s ->
            s.stripTrailing())</font></div>
        <div class=""><font class="" face="Courier New">               
                                               
             .collect(Collectors.joining("\n", "", lastIsBlank ? "\n" :
            ""));</font></div>
        <div class=""><font class="" face="Courier New">    }</font></div>
        <div class=""><font class="" face="Courier New"><br class="">
          </font></div>
        <div class=""><font class="" face="Courier New"><br class="">
          </font></div>
        <div class=""><font class="" face="Courier New">2. long count =
            lines().count();</font></div>
        <div class=""><font class="" face="Courier New">   if (count ==
            1) {</font></div>
        <div class=""><font class="" face="Courier New">       return
            strip();</font></div>
        <div class=""><font class="" face="Courier New">   }</font></div>
        <div class=""><font class="" face="Courier New"><br class="">
          </font></div>
        <div class=""><font class="" face="Courier New">Single line
            strings (no line terminators) are simply stripped.</font></div>
        <div class=""><font class="" face="Courier New"><br class="">
          </font></div>
        <div class=""><font class="" face="Courier New">    """  single
            line  """ ==> "single line"</font></div>
      </div>
    </blockquote>
    <br>
    <font face="Courier New">I think we should reconsider this one.  The
      interpretation we settled on is: we're willing to treat a
      multi-line string as being a sequence of lines, not just of
      characters, and we're willing to strip incidental whitespace that
      arises from accidents of how the string is embedded in the
      program.  But a single-line string doesn't have any of that; I
      think it should be left alone, regardless of quotes.  <br>
      <br>
    </font>
    <blockquote type="cite"
      cite="mid:61B62FDA-D4EB-443C-9A8F-6D39D93F656F@oracle.com">
      <div class="">
        <div class=""><font class="" face="Courier New">   <br>
          </font></div>
        <div class=""><font class="" face="Courier New">3.  int outdent
            = lines().skip(1) ...</font></div>
        <div class=""><font class="" face="Courier New"><br class="">
          </font></div>
        <div class=""><font class="" face="Courier New">Ignoring first
            line, determine least number of leading whitespaces for all</font></div>
        <div class=""><font class="" face="Courier New">non-blank lines.</font></div>
        <div class=""><font class="" face="Courier New"><br class="">
          </font></div>
        <div class=""><font class="" face="Courier New">    String s =
            """</font></div>
        <div class=""><font class="" face="Courier New">   
            ................line 1..</font></div>
        <div class=""><font class="" face="Courier New">   
            ....................line 2.</font></div>
        <div class=""><font class="" face="Courier New">               
            """;  ==> 16</font></div>
      </div>
    </blockquote>
    <br>
    <font face="Courier New">I think we should reconsider whether a
      non-blank first line means that we should consider any indentation
      on the first line too.  This has the likely-beneficial side-effect
      that having a non-blank character immediately following the """
      effectively means "no stripping." <br>
      <br>
      Considering the indentation of the _last_ blank line gives the
      user more control while not requiring the user to distort
      indentation for common cases.  So +1 to "CDI".  <br>
    </font><br>
    <blockquote type="cite"
      cite="mid:61B62FDA-D4EB-443C-9A8F-6D39D93F656F@oracle.com">
      <div class=""><br>
        <div class=""><font class="" face="Courier New">Options;</font></div>
        <div class=""><font class="" face="Courier New"><br class="">
          </font></div>
        <div class=""><font class="" face="Courier New">2. a) Single
            line strings would be just stripLeading, but should
            beconsistent</font></div>
        <div class=""><font class="" face="Courier New">with multi-line
            and stripTrailing.</font></div>
        <div class=""><font class="" face="Courier New"><br class="">
          </font></div>
        <div class=""><font class="" face="Courier New">    """  single
            line  """ ==> "single line  "</font></div>
        <div class=""><font class="" face="Courier New">    </font></div>
        <div class=""><font class="" face="Courier New">    b) We could
            do nothing for single line.</font></div>
        <div class=""><font class="" face="Courier New"><br class="">
          </font></div>
        <div class=""><font class="" face="Courier New">    """  single
            line  """ ==> "  single line  "</font></div>
      </div>
    </blockquote>
    <br>
    <font face="Courier New">I vote (b).<br>
      <br>
    </font>
    <blockquote type="cite"
      cite="mid:61B62FDA-D4EB-443C-9A8F-6D39D93F656F@oracle.com">
      <div class=""><font class="" face="Courier New">5. a) If we omit
          close delimiter influence, only the content influences the</font>
        <div class=""><font class="" face="Courier New">indentation.
             Loss of control by the user.</font></div>
      </div>
    </blockquote>
    <br>
    <font face="Courier New">I think CDI is fine.<br>
      <br>
    </font>
    <blockquote type="cite"
      cite="mid:61B62FDA-D4EB-443C-9A8F-6D39D93F656F@oracle.com">
      <div class=""><font class="" face="Courier New">6. a) Could strip
          all leading/trailing blank lines, but awkward to recover the</font>
        <div class=""><font class="" face="Courier New">LOI. Not
            recommending.</font></div>
      </div>
    </blockquote>
    <br>
    <font face="Courier New">Agreed.</font><font class="" face="Courier
      New"></font>
    <blockquote type="cite"
      cite="mid:61B62FDA-D4EB-443C-9A8F-6D39D93F656F@oracle.com">
      <div class="">
        <div class=""><font class="" face="Courier New">   </font></div>
        <font class="" face="Courier New">9. a) Always add a last \n.
          Loss of control by the user.</font></div>
    </blockquote>
    <br>
    <font face="Courier New">The current behavior pairs nicely with CDI.<br>
    </font><br>
  </body>
</html>