--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/DESIGN.markdown Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,13 @@
+Some notes on the design, mostly for myself.
+
+Images
+======
+
+Full images for posts should be 580 pixels wide (or less) and a multiple of 25
+pixels tall.
+
+Headers
+=======
+
+Blog and project content block should use h2 and lower. h1 elements are
+reserved for the layout.
--- a/DESIGN.mdown Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-Some notes on the design, mostly for myself.
-
-Images
-======
-
-Full images for posts should be 580 pixels wide (or less) and a multiple of 25
-pixels tall.
-
-Headers
-=======
-
-Blog and project content block should use h2 and lower. h1 elements are
-reserved for the layout.
--- a/content/404.html Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-{% extends "_flatpage.html" %}
-
-{% hyde
- title: "Not Found"
- exclude: True
-%}
-
-
-{% block article %}
-
-OH GOD HOW DID THIS GET HERE SOMEONE IS NOT GOOD WITH LINK
-==========================================================
-
-{% endblock %}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/content/404.markdown Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,4 @@
+title: "Not Found"
+
+OH GOD HOW DID THIS GET HERE SOMEONE IS NOT GOOD WITH LINK
+==========================================================
--- a/content/about.html Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-{% extends "skeleton/_base.html" %}
-{% hyde
- title: "About"
-%}
-
-{% block content %}
- <img src="/media/images/self.jpg" class="self right" />
-
- <div id="leaf-title"><h1>{{ page.title|safe|typogrify }}</h1></div>
-
- <div id="leaf-content">
- {% filter typogrify %}
- {% markdown %}
-I'm **Steve**. I'm from **[Rochester, NY][rochester]**.
-I do a lot of different things.
-
-If you want to get in touch with me you can [email
-me](mailto:steve@stevelosh.com) or find me on [BitBucket][], [GitHub][],
-[Twitter][], [Forrst][], or [Flickr][].
-
-[rochester]: http://rocwiki.org/
-[Twitter]: http://twitter.com/stevelosh/
-[Flickr]: http://www.flickr.com/photos/sjl7678/
-[BitBucket]: http://bitbucket.org/sjl/
-[GitHub]: http://github.com/sjl/
-[Forrst]: http://forrst.com/people/stevelosh/
-
-
-Programming
------------
-
-I went to [Rochester Institute of Technology](http://rit.edu/) for a degree in
-Computer Science.
-
-I've done a lot of different things in the field so far. Right now the things
-that are captivating me are artificial intelligence and clean, simple,
-*useful* web applications.
-
-I find programming beautiful. That might sound strange, but there are aspects
-of programming and math that I can't describe any other way.
-
-You can take a look at my [projects][] to see some of the major stuff I've
-worked on, or cut to the chase and look at [my BitBucket account][BitBucket].
-
-[projects]: /projects/
-
-Photography
-----------
-
-I like photographing people. Other things as well, but especially people.
-I tend to gravitate toward the "art" aspects of photography more than the
-"journalism" aspects, but I can appreciate both.
-
-I shoot digital and film (35mm and medium format) depending on my time limits
-and mood. I develop film in my bathroom and print it in a rented darkroom.
-When I print digital I use a lab nearby; I don't have the money for a
-professional printer just yet.
-
-I post most of what I take on [my Flickr account][Flickr].
-
-Dancing
--------
-
-I teach blues dancing here in Rochester as part of [Lady Luck Blues][].
-I starting blues dancing a few years ago and haven't stopped since. My favorite
-aspect of dancing is connection and blues seems to bring that out more than any
-other dance.
-
-I've also been swing dancing for about seven years. My first love is Lindy Hop; I
-go to classes, workshops and exchanges as often as my schedule and budget will
-allow.
-
-Lately I've begun getting my feet wet in tango. Whether it'll ever become as
-important to me as blues or Lindy remains to be seen.
-
-[Lady Luck Blues]: http://ladyluckblues.com/
-
-Music
------
-
-I play electric and upright bass. I've played in a metal band in the past, but
-right now my focus is on jazz and blues.
-
-I DJ at swing and blues dances fairly often. My taste is pretty broad, and
-I'll cater to whatever the floor wants, but I tend to personally enjoy
-slightly down-tempo, small-group music. Let me know if you need a DJ for a
-dance.
-
-About the Site
------------
-
-If you want to know more about my site you should check out the [project
-page](/projects/stevelosh-com/) about the original version and my [blog
-post][hyderewrite] about how I rewrote it.
-
-[hyderewrite]: /blog/2010/01/moving-from-django-to-hyde/
- {% endmarkdown %}
- {% endfilter %}
- </div>
-{% endblock %}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/content/about.markdown Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,86 @@
+title: About
+template: about
+
+I'm **Steve**. I'm from **[Rochester, NY][rochester]**.
+I do a lot of different things.
+
+If you want to get in touch with me you can [email
+me](mailto:steve@stevelosh.com) or find me on [BitBucket][], [GitHub][],
+[Twitter][], [Forrst][], or [Flickr][].
+
+[rochester]: http://rocwiki.org/
+[Twitter]: http://twitter.com/stevelosh/
+[Flickr]: http://www.flickr.com/photos/sjl7678/
+[BitBucket]: http://bitbucket.org/sjl/
+[GitHub]: http://github.com/sjl/
+[Forrst]: http://forrst.com/people/stevelosh/
+
+
+Programming
+-----------
+
+I went to [Rochester Institute of Technology](http://rit.edu/) for a degree in
+Computer Science.
+
+I've done a lot of different things in the field so far. Right now the things
+that are captivating me are artificial intelligence and clean, simple,
+*useful* web applications.
+
+I find programming beautiful. That might sound strange, but there are aspects
+of programming and math that I can't describe any other way.
+
+You can take a look at my [projects][] to see some of the major stuff I've
+worked on, or cut to the chase and look at [my BitBucket account][BitBucket].
+
+[projects]: /projects/
+
+Photography
+----------
+
+I like photographing people. Other things as well, but especially people.
+I tend to gravitate toward the "art" aspects of photography more than the
+"journalism" aspects, but I can appreciate both.
+
+I shoot digital and film (35mm and medium format) depending on my time limits
+and mood. I develop film in my bathroom and print it in a rented darkroom.
+When I print digital I use a lab nearby; I don't have the money for a
+professional printer just yet.
+
+I post most of what I take on [my Flickr account][Flickr].
+
+Dancing
+-------
+
+I teach blues dancing here in Rochester as part of [Lady Luck Blues][].
+I starting blues dancing a few years ago and haven't stopped since. My favorite
+aspect of dancing is connection and blues seems to bring that out more than any
+other dance.
+
+I've also been swing dancing for about seven years. My first love is Lindy Hop; I
+go to classes, workshops and exchanges as often as my schedule and budget will
+allow.
+
+Lately I've begun getting my feet wet in tango. Whether it'll ever become as
+important to me as blues or Lindy remains to be seen.
+
+[Lady Luck Blues]: http://ladyluckblues.com/
+
+Music
+-----
+
+I play electric and upright bass. I've played in a metal band in the past, but
+right now my focus is on jazz and blues.
+
+I DJ at swing and blues dances fairly often. My taste is pretty broad, and
+I'll cater to whatever the floor wants, but I tend to personally enjoy
+slightly down-tempo, small-group music. Let me know if you need a DJ for a
+dance.
+
+About the Site
+-----------
+
+If you want to know more about my site you should check out the [project
+page](/projects/stevelosh-com/) about the original version and my [blog
+post][hyderewrite] about how I rewrote it.
+
+[hyderewrite]: /blog/2010/01/moving-from-django-to-hyde/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/content/blog/index.markdown Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,3 @@
+title: Blog
+template: entry-list
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/content/blog/moving-from-django-to-hyde.markdown Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,454 @@
+title: "Moving from Django to Hyde"
+snip: "Another year, another rewrite."
+date: 2010-01-15 20:14:00
+flattr: true
+
+Almost exactly one year ago I posted a blog entry about how I [rewrote this
+site][rewrite] using [Django][]. It's a new year, and once again I've
+rewritten the site.
+
+If you've visited my site before you may have noticed some small style tweaks.
+I've cleaned up a few things and I think the site looks better overall. The
+biggest change, however, is that I completely rewrote the core -- this time
+with [Hyde][].
+
+Hyde is a "static site generator" written in [Python][], similar to
+[Jekyll][], [Blatter][] and [Pilcrow][]. I chose it over the others because
+it's written in Python (unlike Jekyll), more flexible than Blatter and more
+mature than Pilcrow.
+
+Rewriting an existing site that gets a decent amount of visitors is different
+than creating a new site from scratch, so I decided to write this entry to
+describe some of the issues I ran into and how I tackled them.
+
+[Django]: {{links.django}}
+[rewrite]: /blog/2009/01/site-redesign/
+[Hyde]: {{links.hyde}}
+[Python]: {{links.python}}
+[Jekyll]: http://jekyllrb.com/
+[Blatter]: {{links.blatter}}
+[Pilcrow]: http://inky.github.com/pilcrow/
+
+[TOC]
+
+Why Static?
+-----------
+
+There are a couple of reasons I decided to switch to a static site.
+
+### Less Memory Needed
+
+I use [WebFaction][] for my web hosting, and with my current plan I have a
+limit on how much memory I can use at any given time. Each Django site takes
+up around 20mb of memory on the server.
+
+By switching to a static set of HTML pages for my site I save those 20mb so I
+can use them for something else (like a staging site for another project). My
+site doesn't particularly *need* all of the functionality Django can provide,
+so I figured I'd switch to a static site and save the memory.
+
+[WebFaction]: {{links.webfaction}}
+
+### Static Pages are Faster
+
+My site doesn't get an enormous amount of traffic, so the Django instances
+weren't really working very hard. Still, serving a static page through Apache
+or nginx is always going to be faster than running it through Django.
+Faster-loading pages is always a good thing, even if the speed increase isn't
+very large.
+
+### Easier to Maintain
+
+This is the main reason I switched. Previously, to edit a blog entry I would
+log in through Django's admin interface and edit the entry. With Hyde, I
+simply edit a file (or create a new one) on my machine and then run a single
+command to publish it.
+
+Another problem with the old site is that I needed to be connected to the
+internet to get to the admin interface, so I couldn't update entries (or
+publish new ones) offline. I usually have an internet connection, but
+occasionally I don't. Now I can edit as much as I like on my own machine and
+only need a connection to publish the finished product.
+
+### Easier to Backup
+
+One more advantage of Hyde is that the site structure *and* content are all
+held in the same place. I keep everything in a [Mercurial][] repository, and
+so every time I push that repository somewhere it creates a full backup of the
+site's code *and* content. If WebFaction's server catches on fire I still have
+everything on my local machine (and on BitBucket).
+
+I've toyed around with backing up Django's database tables when I had my old
+site, but this new method is far less work.
+
+[Mercurial]: {{links.mercurial}}
+
+Getting Started
+---------------
+
+I wanted a fresh start when I was rewriting the site, so I went ahead and
+created a brand new folder and Mercurial repository for it.
+
+I used `hyde --init` to lay out a skeleton in the new folder. Then I stripped
+out a lot of the default items that get added with `--init` and created the
+directory structure I wanted to use, with stubs for each of the main content
+files I knew I'd need.
+
+Finally, I went ahead and filled some of the basic values in the `settings.py`
+file.
+
+Layout and Styling
+------------------
+
+Once I had a skeleton in place I started working on layout of the site.
+
+### Cleanup
+
+The templates created by `hyde --init` are functional, but when you look at
+the code they're a mess. The indentation is strange and inconsistent and
+there's trailing whitespace all over the place. I like clean code so I sat
+down and cleaned everything up before I started making any real changes.
+
+### Rewriting the Layout and Styles
+
+After I finished cleaning up the templates I duplicated the HTML structure and
+styles of the old site from scratch. The old site had gone through a bunch of
+iterations and I was a bit sloppy in my editing, so there was a lot of cruft
+that had snuck in. I wanted a truly *fresh* start for the site, so I buckled
+down and did it all again.
+
+### A New CSS Framework
+
+Previously I used the [Blueprint CSS framework][blueprint] to make laying out
+the site easier. Blueprint is a great framework, but it's more powerful than I
+need for a site as simple as this one. The site now uses [Aardvark Legs][aal],
+which is a much simpler framework that simply sets up a great vertical rhythm
+and leaves you free to lay out the horizontal structure yourself.
+
+### Pagination
+
+Before the rewrite the list of blog entries used to be paginated. Hyde
+supports pagination but I decided against using it because I simply don't
+write enough to make it necessary. All the blog entries are now listed on a
+single page, which means that you can use Cmd+F to find an article if you're
+looking for something specific.
+
+[blueprint]: http://www.blueprintcss.org/
+[aal]: {{links.aardvarklegs}}
+
+Using Fabric to Type Less
+-------------------------
+
+I realized very quickly that typing `hyde -g -s . && hyde -w -s .` would get
+old pretty quickly, so I installed [Fabric][] and wrote a fabfile.
+
+Fabric is a tool written in Python that lets you define tasks and execute them
+by running `fab taskname`. Fabfiles are pure Python, so you can build larger
+tasks out of smaller ones very easily and do just about anything you want.
+It's similar to [ant][], but without the excessive over-engineering.
+
+You can view the [current fabfile][fabfile] on BitBucket. At the time of this
+entry it looks like this:
+
+ :::python
+ from fabric.api import *
+ import os
+ import fabric.contrib.project as project
+
+ PROD = 'sjl.webfactional.com'
+ DEST_PATH = '/home/sjl/webapps/slc/'
+ ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
+ DEPLOY_PATH = os.path.join(ROOT_PATH, 'deploy')
+
+ def clean():
+ local('rm -rf ./deploy')
+
+ def regen():
+ clean()
+ local('hyde -g -s .')
+
+ def serve():
+ local('hyde -w -s .')
+
+ def reserve():
+ regen()
+ serve()
+
+ def smush():
+ local('smusher ./media/images')
+
+ @hosts(PROD)
+ def publish():
+ regen()
+ project.rsync_project(
+ remote_dir=DEST_PATH,
+ local_dir=DEPLOY_PATH.rstrip('/') + '/',
+ delete=True
+ )
+
+The task I use most often while developing is `fab reserve`, which regenerates
+the site and then starts serving it so I can view the result in a browser.
+
+I use `fab smush` whenever I add new images. This runs [smusher][] on all of
+the images to optimize them without reducing quality.
+
+When I'm ready to publish changes to the live site I run `fab publish`, which
+will regenerate my local version and copy it up to the WebFaction server.
+
+[Fabric]: {{links.fabric}}
+[ant]: http://ant.apache.org/
+[fabfile]: http://bitbucket.org/sjl/stevelosh/src/tip/fabfile.py
+[smusher]: http://github.com/grosser/smusher
+
+Moving the Content
+------------------
+
+The content of the old site (blog entries, projects, and static pages like the
+[about page][]) was fairly easy to migrate over to the new one, because both
+versions use [Markdown][] to format the text.
+
+First I created an empty file for each page with a filename that matched the
+"slug" (last part of the URL) of the old page. Then I manually copied over the
+title, creation time and content for every page. I could have written a script
+to do this, but I don't have enough pages on the site to make it worth the
+time.
+
+[about page]: /about/
+[Markdown]: {{links.markdown}}
+
+Converting the Comments
+-----------------------
+
+At this point the new site was looking very much like the old one. The styles
+were (roughly) matching and the blog posts, entries, and static pages were all
+rendered nicely.
+
+The next big task was migrating all of the comments. Since the new site is
+static it can't handle dynamic content like comments on its own, so I decided
+to use [Disqus][]. I use Disqus for the comments on the [hg tip][] site and
+it's very nice. For that site I used it from the beginning, but for this
+rewrite I needed to somehow import all the old comments.
+
+To migrate the comments over I used [django-disqus][], but there was a small
+snag that I needed to deal with first.
+
+When I first wrote the old site I was just getting back into Django after not
+using it for a long time. I didn't know about Django's built-in comment
+models, so I created my own. They weren't as good as Django's, but they did
+the job and I didn't care enough to change them.
+
+This became a problem when it was time to import the old comments into Disqus.
+django-disqus only supports importing comments from Django's built-in comment
+models. To work around this I first had to convert the old comments into
+Django's built-in ones. I wrote a [small, hacky Python
+script][convert-comments] to do it:
+
+ :::python
+ #!/usr/bin/env python
+
+ from django.core.management import setup_environ
+ import settings
+ setup_environ(settings)
+
+ from markdown import Markdown
+ from django.contrib.comments.models import Comment
+ from django.contrib.sites.models import Site
+ from stevelosh.blog.models import Comment as BlogComment
+ from stevelosh.projects.models import Comment as ProjectComment
+
+
+ mdown = Markdown()
+
+ site = Site.objects.all()[0]
+ blog_comments = BlogComment.objects.filter(spam=False)
+ project_comments = ProjectComment.objects.filter(spam=False)
+
+ for bc in blog_comments:
+ c = Comment()
+ c.content_object = bc.entry
+ c.user_name = bc.name
+ c.comment = mdown.convert(bc.body)
+ c.submit_date = bc.submitted
+ c.site = site
+ c.is_public = True
+ c.is_removed = False
+ c.save()
+ # print 'http://%s%s' % (site.domain, c.content_object.get_absolute_url())
+
+ for pc in project_comments:
+ c = Comment()
+ c.content_object = pc.project
+ c.user_name = pc.name
+ c.comment = mdown.convert(pc.body)
+ c.submit_date = pc.submitted
+ c.site = site
+ c.is_public = True
+ c.is_removed = False
+ c.save()
+ # print 'http://%s%s' % (site.domain, c.content_object.get_absolute_url())
+
+Yes, it's ugly. No, I don't care. It was run once or twice locally and once on
+the live server. It worked and I'll never need to run it again.
+
+Once I had the comments converted I could use django-disqus to migrate them.
+The import went very smoothly -- I ran one command and after a couple of
+minutes everything was in Disqus. Once that finished it was just a matter of
+adding the Disqus JavaScript to one of the templates.
+
+[Disqus]: http://disqus.com/
+[hg tip]: {{links.hgtip}}
+[django-disqus]: http://github.com/arthurk/django-disqus
+[convert-comments]: http://bitbucket.org/sjl/stevelosh/src/da98105753a1/convert-comments.py
+
+Rewriting the Old URLs
+----------------------
+
+Since I was pretty much starting from scratch with this rewrite I decided to
+clean up the URL structure of my blog. Previously a blog entry's URL looked
+like this:
+
+ :::text
+ http://stevelosh.com/blog/entry/2009/08/30/a-guide-to-branching-in-mercurial/
+
+The `/entry/` part of the URL was useless -- it just took up space, so I got
+rid of it. The year and month are useful to get an idea of how old an entry is
+just by looking at the link, so I left them in. The day, however, probably
+doesn't matter that much, so I took it out.
+
+The new URLs look like this:
+
+ :::text
+ http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/
+
+The problem with rewriting the URL structure is that there are already links
+around the web pointing at my entries. I didn't want those old links to break,
+so I crafted an [`.htaccess` file][htaccess] that would rewrite the old URLs
+into the new ones:
+
+ {% templatetag openblock %} if GENERATE_CLEAN_URLS {% templatetag closeblock %}
+ RewriteEngine on
+ RewriteBase {% templatetag openvariable %} node.site.settings.SITE_ROOT {% templatetag closevariable %}
+
+ # Old URLs
+ RewriteRule ^blog/entry/(\d+)/(\d\d)/\d+/([^/]*)/?$ /blog/$1/$2/$3/ [R=301,L]
+ RewriteRule ^blog/entry/(\d+)/(\d)/\d+/([^/]*)/?$ /blog/$1/0$2/$3/ [R=301,L]
+
+ {% templatetag openblock %} hyde_listing_page_rewrite_rules {% templatetag closeblock %}
+
+ # listing pages whose names are the same as their enclosing folder's
+ RewriteCond %{REQUEST_FILENAME}/$1.html -f
+ RewriteRule ^([^/]*)/$ %{REQUEST_FILENAME}/$1.html
+
+ # regular pages
+ RewriteCond %{REQUEST_FILENAME}.html -f
+ RewriteRule ^.*$ %{REQUEST_FILENAME}.html
+
+ {% templatetag openblock %} endif {% templatetag closeblock %}
+
+Most of that file is the stock Hyde `.htaccess` file -- the two lines under `#
+Old URLs` are the ones that I added. It took me a while to get it right
+because I don't work with Apache's `mod_rewrite` very often, but it was worth
+it to avoid breaking all of the old links.
+
+[htaccess]: http://bitbucket.org/sjl/stevelosh/src/tip/content/.htaccess
+
+Creating an RSS Feed
+--------------------
+
+I had an RSS feed for the old site which Django made very easy to set up. I
+definitely needed a feed for the new site, and fortunately Hyde provides a
+simple sample template that can be used to make an ATOM feed.
+
+I cleaned up the whitespace and formatting of that template a bit, adjusted a
+few variables for my needs, put it on [FeedBurner][] and everything was ready.
+
+[FeedBurner]: http://www.feedburner.com/
+
+Merging the Repositories
+------------------------
+
+The last step before I was finished was to merge the old and new repositories
+together so I wouldn't lose any of the history. It's probably not *too*
+important to keep the old site's history around, but I put a lot of work into
+it over the past year and it has some sentimental value.
+
+Fortunately it's very easy to [combine Mercurial repositories][combinerepos].
+I just pulled the old repository into the new one, merged the old head into
+the new one while discarding all the changes, and pushed it up to BitBucket.
+
+[combinerepos]: http://hgtip.com/tips/advanced/2009-11-17-combining-repositories/
+
+Still to Come
+-------------
+
+At this point I felt the site was ready to be released, so I set up a new site
+on WebFaction and used Fabric to deploy it.
+
+I'm very happy with the result, but there are still a few things I'm going to
+fix/change in the future.
+
+### "Ago" Dates
+
+**UPDATE:** This is done. I've started using [timeago.js][] to render the
+"ago" dates.
+
+If you look at the top of each blog entry and project there's a line beneath
+the title that looks something like:
+
+ :::text
+ Posted on Monday, November 16, 2009 (1 month, 3 weeks ago).
+
+The `(1 month, 3 weeks ago)` part of that line is something that I really
+appreciate on blogs. When they just list the date I always have to do the math
+in my head to figure out roughly how old something is.
+
+With a static site, however, those times will quickly become inaccurate if I
+don't regenerate and publish the site regularly. I'm still thinking about the
+best way to work this out.
+
+One option is to use a cron job on the WebFaction server to regenerate the
+site every day, which would keep the times *fairly* accurate.
+
+Another option would be to use a bit of JavaScript to calculate and render the
+time when the page is loaded. This would make it *completely* accurate but
+wouldn't work if someone is browsing with JavaScript turned off.
+
+[timeago.js]: http://timeago.yarp.com/
+
+### Categories
+
+**UPDATE:** I've added categories. Check out [this changeset][categorycset] to see what I had to do.
+
+Right now all the blog entries (and projects) are listed in a single
+chronological list. It would be great to break them up into categories so
+people can easily find the articles they're interested in.
+
+Hyde supports categories but I haven't spent the time to learn how to use them
+yet. I also need to figure out a way to work a list of categories into the
+design without cluttering things up too much.
+
+[categorycset]: http://bitbucket.org/sjl/stevelosh/changeset/08d7552b6237/
+
+### Use LessCSS
+
+**UPDATE:** This is done. The main style file now uses LessCSS.
+
+[LessCSS][] is a language that extends CSS with some useful features like
+variables, mixins, operations and nested rules. It can make the styles of a
+site much, much cleaner.
+
+Hyde includes a LessCSS "processor" that will automatically render your
+LessCSS files into normal CSS. I'm planning on rewriting the site's styles in
+LessCSS and using the processor once I get some free time.
+
+[lesscss]: {{links.lesscss}}
+
+View the Code
+-------------
+
+The code is on [BitBucket][bb-repo] and [GitHub][gh-repo]. Feel free to poke
+around and see how I've set things up. If you have questions or suggestions
+I'd love to hear them!
+
+[bb-repo]: http://bitbucket.org/sjl/stevelosh/
+[gh-repo]: http://github.com/sjl/stevelosh/
--- a/content/feed.html Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-{% extends "skeleton/_atom.xml" %}
\ No newline at end of file
--- a/content/index.html Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-{% extends "_splash.html" %}
-
-{% hyde
- title: ""
-%}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/content/index.markdown Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,3 @@
+title: ' '
+template: home
+
--- a/content/resume.html Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,220 +0,0 @@
-{% extends "_flatpage.html" %}
-
-{% hyde
- title: "Résumé"
- exclude: True
-%}
-
-{% block article %}
-
-I'm Steve. I'm a programmer from Rochester, NY. I graduated from [Rochester
-Institute of Technology][rit] in 2008 with a Bachelor's degree in [Computer
-Science][ritcs].
-
-I'm currently most interested in rapid web development, version control, and
-artificial intelligence. I'm not looking for full time work at the moment but
-I'm available for interesting freelance projects.
-
-If you'd *really* like to get to know me you should look at the [projects][]
-and [blog posts][] I've written, or cut to the chase and look at my [code][].
-
-[rit]: http://rit.edu/
-[ritcs]: http://www.cs.rit.edu/
-[projects]: /projects/
-[blog posts]: /blog/
-[code]: http://bitbucket.org/sjl/
-
-## Skills & Interests
-
-I'm passionate about programming. It may sound odd, but there are aspects of
-programming that I find beautiful (in every sense of the word).
-
-### Languages
-
-My favorite programming language at the moment is [Python][]. It's elegant,
-readable, powerful, and makes it easy to *get things done*.
-
-I've also had experience with [Java][], [C][], [C++][], [Lisp][], [SQL][] and
-[PL/SQL][], [JavaScript][], [Groovy][], and [bash scripting][]. I've used a
-number of markup and templating languages, including [XHTML][], [XML][],
-[CSS][], [JSON][], [Markdown][], [Django][]'s template system, and [Jinja2][].
-
-In my free time I'm working on learning [R][].
-
-[Python]: http://www.python.org/
-[Java]: http://java.sun.com/
-[C]: http://en.wikipedia.org/wiki/C_(programming_language)
-[C++]: http://en.wikipedia.org/wiki/C%2B%2B
-[Lisp]: http://en.wikipedia.org/wiki/Lisp_(programming_language)
-[SQL]: http://en.wikipedia.org/wiki/SQL
-[PL/SQL]: http://en.wikipedia.org/wiki/PL/SQL
-[JavaScript]: http://en.wikipedia.org/wiki/JavaScript
-[Groovy]: http://groovy.codehaus.org/
-[bash scripting]: http://www.gnu.org/software/bash/
-[XHTML]: http://www.w3.org/TR/xhtml1/
-[XML]: http://www.w3.org/XML/
-[CSS]: http://www.w3.org/TR/CSS/
-[JSON]: http://www.json.org/
-[Markdown]: {{links.markdown}}
-[Jinja2]: http://jinja.pocoo.org/2/
-[R]: http://www.r-project.org/
-
-### Web Development
-
-For web development I gravitate toward the [Django][] framework. Django bills
-itself as "The Web framework for professionals with deadlines" and this
-strikes a chord with me.
-
-I've used the [CherryPy][] framework for smaller (but still dynamic) projects
-that don't need the additional functionality of Django.
-
-I hate writing repetitive, difficult-to-maintain code. Even when writing
-completely static websites I prefer to take advantage of templating languages.
-To do that I use [Hyde][] and [Blatter][], both of which generate static HTML
-from templates.
-
-I've used several CSS frameworks including [Blueprint][], [Tripoli][] and
-[aardvark legs][]. Of these I now prefer aardvark legs because it makes
-setting up a beautiful vertical rhythm simple and doesn't impose itself on the
-horizontal layout.
-
-When writing [JavaScript][] I use [jQuery][] to eliminate a lot of the
-tediousness and create elegant code.
-
-[Django]: {{links.django}}
-[CherryPy]: {{links.cherrypy}}
-[Blueprint]: http://www.blueprintcss.org/
-[Tripoli]: http://devkick.com/lab/tripoli/
-[aardvark legs]: {{links.aardvarklegs}}
-[Hyde]: http://github.com/lakshmivyas/hyde
-[Blatter]: {{links.blatter}}
-[jQuery]: http://jquery.com/
-
-### Version Control
-
-I think version control is essential for a project of almost any size, and
-lately the concepts behind it have captured my interest.
-
-In my personal work I use [Mercurial][] (usually with [BitBucket][]). I've
-[contributed][] several minor patches to the Mercurial core and written two
-extensions: [hg-prompt][] and [hg-paste][].
-
-I know my way around [Subversion][], [CVS][], and [git][] as well.
-
-[Mercurial]: {{links.mercurial}}
-[BitBucket]: http://bitbucket.org/
-[Subversion]: http://subversion.tigris.org/
-[CVS]: http://www.nongnu.org/cvs/
-[git]: http://git-scm.com/
-[contributed]: http://selenic.com/repo/hg/log?rev=Steve+Losh
-[hg-prompt]: /projects/hg-prompt/
-[hg-paste]: /projects/hg-paste/
-
-### How I Work
-
-For my personal work I use [Mac OS X][]. I'm comfortable in [Linux][] and can
-deal with [Windows][] (though I don't enjoy it).
-
-I use [TextMate][] and [vim][] for coding, [CSSEdit][] when designing,
-[Mercurial][] for version control, [t][] to manage my personal tasks, and
-deploy through [SSH][] with [fabric][].
-
-[Mac OS X]: http://www.apple.com/macosx/
-[TextMate]: http://macromates.com/
-[SSH]: http://en.wikipedia.org/wiki/Secure_Shell
-[fabric]: {{links.fabric}}
-[Linux]: http://www.linux.org/
-[Windows]: http://www.microsoft.com/WINDOWS/
-[vim]: http://www.vim.org/
-[CSSEdit]: http://macrabbit.com/cssedit/
-[t]: /projects/t/
-
-## Personal Projects
-
-You can find some of my pet projects on the [projects][] page.
-
-Lately I've been working on a few new things that aren't quite ready for
-general use, but are getting close:
-
-* [hg-review][]: a code-review extension for Mercurial.
-* [LindyHub][]: a site like BitBucket or GitHub for dancers.
-* [gorilla][]: a packaging system for Python.
-* [tinpan][]: a language-agnostic, vcs-agnostic continuous integration system.
-
-[hg-review]: http://bitbucket.org/sjl/hg-review/
-[LindyHub]: http://test.lindyhub.com/
-[gorilla]: http://bitbucket.org/sjl/gorilla/
-[tinpan]: http://bitbucket.org/sjl/tinpan/
-
-## Full-Time Work Experience
-
-I completed two six-month [co-ops][] while at [RIT][]. Since I graduated I've
-worked full time for about a year and a half.
-
-[co-ops]: https://www.rit.edu/about/coop_careers.html
-[RIT]: http://rit.edu/
-
-### Senior Software Engineer at [Dumbwaiter Design][DWD]
-
-*Henrietta, NY since January 2010.*
-
-At [Dumbwaiter][DWD] I work with our amazing designers to create beautiful websites backed by [Django][] and [Python][].
-
-[DWD]: http://dwaiter.com/
-
-### Software Engineer at [PAETEC][]
-
-*Fairport, NY from June 2008 to January 2010.*
-
-At [PAETEC][] I maintained and implemented new features for web applications
-in [Java][] using the [Oracle E-Business Suite][oebs] and worked on underlying
-[SQL][] and [PL/SQL][] code for our databases.
-
-[PAETEC]: http://paetec.com/
-[oebs]: http://www.oracle.com/applications/e-business-suite.html
-
-### Data Architecture Co-op at [Excellus BlueCross BlueShield][]
-
-*Rochester, NY from June 2007 to November 2007.*
-
-At [Excellus][] I developed software in [Java][] to interact with and manage
-databases of customer and provider information stored on a mainframe. I also
-created and updated [JUnit][] and [Jemmy][] tests for this software.
-
-[Excellus BlueCross BlueShield]: https://www.excellusbcbs.com/
-[Excellus]: https://www.excellusbcbs.com/
-[JUnit]: http://www.junit.org/
-[Jemmy]: http://jemmy.dev.java.net/
-
-### Managed Services Programmer at [RightNow Technologies][]
-
-*Pittsford, NY from June 2006 to November 2006.*
-
-At [RightNow][] I developed a set of tools to test the effectiveness of
-voice-automated telephone systems. These tools were written in a combination
-of [bash scripting][] and [Python][]. I assisted in generating statistics
-about the effectiveness of these systems for customers.
-
-[RightNow Technologies]: http://www.rightnow.com/
-[RightNow]: http://www.rightnow.com/
-
-## Contact Me
-
-If you'd like to get in touch with me, you can use any method you like.
-
-My **email address** is: <steve@stevelosh.com>
-My **phone number** is: (570) 417-1392
-My **skype username** is: steve.losh
-My **mailing address** is: 150 Park Avenue, Apartment 7, Rochester, NY 14607
-
-You can also find me on [Twitter][], [Flickr][], [BitBucket][], [GitHub][],
-[BrightKite][], or [DjangoPeople][].
-
-[Twitter]: http://twitter.com/stevelosh/
-[Flickr]: http://www.flickr.com/photos/sjl7678/
-[BitBucket]: http://bitbucket.org/sjl/
-[GitHub]: http://github.com/sjl/
-[BrightKite]: http://brightkite.com/people/stevelosh/
-[DjangoPeople]: http://djangopeople.net/stevelosh/
-
-{% endblock %}
--- a/layout/_flatpage.html Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-{% extends "skeleton/_base.html" %}
-
-{% block content %}
- <div id="leaf-title"><h1>{{ page.title|safe|typogrify }}</h1></div>
-
- <div id="leaf-content">
- {% filter typogrify %}
- {% markdown toc def_list %}
- {% block article %}{% endblock %}
- {% endmarkdown %}
- {% endfilter %}
- </div>
-{% endblock %}
\ No newline at end of file
--- a/layout/_post.html Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-{% extends "skeleton/_base.html" %}
-
-{% block extra_css %}
- <link rel="stylesheet"
- href="{{ site.url }}/media/css/pygments-monokai-light.css"
- type="text/css" media="screen" charset="utf-8" />
-{% endblock %}
-
-{% block content %}
- <div id="leaf-title">
- <h1><a href="{{ page.url }}">{{ page.title|safe|typogrify }}</a></h1>
- </div>
-
-
- <div id="leaf-stats" class="group">
- {% if page.flattr %}
- <div class="flattr">
- <a class="FlattrButton" style="display:none;" rev="flattr;button:compact;"
- href="http://stevelosh.com{{ page.url }}"></a>
- </div>
- {% endif %}
- <p>
- Posted
- <span class="timeago"
- title="{{ page.created|date:"Y-m-d" }}T{{ page.created|date:"H:i:s" }}">
- </span>
- on {{ page.created|date:"F j, Y" }}.
- </p>
- </div>
-
- <div id="leaf-content" class="{% block article_class %}{% endblock %}">
- {% filter typogrify %}
- {% article %}
- {% filter typogrify %}
- {% markdown toc def_list codehilite %}
- {% block article %}{% endblock %}
- {% endmarkdown %}
- {% endfilter %}
- {% endarticle %}
- {% endfilter %}
- </div>
-{% endblock %}
--- a/layout/_splash.html Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-{% extends "skeleton/_base.html" %}
-
-{% block content %}
- <div class="splash">
- {% filter typogrify %}
- <p>Hello, I'm Steve.</p>
-
- <p>
- I'm a programmer, photographer, dancer <span class="amp">&</span>
- bassist from Rochester, New York.
- </p>
-
- <p>
- If you want to get in touch with me,
- <a href="mailto:steve@stevelosh.com">email</a> is best.
- </p>
- {% endfilter %}
- </div>
-{% endblock %}
--- a/layout/skeleton/_atom.xml Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-{% spaceless %}
-
-<feed xmlns="http://www.w3.org/2005/Atom">
- <title>{% block title %}{{ site.name }}{% endblock %}</title>
-
- {% block self_url %}
- <link href="{{ page.node.full_url }}/feed/" rel="self" />
- {% endblock %}
-
- {% block site_url %}
- <link href="{{ site.full_url }}"/>
- {% endblock %}
-
- {% block feed_extra %}{% endblock %}
-
- <updated>{{ now|xmldatetime }}</updated>
-
- <id>{{ site.full_url }}/</id>
-
- {% recent_posts recents 4 page.blog_node %}
-
- {% for post in recents %}
- {% if not post.listing and not post.exclude %}
- <entry>
- <title type="html">{{ post.title }}</title>
- <author><name>{{ site.author }}</name></author>
- <link href="{{ post.full_url }}"/>
- <updated>{{ post.created|xmldatetime }}</updated>
- <published>{{ post.created|xmldatetime }}</published>
- <id>{{ post.full_url }}</id>
- {% block entry_extra %}{% endblock %}
- <content type="html">
- {% filter force_escape %}
- {% render_article post %}
- {% endfilter %}
- </content>
- </entry>
- {% endif %}
- {% endfor %}
-</feed>
-
-{% endspaceless %}
--- a/layout/skeleton/_base.html Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,122 +0,0 @@
-{% extends "skeleton/_root.html" %}
-
-{% block all %}
-<!DOCTYPE html>
-
-<html>
- <head>
- <link href='http://fonts.googleapis.com/css?family=OFL+Sorts+Mill+Goudy+TT:regular,italic' rel='stylesheet' type='text/css'>
-
- <meta http-equiv="content-type" content="text/html; charset=utf-8" />
-
- <title>{% block title %}{% block extra_title %}{% endblock %}{{ page.title|safe }} / {{ site.name }}{% endblock %}</title>
-
- {% block feeds %}
- <link href="http://feeds2.feedburner.com/stevelosh"
- rel="alternate" title="{{ site.name }}"
- type="application/atom+xml" />
- {% endblock %}
-
- {% block css %}
- <link rel="stylesheet" href="/media/css/aal.css" type="text/css" media="screen" charset="utf-8" />
- <link rel="stylesheet" href="/media/css/sjl.css" type="text/css" media="screen" charset="utf-8" />
- <link rel="stylesheet" href="/media/css/colorbox.css" type="text/css" media="screen" charset="utf-8" />
- <link rel="stylesheet" href="/media/css/print.css" type="text/css" media="print" charset="utf-8" />
- {% block extra_css %}{% endblock %}
- {% endblock %}
-
- {% block js %}
- <script src="/media/js/jquery.js" type="text/javascript"></script>
- <script src="/media/js/jquery.timeago.js" type="text/javascript"></script>
- <script src="/media/js/jquery.colorbox.js" type="text/javascript"></script>
- <script src="/media/js/sjl.js" type="text/javascript"></script>
- <script src="/media/js/print.js" type="text/javascript"></script>
-
- <script type="text/javascript">
- $(function() {
- $("a.rhythm").toggle(function() {
- $("body").addClass("rhythm");
- }, function() {
- $("body").removeClass("rhythm");
- });
- });
- </script>
-
- <script type="text/javascript">
- /* <![CDATA[ */
- (function() {
- var s = document.createElement('script'), t = document.getElementsByTagName('script')[0];
-
- s.type = 'text/javascript';
- s.async = true;
- s.src = 'http://api.flattr.com/js/0.5.0/load.js?mode=auto';
-
- t.parentNode.insertBefore(s, t);
- })();
- /* ]]> */
- </script>
-
- {% block extra_js %}{% endblock %}
- {% endblock %}
-
- <link rel="openid.server" href="http://www.myopenid.com/server" />
- <link rel="openid.delegate" href="http://stevelosh.myopenid.com/" />
-
- <script type="text/javascript">
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', 'UA-15328874-2']);
- _gaq.push(['_trackPageview']);
-
- (function() {
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
- })();
- </script>
-
- </head>
-
- <body>
- <div class="wrap">
- <div class="top group">
- <header>
- <a href="/">steve losh</a>
- </header>
-
- <nav>
- <a href="/blog/">Blog</a>
- <span class="sep">-</span>
- <a href="/projects">Projects</a>
- <span class="sep">-</span>
- <a href="/about/">About</a>
- <span class="sep">-</span>
- <a href="http://feeds2.feedburner.com/stevelosh">Feed</a>
- </nav>
- </div>
-
- <div class="hr"> </div>
-
- <div class="content">
- {% with page.node.ancestors|last as parent_node %}
- {% with parent_node.url as parent_url %}
- {% block content %}{% endblock %}
- {% endwith %}
- {% endwith %}
- </div>
-
- <div class="hrb"> </div>
-
- <footer>
- I'm also on
- <a href="http://bitbucket.org/sjl/">BitBucket</a>,
- <a href="http://github.com/sjl/">GitHub</a>,
- <a href="http://twitter.com/stevelosh/">Twitter</a>,
- <a href="http://forrst.com/people/stevelosh/">Forrst</a>
- and
- <a href="http://flickr.com/photos/sjl7678/">Flickr</a>.
- I've got <a href="#" class="rhythm">rhythm</a>.
- </footer>
- </div>
- </body>
-</html>
-{% endblock %}
--- a/layout/skeleton/_body.html Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-{% extends "skeleton/_base.html" %}
-
-{% block title %}{{site.name}} / {{ page.title }}{% endblock %}
-
-{% block content %}
- {% block content_body %}{% endblock %}
-{% endblock %}
\ No newline at end of file
--- a/layout/skeleton/_index.html Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-{% extends "skeleton/_base.html" %}
-
-{% block content %}
- {% for node in page.node.walk %}
- {% include "skeleton/_innerindex.html" %}
- {% endfor %}
-{% endblock %}
\ No newline at end of file
--- a/layout/skeleton/_innerindex.html Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-{% extends "skeleton/_root.html" %}
-
-{% block all %}
-{%spaceless%}
-{% for list_page in node.pages %}
- {% ifnotequal list_page node.listing_page %}
- {% if not list_page.exclude %}
- <div class="article">
- <div class="title">
- {% with list_page.name_without_extension|remove_date_prefix|unslugify as default_title %}
- <h3>
- <a href="{{list_page.url}}">
- {{ list_page.title|default_if_none:default_title }}
- </a>
- </h3>
- {% if list_page.created %}
- <span>{{ list_page.created }}</span>
- {% endif %}
- {%endwith%}
- </div>
- {% render_article list_page %}
- </div>
- {%endif%}
- {% endifnotequal %}
-{% endfor %}
-{%endspaceless%}
-{% endblock %}
\ No newline at end of file
--- a/layout/skeleton/_innerlisting.html Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-{% extends "skeleton/_root.html" %}
-
-{% block all %}
-{%spaceless%}
-
-{% for list_page in node.pages %}
- {% ifnotequal list_page node.listing_page %}
- {% if not list_page.exclude %}
- {% include "skeleton/_listingitem.html" %}
- {%endif%}
- {% endifnotequal %}
-{% endfor %}
-
-{%endspaceless%}
-{% endblock %}
\ No newline at end of file
--- a/layout/skeleton/_listing.html Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-{% extends "skeleton/_base.html"%}
-
-{% block content %}
- <div class="section-listing">
- <ol class="group">
- {% for node in page.node.walk reversed %}
- {% include "skeleton/_innerlisting.html" %}
- {% endfor %}
- </ol>
- </div>
-{% endblock %}
--- a/layout/skeleton/_listingitem.html Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-<li>
- <a href="{{ list_page.url }}">
- {% with list_page.name_without_extension|remove_date_prefix|unslugify as default_title %}
- {{ list_page.title|default_if_none:default_title|safe|typogrify }}
- {%endwith%}
- </a>
- <span class="snip">{{ list_page.snip|safe|typogrify }}</span>
-</li>
--- a/layout/skeleton/_root.html Tue Nov 30 18:17:40 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-{% block all %}{% endblock %}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/about.html Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,8 @@
+{% extends "base.html" %}
+
+{% block content %}
+ <img src="/media/images/self.jpg" class="self right" />
+ <div id="leaf-title"><h1>{{ title }}</h1></div>
+
+ {{ content }}
+{% endblock %}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/base.html Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,107 @@
+<!DOCTYPE html>
+
+<html>
+ <head>
+ <link href='http://fonts.googleapis.com/css?family=OFL+Sorts+Mill+Goudy+TT:regular,italic' rel='stylesheet' type='text/css'>
+
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+
+ <title>{{ head_title }}</title>
+
+ {% block css %}
+ <link rel="stylesheet" href="/media/css/aal.css" type="text/css" media="screen" charset="utf-8" />
+ <link rel="stylesheet" href="/media/css/sjl.css" type="text/css" media="screen" charset="utf-8" />
+ <link rel="stylesheet" href="/media/css/colorbox.css" type="text/css" media="screen" charset="utf-8" />
+ <link rel="stylesheet" href="/media/css/print.css" type="text/css" media="print" charset="utf-8" />
+ {% block extra_css %}{% endblock %}
+ {% endblock %}
+
+ {% block js %}
+ <script src="/media/js/jquery.js" type="text/javascript"></script>
+ <script src="/media/js/jquery.timeago.js" type="text/javascript"></script>
+ <script src="/media/js/jquery.colorbox.js" type="text/javascript"></script>
+ <script src="/media/js/sjl.js" type="text/javascript"></script>
+ <script src="/media/js/print.js" type="text/javascript"></script>
+
+ <script type="text/javascript">
+ $(function() {
+ $("a.rhythm").toggle(function() {
+ $("body").addClass("rhythm");
+ }, function() {
+ $("body").removeClass("rhythm");
+ });
+ });
+ </script>
+
+ <script type="text/javascript">
+ /* <![CDATA[ */
+ (function() {
+ var s = document.createElement('script'), t = document.getElementsByTagName('script')[0];
+
+ s.type = 'text/javascript';
+ s.async = true;
+ s.src = 'http://api.flattr.com/js/0.5.0/load.js?mode=auto';
+
+ t.parentNode.insertBefore(s, t);
+ })();
+ /* ]]> */
+ </script>
+
+ {% block extra_js %}{% endblock %}
+ {% endblock %}
+
+ <link rel="openid.server" href="http://www.myopenid.com/server" />
+ <link rel="openid.delegate" href="http://stevelosh.myopenid.com/" />
+
+ <script type="text/javascript">
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-15328874-2']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+ </script>
+ </head>
+
+ <body>
+ <div class="wrap">
+ <div class="top group">
+ <header>
+ <a href="/">steve losh</a>
+ </header>
+
+ <nav>
+ <a href="/blog/">Blog</a>
+ <span class="sep">-</span>
+ <a href="/projects">Projects</a>
+ <span class="sep">-</span>
+ <a href="/about/">About</a>
+ <span class="sep">-</span>
+ <a href="http://feeds2.feedburner.com/stevelosh">Feed</a>
+ </nav>
+ </div>
+
+ <div class="hr"> </div>
+
+ <div class="content">
+ {% block content %}{% endblock %}
+ </div>
+
+ <div class="hrb"> </div>
+
+ <footer>
+ I'm also on
+ <a href="http://bitbucket.org/sjl/">BitBucket</a>,
+ <a href="http://github.com/sjl/">GitHub</a>,
+ <a href="http://twitter.com/stevelosh/">Twitter</a>,
+ <a href="http://forrst.com/people/stevelosh/">Forrst</a>
+ and
+ <a href="http://flickr.com/photos/sjl7678/">Flickr</a>.
+ I've got <a href="#" class="rhythm">rhythm</a>.
+ </footer>
+ </div>
+ </body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/entry-list.html Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,14 @@
+{% extends "base.html" %}
+
+{% block content %}
+ <div class="section-listing">
+ <ol class="group">
+ {%- for page in pages %}
+ <li>
+ <a href="{{ page.url }}">{{ page.title }}</a>
+ <span class="snip">{{ page.snip }}</span>
+ </li>
+ {% endfor %}
+ </ol>
+ </div>
+{% endblock %}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/entry.html Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,34 @@
+{% extends "base.html" %}
+
+{% block extra_css %}
+ <link rel="stylesheet"
+ href="{{ root }}media/css/pygments-monokai-light.css"
+ type="text/css" media="screen" charset="utf-8" />
+{% endblock %}
+
+{% block content %}
+ <div id="leaf-title">
+ <h1><a href="{{ url }}">{{ title }}</a></h1>
+ </div>
+
+ <div id="leaf-stats" class="group">
+ {% if flattr %}
+ <div class="flattr">
+ <a class="FlattrButton" style="display:none;" rev="flattr;button:compact;"
+ href="http://stevelosh.com{{ url }}"></a>
+ </div>
+ {% endif %}
+ <p>
+ Posted
+ <span class="timeago"
+ title="{{ date }}T{{ date }}">
+ FIXME
+ </span>
+ on FIXME.
+ </p>
+ </div>
+
+ <div id="leaf-content" class="{% block article_class %}{% endblock %}">
+ {{ content }}
+ </div>
+{% endblock %}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/home.html Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,18 @@
+{% extends "base.html" %}
+
+{% block content %}
+ <div class="splash">
+ <p>Hello, I'm Steve.</p>
+
+ <p>
+ I'm a programmer, photographer, dancer <span class="amp">&</span>
+ bassist from Rochester, New York.
+ </p>
+
+ <p>
+ If you want to get in touch with me,
+ <a href="mailto:steve@stevelosh.com">email</a> is best.
+ </p>
+ </div>
+{% endblock %}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/page.html Tue Nov 30 19:06:42 2010 -0500
@@ -0,0 +1,5 @@
+{% extends "base.html" %}
+
+{% block content %}
+ {{ content }}
+{% endblock %}