使用正确的缩进插入多行字符串

Interpolate multiline string with correct indent

当我试图将一个多行字符串插入另一个多行字符串时,我得到了错误的缩进,因为只有子字符串的第一行有正确的缩进,例如:

substring = <<-STRING.strip_heredoc
  first line
  second line
STRING

string = <<-STRING.strip_heredoc
  Quote
    #{ substring }
  from substring
STRING

结果如下:

  Quote
    first line
second line

  from substring

而想要的是

Quote
  first line
  second line
from substring 

我的问题与 this question about perl and xml, or this one about erb 中的问题几乎相同,但更笼统一些。

考虑到插值不仅可用于生成任何 SGML(XML、HTML 或 ERB),而且可用于生成 SQL 和其他语言...

是否有任何方式、方法或惯例来插入具有正确缩进的多行字符串?

如果没有办法,你会推荐什么工具来post处理不同的语言(例如HTML,SQL)


更新:

Ruby 2.3 功能 <<~ 类似于 strip_heredoc 仍然(显然)仅在子字符串的第一行添加缩进

我一觉醒来看到了这个问题,决定把它作为一个早上的编程难题来解决。这比我想象的要难。我对 API 或复杂性并不满意,但我不想再花时间了,它确实有效。也许你会发现它很有用。如果没有,也许它至少会激发其他一些替代方法。

我不知道有任何库或框架可以使用简单的 Ruby Here Documents 满足您的需求。 Ruby 2.3 has a new feature 基本上完成了 Rails' #strip_heredoc 的工作,但我没有使用过它,我不知道它如何处理多线插值。这是我根据您的用例(使用 Ruby 2.0)自定义解决方案的 Ruby 代码:

https://gist.github.com/shock/1d269a91f938bf1a1c3cba3856bedf19