2

次のような外部ライブラリの文字列があります。

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

インデントに注意してください。ただし、私がやりたいことは、次のように、さらに 2 つのスペースを均等にインデントしたテキストを挿入することです。

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

私がこれを行う場合:

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

次に、最初の行のみがインデントされます。

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

これは、最初の文字列を変更することで実現できます..

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

..しかし、それは少し面倒です。私は本当にビューでそれをしたくありません。ERB で文字列全体をインデントする方法はありますか? 私はそうかもしれないと思います。

4

2 に答える 2

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, "  ")
于 2013-06-29T16:49:31.197 に答える