2013-06-29 2 views
0

У меня есть строка из внешней библиотеки, которая выглядит следующим образом:Отступ многострочных строк в Еврорадио

s = " things.each do |thing|\n thing += 5\n thing.save\n end\n\n" 

Эта строка ввод не собирается менять. Мне нужно вставить его в файл с помощью ERB. например:

erb = ERB.new("<%= s %>") 
File.write("test.txt", erb.result(instance_eval('binding')) 

Моя проблема заключается в отступе. Без внесения каких-либо изменений в строку файл будет записан следующим образом:

things.each do |thing| 
    thing += 5 
    thing.run 
    end 

Обратите внимание на отступ. То, что я хочу сделать, однако, чтобы вставить текст равномерно отступом еще два пробела, например, так:

things.each do |thing| 
     thing += 5 
     thing.run 
    end 

Если я это сделать:

erb = ERB.new(" <%= s %>") 

Тогда только первая строка будет отступом ,

things.each do |thing| 
    thing += 5 
    thing.run 
    end 

I может добиться этого путем изменения начальной строки ..

erb = ERB.new("<%= s.gsub(/ (\w)/, " \\1") %>") 

.. но это чувствует себя немного грязный. На самом деле я не хочу этого делать. Есть ли способ отступов всей строки в ERB, или мне не повезло? Кажется, я могу быть.

+0

Вы пробовали это? 'ERB.new (" <% = '' + s%> ")' (это добавленная 2-пространственная строка). – lurker

ответ

1

Я не думаю, что для вашей проблемы есть встроенное решение. Но это не значит, что вы не должны просто создать свой собственный :)

Что-то, как это должно работать:

class CodeIndenter < Struct.new(:code, :indentation) 
    def self.indent(*args) 
    self.new(*args).indent 
    end 

    def separator 
    "\n" 
    end 

    def indent 
    code.split(separator).map do |line| 
     indentation + line 
    end.join(separator) 
    end 
end 

s = " things.each do |thing|\n thing += 5\n thing.save\n end\n\n" 
puts CodeIndenter.indent(s, " ") 
Смежные вопросы