bootstrap-sass 3.0.3.0 → 3.1.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of bootstrap-sass might be problematic. Click here for more details.

Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/CHANGELOG.md +4 -0
  4. data/CONTRIBUTING.md +2 -2
  5. data/Gemfile +1 -1
  6. data/LICENSE +17 -10
  7. data/README.md +17 -17
  8. data/Rakefile +7 -2
  9. data/bootstrap-sass.gemspec +9 -9
  10. data/bower.json +22 -0
  11. data/composer.json +35 -0
  12. data/lib/bootstrap-sass.rb +1 -3
  13. data/lib/bootstrap-sass/sass_functions.rb +4 -3
  14. data/lib/bootstrap-sass/version.rb +2 -2
  15. data/tasks/converter.rb +21 -15
  16. data/tasks/converter/fonts_conversion.rb +7 -3
  17. data/tasks/converter/js_conversion.rb +20 -3
  18. data/tasks/converter/less_conversion.rb +89 -60
  19. data/tasks/converter/logger.rb +6 -14
  20. data/tasks/converter/network.rb +7 -32
  21. data/test/compilation_test.rb +1 -1
  22. data/test/dummy/app/views/pages/root.html.slim +8 -2
  23. data/test/dummy/config/application.rb +2 -2
  24. data/test/gemfiles/sass_3_2.gemfile +1 -1
  25. data/test/gemfiles/sass_head.gemfile +2 -3
  26. data/test/sprockets_rails_test.rb +21 -0
  27. data/vendor/assets/javascripts/bootstrap/affix.js +34 -23
  28. data/vendor/assets/javascripts/bootstrap/alert.js +5 -15
  29. data/vendor/assets/javascripts/bootstrap/button.js +21 -29
  30. data/vendor/assets/javascripts/bootstrap/carousel.js +16 -28
  31. data/vendor/assets/javascripts/bootstrap/collapse.js +7 -16
  32. data/vendor/assets/javascripts/bootstrap/dropdown.js +19 -26
  33. data/vendor/assets/javascripts/bootstrap/modal.js +25 -28
  34. data/vendor/assets/javascripts/bootstrap/popover.js +14 -21
  35. data/vendor/assets/javascripts/bootstrap/scrollspy.js +16 -21
  36. data/vendor/assets/javascripts/bootstrap/tab.js +7 -17
  37. data/vendor/assets/javascripts/bootstrap/tooltip.js +52 -39
  38. data/vendor/assets/javascripts/bootstrap/transition.js +11 -19
  39. data/vendor/assets/stylesheets/bootstrap/_badges.scss +4 -0
  40. data/vendor/assets/stylesheets/bootstrap/_breadcrumbs.scss +4 -1
  41. data/vendor/assets/stylesheets/bootstrap/_button-groups.scss +8 -9
  42. data/vendor/assets/stylesheets/bootstrap/_buttons.scss +8 -8
  43. data/vendor/assets/stylesheets/bootstrap/_code.scss +10 -0
  44. data/vendor/assets/stylesheets/bootstrap/_dropdowns.scss +28 -3
  45. data/vendor/assets/stylesheets/bootstrap/_forms.scss +81 -38
  46. data/vendor/assets/stylesheets/bootstrap/_glyphicons.scss +1 -5
  47. data/vendor/assets/stylesheets/bootstrap/_grid.scss +26 -5
  48. data/vendor/assets/stylesheets/bootstrap/_input-groups.scss +39 -18
  49. data/vendor/assets/stylesheets/bootstrap/_jumbotron.scss +3 -5
  50. data/vendor/assets/stylesheets/bootstrap/_list-group.scss +25 -3
  51. data/vendor/assets/stylesheets/bootstrap/_mixins.scss +124 -41
  52. data/vendor/assets/stylesheets/bootstrap/_modals.scss +15 -6
  53. data/vendor/assets/stylesheets/bootstrap/_navbar.scss +21 -17
  54. data/vendor/assets/stylesheets/bootstrap/_navs.scss +1 -1
  55. data/vendor/assets/stylesheets/bootstrap/_normalize.scss +139 -122
  56. data/vendor/assets/stylesheets/bootstrap/_pager.scss +4 -4
  57. data/vendor/assets/stylesheets/bootstrap/_pagination.scss +6 -3
  58. data/vendor/assets/stylesheets/bootstrap/_panels.scss +63 -15
  59. data/vendor/assets/stylesheets/bootstrap/_print.scss +0 -4
  60. data/vendor/assets/stylesheets/bootstrap/_responsive-utilities.scss +6 -124
  61. data/vendor/assets/stylesheets/bootstrap/_scaffolding.scss +17 -2
  62. data/vendor/assets/stylesheets/bootstrap/_tables.scss +3 -1
  63. data/vendor/assets/stylesheets/bootstrap/_theme.scss +3 -3
  64. data/vendor/assets/stylesheets/bootstrap/_thumbnails.scss +4 -4
  65. data/vendor/assets/stylesheets/bootstrap/_tooltip.scss +1 -1
  66. data/vendor/assets/stylesheets/bootstrap/_type.scss +77 -62
  67. data/vendor/assets/stylesheets/bootstrap/_variables.scss +350 -163
  68. data/vendor/assets/stylesheets/bootstrap/_wells.scss +1 -1
  69. data/vendor/assets/stylesheets/bootstrap/bootstrap.scss +38 -38
  70. metadata +22 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8ae9333af752fe5ef268cfe31b0552c618fdc5d4
4
- data.tar.gz: 7dee8bca5ee78f5ebec85cc6874ca004c70d3ef8
3
+ metadata.gz: b33ec25bfb1e9fa8c4e1c371a263ec79c7d40baa
4
+ data.tar.gz: 37ce59e8a375cf62d7f08077e8e111a60973859b
5
5
  SHA512:
6
- metadata.gz: 2180967abbf038043dba58cae99e4eb1172e800ba90f1cab21392c3cbe2645d558bf254d2d9ec7a8a042ca11dd02f25179e90b0c6be92b20d46361784387e846
7
- data.tar.gz: 6f9301b6bc8add8ec58c3cd67a031ec8ffbd1a3910419c15a1fd3551e53cbefd76f7e3271fb875e232f87e693ca4ced39730c6af91140205117befabf2593e55
6
+ metadata.gz: 8052230ccd4c3069920808bd2aee510a48be09adab836da007fd8a75e9844dd4f38166bc78055c6f0424c09ab46275b141211cfb3cce49282ea3d261de22a3c9
7
+ data.tar.gz: 42ae1f9fb777f628e0a4e61cc2649c0c94d63f61897dfda22db87fb0b425b39ddea2aa39fdce62deb1cc74f8d6d2cb6b84bd739909c573249e5b2d1ff1aaecde
data/.gitignore CHANGED
@@ -12,4 +12,4 @@ Gemfile.lock
12
12
  /vendor/bundle
13
13
  tmp/
14
14
  test/screenshots/
15
- test/dummy/log/test.log
15
+ test/dummy/log/*.log
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.1.0.0
4
+
5
+ * compiles with libsass master
6
+
3
7
  ## 3.0.2.1
4
8
 
5
9
  * fix vendor paths for compass
@@ -3,7 +3,7 @@
3
3
  ## Asset Changes
4
4
 
5
5
  Any changes to `bootstrap-sass` assets (scss, javascripts, fonts) should be checked against the `convert` rake task.
6
- For usage instructions, see the [README](https://github.com/thomas-mcdonald/bootstrap-sass/blob/3/README.md).
6
+ For usage instructions, see the [README](https://github.com/twbs/bootstrap-sass/blob/3/README.md).
7
7
 
8
8
  If something is broken in the converter, it's preferable to update the converter along with the asset itself.
9
9
 
@@ -50,7 +50,7 @@ Example:
50
50
  > causing the bug, and potential solutions (and your opinions on their
51
51
  > merits).
52
52
 
53
- **[File a bug report](https://github.com/thomas-mcdonald/bootstrap-sass/issues/)**
53
+ **[File a bug report](https://github.com/twbs/bootstrap-sass/issues/)**
54
54
 
55
55
 
56
56
  ## Pull requests
data/Gemfile CHANGED
@@ -4,7 +4,7 @@ gemspec
4
4
 
5
5
  platform :rbx do
6
6
  gem 'rubysl', '~> 2.0'
7
- gem 'rubysl-json', '~> 2.0'
7
+ gem 'json', '>= 1.8.1'
8
8
  gem 'rubysl-test-unit', '~> 2.0'
9
9
  gem 'racc'
10
10
  end
data/LICENSE CHANGED
@@ -1,14 +1,21 @@
1
- Copyright 2011 Twitter, Inc.
1
+ The MIT License (MIT)
2
2
 
3
- Licensed under the Apache License, Version 2.0 (the "License");
4
- you may not use this file except in compliance with the License.
5
- You may obtain a copy of the License at
3
+ Copyright (c) 2013 Twitter, Inc
6
4
 
7
- http://www.apache.org/licenses/LICENSE-2.0
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:
8
11
 
9
- Unless required by applicable law or agreed to in writing, software
10
- distributed under the License is distributed on an "AS IS" BASIS,
11
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- See the License for the specific language governing permissions and
13
- limitations under the License.
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
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
21
+ THE SOFTWARE.
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Bootstrap for Sass
2
2
 
3
- [![Build Status](https://secure.travis-ci.org/thomas-mcdonald/bootstrap-sass.png?branch=master)](http://travis-ci.org/thomas-mcdonald/bootstrap-sass) [![Code Climate](https://codeclimate.com/github/thomas-mcdonald/bootstrap-sass.png)](https://codeclimate.com/github/thomas-mcdonald/bootstrap-sass)
3
+ [![Build Status](https://secure.travis-ci.org/twbs/bootstrap-sass.png?branch=master)](http://travis-ci.org/twbs/bootstrap-sass)
4
4
 
5
5
  `bootstrap-sass` is a Sass-powered version of [Bootstrap](http://github.com/twbs/bootstrap), ready to drop right into your Sass powered applications.
6
6
 
@@ -16,7 +16,7 @@ In your Gemfile you need to add the `bootstrap-sass` gem, and ensure that the `s
16
16
 
17
17
  ```ruby
18
18
  gem 'sass-rails', '>= 3.2' # sass-rails needs to be higher than 3.2
19
- gem 'bootstrap-sass', '~> 3.0.3.0'
19
+ gem 'bootstrap-sass', '~> 3.1.0'
20
20
  ```
21
21
 
22
22
  `bundle install` and restart your server to make the files available through the pipeline.
@@ -59,13 +59,12 @@ Require the gem, and load paths and Sass helpers will be configured automaticall
59
59
  require 'bootstrap-sass'
60
60
  ```
61
61
 
62
- When using outside ruby (e.g. as a bower package), disable ruby asset lookup helper:
62
+ Using bootstrap-sass as a Bower package is still being tested. You can install it with:
63
63
 
64
- ```sass
65
- $bootstrap-sass-asset-helper: false
64
+ ```bash
65
+ bower install 'git://github.com/twbs/bootstrap-sass.git#v3.1.0'
66
66
  ```
67
67
 
68
-
69
68
  #### JS and fonts
70
69
 
71
70
  If you are using Rails or Sprockets, see Usage.
@@ -112,8 +111,8 @@ You can also include optional bootstrap theme:
112
111
  @import "bootstrap/theme";
113
112
  ```
114
113
 
115
- The full list of bootstrap variables can be found [here](http://getbootstrap.com/customize/#less-variables). You can override these by simply redefining the variable before the `@import` directive.
116
- For example:
114
+ The full list of bootstrap variables can be found [here](http://getbootstrap.com/customize/#less-variables). You can override these by simply redefining the variable before the `@import` directive, e.g.:
115
+
117
116
  ```scss
118
117
  $navbar-default-bg: #312312;
119
118
  $light-orange: #ff8c00;
@@ -125,18 +124,19 @@ $navbar-default-color: $light-orange;
125
124
  You can also import components explicitly. To start with a full list of modules copy this file from the gem:
126
125
 
127
126
  ```bash
128
- cp $(bundle show bootstrap-sass)/vendor/assets/stylesheets/bootstrap/bootstrap.scss \
129
- vendor/assets/stylesheets/bootstrap-custom.scss
127
+ # copy and prepend "bootstrap/" to the @import paths:
128
+ sed 's/@import "/@import "bootstrap\//' \
129
+ $(bundle show bootstrap-sass)/vendor/assets/stylesheets/bootstrap/bootstrap.scss > \
130
+ app/assets/stylesheets/bootstrap-custom.scss
130
131
  ```
132
+ Comment out components you do not want from `bootstrap-custom`.
131
133
 
132
- In your `application.sass`, replace `@import 'bootstrap'` with:
134
+ In `application.sass`, replace `@import 'bootstrap'` with:
133
135
 
134
136
  ```scss
135
137
  @import 'bootstrap-custom';
136
138
  ```
137
139
 
138
- Comment out any modules you don't need from `bootstrap-custom`.
139
-
140
140
  ### Javascript
141
141
 
142
142
  We have a helper that includes all Bootstrap javascripts. If you use Rails (or Sprockets separately),
@@ -207,8 +207,8 @@ bootstrap-sass is used to build some awesome projects all over the web, includin
207
207
  Michael Hartl's [Rails Tutorial](http://railstutorial.org/), [gitlabhq](http://gitlabhq.com/) and
208
208
  [kandan](http://kandanapp.com/).
209
209
 
210
- [converter]: https://github.com/thomas-mcdonald/bootstrap-sass/blob/3/tasks/converter.rb
211
- [version]: https://github.com/thomas-mcdonald/bootstrap-sass/blob/3/lib/bootstrap-sass/version.rb
212
- [contrib]: https://github.com/thomas-mcdonald/bootstrap-sass/graphs/contributors
213
- [antirequire]: https://github.com/thomas-mcdonald/bootstrap-sass/issues/79#issuecomment-4428595
210
+ [converter]: https://github.com/twbs/bootstrap-sass/blob/3/tasks/converter.rb
211
+ [version]: https://github.com/twbs/bootstrap-sass/blob/3/lib/bootstrap-sass/version.rb
212
+ [contrib]: https://github.com/twbs/bootstrap-sass/graphs/contributors
213
+ [antirequire]: https://github.com/twbs/bootstrap-sass/issues/79#issuecomment-4428595
214
214
  [jsdocs]: http://getbootstrap.com/javascript/#transitions
data/Rakefile CHANGED
@@ -19,8 +19,13 @@ end
19
19
  desc 'Convert bootstrap to bootstrap-sass'
20
20
  task :convert, :branch do |t, args|
21
21
  require './tasks/converter'
22
- branch = args[:branch]
23
- Converter.new(branch).process
22
+ Converter.new(branch: args[:branch]).process_bootstrap
23
+ end
24
+
25
+ desc 'LESS to stdin -> Sass to stdout'
26
+ task :less_to_scss, :branch do |t, args|
27
+ require './tasks/converter'
28
+ puts Converter.new(branch: args[:branch]).convert_less(STDIN.read)
24
29
  end
25
30
 
26
31
  desc 'Compile bootstrap-sass to tmp/ (or first arg)'
@@ -3,25 +3,25 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
  require 'bootstrap-sass/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = "bootstrap-sass"
7
- s.version = Bootstrap::VERSION
8
- s.authors = ["Thomas McDonald"]
9
- s.email = 'tom@conceptcoding.co.uk'
10
- s.summary = "Twitter's Bootstrap, converted to Sass and ready to drop into Rails or Compass"
11
- s.homepage = "http://github.com/thomas-mcdonald/bootstrap-sass"
12
- s.license = "Apache 2.0"
6
+ s.name = "bootstrap-sass"
7
+ s.version = Bootstrap::VERSION
8
+ s.authors = ["Thomas McDonald"]
9
+ s.email = 'tom@conceptcoding.co.uk'
10
+ s.summary = "Twitter's Bootstrap, converted to Sass and ready to drop into Rails or Compass"
11
+ s.homepage = "https://github.com/twbs/bootstrap-sass"
12
+ s.license = 'MIT'
13
13
 
14
14
  s.add_development_dependency 'compass'
15
15
  s.add_development_dependency 'term-ansicolor'
16
16
  s.add_development_dependency 'sass-rails', '>= 3.2'
17
- s.add_runtime_dependency 'sass', '~> 3.2'
18
-
17
+ s.add_runtime_dependency 'sass', '~> 3.2'
19
18
 
20
19
  s.add_development_dependency 'capybara'
21
20
  s.add_development_dependency 'poltergeist'
22
21
  s.add_development_dependency 'tzinfo'
23
22
  s.add_development_dependency 'jquery-rails'
24
23
  s.add_development_dependency 'slim-rails'
24
+ s.add_development_dependency 'uglifier'
25
25
 
26
26
  s.files = `git ls-files`.split("\n")
27
27
  s.test_files = `git ls-files -- test/*`.split("\n")
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "bootstrap-sass",
3
+ "version": "3.1.0",
4
+ "homepage": "https://github.com/twbs/bootstrap-sass",
5
+ "authors": [
6
+ "Thomas McDonald",
7
+ "Tristan Harward",
8
+ "Peter Gumeson",
9
+ "Gleb Mazovetskiy"
10
+ ],
11
+ "description": "bootstrap-sass is a Sass-powered version of Bootstrap, ready to drop right into your Sass powered applications.",
12
+ "main": ["vendor/assets/stylesheets/bootstrap.scss", "vendor/assets/javascripts/bootstrap.js"],
13
+ "keywords": [
14
+ "twbs",
15
+ "bootstrap",
16
+ "sass"
17
+ ],
18
+ "license": "MIT",
19
+ "ignore": [
20
+ "**/.*", "lib", "tasks", "templates", "test", "*.gemspec", "Rakefile", "Gemfile"
21
+ ]
22
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "twbs/bootstrap-sass",
3
+ "description": "bootstrap-sass is a Sass-powered version of Bootstrap, ready to drop right into your Sass powered applications.",
4
+ "keywords": ["bootstrap", "css", "sass"],
5
+ "homepage": "http://github.com/twbs/bootstrap",
6
+ "authors": [
7
+ {
8
+ "name": "Thomas McDonald"
9
+ },
10
+ {
11
+ "name": "Tristan Harward"
12
+ },
13
+ {
14
+ "name": "Peter Gumeson"
15
+ },
16
+ {
17
+ "name": "Gleb Mazovetskiy"
18
+ },
19
+ {
20
+ "name": "Mark Otto"
21
+ },
22
+ {
23
+ "name": "Jacob Thornton"
24
+ }
25
+ ],
26
+ "support": {
27
+ "issues": "https://github.com/twbs/bootstrap-sass/issues"
28
+ },
29
+ "license": "MIT",
30
+ "extra": {
31
+ "branch-alias": {
32
+ "dev-master": "3.1.x-dev"
33
+ }
34
+ }
35
+ }
@@ -1,6 +1,4 @@
1
1
  module Bootstrap
2
- class FrameworkNotFound < StandardError; end
3
-
4
2
  class << self
5
3
  # Inspired by Kaminari
6
4
  def load!
@@ -54,7 +52,7 @@ module Bootstrap
54
52
  def configure_sass
55
53
  ::Sass.load_paths << stylesheets_path
56
54
 
57
- # bootstrap requires minimum precision of 10, see https://github.com/thomas-mcdonald/bootstrap-sass/issues/409
55
+ # bootstrap requires minimum precision of 10, see https://github.com/twbs/bootstrap-sass/issues/409
58
56
  ::Sass::Script::Number.precision = [10, ::Sass::Script::Number.precision].max
59
57
  end
60
58
 
@@ -13,17 +13,18 @@ module Sass::Script::Functions
13
13
  declare :twbs_image_path, [:source]
14
14
 
15
15
  def twbs_asset_path(source, type)
16
+ return Sass::Script::String.new('', :string) if source.to_s.empty?
16
17
  url = if Bootstrap.asset_pipeline? && (context = sprockets_context)
17
18
  context.send(:"#{type}_path", source.value)
18
19
  elsif Bootstrap.compass?
19
- send(:"#{type}_url", source, Sass::Script::Bool.new(true)).value
20
+ send(:"#{type}_url", source, Sass::Script::Bool.new(true)).value.sub /url\((.*)\)$/, '\1'
20
21
  end
21
22
 
22
23
  # sass-only
23
24
  url ||= source.value.gsub('"', '')
24
25
  Sass::Script::String.new(url, :string)
25
26
  end
26
- declare :twbs_asset_path, [:source]
27
+ declare :twbs_asset_path, [:source, :type]
27
28
 
28
29
  unless Sass::Script::Functions.instance_methods.include?(:ie_hex_str)
29
30
  # polyfill sass < 3.2.6 (taken from sass 3.2.12):
@@ -46,4 +47,4 @@ module Sass::Script::Functions
46
47
  importer.context
47
48
  end
48
49
  end
49
- end
50
+ end
@@ -1,4 +1,4 @@
1
1
  module Bootstrap
2
- VERSION = '3.0.3.0'
3
- BOOTSTRAP_SHA = '6d03173a1aad98e75f7d33e65b411c519176c59a'
2
+ VERSION = '3.1.0.0'
3
+ BOOTSTRAP_SHA = '1409cde7e800ca83fd761f87e5ad8f0d259e38d1'
4
4
  end
@@ -34,25 +34,31 @@ class Converter
34
34
  include JsConversion
35
35
  include FontsConversion
36
36
 
37
- def initialize(branch)
38
- @git_data_api_host = 'https://api.github.com/repos'
39
- @git_raw_host = 'https://raw.github.com'
40
-
41
- @repo = 'twbs/bootstrap'
42
- @repo_url = "https://github.com/#@repo"
37
+ def initialize(repo: 'twbs/bootstrap', branch: 'master', save_to: {}, cache_path: 'tmp/converter-cache-bootstrap')
38
+ @logger = Logger.new
39
+ @repo = repo
43
40
  @branch = branch || 'master'
44
41
  @branch_sha = get_branch_sha
45
- @save_at = { js: 'vendor/assets/javascripts/bootstrap',
46
- scss: 'vendor/assets/stylesheets/bootstrap',
47
- fonts: 'vendor/assets/fonts/bootstrap' }
48
- @save_at.each { |_,v| FileUtils.mkdir_p(v) }
49
- @cache_path = 'tmp/converter-cache'
50
- @logger = Logger.new(repo: @repo_url, branch: @branch, branch_sha: @branch_sha, save_at: @save_at, cache_path: @cache_path)
42
+ @cache_path = cache_path
43
+ @repo_url = "https://github.com/#@repo"
44
+ @save_to = {
45
+ js: 'vendor/assets/javascripts/bootstrap',
46
+ scss: 'vendor/assets/stylesheets/bootstrap',
47
+ fonts: 'vendor/assets/fonts/bootstrap'}.merge(save_to)
51
48
  end
52
49
 
53
- def_delegators :@logger, :log_status, :log_processing, :log_transform, :log_file_info, :log_processed, :log_http_get_file, :log_http_get_files, :silence_log
50
+ def_delegators :@logger, :log, :log_status, :log_processing, :log_transform, :log_file_info, :log_processed, :log_http_get_file, :log_http_get_files, :silence_log
51
+
52
+ def process_bootstrap
53
+ log_status "Convert Bootstrap LESS to SASS"
54
+ puts " repo : #@repo_url"
55
+ puts " branch : #@branch_sha #@repo_url/tree/#@branch"
56
+ puts " save to: #{@save_to.to_json}"
57
+ puts " twbs cache: #{@cache_path}"
58
+ puts '-' * 60
59
+
60
+ @save_to.each { |_, v| FileUtils.mkdir_p(v) }
54
61
 
55
- def process
56
62
  process_stylesheet_assets
57
63
  process_javascript_assets
58
64
  process_font_assets
@@ -65,7 +71,7 @@ class Converter
65
71
 
66
72
  # Update version.rb file with BOOTSTRAP_SHA
67
73
  def store_version
68
- path = 'lib/bootstrap-sass/version.rb'
74
+ path = 'lib/bootstrap-sass/version.rb'
69
75
  content = File.read(path).sub(/BOOTSTRAP_SHA\s*=\s*['"][\w]+['"]/, "BOOTSTRAP_SHA = '#@branch_sha'")
70
76
  File.open(path, 'w') { |f| f.write(content) }
71
77
  end
@@ -3,10 +3,14 @@ class Converter
3
3
  def process_font_assets
4
4
  log_status 'Processing fonts...'
5
5
  files = read_files('fonts', bootstrap_font_files)
6
- save_at = @save_at[:fonts]
6
+ save_to = @save_to[:fonts]
7
7
  files.each do |name, content|
8
- save_file "#{save_at}/#{name}", content
8
+ save_file "#{save_to}/#{name}", content
9
9
  end
10
10
  end
11
+
12
+ def bootstrap_font_files
13
+ @bootstrap_font_files ||= get_paths_by_type('fonts', /\.(eot|svg|ttf|woff)$/)
14
+ end
11
15
  end
12
- end
16
+ end
@@ -2,9 +2,9 @@ class Converter
2
2
  module JsConversion
3
3
  def process_javascript_assets
4
4
  log_status 'Processing javascripts...'
5
- save_at = @save_at[:js]
5
+ save_to = @save_to[:js]
6
6
  read_files('js', bootstrap_js_files).each do |name, file|
7
- save_file("#{save_at}/#{name}", file)
7
+ save_file("#{save_to}/#{name}", file)
8
8
  end
9
9
  log_processed "#{bootstrap_js_files * ' '}"
10
10
 
@@ -18,5 +18,22 @@ class Converter
18
18
  save_file(path, content)
19
19
  log_processed path
20
20
  end
21
+
22
+ def bootstrap_js_files
23
+ @bootstrap_js_files ||= begin
24
+ files = get_paths_by_type 'js', /\.js$/
25
+ files.sort_by { |f|
26
+ case f
27
+ # tooltip depends on popover and must be loaded earlier
28
+ when /tooltip/ then
29
+ 1
30
+ when /popover/ then
31
+ 2
32
+ else
33
+ 0
34
+ end
35
+ }
36
+ end
37
+ end
21
38
  end
22
- end
39
+ end
@@ -9,9 +9,9 @@ require_relative 'char_string_scanner'
9
9
  class Converter
10
10
  module LessConversion
11
11
  # Some regexps for matching bits of SCSS:
12
- selector_char = '\[\]$\w\-{}#,.:&>@'
12
+ SELECTOR_CHAR = '\[\]$\w\-{}#,.:&>@'
13
13
  # 1 selector (the part before the {)
14
- SELECTOR_RE = /[#{selector_char}]+[#{selector_char}\s]*/
14
+ SELECTOR_RE = /[#{SELECTOR_CHAR}]+[#{SELECTOR_CHAR}\s]*/
15
15
  # 1 // comment
16
16
  COMMENT_RE = %r((?:^[ \t]*//[^\n]*\n))
17
17
  # 1 {, except when part of @{ and #{
@@ -36,19 +36,30 @@ class Converter
36
36
  transition transition-duration transition-property transition-transform box-shadow
37
37
  )
38
38
 
39
+ # Convert a snippet of bootstrap LESS to Scss
40
+ def convert_less(less)
41
+ load_shared
42
+ less = convert_to_scss(less)
43
+ less = yield(less) if block_given?
44
+ less
45
+ end
46
+
47
+ def load_shared
48
+ @shared_mixins ||= begin
49
+ log_status ' Reading shared mixins from mixins.less'
50
+ read_mixins read_files('less', ['mixins.less'])['mixins.less'], nested: NESTED_MIXINS
51
+ end
52
+ end
53
+
39
54
  def process_stylesheet_assets
40
- log_status "Processing stylesheets..."
55
+ log_status 'Processing stylesheets...'
41
56
  files = read_files('less', bootstrap_less_files)
42
57
 
43
- # read common mixin definitions (incl. nested mixins) from mixins.less
44
- read_shared_mixins! files['mixins.less']
45
- @shared_mixins << 'make-grid'
46
-
47
- # convert each file
58
+ log_status ' Converting LESS files to Scss:'
48
59
  files.each do |name, file|
49
60
  log_processing name
50
61
  # apply common conversions
51
- file = convert_to_scss(file)
62
+ file = convert_less(file)
52
63
  case name
53
64
  when 'mixins.less'
54
65
  NESTED_MIXINS.each do |selector, prefix|
@@ -56,10 +67,12 @@ class Converter
56
67
  end
57
68
  file = varargify_mixin_definitions(file, *VARARG_MIXINS)
58
69
  file = deinterpolate_vararg_mixins(file)
59
- file = parameterize_mixin_parent_selector file, 'responsive-(in)?visibility'
60
- file = parameterize_mixin_parent_selector file, 'input-size'
70
+ %w(responsive-(in)?visibility input-size).each do |mixin|
71
+ file = parameterize_mixin_parent_selector file, mixin
72
+ end
61
73
  file = replace_ms_filters(file)
62
- file = replace_all file, /\.\$state/, '.#{$state}'
74
+ file = replace_all file, /(?<=[.-])\$state/, '#{$state}'
75
+ file = replace_rules(file, ' .list-group-item-') { |rule| extract_nested_rule rule, 'a&' }
63
76
  file = replace_all file, /,\s*\.open \.dropdown-toggle& \{(.*?)\}/m,
64
77
  " {\\1}\n .open & { &.dropdown-toggle {\\1} }"
65
78
  file = convert_grid_mixins file
@@ -69,16 +82,19 @@ class Converter
69
82
  file = replace_rules(file, ' @media') { |r| unindent(r, 2) }
70
83
  when 'variables.less'
71
84
  file = insert_default_vars(file)
72
- file = <<-SCSS + file
73
- // bootstrap specific variable. set to false if not using ruby + asset pipeline / compass.
74
- $bootstrap-sass-asset-helper: true !default;
85
+ file = unindent <<-SCSS + file, 14
86
+ // a flag to toggle asset pipeline / compass integration
87
+ // defaults to true if twbs-font-path function is present (no function => twbs-font-path('') parsed as string == right side)
88
+ // in Sass 3.3 this can be improved with: function-exists(twbs-font-path)
89
+ $bootstrap-sass-asset-helper: (twbs-font-path("") != unquote('twbs-font-path("")')) !default;
75
90
  SCSS
76
91
  file = replace_all file, /(\$icon-font-path:).*(!default)/, '\1 "bootstrap/" \2'
77
92
  when 'close.less'
78
93
  # extract .close { button& {...} } rule
79
94
  file = extract_nested_rule file, 'button&'
80
95
  when 'dropdowns.less'
81
- file = replace_all file, /(\s*)@extend \.pull-right-dropdown-menu;/, "\\1right: 0;\\1left: auto;"
96
+ file = replace_all file, /@extend \.dropdown-menu-right;/, 'right: 0; left: auto;'
97
+ file = replace_all file, /@extend \.dropdown-menu-left;/, 'left: 0; right: auto;'
82
98
  when 'forms.less'
83
99
  file = extract_nested_rule file, 'textarea&'
84
100
  file = apply_mixin_parent_selector(file, '\.input-(?:sm|lg)')
@@ -89,40 +105,48 @@ $bootstrap-sass-asset-helper: true !default;
89
105
  when 'thumbnails.less'
90
106
  file = extract_nested_rule file, 'a&'
91
107
  when 'glyphicons.less'
92
- file = replace_all file, /\#\{(url\(.*?\))}/, '\1'
108
+ file = replace_all file, /\#\{(url\(.*?\))}/, '\1'
93
109
  file = replace_rules(file, '@font-face') { |rule|
94
- rule = replace_all rule, /(\$icon-font-\w+)/, '#{\1}'
110
+ rule = replace_all rule, /(\$icon-font(?:-\w+)+)/, '#{\1}'
95
111
  replace_asset_url rule, :font
96
112
  }
97
113
  end
98
114
 
99
115
  name = name.sub(/\.less$/, '.scss')
100
- save_at = @save_at[:scss]
101
- path = "#{save_at}/#{'_' unless name == 'bootstrap.scss'}#{name}"
116
+ save_to = @save_to[:scss]
117
+ path = "#{save_to}/#{'_' unless name == 'bootstrap.scss'}#{name}"
102
118
  save_file(path, file)
103
119
  log_processed File.basename(path)
104
120
  end
105
121
  end
106
122
 
123
+ def bootstrap_less_files
124
+ @bootstrap_less_files ||= get_paths_by_type('less', /\.less$/)
125
+ end
126
+
107
127
  # apply general less to scss conversion
108
128
  def convert_to_scss(file)
109
- # mixins may also be defined in the file. get mixin names before doing any processing
110
- mixin_names = (@shared_mixins + get_mixin_names(file)).uniq
111
- file = replace_vars(file)
112
- file = replace_file_imports(file)
113
- file = replace_mixin_definitions file
114
- file = replace_mixins file, mixin_names
115
- # replace_less_extend does not seem to do anything. @glebm
116
- file = replace_less_extend(file)
117
- file = replace_spin(file)
118
- file = replace_image_urls(file)
119
- file = replace_escaping(file)
120
- file = convert_less_ampersand(file)
121
- file = deinterpolate_vararg_mixins(file)
122
- file = replace_calculation_semantics(file)
129
+ # get local mixin names before converting the definitions
130
+ mixins = @shared_mixins + read_mixins(file)
131
+ file = replace_vars(file)
132
+ file = replace_file_imports(file)
133
+ file = replace_mixin_definitions(file)
134
+ file = replace_mixins(file, mixins)
135
+ file = replace_spin(file)
136
+ file = replace_image_urls(file)
137
+ file = replace_escaping(file)
138
+ file = convert_less_ampersand(file)
139
+ file = deinterpolate_vararg_mixins(file)
140
+ file = replace_calculation_semantics(file)
141
+ file = replace_redundant_ampersands(file)
123
142
  file
124
143
  end
125
144
 
145
+ # a&:hover => a:hover
146
+ def replace_redundant_ampersands(file)
147
+ file.gsub /([\w+])&([:\w]+)/, '\1\2'
148
+ end
149
+
126
150
  def replace_asset_url(rule, type)
127
151
  replace_all rule, /url\((.*?)\)/, "url(if($bootstrap-sass-asset-helper, twbs-#{type}-path(\\1), \\1))"
128
152
  end
@@ -178,23 +202,23 @@ $bootstrap-sass-asset-helper: true !default;
178
202
  # We need to keep a list of shared mixin names in order to convert the includes correctly
179
203
  # Before doing any processing we read shared mixins from a file
180
204
  # If a mixin is nested, it gets prefixed in the list (e.g. #gradient > .horizontal to 'gradient-horizontal')
181
- def read_shared_mixins!(mixins_file)
182
- log_status " Reading shared mixins from mixins.less"
183
- @shared_mixins = get_mixin_names(mixins_file, silent: true)
184
- NESTED_MIXINS.each do |selector, prefix|
205
+ def read_mixins(mixins_file, nested: {})
206
+ mixins = get_mixin_names(mixins_file, silent: true)
207
+ nested.each do |selector, prefix|
185
208
  # we use replace_rules without replacing anything just to use the parsing algorithm
186
209
  replace_rules(mixins_file, selector) { |rule|
187
- @shared_mixins += get_mixin_names(unindent(unwrap_rule_block(rule)), silent: true).map { |name| "#{prefix}-#{name}" }
210
+ mixins += get_mixin_names(unindent(unwrap_rule_block(rule)), silent: true).map { |name| "#{prefix}-#{name}" }
188
211
  rule
189
212
  }
190
213
  end
191
- @shared_mixins.sort!
192
- log_file_info "shared mixins: #{@shared_mixins * ', '}"
193
- @shared_mixins
214
+ mixins.uniq!
215
+ mixins.sort!
216
+ log_file_info "mixins: #{mixins * ', '}" unless mixins.empty?
217
+ mixins
194
218
  end
195
219
 
196
220
  def get_mixin_names(file, opts = {})
197
- names = get_css_selectors(file).join("\n" * 2).scan(/^\.([\w-]+)\(#{LESS_MIXIN_DEF_ARGS_RE}\)[ ]*\{/).map(&:first).uniq.sort
221
+ names = get_css_selectors(file).join("\n" * 2).scan(/^\.([\w-]+)\(#{LESS_MIXIN_DEF_ARGS_RE}\)(?: when.*?)?[ ]*\{/).map(&:first).uniq.sort
198
222
  log_file_info "mixin defs: #{names * ', '}" unless opts[:silent] || names.empty?
199
223
  names
200
224
  end
@@ -240,7 +264,7 @@ $bootstrap-sass-asset-helper: true !default;
240
264
  prop, vals = $1, split_prop_val.call($2)
241
265
  next m unless vals.length >= 2 && vals.any? { |v| v =~ /^[\+\-]\$/ }
242
266
  transformed = vals.map { |v| v.strip =~ %r(^\(.*\)$) ? v : "(#{v})" }
243
- log_transform "property #{prop}: #{transformed * ' '}"
267
+ log_transform "property #{prop}: #{transformed * ' '}", from: 'wrap_calculation'
244
268
  "#{prop}: #{transformed * ' '};"
245
269
  end
246
270
  end
@@ -248,7 +272,7 @@ $bootstrap-sass-asset-helper: true !default;
248
272
  end
249
273
 
250
274
  # @import "file.less" to "#{target_path}file;"
251
- def replace_file_imports(less, target_path = 'bootstrap/')
275
+ def replace_file_imports(less, target_path = '')
252
276
  less.gsub %r([@\$]import ["|']([\w-]+).less["|'];),
253
277
  %Q(@import "#{target_path}\\1";)
254
278
  end
@@ -266,7 +290,7 @@ $bootstrap-sass-asset-helper: true !default;
266
290
  def parameterize_mixin_parent_selector(file, rule_sel)
267
291
  log_transform rule_sel
268
292
  param = '$parent'
269
- replace_rules(file, '^[ \t]*@mixin\s*' + rule_sel) do |mxn_css|
293
+ replace_rules(file, '^\s*@mixin\s*' + rule_sel) do |mxn_css|
270
294
  mxn_css.sub! /(?=@mixin)/, "// [converter] $parent hack\n"
271
295
  # insert param into mixin def
272
296
  mxn_css.sub!(/(@mixin [\w-]+)\(([\$\w\-,\s]*)\)/) { "#{$1}(#{param}#{', ' if $2 && !$2.empty?}#{$2})" }
@@ -309,7 +333,7 @@ $bootstrap-sass-asset-helper: true !default;
309
333
  replace_rules file, '\s*' + rule_sel, comments: false do |rule, rule_pos, css|
310
334
  body = unwrap_rule_block(rule.dup).strip
311
335
  next rule unless body =~ /^@include \w+/m || body =~ /^@media/ && body =~ /\{\s*@include/
312
- rule =~ /(#{COMMENT_RE}*)(#{SELECTOR_RE})\{/
336
+ rule =~ /(#{COMMENT_RE}*)([#{SELECTOR_CHAR}]+?)\s*#{RULE_OPEN_BRACE_RE}/
313
337
  cmt, sel = $1, $2.strip
314
338
  # take one up selector chain if this is an &. selector
315
339
  if sel.start_with?('&')
@@ -333,13 +357,14 @@ $bootstrap-sass-asset-helper: true !default;
333
357
  end
334
358
  end
335
359
 
336
- # Replaces the following:
337
- # .mixin() -> @include mixin()
338
- # #scope > .mixin() -> @include scope-mixin()
360
+ # @include and @extend from LESS:
361
+ # .mixin() -> @include mixin()
362
+ # #scope > .mixin() -> @include scope-mixin()
363
+ # &:extend(.mixin all) -> @include mixin()
339
364
  def replace_mixins(less, mixin_names)
340
365
  mixin_pattern = /(\s+)(([#|\.][\w-]+\s*>\s*)*)\.([\w-]+\(.*\))(?!\s\{)/
341
366
 
342
- less.gsub(mixin_pattern) do |match|
367
+ less = less.gsub(mixin_pattern) do |match|
343
368
  matches = match.scan(mixin_pattern).flatten
344
369
  scope = matches[1] || ''
345
370
  if scope != ''
@@ -352,6 +377,17 @@ $bootstrap-sass-asset-helper: true !default;
352
377
  "#{matches.first}@extend .#{scope}#{matches.last.gsub(/\(\)/, '')}"
353
378
  end
354
379
  end
380
+
381
+ less.gsub /&:extend\((#{SELECTOR_RE}) all\)/ do
382
+ selector = $1
383
+ selector =~ /\.([\w-]+)/
384
+ mixin = $1
385
+ if mixin && mixin_names.include?(mixin)
386
+ "@include #{mixin}()"
387
+ else
388
+ "@extend #{selector}"
389
+ end
390
+ end
355
391
  end
356
392
 
357
393
  # change Microsoft filters to SASS calling convention
@@ -389,13 +425,6 @@ $bootstrap-sass-asset-helper: true !default;
389
425
  less
390
426
  end
391
427
 
392
- # #gradient > .horizontal()
393
- # to:
394
- # @include .horizontal-gradient()
395
- def replace_less_extend(less)
396
- less.gsub(/\#(\w+) \> \.([\w-]*)(\(.*\));?/, '@include \1-\2\3;')
397
- end
398
-
399
428
  def replace_spin(less)
400
429
  less.gsub(/(?![\-$@.])spin(?!-)/, 'adjust-hue')
401
430
  end
@@ -484,7 +513,7 @@ $bootstrap-sass-asset-helper: true !default;
484
513
  options = {comments: true}.merge(options || {})
485
514
  less = less.dup
486
515
  s = CharStringScanner.new(less)
487
- rule_re = /(?:#{rule_prefix}[^{]*#{RULE_OPEN_BRACE_RE})/
516
+ rule_re = /(?:#{rule_prefix}[#{SELECTOR_CHAR})=(\s]*?#{RULE_OPEN_BRACE_RE})/
488
517
  if options[:comments]
489
518
  rule_start_re = /(?:#{COMMENT_RE}*)^#{rule_re}/
490
519
  else
@@ -564,7 +593,7 @@ $bootstrap-sass-asset-helper: true !default;
564
593
  # get the pos of css def at pos (search backwards)
565
594
  def css_def_pos(css, pos, depth = -1)
566
595
  to = open_brace_pos(css, pos, depth)
567
- prev_def = to - (css[0..to].reverse.index('}') || to) + 1
596
+ prev_def = to - (css[0..to].reverse.index(RULE_CLOSE_BRACE_RE_REVERSE) || to) + 1
568
597
  from = prev_def + 1 + (css[prev_def + 1..-1] =~ %r(^\s*[^\s/]))
569
598
  (from..to - 1)
570
599
  end