A new quotation operator to automatically unindent %q and %Q


#1

Hello everyone,

Many times I have faced the situation of embedding multi-line strings in
my programs while wanting to preserve the indentation of the surrounding
code:

module Foo
class Bar
def to_s
%q{
This block of text will,

        unfortunately,

      contain the indentation of

        the
            surrounding
                        code!

      Unless we manually remove it,
      as shown by the gsub() below:

    }.gsub(/^          /, '')
  end
end

end

The same problem occurs for “here documents” as well. We are forced to
manually remove the indentation.

I would like to propose a new set of string quotation operators %s and
%S which behave just like %q and %Q respectively, except that they are
automatically unindented by the Ruby interpreter using the first line of
non-whitespace text:

amount_to_unindent = input_string[/\A(?:\r?\n)+([ \t]+)(?=\S)/, 1]
input_string.gsub! /^#{amount_to_unindent}/, ‘’

What do you think?

Thanks for your consideration.


#2

On Sun, 19 Oct 2008 16:38:05 -0500, Suraj K. wrote:

      This block of text will,
      as shown by the gsub() below:

%S which behave just like %q and %Q respectively, except that they are
automatically unindented by the Ruby interpreter using the first line of
non-whitespace text:

amount_to_unindent = input_string[/\A(?:\r?\n)+([ \t]+)(?=\S)/, 1]
input_string.gsub! /^#{amount_to_unindent}/, ‘’

What do you think?

Thanks for your consideration.

Use the facets gem’s String#margin instead?

–Ken


#3

On Sun, Oct 19, 2008 at 5:38 PM, Suraj K. removed_email_address@domain.invalid wrote:

     This block of text will,
     as shown by the gsub() below:

%S which behave just like %q and %Q respectively, except that they are
automatically unindented by the Ruby interpreter using the first line of
non-whitespace text:

amount_to_unindent = input_string[/\A(?:\r?\n)+([ \t]+)(?=\S)/, 1]
input_string.gsub! /^#{amount_to_unindent}/, ‘’

What do you think?

%s is already in use for symbols.


#4

On Oct 19, 5:38 pm, Suraj K. removed_email_address@domain.invalid wrote:

      This block of text will,
      as shown by the gsub() below:

%S which behave just like %q and %Q respectively, except that they are
automatically unindented by the Ruby interpreter using the first line of
non-whitespace text:

amount_to_unindent = input_string[/\A(?:\r?\n)+([ \t]+)(?=\S)/, 1]
input_string.gsub! /^#{amount_to_unindent}/, ‘’

What do you think?

Hi–

This is not an uncommon request. Consider:

http://rcrchive.net/rcrs/2

Long long ago I proposed %l and %L:

     %l{
       |This block of text will,
       |
       | unfortunately,
       |
       |contain the indentation of
       |
       |  the
       |     surrounding
       |                 code!
       |
       |Unless we manually remove it,
       |as shown by the gsub() below:
       }

But matz does not seem to see merit in any of this. I’m not sure why.

T.


#5

On Sun, 19 Oct 2008 21:33:56 -0500, Trans wrote:

    %q{
     Unless we manually remove it,
I would like to propose a new set of string quotation operators %s and

       |

But matz does not seem to see merit in any of this. I’m not sure why.

T.

Probably because it can easily be done in a library. See the facets
gem’s
String#margin


#6

Suraj K. wrote:

What do you think?

Just an observation: it will require all the quoted lines to use tabs
and spaces for indenting in an exactly consistent way, otherwise it
probably won’t work.

Using an explicit marker like | is probably better for that reason.