> On May 10, 2019, at 3:04 PM, Dan Smith <daniel.sm...@oracle.com> wrote: > > Practically, the programming style I would want to use is Jim's example (h): > > String h = """+--------+ > | text | > +--------+""";
Thinking about this a bit more, I could also be happy uniformly adopting example (a): String a = """ +--------+ | text | +--------+ """; Or, where needed, (e): String e = """ +--------+ | text | +--------+ """; I think the key to this style for me is to stop thinking about this as a "string literal with newlines" and start thinking about it as a different entity. (Which is a good argument for fat delimiters.) > As a pretty-simple definition of the 2D rectangle, I'd be happy with "all > columns to the right of the opening delimiter, on all lines until the closing > delimiter". Indents in between must use whitespace to align with the opening > delimiter; if they don't, that's a parse error. > > I realize that some people prefer a different style, and that this story is > complicated by tab characters and variable-width fonts. So maybe there's > another rule (or two) for the 2D rectangle when the first line is blank, > based on the placement of the closing delimiter, or based on the leftmost > non-whitespace character. But my high-level point is that I'd rather not > force the algorithm to be defined on a context-free String. Reframing this to support things like (a) and (e), but still take context into account, I really think we could cut down on the degrees of freedom significantly, and just say this: the left margin of the rectangle aligns with the left side of the opening or closing delimiter, whichever is leftmost*; the top of the rectangle is the line after the opening delimiter. All indents must match the leftmost delimiter's prefix (where non-whitespace prefix text is replaced with spaces), and the line after the opening delimiter must be blank. This is a very opinionated rule: the space to the left of the leftmost delimiter is simply off-limits. And any indentation to the right of the leftmost delimiter is preserved. That's just How It's Done. If you need a different left margin, move your delimiters (e.g., add a newline, like (e)). I think programmers would appreciate a simple, strict, easy-to-see rule, rather than a best-effort trimming algorithm. (* I'd almost be willing to say that the opening delimiter always determines the indent, but I'm backing off for tab-lovers who won't like how prefix text gets replaced with spaces; though maybe tab-lovers will want to keep things tidy with a newline before the opening delimiter. Anyway, in most cases the opening and closing delimiter will start in the same column.)