bootstrap-sass 3.3.1.0 → 3.3.6

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.
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
+