I guess I set myself up? You make some good points about why HTML is a pain in the ass. I'm just desensitized to it to the point that it doesn't bother me anymore. In fact, I didn't even think of the issues you brought up.
What it took for me was writing a UI in Haml with very minimal, semantic markup and all the controls keyed in jQ off classes and IDs.
When you structure your HTML, CSS, and Javascript correctly, Haml is absolutely gorgeous. You're no longer writing in HTML: you're writing in a DSL designed to express user interface. For instance, a "save" button encoded in a DIV in Haml:
Does Haml allow you to control how the actual markup is produced? Some browsers are dependent on a lack of whitespace between nodes in order to render properly without adding some extra padding (IE for instance). For me, the main issue is control over my markup. Exact and precise control, which is necessary.
You can use the alligator operators to trim surrounding and internal whitespace. E.g.
.foo> This has no whitespace outside the foo div.
.foo< This has no whitespace just inside the foo div.
.foo>< This has no whitespace outside or inside.
Haml does allow for finer-grained control over whitespace, but even if that's not enough, when needed you can still "embed" plain-old html directly inside of your Haml files.
I guess I fail to see how html has any advantage over haml. The absolute worst case is that you're still writing html in 90+% of the cases (which you'd be doing anyway without haml), and in the best case, your markup becomes much more DRY and readable.
Well, I seem to always have formatting issues with haml, though probably because I haven't worked enough with haml yet to internalize the whitespace rules. No such issues with html of course. Not a huge advantage, but can make it annoying when you're first starting with haml.
Tool support is a good reason to not use haml. I expect tool support will be there some day, but it's not really there yet. RubyMine has very nice haml support tho.
%button#Save.positive(name='Save' type='submit' tabindex='10')
%img(src='/graphics/icons/save.png')
Save Changes
That button in your example, of course, has a lot of attributes, more than most elements in a typical template. Also, if you are using it with Rails it'd be in a form block with a helper:
= f.submit 'Save Changes', :class => 'positive'
which would generate an <input> that you'd then style with CSS (or Sass :-D)
Note that with Haml you can also write any sort of helpers you want, so you could have something as simple as
= button
doing whatever you want it to.
Where it gets really interesting, however, is when you are dealing with full templates. The document structure is instantly apparent, most superfluous noise is gone, classes and ids are given top billing and templates are very short despite retaining all of the information.
> The document structure is instantly apparent, most superfluous noise is gone
Except that normally document structure is already apparent. Most people don't write HTML pages from top to bottom -- sites consist of a common header, footer, sidebars, etc. Common controls (such as buttons, date selectors, voting tools, etc) can hide most of the superfluous noise. What then remains is easy to follow. It seems like Haml is to HTML what assembler is to machine language -- it's merely a 1-to-1 translator. Which is great if you want to work at that level but it seems you could get more bang for your buck with a higher level tool.
The big disadvantage of Haml is that it isn't HTML. Now using any template engine takes you away from HTML, but hopefully you get some real value added. With Haml, it's the same structure with a better markup. I don't see what the big deal is.