36 comments

[ 3.4 ms ] story [ 164 ms ] thread
I don't hate Haml, but I think HTML is ok as HTML, especially for those cases where I want someone who is not a developer to work on a template.
I've wondered if haml is just a reaction to I don't like XML mindset, so we'll invent a new syntax. Personally I like SASS, since it needed hierarchy defined. But cleanly written HTML gives you that (yes, you need close tags, but I already write closing parenthesis).
I resisted haml for a long time because of this; "HTML is good enough, why change it?" and then I found out that it's really, really useful.

I'm currently dual-maintaining a theme in Wordpress and a Rails app; the former is PHP with your standard interpolated HTML, and the latter is haml. Guess which one is harder to maintain? (Hint: It's the Wordpress theme, by about three hundred miles).

I personally found HTML + PHP a pain after playing django and it's template model found it removed most of the pain that I was encountering.
The OP does know that HAML supports straight HTML as well right? The following is perfectly valid:

%h2 Heading content

%p This is just some <em>emphatic</em> text. Maybe I'll talk about <code>$BASH_VERSION</code> here.

Personally I'll never go back to writing straight HTML ever again. It's ridiculously verbose, uses characters that are very hard to type, and it's easy to forget to close a tag and not realize it.

In which the OP can't figure something out so they choose to flame it instead.

The OP provides the following example as a irrefutable damnation of haml:

%h2 Heading content

%p This is just some

  %em emphatic

  text. Maybe I'll talk about

  %code $BASH_VERSION

  here.


They complain about the inability to nest em and code tags on a single line.

Hey OP, try this:

%h2 Heading content

%p This is just some <em>emphatic</em> text. Maybe I'll talk about <code>$BASH_VERSION</code> here.

or did you forget that you can mix html in with haml where needed? Pointless, sloppy, flame-bait. /endrant

I was reluctant to learn HAML myself, but after being "forced" to do so on a project last spring, I actually cringe when I see standard HTML and CSS now. Not only has haml shrunk the size of my code by almost half, it has made it easier to scan, maintain, and my css matches up much more closely to my markup. Simply put, HAML/SASS is one of the biggest productivity/sanity boosts I've experienced in my young development career.

*edit: spelling, and formatting.

He's explicitly asking if there's a better way to do that (read the last paragraph), so lighten up.

PS - You spelled "flame-bait" wrong.

He titled it "I Hate Haml." There are better ways to ask for help.

PS - Pointing out my misspelling of "flame-bait" is flame-bait.

Indeed.

So hey, to make something of this discussion: Am I correct in thinking HAML is fairly closely tied to Ruby? I'm quite familiar with Markdown* , but don't use Ruby. As long as we're committing to a given language for an ersatz HTML syntax, I prefer CL-WHO (http://weitz.de/cl-who/) or a similar approach in Lua, JSON, etc.

Also, it doesn't look like there's cross-language support, which is a major advantage for Markdown, JSON, and other such formats.

* My favorite implementation is discount (http://www.pell.portland.or.us/~orc/Code/discount/), which is written in C, quite fast, and has a good test suite and pretty clean API.

I'm not sure, I've never tried using it outside of a rails/sinatra app, but I'm pretty sure you can have it generate the proper files for whatever language you're developing in. It ends up just being html, after all. Maybe somebody else has a better answer?
There's a command-line version, so presumably you could use it that way, but I've also only ever come across it in the Ruby world.
Yes I do believe haml is built pretty strictly to Ruby. I haven't seen or heard of anything from the project about switching out what interpreter handles interpolation ( - and = ) as well as in-line for attributes:

%div{:class => [ruby code here]}

Yes, HAML is directly tied to Ruby.

Although there are PHP ports out there in progress.

There is also a Ruby Discount gem, rdiscount.

A few Python versions, too (two projects that call themselves pyhaml).
He titled it "I Hate Haml." There are better ways to ask for help.

No doubt, except that I hate Haml. You're absolutely right that it was a quick sloppy post on my part. That said, I stand by my feelings (as personal reactions to how Haml looks and the choices it makes) and the HTML2Haml site suggested (by implication of how it converts things) that newlines was the way to do it. I absolutely didn't realize that you could include straight HTML inside Haml (and the docs don't make this overwhelmingly obvious). I now see this in the docs under "Plain Text":

> Note that HTML tags are passed through unmodified as well. If you have some HTML you don’t want to convert to Haml, or you’re converting a file line-by-line, you can just include it as-is.

But I wasn't looking in the section on "Plain Text" since I wanted marked-up text. Still, my fault for not reading the docs more carefully before ranting.

Thanks for the tip and response (to you and to everyone here). I'm updating the post now. Changes should go up in no more than an hour. Edit: Changes are live. Thanks again to all commenters.

In addition, you can use something like the markdown filter for body text.

    :markdown
      ## Heading Content
      
      This is just some *emphatic* text. Maybe I'll talk about `$BASH_VERSION` here.
As someone who uses HAML constantly:

1. :markdown doesn't accept classes, ids, or any other modifiers like %tags. This makes for some difficult fugging.

2. You cant do - ruby or = ruby under :markdown or similar.

This is terribly inconsistent and requires some stupid work arounds.

1. Discount, used by both RDiscount and BlueCloth, supports limited use of classes in inline text via pseudo-protocols in link-style tags. You can also use inline HTML in markdown. I believe that the latter is what most people do.

2. You can do the equivalent of = in Haml filters by enclosing the Ruby in #{}. For example, where sign_up_path is a Ruby helper method:

    :markdown
      [Sign Up](#{sign_up_path})
Personally, in the past I've put large blocks of mostly-static content (eg, a TOS) in a erb template or partial. I now often use the markdown filter for things like help documentation in my sites.
The :markdown "symbol" doesn't take a class.

    :markdown.red#item2

    %list:markdown.red#item2

    %list.red#item2:markdown
...
Forgive me if I'm misunderstanding your point, but :markdown isn't a tag that gets output to html, it just designates the beginning of the block to be processed with markdown, so classes and ids aren't applicable. If you want the markdown block in a class or id, you just do this:

    #id.class
      :markdown
        [A link](/path)
outputs:

    <div id="id" class="class">
      <a href="/path">A link</a>
    </div>
1.That's inconsistent and just blows up the page size.

2. It would be deadly easy to have inline markup. Say: %p La la %strong la % la la.

3. The whole point of using HAML is to get rid of using the annoying HTML syntax. (Remember the tagline 'Markup haiku'?

Haml hits the wrong points for me as well:

- Too much syntax for a pure writing markup languages, compared to Markdown or Wiki syntaxes

- Too little syntax compared to even syntax light languages like JSON or [HT|X]ML (when written with zen coding or a tag matching editor)

It's just kind of awkward. Useful when embedded into rails, but not as a general use markup language.

Re: your first point, it's not a standalone markup language, it's a 1-to-1 replacement for HTML. Markdown is transformed into HTML, but doesn't have to be -- you could PDF it instead, for instance. It's mostly just a way to use structure to eliminate line noise.
Haml isn't really for what the author of this article was doing -- writing actual prose. He has it right in the first paragraph: something like Markdown is great for that sort of thing.

For displaying structured data, as one might do in a view in a web application, Haml shines. Just think about table code.

Nobody with sense has ever said Haml is a great replacement for HTML in all cases. But it's useful and (arguably) more pleasant to use within its domain.

I don’t use Haml myself, but I have read that this is not how you are supposed to write long text in it. The recommended way to write paragraphs with a lot of tags is to use a filter, like Markdown or Textile. This is a better way to write the sample paragraph in the article, using Markdown:

  %h2 Heading content
  %p
    :markdown
      This is just some *emphatic* text. Maybe I'll talk about `$BASH_VERSION` here.
Note that Markdown allows you to embed normal HTML tags within itself, in case it doesn’t provide syntax for the tag you want. I’m not sure what the Haml stance is on that practice.
Haml is great for structure, not for content. Chris Eppstein wrote a great post on this that worth reading:

http://chriseppstein.github.com/blog/2010/02/08/haml-sucks-f...

That's absolutely correct. I think too many people have a misconception of what haml is good for.

Personally, I use haml for all my rails view layouts. Anything more complicated than a wrapper div gets rendered in a separate .erb partial. This makes it very easy to shuffle around different parts of the layout when needed.

That makes a lot of sense, and neatly explains why I so strongly prefer Markdown. Thanks for posting this.
I don't "like" it either, but I don't think it sucks technically. A lot of people find it useful and there's clearly value in the abstraction.

Where it fails for me is that I don't (rightly or wrongly) see (or treat) HTML as a tightly structured language. Whereas tight formatting is beneficial for languages with minimal syntax, like CSS, in HTML I appreciate the flexibility of putting spacing and elements where I like or where I feel it makes sense (but I love SASS/SCSS as it merely enhances an already tightly structured language). As ever, different strokes for different folks.

Wow, it's the second coming of Troff!
This article should be titled "I don't understand Haml".

Simple tags for ya buddy:

:plain

:textile

:javascript

Another complaint I have with HAML is its treatment of whitespace. Consider:

    %p
        %span.underlinedText this is underlined
    \.
 
 
This will underline " this is underlined ", with the spaces, which looks messy. You can extrapolate this behavior to even messier cases, but you get my point. HAML's solution is:

    %p
        %span.underlinedText><
            this is underlined
        %span><
            \.
Fun, right? However, I still consider HAML to be a beautiful replacement for raw HTML.
Haml's great for outlining the structure of a document. For static pages with lots of em's strong's and such it's better to use something like markdown. Luckily you can easily embed markdown inside HAML. Just mark off a block with :markdown and you're done, you can put markdown in your HAML now.

No one language can give you everything, but haml's the best I've found AND it makes it easier to mark certain areas as :plain, :erb, or :markdown or whatever custom filter you dream up. So, it lets you switch more easily than any other language when you need to.

You can use this if you prefer to use html for some stuff:

== <p>This is just some<em>emphatic</em> text. Maybe I'll talk about <code> $BASH_VERSION </code></p>

Also exist 'plain' tag: :plain html stuff here another line easy :)

Use both.

At Poll Ev we use erb for content and haml for "application" pages.

> I should admit that I've used Haml for a total of about 15 minutes.

C'mon son.