packages feed

hakyll-sass-0.1.0: src/Hakyll/Web/Sass.hs

-- |
-- Module: Hakyll.Web.Sass
-- Copyright: (C) 2015 Braden Walters
-- License: MIT (see LICENSE file)
-- Maintainer: Braden Walters <vc@braden-walters.info>
-- Stability: experimental
-- Portability: ghc

module Hakyll.Web.Sass (sassCompiler) where

import Data.Default.Class
import Data.Functor
import Hakyll.Core.Compiler
import Hakyll.Core.Item
import System.IO.Unsafe
import Text.Sass.Compilation
import Text.Sass.Options

-- | Compiles a SASS file into CSS.
sassCompiler :: Compiler (Item String)
sassCompiler = do
  bodyStr <- itemBody <$> getResourceBody
  extension <- getUnderlyingExtension
  let mayOptions = selectFileType def extension
  case mayOptions of
    Just options -> do
      resultOrErr <- unsafeCompiler (compileString bodyStr options)
      case resultOrErr of
        Left sassError -> fail (unsafePerformIO $ errorMessage sassError)
        Right result -> makeItem result
    Nothing -> fail "File type must be .scss or .sass."

-- | Use the file extension to determine whether to use indented syntax.
selectFileType :: SassOptions -> String -> Maybe SassOptions
selectFileType options ".scss" = Just $ options { sassIsIndentedSyntax = False }
selectFileType options ".sass" = Just $ options { sassIsIndentedSyntax = True }
selectFileType _ _ = Nothing