Haml 3.1.6.rc.1 released
Recently I released 3.1.5 to work around a change in Rails 3.2.3 which made textarea helpers append newlines to the opening tag. Rails’s motivation for this change was to fix a longstanding bug which impeded the ability to save texarea content with leading newlines.
Unfortunately, Haml 3.1.4 treated this newline as content, rather than as a seperator between the textarea tag and its content.
Solving the issue was not simply a matter of decoding the newline, because in indented mode, Haml would add spaces before the newline in partials, making nested textareas have spaces before their content.
Haml 3.1.5 solved this by adding <haml:newline/> rather than a newline, and monkeypatched Rails to replace it with a real newline after the document was rendered. You ever do something you just *know* is going to cause problems, even though all your tests seem to indicate things are working fine? Yeah, I know that feeling.
As it turns out, monkeypatching how Rails does the actual rendering is not as easy as it seems. First, because there are several places where a monkey patch needs to be applied. Second, because those modules are not always loaded, and it’s not very nice to force people to load them in order to use Haml: an application may have a very good reason not to have loaded part of Rails.
Last but not least, the monkeypatch caused <haml:newline/> to appear in some Erb documents when the Haml gem was loaded for use elsewhere in the applcation.
Haml 3.1.6 attempts a simpler and wiser solution to the issue. Rather than adding some silly tag (WTF was I thinking???), Haml now replaces the first encoded newline emitted by Rails’s textarea helper methods with a real newline. Then, when rending the Haml document in ugly mode, everything works exactly as you would expect, with no need to monkepatch Rails’s template rendering.
However this comes with a tradeoff: in order to not completely break textareas in indented mode, Haml will now make no attempt to reindent a partials or the output of helpers when they match a very simple regular expression for opening <textarea>, <pre>, or <code> tags.
This makes textareas work properly in Haml 3.1.6. at the expense of slightly uglier documents, when those documents contain the listed tags.
Now, everybody knows that you shouldn’t rely on regular expressions to parse HTML. This is where another tradeoff comes in: parsing the buffer with an XML parser would have a much larger impact on performance, and Haml is already slow enough as it stands in indented mode. So I’ve compromised and used a simple, somewhat braindead, but fast regexp.
This issue has been nagging and annoying, and I apologize to anybody affected by this, most especially for the <haml:newline/> silliness in introduced in 3.1.5. Please give Haml 3.1.6 a try (it’s currently in the stable branch) and on Rubygems and let me know if you come across any problems. I’ll try to get this release out as soon as possible.
To install via Rubygems, simply do: gem install haml -v 3.1.6.rc.1 —pre
Or, add it to your Gemfile: gem “haml”, “3.1.6.rc.1”
The change is also in the master branch, for those who like to live dangerously.