Summary:
Is it possible to write a grammar for Haml that provides proper syntax 
highlighting on Markdown filters?

Details:
The Haml markup language[1] uses significant whitespace indentation to produce 
hierarchical X(HT)ML. For example, this Haml markup...

  %html
    %head
      %title Hello World
    %body
      %h1 Hello World
      div#content
        Oh,
        it's on now!
      div#footer Copyright 2010.

...produces HTML like the following (modulo my tersified presentation)...
  <html>
  <head><title>Hello World</html></head>
  <body>
    <h1>Hello World</h1>
    <div id="content">Oh, it's on now!</div>
    <div id="footer">Copyright 2010.</div>
  </body></html>

Because Haml is focused on _structure_, but HTML is needed for both structure 
and _presentation_, Haml lets you include other well-known markup inline. For 
example:
    %body
      %h1 Hello World
      div#content
        :markdown
          Oh, it's **on** now!

          * Because I like lists.
          * And so do you.
      div#footer Copyright 2010.
...will run the content indented under :markdown through a Markdown[2] parser 
and inject the result as a child of the content element.

If you didn't know, there already exist bundles for both Haml (under "Ruby 
Haml") and Markdown. However, the Haml bundle does not recognize the :markdown 
filter specifically, or ask the Markdown grammar to process it.

I started to try to do this. Here's a pattern I injected semi-randomly into the 
Haml grammar (in the JSON notation presented by the Bundle editor for 
e-texteditor):
      {
         "begin" : "^(\\s*):markdown\\b",
         "end"   : "^(?!\\1)|^\\1\\S",
         "patterns" : [
            {
               "include" : "text.html.markdown"
            }
         ]
      },

This naive first attempt showed two problems.

First (and less important), I couldn't get it to stop when I needed it to. It 
worked on the following text (caused the 'bar' line not to be treated as 
Markdown):
    %foo
      :markdown
        Hello
        World

    %bar
...but when I got rid of the newline between World and %bar, the bar line was 
being treated as Markdown. I'm not sure why, since this line (which is indented 
by less whitespace than ":markdown") does not begin with the same whitespace 
(the first regexp pattern in the alternation of the 'end' pattern).

The second (far less workable) problem is that for those lines that were being 
treated as Markdown, the full lines--including all the extra leading whitespace 
required by Haml--were being processed. In Markdown, this makes all the text be 
treated (and syntax-highlighted) as a preformatted text block; clearly not the 
intent.


So:
a) Can you write a grammar pattern that says "Find everything indented more 
than this much (as captured by begin) and pass it off to this other grammar", 
but
b) Strip off that leading whitespace before passing it to the other grammar?

It would be non-ideal but still useful in this case to even perform this 
whitespace-stripping on a line-by-line basis and pass each stripped line to the 
other grammar.

Someone take up the torch. This yak is too hairy for me. :)



[1] http://haml-lang.com/
[2] http://daringfireball.net/projects/markdown/

http://groups.google.com/group/haml/browse_frm/thread/2a67aa977a1987a4

-----------------------------------------------------------------------------------
This email message is for the sole use of the intended recipient(s) and may 
contain
confidential information.  Any unauthorized review, use, disclosure or 
distribution
is prohibited.  If you are not the intended recipient, please contact the 
sender by
reply email and destroy all copies of the original message.
-----------------------------------------------------------------------------------
_______________________________________________
textmate-dev mailing list
[email protected]
http://lists.macromates.com/listinfo/textmate-dev

Reply via email to