remove overall indentation preserving reletive indentation

J

Jesse B.

I am trying to find a solution to remove the overall indentation of a
block of text while preserving the relative indentation of each line,
for example

line 1
line 2

(2 spaces then 4 spaces)
should become

line 1
line 2

(0 spaces then two spaces)

so that the two space between lines relative indentation is preserved,
yet the first two spaces overall indentation goes away.

what I have tried so far is string .strip, which seems to remove all
leading space of the first line only

content =
" line 1
line2"
output = content.strip
print output

produces

line 1
line 2

0 spaces then 4.

whereas Im going for

a result of 0 then 2 from starting with 2 then 4.

I assume the solution would probably involve getting the number of
spaces for the first line and removing that number of spaces from each
line in the block?

thanks in advance for your help.
 
J

Jean-Julien Fleck

Hello Jesse,
I assume the solution would probably involve getting the number of
spaces for the first line and removing that number of spaces from each
line in the block?

You are also assuming your text is consistently indented from the
first line, that is you don't have

....line 1
..line 2
....line 3

for example. A better way would be (I think) to check first each line
to search for the minimum number of spaces and then remove that number
of spaces from each line (assuming also that you have normal spaces
and no tabulations for example). One way would be

string =3D " line1\n line2\n line3"
puts string
arr =3D string.split(/\n/)
nb =3D arr.collect {|line| line =3D~ /^( *)/ ; $1.length}.min
new_string =3D arr.collect {|line| line.sub(/ {#{nb}}/,'')}.join("\n")
puts new_string

Cheers,

--=20
JJ Fleck
PCSI1 Lyc=E9e Kl=E9ber
 
J

Josh Cheek

[Note: parts of this message were removed to make it a legal post.]

I am trying to find a solution to remove the overall indentation of a
block of text while preserving the relative indentation of each line,
for example

line 1
line 2

(2 spaces then 4 spaces)
should become

line 1
line 2

(0 spaces then two spaces)

so that the two space between lines relative indentation is preserved,
yet the first two spaces overall indentation goes away.

what I have tried so far is string .strip, which seems to remove all
leading space of the first line only

content =
" line 1
line2"
output = content.strip
print output

produces

line 1
line 2

0 spaces then 4.

whereas Im going for

a result of 0 then 2 from starting with 2 then 4.

I assume the solution would probably involve getting the number of
spaces for the first line and removing that number of spaces from each
line in the block?

thanks in advance for your help.

Perhaps

def relative_indented(str)
leading_whitespace = str[/\A\s*/]
str.gsub /^#{leading_whitespace}/ , String.new
end


puts relative_indented <<END_OF_TEXT
Two Spaces
Four Spaces
Six Spaces
Four Spaces
Two Spaces
END_OF_TEXT

A few things, though. Everything is relative to your initial indenting, so
if you have a line later with less indenting, then it will just go to zero
(will not be relative, because it would need negative indenting). You could
get around this by checking each line to find the one with the largest
indenting, and make them relative to that, whereas I have just checked it
against the first line in the string. Also, mixing spaces with tabs will
mess it up, unless you are consistent with your use across every line.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads

Indentation styles 27
Indentation in stdlib 0
Pythonic indentation (or: beating a dead horse) 232
Please help 2
How to remove the undefined thing? 1
if, continuation and indentation 23
Minimum Total Difficulty 0
Algorithm 1

Members online

Forum statistics

Threads
473,755
Messages
2,569,535
Members
45,007
Latest member
obedient dusk

Latest Threads

Top