mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 22:43:33 +08:00
FEATURE: Native theme support
This feature introduces the concept of themes. Themes are an evolution of site customizations. Themes introduce two very big conceptual changes: - A theme may include other "child themes", children can include grand children and so on. - A theme may specify a color scheme The change does away with the idea of "enabled" color schemes. It also adds a bunch of big niceties like - You can source a theme from a git repo - History for themes is much improved - You can only have a single enabled theme. Themes can be selected by users, if you opt for it. On a technical level this change comes with a whole bunch of goodies - All CSS is now compiled using a custom pipeline that uses libsass see /lib/stylesheet - There is a single pipeline for css compilation (in the past we used one for customizations and another one for the rest of the app - The stylesheet pipeline is now divorced of sprockets, there is no reliance on sprockets for CSS bundling - CSS is generated with source maps everywhere (including themes) this makes debugging much easier - Our "live reloader" is smarter and avoid a flash of unstyled content we run a file watcher in "puma" in dev so you no longer need to run rake autospec to watch for CSS changes
This commit is contained in:
60
lib/stylesheet/compiler.rb
Normal file
60
lib/stylesheet/compiler.rb
Normal file
@ -0,0 +1,60 @@
|
||||
require_dependency 'stylesheet/common'
|
||||
require_dependency 'stylesheet/importer'
|
||||
require_dependency 'stylesheet/functions'
|
||||
|
||||
module Stylesheet
|
||||
|
||||
class Compiler
|
||||
|
||||
def self.error_as_css(error, label)
|
||||
error = error.message
|
||||
error.gsub!("\n", '\A ')
|
||||
error.gsub!("'", '\27 ')
|
||||
|
||||
"footer { white-space: pre; }
|
||||
footer:after { content: '#{error}' }"
|
||||
end
|
||||
|
||||
def self.compile_asset(asset, options={})
|
||||
|
||||
if Importer.special_imports[asset.to_s]
|
||||
filename = "theme.scss"
|
||||
file = "@import \"#{asset}\";"
|
||||
else
|
||||
filename = "#{asset}.scss"
|
||||
path = "#{ASSET_ROOT}/#{filename}"
|
||||
file = File.read path
|
||||
end
|
||||
|
||||
compile(file,filename,options)
|
||||
|
||||
end
|
||||
|
||||
def self.compile(stylesheet, filename, options={})
|
||||
|
||||
|
||||
source_map_file = options[:source_map_file] || "#{filename.sub(".scss","")}.css.map";
|
||||
engine = SassC::Engine.new(stylesheet,
|
||||
importer: Importer,
|
||||
filename: filename,
|
||||
style: :compressed,
|
||||
source_map_file: source_map_file,
|
||||
source_map_contents: true,
|
||||
theme_id: options[:theme_id],
|
||||
load_paths: [ASSET_ROOT])
|
||||
|
||||
|
||||
result = engine.render
|
||||
|
||||
if options[:rtl]
|
||||
require 'r2'
|
||||
[R2.r2(result), nil]
|
||||
else
|
||||
source_map = engine.source_map
|
||||
source_map.force_encoding("UTF-8")
|
||||
|
||||
[result, source_map]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Reference in New Issue
Block a user