<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc="urn:schemas-microsoft-com:office:odc" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc="http://microsoft.com/officenet/conferencing" xmlns:D="DAV:" xmlns:Repl="http://schemas.microsoft.com/repl/" xmlns:mt="http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda="http://www.passport.com/NameSpace.xsd" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p="http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss="http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi="http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp="http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl="http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl="http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" xmlns:Z="urn:schemas-microsoft-com:" xmlns:st="" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=EN-US link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal>Summary:<o:p></o:p></p>

<p class=MsoNormal>Is it possible to write a grammar for Haml that provides
proper syntax highlighting on Markdown filters?<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>Details:<o:p></o:p></p>

<p class=MsoNormal>The Haml markup language[1] uses significant whitespace
indentation to produce hierarchical X(HT)ML. For example, this Haml markup...<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>  %html<o:p></o:p></p>

<p class=MsoNormal>    %head<o:p></o:p></p>

<p class=MsoNormal>      %title Hello World<o:p></o:p></p>

<p class=MsoNormal>    %body<o:p></o:p></p>

<p class=MsoNormal>      %h1 Hello World<o:p></o:p></p>

<p class=MsoNormal>      div#content<o:p></o:p></p>

<p class=MsoNormal>        Oh,<o:p></o:p></p>

<p class=MsoNormal>        it's on now!<o:p></o:p></p>

<p class=MsoNormal>      div#footer Copyright 2010.<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>...produces HTML like the following (modulo my tersified presentation)...<o:p></o:p></p>

<p class=MsoNormal>  <html><o:p></o:p></p>

<p class=MsoNormal>  <head><title>Hello
World</html></head><o:p></o:p></p>

<p class=MsoNormal>  <body><o:p></o:p></p>

<p class=MsoNormal>    <h1>Hello World</h1><o:p></o:p></p>

<p class=MsoNormal>    <div id="content">Oh,
it's on now!</div><o:p></o:p></p>

<p class=MsoNormal>    <div
id="footer">Copyright 2010.</div><o:p></o:p></p>

<p class=MsoNormal>  </body></html><o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>Because Haml is focused on _<i>structure</i>_, but HTML is
needed for both structure and _<i>presentation</i>_, Haml lets you include
other well-known markup inline. For example:<o:p></o:p></p>

<p class=MsoNormal>    %body<o:p></o:p></p>

<p class=MsoNormal>      %h1 Hello World<o:p></o:p></p>

<p class=MsoNormal>      div#content<o:p></o:p></p>

<p class=MsoNormal>        :markdown<o:p></o:p></p>

<p class=MsoNormal>          Oh, it's
**on** now!<o:p></o:p></p>

<p class=MsoNormal>          <o:p></o:p></p>

<p class=MsoNormal>          *
Because I like lists.<o:p></o:p></p>

<p class=MsoNormal>          * And
so do you.<o:p></o:p></p>

<p class=MsoNormal>      div#footer Copyright 2010.<o:p></o:p></p>

<p class=MsoNormal>...will run the content indented under :markdown through a
Markdown[2] parser and inject the result as a child of the content element.<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>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.<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>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):<o:p></o:p></p>

<p class=MsoNormal>      {<o:p></o:p></p>

<p class=MsoNormal>        
"begin" : "^(\\s*):markdown\\b",<o:p></o:p></p>

<p class=MsoNormal>        
"end"   : "^(?!\\1)|^\\1\\S",<o:p></o:p></p>

<p class=MsoNormal>        
"patterns" : [<o:p></o:p></p>

<p class=MsoNormal>           
{<o:p></o:p></p>

<p class=MsoNormal>              
"include" : "text.html.markdown"<o:p></o:p></p>

<p class=MsoNormal>           
}<o:p></o:p></p>

<p class=MsoNormal>        
]      <o:p></o:p></p>

<p class=MsoNormal>      },<o:p></o:p></p>

<p class=MsoNormal> <o:p></o:p></p>

<p class=MsoNormal>This naive first attempt showed two problems. <o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>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):<o:p></o:p></p>

<p class=MsoNormal>    %foo<o:p></o:p></p>

<p class=MsoNormal>      :markdown<o:p></o:p></p>

<p class=MsoNormal>        Hello<o:p></o:p></p>

<p class=MsoNormal>        World<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>    %bar<o:p></o:p></p>

<p class=MsoNormal>...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).<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>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.<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>So:<o:p></o:p></p>

<p class=MsoNormal>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<o:p></o:p></p>

<p class=MsoNormal>b) Strip off that leading whitespace before passing it to
the other grammar?<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>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.<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>Someone take up the torch. This yak is too hairy for me. :)<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>[1] <a href="http://haml-lang.com/">http://haml-lang.com/</a><o:p></o:p></p>

<p class=MsoNormal>[2] <a href="http://daringfireball.net/projects/markdown/">http://daringfireball.net/projects/markdown/</a><o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal><a
href="http://groups.google.com/group/haml/browse_frm/thread/2a67aa977a1987a4">http://groups.google.com/group/haml/browse_frm/thread/2a67aa977a1987a4</a><o:p></o:p></p>

</div>


<DIV>
<HR>
</DIV>
<DIV>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. </DIV>
<DIV>
<HR>
</DIV>
<P></P>
</body>

</html>