Switching Meadowlark to Less CSS

As Atom, the primary IDE I'm using to develop and maintain this site, uses Less CSS in its stylesheets, I thought I'd adopt it to reduce the style duplication in the site's Meadowlark theme. However, this did not turn out to be as easy as initially anticipated, so I thought I'd write down the steps in case it helps someone else.

First, an introduction: Less is one of a number of CSS preprocessors that has popped up to address some of the features lacking in vanilla CSS, such as defining variables and nesting styles. This allows the reduction of duplication, while still providing backwards compatibility and not giving the browser yet another task to do before the user gets to see the page they asked for.

In case it took longer than expected to switch to Less I created a less branch in Git for both the root website repo and the meadowlark submodule. I'd already installed webassets (pip install webassets), which Pelican can use to handle Less and other, similar tools (JavaScript minifiers, alternative CSS preprocessors, et al.), and Less itself (npm install -g less), but I still needed to ensure that Pelican and Jinja had the appropriate extension installed. This entailed adding another Git submodule to the project, the pelican-plugins repository, to get access to the assets plugin. Then I added:

:::python
PLUGIN_PATHS = ['pelican-plugins']
PLUGINS = ['assets']
JINJA_EXTENSIONS = ['webassets.ext.jinja2.AssetsExtension']

to the pelicanconf.py. This enables use of the {% assets %} statement in templates, which will be used to process the .less files to .css as follows:

:::html
{% assets filters="less", output="css/main.css", "css/main.less" %}
<link rel="stylesheet" href="{{ SITEURL }}/{{ ASSET_URL }}">
{% endassets %}

This tells Jinja to take the main.less file, run it through the less filter, save it as main.css and use it in the template. Initially I started by simply renaming the former main.css, but once the process was working I was able to start using Less's syntax to rearrange it; leaving, crucially, one single, canonical definition of the three main site colours.

So that's one of the things I claimed I would do ticked off, which isn't bad going!

Comments !