从代码中删除缩进

时间:2013-02-06 01:34:05

标签: ruby string metaprogramming

我正在尝试创建一个函数,从代码中删除无关的开始标签,使其显示得更整齐。就像在,我希望我的功能转向:

    <div>
      <div>
       <p>Blah</p>
      </div>
    </div>

进入这个:

<div>
  <div>
   <p>Blah</p>
  </div>
</div>

(所有这一切的目标是创建一个Rails部分,我可以粘贴格式化代码,以便在左侧对齐的预标记中显示。)

到目前为止,我已经有了这个,但这是错误的,我不知道为什么。从来没有使用过gsub,所以我猜测问题就在那里(虽然调试说明也指向第一个“结束”行):

def tab_stripped(code)
  # find number of tabs in first line
  char_array = code.split(//)
  counter = 0
  char_array.each do |c|
    counter ++ if c == "\t"
    break if c != "\t"
  end

  # delete that number of tabs from the beginning of each line
  start_tabs = ""
  counter.times do 
    start_tabs += "\t"
      end
  code.gsub!(start_tabs, '')
  code
end

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

来自我的个人图书馆(稍作修改):

class String
  def unindent; gsub(/^#{scan(/^\s+/).min}/, "") end
end

它比你要求的更为通用。它不仅可以处理制表符,还可以处理空格,它不会调整到第一行,而是调整到最小的缩进行。

puts <<X.unindent
    <div>
      <div>
       <p>Blah</p>
      </div>
    </div>
X

给出:

<div>
  <div>
   <p>Blah</p>
  </div>
</div>