¿Cómo soluciono esta expresión regular multilínea en Ruby?

Tengo una expresión regular en Ruby que no funciona correctamente en modo multilínea.

Estoy tratando de convertir el texto de Markdown en el marcado Textile-eque utilizado en Redmine. El problema está en mi expresión regular para convertir bloques de código. Debería encontrar cualquier línea que comience con 4 espacios o una pestaña, luego envolverla enpr etiquetas.

markdownText = '# header

some text that precedes code

    var foo = 9;
    var fn = function() {}

    fn();

some post text'

puts markdownText.gsub!(/(^(?:\s{4}|\t).*?$)+/m,"<pre>\n\\1\n</pre>")

Resultado previsto:

# header

some text that precedes code

<pre>
    var foo = 9;
    var fn = function() {}

    fn();
</pre>

some post text

El problema es que el cierrepra etiqueta @ se imprime al final del documento en lugar de después de "fn ();". Intenté algunas variaciones de la siguiente expresión pero no coincide:

gsub!(/(^(?:\s{4}|\t).*?$)+^(\S)/m, "<pre>\n\\1\n</pre>\\2")

¿Cómo obtengo la expresión regular para que coincida solo con el bloque de código sangrado? Puede probar esta expresión regular en Rubularaqu.

Respuestas a la pregunta(4)

Su respuesta a la pregunta