base.sass 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f7d0748e57310baaa88bc57919939822bf241fe7
4
- data.tar.gz: b1d5d29fd722de9bc21568131fc0759dff2c78ac
3
+ metadata.gz: 5196ecc5e76b30bedc2a493397fb4cd871ca6d68
4
+ data.tar.gz: 95d0e1bb92cd0a25682d61fb397336368e6d29d7
5
5
  SHA512:
6
- metadata.gz: b9850d92515e0db589d7c639574c55706972d27cfde34c69feeb710dfd8f1c185b043f64f3f7bda1ee24150886236010d527dcc087540041b3e7b048873dce04
7
- data.tar.gz: 3c80361d85683dbe1f490971b93cf44bdc7a261018b5adddc0a792cd52567a24f149d2396331f8f4cdbde9df553b545f4323535ec075b34cd2940168bb9959bc
6
+ metadata.gz: 5018bd64cc72ef5ec0238edd5deca2e7aa7a0d2ebb5c4cf8d8af0b0ce5ba00e2e628a140b1738b03ef5f724bea42282827591e503bb4fae22590d03709df8d72
7
+ data.tar.gz: 6a5fb1eee707df5b80c9eac2a7a2a48da5aa24a7ae7009bc3704c1f6fc3f086b880f33d5e326c9dd6904039ea458e6ad17cd41df1db6807166fa36399d0a7895
data/Changelog.md ADDED
@@ -0,0 +1,55 @@
1
+ # Changelog
2
+
3
+ ## v1.1.0
4
+
5
+ ### Overrides official map functions to support nest keys
6
+
7
+ - map-get($map, $key-router...)
8
+ - map-remove($map, $key-router...)
9
+ - map-has-key($map, $key-router...)
10
+ - map-merge($map1, $map2, $deep: false)
11
+
12
+ ### Removes legacy functions
13
+
14
+ - map-deep-merge($map1, $map2)
15
+ - map-find($map, $keys)
16
+
17
+ ## v1.0.1
18
+
19
+ - Fix font url in `font-face()` for ie9
20
+
21
+ ## v1.0.0
22
+
23
+ **Milestone Release**
24
+
25
+ ### Extensions
26
+
27
+ - env($name)
28
+ - app-config($name)
29
+ - parse-json($path)
30
+ - strftime([$format])
31
+ - parse-rules($rules...)
32
+ - browsers()
33
+ - browser-versions($browser, [$include-future])
34
+ - url($paths...)
35
+ - nest($selectors...)
36
+ - append-selector($selector, $to-append)
37
+ - enumerate($prefix, $from, $through, [$separator])
38
+ - headings([$from], [$to])
39
+
40
+ ### Functions
41
+
42
+ - comma-list([$list])
43
+ - slice($list, [$min], [$max])
44
+ - map-deep-merge($map1, $map2)
45
+ - map-find($map, $keys)
46
+ - support-browser($browser [$version])
47
+
48
+ ### Mixins
49
+
50
+ - placeholder-wrapper($name)
51
+ - clearfix
52
+ - ellipsis-overflow
53
+ - inline-block
54
+ - float($side, [$important])
55
+ - font-face($font-family, $paths...)
data/Readme.md ADDED
@@ -0,0 +1,206 @@
1
+ # Awesome Extensions For Sass :kiss:
2
+
3
+ [![Build Status](https://travis-ci.org/jsw0528/base.sass.svg?branch=master)](https://travis-ci.org/jsw0528/base.sass)
4
+ [![Gem Version](https://badge.fury.io/rb/base.sass.svg)](http://badge.fury.io/rb/base.sass)
5
+
6
+ > Requires Sass >= 3.3
7
+
8
+ ## Installation
9
+
10
+ In your [`Gemfile`](http://bundler.io/v1.6/gemfile.html):
11
+
12
+ ```ruby
13
+ gem 'base.sass', '~> 1.1'
14
+ ```
15
+
16
+ Or in command line:
17
+
18
+ ```sh
19
+ $ gem install base.sass
20
+ ```
21
+
22
+ ## Usage
23
+
24
+ In your Sass file:
25
+
26
+ ```scss
27
+ @import 'base.sass/*';
28
+ ```
29
+
30
+ And then in command line:
31
+
32
+ ```sh
33
+ $ sass -r base.sass --watch src:dist
34
+ ```
35
+
36
+ Or in `config.rb`:
37
+
38
+ ```ruby
39
+ require 'base.sass'
40
+ ```
41
+
42
+ ## Features
43
+
44
+ ### Read environment variable (case insensitive)
45
+
46
+ When you run:
47
+
48
+ ```sh
49
+ $ SASS_ENV=production sass -r base.sass --update src:dist
50
+ ```
51
+
52
+ Then you can use `env()` in a Sass file to get the value:
53
+
54
+ ```scss
55
+ env(SASS_ENV) //=> production
56
+ env(sass_env) //=> production
57
+ env(sass-env) //=> production
58
+ ```
59
+
60
+ You can use any `KEY=value` if you want.
61
+
62
+ ### Parse local json file
63
+
64
+ Returns a map, and the result will be cached per process.
65
+
66
+ ```scss
67
+ $map: parse-json('~/Desktop/example.json');
68
+ $pkg: parse-json('package.json');
69
+
70
+ // Then, you can:
71
+ map-keys($map)
72
+ map-get($pkg, 'sass')
73
+ ```
74
+
75
+ Now you can use the same configurations both in js and css.
76
+
77
+ ### Parse browser supports (case insensitive)
78
+
79
+ All supported browsers: `chrome`, `firefox`, `safari`, `ie`, `opera`, `ios`, `android`.
80
+
81
+ > Rules data are from [Can I Use](http://beta.caniuse.com/).
82
+
83
+ **Rules:**
84
+
85
+ - `last 1 version` is last versions for each browser.
86
+ - `last 2 Chrome versions` is last versions of the specified browser.
87
+ - `IE > 8` is IE versions newer than 8.
88
+ - `IE >= 8` is IE version 8 or newer.
89
+ - `iOS 7` to set browser version directly.
90
+
91
+ ```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')
97
+
98
+ // Or a list
99
+ $rules: 'last 1 version', 'IE >= 8';
100
+ parse-rules($rules)
101
+ ```
102
+
103
+ [See example](https://github.com/jsw0528/base.sass/wiki/Parse-browser-supports).
104
+
105
+ ### Enhanced `url()`
106
+
107
+ If you want to activate the enhanced `url()`, you should wrap paths with quotes.
108
+
109
+ ```scss
110
+ url(http://a.com/b.png)
111
+ //=> url(http://a.com/b.png) # Did nothing
112
+
113
+ url('http://a.com/b.png')
114
+ //=> url(http://a.com/b.png?1399394203)
115
+
116
+ url('a.png', 'b.png')
117
+ //=> url(a.png?1399394203), url(b.png?1399394203)
118
+
119
+ url('a.eot#iefix', 'b.woff')
120
+ //=> url(a.eot?1399394203#iefix) format('embedded-opentype'), url(b.woff?1399394203) format('woff')
121
+ ```
122
+
123
+ The timestamp be added automatically by default, but you can remove it, or change it to whatever string you wanted.
124
+
125
+ ```scss
126
+ url('a.png', $timestamp: false)
127
+ //=> url(a.png)
128
+
129
+ url('a.png', $timestamp: '1.0.0')
130
+ //=> url(a.png?1.0.0)
131
+ ```
132
+
133
+ Also, you can defined timestamp as a global setting in `app-config` namespace:
134
+
135
+ ```scss
136
+ $app-config: (timestamp: '1.0.0');
137
+
138
+ url('a.png')
139
+ //=> url(a.png?1.0.0)
140
+ ```
141
+
142
+ The data uri is also be supported. Must be! :blush:
143
+
144
+ ```scss
145
+ url('a.png', $base64: true)
146
+ //=> url(data:image/png;base64,iVBORw...)
147
+
148
+ url('a.eot', 'b.woff', $base64: true)
149
+ //=> url(data:application/vnd.ms-fontobject;base64,HAcAA...), url(data:application/font-woff;base64,d09GR...)
150
+ ```
151
+
152
+ ### Enhanced map functions
153
+
154
+ **Overrides official map functions to support nest keys.**
155
+
156
+ ```scss
157
+ map-get($map, a)
158
+ map-get($map, a, b, c)
159
+
160
+ map-remove($map, a)
161
+ map-remove($map, a, b, c)
162
+
163
+ map-has-key($map, a)
164
+ map-has-key($map, a, b, c)
165
+
166
+ map-merge($map1, $map2)
167
+ map-merge($map1, $map2, true) // deep merge
168
+ ```
169
+
170
+ ### Placeholder-style mixins
171
+
172
+ If you want to let css contents appear in the place where it used first time, this is yours! :sunglasses:
173
+
174
+ Please refer to [ellipsis-overflow](stylesheets/base.sass/mixins/_ellipsis-overflow.scss) mixin.
175
+
176
+ ```scss
177
+ .foo {
178
+ @include ellipsis-overflow;
179
+ }
180
+
181
+ .bar {
182
+ @include ellipsis-overflow;
183
+ }
184
+ ```
185
+
186
+ Compiles to:
187
+
188
+ ```css
189
+ .foo, .bar {
190
+ overflow: hidden;
191
+ text-overflow: ellipsis;
192
+ white-space: nowrap;
193
+ }
194
+ ```
195
+
196
+ ### [Read more in Wiki](https://github.com/jsw0528/base.sass/wiki)
197
+
198
+ ## Test
199
+
200
+ ```sh
201
+ $ git clone https://github.com/jsw0528/base.sass && cd base.sass && rake
202
+ ```
203
+
204
+ ## License
205
+
206
+ Licensed under the [MIT License](http://www.opensource.org/licenses/mit-license.php).
data/lib/base.sass.rb CHANGED
@@ -7,6 +7,7 @@ require 'base.sass/caniuse'
7
7
  require 'base.sass/ruby-to-sass'
8
8
  require 'base.sass/sass-to-ruby'
9
9
  require 'base.sass/env'
10
+ require 'base.sass/map'
10
11
  require 'base.sass/parse-json'
11
12
  require 'base.sass/strftime'
12
13
  require 'base.sass/support'
data/lib/base.sass/env.rb CHANGED
@@ -21,7 +21,7 @@ module Sass::Script::Functions
21
21
  def app_config(name)
22
22
  assert_type name, :String
23
23
  config = environment.global_env.var('app-config')
24
- config.is_a?(Sass::Script::Value::Map) && config.value[name] || null
24
+ config.is_a?(Sass::Script::Value::Map) && config.to_h[name] || null
25
25
  end
26
26
 
27
27
  end
@@ -0,0 +1,126 @@
1
+ # Overrides official map functions to support nest keys.
2
+ module Sass::Script::Functions
3
+
4
+ # Returns the value in a map associated with the given keys.
5
+ #
6
+ # Examples:
7
+ # $map: (a: (b: (c: 1)));
8
+ # map-get($map, a) => (b: (c: 1))
9
+ # map-get($map, a, b) => (c: 1)
10
+ # map-get($map, a, b, c) => 1
11
+ # map-get($map, x) => null
12
+ # map-get($map, a, x, c) => null
13
+ # map-get($map, a, b, c, x) => null
14
+ # map-get((), x) => null
15
+ def map_get(map, *keys)
16
+ assert_type map, :Map
17
+ assert_args_number(keys)
18
+
19
+ hash, target = map.to_h, keys.pop
20
+
21
+ keys.each do |key|
22
+ # Each parent node must be a map
23
+ unless hash[key].is_a? Sass::Script::Value::Map
24
+ hash = {}
25
+ break
26
+ end
27
+ hash = hash[key].value
28
+ end
29
+
30
+ hash[target] || null
31
+ end
32
+
33
+ # Returns a new map with keys removed.
34
+ #
35
+ # Examples:
36
+ # $map: (a: (b: (c: 1)));
37
+ # map-remove($map, a) => ()
38
+ # map-remove($map, a, b) => (a: ())
39
+ # map-remove($map, a, b, c) => (a: (b: ()))
40
+ # map-remove($map, x) => (a: (b: (c: 1)))
41
+ # map-remove($map, a, x, c) => (a: (b: (c: 1)))
42
+ # map-remove($map, a, b, c, x) => (a: (b: (c: 1)))
43
+ def map_remove(map, *keys)
44
+ return map unless map_has_key(map, *keys).to_bool
45
+
46
+ target, hash = keys.pop, get_hash(map, keys)
47
+ hash.delete target
48
+
49
+ while keys.size > 0
50
+ target = keys.pop
51
+ _hash, hash = map(hash), get_hash(map, keys)
52
+ hash[target] = _hash
53
+ end
54
+
55
+ map(hash)
56
+ end
57
+
58
+ # Returns whether a map has a value associated with a given keys.
59
+ #
60
+ # Examples:
61
+ # $map: (a: (b: (c: 1)));
62
+ # map-has-key($map, a) => true
63
+ # map-has-key($map, a, b) => true
64
+ # map-has-key($map, a, c) => false
65
+ # map-has-key($map, a, b, c) => true
66
+ # map-has-key($map, a, x, c) => false
67
+ # map-has-key($map, a, b, c, x) => false
68
+ def map_has_key(map, *keys)
69
+ assert_type map, :Map
70
+ assert_args_number(keys)
71
+
72
+ hash = map.to_h
73
+
74
+ keys.each do |key|
75
+ # Each parent node must be a map
76
+ return bool(false) unless hash.is_a?(Hash) && hash.key?(key)
77
+ hash = hash[key].value
78
+ end
79
+
80
+ bool(true)
81
+ end
82
+
83
+ # Merges two maps together into a new map recursively.
84
+ #
85
+ # Examples:
86
+ # $map1: (a: (b: (c: 1 2, d: foo, e: baz)));
87
+ # $map2: (a: (b: (c: 3 4, d: bar)));
88
+ # map-merge($map1, $map2) => (a: (b: (c: 3 4, d: bar)))
89
+ # map-merge($map1, $map2, true) => (a: (b: (c: 1 2 3 4, d: bar, e: baz)))
90
+ def map_merge(map1, map2, deep = bool(false))
91
+ assert_type map1, :Map
92
+ assert_type map2, :Map
93
+
94
+ map1, map2 = map1.to_h.dup, map2.to_h
95
+ return map(map1.merge(map2)) unless deep.to_bool
96
+
97
+ map2.each do |k, v|
98
+ orig = map1[k]
99
+ map1[k] = get_value(orig, v)
100
+ end
101
+
102
+ map(map1)
103
+ end
104
+
105
+
106
+ private
107
+
108
+ def assert_args_number(keys)
109
+ raise ArgumentError.new('wrong number of arguments (1 for 2+)') if keys.empty?
110
+ end
111
+
112
+ def get_hash(map, keys)
113
+ (keys.empty? ? map : map_get(map, *keys)).to_h.dup
114
+ end
115
+
116
+ def get_value(oldVal, newVal)
117
+ if oldVal.is_a?(Sass::Script::Value::Map) && newVal.is_a?(Sass::Script::Value::Map)
118
+ map_merge(oldVal, newVal, bool(true))
119
+ elsif oldVal.is_a?(Sass::Script::Value::List) && newVal.is_a?(Sass::Script::Value::List)
120
+ join(oldVal, newVal)
121
+ else
122
+ newVal
123
+ end
124
+ end
125
+
126
+ end
@@ -10,14 +10,14 @@ module Sass::Script::Functions
10
10
  end
11
11
 
12
12
  def to_ruby_hash(sass_map)
13
- sass_map.value.inject({}) do |memo, (k, v)|
13
+ sass_map.to_h.inject({}) do |memo, (k, v)|
14
14
  memo[k.to_s] = sass_to_ruby(v)
15
15
  memo
16
16
  end
17
17
  end
18
18
 
19
19
  def to_ruby_array(sass_list)
20
- sass_list.value.map do |item|
20
+ sass_list.to_a.map do |item|
21
21
  sass_to_ruby(item)
22
22
  end
23
23
  end
@@ -42,11 +42,9 @@ module Sass::Script::Functions
42
42
  def headers(from = nil, to = nil)
43
43
  if from && !to
44
44
  if from.is_a?(Sass::Script::Value::String) && from.value == 'all'
45
- from = number(1)
46
- to = number(6)
45
+ to, from = number(6), number(1)
47
46
  else
48
- to = from
49
- from = number(1)
47
+ to, from = from, number(1)
50
48
  end
51
49
  else
52
50
  from ||= number(1)
@@ -44,22 +44,6 @@ module Sass::Script::Functions
44
44
  ruby_to_sass(versions)
45
45
  end
46
46
 
47
- # Grep feature names according to caniuse by regex.
48
- #
49
- # Examples:
50
- # grep-features('^css3?') => /^css3?/
51
- # grep-features('box sizing') => /box|sizing/
52
- # grep-features('box-sizing') => /box|sizing/
53
- # def grep_features(regex)
54
- # assert_type regex, :String
55
-
56
- # regex = regex.value.strip.sub(/^-+|-+$/, '')
57
- # regex = regex.gsub(/\s+|-+/, '|') if regex =~ /^[\w\s-]+$/
58
- # regex = Regexp.new(regex, Regexp::IGNORECASE)
59
-
60
- # ruby_to_sass(CanIUse.instance.supports.keys.select { |k| k =~ regex }.sort)
61
- # end
62
-
63
47
 
64
48
  private
65
49
 
@@ -9,5 +9,4 @@ $browser-supports: parse-rules('last 1 version') !default;
9
9
  @import 'mixins/placeholder-wrapper';
10
10
 
11
11
  @import 'functions/list';
12
- @import 'functions/map';
13
12
  @import 'functions/support';
@@ -1,7 +1,7 @@
1
- $-registered-placeholders: ();
1
+ $anonymous-placeholders: ();
2
2
 
3
3
  @mixin placeholder-wrapper($name) {
4
- $times: map-get($-registered-placeholders, $name) or 0;
4
+ $times: map-get($anonymous-placeholders, $name) or 0;
5
5
 
6
6
  @if $times == 0 {
7
7
  @at-root %-#{$name} {
@@ -10,5 +10,5 @@ $-registered-placeholders: ();
10
10
  }
11
11
 
12
12
  @extend %-#{$name};
13
- $-registered-placeholders: map-merge($-registered-placeholders, ($name: $times + 1)) !global;
13
+ $anonymous-placeholders: map-merge($anonymous-placeholders, ($name: $times + 1)) !global;
14
14
  }
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.0.1
4
+ version: 1.1.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-13 00:00:00.000000000 Z
11
+ date: 2014-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sass
@@ -30,16 +30,19 @@ dependencies:
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '3.5'
33
- description: A lot of powerful Sass functions.
33
+ description: Awesome features that you wanted
34
34
  email: i@mrzhang.me
35
35
  executables: []
36
36
  extensions: []
37
37
  extra_rdoc_files: []
38
38
  files:
39
+ - Changelog.md
40
+ - Readme.md
39
41
  - data/browsers.json
40
42
  - lib/base.sass.rb
41
43
  - lib/base.sass/caniuse.rb
42
44
  - lib/base.sass/env.rb
45
+ - lib/base.sass/map.rb
43
46
  - lib/base.sass/parse-json.rb
44
47
  - lib/base.sass/ruby-to-sass.rb
45
48
  - lib/base.sass/sass-to-ruby.rb
@@ -49,7 +52,6 @@ files:
49
52
  - lib/base.sass/url.rb
50
53
  - stylesheets/base.sass/_*.scss
51
54
  - stylesheets/base.sass/functions/_list.scss
52
- - stylesheets/base.sass/functions/_map.scss
53
55
  - stylesheets/base.sass/functions/_support.scss
54
56
  - stylesheets/base.sass/mixins/_clearfix.scss
55
57
  - stylesheets/base.sass/mixins/_ellipsis-overflow.scss
@@ -80,5 +82,5 @@ rubyforge_project:
80
82
  rubygems_version: 2.2.0
81
83
  signing_key:
82
84
  specification_version: 4
83
- summary: The beginning of your stylesheets.
85
+ summary: Awesome Extensions For Sass
84
86
  test_files: []
@@ -1,55 +0,0 @@
1
- // Example:
2
- //
3
- // $map1: ( a: (x: 'x') );
4
- // $map2: ( a: (y: 'y') );
5
- //
6
- // map-deep-merge($map1, $map2)
7
- // => ( a: (x: 'x', y: 'y') )
8
- @function map-deep-merge($map, $sub-map) {
9
- @if type-of($map) != map or type-of($sub-map) != map {
10
- @warn 'Params for `map-deep-merge` require map data';
11
- @return null;
12
- }
13
-
14
- @each $key, $value in $sub-map {
15
- $original: map-get($map, $key);
16
-
17
- @if type-of($original) == map and type-of($value) == map {
18
- $value: map-deep-merge($original, $value);
19
- }
20
-
21
- $map: map-merge($map, ($key: $value));
22
- }
23
-
24
- @return $map;
25
- }
26
-
27
-
28
- // Example:
29
- //
30
- // $map: (
31
- // a: (
32
- // b: (
33
- // c: 'Good job!'
34
- // )
35
- // )
36
- // );
37
- //
38
- // Before: map-get(map-get(map-get($map, a), b), c)
39
- // After: map-find($map, 'a.b.c')
40
- @function map-find($map, $keys) {
41
- @while str-index($keys, '.') {
42
- $index: str-index($keys, '.');
43
-
44
- // Child elements
45
- $map: map-get($map, str-slice($keys, 0, $index - 1));
46
- @if type-of($map) != map {
47
- @return null;
48
- }
49
-
50
- // Rest keys
51
- $keys: str-slice($keys, $index + 1);
52
- }
53
-
54
- @return map-get($map, $keys);
55
- }