2013-02-06 51 views
0

我試圖創建一個從代碼中刪除多餘的起始標籤以使其顯示得更整齊的功能。正如,我想我的函數把這個:從代碼中刪除縮進

<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 

任何想法?

回答

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> 
+1

這是美的東西,尤其是相對於我的爛攤子以上。謝謝! – Sasha

+1

注意,這對混合引導標籤和空格不能正常工作,這種情況經常出現在源代碼的源代碼中。許多編輯器允許標籤以不同數量的空格顯示,並且在可能的時候用標籤代替前導空格。 –

+0

@theTinMan即使空格和製表符混合在一起,只要它是一致的,例如,如果每個縮進都以「\ t \ t」開頭,那麼它仍然可以正常工作,那麼沒關係。如果某些行以'「\ t」開頭,而另一些行以'「」開始,那麼它將無法正常工作,但我會責怪程序員,在這種情況下,應修復源代碼。 – sawa