<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss version="2.0"><channel><title>Always Move Fast Entries</title><link>http://alwaysmovefast.com</link><description>David Reynolds' blog - Always Move Fast</description><lastBuildDate>Mon, 13 Jul 2009 12:37:42 GMT</lastBuildDate><generator>PyRSS2Gen-1.0.0</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/AlwaysMoveFast" type="application/rss+xml" /><item><title>Vim Recipes</title><link>http://alwaysmovefast.com/entry/vim-recipes</link><description>&lt;p&gt;Found this great resource on &lt;a href="http://news.ycombinator.com"&gt;Hacker News&lt;/a&gt; for &lt;a href="http://vim.runpaint.org/toc/"&gt;Vim Recipes&lt;/a&gt;. I've been meaning to learn more about split screens, folds, and tabs in Vim and this resource gave me the push in the right direction I needed.&lt;/p&gt;</description><author>David Reynolds</author><guid isPermaLink="true">http://alwaysmovefast.com/entry/vim-recipes</guid><pubDate>Wed, 20 May 2009 16:05:08 GMT</pubDate></item><item><title>In Place Link Editing</title><link>http://alwaysmovefast.com/entry/in-place-link-editing</link><description>&lt;p&gt;I've been working on a new project that has some content management features lately. It's a pretty big project and will take months to complete. I was messing with in-place editing with prototype and scriptaculous and found that I couldn't use the default editor for managing links. Normally when you're doing in-place editing you have a single piece of text/content that you want to edit. You click on it and it brings up the form. For editing links I need to edit the URL and the anchor text. I needed to have two separate fields for this and Ajax.InPlaceEditor from controls.js wasn't entirely up to the task.&lt;/p&gt;

&lt;p&gt;I ended up inheriting from Ajax.InPlaceEditor and altering some of the behavior to handle link editing. I feel like it's pretty much a hack job but it does what I need it to do, so it seems good enough. I felt that it would be somewhat beneficial to upload the code for in-place link editing.&lt;/p&gt;

&lt;p&gt;I only uploaded the javascript and a html demo. The server-side stuff isn't included since this will work across different web languages. I use Pylons and Mako, for example.&lt;/p&gt;

&lt;p&gt;You can grab the demo here: &lt;a href="http://alwaysmovefast.com/public_svn/in_place_link_editor"&gt;http://alwaysmovefast.com/public_svn/in_place_link_editor&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To give a short example of what I did for the server-side stuff, this could be my controller/action:&lt;/p&gt;

&lt;div style="margin: 10px 0;"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="native_k"&gt;class&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_nc"&gt;LinksController&lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_n"&gt;BaseController&lt;/span&gt;&lt;span class="native_p"&gt;):&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_k"&gt;def&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_nf"&gt;create&lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_bp"&gt;self&lt;/span&gt;&lt;span class="native_p"&gt;):&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;        &lt;/span&gt;&lt;span class="native_n"&gt;c&lt;/span&gt;&lt;span class="native_o"&gt;.&lt;/span&gt;&lt;span class="native_n"&gt;link&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_p"&gt;{&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;            &lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;:&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;request&lt;/span&gt;&lt;span class="native_o"&gt;.&lt;/span&gt;&lt;span class="native_n"&gt;params&lt;/span&gt;&lt;span class="native_p"&gt;[&lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;],&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;            &lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;anchor&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;:&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;request&lt;/span&gt;&lt;span class="native_o"&gt;.&lt;/span&gt;&lt;span class="native_n"&gt;params&lt;/span&gt;&lt;span class="native_p"&gt;[&lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;anchor&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;],&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;            &lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;:&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;some_id&amp;#39;&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;        &lt;/span&gt;&lt;span class="native_p"&gt;}&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;        &lt;/span&gt;&lt;span class="native_k"&gt;return&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;render&lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;/links/create.mako&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;)&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;And this is what '/links/create.mako' could look like to update the page:&lt;/p&gt;

&lt;div style="margin: 10px 0;"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="native_o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="native_n"&gt;a&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;href&lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_s"&gt;&amp;quot;${c.link[&amp;#39;url&amp;#39;]}&amp;quot;&lt;/span&gt;&lt;span class="native_o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="native_err"&gt;$&lt;/span&gt;&lt;span class="native_p"&gt;{&lt;/span&gt;&lt;span class="native_n"&gt;c&lt;/span&gt;&lt;span class="native_o"&gt;.&lt;/span&gt;&lt;span class="native_n"&gt;link&lt;/span&gt;&lt;span class="native_p"&gt;[&lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;anchor&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;]}&lt;/span&gt;&lt;span class="native_o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="native_n"&gt;a&lt;/span&gt;&lt;span class="native_o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This is a very basic example. My create.mako actually looks something like this:&lt;/p&gt;

&lt;div style="margin: 10px 0;"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="native_o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="native_n"&gt;script&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;src&lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_s"&gt;&amp;quot;/javascripts/prototype.js&amp;quot;&lt;/span&gt;&lt;span class="native_o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="native_n"&gt;script&lt;/span&gt;&lt;span class="native_o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="native_n"&gt;script&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;src&lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_s"&gt;&amp;quot;/javascripts/scriptaculous.js&amp;quot;&lt;/span&gt;&lt;span class="native_o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="native_n"&gt;script&lt;/span&gt;&lt;span class="native_o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="native_n"&gt;script&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;src&lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_s"&gt;&amp;quot;/javascripts/application.js&amp;quot;&lt;/span&gt;&lt;span class="native_o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="native_n"&gt;script&lt;/span&gt;&lt;span class="native_o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;

&lt;span class="native_o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="native_n"&gt;script&lt;/span&gt;&lt;span class="native_o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_n"&gt;li&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_err"&gt;$&lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;newlink&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;);&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_n"&gt;li&lt;/span&gt;&lt;span class="native_o"&gt;.&lt;/span&gt;&lt;span class="native_n"&gt;id&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;${c.link[&amp;#39;&lt;/span&gt;&lt;span class="native_nb"&gt;id&lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;]}&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;;&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;

&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_n"&gt;li&lt;/span&gt;&lt;span class="native_o"&gt;.&lt;/span&gt;&lt;span class="native_n"&gt;innerHTML&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;&amp;lt;a href=&amp;quot;${c.link[&amp;#39;&lt;/span&gt;&lt;span class="native_n"&gt;href&lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;]}&amp;quot;&amp;gt;${c.link[&amp;#39;&lt;/span&gt;&lt;span class="native_n"&gt;anchor&lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;]}&amp;lt;/a&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;;&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;

&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_n"&gt;new_link&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;document&lt;/span&gt;&lt;span class="native_o"&gt;.&lt;/span&gt;&lt;span class="native_n"&gt;createElement&lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;li&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;);&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_n"&gt;new_link&lt;/span&gt;&lt;span class="native_o"&gt;.&lt;/span&gt;&lt;span class="native_n"&gt;id&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;newlink&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;;&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_n"&gt;new_link&lt;/span&gt;&lt;span class="native_o"&gt;.&lt;/span&gt;&lt;span class="native_n"&gt;innerHTML&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;Insert Link&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;;&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;

&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_n"&gt;li&lt;/span&gt;&lt;span class="native_o"&gt;.&lt;/span&gt;&lt;span class="native_n"&gt;parentNode&lt;/span&gt;&lt;span class="native_o"&gt;.&lt;/span&gt;&lt;span class="native_n"&gt;appendChild&lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_n"&gt;new_link&lt;/span&gt;&lt;span class="native_p"&gt;);&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;

&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_n"&gt;new&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;InPlaceLinkEditor&lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;newlink&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;,&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;/links/create&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;);&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="native_n"&gt;script&lt;/span&gt;&lt;span class="native_o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Basically what it does is update 'newlink' by changing its id to the id of the newly-created link on the server side and update the innerHTML of that object. It then creates a brand new link object and appends it to the old link's parent node. I then create a new InPlaceLinkEditor for the new 'newlink'. That's about it.&lt;/p&gt;

&lt;p&gt;Hopefully you can find this stuff useful.&lt;/p&gt;</description><author>David Reynolds</author><guid isPermaLink="true">http://alwaysmovefast.com/entry/in-place-link-editing</guid><pubDate>Thu, 16 Apr 2009 19:38:56 GMT</pubDate></item><item><title>FormEncode Usage</title><link>http://alwaysmovefast.com/entry/formencode-usage</link><description>&lt;p&gt;There's a lack of documentation on how to use FormEncode in real projects so I've been meaning to write this article for some time now. I use FormEncode in my Pylons apps and I created a small app just for this article. You can grab the source here: &lt;a href="http://alwaysmovefast.com/public_svn/formencode_tutorial"&gt;http://alwaysmovefast.com/public_svn/formencode_tutorial&lt;/a&gt;. To make using FormEncode easier, I also created a few form helper methods that can be found in formencode_tutorial/lib/form_helpers.py. I also used a little CSS to make the form somewhat pretty.&lt;/p&gt;

&lt;p&gt;FormEncode makes it pretty easy to do form validations and to then display any errors to your users. The way it works is that you pass a string of HTML to htmlfill.render(), along with some other options, and it returns parsed HTML for use in your pages. htmlfill.render() uses an errors option where you pass in a dict consisting of field names and error values. A typical error dict might look like: {'firstname': Invalid(u'Please enter your firstname',), 'lastname': Invalid(u'Please enter your lastname',)}.&lt;/p&gt;

&lt;p&gt;htmlfill.render() will parse those errors and inject them into your &amp;lt;form:error&amp;gt; tag for that particular element. As well as accepting an error dict, htmlfill.render() can accept a default value dict that will inject default values into your form elements.&lt;/p&gt;

&lt;p&gt;When injecting errors into your HTML template, it will also use an error formatter. The default error formatter looks like this:&lt;/p&gt;

&lt;div style="margin: 10px 0;"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="native_k"&gt;def&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_nf"&gt;default_formatter&lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_n"&gt;error&lt;/span&gt;&lt;span class="native_p"&gt;):&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_k"&gt;return&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;&amp;lt;span class=&amp;quot;error-message&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="native_si"&gt;%s&lt;/span&gt;&lt;span class="native_s"&gt;&amp;lt;/span&amp;gt;&amp;lt;br /&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;%&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;html_quote&lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_n"&gt;error&lt;/span&gt;&lt;span class="native_p"&gt;)&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;You can also use custom error formatters for a little more control over the look and feel of your displayed errors. I like to use this as my formatter:&lt;/p&gt;

&lt;div style="margin: 10px 0;"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="native_k"&gt;def&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_nf"&gt;p_error_formatter&lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_n"&gt;error&lt;/span&gt;&lt;span class="native_p"&gt;):&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_k"&gt;return&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="native_si"&gt;%s&lt;/span&gt;&lt;span class="native_s"&gt;&amp;lt;/p&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;%&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;htmlfill&lt;/span&gt;&lt;span class="native_o"&gt;.&lt;/span&gt;&lt;span class="native_n"&gt;html_quote&lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_n"&gt;error&lt;/span&gt;&lt;span class="native_p"&gt;)&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The reason I use this as my formatter is because I display label elements below my form elements and above the errors. It's mostly personal preference.&lt;/p&gt;

&lt;p&gt;I created a helper to abstract away some of the finer details of using formencode. One of them helps me create text fields with the label and form:error tags prepackaged and ready to pass to htmlfill.render():&lt;/p&gt;

&lt;div style="margin: 10px 0;"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="native_c"&gt;# return HTML string that can be passed to htmlfill.render()&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_k"&gt;def&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_nf"&gt;tfield&lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_n"&gt;name&lt;/span&gt;&lt;span class="native_p"&gt;,&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;label&lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_bp"&gt;None&lt;/span&gt;&lt;span class="native_p"&gt;,&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;**&lt;/span&gt;&lt;span class="native_n"&gt;options&lt;/span&gt;&lt;span class="native_p"&gt;):&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_k"&gt;if&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;label&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_ow"&gt;is&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_bp"&gt;None&lt;/span&gt;&lt;span class="native_p"&gt;:&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;label&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;name&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;

&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_n"&gt;s&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;text_field&lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_n"&gt;name&lt;/span&gt;&lt;span class="native_p"&gt;,&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;**&lt;/span&gt;&lt;span class="native_n"&gt;options&lt;/span&gt;&lt;span class="native_p"&gt;)&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;

&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_nb"&gt;id&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_k"&gt;if&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;options&lt;/span&gt;&lt;span class="native_o"&gt;.&lt;/span&gt;&lt;span class="native_n"&gt;has_key&lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;):&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_nb"&gt;id&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;options&lt;/span&gt;&lt;span class="native_p"&gt;[&lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;]&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_k"&gt;else&lt;/span&gt;&lt;span class="native_p"&gt;:&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;options&lt;/span&gt;&lt;span class="native_p"&gt;[&lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;]&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;name&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;

&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_c"&gt;# append a label to this field for good measure&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_n"&gt;s&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;+=&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;&amp;lt;label for=&amp;quot;&lt;/span&gt;&lt;span class="native_si"&gt;%s&lt;/span&gt;&lt;span class="native_s"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="native_si"&gt;%s&lt;/span&gt;&lt;span class="native_s"&gt;&amp;lt;/label&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;%&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_nb"&gt;id&lt;/span&gt;&lt;span class="native_p"&gt;,&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;label&lt;/span&gt;&lt;span class="native_p"&gt;)&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;

&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_c"&gt;# use a custom error formatter. when htmlfill.render() parses this html&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_c"&gt;# it looks for the key &amp;#39;p_error_formatter&amp;#39; and uses that formatter.&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_c"&gt;# remember that &amp;#39;p_error_formatter&amp;#39; is looked for in the error_formatters dict&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_c"&gt;# defined above.&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_n"&gt;s&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;+=&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;&amp;lt;form:error name=&amp;quot;&lt;/span&gt;&lt;span class="native_si"&gt;%s&lt;/span&gt;&lt;span class="native_s"&gt;&amp;quot; format=&amp;quot;p_error_formatter&amp;quot;&amp;gt;&amp;lt;/form:error&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;%&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;name&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_k"&gt;return&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Notice the form:error tag? That's where htmlfill.render() inserts error text (if there is any) and formats it according to the 'p_error_formatter'. So how does htmlfill.render() know how to handle 'p_error_formatter'? Easy. You create a dict with your error formatter(s) and pass it to htmlfill.render(). When htmlfill.render() parses your HTML, it will take 'p_error_formatter' and do a lookup in your error formatter dict and call that function with the error text.&lt;/p&gt;

&lt;p&gt;Here's my error_formatter dict:&lt;/p&gt;

&lt;div style="margin: 10px 0;"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="native_n"&gt;error_formatter&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_p"&gt;{&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;:&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;htmlfill&lt;/span&gt;&lt;span class="native_o"&gt;.&lt;/span&gt;&lt;span class="native_n"&gt;default_formatter&lt;/span&gt;&lt;span class="native_p"&gt;,&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_s"&gt;&amp;#39;p_error_formatter&amp;#39;&lt;/span&gt;&lt;span class="native_p"&gt;:&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;p_error_formatter&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_p"&gt;}&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;error_formatter['p_error_formatter'] is the p_error_formatter() function I defined above.&lt;/p&gt;

&lt;p&gt;I also created my own render() function that just calls htmlfill.render() with some predetermined args:&lt;/p&gt;

&lt;div style="margin: 10px 0;"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="native_k"&gt;def&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_nf"&gt;render&lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_n"&gt;html&lt;/span&gt;&lt;span class="native_p"&gt;,&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;defaults&lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_bp"&gt;None&lt;/span&gt;&lt;span class="native_p"&gt;,&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;errors&lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_bp"&gt;None&lt;/span&gt;&lt;span class="native_p"&gt;):&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_k"&gt;return&lt;/span&gt;&lt;span class="native_"&gt; &lt;/span&gt;&lt;span class="native_n"&gt;htmlfill&lt;/span&gt;&lt;span class="native_o"&gt;.&lt;/span&gt;&lt;span class="native_n"&gt;render&lt;/span&gt;&lt;span class="native_p"&gt;(&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;        &lt;/span&gt;&lt;span class="native_n"&gt;html&lt;/span&gt;&lt;span class="native_p"&gt;,&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;        &lt;/span&gt;&lt;span class="native_n"&gt;defaults&lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_n"&gt;defaults&lt;/span&gt;&lt;span class="native_p"&gt;,&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;        &lt;/span&gt;&lt;span class="native_n"&gt;errors&lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_n"&gt;errors&lt;/span&gt;&lt;span class="native_p"&gt;,&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;        &lt;/span&gt;&lt;span class="native_n"&gt;error_formatters&lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_n"&gt;error_formatters&lt;/span&gt;&lt;span class="native_p"&gt;,&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;        &lt;/span&gt;&lt;span class="native_n"&gt;auto_insert_errors&lt;/span&gt;&lt;span class="native_o"&gt;=&lt;/span&gt;&lt;span class="native_bp"&gt;False&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;span class="native_"&gt;    &lt;/span&gt;&lt;span class="native_p"&gt;)&lt;/span&gt;&lt;span class="native_"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;That's about it for the core htmlfill stuff. I have a couple other helper methods in form_helpers.py and some more CSS that makes the background of form elements red when there's an error.&lt;/p&gt;

&lt;p&gt;If you're running Pylons, just go into the root formencode_tutorial directory and run 'paster serve &amp;ndash;&amp;ndash;reload development.ini' and check out how it's all tied together.&lt;/p&gt;

&lt;p&gt;Feel free to leave comments if you have any questions or if I missed something. Happy hacking!
&lt;/p&gt;</description><author>David Reynolds</author><guid isPermaLink="true">http://alwaysmovefast.com/entry/formencode-usage</guid><pubDate>Sat, 25 Oct 2008 16:03:03 GMT</pubDate></item><item><title>Oahu Trip</title><link>http://alwaysmovefast.com/entry/oahu-trip</link><description>&lt;p&gt;I'm leaving for Honolulu tomorrow morning so I may not respond to emails for a couple weeks. I hope every one is well!&lt;/p&gt;</description><author>David Reynolds</author><guid isPermaLink="true">http://alwaysmovefast.com/entry/oahu-trip</guid><pubDate>Fri, 05 Sep 2008 01:40:06 GMT</pubDate></item><item><title>Affiliate Summit East: Boston</title><link>http://alwaysmovefast.com/entry/affiliate-summit-east-boston</link><description>&lt;p&gt;I will be in Boston from August 9-12 for Affiliate Summit East. I'm Looking forward to meeting some new people and getting some work done. It should be a pretty good time, especially with people volunteering to buy drinks at the meet-ups.&lt;/p&gt;</description><author>David Reynolds</author><guid isPermaLink="true">http://alwaysmovefast.com/entry/affiliate-summit-east-boston</guid><pubDate>Thu, 07 Aug 2008 16:12:19 GMT</pubDate></item></channel></rss>
