https://redmine.ruby-lang.org/https://redmine.ruby-lang.org/favicon.ico?17113305112012-07-27T14:19:49ZRuby Issue Tracking SystemRuby master - Feature #6801: String#~ for a here documenthttps://redmine.ruby-lang.org/issues/6801?journal_id=284712012-07-27T14:19:49Znobu (Nobuyoshi Nakada)nobu@ruby-lang.org
<ul><li><strong>Description</strong> updated (<a title="View differences" href="/journals/28471/diff?detail_id=21048">diff</a>)</li></ul> Ruby master - Feature #6801: String#~ for a here documenthttps://redmine.ruby-lang.org/issues/6801?journal_id=284812012-07-27T19:23:18ZEregon (Benoit Daloze)
<ul></ul><p>I think the sequence <code>~<<-EOS</code> becomes very cryptic, and this should be supported in the parser (or at least be integrated into the language). I actually prefer <code><<-EOS.undent</code> as the intention is clearer.</p>
<p>Maybe something like <code><<+EOS</code>, which would remove the common indentation?<br>
In your example, it seems fine to have to manually undent the text,<br>
but I think the most common use-case is declaring an heredoc in an indented code.<br>
It does not look nice to have to lose all indentation at that place.<br>
It seems I have similar ideas to what was said in <a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/39851" class="external">ruby-core:39851</a><br>
(although I don't want explicit indent with '|', I'd still prefer <code>#undent</code> or <code>#~</code> in that case).</p> Ruby master - Feature #6801: String#~ for a here documenthttps://redmine.ruby-lang.org/issues/6801?journal_id=284862012-07-27T22:38:13Zmerborne (kyo endo)
<ul></ul><p>Eregon (Benoit Daloze) wrote:</p>
<blockquote>
<p>I think the sequence <code>~<<-EOS</code> becomes very cryptic, and this should be supported in the parser (or at least be integrated into the language). I actually prefer <code><<-EOS.undent</code> as the intention is clearer.</p>
</blockquote>
<p>Heredoc sytax is already cryptic. so programmers looks it carefully and find the difference between <code><<-EOS</code> and <code>~<<-EOS</code>. Yes, this might be supported in the parser. But if so, it will be a big feature or big issue and might be difficult to find the exit. I don't know. On the other hand, I don't prefer Ruby provide <code><<-EOS.undent</code> style method for this purpose. I prefer it looks a special syntax same as <code>-</code> or <code><<</code>.</p>
<blockquote>
<p>Maybe something like <code><<+EOS</code>, which would remove the common indentation?<br>
In your example, it seems fine to have to manually undent the text,<br>
but I think the most common use-case is declaring an heredoc in an indented code.</p>
</blockquote>
<p>Sorry, I don't understand your point. In the example, the target string is shifted to the left for 4 whitespaces with <code>String#~</code>.</p> Ruby master - Feature #6801: String#~ for a here documenthttps://redmine.ruby-lang.org/issues/6801?journal_id=284892012-07-27T23:03:35ZEregon (Benoit Daloze)
<ul></ul><p>merborne (kyo endo) wrote:</p>
<blockquote>
<blockquote>
<p>Maybe something like <code><<+EOS</code>, which would remove the common indentation?<br>
In your example, it seems fine to have to manually undent the text,<br>
but I think the most common use-case is declaring an heredoc in an indented code.</p>
</blockquote>
<p>Sorry, I don't understand your point. In the example, the target string is shifted to the left for 4 whitespaces with String#~.</p>
</blockquote>
<p>I meant your example is probably not the most typical, with its "centered" nature. And I'm fine with having to manually remove the spaces or flush it to the left for such a usage. I would be less fine, with, for example:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">module</span> <span class="nn">MyApp</span>
<span class="k">module</span> <span class="nn">Commands</span>
<span class="k">class</span> <span class="nc">Show</span>
<span class="k">def</span> <span class="nf">error_message</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="o"><<+</span><span class="no">EOS</span>
<span class="no">Error</span><span class="p">:</span> <span class="c1">#{err.class}</span>
<span class="c1">#{err.message}</span>
<span class="no">EOS</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
<p>(found in <a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/39930" class="external">ruby-core:39930</a>)</p>
<p>Sorry, I did not remember <a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/39959" class="external">ruby-core:39959</a>.<br>
You might be right <code>String#~</code> (or <code>String#undent</code>) to have more chances to ever end.</p> Ruby master - Feature #6801: String#~ for a here documenthttps://redmine.ruby-lang.org/issues/6801?journal_id=284902012-07-27T23:38:27Zmerborne (kyo endo)
<ul></ul><p>Eregon (Benoit Daloze) wrote:</p>
<blockquote>
<p>merborne (kyo endo) wrote:</p>
<blockquote>
<blockquote>
<p>Maybe something like <code><<+EOS</code>, which would remove the common indentation?<br>
In your example, it seems fine to have to manually undent the text,<br>
but I think the most common use-case is declaring an heredoc in an indented code.</p>
</blockquote>
<p>Sorry, I don't understand your point. In the example, the target string is shifted to the left for 4 whitespaces with String#~.</p>
</blockquote>
<p>I meant your example is probably not the most typical, with its "centered" nature. And I'm fine with having to manually remove the spaces or flush it to the left for such a usage. I would be less fine, with, for example:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">module</span> <span class="nn">MyApp</span>
<span class="k">module</span> <span class="nn">Commands</span>
<span class="k">class</span> <span class="nc">Show</span>
<span class="k">def</span> <span class="nf">error_message</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="o"><<+</span><span class="no">EOS</span>
<span class="no">Error</span><span class="p">:</span> <span class="c1">#{err.class}</span>
<span class="c1">#{err.message}</span>
<span class="no">EOS</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
<p>(found in <a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/39930" class="external">ruby-core:39930</a>)</p>
<p>Sorry, I did not remember <a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/39959" class="external">ruby-core:39959</a>.<br>
You might be right <code>String#~</code> (or <code>String#undent</code>) to have more chances to ever end.</p>
</blockquote>
<p>ok. thank you.</p> Ruby master - Feature #6801: String#~ for a here documenthttps://redmine.ruby-lang.org/issues/6801?journal_id=284962012-07-28T01:52:09Ztrans (Thomas Sawyer)
<ul></ul><p>Alas %L was rejected :(</p>
<pre><code class="ruby syntaxhl" data-language="ruby"> <span class="n">str</span> <span class="o">=</span> <span class="o">%</span><span class="no">L</span><span class="o">|</span><span class="no">This</span>
<span class="o">|</span> <span class="n">is</span>
<span class="o">|</span> <span class="n">margin</span>
<span class="o">|</span> <span class="n">controlled</span><span class="o">.</span>
</code></pre> Ruby master - Feature #6801: String#~ for a here documenthttps://redmine.ruby-lang.org/issues/6801?journal_id=336842012-11-24T09:11:42Zmame (Yusuke Endoh)mame@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Assigned</i></li><li><strong>Assignee</strong> set to <i>matz (Yukihiro Matsumoto)</i></li><li><strong>Target version</strong> set to <i>3.0</i></li></ul> Ruby master - Feature #6801: String#~ for a here documenthttps://redmine.ruby-lang.org/issues/6801?journal_id=337572012-11-24T12:12:37Ztrans (Thomas Sawyer)
<ul></ul><p>This is really an area in which Ruby is sorely missing some needed String methods. Some of the most commonly used methods in Ruby Facets deal with indention, mainly:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"> <span class="c1"># Preserves relative tabbing such that the line with the least amount </span>
<span class="c1"># of white space ends up with `n` number of spaces before non-space and</span>
<span class="c1"># all other lines move relative to it.</span>
<span class="k">def</span> <span class="nf">tab</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
<span class="n">str</span> <span class="o">=</span> <span class="nb">gsub</span><span class="p">(</span><span class="s2">"</span><span class="se">\t</span><span class="s2">"</span><span class="p">,</span> <span class="s2">" "</span><span class="p">)</span> <span class="c1"># option?</span>
<span class="n">min</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">str</span><span class="p">.</span><span class="nf">each_line</span> <span class="k">do</span> <span class="o">|</span><span class="n">line</span><span class="o">|</span>
<span class="k">next</span> <span class="k">if</span> <span class="n">line</span><span class="p">.</span><span class="nf">strip</span><span class="p">.</span><span class="nf">empty?</span>
<span class="n">min</span> <span class="o"><<</span> <span class="n">line</span><span class="p">.</span><span class="nf">index</span><span class="p">(</span><span class="sr">/\S/</span><span class="p">)</span>
<span class="k">end</span>
<span class="n">min</span> <span class="o">=</span> <span class="n">min</span><span class="p">.</span><span class="nf">min</span>
<span class="n">str</span><span class="p">.</span><span class="nf">indent</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="n">min</span><span class="p">)</span>
<span class="k">end</span>
<span class="c1"># Preserves relative tabbing, such that the first non-empty line ends up with</span>
<span class="c1"># `n` number of spaces before non-space, and all subsequent lines move relative</span>
<span class="c1"># to the first.</span>
<span class="c1">#</span>
<span class="c1"># CREDIT: Gavin Sinclair</span>
<span class="k">def</span> <span class="nf">tabto</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">self</span> <span class="o">=~</span> <span class="sr">/^( *)\S/</span>
<span class="n">indent</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="vg">$1</span><span class="p">.</span><span class="nf">length</span><span class="p">)</span>
<span class="k">else</span>
<span class="nb">self</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="c1"># Indent left or right by `n` spaces, or `n` number of `c` string.</span>
<span class="c1">#</span>
<span class="c1"># CREDIT: Gavin Sinclair, Trans, Tyler Rick</span>
<span class="k">def</span> <span class="nf">indent</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s1">' '</span><span class="p">)</span>
<span class="k">if</span> <span class="n">n</span> <span class="o">>=</span> <span class="mi">0</span>
<span class="nb">gsub</span><span class="p">(</span><span class="sr">/^/</span><span class="p">,</span> <span class="n">c</span> <span class="o">*</span> <span class="n">n</span><span class="p">)</span>
<span class="k">else</span>
<span class="nb">gsub</span><span class="p">(</span><span class="sr">/^</span><span class="si">#{</span><span class="no">Regexp</span><span class="p">.</span><span class="nf">escape</span><span class="p">(</span><span class="n">c</span><span class="p">)</span><span class="si">}</span><span class="sr">{0,</span><span class="si">#{</span><span class="o">-</span><span class="n">n</span><span class="si">}</span><span class="sr">}/</span><span class="p">,</span> <span class="s2">""</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="c1"># Equivalent to String#indent, but modifies the receiver in place.</span>
<span class="k">def</span> <span class="nf">indent!</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s1">' '</span><span class="p">)</span>
<span class="n">replace</span><span class="p">(</span><span class="n">indent</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">c</span><span class="p">))</span>
<span class="k">end</span>
<span class="c1"># Remove excessive indentation. Useful for multi-line strings embeded in</span>
<span class="c1"># already indented code.</span>
<span class="c1">#</span>
<span class="c1"># <<-END.unindent</span>
<span class="c1"># ohaie</span>
<span class="c1"># wurld</span>
<span class="c1"># END</span>
<span class="c1">#</span>
<span class="c1"># Outputs ...</span>
<span class="c1">#</span>
<span class="c1"># ohaie</span>
<span class="c1"># wurld</span>
<span class="c1">#</span>
<span class="c1"># Instead of ...</span>
<span class="c1">#</span>
<span class="c1"># ohaie</span>
<span class="c1"># wurld</span>
<span class="c1">#</span>
<span class="c1"># CREDIT: Noah Gibbs, mynyml</span>
<span class="k">def</span> <span class="nf">unindent</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="kp">nil</span><span class="p">)</span>
<span class="k">if</span> <span class="n">size</span>
<span class="n">indent</span><span class="p">(</span><span class="o">-</span><span class="n">size</span><span class="p">)</span>
<span class="k">else</span>
<span class="n">char</span> <span class="o">=</span> <span class="s1">' '</span>
<span class="nb">self</span><span class="p">.</span><span class="nf">scan</span><span class="p">(</span><span class="sr">/^[\ \t]*\S/</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">m</span><span class="o">|</span>
<span class="k">if</span> <span class="n">size</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">m</span><span class="p">.</span><span class="nf">size</span> <span class="o"><</span> <span class="n">size</span>
<span class="n">size</span> <span class="o">=</span> <span class="n">m</span><span class="p">.</span><span class="nf">size</span>
<span class="n">char</span> <span class="o">=</span> <span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="o">...-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="n">size</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="n">indent</span><span class="p">(</span><span class="o">-</span><span class="n">size</span><span class="p">,</span> <span class="n">char</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="c1"># Equivalent to String#unindent, but modifies the receiver in place.</span>
<span class="c1">#</span>
<span class="c1"># CREDIT: mynyml</span>
<span class="k">def</span> <span class="nf">unindent!</span>
<span class="nb">self</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="nb">self</span><span class="p">.</span><span class="nf">unindent</span><span class="p">)</span>
<span class="k">end</span>
</code></pre>
<p>While I understand the intention of using <code>~</code> so as to make it part of HERE document syntax, I don't think it outweighs the advantages of having more flexible methods such as these.</p> Ruby master - Feature #6801: String#~ for a here documenthttps://redmine.ruby-lang.org/issues/6801?journal_id=763612019-01-16T17:14:54Zjsc (Justin Collins)
<ul></ul><p>Since this exact behavior was added as "indented here document" with <code><<~</code> in Ruby 2.3.0 (discussed in <a class="issue tracker-2 status-5 priority-4 priority-default closed" title="Feature: Indent heredoc against the left margin by default when "indented closing identifier" is turned on. (Closed)" href="https://redmine.ruby-lang.org/issues/9098">#9098</a>), I believe this issue can be closed out.</p> Ruby master - Feature #6801: String#~ for a here documenthttps://redmine.ruby-lang.org/issues/6801?journal_id=763632019-01-16T20:49:09ZEregon (Benoit Daloze)
<ul><li><strong>Status</strong> changed from <i>Assigned</i> to <i>Rejected</i></li><li><strong>Target version</strong> deleted (<del><i>3.0</i></del>)</li></ul><p>Indeed.</p>