base.sass 1.0.1 → 1.1.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: 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
- }