base.sass 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f1d195e6a52cb50dbd31f9a401dfaf1e686d182
4
- data.tar.gz: b4a174b36a7f61faa0d63b56a62193d85818562a
3
+ metadata.gz: a777f11b0ec5eca1853ef7a54af4f3d6c7c77b88
4
+ data.tar.gz: 1f9cdcf73842dcf6ee94e8b6b27e29238dfbad0f
5
5
  SHA512:
6
- metadata.gz: 7d8f72b9bba990f74cae21bd9cb7821a06e0ca73b84d4a51df5eaefb75aa440e24fef112dd04b71948ad02e7034ffda687baeb64463a5e7c8bf1bb6c1ca6191a
7
- data.tar.gz: 24832fd86a78a1175f60d57cab1a2b180256ddce534859ecf3fd332045754066e159417e8fc45758bbcca459195ca10ff1c93ff51b148b76d60866557e4a0afd
6
+ metadata.gz: 850350f005243911f36d7a07f81a2200e89214c146eb6d150689ed433204eb49ccb15a97adc832f2ff95c68cdbd93ef5c3968fbd7566112ba6d6d855718f8372
7
+ data.tar.gz: 2f482394fed7d0009161a7419bdcb502169cbeec313b770374bfd764329d7fd504df1645a3bd5b2e73ef37509a6035329338f671e2269b23040b2e2fcec71a9c
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.3.0
4
+
5
+ ### Adds a multifunctional helper
6
+
7
+ - caniuse($cond)
8
+
9
+ ### Removes legacy functions
10
+
11
+ - browsers()
12
+ - browser-versions($browser, [$include-future])
13
+
3
14
  ## v1.2.0
4
15
 
5
16
  ### Upgrades `app-config()`
data/Readme.md CHANGED
@@ -10,7 +10,7 @@
10
10
  In your [`Gemfile`](http://bundler.io/v1.6/gemfile.html):
11
11
 
12
12
  ```ruby
13
- gem 'base.sass', '~> 1.2'
13
+ gem 'base.sass', '~> 1.3'
14
14
  ```
15
15
 
16
16
  Or in command line:
@@ -27,7 +27,7 @@ At top of your Sass file:
27
27
  @import 'base.sass/*';
28
28
  ```
29
29
 
30
- And then in command line:
30
+ Then, use `-r` option in command line:
31
31
 
32
32
  ```sh
33
33
  $ sass --watch -r base.sass src:dist
@@ -39,6 +39,10 @@ Or in `config.rb`:
39
39
  require 'base.sass'
40
40
  ```
41
41
 
42
+ ## Examples
43
+
44
+ Please refer to [wiki](https://github.com/jsw0528/base.sass/wiki) page.
45
+
42
46
  ## Features
43
47
 
44
48
  ### Read environment variables (case insensitive)
@@ -49,7 +53,7 @@ When you run:
49
53
  $ SASS_ENV=production sass --update -r base.sass src:dist
50
54
  ```
51
55
 
52
- Then you can use `env()` in a Sass file to get the value:
56
+ Then you can use `env()` in Sass files to get the value:
53
57
 
54
58
  ```scss
55
59
  env(SASS_ENV) //=> production
@@ -57,7 +61,7 @@ env(sass_env) //=> production
57
61
  env(sass-env) //=> production
58
62
  ```
59
63
 
60
- You can use any `KEY=value` if you want.
64
+ > You can use any `KEY=value` if you want.
61
65
 
62
66
  ### Parse local json file
63
67
 
@@ -69,10 +73,10 @@ $pkg: parse-json('package.json');
69
73
 
70
74
  // Then, you can:
71
75
  map-keys($map)
72
- map-get($pkg, 'sass')
76
+ map-get($pkg, 'some key')
73
77
  ```
74
78
 
75
- Now you can use the same configurations both in js and css.
79
+ > Now you can use the same configurations both in js and css.
76
80
 
77
81
  ### Parse browser supports (case insensitive)
78
82
 
@@ -89,18 +93,22 @@ All supported browsers: `chrome`, `firefox`, `safari`, `ie`, `opera`, `ios`, `an
89
93
  - `iOS 7` to set browser version directly.
90
94
 
91
95
  ```scss
92
- // You can use one param
93
- parse-rules('last 1 version')
94
-
95
- // Or multi params
96
- parse-rules('last 1 version', 'IE >= 8')
96
+ // You can use multi params
97
+ $browser-supports: parse-rules('last 1 version', 'IE >= 8');
97
98
 
98
99
  // Or a list
99
100
  $rules: 'last 1 version', 'IE >= 8';
100
- parse-rules($rules)
101
- ```
101
+ $browser-supports: parse-rules($rules);
102
102
 
103
- [See example](https://github.com/jsw0528/base.sass/wiki/Parse-browser-supports).
103
+ // Then, you can:
104
+ @if support-browser(Android) {
105
+ // ...
106
+ }
107
+
108
+ @if not support-browser(ie 8) {
109
+ // ...
110
+ }
111
+ ```
104
112
 
105
113
  ### Enhanced `url()`
106
114
 
@@ -130,16 +138,24 @@ url('a.png', $timestamp: '1.0.0')
130
138
  //=> url(a.png?1.0.0)
131
139
  ```
132
140
 
133
- Also, you can defined timestamp as a global setting in `app-config` namespace:
141
+ Also, you can defined timestamp as a global configuration in `app-config` namespace:
134
142
 
135
143
  ```scss
136
- $app-config: (timestamp: '1.0.0');
144
+ $app-config: (
145
+ development: (
146
+ timestamp: '1.1.0.alpha'
147
+ ),
148
+ production: (
149
+ timestamp: '1.0.0'
150
+ )
151
+ );
137
152
 
138
153
  url('a.png')
139
- //=> url(a.png?1.0.0)
154
+ //=> url(a.png?1.1.0.alpha) if SASS_ENV is development
155
+ //=> url(a.png?1.0.0) if SASS_ENV is production
140
156
  ```
141
157
 
142
- The data uri is also be supported. Must be! :blush:
158
+ The data uri is also be supported.
143
159
 
144
160
  ```scss
145
161
  url('a.png', $base64: true)
@@ -149,9 +165,9 @@ url('a.eot', 'b.woff', $base64: true)
149
165
  //=> url(data:application/vnd.ms-fontobject;base64,HAcAA...), url(data:application/font-woff;base64,d09GR...)
150
166
  ```
151
167
 
152
- ### Enhanced map functions
168
+ ### Powerful map functions
153
169
 
154
- **Overrides official map functions to support nest keys.**
170
+ > Overrides official map functions to support nest keys.
155
171
 
156
172
  ```scss
157
173
  map-get($map, a)
@@ -193,8 +209,6 @@ Compiles to:
193
209
  }
194
210
  ```
195
211
 
196
- ### [Read more in Wiki](https://github.com/jsw0528/base.sass/wiki)
197
-
198
212
  ## Test
199
213
 
200
214
  ```sh
@@ -4,12 +4,12 @@ ENV['SASS_PATH'] = [ENV['SASS_PATH'], load_path].compact.join(File::PATH_SEPARAT
4
4
  ENV['SASS_ENV'] ||= 'development'
5
5
 
6
6
  require 'base.sass/caniuse'
7
- require 'base.sass/ruby-to-sass'
8
- require 'base.sass/sass-to-ruby'
9
7
  require 'base.sass/env'
10
8
  require 'base.sass/map'
11
9
  require 'base.sass/parse-json'
12
- require 'base.sass/strftime'
13
- require 'base.sass/support'
10
+ require 'base.sass/parse-rules'
11
+ require 'base.sass/ruby-to-sass'
12
+ require 'base.sass/sass-to-ruby'
14
13
  require 'base.sass/selector'
14
+ require 'base.sass/strftime'
15
15
  require 'base.sass/url'
@@ -4,19 +4,48 @@ class CanIUse
4
4
  include Singleton
5
5
  include Sass::Script::Functions
6
6
 
7
- DATA_DIR = File.join(File.dirname(__FILE__), '..', '..', 'data')
8
-
9
7
  def initialize
10
- @caniuse_browsers = load_json(File.join(DATA_DIR, 'browsers.json'))
11
- # @caniuse_supports = load_json(File.join(DATA_DIR, 'supports.json'))
8
+ @data = load_json(File.join(File.dirname(__FILE__), '..', '..', 'data', 'browsers.json'))
12
9
  end
13
10
 
14
11
  def browsers
15
- @caniuse_browsers
12
+ @data.keys.sort
13
+ end
14
+
15
+ def versions(browser, include_future)
16
+ return [] unless @data.key? browser
17
+
18
+ versions = @data[browser]['versions']
19
+ return versions unless include_future
20
+
21
+ versions + @data[browser]['future'].to_a
16
22
  end
17
23
 
18
- # def supports
19
- # @caniuse_supports
20
- # end
24
+ end
25
+
26
+
27
+ module Sass::Script::Functions
28
+
29
+ # Returns the data in CanIUse which base.sass used.
30
+ #
31
+ # Examples:
32
+ # caniuse(browsers)
33
+ # caniuse(Chrome versions)
34
+ # caniuse(Chrome all versions)
35
+ def caniuse(cond)
36
+ cond = [sass_to_ruby(cond)].flatten.map { |w| w.downcase }
37
+
38
+ output = if cond.first == 'browsers'
39
+ caniuse_browsers
40
+ elsif cond.last == 'versions'
41
+ browser = cond.first
42
+ assert_valid_browser(browser)
43
+ caniuse_versions(browser, cond.include?('all'))
44
+ else
45
+ raise Sass::SyntaxError, "Unknown condition.\nYou can try `caniuse(browsers)` or `caniuse(Chrome versions)`"
46
+ end
47
+
48
+ ruby_to_sass(output)
49
+ end
21
50
 
22
51
  end
@@ -0,0 +1,114 @@
1
+ module Sass::Script::Functions
2
+
3
+ # Returns the specified browsers and versions associated with the given rules.
4
+ #
5
+ # Rules:
6
+ # 1. last 1 version is last versions for each browser.
7
+ # 2. last 2 Chrome versions is last versions of the specified browser.
8
+ # 3. IE > 8 is ie versions newer than 8.
9
+ # 4. IE >= 8 is ie version 8 or newer.
10
+ # 5. iOS 7 to set browser version directly.
11
+ def parse_rules(*rules)
12
+ rules = rules.map { |r| sass_to_ruby(r) }.flatten.uniq
13
+
14
+ # Parse
15
+ selected = rules.map { |r| rules_parser(r.downcase) }.compact
16
+ # Merge
17
+ selected = selected.inject { |memo, p|
18
+ memo.merge(p) { |k, orig, added| orig + added }
19
+ }
20
+ # Uniq & Sort
21
+ selected.each { |k, v|
22
+ v.uniq!
23
+ v.sort!
24
+ }
25
+
26
+ ruby_to_sass(selected)
27
+ end
28
+
29
+
30
+ protected
31
+
32
+ def caniuse_browsers
33
+ @browsers ||= CanIUse.instance.browsers
34
+ end
35
+
36
+ def caniuse_versions(browser, include_future)
37
+ @versions ||= {}
38
+ k = browser.to_s + include_future.to_s
39
+ @versions[k] ||= CanIUse.instance.versions(browser, include_future)
40
+ end
41
+
42
+ def assert_valid_browser(browser, version = nil)
43
+ unless caniuse_browsers.include? browser
44
+ raise Sass::SyntaxError, "Unknown browser name: #{browser}\nYou can find all valid names according to `caniuse(browsers)`"
45
+ end
46
+
47
+ unless version.nil? || caniuse_versions(browser, true).include?(version)
48
+ raise Sass::SyntaxError, "Unknown version for #{browser}: #{version}\nYou can find all valid versions according to `caniuse(#{browser} all versions)`"
49
+ end
50
+ end
51
+
52
+
53
+ private
54
+
55
+ def rules_parser(rule)
56
+ case rule
57
+
58
+ # match `last 1 version`
59
+ when /^last (\d+) versions?$/
60
+ last_versions_parser($1)
61
+
62
+ # match `last 3 chrome versions`
63
+ when /^last (\d+) (\w+) versions?$/
64
+ last_browser_versions_parser($1, $2, true)
65
+
66
+ # match `ie > 9`
67
+ when /^(\w+) (>=?) ([\d\.]+)$/
68
+ newer_then_parser($1, $2, $3)
69
+
70
+ # match `ios 7`
71
+ when /^(\w+) ([\d\.]+)$/
72
+ direct_parser($1, $2)
73
+
74
+ else
75
+ raise Sass::SyntaxError, "Unknown rule: `#{rule}`"
76
+ end
77
+ end
78
+
79
+ def last_versions_parser(num)
80
+ caniuse_browsers.map { |browser|
81
+ last_browser_versions_parser(num, browser, false)
82
+ }.inject :merge
83
+ end
84
+
85
+ def last_browser_versions_parser(num, browser, assert)
86
+ assert_valid_browser(browser) if assert
87
+ Hash[browser, caniuse_versions(browser, false).last(num.to_i)]
88
+ end
89
+
90
+ def newer_then_parser(browser, sign, version)
91
+ assert_valid_browser(browser)
92
+
93
+ versions = caniuse_versions(browser, false)
94
+ versions = case sign
95
+ when '>='
96
+ versions.select { |n| n >= version.to_f }
97
+ when '>'
98
+ versions.select { |n| n > version.to_f }
99
+ end
100
+
101
+ versions.empty? ? nil : Hash[browser, versions]
102
+ end
103
+
104
+ def direct_parser(browser, version)
105
+ version = to_if(version)
106
+ assert_valid_browser(browser, version)
107
+ Hash[browser, [version]]
108
+ end
109
+
110
+ def to_if(s)
111
+ s.include?('.') ? s.to_f : s.to_i
112
+ end
113
+
114
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: base.sass
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - junjun.zhang
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-15 00:00:00.000000000 Z
11
+ date: 2014-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sass
@@ -44,11 +44,11 @@ files:
44
44
  - lib/base.sass/env.rb
45
45
  - lib/base.sass/map.rb
46
46
  - lib/base.sass/parse-json.rb
47
+ - lib/base.sass/parse-rules.rb
47
48
  - lib/base.sass/ruby-to-sass.rb
48
49
  - lib/base.sass/sass-to-ruby.rb
49
50
  - lib/base.sass/selector.rb
50
51
  - lib/base.sass/strftime.rb
51
- - lib/base.sass/support.rb
52
52
  - lib/base.sass/url.rb
53
53
  - stylesheets/base.sass/_*.scss
54
54
  - stylesheets/base.sass/functions/_list.scss
@@ -79,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
79
79
  version: '0'
80
80
  requirements: []
81
81
  rubyforge_project:
82
- rubygems_version: 2.2.0
82
+ rubygems_version: 2.2.2
83
83
  signing_key:
84
84
  specification_version: 4
85
85
  summary: Awesome Extensions For Sass
@@ -1,120 +0,0 @@
1
- module Sass::Script::Functions
2
-
3
- # Which browsers you wanted support?
4
- #
5
- # `last 1 version`
6
- # is last versions for each browser.
7
- # `last 2 Chrome versions`
8
- # is last versions of the specified browser.
9
- # `IE > 8`
10
- # is IE versions newer than 8.
11
- # `IE >= 8`
12
- # is IE version 8 or newer.
13
- # `iOS 7`
14
- # to set browser version directly.
15
- def parse_rules(*rules)
16
- rules = rules.map { |rule| sass_to_ruby(rule) }.flatten.uniq
17
-
18
- @browsers ||= CanIUse.instance.browsers
19
- selected_browsers =
20
- rules.map { |rule| rules_parser(rule.downcase) }.compact
21
- .inject { |memo, versions|
22
- memo.merge(versions) { |k, orig, added| orig + added }
23
- }
24
-
25
- ruby_to_sass(selected_browsers.each { |k, v| v.uniq!; v.sort! })
26
- end
27
-
28
- # Returns `(android, chrome, firefox, ie, ios, opera, safari)`.
29
- def browsers
30
- ruby_to_sass(CanIUse.instance.browsers.keys.sort)
31
- end
32
-
33
- # Returns the versions by the given browser.
34
- def browser_versions(browser, include_future = bool(true))
35
- assert_type browser, :String
36
-
37
- @browsers ||= CanIUse.instance.browsers
38
- browser = browser.value.downcase
39
- assert_valid_browser(browser)
40
-
41
- versions = @browsers[browser]['versions']
42
- versions += @browsers[browser]['future'].to_a if include_future.to_bool
43
-
44
- ruby_to_sass(versions)
45
- end
46
-
47
-
48
- private
49
-
50
- def assert_valid_browser(browser, version = nil)
51
- unless @browsers.key? browser
52
- raise Sass::SyntaxError, "Unknown browser name: #{browser}\nYou can find all valid names according to `browsers()`"
53
- end
54
-
55
- unless version.nil? || sass_to_ruby(browser_versions(identifier(browser))).include?(version)
56
- raise Sass::SyntaxError, "Unknown version for #{browser}: #{version}\nYou can find all valid versions according to `browser-versions(#{browser})`"
57
- end
58
- end
59
-
60
- def rules_parser(rule)
61
- case rule
62
-
63
- # match `last 1 version`
64
- when /^last (\d+) versions?$/
65
- last_versions_parser($1)
66
-
67
- # match `last 3 chrome versions`
68
- when /^last (\d+) (\w+) versions?$/
69
- last_browser_versions_parser($1, $2)
70
-
71
- # match `ie > 9`
72
- when /^(\w+) (>=?) ([\d\.]+)$/
73
- newer_then_parser($1, $2, $3)
74
-
75
- # match `ios 7`
76
- when /^(\w+) ([\d\.]+)$/
77
- direct_parser($1, $2)
78
-
79
- else
80
- raise Sass::SyntaxError, "Unknown rule: `#{rule}`"
81
- end
82
- end
83
-
84
- def last_versions_parser(num)
85
- @browsers.inject({}) do |memo, (k, v)|
86
- memo[k] = v['versions'].last(num.to_i)
87
- memo
88
- end
89
- end
90
-
91
- def last_browser_versions_parser(num, browser)
92
- assert_valid_browser(browser)
93
- Hash[browser, @browsers[browser]['versions'].last(num.to_i)]
94
- end
95
-
96
- def newer_then_parser(browser, sign, version)
97
- assert_valid_browser(browser)
98
-
99
- versions = @browsers[browser]['versions']
100
- versions = case sign
101
- when '>='
102
- versions.select { |n| n >= version.to_f }
103
- when '>'
104
- versions.select { |n| n > version.to_f }
105
- end
106
-
107
- versions.empty? ? nil : Hash[browser, versions]
108
- end
109
-
110
- def direct_parser(browser, version)
111
- version = to_if(version)
112
- assert_valid_browser(browser, version)
113
- Hash[browser, [version]]
114
- end
115
-
116
- def to_if(s)
117
- s.include?('.') ? s.to_f : s.to_i
118
- end
119
-
120
- end