Using common filters

This guide gives an overview of typical approaches for using common filters.

Using Sass

Sass is a CSS extension language that supports variables, mixins, partials, and more. To use Sass with Nanoc, create a rule that matches /**/*.sass, calls the :sass filter, and writes out a .css file:

compile '/**/*.sass' do
  filter :sass
  write @item.identifier.without_ext + '.css'

If you prefer using the SCSS syntax for Sass, rather than the default Sass syntax, pass syntax: :scss to the :sass filter, and match on /**/*.scss rather than /**/*.sass:

compile '/**/*.scss' do
  filter :sass, syntax: :scss
  write @item.identifier.without_ext + '.css'

For more information, see the :sass filter reference.

Support Sass and SCSS

Sass has two syntaxes: Sass and SCSS. To support both, you can use curly braces in a compilation rule’s pattern to match both extensions:

compile '/css/*.{sass,scss}' do
  syntax = @item.identifier.ext.to_sym
  filter :sass, syntax: syntax, style: :compact

The :sass filter is passed the :syntax option, which in the example above is derived from the item’s identifier.

Using partials

Partials are Sass files that don’t have an output file, but only serve to be included in another Sass file. By convention, filenames of partials start with an underscore (e.g. css/_layout.scss), which makes it possible for them to be handled specially within Nanoc:

ignore '/css/_*.sass'

compile '/css/*.sass' do
  filter :sass, syntax: :sass, style: :compact

With the rules defined above, you will be able to import Sass partials:

@import "/css/**/_layout.*"

Using Sass source maps

Nanoc’s Sass filter supports source maps, which makes debugging Sass easier. To generate a source map for Sass, use the :sass_sourcemap filter:

[:default, :sourcemap].each do |rep_name|
  compile '/css/**/*.sass', rep: rep_name do
    path = @item.identifier.without_ext + '.css'
    options = { syntax: :sass, style: :compact, css_path: path, sourcemap_path: path + '.map' }

    case rep_name
    when :default
      filter :sass, options
      write path
    when :sourcemap
      filter :sass_sourcemap, options
      write path + '.map'

When using the :sass_sourcemap filter, be sure to invoke it with the same options as the :sass filter.

The :sass filter also supports generating inline source maps:

compile '/css/**/*.scss'
  path = @item.identifier.without_ext + '.css'
  options = { syntax: :sass, style: :compact, css_path: path, sourcemap_path: :inline }

  filter :sass, options

Using nanoc() in Sass

Nanoc’s Sass filter defines a nanoc() Sass function, which allows you to evaluate Ruby code from Sass within the compilation context. It takes a string containing Ruby code.

For example, assume a configuration file (nanoc.yaml) with the following contents:

auto_number_headings: true

The Sass file can now reference the title defined in the configuration:

@if nanoc('@config[:auto_number_headings]') {
  body { counter-reset: h2; }
  h2 { counter-reset: h3; }

  h2:before { counter-increment: h2; content: counter(h2) ". "; }
  h3:before { counter-increment: h3; content: counter(h2) "." counter(h3) ". "; }

The resulting CSS will set up auto-numbering of headings (h2 and h3) if the configuration has auto_number_headings set to true.

Using kramdown

kramdown is a fast and featureful Markdown processor. To use it with Nanoc, create a rule that matches /**/*.md and calls the :kramdown filter:

compile '/**/*.md' do
  filter :kramdown
  layout '/default.*'
  write item.identifier.without_ext + '.html'

The :kramdown filter can take options. For example, pass auto_ids: false to disable automatic header ID generation:

compile '/**/*.md' do
  filter :kramdown, auto_ids: false
  layout '/default.*'
  write item.identifier.without_ext + '.html'

For more information, see the :kramdown filter reference.