From 957b68e71371352b4e26b1ba0a92fd611321503c Mon Sep 17 00:00:00 2001 From: Aleksandar Kostadinov Date: Feb 26 2017 17:04:50 +0000 Subject: css autoprefixer --- diff --git a/_config/site.yml b/_config/site.yml index 3078a28..c7e6814 100644 --- a/_config/site.yml +++ b/_config/site.yml @@ -13,3 +13,6 @@ slim: # asciidoctor: # :backend: html5 # :safe: 1 + +autoprefixer: + :browsers: ['> 1%', 'ie 10'] diff --git a/_ext/css_autoprefixer.rb b/_ext/css_autoprefixer.rb new file mode 100644 index 0000000..6ac12bd --- /dev/null +++ b/_ext/css_autoprefixer.rb @@ -0,0 +1,40 @@ +require 'autoprefixer-rails' + +class CSSAutoPrefixer + def initialize + if ExecJS.runtime.name.start_with? "therubyracer" + $LOG.warn "WARNING: ExecJS is using 'therubyracer' backend. " \ + "My testing shows it usually deadlocking due to threaded " \ + "execution here (tested with 0.12.3). " \ + "AutoPrefixer and Awestruct coffee handler are both using " \ + "ExecJS and there seems to be some concurrency issue with " \ + "'therubyracer'. See https://github.com/cowboyd/therubyracer/issues/432" + end + end + + def transform(site, page, input) + if page.output_extension == '.css' + fix_encoding(input) + input = AutoprefixerRails.process( + input, + from: page.source_path, + **site.autoprefixer + ).css + end + return input + end + + # some files throw "An error occurred: "\xE2" from ASCII-8BIT to UTF-8" when + # processed with ExecJS/nodejs backend like this one: + # https://github.com/HubSpot/tether/blob/ad295ad/docs/css/intro.css + def fix_encoding(str) + if str.encoding == ::Encoding::ASCII_8BIT + f_enc = str.match(/\A@charset "([-A-Za-z0-9_]+)";/) + if f_enc && f_enc[1] + str.force_encoding(::Encoding.find(f_enc[1])) + else + str.force_encoding(::Encoding.default_external) + end + end + end +end diff --git a/_ext/js_require_transformer.rb b/_ext/js_require_transformer.rb index 3310367..b1254e2 100644 --- a/_ext/js_require_transformer.rb +++ b/_ext/js_require_transformer.rb @@ -2,8 +2,7 @@ class JSRequireTransformer MONKEY_MUTEX = Mutex.new def transform(site, page, input) - ext = File.extname(page.output_path) - if ext == '.js' + if page.output_extension == '.js' input = input.gsub(%r{^//= require ([-/_.a-zA-Z0-9]*)$}) { |m| c = get_required_file "#{$1}.js", site c ? transform(site, page, c) : m # recurse if transformation happened diff --git a/_ext/pipeline.rb b/_ext/pipeline.rb index a31ab55..c1b7265 100644 --- a/_ext/pipeline.rb +++ b/_ext/pipeline.rb @@ -1,6 +1,7 @@ require 'bootstrap' require 'bootstrap_gem_js' +require 'css_autoprefixer' require 'js_require_transformer' # done instead in _config/site.yml @@ -11,6 +12,7 @@ Awestruct::Extensions::Pipeline.new do helper Awestruct::Extensions::Relative transformer JSRequireTransformer.new + transformer CSSAutoPrefixer.new # extension BootstrapGemJS.new # extension Awestruct::Extensions::Posts.new '/news'