<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto">I’ll update the comments in String::align when we settle. <br><br><div id="AppleMailSignature" dir="ltr">Sent from my iPhone</div><div dir="ltr"><br>On Apr 18, 2019, at 1:14 PM, Jim Laskey <<a href="mailto:james.laskey@oracle.com">james.laskey@oracle.com</a>> wrote:<br><br></div><blockquote type="cite"><div dir="ltr"><meta http-equiv="Content-Type" content="text/html; charset=utf-8">I've updated the repo with an updated String::align and switched the compiler to use the String::align method instead of it's own version. I also updated the sample.<div class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Apr 17, 2019, at 4:58 PM, Jim Laskey <<a href="mailto:james.laskey@oracle.com" class="">james.laskey@oracle.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html; charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><font face="Courier New" class="">I pushed changes to <span style="font-size: 11px;" class=""><a href="http://hg.openjdk.java.net/amber/amber" class="">http://hg.openjdk.java.net/amber/amber</a></span> string-tapas branch to reflect the incidental whitespace discussion. What is implemented is what Brian described as </font><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><div class=""><font face="Courier New" class="">Version 2 of the algorithm — the “significant closing delimiter” version — is:</font></div><div class=""><div class=""><font face="Courier New" class=""> - Strip leading and trailing blanks (perhaps limited to one each only)</font></div><div class=""><font face="Courier New" class=""> - Compute the maximal common whitespace prefix of the remaining lines, _including the stripped trailing blank line from above, if any_, and trim that off</font></div><div class=""><font face="Courier New" class=""> - If a blank last line was trimmed, add back a newline</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">With strip leading and trailing blanks limited to one each.</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><span style="font-family: "Courier New";" class="">I also added a "super escape" \~ to opt out of auto align.</span></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">Example:</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><div class=""><font face="Courier New" class="">        String l = """\~</font></div><div class=""><font face="Courier New" class="">                       +--------+</font></div><div class=""><font face="Courier New" class="">                       |  text  |</font></div><div class=""><font face="Courier New" class="">                       +--------+</font></div><div class=""><font face="Courier New" class="">                   """; // what opt out might look like</font></div></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">Actual:</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">\n<br class="">.......................+--------+\n<br class="">.......................|  text  |\n<br class="">.......................+--------+\n<br class="">...................<br class=""><br class=""></font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">Note that the String#align needs tweaking to reflect the algorithm (needs to add closing delimiter influence).</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">There is a sampler at <a href="http://cr.openjdk.java.net/~jlaskey/Strings/AutoAlign.java" class="">http://cr.openjdk.java.net/~jlaskey/Strings/AutoAlign.java</a> (included below as well) that shows the examples from my original (1a) incidental whitespace e-mail.</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">Cheers,</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">-- Jim</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><div class=""><font face="Courier New" class="">_____________________________________________________________________________________________________________</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div></div><div class=""><div class=""><font face="Courier New" class="">public class AutoAlign {</font></div><div class=""><font face="Courier New" class="">    public static void report(String label, String result) {</font></div><div class=""><font face="Courier New" class="">        System.out.format("Result of variable %s%n", label);</font></div><div class=""><font face="Courier New" class="">        String formatted = result.replaceAll(" ", ".")</font></div><div class=""><font face="Courier New" class="">                                 .replaceAll("\n", "\\\\n\n");</font></div><div class=""><font face="Courier New" class="">        System.out.format("%s%n%n", formatted);</font></div><div class=""><font face="Courier New" class="">    }</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">    public static void main(String... args) throws Exception {</font></div><div class=""><font face="Courier New" class="">        String a = """</font></div><div class=""><font face="Courier New" class="">                   +--------+</font></div><div class=""><font face="Courier New" class="">                   |  text  |</font></div><div class=""><font face="Courier New" class="">                   +--------+</font></div><div class=""><font face="Courier New" class="">                   """; // first characters in first column?</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">        String b = """</font></div><div class=""><font face="Courier New" class="">                       +--------+</font></div><div class=""><font face="Courier New" class="">                       |  text  |</font></div><div class=""><font face="Courier New" class="">                       +--------+</font></div><div class=""><font face="Courier New" class="">                   """; // first characters in first column or indented four spaces?</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">        String c = """</font></div><div class=""><font face="Courier New" class="">                       +--------+</font></div><div class=""><font face="Courier New" class="">                       |  text  |</font></div><div class=""><font face="Courier New" class="">                       +--------+</font></div><div class=""><font face="Courier New" class="">        """; // first characters in first column or indented several?</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">        String d = """</font></div><div class=""><font face="Courier New" class="">            +--------+</font></div><div class=""><font face="Courier New" class="">            |  text  |</font></div><div class=""><font face="Courier New" class="">            +--------+</font></div><div class=""><font face="Courier New" class="">        """; // first characters in first column or indented four?</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">        String e =</font></div><div class=""><font face="Courier New" class="">        """</font></div><div class=""><font face="Courier New" class="">        +--------+</font></div><div class=""><font face="Courier New" class="">        |  text  |</font></div><div class=""><font face="Courier New" class="">        +--------+</font></div><div class=""><font face="Courier New" class="">        """; // heredoc?</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">        String f = """</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">                       +--------+</font></div><div class=""><font face="Courier New" class="">                       |  text  |</font></div><div class=""><font face="Courier New" class="">                       +--------+</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">                   """; // one or all leading or trailing blank lines stripped?</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">        String g = """</font></div><div class=""><font face="Courier New" class="">                      +--------+</font></div><div class=""><font face="Courier New" class="">                      |  text  |</font></div><div class=""><font face="Courier New" class="">                      +--------+"""; // Last \n dropped</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">        String h = """+--------+</font></div><div class=""><font face="Courier New" class="">                      |  text  |</font></div><div class=""><font face="Courier New" class="">                      +--------+"""; // determine indent of first line using scanner knowledge?</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">        String i = """  "nested"  """; // strip leading/trailing space?</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">        String name = " methodName";</font></div><div class=""><font face="Courier New" class="">        String j = ("""</font></div><div class=""><font face="Courier New" class="">                         public static void """ + name + """(String... args) {</font></div><div class=""><font face="Courier New" class="">                             System.out.println(String.join(args));</font></div><div class=""><font face="Courier New" class="">                         }</font></div><div class=""><font face="Courier New" class="">                   """).align(); // how do we handle expressions with multi-line strings?</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">        String k = String.format("""</font></div><div class=""><font face="Courier New" class="">                         public static void %s(String... args) {</font></div><div class=""><font face="Courier New" class="">                             System.out.println(String.join(args));</font></div><div class=""><font face="Courier New" class="">                         }</font></div><div class=""><font face="Courier New" class="">                   """, name); // is this the answer to  multi-line string expressions?</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">        String l = """\~</font></div><div class=""><font face="Courier New" class="">                       +--------+</font></div><div class=""><font face="Courier New" class="">                       |  text  |</font></div><div class=""><font face="Courier New" class="">                       +--------+</font></div><div class=""><font face="Courier New" class="">                   """; // what opt out might look like</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">        report("a", a);</font></div><div class=""><font face="Courier New" class="">        report("b", b);</font></div><div class=""><font face="Courier New" class="">        report("c", c);</font></div><div class=""><font face="Courier New" class="">        report("d", d);</font></div><div class=""><font face="Courier New" class="">        report("e", e);</font></div><div class=""><font face="Courier New" class="">        report("f", f);</font></div><div class=""><font face="Courier New" class="">        report("g", g);</font></div><div class=""><font face="Courier New" class="">        report("h", h);</font></div><div class=""><font face="Courier New" class="">        report("i", i);</font></div><div class=""><font face="Courier New" class="">        report("j", j);</font></div><div class=""><font face="Courier New" class="">        report("k", k);</font></div><div class=""><font face="Courier New" class="">        report("l", l);</font></div><div class=""><font face="Courier New" class="">    }</font></div><div class=""><font face="Courier New" class="">}</font></div></div><div class=""><div class=""><font face="Courier New" class=""><br class=""></font></div></div><div class=""><div class=""><font face="Courier New" class="">_____________________________________________________________________________________________________________</font></div></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">Result of variable a<br class="">+--------+\n<br class="">|..text..|\n<br class="">+--------+\n<br class=""><br class=""><br class="">Result of variable b<br class="">....+--------+\n<br class="">....|..text..|\n<br class="">....+--------+\n<br class=""><br class=""><br class="">Result of variable c<br class="">...............+--------+\n<br class="">...............|..text..|\n<br class="">...............+--------+\n<br class=""><br class=""><br class="">Result of variable d<br class="">....+--------+\n<br class="">....|..text..|\n<br class="">....+--------+\n<br class=""><br class=""><br class="">Result of variable e<br class="">+--------+\n<br class="">|..text..|\n<br class="">+--------+\n<br class=""><br class=""><br class="">Result of variable f<br class="">\n<br class="">\n<br class="">....+--------+\n<br class="">....|..text..|\n<br class="">....+--------+\n<br class="">\n<br class="">\n<br class=""><br class=""><br class="">Result of variable g<br class="">+--------+\n<br class="">|..text..|\n<br class="">+--------+<br class=""><br class="">Result of variable h<br class="">+--------+\n<br class="">|..text..|\n<br class="">+--------+<br class=""><br class="">Result of variable i<br class="">"nested"<br class=""><br class="">Result of variable j<br class="">public.static.void.methodName(String....args).{\n<br class="">..........System.out.println(String.join(args));\n<br class="">......}\n<br class=""><br class=""><br class="">Result of variable k<br class="">......public.static.void..methodName(String....args).{\n<br class="">..........System.out.println(String.join(args));\n<br class="">......}\n<br class=""><br class=""><br class="">Result of variable l<br class="">\n<br class="">.......................+--------+\n<br class="">.......................|..text..|\n<br class="">.......................+--------+\n<br class="">...................<br class=""><br class=""><br class=""></font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><br class=""></div></div></div></div></div></blockquote></div><br class=""></div></div></blockquote></body></html>