2013-12-28 01:26:31 +01:00
|
|
|
require 'sass'
|
2014-05-01 19:01:45 +02:00
|
|
|
|
2012-04-27 01:15:35 +02:00
|
|
|
module Middleman
|
|
|
|
module Renderers
|
|
|
|
# Sass renderer
|
2014-07-05 22:41:59 +02:00
|
|
|
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
|
2014-07-05 22:41:59 +02:00
|
|
|
def initialize(app, options={}, &block)
|
|
|
|
super
|
2014-04-07 21:43:16 +02:00
|
|
|
|
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\//
|
|
|
|
|
2014-07-05 22:41:59 +02:00
|
|
|
# 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
|
|
|
|
2014-07-05 22:41:59 +02:00
|
|
|
# Tell Tilt to use it as well (for inline scss blocks)
|
|
|
|
::Tilt.register 'scss', ScssPlusCSSFilenameTemplate
|
|
|
|
::Tilt.prefer(ScssPlusCSSFilenameTemplate)
|
2014-04-07 21:43:16 +02:00
|
|
|
|
2014-07-05 22:41:59 +02:00
|
|
|
require 'middleman-core/renderers/sass_functions'
|
2012-04-27 01:15:35 +02:00
|
|
|
end
|
2012-08-14 00:39:06 +02:00
|
|
|
|
2012-05-24 23:29:29 +02:00
|
|
|
# A SassTemplate for Tilt which outputs debug messages
|
|
|
|
class SassPlusCSSFilenameTemplate < ::Tilt::SassTemplate
|
2012-08-16 22:48:34 +02:00
|
|
|
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)
|
2012-08-16 22:48:34 +02:00
|
|
|
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-08-14 00:39:06 +02:00
|
|
|
|
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, _)
|
2012-08-16 22:48:34 +02:00
|
|
|
@context ||= context
|
2015-09-28 20:24:37 +02:00
|
|
|
|
2015-11-28 00:41:42 +01:00
|
|
|
sass_module = if defined?(::SassC)
|
|
|
|
::SassC
|
|
|
|
else
|
|
|
|
::Sass
|
|
|
|
end
|
|
|
|
|
|
|
|
@engine = sass_module::Engine.new(data, sass_options)
|
2012-08-14 00:39:06 +02:00
|
|
|
|
2012-04-27 01:15:35 +02:00
|
|
|
begin
|
2012-05-24 23:29:29 +02:00
|
|
|
@engine.render
|
2015-11-28 00:41:42 +01:00
|
|
|
rescue sass_module::SyntaxError => e
|
2014-08-20 18:48:03 +02:00
|
|
|
::Sass::SyntaxError.exception_to_css(e)
|
2012-04-27 01:15:35 +02:00
|
|
|
end
|
|
|
|
end
|
2012-08-14 00:39:06 +02:00
|
|
|
|
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
|
2015-06-17 01:47:42 +02:00
|
|
|
ctx = @context
|
2014-04-07 21:43:16 +02:00
|
|
|
|
|
|
|
more_opts = {
|
2016-01-13 01:03:23 +01:00
|
|
|
load_paths: ::Sass.load_paths | ctx.app.config[:sass_assets_paths],
|
2014-04-07 21:43:16 +02:00
|
|
|
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
|
|
|
|
)
|
2014-04-07 21:43:16 +02:00
|
|
|
}
|
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
|
|
|
|
|
2014-04-07 21:43:16 +02:00
|
|
|
if ctx.is_a?(::Middleman::TemplateContext) && file
|
2014-07-16 03:01:45 +02:00
|
|
|
more_opts[:css_filename] = file.sub(/\.s[ac]ss$/, '')
|
2012-08-16 22:48:34 +02:00
|
|
|
end
|
2013-12-28 19:14:15 +01:00
|
|
|
|
2012-08-16 22:48:34 +02:00
|
|
|
options.merge(more_opts)
|
2012-04-27 01:15:35 +02:00
|
|
|
end
|
|
|
|
end
|
2012-08-14 00:39:06 +02:00
|
|
|
|
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
|
2012-08-14 00:39:06 +02:00
|
|
|
end
|