<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alson Kemp &#187; Haskell</title>
	<atom:link href="http://www.alsonkemp.com/tag/haskell/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alsonkemp.com</link>
	<description>Hackfoofery</description>
	<lastBuildDate>Fri, 16 Jul 2010 18:18:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>A HAML parser for Haskell</title>
		<link>http://www.alsonkemp.com/programming/a-haml-parser-for-haskell/</link>
		<comments>http://www.alsonkemp.com/programming/a-haml-parser-for-haskell/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 05:56:30 +0000</pubDate>
		<dc:creator>alson</dc:creator>
				<category><![CDATA[Geekery]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[HAML]]></category>
		<category><![CDATA[Haskell]]></category>
		<category><![CDATA[Turbinado]]></category>

		<guid isPermaLink="false">http://www.alsonkemp.com/?p=74</guid>
		<description><![CDATA[HAML&#8217;s lovely.  As I&#8217;ve been working with Turbinado,  I&#8217;ve been having some issues with HSP.  HSP is an insanely impressive piece of software, but its error messages can be a bit unclear.   So I started playing around a bit with HAML.  Got me wondering &#8220;How easy would be to [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://haml.hamptoncatlin.com/">HAML</a>&#8217;s lovely.  As I&#8217;ve been working with <a href="http://www.turbinado.org">Turbinado, </a> I&#8217;ve been having some issues with <a href="http://www.cs.chalmers.se/~d00nibro/hsp/">HSP</a>.  HSP is an insanely impressive piece of software, but its error messages can be a bit unclear.   So I started playing around a bit with HAML.  Got me wondering &#8220;How easy would be to write a HAML parser in Haskell?&#8221;</p>

<p>So I tried.  Here&#8217;s a first-pass, to-be-updated [and somewhat incomplete] HAML parser for Haskell. Not all of the features are implemented, but it&#8217;s a start.  It generates <a title="HTML" href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/xhtml-3000.2.0.1">HTML</a> bits suitable for compilation by GHC.</p>

<h2>Input</h2>


<div class="wp_syntax"><div class="code"><pre class="haskell" style="font-family:monospace;">f <span style="color: #339933; font-weight: bold;">=</span> content
&nbsp;
page <span style="color: #339933; font-weight: bold;">=</span> #content
         <span style="color: #339933; font-weight: bold;">.</span>left<span style="color: #339933; font-weight: bold;">.</span>column
         <span style="color: #339933; font-weight: bold;">%</span>h2 Welcome to our site<span style="color: #339933; font-weight: bold;">!</span>
         <span style="color: #339933; font-weight: bold;">%</span>p <span style="color: #339933; font-weight: bold;">=</span> print<span style="color: #339933; font-weight: bold;">_</span>information
         <span style="color: #339933; font-weight: bold;">%</span>p
           <span style="color: #339933; font-weight: bold;">=</span> print<span style="color: #339933; font-weight: bold;">_</span>inline
         <span style="color: #339933; font-weight: bold;">.</span>right<span style="color: #339933; font-weight: bold;">.</span>column
           <span style="color: #339933; font-weight: bold;">=</span> render
         <span style="color: green;">&#91;</span>abba <span style="color: #339933; font-weight: bold;">=</span> ding<span style="color: #339933; font-weight: bold;">,</span> ding <span style="color: #339933; font-weight: bold;">=</span> abba<span style="color: green;">&#93;</span> dinger</pre></div></div>


<h2>Output</h2>


<div class="wp_syntax"><div class="code"><pre class="haskell" style="font-family:monospace;">f <span style="color: #339933; font-weight: bold;">=</span>
    <span style="color: green;">&#40;</span>stringToHtml <span style="background-color: #3cb371;">&quot;content&quot;</span><span style="color: green;">&#41;</span>
page <span style="color: #339933; font-weight: bold;">=</span>
       <span style="color: green;">&#40;</span><span style="color: green;">&#40;</span>tag <span style="background-color: #3cb371;">&quot;div&quot;</span><span style="color: #339933; font-weight: bold;">!</span><span style="color: green;">&#91;</span>strAttr <span style="background-color: #3cb371;">&quot;id&quot;</span> <span style="background-color: #3cb371;">&quot;content&quot;</span><span style="color: green;">&#93;</span><span style="color: green;">&#41;</span>
         <span style="color: green;">&#40;</span><span style="color: green;">&#40;</span>tag <span style="background-color: #3cb371;">&quot;div&quot;</span><span style="color: #339933; font-weight: bold;">!</span><span style="color: green;">&#91;</span>strAttr <span style="background-color: #3cb371;">&quot;class&quot;</span> <span style="background-color: #3cb371;">&quot;left column&quot;</span><span style="color: green;">&#93;</span><span style="color: green;">&#41;</span>
         <span style="color: green;">&#40;</span><span style="color: green;">&#40;</span>tag <span style="background-color: #3cb371;">&quot;h2&quot;</span><span style="color: green;">&#41;</span>
             <span style="color: green;">&#40;</span>stringToHtml <span style="background-color: #3cb371;">&quot;Welcome to our site!&quot;</span><span style="color: green;">&#41;</span>
         <span style="color: green;">&#41;</span>
         <span style="color: #339933; font-weight: bold;">+++</span>
         <span style="color: green;">&#40;</span><span style="color: green;">&#40;</span>tag <span style="background-color: #3cb371;">&quot;p&quot;</span><span style="color: green;">&#41;</span>
            <span style="color: green;">&#40;</span>stringToHtml print<span style="color: #339933; font-weight: bold;">_</span>information<span style="color: green;">&#41;</span>
         <span style="color: green;">&#41;</span>
         <span style="color: #339933; font-weight: bold;">+++</span>
         <span style="color: green;">&#40;</span><span style="color: green;">&#40;</span>tag <span style="background-color: #3cb371;">&quot;p&quot;</span><span style="color: green;">&#41;</span>
           <span style="color: green;">&#40;</span>stringToHtml print<span style="color: #339933; font-weight: bold;">_</span>inline<span style="color: green;">&#41;</span>
         <span style="color: green;">&#41;</span>
         <span style="color: #339933; font-weight: bold;">+++</span>
         <span style="color: green;">&#40;</span><span style="color: green;">&#40;</span>tag <span style="background-color: #3cb371;">&quot;div&quot;</span><span style="color: #339933; font-weight: bold;">!</span><span style="color: green;">&#91;</span>strAttr <span style="background-color: #3cb371;">&quot;class&quot;</span> <span style="background-color: #3cb371;">&quot;right column&quot;</span><span style="color: green;">&#93;</span><span style="color: green;">&#41;</span>
           <span style="color: green;">&#40;</span>stringToHtml render<span style="color: green;">&#41;</span>
         <span style="color: green;">&#41;</span>
         <span style="color: #339933; font-weight: bold;">+++</span>
         <span style="color: green;">&#40;</span><span style="color: green;">&#40;</span>tag <span style="background-color: #3cb371;">&quot;div&quot;</span><span style="color: #339933; font-weight: bold;">!</span><span style="color: green;">&#91;</span>strAttr <span style="background-color: #3cb371;">&quot;abba&quot;</span> <span style="background-color: #3cb371;">&quot;ding&quot;</span><span style="color: #339933; font-weight: bold;">,</span> strAttr <span style="background-color: #3cb371;">&quot;ding&quot;</span> <span style="background-color: #3cb371;">&quot;abba&quot;</span><span style="color: green;">&#93;</span><span style="color: green;">&#41;</span>
                                    <span style="color: green;">&#40;</span>stringToHtml <span style="background-color: #3cb371;">&quot;dinger&quot;</span><span style="color: green;">&#41;</span>
         <span style="color: green;">&#41;</span>
         <span style="color: green;">&#41;</span>
       <span style="color: green;">&#41;</span></pre></div></div>


<h2>le Code</h2>


<div class="wp_syntax"><div class="code"><pre class="haskell" style="font-family:monospace;"><span style="color: #06c; font-weight: bold;">module</span> Main <span style="color: #06c; font-weight: bold;">where</span>
&nbsp;
<span style="color: #06c; font-weight: bold;">import</span> Text<span style="color: #339933; font-weight: bold;">.</span>ParserCombinators<span style="color: #339933; font-weight: bold;">.</span>Parsec
<span style="color: #06c; font-weight: bold;">import</span> Text<span style="color: #339933; font-weight: bold;">.</span>ParserCombinators<span style="color: #339933; font-weight: bold;">.</span>Parsec<span style="color: #339933; font-weight: bold;">.</span>Language
<span style="color: #06c; font-weight: bold;">import</span> Text<span style="color: #339933; font-weight: bold;">.</span>ParserCombinators<span style="color: #339933; font-weight: bold;">.</span>Parsec<span style="color: #339933; font-weight: bold;">.</span>Pos
<span style="color: #06c; font-weight: bold;">import</span> <span style="color: #06c; font-weight: bold;">qualified</span> Text<span style="color: #339933; font-weight: bold;">.</span>ParserCombinators<span style="color: #339933; font-weight: bold;">.</span>Parsec<span style="color: #339933; font-weight: bold;">.</span>Token <span style="color: #06c; font-weight: bold;">as</span> T
<span style="color: #06c; font-weight: bold;">import</span> Data<span style="color: #339933; font-weight: bold;">.</span><span style="color: #cccc00; font-weight: bold;">Char</span>
<span style="color: #06c; font-weight: bold;">import</span> Data<span style="color: #339933; font-weight: bold;">.</span>List
<span style="color: #06c; font-weight: bold;">import</span> Data<span style="color: #339933; font-weight: bold;">.</span><span style="color: #cccc00; font-weight: bold;">Maybe</span>
<span style="color: #06c; font-weight: bold;">import</span> System<span style="color: #339933; font-weight: bold;">.</span><span style="color: #cccc00; font-weight: bold;">IO</span><span style="color: #339933; font-weight: bold;">.</span>Unsafe
&nbsp;
main <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span> s <span style="color: #339933; font-weight: bold;">&lt;-</span> <span style="font-weight: bold;">getContents</span>
          <span style="color: #06c; font-weight: bold;">case</span> <span style="color: green;">&#40;</span>parse mainParser <span style="background-color: #3cb371;">&quot;stdin&quot;</span> s<span style="color: green;">&#41;</span> <span style="color: #06c; font-weight: bold;">of</span>
            Left  err <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="font-weight: bold;">putStrLn</span> <span style="background-color: #3cb371;">&quot;Error: &quot;</span> <span style="color: #339933; font-weight: bold;">&gt;&gt;</span> <span style="font-weight: bold;">print</span> err
            Right hs  <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="font-weight: bold;">putStrLn</span> hs
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- Try to parse HAML, otherwise re-output raw lines</span>
&nbsp;
mainParser <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span> whiteSpace
                ls <span style="color: #339933; font-weight: bold;">&lt;-</span> many1 <span style="color: green;">&#40;</span>hamlCode <span style="color: #339933; font-weight: bold;">&lt;|&gt;</span> tilEOL<span style="color: green;">&#41;</span>
                <span style="font-weight: bold;">return</span> <span style="color: #339933; font-weight: bold;">$</span> <span style="font-weight: bold;">unlines</span> ls
<span style="color: #5d478b; font-style: italic;">--</span>
<span style="color: #5d478b; font-style: italic;">-- * HAML lexer</span>
<span style="color: #5d478b; font-style: italic;">--</span>
hamlLexer <span style="color: #339933; font-weight: bold;">=</span> T<span style="color: #339933; font-weight: bold;">.</span>makeTokenParser emptyDef
whiteSpace<span style="color: #339933; font-weight: bold;">=</span> T<span style="color: #339933; font-weight: bold;">.</span>whiteSpace hamlLexer
lexeme    <span style="color: #339933; font-weight: bold;">=</span> T<span style="color: #339933; font-weight: bold;">.</span>lexeme hamlLexer
symbol    <span style="color: #339933; font-weight: bold;">=</span> T<span style="color: #339933; font-weight: bold;">.</span>symbol hamlLexer
natural   <span style="color: #339933; font-weight: bold;">=</span> T<span style="color: #339933; font-weight: bold;">.</span>natural hamlLexer
parens    <span style="color: #339933; font-weight: bold;">=</span> T<span style="color: #339933; font-weight: bold;">.</span>parens hamlLexer
semi      <span style="color: #339933; font-weight: bold;">=</span> T<span style="color: #339933; font-weight: bold;">.</span>semi hamlLexer
squares   <span style="color: #339933; font-weight: bold;">=</span> T<span style="color: #339933; font-weight: bold;">.</span>squares hamlLexer
stringLiteral<span style="color: #339933; font-weight: bold;">=</span> T<span style="color: #339933; font-weight: bold;">.</span>stringLiteral hamlLexer
identifier<span style="color: #339933; font-weight: bold;">=</span> T<span style="color: #339933; font-weight: bold;">.</span>identifier hamlLexer
reserved  <span style="color: #339933; font-weight: bold;">=</span> T<span style="color: #339933; font-weight: bold;">.</span>reserved hamlLexer
reservedOp<span style="color: #339933; font-weight: bold;">=</span> T<span style="color: #339933; font-weight: bold;">.</span>reservedOp hamlLexer
commaSep1 <span style="color: #339933; font-weight: bold;">=</span> T<span style="color: #339933; font-weight: bold;">.</span>commaSep1 hamlLexer
<span style="color: #5d478b; font-style: italic;">--</span>
<span style="color: #5d478b; font-style: italic;">-- * Main HAML parsers</span>
<span style="color: #5d478b; font-style: italic;">--</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- hamlCode is just many identifiers (e.g. 'func a b c' followed by '=' followed by a hamlBlock</span>
<span style="color: #5d478b; font-style: italic;">-- func a b c = %somehaml</span>
hamlCode <span style="color: #339933; font-weight: bold;">=</span> try <span style="color: green;">&#40;</span> <span style="color: #06c; font-weight: bold;">do</span> is <span style="color: #339933; font-weight: bold;">&lt;-</span> many1 identifier
                    symbol <span style="background-color: #3cb371;">&quot;=&quot;</span>
                    currentPos <span style="color: #339933; font-weight: bold;">&lt;-</span> getPosition
                    x <span style="color: #339933; font-weight: bold;">&lt;-</span> manyTill1
                          <span style="color: green;">&#40;</span>lexeme <span style="color: #339933; font-weight: bold;">$</span> hamlBlock<span style="color: green;">&#41;</span>
                          <span style="color: green;">&#40;</span>notSameIndent currentPos<span style="color: green;">&#41;</span>
                    <span style="font-weight: bold;">return</span> <span style="color: #339933; font-weight: bold;">$</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">concat</span> <span style="color: #339933; font-weight: bold;">$</span> intersperse <span style="background-color: #3cb371;">&quot; &quot;</span> is<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">++</span>
                             <span style="background-color: #3cb371;">&quot; = <span style="background-color: #3cb371; font-weight: bold;">\n</span>&quot;</span> <span style="color: #339933; font-weight: bold;">++</span>
                             <span style="color: green;">&#40;</span><span style="font-weight: bold;">concat</span> <span style="color: #339933; font-weight: bold;">$</span> <span style="color: green;">&#40;</span>intersperse <span style="color: green;">&#40;</span>indent currentPos <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot;+++<span style="background-color: #3cb371; font-weight: bold;">\n</span>&quot;</span><span style="color: green;">&#41;</span>  <span style="color: #339933; font-weight: bold;">$</span> <span style="font-weight: bold;">filter</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">not</span> <span style="color: #339933; font-weight: bold;">.</span> <span style="font-weight: bold;">null</span><span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">$</span> x<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span>
                  <span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">-- A Block may start with some whitespace, then has a valid bit of data</span>
hamlBlock   <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span> currentPos <span style="color: #339933; font-weight: bold;">&lt;-</span> getPosition
                 bs <span style="color: #339933; font-weight: bold;">&lt;-</span> manyTill1
                      <span style="color: green;">&#40;</span>pTag <span style="color: #339933; font-weight: bold;">&lt;|&gt;</span> pText<span style="color: green;">&#41;</span>
                      <span style="color: green;">&#40;</span>notSameIndent currentPos<span style="color: green;">&#41;</span>
                 <span style="font-weight: bold;">return</span> <span style="color: #339933; font-weight: bold;">$</span> intercalate <span style="color: green;">&#40;</span>indent currentPos <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot;+++<span style="background-color: #3cb371; font-weight: bold;">\n</span>&quot;</span><span style="color: green;">&#41;</span> bs
&nbsp;
pTag    <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span>    currentPos <span style="color: #339933; font-weight: bold;">&lt;-</span> getPosition
                try
                    <span style="color: green;">&#40;</span><span style="color: #06c; font-weight: bold;">do</span> t  <span style="color: #339933; font-weight: bold;">&lt;-</span> lexeme tagParser
                        ts <span style="color: #339933; font-weight: bold;">&lt;-</span> <span style="color: green;">&#40;</span>isInline currentPos <span style="color: #339933; font-weight: bold;">&gt;&gt;</span> char '<span style="color: #339933; font-weight: bold;">/</span>' <span style="color: #339933; font-weight: bold;">&gt;&gt;</span> <span style="font-weight: bold;">return</span> <span style="color: green;">&#91;</span><span style="color: green;">&#93;</span><span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">&lt;|&gt;</span>
                              <span style="color: green;">&#40;</span>hamlBlock<span style="color: green;">&#41;</span>
                        <span style="font-weight: bold;">return</span> <span style="color: #339933; font-weight: bold;">$</span> intercalate <span style="background-color: #3cb371;">&quot;<span style="background-color: #3cb371; font-weight: bold;">\n</span>&quot;</span> <span style="color: #339933; font-weight: bold;">$</span> <span style="font-weight: bold;">filter</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">not</span> <span style="color: #339933; font-weight: bold;">.</span> <span style="font-weight: bold;">null</span><span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">$</span>
                          <span style="color: green;">&#91;</span> <span style="color: green;">&#40;</span>indent currentPos<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot;((&quot;</span> <span style="color: #339933; font-weight: bold;">++</span> <span style="color: green;">&#40;</span><span style="color: #06c; font-weight: bold;">if</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">null</span> ts<span style="color: green;">&#41;</span> <span style="color: #06c; font-weight: bold;">then</span> <span style="background-color: #3cb371;">&quot;i&quot;</span> <span style="color: #06c; font-weight: bold;">else</span> <span style="background-color: #3cb371;">&quot;&quot;</span><span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">++</span> t  <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot;)&quot;</span>
                          <span style="color: #339933; font-weight: bold;">,</span> <span style="color: #06c; font-weight: bold;">if</span> <span style="font-weight: bold;">null</span> ts <span style="color: #06c; font-weight: bold;">then</span> <span style="color: green;">&#91;</span><span style="color: green;">&#93;</span> <span style="color: #06c; font-weight: bold;">else</span> ts
                          <span style="color: #339933; font-weight: bold;">,</span> <span style="color: green;">&#40;</span>indent currentPos<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot;)<span style="background-color: #3cb371; font-weight: bold;">\n</span>&quot;</span><span style="color: green;">&#93;</span>
                    <span style="color: green;">&#41;</span>
&nbsp;
pText <span style="color: #339933; font-weight: bold;">=</span> lexeme stringParser
&nbsp;
notSameIndent p <span style="color: #339933; font-weight: bold;">=</span> <span style="color: green;">&#40;</span>eof <span style="color: #339933; font-weight: bold;">&gt;&gt;</span> <span style="font-weight: bold;">return</span> <span style="color: green;">&#91;</span><span style="color: green;">&#93;</span><span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">&lt;|&gt;</span>
                  <span style="color: green;">&#40;</span><span style="color: #06c; font-weight: bold;">do</span> innerPos <span style="color: #339933; font-weight: bold;">&lt;-</span> getPosition
                      <span style="color: #06c; font-weight: bold;">case</span> <span style="color: green;">&#40;</span>sourceColumn p<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">==</span> <span style="color: green;">&#40;</span>sourceColumn innerPos<span style="color: green;">&#41;</span> <span style="color: #06c; font-weight: bold;">of</span>
                                True  <span style="color: #339933; font-weight: bold;">-&gt;</span> pzero
                                False <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="font-weight: bold;">return</span> <span style="color: green;">&#91;</span><span style="color: green;">&#93;</span>
                  <span style="color: green;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">--</span>
<span style="color: #5d478b; font-style: italic;">-- * Various little parsers</span>
<span style="color: #5d478b; font-style: italic;">--</span>
&nbsp;
tagParser <span style="color: #339933; font-weight: bold;">::</span> CharParser <span style="color: green;">&#40;</span><span style="color: green;">&#41;</span> <span style="color: #cccc00; font-weight: bold;">String</span>
tagParser <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span>     t <span style="color: #339933; font-weight: bold;">&lt;-</span> optionMaybe tagParser'
                   i <span style="color: #339933; font-weight: bold;">&lt;-</span> optionMaybe idParser
                   c <span style="color: #339933; font-weight: bold;">&lt;-</span> optionMaybe <span style="color: green;">&#40;</span>many1 classParser<span style="color: green;">&#41;</span>
                   a <span style="color: #339933; font-weight: bold;">&lt;-</span> optionMaybe attributesParser
                   <span style="color: #06c; font-weight: bold;">if</span> <span style="color: green;">&#40;</span>isJust t <span style="color: #339933; font-weight: bold;">||</span> isJust i <span style="color: #339933; font-weight: bold;">||</span> isJust c <span style="color: #339933; font-weight: bold;">||</span> isJust a<span style="color: green;">&#41;</span>
                     <span style="color: #06c; font-weight: bold;">then</span>
                       <span style="color: #06c; font-weight: bold;">do</span> <span style="font-weight: bold;">return</span> <span style="color: #339933; font-weight: bold;">$</span> <span style="background-color: #3cb371;">&quot;tag <span style="background-color: #3cb371; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #339933; font-weight: bold;">++</span> <span style="color: green;">&#40;</span>fromMaybe <span style="background-color: #3cb371;">&quot;div&quot;</span> t<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot;<span style="background-color: #3cb371; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #339933; font-weight: bold;">++</span>
                           <span style="color: green;">&#40;</span><span style="color: #06c; font-weight: bold;">if</span> <span style="font-weight: bold;">not</span> <span style="color: green;">&#40;</span>isJust i <span style="color: #339933; font-weight: bold;">||</span> isJust c <span style="color: #339933; font-weight: bold;">||</span> isJust a<span style="color: green;">&#41;</span> <span style="color: #06c; font-weight: bold;">then</span> <span style="background-color: #3cb371;">&quot;&quot;</span> <span style="color: #06c; font-weight: bold;">else</span>
                              <span style="font-weight: bold;">concat</span> <span style="color: #339933; font-weight: bold;">$</span>
                               <span style="color: green;">&#91;</span> <span style="background-color: #3cb371;">&quot;![&quot;</span>
                               <span style="color: #339933; font-weight: bold;">,</span> intercalate <span style="background-color: #3cb371;">&quot;, &quot;</span> <span style="color: #339933; font-weight: bold;">$</span> <span style="font-weight: bold;">filter</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">not</span> <span style="color: #339933; font-weight: bold;">.</span> <span style="font-weight: bold;">null</span><span style="color: green;">&#41;</span>
                                   <span style="color: green;">&#91;</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">maybe</span> <span style="background-color: #3cb371;">&quot;&quot;</span> <span style="color: green;">&#40;</span>\i' <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="background-color: #3cb371;">&quot;strAttr <span style="background-color: #3cb371; font-weight: bold;">\&quot;</span>id<span style="background-color: #3cb371; font-weight: bold;">\&quot;</span> <span style="background-color: #3cb371; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #339933; font-weight: bold;">++</span> i' <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot;<span style="background-color: #3cb371; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: green;">&#41;</span> i<span style="color: green;">&#41;</span>
                                   <span style="color: #339933; font-weight: bold;">,</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">maybe</span> <span style="background-color: #3cb371;">&quot;&quot;</span> <span style="color: green;">&#40;</span>\c' <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="background-color: #3cb371;">&quot;strAttr <span style="background-color: #3cb371; font-weight: bold;">\&quot;</span>class<span style="background-color: #3cb371; font-weight: bold;">\&quot;</span> <span style="background-color: #3cb371; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #339933; font-weight: bold;">++</span> <span style="color: green;">&#40;</span>intercalate <span style="background-color: #3cb371;">&quot; &quot;</span> c'<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot;<span style="background-color: #3cb371; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: green;">&#41;</span> c<span style="color: green;">&#41;</span>
                                   <span style="color: #339933; font-weight: bold;">,</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">maybe</span> <span style="background-color: #3cb371;">&quot;&quot;</span> <span style="color: green;">&#40;</span>\kv <span style="color: #339933; font-weight: bold;">-&gt;</span> intercalate <span style="background-color: #3cb371;">&quot;, &quot;</span> <span style="color: #339933; font-weight: bold;">$</span> <span style="font-weight: bold;">map</span> <span style="color: green;">&#40;</span>\<span style="color: green;">&#40;</span>k<span style="color: #339933; font-weight: bold;">,</span>v<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="background-color: #3cb371;">&quot;strAttr <span style="background-color: #3cb371; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #339933; font-weight: bold;">++</span> k <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot;<span style="background-color: #3cb371; font-weight: bold;">\&quot;</span> <span style="background-color: #3cb371; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #339933; font-weight: bold;">++</span> v <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot;<span style="background-color: #3cb371; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: green;">&#41;</span> kv<span style="color: green;">&#41;</span> a<span style="color: green;">&#41;</span>
                                   <span style="color: green;">&#93;</span>
                               <span style="color: #339933; font-weight: bold;">,</span> <span style="background-color: #3cb371;">&quot;]&quot;</span><span style="color: green;">&#93;</span>
                           <span style="color: green;">&#41;</span>
                     <span style="color: #06c; font-weight: bold;">else</span> pzero
&nbsp;
tagParser' <span style="color: #339933; font-weight: bold;">::</span> CharParser <span style="color: green;">&#40;</span><span style="color: green;">&#41;</span> <span style="color: #cccc00; font-weight: bold;">String</span>
tagParser' <span style="color: #339933; font-weight: bold;">=</span>  <span style="color: #06c; font-weight: bold;">do</span> char '<span style="color: #339933; font-weight: bold;">%</span>'
                 many1 termChar
&nbsp;
idParser <span style="color: #339933; font-weight: bold;">::</span> CharParser <span style="color: green;">&#40;</span><span style="color: green;">&#41;</span> <span style="color: #cccc00; font-weight: bold;">String</span>
idParser <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span> char '#'
              many1 termChar
&nbsp;
classParser <span style="color: #339933; font-weight: bold;">::</span> CharParser <span style="color: green;">&#40;</span><span style="color: green;">&#41;</span> <span style="color: #cccc00; font-weight: bold;">String</span>
classParser <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span> char '<span style="color: #339933; font-weight: bold;">.</span>'
                 many1 termChar
&nbsp;
attributesParser <span style="color: #339933; font-weight: bold;">::</span> CharParser <span style="color: green;">&#40;</span><span style="color: green;">&#41;</span> <span style="color: green;">&#91;</span><span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">String</span><span style="color: #339933; font-weight: bold;">,</span> <span style="color: #cccc00; font-weight: bold;">String</span><span style="color: green;">&#41;</span><span style="color: green;">&#93;</span>
attributesParser <span style="color: #339933; font-weight: bold;">=</span> squares <span style="color: green;">&#40;</span>commaSep1 attributeParser<span style="color: green;">&#41;</span>
&nbsp;
attributeParser <span style="color: #339933; font-weight: bold;">::</span> CharParser <span style="color: green;">&#40;</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span><span style="color: #cccc00; font-weight: bold;">String</span><span style="color: #339933; font-weight: bold;">,</span> <span style="color: #cccc00; font-weight: bold;">String</span><span style="color: green;">&#41;</span>
attributeParser <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span> k <span style="color: #339933; font-weight: bold;">&lt;-</span> identifier
                     symbol <span style="background-color: #3cb371;">&quot;=&quot;</span>
                     cs <span style="color: #339933; font-weight: bold;">&lt;-</span> many1 identifier
                     <span style="font-weight: bold;">return</span> <span style="color: green;">&#40;</span>k<span style="color: #339933; font-weight: bold;">,</span> intercalate <span style="background-color: #3cb371;">&quot; &quot;</span> cs<span style="color: green;">&#41;</span>
&nbsp;
stringParser <span style="color: #339933; font-weight: bold;">::</span> CharParser <span style="color: green;">&#40;</span><span style="color: green;">&#41;</span> <span style="color: #cccc00; font-weight: bold;">String</span>
stringParser <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span>   currentPos <span style="color: #339933; font-weight: bold;">&lt;-</span> getPosition
                    modifier <span style="color: #339933; font-weight: bold;">&lt;-</span> optionMaybe <span style="color: green;">&#40;</span>char '<span style="color: #339933; font-weight: bold;">=</span>' <span style="color: #339933; font-weight: bold;">&lt;|&gt;</span> char '<span style="color: #339933; font-weight: bold;">-</span>'<span style="color: green;">&#41;</span>
                    whiteSpace
                    c <span style="color: #339933; font-weight: bold;">&lt;-</span> alphaNum
                    cs<span style="color: #339933; font-weight: bold;">&lt;-</span> tilEOL
                    <span style="color: #06c; font-weight: bold;">case</span> modifier <span style="color: #06c; font-weight: bold;">of</span>
                      Just '<span style="color: #339933; font-weight: bold;">-</span>' <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="font-weight: bold;">return</span> <span style="color: #339933; font-weight: bold;">$</span> <span style="color: green;">&#40;</span>indent currentPos<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot;-&quot;</span> <span style="color: #339933; font-weight: bold;">++</span> c:cs
                      Just '<span style="color: #339933; font-weight: bold;">=</span>' <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="font-weight: bold;">return</span> <span style="color: #339933; font-weight: bold;">$</span> <span style="color: green;">&#40;</span>indent currentPos<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot;(stringToHtml &quot;</span> <span style="color: #339933; font-weight: bold;">++</span> c:cs <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot;)&quot;</span>
                      Nothing  <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="font-weight: bold;">return</span> <span style="color: #339933; font-weight: bold;">$</span> <span style="color: green;">&#40;</span>indent currentPos<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot;(stringToHtml <span style="background-color: #3cb371; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #339933; font-weight: bold;">++</span> c:cs <span style="color: #339933; font-weight: bold;">++</span> <span style="background-color: #3cb371;">&quot;<span style="background-color: #3cb371; font-weight: bold;">\&quot;</span>)&quot;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">--</span>
<span style="color: #5d478b; font-style: italic;">-- * Utility functions</span>
<span style="color: #5d478b; font-style: italic;">--</span>
&nbsp;
isInline     p <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span> p2 <span style="color: #339933; font-weight: bold;">&lt;-</span> getPosition
                    <span style="color: #06c; font-weight: bold;">case</span> <span style="color: green;">&#40;</span>sourceLine p  <span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">==</span> <span style="color: green;">&#40;</span>sourceLine p2<span style="color: green;">&#41;</span> <span style="color: #06c; font-weight: bold;">of</span>
                      True <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="font-weight: bold;">return</span> <span style="color: green;">&#91;</span><span style="color: green;">&#93;</span>
                      False <span style="color: #339933; font-weight: bold;">-&gt;</span> pzero
isSameIndent p1 p2 <span style="color: #339933; font-weight: bold;">=</span> <span style="color: green;">&#40;</span>sourceColumn p1<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">==</span> <span style="color: green;">&#40;</span>sourceColumn p2<span style="color: green;">&#41;</span>
&nbsp;
tilEOL <span style="color: #339933; font-weight: bold;">=</span> manyTill1 <span style="color: green;">&#40;</span>noneOf <span style="background-color: #3cb371;">&quot;<span style="background-color: #3cb371; font-weight: bold;">\n</span>&quot;</span><span style="color: green;">&#41;</span> eol
eol <span style="color: #339933; font-weight: bold;">=</span> newline <span style="color: #339933; font-weight: bold;">&lt;|&gt;</span> <span style="color: green;">&#40;</span>eof <span style="color: #339933; font-weight: bold;">&gt;&gt;</span> <span style="font-weight: bold;">return</span> '\n'<span style="color: green;">&#41;</span>
&nbsp;
termChar <span style="color: #339933; font-weight: bold;">=</span> satisfy <span style="color: green;">&#40;</span>\c <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="color: green;">&#40;</span>isAlphaNum c<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">||</span> <span style="color: green;">&#40;</span>c `<span style="font-weight: bold;">elem</span>` termPunctuation<span style="color: green;">&#41;</span> <span style="color: green;">&#41;</span>
termPunctuation <span style="color: #339933; font-weight: bold;">=</span> <span style="background-color: #3cb371;">&quot;-_&quot;</span>
indent p <span style="color: #339933; font-weight: bold;">=</span> <span style="font-weight: bold;">take</span> <span style="color: green;">&#40;</span>sourceColumn <span style="color: green;">&#40;</span>p<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">-</span> <span style="color: red;">1</span><span style="color: green;">&#41;</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">repeat</span> ' '<span style="color: green;">&#41;</span>
&nbsp;
manyTill1 p e <span style="color: #339933; font-weight: bold;">=</span>  <span style="color: #06c; font-weight: bold;">do</span> ms <span style="color: #339933; font-weight: bold;">&lt;-</span> manyTill p e
                    <span style="color: #06c; font-weight: bold;">case</span> <span style="color: green;">&#40;</span><span style="font-weight: bold;">null</span> ms<span style="color: green;">&#41;</span> <span style="color: #06c; font-weight: bold;">of</span>
                      True  <span style="color: #339933; font-weight: bold;">-&gt;</span> pzero
                      False <span style="color: #339933; font-weight: bold;">-&gt;</span> <span style="font-weight: bold;">return</span> ms</pre></div></div>


<p>Golly, but I wish that I&#8217;d cleaned up the code, but there it is in all of its raw, un-thought-through glory&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alsonkemp.com/programming/a-haml-parser-for-haskell/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
