Это не проблема для длинных регулярных выражений. Это можно сделать с помощью этого, но фиксация на шаблоне затуманивает проблему:
html = <<EOT
feed << feed_item.attributes.merge({
:photo_url => feed_item.user.cloudfront_url(:thumb),
:full_name => full_name,
:meta => '',
:embed_preview => embed_preview,
:embed_preview_meta => embed_data
})
EOT
code = html.scan(/^ {4}.+/).join("\n")
formatted_code = "\n<pre><code>\n" + code + "\n
\ п»
помещает html.sub (код, formatted_code)
Который выдаст:
<pre><code>
feed << feed_item.attributes.merge({
:photo_url => feed_item.user.cloudfront_url(:thumb),
:full_name => full_name,
:meta => '',
:embed_preview => embed_preview,
:embed_preview_meta => embed_data
})
Код ищет строки, начинающиеся с четырех пробелов и возвращающие их в виде массива, соединяя их с возвратами каретки, затем заключая их в блоки <pre><code>
.
Это не будет работать с несколькими несмежными блоками кода с отступом, но с небольшим изменением структуры.
Слишком часто мы зацикливаемся на конкретном решении и думаем, что оно должно выглядеть определенным образом. Регулярные выражения особенно соблазнительны. Они очень быстро усложняются, что затрудняет их обслуживание.