Feature #749: String#indent,  String#tabto, etc.
http://redmine.ruby-lang.org/issues/show/749

Author: Thomas Sawyer
Status: Open, Priority: Normal
Category: core, Target version: 1.9.x

There are few indention related String extensions I find myself frequently reusing. Ruby really has nothing built-in that addresses this, so I'd like to the following methods, or something like them, ultimately make it into Ruby core.

  # Preserves relative tabbing.
  # The first non-empty line ends up with n spaces before nonspace.
  def tabto(n)
    if self =~ /^( *)\S/
      indent(n - $1.length)
    else
      self
    end
  end

  # Indent left or right by n spaces.
  # (This used to be called #tab and aliased as #indent.)
  def indent(n)
    if n >= 0
      gsub(/^/, ' ' * n)
    else
      gsub(/^ {0,#{-n}}/, "")
    end
  end

  # Aligns each line n spaces.
  def tab(n)
    gsub(/^ */, ' ' * n)
  end

  # Provides a margin controlled string.
  #
  #   x = %Q{
  #         | This
  #         |   is
  #         |     margin controlled!
  #         }.margin
  #
  def margin(n=0)
    d = ((/\A.*\n\s*(.)/.match(self)) ||
        (/\A\s*(.)/.match(self)))[1]
    return '' unless d
    if n == 0
      gsub(/\n\s*\Z/,'').gsub(/^\s*[#{d}]/, '')
    else
      gsub(/\n\s*\Z/,'').gsub(/^\s*[#{d}]/, ' ' * n)
    end
  end

These methods come in very handy in avoiding the need to shove HERE docs up against the left margin, or use repetitive string concatenations. I've seen others mention them from time to time as well, so I know I'm not the only one using them.

Of course, they'd need to be converted to C, but given the size and character of the definitions, I imagine it would be a fairly straight forward translation.

(Giving credit where it is due: The first three methods were originally written by Gavin Sinclair. The later method, if I recall correctly,  by Peter Vanbroekhoven).


----------------------------------------
http://redmine.ruby-lang.org