2014-05-02 17:46:03 -04:00
require_dependency 'sass/discourse_sass_importer'
2014-10-15 01:23:29 -07:00
require 'pathname'
2014-05-02 17:46:03 -04:00
class DiscourseSassCompiler
def self . compile ( scss , target , opts = { } )
self . new ( scss , target ) . compile ( opts )
end
# Takes a Sass::SyntaxError and generates css that will show the
# error at the bottom of the page.
def self . error_as_css ( sass_error , label )
error = sass_error . sass_backtrace_str ( label )
error . gsub! ( " \n " , '\A ' )
error . gsub! ( " ' " , '\27 ' )
" footer { white-space: pre; }
footer : after { content : '#{error}' } "
end
def initialize ( scss , target )
@scss = scss
@target = target
2014-06-17 12:45:33 -04:00
unless Sass :: Script :: Functions < Sprockets :: SassFunctions
Sass :: Script :: Functions . send :include , Sprockets :: SassFunctions
end
2014-05-02 17:46:03 -04:00
end
# Compiles the given scss and output the css as a string.
#
# Options:
# safe: (boolean) if true, theme and plugin stylesheets will not be included. Default is false.
def compile ( opts = { } )
env = Rails . application . assets
# In production Rails.application.assets is a Sprockets::Index
# instead of Sprockets::Environment, there is no cleaner way
# to get the environment from the index.
if env . is_a? ( Sprockets :: Index )
env = env . instance_variable_get ( '@environment' )
end
2014-10-15 01:23:29 -07:00
pathname = Pathname . new ( " app/assets/stylesheets/ #{ @target } .scss " )
context = env . context_class . new ( env , " #{ @target } .scss " , pathname )
2014-05-02 17:46:03 -04:00
2014-05-20 14:23:41 -04:00
debug_opts = Rails . env . production? ? { } : {
line_numbers : true ,
# debug_info: true, # great with Firebug + FireSass, but not helpful elsewhere
style : :expanded
}
2014-08-08 09:31:31 +03:00
css = :: Sass :: Engine . new ( @scss , {
2014-05-02 17:46:03 -04:00
syntax : :scss ,
cache : false ,
read_cache : false ,
2014-05-20 14:23:41 -04:00
style : :compressed ,
2014-05-02 17:46:03 -04:00
filesystem_importer : opts [ :safe ] ? DiscourseSafeSassImporter : DiscourseSassImporter ,
sprockets : {
context : context ,
environment : context . environment
}
2014-05-20 14:23:41 -04:00
} . merge ( debug_opts ) ) . render
2014-08-08 09:31:31 +03:00
# Check if CSS needs to be RTLed after compilation
2015-04-14 19:02:52 -07:00
# and run R2 gem on compiled CSS if true and R2 gem is available
2014-08-08 16:06:29 +03:00
css_output = css
2015-04-14 20:14:04 -07:00
if ! SiteSetting . allow_user_locale && SiteSetting . default_locale . in? ( %w( he ar fa_IR ) )
begin
require 'r2'
css_output = R2 . r2 ( css ) if defined? ( R2 )
rescue ; end
2014-08-08 09:31:31 +03:00
end
2014-08-08 16:06:29 +03:00
css_output
2014-05-02 17:46:03 -04:00
end
end