Forum: Ruby a new quotation operator to automatically unindent %q and %Q

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I
unfortunately do not have the time to support and maintain the forum any
more. Please see rubyonrails.org/community and ruby-lang.org/en/community
for other Rails- und Ruby-related community platforms.

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.

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

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.

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.

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

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.