middleman/middleman-core/lib/middleman-core/renderers/sass.rb

95 lines
2.5 KiB
Ruby
Raw Normal View History

require 'sass'
2014-04-05 02:02:22 +02:00
require 'compass/import-once'
2012-04-27 01:15:35 +02:00
module Middleman
module Renderers
2012-04-27 01:15:35 +02:00
# Sass renderer
module Sass
2012-04-27 01:15:35 +02:00
# Setup extension
class << self
2012-04-27 01:15:35 +02:00
# Once registered
def registered(app)
# Default sass options
2012-10-14 04:54:55 +02:00
app.config.define_setting :sass, {}, 'Sass engine options'
2012-04-27 01:15:35 +02:00
# Tell Tilt to use it as well (for inline sass blocks)
::Tilt.register 'sass', SassPlusCSSFilenameTemplate
::Tilt.prefer(SassPlusCSSFilenameTemplate)
# Tell Tilt to use it as well (for inline scss blocks)
::Tilt.register 'scss', ScssPlusCSSFilenameTemplate
::Tilt.prefer(ScssPlusCSSFilenameTemplate)
2014-04-05 02:02:22 +02:00
::Compass::ImportOnce.activate!
2012-04-27 01:15:35 +02:00
end
2012-04-27 01:15:35 +02:00
alias :included :registered
end
2012-05-24 23:29:29 +02:00
# A SassTemplate for Tilt which outputs debug messages
class SassPlusCSSFilenameTemplate < ::Tilt::SassTemplate
def initialize(*args, &block)
super
2013-12-28 19:14:15 +01:00
if @options.has_key?(:context)
@context = @options[:context]
end
end
2013-12-28 19:14:15 +01:00
2012-05-24 23:29:29 +02:00
# Define the expected syntax for the template
# @return [Symbol]
def syntax
:sass
end
2012-05-24 23:29:29 +02:00
def prepare; end
2012-04-27 01:15:35 +02:00
# Add exception messaging
# @param [Class] context
# @param [Hash] locals
# @return [String]
def evaluate(context, locals, &block)
@context ||= context
2012-05-24 23:29:29 +02:00
@engine = ::Sass::Engine.new(data, sass_options)
2012-04-27 01:15:35 +02:00
begin
2012-05-24 23:29:29 +02:00
@engine.render
rescue ::Sass::SyntaxError => e
::Sass::SyntaxError.exception_to_css(e, :full_exception => true)
2012-04-27 01:15:35 +02:00
end
end
2012-04-27 01:15:35 +02:00
# Change Sass path, for url functions, to the build folder if we're building
# @return [Hash]
def sass_options
more_opts = { :filename => eval_file, :line => line, :syntax => syntax }
2013-12-28 19:14:15 +01:00
2014-01-02 06:19:05 +01:00
if @context.is_a?(::Middleman::TemplateContext) && file
2012-10-14 04:54:55 +02:00
location_of_sass_file = @context.source_dir
2013-12-28 19:14:15 +01:00
parts = basename.split('.')
parts.pop
more_opts[:css_filename] = File.join(location_of_sass_file, @context.config[:css_dir], parts.join('.'))
end
2013-12-28 19:14:15 +01:00
options.merge(more_opts)
2012-04-27 01:15:35 +02:00
end
end
2012-04-27 01:15:35 +02:00
# SCSS version of the above template
class ScssPlusCSSFilenameTemplate < SassPlusCSSFilenameTemplate
2012-04-27 01:15:35 +02:00
# Define the expected syntax for the template
# @return [Symbol]
def syntax
:scss
end
end
2011-07-10 22:55:40 +02:00
end
end
end