2012-07-15 15 views
1

對這一問題的How do I remove leading whitespace chars from Ruby HEREDOC?如何刪除導致從一個Ruby定界符空白,而維修器材2個前導空格

部分回答了在Rails 3有一個方法#strip_heredoc,即去掉所有的空格。 但是,在現有文件中插入行時,該文件已具有身份識別功能,但這種功能無法正常工作。一個例子:

begin 
    insert_into_file "#{app_name}/config/environments/production.rb", <<-DEVISE_MAILER_STUFF.strip_heredoc, :before => "end\n" 
    # for devise 
    config.action_mailer.default_url_options = { :protocol => 'https', :host => 'YOURHOSTNAME' } 
    config.action_mailer.delivery_method = :smtp 
    something.each do |x| 
     do stuff 
    end 
    DEVISE_MAILER_STUFF 
end 

在「開始」和「end」只添加到表明該源代碼有縮進。 heredoc在'#for devise'之前有4個空格。 @strip_heredoc將刪除所有這些空格,但它將在'do stuff'行中保留兩個額外的空格。

environments/production.rb這將是這樣的:

MyApp::Application.configure do 
    # Settings specified here will take precedence over those in config/application.rb 
    # *** Identation here is two spaces! (We are in a block.) *** 

# for devise 
config.action_mailer.default_url_options = { :protocol => 'https', :host => 'YOURHOSTNAME' } 
config.action_mailer.delivery_method = :smtp 
something.each do |x| 
    do stuff 
end 

    # back to original identation of this file 
end # MyApp::Application.configure block! 

如何解決這個問題? 也許有其他方法而不是heredoc? 我想也許strip_heredoc(min)其中min是保留空間的最小值,但是這並不適用於我猜的標籤。或有定界符的第一行確定的左邊空白處,這樣的:

puts <<-HEREDOC 
    FIRST_LINE 
    Real code here 
HEREDOC 

這FIRST_LINE'將通過strip_heredoc被刪除,但它也將設置的空間/空格需要被刪除的號碼。所以輸出將在'真實代碼'前面有2個空格。

更新:也許是這樣的:

String.class_eval do 
    def strip_heredoc_with_indent(indent=0) 
    new_indent = (self.empty? ? 0 : (scan(/^[ \t]*(?=\S)/).min.size - indent)) 
    gsub(/^[ \t]{#{new_indent}}/, '') 
    end 
end 
+0

可能重複http://stackoverflow.com/questions/3772864/how-do-i-remove-leading-whitespace-chars-from -ruby-heredoc) – 2014-01-03 17:01:21

回答

0

它自己帶。

insert_into_file "#{app_name}/config/environments/production.rb", 
       <<-DEVISE_MAILER_STUFF.gsub(/^ /, ''), :before => "end\n" 
    ... 
DEVISE_MAILER_STUFF 

這就是說,在每行的開始處,用空字符串替換兩個空格。這很簡單,很容易理解,很容易修復或改變。


或者,你可以做到這一點在你的模板,但如果你實際使用的模板,或者如果你正在解析以某種方式的文件,並替換行(提示我也說不清,你應該可能是使用模板)。


「我想,也許strip_heredoc(分鐘),其中min是空間保持最小,但不會與標籤的工作WEL,我猜。」

Ruby標準是兩個空格。即使它不是,標籤總是把所有東西都搞砸了。使用空格。


關於你提到的更新

很複雜。你需要一個像這樣的通用解決方案嗎?你在很多地方做過這個嗎?或者在不能只看一眼的地方,看看gsub有多少?此外,擴展核心類是一個危險的遊戲,我已經看到了停滯在Rails 1和定製的Ruby 1.8上的代碼庫,因爲它們對改變內置行爲太過於傲慢。當它發生變化時,他們無法改變它。我知道Rails做到了,但Rails不是最佳實踐的好參考。

它也有一些潛在的錯誤:

  • 當給這個字符串,並通過無參數,可以又該怎麼做呢? 「a \ n \ n b」我不會期望任何東西,因爲最短的一行是空行,所以你的new_indent應該是零,但它會是一個。
  • 當他們通過的縮進超過scan(...).min.size時會發生什麼?
  • 如果他們傳遞負面信息會發生什麼?

對我來說,它最終看起來像一個複雜的解決方案,它永遠不會真正正確,它將任何使用它的代碼耦合到這個應用程序,而所有這些可能實際上並不是必需的。

+0

感謝您花時間回答這個問題。但是,當我將代碼包裝到模塊中時,請在我的IDE中按Alt-Shift-F,然後將所有內容向右移動2個距離。這意味着gsub(/^/,'')不會再削減蛋糕。 如果有人放入某些否定的內容,或者縮進量超出了計算的最小縮進量,您是對的。這會導致負面的new_indent,這在正則表達式中可能無效。 當沒有給出參數時,默認情況下,縮進將爲0。 new_indent將是1,按照最短的一行,但空行不會有空格,所以正則表達式不會做任何事情。 – 2012-07-16 01:01:06

+0

實際上,要使第一行成爲'空'行,就需要添加空白。這也是鐵軌strip_heredoc AFAIK的一個奇怪現象。 – 2012-07-16 01:01:13

2

我跟strip_heredoc_with_indent(indent)一起去了here

+0

[這些技術](http://melborne.github.io/2012/04/27/ruby-heredoc-without-leading-whitespace/)也是值得注意的,絕不會妨礙語言。我已經在頁面上的最後一個解決方案(搜索Twitter提及)上取得了成功。 – Dr1Ku 2014-02-28 12:34:24

0

您可以使用某種分隔符來指示左邊距。

def heredoc_with_margin() 
    doc = <<-EOT.gsub(/^\s*\|/, '') 
    |top: 
    | sub-one: 
    | sub-sub-one 
    | sub-two: 
    | sub-sub-two 
    EOT 
    return doc 
end 
的[我如何刪除從紅寶石HEREDOC前導空格字符?(
相關問題