bootstrap-sass 3.3.1.0 → 3.3.6

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 (109) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +8 -8
  3. data/CHANGELOG.md +44 -0
  4. data/CONTRIBUTING.md +8 -1
  5. data/Gemfile +1 -1
  6. data/LICENSE +1 -1
  7. data/README.md +69 -49
  8. data/Rakefile +46 -4
  9. data/assets/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
  10. data/assets/fonts/bootstrap/glyphicons-halflings-regular.svg +273 -214
  11. data/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
  12. data/assets/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
  13. data/assets/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
  14. data/assets/javascripts/bootstrap/affix.js +7 -7
  15. data/assets/javascripts/bootstrap/alert.js +3 -3
  16. data/assets/javascripts/bootstrap/button.js +14 -10
  17. data/assets/javascripts/bootstrap/carousel.js +11 -14
  18. data/assets/javascripts/bootstrap/collapse.js +9 -9
  19. data/assets/javascripts/bootstrap/dropdown.js +49 -45
  20. data/assets/javascripts/bootstrap/modal.js +45 -32
  21. data/assets/javascripts/bootstrap/popover.js +9 -20
  22. data/assets/javascripts/bootstrap/scrollspy.js +18 -21
  23. data/assets/javascripts/bootstrap/tab.js +7 -5
  24. data/assets/javascripts/bootstrap/tooltip.js +82 -46
  25. data/assets/javascripts/bootstrap/transition.js +2 -2
  26. data/assets/javascripts/bootstrap-sprockets.js +2 -2
  27. data/assets/javascripts/bootstrap.js +1210 -1151
  28. data/assets/javascripts/bootstrap.min.js +7 -0
  29. data/assets/stylesheets/_bootstrap-compass.scss +2 -0
  30. data/assets/stylesheets/_bootstrap-mincer.scss +4 -2
  31. data/assets/stylesheets/_bootstrap-sprockets.scss +2 -0
  32. data/assets/stylesheets/_bootstrap.scss +6 -0
  33. data/assets/stylesheets/bootstrap/_alerts.scss +5 -0
  34. data/assets/stylesheets/bootstrap/_badges.scss +7 -2
  35. data/assets/stylesheets/bootstrap/_breadcrumbs.scss +3 -1
  36. data/assets/stylesheets/bootstrap/_button-groups.scss +5 -4
  37. data/assets/stylesheets/bootstrap/_buttons.scss +14 -6
  38. data/assets/stylesheets/bootstrap/_carousel.scss +16 -13
  39. data/assets/stylesheets/bootstrap/_close.scss +1 -0
  40. data/assets/stylesheets/bootstrap/_component-animations.scss +1 -2
  41. data/assets/stylesheets/bootstrap/_dropdowns.scss +6 -3
  42. data/assets/stylesheets/bootstrap/_forms.scss +98 -29
  43. data/assets/stylesheets/bootstrap/_glyphicons.scss +83 -10
  44. data/assets/stylesheets/bootstrap/_input-groups.scss +8 -3
  45. data/assets/stylesheets/bootstrap/_jumbotron.scss +8 -3
  46. data/assets/stylesheets/bootstrap/_list-group.scss +9 -3
  47. data/assets/stylesheets/bootstrap/_media.scss +19 -0
  48. data/assets/stylesheets/bootstrap/_mixins.scss +1 -0
  49. data/assets/stylesheets/bootstrap/_modals.scss +4 -2
  50. data/assets/stylesheets/bootstrap/_navbar.scss +1 -1
  51. data/assets/stylesheets/bootstrap/_navs.scss +0 -2
  52. data/assets/stylesheets/bootstrap/_normalize.scss +8 -11
  53. data/assets/stylesheets/bootstrap/_pagination.scss +4 -3
  54. data/assets/stylesheets/bootstrap/_panels.scss +11 -1
  55. data/assets/stylesheets/bootstrap/_popovers.scss +4 -8
  56. data/assets/stylesheets/bootstrap/_print.scss +0 -6
  57. data/assets/stylesheets/bootstrap/_responsive-embed.scss +8 -8
  58. data/assets/stylesheets/bootstrap/_responsive-utilities.scss +8 -3
  59. data/assets/stylesheets/bootstrap/_scaffolding.scss +11 -0
  60. data/assets/stylesheets/bootstrap/_tables.scss +3 -3
  61. data/assets/stylesheets/bootstrap/_theme.scss +26 -7
  62. data/assets/stylesheets/bootstrap/_tooltip.scss +4 -6
  63. data/assets/stylesheets/bootstrap/_type.scss +2 -2
  64. data/assets/stylesheets/bootstrap/_utilities.scss +0 -1
  65. data/assets/stylesheets/bootstrap/_variables.scss +20 -10
  66. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +2 -1
  67. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +19 -6
  68. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +2 -2
  69. data/assets/stylesheets/bootstrap/mixins/_grid.scss +4 -4
  70. data/assets/stylesheets/bootstrap/mixins/_hide-text.scss +3 -3
  71. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +3 -2
  72. data/assets/stylesheets/bootstrap/mixins/_opacity.scss +1 -1
  73. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +2 -1
  74. data/assets/stylesheets/bootstrap/mixins/_reset-text.scss +18 -0
  75. data/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss +1 -1
  76. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +2 -1
  77. data/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss +3 -3
  78. data/bootstrap-sass.gemspec +9 -9
  79. data/bower.json +5 -19
  80. data/composer.json +1 -1
  81. data/lib/bootstrap-sass/engine.rb +6 -1
  82. data/lib/bootstrap-sass/version.rb +2 -2
  83. data/lib/bootstrap-sass.rb +27 -5
  84. data/package.json +6 -6
  85. data/sache.json +1 -1
  86. data/tasks/bower.rake +2 -5
  87. data/tasks/converter/fonts_conversion.rb +1 -1
  88. data/tasks/converter/js_conversion.rb +7 -5
  89. data/tasks/converter/less_conversion.rb +41 -29
  90. data/tasks/converter/network.rb +10 -5
  91. data/tasks/converter.rb +1 -1
  92. data/templates/project/_bootstrap-variables.sass +20 -11
  93. data/templates/project/styles.sass +3 -0
  94. data/test/dummy_rails/app/assets/stylesheets/{application.css.sass → application.sass} +0 -0
  95. data/test/dummy_rails/app/views/pages/root.html.slim +43 -0
  96. data/test/dummy_rails/config/application.rb +1 -1
  97. data/test/dummy_rails/config/environments/development.rb +0 -3
  98. data/test/dummy_rails/config/environments/production.rb +7 -1
  99. data/test/dummy_rails/config/environments/test.rb +9 -1
  100. data/test/dummy_sass_only/Gemfile +1 -1
  101. data/test/gemfiles/rails_head.gemfile +17 -0
  102. data/test/node_mincer_test.rb +2 -3
  103. data/test/node_sass_compile_test.sh +2 -2
  104. data/test/sprockets_rails_test.rb +1 -1
  105. data/test/support/reporting.rb +10 -0
  106. data/test/test_helper.rb +1 -1
  107. metadata +36 -34
  108. data/test/dummy_rails/log/development.log +0 -0
  109. data/test/gemfiles/sass_3_2.gemfile +0 -6
@@ -5,7 +5,12 @@ module Bootstrap
5
5
  %w(stylesheets javascripts fonts images).each do |sub|
6
6
  app.config.assets.paths << root.join('assets', sub).to_s
7
7
  end
8
- app.config.assets.precompile << %r(bootstrap/glyphicons-halflings-regular\.(?:eot|svg|ttf|woff)$)
8
+
9
+ # sprockets-rails 3 tracks down the calls to `font_path` and `image_path`
10
+ # and automatically precompiles the referenced assets.
11
+ unless Sprockets::Rails::VERSION.split('.', 2)[0].to_i >= 3
12
+ app.config.assets.precompile << %r(bootstrap/glyphicons-halflings-regular\.(?:eot|svg|ttf|woff2?)$)
13
+ end
9
14
  end
10
15
  end
11
16
  end
@@ -1,4 +1,4 @@
1
1
  module Bootstrap
2
- VERSION = '3.3.1.0'
3
- BOOTSTRAP_SHA = '9a7e365c2c4360335d25246dac11afb1f577210a'
2
+ VERSION = '3.3.6'
3
+ BOOTSTRAP_SHA = '81df608a40bf0629a1dc08e584849bb1e43e0b7a'
4
4
  end
@@ -4,7 +4,15 @@ module Bootstrap
4
4
  # Inspired by Kaminari
5
5
  def load!
6
6
  register_compass_extension if compass?
7
- register_rails_engine if rails?
7
+
8
+ if rails?
9
+ register_rails_engine
10
+ elsif lotus?
11
+ register_lotus
12
+ elsif sprockets?
13
+ register_sprockets
14
+ end
15
+
8
16
  configure_sass
9
17
  end
10
18
 
@@ -30,18 +38,22 @@ module Bootstrap
30
38
  end
31
39
 
32
40
  # Environment detection helpers
33
- def asset_pipeline?
41
+ def sprockets?
34
42
  defined?(::Sprockets)
35
43
  end
36
44
 
37
45
  def compass?
38
- defined?(::Compass)
46
+ defined?(::Compass::Frameworks)
39
47
  end
40
48
 
41
49
  def rails?
42
50
  defined?(::Rails)
43
51
  end
44
52
 
53
+ def lotus?
54
+ defined?(::Lotus)
55
+ end
56
+
45
57
  private
46
58
 
47
59
  def configure_sass
@@ -49,8 +61,8 @@ module Bootstrap
49
61
 
50
62
  ::Sass.load_paths << stylesheets_path
51
63
 
52
- # bootstrap requires minimum precision of 10, see https://github.com/twbs/bootstrap-sass/issues/409
53
- ::Sass::Script::Number.precision = [10, ::Sass::Script::Number.precision].max
64
+ # bootstrap requires minimum precision of 8, see https://github.com/twbs/bootstrap-sass/issues/409
65
+ ::Sass::Script::Number.precision = [8, ::Sass::Script::Number.precision].max
54
66
  end
55
67
 
56
68
  def register_compass_extension
@@ -66,6 +78,16 @@ module Bootstrap
66
78
  def register_rails_engine
67
79
  require 'bootstrap-sass/engine'
68
80
  end
81
+
82
+ def register_lotus
83
+ Lotus::Assets.sources << assets_path
84
+ end
85
+
86
+ def register_sprockets
87
+ Sprockets.append_path(stylesheets_path)
88
+ Sprockets.append_path(fonts_path)
89
+ Sprockets.append_path(javascripts_path)
90
+ end
69
91
  end
70
92
  end
71
93
 
data/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "bootstrap-sass",
3
- "version": "3.3.1",
4
- "description": "bootstrap-sass is a Sass-powered version of Bootstrap, ready to drop right into your Sass powered applications.",
5
- "main": "index.js",
3
+ "version": "3.3.6",
4
+ "description": "bootstrap-sass is a Sass-powered version of Bootstrap 3, ready to drop right into your Sass powered applications.",
5
+ "main": "assets/javascripts/bootstrap.js",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git://github.com/twbs/bootstrap-sass"
@@ -23,8 +23,8 @@
23
23
  "url": "https://github.com/twbs/bootstrap-sass/issues"
24
24
  },
25
25
  "devDependencies": {
26
- "node-sass": "~1.0",
27
- "mincer": "~1.1",
28
- "ejs": "~1.0"
26
+ "node-sass": "~3.4.2",
27
+ "mincer": "~1.3",
28
+ "ejs": "~2.3"
29
29
  }
30
30
  }
data/sache.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "bootstrap-sass",
3
- "description": "bootstrap-sass is a Sass-powered version of Bootstrap, ready to drop right into your Sass powered applications",
3
+ "description": "bootstrap-sass is a Sass-powered version of Bootstrap 3, ready to drop right into your Sass powered applications.",
4
4
  "tags": ["bootstrap", "grid", "typography", "buttons", "ui", "responsive-web-design"]
5
5
  }
data/tasks/bower.rake CHANGED
@@ -15,16 +15,13 @@ namespace :bower do
15
15
  require 'bootstrap-sass'
16
16
  Dir.chdir Bootstrap.gem_path do
17
17
  spec = JSON.parse(File.read 'bower.json')
18
- js_paths = File.read(File.join Bootstrap.javascripts_path, 'bootstrap-sprockets.js').lines.map do |line|
19
- line.strip if line.sub!(%r(//\s*=\s*require\s*(?:./)?(.*)\s*), 'assets/javascripts/\1.js')
20
- end.compact
21
18
 
22
19
  spec['main'] =
23
20
  find_files.(File.join(Bootstrap.stylesheets_path, '_bootstrap.scss')) +
24
21
  find_files.(Bootstrap.fonts_path) +
25
- js_paths
22
+ %w(assets/javascripts/bootstrap.js)
26
23
 
27
- spec['version'] = Bootstrap::VERSION[0..-3]
24
+ spec['version'] = Bootstrap::VERSION
28
25
 
29
26
  File.open('bower.json', 'w') do |f|
30
27
  f.puts JSON.pretty_generate(spec)
@@ -10,7 +10,7 @@ class Converter
10
10
  end
11
11
 
12
12
  def bootstrap_font_files
13
- @bootstrap_font_files ||= get_paths_by_type('fonts', /\.(eot|svg|ttf|woff)$/)
13
+ @bootstrap_font_files ||= get_paths_by_type('fonts', /\.(eot|svg|ttf|woff2?)$/)
14
14
  end
15
15
  end
16
16
  end
@@ -12,14 +12,16 @@ class Converter
12
12
 
13
13
  log_status 'Updating javascript manifest'
14
14
  manifest = ''
15
- cat = ''
16
15
  bootstrap_js_files.each do |name|
17
- cat << contents[name] + "\n"
18
16
  name = name.gsub(/\.js$/, '')
19
17
  manifest << "//= require ./bootstrap/#{name}\n"
20
18
  end
21
- {'assets/javascripts/bootstrap-sprockets.js' => manifest,
22
- 'assets/javascripts/bootstrap.js' => cat}.each do |path, content|
19
+ dist_js = read_files('dist/js', %w(bootstrap.js bootstrap.min.js))
20
+ {
21
+ 'assets/javascripts/bootstrap-sprockets.js' => manifest,
22
+ 'assets/javascripts/bootstrap.js' => dist_js['bootstrap.js'],
23
+ 'assets/javascripts/bootstrap.min.js' => dist_js['bootstrap.min.js'],
24
+ }.each do |path, content|
23
25
  save_file path, content
24
26
  log_processed path
25
27
  end
@@ -27,7 +29,7 @@ class Converter
27
29
 
28
30
  def bootstrap_js_files
29
31
  @bootstrap_js_files ||= begin
30
- files = get_paths_by_type 'js', /\.js$/
32
+ files = get_paths_by_type('js', /\.js$/).reject { |path| path =~ %r(^tests/) }
31
33
  files.sort_by { |f|
32
34
  case f
33
35
  # tooltip depends on popover and must be loaded earlier
@@ -1,4 +1,5 @@
1
1
  require_relative 'char_string_scanner'
2
+ require 'bootstrap-sass/version'
2
3
 
3
4
  # This is the script used to automatically convert all of twbs/bootstrap LESS to Sass.
4
5
  #
@@ -95,16 +96,17 @@ class Converter
95
96
  file = apply_mixin_parent_selector file, '\.(?:visible|hidden)'
96
97
  when 'variables.less'
97
98
  file = insert_default_vars(file)
98
- file = unindent <<-SCSS + "\n" + file, 14
99
- // When true, asset path helpers are used, otherwise the regular CSS `url()` is used.
100
- // When there no function is defined, `fn('')` is parsed as string that equals the right hand side
101
- // NB: in Sass 3.3 there is a native function: function-exists(twbs-font-path)
102
- $bootstrap-sass-asset-helper: #{sass_fn_exists('twbs-font-path')} !default;
103
- SCSS
99
+ file = ['$bootstrap-sass-asset-helper: false !default;', file].join("\n")
104
100
  file = replace_all file, %r{(\$icon-font-path): \s*"(.*)" (!default);}, "\n" + unindent(<<-SCSS, 14)
105
- // [converter] Asset helpers such as Sprockets and Node.js Mincer do not resolve relative paths
101
+ // [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.
102
+ // [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.
106
103
  \\1: if($bootstrap-sass-asset-helper, "bootstrap/", "\\2bootstrap/") \\3;
107
104
  SCSS
105
+ when 'breadcrumbs.less'
106
+ file = replace_all file, /(.*)(\\00a0)/, unindent(<<-SCSS, 8) + "\\1\#{$nbsp}"
107
+ // [converter] Workaround for https://github.com/sass/libsass/issues/1115
108
+ $nbsp: "\\2";
109
+ SCSS
108
110
  when 'close.less'
109
111
  # extract .close { button& {...} } rule
110
112
  file = extract_nested_rule file, 'button&'
@@ -114,14 +116,17 @@ class Converter
114
116
  when 'forms.less'
115
117
  file = extract_nested_rule file, 'textarea&'
116
118
  file = apply_mixin_parent_selector(file, '\.input-(?:sm|lg)')
119
+ file = replace_rules file, /\.form-group-(?:sm|lg)/ do |rule|
120
+ apply_mixin_parent_selector rule, '.form-control'
121
+ end
117
122
  when 'navbar.less'
118
123
  file = replace_all file, /(\s*)\.navbar-(right|left)\s*\{\s*@extend\s*\.pull-(right|left);\s*/, "\\1.navbar-\\2 {\\1 float: \\2 !important;\\1"
119
124
  when 'tables.less'
120
125
  file = replace_all file, /(@include\s*table-row-variant\()(\w+)/, "\\1'\\2'"
121
- when 'thumbnails.less', 'labels.less', 'badges.less'
126
+ when 'thumbnails.less', 'labels.less', 'badges.less', 'buttons.less'
122
127
  file = extract_nested_rule file, 'a&'
123
128
  when 'glyphicons.less'
124
- file = replace_rules(file, '@font-face') { |rule|
129
+ file = replace_rules(file, /\s*@font-face/) { |rule|
125
130
  rule = replace_all rule, /(\$icon-font(?:-\w+)+)/, '#{\1}'
126
131
  replace_asset_url rule, :font
127
132
  }
@@ -146,13 +151,11 @@ class Converter
146
151
  # generate variables template
147
152
  save_file 'templates/project/_bootstrap-variables.sass',
148
153
  "// Override Bootstrap variables here (defaults from bootstrap-sass v#{Bootstrap::VERSION}):\n\n" +
149
- File.read("#{save_to}/_variables.scss").gsub(/^(?=\$)/, '// ').gsub(/ !default;/, '')
154
+ File.read("#{save_to}/_variables.scss").lines[1..-1].join.gsub(/^(?=\$)/, '// ').gsub(/ !default;/, '')
150
155
  end
151
156
 
152
157
  def bootstrap_less_files
153
- @bootstrap_less_files ||= get_paths_by_type('less', /\.less$/) +
154
- get_paths_by_type('mixins', /\.less$/,
155
- get_tree(get_tree_sha('mixins', get_tree(get_tree_sha('less'))))).map { |p| "mixins/#{p}" }
158
+ @bootstrap_less_files ||= get_paths_by_type('less', /\.less$/)
156
159
  end
157
160
 
158
161
  # apply general less to scss conversion
@@ -171,9 +174,16 @@ class Converter
171
174
  file = deinterpolate_vararg_mixins(file)
172
175
  file = replace_calculation_semantics(file)
173
176
  file = replace_file_imports(file)
177
+ file = wrap_at_groups_with_at_root(file)
174
178
  file
175
179
  end
176
180
 
181
+ def wrap_at_groups_with_at_root(file)
182
+ replace_rules(file, /@(?:font-face|-ms-viewport)/) { |rule, _pos|
183
+ %Q(@at-root {\n#{indent rule, 2}\n})
184
+ }
185
+ end
186
+
177
187
  def sass_fn_exists(fn)
178
188
  %Q{(#{fn}("") != unquote('#{fn}("")'))}
179
189
  end
@@ -206,7 +216,7 @@ class Converter
206
216
  SASS
207
217
  end
208
218
 
209
- # convert grid mixins LESS when => SASS @if
219
+ # convert grid mixins LESS when => Sass @if
210
220
  def convert_grid_mixins(file)
211
221
  file = replace_rules file, /@mixin make-grid-columns/, comments: false do |css, pos|
212
222
  mixin_all_grid_columns css, selector: '.col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}', to: '$grid-columns'
@@ -263,8 +273,8 @@ SASS
263
273
 
264
274
  # margin: a -b
265
275
  # LESS: sets 2 values
266
- # SASS: sets 1 value (a-b)
267
- # This wraps a and -b so they evaluates to 2 values in SASS
276
+ # Sass: sets 1 value (a-b)
277
+ # This wraps a and -b so they evaluates to 2 values in Sass
268
278
  def replace_calculation_semantics(file)
269
279
  # split_prop_val.call('(@navbar-padding-vertical / 2) -@navbar-padding-horizontal')
270
280
  # #=> ["(navbar-padding-vertical / 2)", "-navbar-padding-horizontal"]
@@ -384,8 +394,10 @@ SASS
384
394
  end
385
395
  # unwrap, and replace @include
386
396
  unindent unwrap_rule_block(rule).gsub(/(@include [\w-]+)\(?([\$\w\-,\s]*)\)?/) {
387
- args = $2
388
- "#{cmt}#{$1}('#{sel.gsub(/\s+/, ' ')}'#{', ' if args && !args.empty?}#{args})"
397
+ name, args = $1, $2
398
+ sel.gsub(/\s+/, ' ').split(/,\s*/ ).map { |sel_part|
399
+ "#{cmt}#{name}('#{sel_part}'#{', ' if args && !args.empty?}#{args})"
400
+ }.join(";\n")
389
401
  }
390
402
  end
391
403
  end
@@ -424,16 +436,16 @@ SASS
424
436
  # #scope > .mixin() -> @include scope-mixin()
425
437
  # &:extend(.mixin all) -> @include mixin()
426
438
  def replace_mixins(less, mixin_names)
427
- mixin_pattern = /(\s+)(([#|\.][\w-]+\s*>\s*)*)\.([\w-]+\(.*\))(?!\s\{)/
428
-
429
- less = less.gsub(mixin_pattern) do |match|
430
- matches = match.scan(mixin_pattern).flatten
431
- scope = matches[1] && matches[1] != '' ? matches[1].scan(/[\w-]+/).join('-') + '-' : ''
432
- mixin_name = match.scan(/\.([\w-]+)\(.*\)\s?\{?/).first
433
- if mixin_name && mixin_names.include?("#{scope}#{mixin_name.first}")
434
- "#{matches.first}@include #{scope}#{matches.last.gsub(/;\s*\$/, ', $').sub(/;\)$/, ')').sub(/\(\)$/, '')}"
439
+ mixin_pattern = /(?<=^|\s)((?:[#|\.][\w-]+\s*>\s*)*)\.([\w-]+)\((.*)\)(?!\s\{)/
440
+
441
+ less = less.gsub(mixin_pattern) do |_|
442
+ scope, name, args = $1, $2, $3
443
+ scope = scope.scan(/[\w-]+/).join('-') + '-' unless scope.empty?
444
+ args = "(#{args.tr(';', ',')})" unless args.empty?
445
+ if name && mixin_names.include?("#{scope}#{name}")
446
+ "@include #{scope}#{name}#{args}"
435
447
  else
436
- "#{matches.first}@extend .#{scope}#{matches.last.gsub(/\(\)/, '')}"
448
+ "@extend .#{scope}#{name}"
437
449
  end
438
450
  end
439
451
 
@@ -449,7 +461,7 @@ SASS
449
461
  end
450
462
  end
451
463
 
452
- # change Microsoft filters to SASS calling convention
464
+ # change Microsoft filters to Sass calling convention
453
465
  def replace_ms_filters(file)
454
466
  log_transform
455
467
  file.gsub(
@@ -497,7 +509,7 @@ SASS
497
509
  end
498
510
 
499
511
  def replace_escaping(less)
500
- less = less.gsub(/~"([^"]+)"/, '#{\1}') # Get rid of ~"" escape
512
+ less = less.gsub(/~"([^"]+)"/, '\1').gsub(/~'([^']+)'/, '\1') # Get rid of ~"" escape
501
513
  less.gsub!(/\$\{([^}]+)\}/, '$\1') # Get rid of @{} escape
502
514
  less.gsub!(/"([^"\n]*)(\$[\w\-]+)([^"\n]*)"/, '"\1#{\2}\3"') # interpolate variable in string, e.g. url("$file-1x") => url("#{$file-1x}")
503
515
  less.gsub(/(\W)e\(%\("?([^"]*)"?\)\)/, '\1\2') # Get rid of e(%("")) escape
@@ -3,8 +3,12 @@ class Converter
3
3
  module Network
4
4
  protected
5
5
 
6
- def get_paths_by_type(dir, file_re, tree = get_tree(get_tree_sha(dir)))
7
- tree['tree'].select { |f| f['type'] == 'blob' && f['path'] =~ file_re }.map { |f| f['path'] }
6
+ def get_paths_by_type(dir, file_re, recursive = true)
7
+ get_file_paths(dir, recursive).select { |path| path =~ file_re }
8
+ end
9
+
10
+ def get_file_paths(dir, recursive = true)
11
+ get_tree(get_tree_sha(dir), recursive)['tree'].select { |f| f['type'] == 'blob' }.map { |f| f['path'] }
8
12
  end
9
13
 
10
14
  def read_files(path, files)
@@ -44,7 +48,8 @@ class Converter
44
48
 
45
49
 
46
50
  def get_file(url)
47
- cache_path = "./#@cache_path#{URI(url).path}"
51
+ uri = URI(url)
52
+ cache_path = "./#@cache_path#{uri.path}#{uri.query.tr('?&=', '-') if uri.query}"
48
53
  FileUtils.mkdir_p File.dirname(cache_path)
49
54
  if File.exists?(cache_path)
50
55
  log_http_get_file url, true
@@ -81,8 +86,8 @@ class Converter
81
86
  @trees ||= get_tree(@branch_sha)
82
87
  end
83
88
 
84
- def get_tree(sha)
85
- get_json("https://api.github.com/repos/#@repo/git/trees/#{sha}")
89
+ def get_tree(sha, recursive = true)
90
+ get_json("https://api.github.com/repos/#@repo/git/trees/#{sha}#{'?recursive=1' if recursive}")
86
91
  end
87
92
 
88
93
  def get_json(url)
data/tasks/converter.rb CHANGED
@@ -50,7 +50,7 @@ class Converter
50
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
51
 
52
52
  def process_bootstrap
53
- log_status "Convert Bootstrap LESS to SASS"
53
+ log_status "Convert Bootstrap LESS to Sass"
54
54
  puts " repo : #@repo_url"
55
55
  puts " branch : #@branch_sha #@repo_url/tree/#@branch"
56
56
  puts " save to: #{@save_to.to_json}"
@@ -1,9 +1,4 @@
1
- // Override Bootstrap variables here (defaults from bootstrap-sass v3.3.1.0):
2
-
3
- // When true, asset path helpers are used, otherwise the regular CSS `url()` is used.
4
- // When there no function is defined, `fn('')` is parsed as string that equals the right hand side
5
- // NB: in Sass 3.3 there is a native function: function-exists(twbs-font-path)
6
- // $bootstrap-sass-asset-helper: (twbs-font-path("") != unquote('twbs-font-path("")'))
1
+ // Override Bootstrap variables here (defaults from bootstrap-sass v3.3.6):
7
2
 
8
3
  //
9
4
  // Variables
@@ -21,7 +16,7 @@
21
16
  // $gray-light: lighten($gray-base, 46.7%) // #777
22
17
  // $gray-lighter: lighten($gray-base, 93.5%) // #eee
23
18
 
24
- // $brand-primary: darken(#428bca, 6.5%)
19
+ // $brand-primary: darken(#428bca, 6.5%) // #337ab7
25
20
  // $brand-success: #5cb85c
26
21
  // $brand-info: #5bc0de
27
22
  // $brand-warning: #f0ad4e
@@ -84,7 +79,8 @@
84
79
 
85
80
  //** Load fonts from this directory.
86
81
 
87
- // [converter] Asset helpers such as Sprockets and Node.js Mincer do not resolve relative paths
82
+ // [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.
83
+ // [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.
88
84
  // $icon-font-path: if($bootstrap-sass-asset-helper, "bootstrap/", "../fonts/bootstrap/")
89
85
 
90
86
  //** File name for all font files.
@@ -109,7 +105,7 @@
109
105
  // $padding-xs-vertical: 1px
110
106
  // $padding-xs-horizontal: 5px
111
107
 
112
- // $line-height-large: 1.33
108
+ // $line-height-large: 1.3333333 // extra decimals for Win 8.1 Chrome
113
109
  // $line-height-small: 1.5
114
110
 
115
111
  // $border-radius-base: 4px
@@ -180,6 +176,11 @@
180
176
 
181
177
  // $btn-link-disabled-color: $gray-light
182
178
 
179
+ // Allows for customizing button radius independently from global border radius
180
+ // $btn-border-radius-base: $border-radius-base
181
+ // $btn-border-radius-large: $border-radius-large
182
+ // $btn-border-radius-small: $border-radius-small
183
+
183
184
 
184
185
  //== Forms
185
186
  //
@@ -197,6 +198,7 @@
197
198
 
198
199
  // TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
199
200
  //** Default `.form-control` border radius
201
+ // This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.
200
202
  // $input-border-radius: $border-radius-base
201
203
  //** Large `.form-control` border radius
202
204
  // $input-border-radius-large: $border-radius-large
@@ -216,6 +218,9 @@
216
218
  //** Small `.form-control` height
217
219
  // $input-height-small: (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2)
218
220
 
221
+ //** `.form-group` margin
222
+ // $form-group-margin-bottom: 15px
223
+
219
224
  // $legend-color: $gray-dark
220
225
  // $legend-border-color: #e5e5e5
221
226
 
@@ -275,7 +280,8 @@
275
280
  // $zindex-popover: 1060
276
281
  // $zindex-tooltip: 1070
277
282
  // $zindex-navbar-fixed: 1030
278
- // $zindex-modal: 1040
283
+ // $zindex-modal-background: 1040
284
+ // $zindex-modal: 1050
279
285
 
280
286
 
281
287
  //== Media queries breakpoints
@@ -388,7 +394,7 @@
388
394
  // $navbar-default-toggle-border-color: #ddd
389
395
 
390
396
 
391
- // Inverted navbar
397
+ //=== Inverted navbar
392
398
  // Reset inverted navbar basics
393
399
  // $navbar-inverse-color: lighten($gray-light, 15%)
394
400
  // $navbar-inverse-bg: #222
@@ -489,6 +495,7 @@
489
495
  // $jumbotron-bg: $gray-lighter
490
496
  // $jumbotron-heading-color: inherit
491
497
  // $jumbotron-font-size: ceil(($font-size-base * 1.5))
498
+ // $jumbotron-heading-font-size: ceil(($font-size-base * 4.5))
492
499
 
493
500
 
494
501
  //== Form states and alerts
@@ -862,5 +869,7 @@
862
869
  // $page-header-border-color: $gray-lighter
863
870
  //** Width of horizontal description list titles
864
871
  // $dl-horizontal-offset: $component-offset-horizontal
872
+ //** Point at which .dl-horizontal becomes horizontal
873
+ // $dl-horizontal-breakpoint: $grid-float-breakpoint
865
874
  //** Horizontal line color.
866
875
  // $hr-border: $gray-lighter
@@ -1,3 +1,6 @@
1
+ // Import Bootstrap Compass integration
1
2
  @import "bootstrap-compass"
3
+ // Import custom Bootstrap variables
2
4
  @import "bootstrap-variables"
5
+ // Import Bootstrap for Sass
3
6
  @import "bootstrap"
@@ -1,3 +1,46 @@
1
+ .navbar.navbar-inverse: .container-fluid
2
+ .navbar-header
3
+ button.navbar-toggle.collapsed type="button" data-toggle="collapse" data-target="#c1"
4
+ span.sr-only Toggle navigation
5
+ span.icon-bar
6
+ span.icon-bar
7
+ span.icon-bar
8
+ a.navbar-brand href="#" Bootstrap for Sass Test Rails App
9
+ .collapse.navbar-collapse#c1
10
+ ul.nav.navbar-nav
11
+ li.active: a href="#"
12
+ ' Home
13
+ span.sr-only (current)
14
+ li: a href="#" Link
15
+ li.dropdown
16
+ a.dropdown-toggle href="#" data-toggle="dropdown" role="button" aria-expanded="false"
17
+ ' Dropdown
18
+ span.caret
19
+ ul.dropdown-menu role="menu"
20
+ li: a href="#" Action
21
+ li: a href="#" Another action
22
+ li: a href="#" Something else here
23
+ li.divider
24
+ li: a href="#" Separated link
25
+ li.divider
26
+ li: a href="#" One more separated link
27
+ form.navbar-form.navbar-left role="search"
28
+ .input-group
29
+ input.form-control type="search" placeholder="Search..."
30
+ .input-group-btn: button.btn.btn-primary type="submit" Go
31
+ ul.nav.navbar-nav.navbar-right
32
+ li: a href="#" Link
33
+ li.dropdown
34
+ a.dropdown-toggle href="#" data-toggle="dropdown" role="button" aria-expanded="false"
35
+ ' Dropdown
36
+ span.caret
37
+ ul.dropdown-menu role="menu"
38
+ li: a href="#" Action
39
+ li: a href="#" Another action
40
+ li: a href="#" Something else here
41
+ li.divider
42
+ li: a href="#" Separated link
43
+
1
44
  .container
2
45
  .panel.panel-primary
3
46
  .panel-heading: h1 Dummy App
@@ -12,13 +12,13 @@ end
12
12
 
13
13
  require 'slim-rails'
14
14
  require 'jquery-rails'
15
- require 'compass'
16
15
  require 'bootstrap-sass'
17
16
  require 'uglifier'
18
17
 
19
18
  module Dummy
20
19
  class Application < Rails::Application
21
20
  config.assets.enabled = true if config.assets.respond_to?(:enabled)
21
+ config.assets.precompile += %w( application.css application.js )
22
22
  config.to_prepare do
23
23
  if ENV['VERBOSE']
24
24
  STDERR.puts "Loaded Rails #{Rails::VERSION::STRING}, Sprockets #{Sprockets::VERSION}",
@@ -16,9 +16,6 @@ Dummy::Application.configure do
16
16
  # Print deprecation notices to the Rails logger.
17
17
  config.active_support.deprecation = :log
18
18
 
19
- # Raise an error on page load if there are pending migrations
20
- config.active_record.migration_error = :page_load
21
-
22
19
  # Debug mode disables concatenation and preprocessing of assets.
23
20
  # This option may cause significant delays in view rendering with a large
24
21
  # number of complex assets.
@@ -20,7 +20,13 @@ Dummy::Application.configure do
20
20
  # config.action_dispatch.rack_cache = true
21
21
 
22
22
  # Disable Rails's static asset server (Apache or nginx will already do this).
23
- config.serve_static_assets = false
23
+ if config.respond_to?(:serve_static_files)
24
+ # rails >= 4.2
25
+ config.serve_static_files = true
26
+ elsif config.respond_to?(:serve_static_assets)
27
+ # rails < 4.2
28
+ config.serve_static_assets = true
29
+ end
24
30
 
25
31
  # Compress JavaScripts and CSS.
26
32
  config.assets.js_compressor = :uglifier
@@ -13,7 +13,13 @@ Dummy::Application.configure do
13
13
  config.eager_load = false
14
14
 
15
15
  # Configure static asset server for tests with Cache-Control for performance.
16
- config.serve_static_assets = true
16
+ if config.respond_to?(:serve_static_files)
17
+ # rails >= 4.2
18
+ config.serve_static_files = true
19
+ elsif config.respond_to?(:serve_static_assets)
20
+ # rails < 4.2
21
+ config.serve_static_assets = true
22
+ end
17
23
  config.static_cache_control = "public, max-age=3600"
18
24
 
19
25
  # Show full error reports and disable caching.
@@ -26,5 +32,7 @@ Dummy::Application.configure do
26
32
  # Disable request forgery protection in test environment.
27
33
  config.action_controller.allow_forgery_protection = false
28
34
 
35
+ config.active_support.test_order = :random
36
+
29
37
  config.active_support.deprecation = :stderr
30
38
  end
@@ -1,4 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'sass', '~> 3.2'
3
+ gem 'sass', '~> 3.3'
4
4
  gem 'bootstrap-sass', path: '../..'
@@ -0,0 +1,17 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'actionpack', github: 'rails/rails'
4
+ gem 'activesupport', github: 'rails/rails'
5
+
6
+ # Required git dependencies as per https://github.com/rails/rails/blob/51211a94bd7a34d80f2412a7f94fefe7366647a5/Gemfile:
7
+ gem 'rack', github: 'rack/rack'
8
+ gem 'sprockets', github: 'rails/sprockets'
9
+ gem 'sprockets-rails', github: 'rails/sprockets-rails'
10
+ gem 'sass-rails', github: 'rails/sass-rails', branch: 'master'
11
+
12
+ gem 'autoprefixer-rails', github: 'ai/autoprefixer-rails'
13
+
14
+ gem 'compass', '~> 1.0.1', require: false
15
+
16
+ gemspec path: '../../'
17
+