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

110 lines
3.2 KiB
Ruby
Raw Normal View History

require 'sass'
2012-04-27 01:15:35 +02:00
module Middleman
module Renderers
# Sass renderer
class Sass < ::Middleman::Extension
2016-01-13 01:03:23 +01:00
opts = { output_style: :nested }
opts[:line_comments] = false if ENV['TEST']
define_setting :sass, opts, 'Sass engine options'
define_setting :sass_assets_paths, [], 'Paths to extra SASS/SCSS files'
define_setting :sass_source_maps, nil, 'Whether to inline sourcemap into Sass'
2012-04-27 01:15:35 +02:00
# Setup extension
def initialize(app, options={}, &block)
super
2015-12-13 22:29:33 +01:00
logger.info '== Preferring use of LibSass' if defined?(::SassC)
2015-12-01 02:29:46 +01:00
2014-07-16 03:01:45 +02:00
app.files.ignore :sass_cache, :source, /(^|\/)\.sass-cache\//
# Tell Tilt to use it as well (for inline sass blocks)
::Tilt.register 'sass', SassPlusCSSFilenameTemplate
::Tilt.prefer(SassPlusCSSFilenameTemplate)
2014-04-05 02:02:22 +02:00
# Tell Tilt to use it as well (for inline scss blocks)
::Tilt.register 'scss', ScssPlusCSSFilenameTemplate
::Tilt.prefer(ScssPlusCSSFilenameTemplate)
require 'middleman-core/renderers/sass_functions'
2012-04-27 01:15:35 +02:00
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
2014-04-29 19:44:24 +02:00
@context = @options[:context] if @options.key?(:context)
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
# @return [String]
2014-04-29 19:44:24 +02:00
def evaluate(context, _)
@context ||= context
2015-09-28 20:24:37 +02:00
sass_module = if defined?(::SassC)
::SassC
else
::Sass
end
@engine = sass_module::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_module::SyntaxError => e
::Sass::SyntaxError.exception_to_css(e)
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
ctx = @context
more_opts = {
2016-01-13 01:03:23 +01:00
load_paths: ::Sass.load_paths | ctx.app.config[:sass_assets_paths],
filename: eval_file,
line: line,
syntax: syntax,
2015-09-30 20:16:57 +02:00
custom: (options[:custom] || {}).merge(
middleman_context: ctx.app,
current_resource: ctx.current_resource
)
}
2013-12-28 19:14:15 +01:00
2016-01-13 01:03:23 +01:00
if ctx.app.config[:sass_source_maps] || (ctx.app.config[:sass_source_maps].nil? && ctx.app.development?)
2015-10-01 22:54:54 +02:00
more_opts[:source_map_file] = '.'
2015-09-28 20:24:37 +02:00
more_opts[:source_map_embed] = true
more_opts[:source_map_contents] = true
end
if ctx.is_a?(::Middleman::TemplateContext) && file
2014-07-16 03:01:45 +02:00
more_opts[:css_filename] = file.sub(/\.s[ac]ss$/, '')
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
# 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