rails-pixrem 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.fs.yml +1 -0
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/Gemfile +8 -0
- data/LICENSE +21 -0
- data/README.md +69 -0
- data/Rakefile +6 -0
- data/lib/rails-pixrem.rb +17 -0
- data/lib/rails-pixrem/processor.rb +32 -0
- data/lib/rails-pixrem/railtie.rb +17 -0
- data/lib/rails-pixrem/sprockets.rb +45 -0
- data/lib/rails-pixrem/version.rb +3 -0
- data/rails-pixrem.gemspec +27 -0
- data/spec/dummy/Rakefile +2 -0
- data/spec/dummy/app/assets/stylesheets/rails.css.scss +3 -0
- data/spec/dummy/app/assets/stylesheets/test.css +3 -0
- data/spec/dummy/app/controllers/application_controller.rb +2 -0
- data/spec/dummy/app/controllers/css_controller.rb +5 -0
- data/spec/dummy/config.ru +2 -0
- data/spec/dummy/config/application.rb +14 -0
- data/spec/dummy/config/boot.rb +2 -0
- data/spec/dummy/config/environment.rb +2 -0
- data/spec/dummy/config/environments/test.rb +11 -0
- data/spec/dummy/config/initializers/compress.rb +1 -0
- data/spec/dummy/config/initializers/secret_token.rb +1 -0
- data/spec/dummy/config/pixrem.yml +1 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/rails-pixrem/processor_spec.rb +18 -0
- data/spec/rails-pixrem/rails_spec.rb +16 -0
- data/spec/rails-pixrem/sprockets_spec.rb +31 -0
- data/spec/spec_helper.rb +14 -0
- data/vendor/pixrem.js +4595 -0
- metadata +164 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f9f0e0b6f6b318f15d49412d0e7d7e1c04cc03e6
|
4
|
+
data.tar.gz: 5870e83c3a2e6b56e6ee453b3d7d315933a63a50
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6a75437b5fc76bb09590a0580fd8726c3b02c6e8b0c829b84f70cdb0cf37997c32d068f03dcf73898446f37481187e68898377bfe4a0e7f83fcce83e387d4b63
|
7
|
+
data.tar.gz: 36b58ec227f11e0cd4aadf800d108b0599fcca9817ef6b34283401edd6612be6ec109e75dd1bd6888c18bc25d2113ebb997de06da2b4ff0994fb37a08e17a15b
|
data/.fs.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ci: "https://semaphoreapp.com/vast/rails-pixrem/branches/%{branch}"
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2014 Vasily Polovnyov
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
Rails-pixrem
|
2
|
+
===================================================================
|
3
|
+
|
4
|
+
[![Build Status](https://semaphoreapp.com/api/v1/projects/db183d30-2136-4ba5-99e4-d0d8dac5f09d/230344/badge.png)](https://semaphoreapp.com/vast/rails-pixrem)
|
5
|
+
|
6
|
+
CSS post-processor which generates pixel fallbacks for rem units
|
7
|
+
in your Rails (Sinatra) application.
|
8
|
+
|
9
|
+
|
10
|
+
Usage
|
11
|
+
===================================================================
|
12
|
+
|
13
|
+
### Ruby on Rails
|
14
|
+
|
15
|
+
Add `rails-pixrem` to your `Gemfile`:
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
gem 'rails-pixrem', github: 'vast/rails-pixrem'
|
19
|
+
```
|
20
|
+
|
21
|
+
Write your CSS (SASS, Stylus, LESS) using `rem`s:
|
22
|
+
|
23
|
+
```scss
|
24
|
+
#header {
|
25
|
+
font-size: 2rem;
|
26
|
+
}
|
27
|
+
```
|
28
|
+
|
29
|
+
Rails-pixrem will automatically add fallback rules with pixel values:
|
30
|
+
|
31
|
+
```scss
|
32
|
+
#header {
|
33
|
+
font-size: 32px; // IE8, Opera Mini
|
34
|
+
font-size: 2rem; // modern browsers
|
35
|
+
}
|
36
|
+
```
|
37
|
+
|
38
|
+
|
39
|
+
### Sprockets
|
40
|
+
|
41
|
+
If you use a non-Rails framework with Sprockets, connect Sprockets environment
|
42
|
+
with `RailsPixrem`:
|
43
|
+
|
44
|
+
|
45
|
+
```ruby
|
46
|
+
assets = Sprockets::Environment.new do |env|
|
47
|
+
# ...
|
48
|
+
end
|
49
|
+
|
50
|
+
require 'rails-pixrem'
|
51
|
+
RailsPixrem.install(assets)
|
52
|
+
```
|
53
|
+
|
54
|
+
## Configuration
|
55
|
+
|
56
|
+
You can specify root element font size (default: '16px') in px, em or percents:
|
57
|
+
|
58
|
+
### Ruby On Rails
|
59
|
+
|
60
|
+
```yaml
|
61
|
+
# config/pixrem.yml
|
62
|
+
root_value: 24px
|
63
|
+
```
|
64
|
+
|
65
|
+
### Sprockets
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
RailsPixrem.install(assets, root_value: '85%')
|
69
|
+
```
|
data/Rakefile
ADDED
data/lib/rails-pixrem.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative 'rails-pixrem/version'
|
2
|
+
require_relative 'rails-pixrem/processor'
|
3
|
+
require_relative 'rails-pixrem/railtie' if defined?(Rails)
|
4
|
+
|
5
|
+
module RailsPixrem
|
6
|
+
autoload :Sprockets, 'rails-pixrem/sprockets'
|
7
|
+
|
8
|
+
def self.install(assets, options = {})
|
9
|
+
Sprockets.new(processor(options)).install(assets)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.processor(options = {})
|
13
|
+
@cache ||= {}
|
14
|
+
cache_key = options.to_s
|
15
|
+
@cache[cache_key] ||= Processor.new(options)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'execjs'
|
3
|
+
|
4
|
+
module RailsPixrem
|
5
|
+
class Processor
|
6
|
+
def initialize(options = {})
|
7
|
+
@options = { root_value: '16px' }.merge(options)
|
8
|
+
end
|
9
|
+
|
10
|
+
def process(css)
|
11
|
+
processor.call('process', css, @options[:root_value])
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def processor
|
17
|
+
@processor ||= ExecJS.compile(processor_js)
|
18
|
+
end
|
19
|
+
|
20
|
+
def processor_js
|
21
|
+
[pixrem_js, process_proxy].join(';')
|
22
|
+
end
|
23
|
+
|
24
|
+
def pixrem_js
|
25
|
+
@@pixrem_js ||= Pathname(__FILE__).join('../../../vendor/pixrem.js').read
|
26
|
+
end
|
27
|
+
|
28
|
+
def process_proxy
|
29
|
+
"var process = require('pixrem');"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
begin
|
2
|
+
require 'sprockets/railtie'
|
3
|
+
|
4
|
+
module RailsPixrem
|
5
|
+
class Railtie < ::Rails::Railtie
|
6
|
+
initializer :setup_pixrem, group: :all do |app|
|
7
|
+
RailsPixrem.install(app.assets, configuration(app))
|
8
|
+
end
|
9
|
+
|
10
|
+
def configuration(app)
|
11
|
+
file = app.root.join('config/pixrem.yml')
|
12
|
+
file.exist? ? YAML.load_file(file).symbolize_keys : {}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
rescue LoadError
|
17
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module RailsPixrem
|
2
|
+
class Sprockets
|
3
|
+
def initialize(processor)
|
4
|
+
@processor = processor
|
5
|
+
end
|
6
|
+
|
7
|
+
def process(context, css)
|
8
|
+
@processor.process(css)
|
9
|
+
end
|
10
|
+
|
11
|
+
def process_only_css(context, content)
|
12
|
+
process(context, content)
|
13
|
+
rescue ExecJS::ProgramError => e
|
14
|
+
if e.message =~ /Can't parse CSS/
|
15
|
+
content
|
16
|
+
else
|
17
|
+
raise e
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def install(assets)
|
22
|
+
if ignore_syntax_error?
|
23
|
+
register(assets) { |context, css| process_only_css(context, css) }
|
24
|
+
else
|
25
|
+
register(assets) { |context, css| process(context, css) }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def register(assets, &block)
|
32
|
+
assets.register_postprocessor('text/css', :pixrem, &block)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Return true if broken sass-rails is loaded
|
36
|
+
def ignore_syntax_error?
|
37
|
+
return false unless defined? Sass::Rails
|
38
|
+
|
39
|
+
fixed = Gem::Version.new('4.0.1')
|
40
|
+
current = Gem::Version.new(Sass::Rails::VERSION)
|
41
|
+
|
42
|
+
current < fixed
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'rails-pixrem/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "rails-pixrem"
|
8
|
+
spec.version = RailsPixrem::VERSION
|
9
|
+
spec.authors = ["Vasily Polovnyov"]
|
10
|
+
spec.email = ["vasily@polovnyov.ru"]
|
11
|
+
spec.summary = %q{Generate pixel fallbacks for rem units in Rails application}
|
12
|
+
spec.description = spec.summary
|
13
|
+
spec.homepage = "https://github.com/vast/rails-pixrem"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "execjs"
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.5"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
spec.add_development_dependency "rspec"
|
26
|
+
spec.add_development_dependency "rspec-its"
|
27
|
+
end
|
data/spec/dummy/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.expand_path('../boot', __FILE__)
|
2
|
+
|
3
|
+
require "action_controller/railtie"
|
4
|
+
require "sprockets/railtie"
|
5
|
+
|
6
|
+
if defined?(Bundler)
|
7
|
+
Bundler.require(*Rails.groups(assets: %w(development test)))
|
8
|
+
end
|
9
|
+
|
10
|
+
module Dummy
|
11
|
+
class Application < Rails::Application
|
12
|
+
config.sass.line_comments = false
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Dummy::Application.configure do
|
2
|
+
config.cache_classes = true
|
3
|
+
config.serve_static_assets = true
|
4
|
+
config.static_cache_control = "public, max-age=3600"
|
5
|
+
config.eager_load = false
|
6
|
+
config.consider_all_requests_local = true
|
7
|
+
config.action_controller.perform_caching = false
|
8
|
+
config.action_dispatch.show_exceptions = false
|
9
|
+
config.action_controller.allow_forgery_protection = false
|
10
|
+
config.active_support.deprecation = :stderr
|
11
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Rails.application.config.assets.css_compressor = nil
|
@@ -0,0 +1 @@
|
|
1
|
+
Dummy::Application.config.secret_key_base = 'test'
|
@@ -0,0 +1 @@
|
|
1
|
+
root_value: 20px
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RailsPixrem::Processor do
|
4
|
+
describe '#process' do
|
5
|
+
let(:sample_css) { '#foo { padding: 2rem }' }
|
6
|
+
let(:processor) { described_class.new }
|
7
|
+
subject { processor.process(sample_css) }
|
8
|
+
|
9
|
+
it { should include('padding: 32px;') }
|
10
|
+
it { should include('padding: 2rem') }
|
11
|
+
|
12
|
+
context 'when root value is passed' do
|
13
|
+
let(:processor) { described_class.new(root_value: '20px') }
|
14
|
+
|
15
|
+
it { should include('padding: 40px;') }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe CssController, type: :controller do
|
4
|
+
subject { response }
|
5
|
+
|
6
|
+
before do
|
7
|
+
cache = Rails.root.join('tmp/cache')
|
8
|
+
cache.rmtree if cache.exist?
|
9
|
+
|
10
|
+
get :test
|
11
|
+
end
|
12
|
+
|
13
|
+
it { should be_success }
|
14
|
+
its(:body) { should include('margin: 3rem;') }
|
15
|
+
its(:body) { should include('margin: 60px;') }
|
16
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Sprockets integration' do
|
4
|
+
let(:assets) { Sprockets::Environment.new }
|
5
|
+
|
6
|
+
before do
|
7
|
+
assets.append_path(Pathname(__FILE__).dirname.join('../dummy/app/assets/stylesheets'))
|
8
|
+
end
|
9
|
+
|
10
|
+
context 'with default configuration' do
|
11
|
+
before { RailsPixrem.install(assets) }
|
12
|
+
|
13
|
+
it 'works with Sprockets' do
|
14
|
+
assets['test.css'].to_s.should == "i {\n" +
|
15
|
+
" padding: 16px;\n" +
|
16
|
+
" padding: 1rem\n" +
|
17
|
+
"}\n"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'when additional configuration passed' do
|
22
|
+
before { RailsPixrem.install(assets, root_value: '40px') }
|
23
|
+
|
24
|
+
it 'honors root value' do
|
25
|
+
assets['test.css'].to_s.should == "i {\n" +
|
26
|
+
" padding: 40px;\n" +
|
27
|
+
" padding: 1rem\n" +
|
28
|
+
"}\n"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|