<div dir="ltr"><div><br></div><div><div><div class="gmail_quote">On Mon, Jul 5, 2010 at 10:43 PM, Simon Michael <span dir="ltr">&lt;<a href="mailto:simon@joyful.com">simon@joyful.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Great, thanks for the clarifications. sendFile made this easy. Has using that affected my portability much, eg to windows ? </blockquote><div> </div>As far as I know, not at all. I actually run some of this code on Windows system (via wai-handler-webkit[1]) in production environments, and it all works fine. I&#39;m just building on top of the sendfile library[2] which does The Right Thing.<div>
<br></div><div>Of course, like anything WAI, it depends on the implementation. If I&#39;m not mistaken, Snap doesn&#39;t run on Windows (please correct me if I&#39;m wrong on this, I&#39;d like to know), so using the not-yet-released Snap WAI backend would clearly not work on Windows either.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">
<br>
On Jul 5, 2010, at 12:04 PM, Michael Snoyman wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
the rendering details for you. If you point me to the code in question, I&#39;ll take a look.<br>
</blockquote>
<br></div>
Latest code pushed to <a href="http://joyful.com/darcsweb/darcsweb.cgi?r=hledger;a=headblob;f=/Hledger/Cli/Commands/WebYesod.hs" target="_blank">http://joyful.com/darcsweb/darcsweb.cgi?r=hledger;a=headblob;f=/Hledger/Cli/Commands/WebYesod.hs</a><br>
<font class="Apple-style-span" color="#888888"><br></font></blockquote><div><br></div><div>Firstly, very nice code. I especially like how you&#39;re able to get an entire interface to fit into just 6 routes... impressive.</div>
<div><br></div><div>I believe the problem is on line 120, where you call &quot;renderHamlet id&quot;. If you look at the type of renderHamlet:</div><div><br></div><div>renderHamlet :: (url -&gt; String) -&gt; Hamlet url -&gt; L.ByteString</div>
<div><br></div><div>You&#39;ll see that:</div><div><br></div><div>renderHamlet id :: Hamlet String -&gt; L.ByteString</div><div><br></div><div>In general, you don&#39;t need to call renderHamlet directly when using Yesod. Instead, you have two better options:</div>
<div><br></div><div>* hamletToRepHtml handles the rendering, calling toContent, and wrapping in a RepHtml. So your line 120 could be rewritten as:</div><div><br></div><div><span class="Apple-style-span" style="font-family: sans-serif; font-size: 12px; "><pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
     hamletToRepHtml <font class="Apple-style-span" color="#666666">$</font> <span class="n">template</span> <span class="n">req</span> <span class="n">msg</span> <span class="n">as</span> <span class="n">ps</span> <span class="s" style="color: rgb(187, 68, 68); ">&quot;hledger&quot;</span> <span class="n">s</span>
</pre><div><span class="n"><br></span></div></span></div><div>At which point you&#39;d be able to use type-safe URLs in your Hamlet template (wrapping in the @ signs), and you can forget about URL splicing.</div><div><br>
</div><div>* applyLayout just builds on top of hamletToRepHtml, by also applying your default layout to the returned content. In your case, I wouldn&#39;t say it&#39;s necessary, but it makes a lot of sense for large sites that want to have a standard look for all pages.</div>
<div><br></div><div>Few other comments:</div><div><br></div><div>* On line 228, you use a non-breaking space. I&#39;m not sure if you *need* that, or are just trying to work around Yesod&#39;s whitespace rules. If the latter, there&#39;s a relatively new feature that allows you to put a backslash at the beginning of the content to bypass the whitespace rules.[3]</div>
<div><br></div><div>* I&#39;m impressed to see you found the getMessage/setMessage API. I keep meaning to blog about it, but haven&#39;t had a chance.</div><div><br></div><div>* On line 212, I see you drop to plain XHTML syntax. If you just want to get XHTML closing-tag rules and keep the Hamlet syntax, use &quot;$xhamlet&quot; instead of &quot;$hamlet&quot; at the beginning of your quasi-quoter.</div>
<div><br></div><div>Let me know if you have any other questions, I&#39;ve been interested in hledger for a while now, so it&#39;s very gratifying to see it move over to Yesod.</div><div><br class="Apple-interchange-newline">
Michael</div><div><br></div><div>[1] <a href="http://hackage.haskell.org/package/wai-handler-webkit">http://hackage.haskell.org/package/wai-handler-webkit</a></div><div>[2] <a href="http://hackage.haskell.org/package/sendfile">http://hackage.haskell.org/package/sendfile</a><br>
</div><div>[3] <a href="http://docs.yesodweb.com/hamlet/lineparsing.html">http://docs.yesodweb.com/hamlet/lineparsing.html</a></div></div></div></div></div>