Интерполировать многострочную строку с правильным отступом

Когда я пытаюсь интерполировать одну многострочную строку в другую, я получаю неправильный отступ, потому что только первая строка подстроки имеет правильный отступ, например:

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 

Мой вопрос почти такой же, как и в этом вопросе о perl и xml, или это об erb, но немного более общее.

Учитывая тот факт, что интерполяция может быть полезна не только для генерации любого SGML (XML, HTML или ERB), но и для SQL и других языков...

Есть ли какой-либо способ, метод или обычная практика для интерполяции многострочной строки с правильным отступом?

Если нет возможности, какой инструмент вы бы порекомендовали для постобработки разных языков (например, HTML, SQL)


Обновлять:

Функция Ruby 2.3 <<~, которая является аналогом strip_heredoc, по-прежнему (и очевидно) добавляет отступ только к первой строке подстроки.


person Nick Roz    schedule 21.07.2016    source источник


Ответы (1)


Я проснулся и увидел этот вопрос, и решил сделать его утренней головоломкой по программированию. Это было сложнее, чем я думал. Я не в восторге от API или сложности, но я не хотел тратить больше времени, и это действительно работает. Может быть, вы найдете это полезным. Если нет, возможно, это, по крайней мере, вдохновит на некоторые другие альтернативные подходы.

Я не знаю каких-либо библиотек или фреймворков, которые удовлетворяли бы ваши потребности, используя обычные Ruby Here Documents. В Ruby 2.3 появился новый функция, которая в основном делает то, что делает #strip_heredoc в Rails, но я не использовал ее и не знаю, как она обрабатывает многострочную интерполяцию. Вот код Ruby для моего пользовательского решения на основе вашего варианта использования (с использованием Ruby 2.0):

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

person Bill Doughty    schedule 21.07.2016
comment
Да, спасибо, я знаю о возможности Ruby 2.3. Обновленный вопрос в соответствии с ним. проверю ваше решение - person Nick Roz; 21.07.2016
comment
Красиво сделано, снял. Может как-нибудь улучшу - person Nick Roz; 21.07.2016
comment
Я бы предложил отредактировать ваш ответ и добавить, что ваше решение написано на Ruby. Хотя в моем вопросе также используется Ruby, могут быть и другие ответы, учитывающие использование других языков. - person Nick Roz; 21.07.2016
comment
@NickRoz, в моем ответе говорится, что он использует Ruby 2.0, и, поскольку вы отметили свой вопрос Ruby, а ваш код — Ruby, я был бы удивлен, если бы вы получили какие-либо ответы на других языках. В любом случае, я обновил свой ответ, чтобы он был более явным. Надеюсь, ты примешь это, если пойдешь по этому пути. И если вы улучшите его, пожалуйста, опубликуйте свое обновление. Мне было бы интересно увидеть это. Спасибо. - person Bill Doughty; 21.07.2016
comment
Спасибо за ваши старания! Я хотел бы немного подождать с принятием ответа, чтобы собрать больше разных решений и объяснений. Удален тег ruby, надеюсь, это сделает вопрос более широким - person Nick Roz; 22.07.2016
comment
Я все еще жду новых ответов, но голосую за ваши. Довольно интересное решение. - person Nick Roz; 04.08.2016