discourse/lib/stylesheet/compiler.rb

91 lines
2.7 KiB
Ruby

# frozen_string_literal: true
require "stylesheet/importer"
module Stylesheet
class Compiler
ASSET_ROOT = "#{Rails.root}/app/assets/stylesheets" unless defined?(ASSET_ROOT)
def self.compile_asset(asset, options = {})
importer = Importer.new(options)
file = importer.prepended_scss
filename = "_#{asset}_entrypoint.scss"
if Importer::THEME_TARGETS.include?(asset.to_s)
filename = "theme_#{options[:theme_id]}.scss"
file += options[:theme_variables].to_s
file += importer.theme_import(asset)
elsif plugin_asset_info = Importer.plugin_assets[asset.to_s]
options[:load_paths] = [] if options[:load_paths].nil?
plugin_assets = plugin_asset_info[:stylesheets]
plugin_path = plugin_asset_info[:plugin_path]
options[:load_paths] << plugin_path
plugin_assets.each do |src|
options[:load_paths] << File.expand_path(File.dirname(src))
if src.end_with?(".scss")
file += "@import \"#{src}\";\n"
else
file += File.read(src)
end
end
else # Core asset
file += "@import \"#{asset}\";\n"
case asset.to_s
when "embed", "publish"
file += importer.font
when "wizard"
file += importer.wizard_fonts
when Stylesheet::Manager::COLOR_SCHEME_STYLESHEET
file += importer.import_color_definitions
file += importer.import_wcag_overrides
file += importer.font
end
end
compile(file, filename, options)
end
def self.compile(stylesheet, filename, options = {})
source_map_file = options[:source_map_file] || "#{filename.sub(".scss", "")}.css.map"
load_paths = [ASSET_ROOT]
load_paths += options[:load_paths] if options[:load_paths]
engine =
SassC::Engine.new(
stylesheet,
filename: filename,
style: :compressed,
source_map_file: source_map_file,
source_map_contents: true,
load_paths: load_paths,
silence_deprecations: %w[color-functions import global-builtin],
fatal_deprecations: options[:strict_deprecations] ? %w[mixed-decls] : [],
quiet: ENV["QUIET_SASS_DEPRECATIONS"] == "1",
)
result = engine.render
source_map = engine.source_map
source_map.force_encoding("UTF-8")
result, source_map =
DiscourseJsProcessor::Transpiler.new.post_css(
css: result,
map: source_map,
source_map_file: source_map_file,
)
if options[:rtl]
require "rtlcss"
[Rtlcss.flip_css(result), nil]
else
[result, source_map]
end
end
end
end