css3-now 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc ADDED
@@ -0,0 +1,44 @@
1
+ = CSS3Now
2
+
3
+ I'm sick and tired of writing CSS like this ...
4
+
5
+ -moz-border-radius: 5px;
6
+ -webkit-border-radius: 5px;
7
+ -khtml-border-radius: 5px;
8
+ border-radius: 5px;
9
+
10
+ opacity: 0.7;
11
+ filter:alpha(opacity=70);
12
+
13
+ It's gross.
14
+
15
+ So ... I'm making a little gem for post-procssing CSS so I can write my CSS like:
16
+
17
+ border-radius: 5px;
18
+
19
+ And I'll end up with:
20
+
21
+ -moz-border-radius: 5px;
22
+ -webkit-border-radius: 5px;
23
+ -khtml-border-radius: 5px;
24
+ border-radius: 5px;
25
+
26
+ I'll keep track of which browsers support what.
27
+
28
+ This is basically just a glorified global substitution!
29
+
30
+ == Installation
31
+
32
+ sudo gem install remi-css3-now --source http://gems.github.com
33
+
34
+ == Usage
35
+
36
+ require 'css3-now'
37
+
38
+ CSS3Now.new("original CSS").to_css
39
+
40
+ # Reading from a file
41
+ CSS3Now.new( File.read('my/stylesheet.css') ).to_css
42
+
43
+ # Sinatra example
44
+ CSS3Now.new( sass(:stylesheet) ).to_css
data/Rakefile ADDED
@@ -0,0 +1,68 @@
1
+ require 'rake'
2
+ require 'rubygems'
3
+ require 'rake/rdoctask'
4
+ require 'spec/rake/spectask'
5
+
6
+ puts "\nGem: css3-now\n\n"
7
+
8
+ begin
9
+ require 'jeweler'
10
+ Jeweler::Tasks.new do |s|
11
+ s.name = 'css3-now'
12
+ s.summary = ''
13
+ s.email = 'remi@remitaylor.com'
14
+ s.homepage = 'http://github.com/remi/css3-now'
15
+ s.description = ''
16
+ s.authors = %w( remi )
17
+ s.files = FileList['[A-Z]*', '{lib,spec,bin,examples}/**/*']
18
+ # s.add_dependency 'person-gemname'
19
+ # s.executables << 'script'
20
+ # s.rubyforge_project = 'gemname'
21
+ # s.extra_rdoc_files = %w( README.rdoc )
22
+ end
23
+ rescue LoadError
24
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
25
+ end
26
+
27
+ Spec::Rake::SpecTask.new do |t|
28
+ t.spec_files = FileList['spec/**/*_spec.rb']
29
+ end
30
+
31
+ desc "Run all examples with RCov"
32
+ Spec::Rake::SpecTask.new('rcov') do |t|
33
+ t.spec_files = FileList['spec/**/*_spec.rb']
34
+ t.rcov = true
35
+ end
36
+
37
+ # require 'hanna'
38
+ # require 'darkfish-rdoc'
39
+
40
+ Rake::RDocTask.new do |rdoc|
41
+ rdoc.rdoc_dir = 'rdoc'
42
+ rdoc.title = 'css3-now'
43
+ rdoc.options << '--line-numbers' << '--inline-source'
44
+ # rdoc.options += ["--template=#{`allison --path`}"] # sudo gem install allison
45
+ # rdoc.options += %w( -f darkfish ) # sudo gem install darkfish-rdoc
46
+ # rdoc.options += %w( -T hanna ) # sudo gem install mislav-hanna
47
+ rdoc.options += %w( -m README.rdoc ) # the initial page displayed
48
+ rdoc.rdoc_files.include('README.rdoc')
49
+ rdoc.rdoc_files.include('lib/**/*.rb')
50
+ end
51
+
52
+ desc 'Confirm that gemspec is $SAFE'
53
+ task :safe do
54
+ require 'yaml'
55
+ require 'rubygems/specification'
56
+ data = File.read('css3-now.gemspec')
57
+ spec = nil
58
+ if data !~ %r{!ruby/object:Gem::Specification}
59
+ Thread.new { spec = eval("$SAFE = 3\n#{data}") }.join
60
+ else
61
+ spec = YAML.load(data)
62
+ end
63
+ spec.validate
64
+ puts spec
65
+ puts "OK"
66
+ end
67
+
68
+ task :default => :spec
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.2
data/lib/css3-now.rb ADDED
@@ -0,0 +1,42 @@
1
+ # ...
2
+ class CSS3Now
3
+
4
+ class << self
5
+ attr_accessor :substitutions
6
+ end
7
+
8
+ @substitutions = [
9
+ lambda {|css| replace_browser_specific css, 'border-radius' },
10
+ lambda {|css| replace_browser_specific css, 'box-shadow' },
11
+ lambda {|css| css.gsub(/opacity: ([\w\.]+);/){ "filter:alpha(opacity=#{ ($1.to_f * 100).to_i }); opacity: #{ $1 };" } }
12
+ ]
13
+
14
+ def self.substitution &block
15
+ @substitutions << block
16
+ end
17
+
18
+ def initialize original_css
19
+ @original_css = original_css
20
+ end
21
+
22
+ def to_css
23
+ CSS3Now.substitutions.inject(@original_css) do |css, substitution|
24
+ css = substitution.call css
25
+ end
26
+ end
27
+
28
+ def self.replace_browser_specific css, attribute, browsers = nil
29
+ css.gsub /#{ attribute }:([^;]+);/, browser_specific(attribute, '\1', browsers)
30
+ end
31
+
32
+ private
33
+
34
+ def self.browser_specific attribute, value, browsers = nil
35
+ browsers = [ :moz, :webkit, :khtml ] if browsers.nil?
36
+ browsers.inject("") do |all, browser|
37
+ all << "-#{ browser }-#{ attribute }:#{ value }; "
38
+ all
39
+ end + "#{ attribute }:#{ value };"
40
+ end
41
+
42
+ end
@@ -0,0 +1,73 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe CSS3Now do
4
+
5
+ it 'should replace border-radius' do
6
+ css = CSS3Now.new("#header {\n border-radius: 5em;\n }").to_css
7
+ css.should == "#header {\n -moz-border-radius: 5em; -webkit-border-radius: 5em; " +
8
+ "-khtml-border-radius: 5em; border-radius: 5em;\n }"
9
+ end
10
+
11
+ it 'should work with spaces in value' do
12
+ css = CSS3Now.new("#header {\n border-radius: 5em 10px -3.4em;\n }").to_css
13
+ css.should == "#header {\n -moz-border-radius: 5em 10px -3.4em; -webkit-border-radius: 5em 10px -3.4em; " +
14
+ "-khtml-border-radius: 5em 10px -3.4em; border-radius: 5em 10px -3.4em;\n }"
15
+ end
16
+
17
+ it 'should work with additional characters: -, ., #' do
18
+ css = CSS3Now.new("#header {\n border-radius: 5em 10px -3.4em #fff;\n }").to_css
19
+ css.should == "#header {\n -moz-border-radius: 5em 10px -3.4em #fff; -webkit-border-radius: 5em 10px -3.4em #fff; " +
20
+ "-khtml-border-radius: 5em 10px -3.4em #fff; border-radius: 5em 10px -3.4em #fff;\n }"
21
+ end
22
+
23
+ it 'should grab anything before the semicolon as a value' do
24
+ css = CSS3Now.new("#header {\n border-radius:( !imporant *Awesomeness* !@\#$% #123 );\n }").to_css
25
+ css.should == "#header {\n -moz-border-radius:( !imporant *Awesomeness* !@\#$% #123 ); -webkit-border-radius:( !imporant *Awesomeness* !@\#$% #123 ); " +
26
+ "-khtml-border-radius:( !imporant *Awesomeness* !@\#$% #123 ); border-radius:( !imporant *Awesomeness* !@\#$% #123 );\n }"
27
+ end
28
+
29
+ it 'should work with multiple instances of an attibute' do
30
+ CSS3Now.new("#x {\n opacity: 0.5;\n } #y {\n opacity: 0.4;\n }").to_css.should ==
31
+ "#x {\n filter:alpha(opacity=50); opacity: 0.5;\n }" +
32
+ " #y {\n filter:alpha(opacity=40); opacity: 0.4;\n }"
33
+
34
+ css = CSS3Now.new("#header1 {\n border-radius: 1px;\n } " +
35
+ "#header2 {\n border-radius: 5em;\n }" ).to_css
36
+ css.should ==
37
+ "#header1 {\n -moz-border-radius: 1px; -webkit-border-radius: 1px; -khtml-border-radius: 1px; border-radius: 1px;\n } " +
38
+ "#header2 {\n -moz-border-radius: 5em; -webkit-border-radius: 5em; -khtml-border-radius: 5em; border-radius: 5em;\n }"
39
+ end
40
+
41
+ it 'should replace box-shadow' do
42
+ css = CSS3Now.new("#header {\n box-shadow: 5em;\n }").to_css
43
+ css.should == "#header {\n -moz-box-shadow: 5em; -webkit-box-shadow: 5em; " +
44
+ "-khtml-box-shadow: 5em; box-shadow: 5em;\n }"
45
+ end
46
+
47
+ it 'should replace opacity' do
48
+ CSS3Now.new("#x {\n opacity: 0.5;\n }").to_css.should == "#x {\n filter:alpha(opacity=50); opacity: 0.5;\n }"
49
+ end
50
+
51
+ it 'should be able to add your own substitutions' do
52
+ CSS3Now.new("#x { color: white; }").to_css.should == "#x { color: white; }"
53
+
54
+ lambda {
55
+ CSS3Now.substitution do |css|
56
+ CSS3Now.replace_browser_specific css, :color, [ :moz ]
57
+ end
58
+ }.should change(CSS3Now.substitutions, :count)
59
+
60
+ CSS3Now.new("#x { color: white; }").to_css.should == "#x { -moz-color: white; color: white; }"
61
+ end
62
+
63
+ it 'should be able to add your own substitutions (2)' do
64
+ CSS3Now.new("#x { foo: white; }").to_css.should == "#x { foo: white; }"
65
+
66
+ CSS3Now.substitution do |css|
67
+ css.gsub 'white', 'black'
68
+ end
69
+
70
+ CSS3Now.new("#x { foo: white; }").to_css.should == "#x { foo: black; }"
71
+ end
72
+
73
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,4 @@
1
+ --colour
2
+ --format specdoc
3
+ --loadby mtime
4
+ --reverse
@@ -0,0 +1,3 @@
1
+ require 'rubygems'
2
+ require 'spec'
3
+ require File.dirname(__FILE__) + '/../lib/css3-now'
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: css3-now
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 2
9
+ version: 0.1.2
10
+ platform: ruby
11
+ authors:
12
+ - remi
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2009-08-14 00:00:00 -07:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: ""
22
+ email: remi@remitaylor.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files:
28
+ - README.rdoc
29
+ files:
30
+ - README.rdoc
31
+ - Rakefile
32
+ - VERSION
33
+ - lib/css3-now.rb
34
+ - spec/css3-now_spec.rb
35
+ - spec/spec.opts
36
+ - spec/spec_helper.rb
37
+ has_rdoc: true
38
+ homepage: http://github.com/remi/css3-now
39
+ licenses: []
40
+
41
+ post_install_message:
42
+ rdoc_options:
43
+ - --charset=UTF-8
44
+ require_paths:
45
+ - lib
46
+ required_ruby_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ segments:
51
+ - 0
52
+ version: "0"
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ requirements: []
61
+
62
+ rubyforge_project:
63
+ rubygems_version: 1.3.6
64
+ signing_key:
65
+ specification_version: 3
66
+ summary: ""
67
+ test_files:
68
+ - spec/css3-now_spec.rb
69
+ - spec/spec_helper.rb