bootstrap-sass-backport 3.2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.travis.yml +19 -0
  4. data/CHANGELOG.md +146 -0
  5. data/CONTRIBUTING.md +79 -0
  6. data/Gemfile +10 -0
  7. data/LICENSE +21 -0
  8. data/README.md +320 -0
  9. data/Rakefile +54 -0
  10. data/assets/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
  11. data/assets/fonts/bootstrap/glyphicons-halflings-regular.svg +229 -0
  12. data/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
  13. data/assets/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
  14. data/assets/images/.keep +0 -0
  15. data/assets/javascripts/bootstrap-sprockets.js +12 -0
  16. data/assets/javascripts/bootstrap.js +2107 -0
  17. data/assets/javascripts/bootstrap/affix.js +142 -0
  18. data/assets/javascripts/bootstrap/alert.js +92 -0
  19. data/assets/javascripts/bootstrap/button.js +110 -0
  20. data/assets/javascripts/bootstrap/carousel.js +223 -0
  21. data/assets/javascripts/bootstrap/collapse.js +170 -0
  22. data/assets/javascripts/bootstrap/dropdown.js +151 -0
  23. data/assets/javascripts/bootstrap/modal.js +280 -0
  24. data/assets/javascripts/bootstrap/popover.js +113 -0
  25. data/assets/javascripts/bootstrap/scrollspy.js +170 -0
  26. data/assets/javascripts/bootstrap/tab.js +128 -0
  27. data/assets/javascripts/bootstrap/tooltip.js +457 -0
  28. data/assets/javascripts/bootstrap/transition.js +59 -0
  29. data/assets/stylesheets/_bootstrap-compass.scss +7 -0
  30. data/assets/stylesheets/_bootstrap-mincer.scss +17 -0
  31. data/assets/stylesheets/_bootstrap-sprockets.scss +7 -0
  32. data/assets/stylesheets/_bootstrap.scss +50 -0
  33. data/assets/stylesheets/bootstrap/_alerts.scss +68 -0
  34. data/assets/stylesheets/bootstrap/_badges.scss +57 -0
  35. data/assets/stylesheets/bootstrap/_breadcrumbs.scss +26 -0
  36. data/assets/stylesheets/bootstrap/_button-groups.scss +240 -0
  37. data/assets/stylesheets/bootstrap/_buttons.scss +157 -0
  38. data/assets/stylesheets/bootstrap/_carousel.scss +243 -0
  39. data/assets/stylesheets/bootstrap/_close.scss +35 -0
  40. data/assets/stylesheets/bootstrap/_code.scss +68 -0
  41. data/assets/stylesheets/bootstrap/_component-animations.scss +35 -0
  42. data/assets/stylesheets/bootstrap/_dropdowns.scss +215 -0
  43. data/assets/stylesheets/bootstrap/_forms.scss +538 -0
  44. data/assets/stylesheets/bootstrap/_glyphicons.scss +237 -0
  45. data/assets/stylesheets/bootstrap/_grid.scss +84 -0
  46. data/assets/stylesheets/bootstrap/_input-groups.scss +166 -0
  47. data/assets/stylesheets/bootstrap/_jumbotron.scss +48 -0
  48. data/assets/stylesheets/bootstrap/_labels.scss +66 -0
  49. data/assets/stylesheets/bootstrap/_list-group.scss +131 -0
  50. data/assets/stylesheets/bootstrap/_media.scss +56 -0
  51. data/assets/stylesheets/bootstrap/_mixins.scss +39 -0
  52. data/assets/stylesheets/bootstrap/_modals.scss +150 -0
  53. data/assets/stylesheets/bootstrap/_navbar.scss +659 -0
  54. data/assets/stylesheets/bootstrap/_navs.scss +242 -0
  55. data/assets/stylesheets/bootstrap/_normalize.scss +425 -0
  56. data/assets/stylesheets/bootstrap/_pager.scss +55 -0
  57. data/assets/stylesheets/bootstrap/_pagination.scss +88 -0
  58. data/assets/stylesheets/bootstrap/_panels.scss +243 -0
  59. data/assets/stylesheets/bootstrap/_popovers.scss +133 -0
  60. data/assets/stylesheets/bootstrap/_print.scss +101 -0
  61. data/assets/stylesheets/bootstrap/_progress-bars.scss +105 -0
  62. data/assets/stylesheets/bootstrap/_responsive-embed.scss +34 -0
  63. data/assets/stylesheets/bootstrap/_responsive-utilities.scss +174 -0
  64. data/assets/stylesheets/bootstrap/_scaffolding.scss +150 -0
  65. data/assets/stylesheets/bootstrap/_tables.scss +233 -0
  66. data/assets/stylesheets/bootstrap/_theme.scss +258 -0
  67. data/assets/stylesheets/bootstrap/_thumbnails.scss +38 -0
  68. data/assets/stylesheets/bootstrap/_tooltip.scss +95 -0
  69. data/assets/stylesheets/bootstrap/_type.scss +304 -0
  70. data/assets/stylesheets/bootstrap/_utilities.scss +57 -0
  71. data/assets/stylesheets/bootstrap/_variables.scss +854 -0
  72. data/assets/stylesheets/bootstrap/_wells.scss +29 -0
  73. data/assets/stylesheets/bootstrap/mixins/_alerts.scss +14 -0
  74. data/assets/stylesheets/bootstrap/mixins/_background-variant.scss +11 -0
  75. data/assets/stylesheets/bootstrap/mixins/_border-radius.scss +18 -0
  76. data/assets/stylesheets/bootstrap/mixins/_buttons.scss +50 -0
  77. data/assets/stylesheets/bootstrap/mixins/_center-block.scss +7 -0
  78. data/assets/stylesheets/bootstrap/mixins/_clearfix.scss +22 -0
  79. data/assets/stylesheets/bootstrap/mixins/_forms.scss +84 -0
  80. data/assets/stylesheets/bootstrap/mixins/_gradients.scss +58 -0
  81. data/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +81 -0
  82. data/assets/stylesheets/bootstrap/mixins/_grid.scss +122 -0
  83. data/assets/stylesheets/bootstrap/mixins/_hide-text.scss +21 -0
  84. data/assets/stylesheets/bootstrap/mixins/_image.scss +34 -0
  85. data/assets/stylesheets/bootstrap/mixins/_labels.scss +12 -0
  86. data/assets/stylesheets/bootstrap/mixins/_list-group.scss +31 -0
  87. data/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +10 -0
  88. data/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss +9 -0
  89. data/assets/stylesheets/bootstrap/mixins/_opacity.scss +8 -0
  90. data/assets/stylesheets/bootstrap/mixins/_pagination.scss +23 -0
  91. data/assets/stylesheets/bootstrap/mixins/_panels.scss +24 -0
  92. data/assets/stylesheets/bootstrap/mixins/_progress-bar.scss +10 -0
  93. data/assets/stylesheets/bootstrap/mixins/_reset-filter.scss +8 -0
  94. data/assets/stylesheets/bootstrap/mixins/_resize.scss +6 -0
  95. data/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss +21 -0
  96. data/assets/stylesheets/bootstrap/mixins/_size.scss +10 -0
  97. data/assets/stylesheets/bootstrap/mixins/_tab-focus.scss +9 -0
  98. data/assets/stylesheets/bootstrap/mixins/_table-row.scss +28 -0
  99. data/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +11 -0
  100. data/assets/stylesheets/bootstrap/mixins/_text-overflow.scss +8 -0
  101. data/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss +219 -0
  102. data/bootstrap-sass-backport.gemspec +36 -0
  103. data/bower.json +50 -0
  104. data/composer.json +35 -0
  105. data/lib/bootstrap-sass-backport.rb +71 -0
  106. data/lib/bootstrap-sass/engine.rb +12 -0
  107. data/lib/bootstrap-sass/version.rb +4 -0
  108. data/package.json +30 -0
  109. data/sache.json +5 -0
  110. data/tasks/bower.rake +34 -0
  111. data/tasks/converter.rb +80 -0
  112. data/tasks/converter/char_string_scanner.rb +38 -0
  113. data/tasks/converter/fonts_conversion.rb +16 -0
  114. data/tasks/converter/js_conversion.rb +45 -0
  115. data/tasks/converter/less_conversion.rb +670 -0
  116. data/tasks/converter/logger.rb +57 -0
  117. data/tasks/converter/network.rb +86 -0
  118. data/templates/project/_bootstrap-variables.sass.erb +4 -0
  119. data/templates/project/manifest.rb +26 -0
  120. data/templates/project/styles.sass +3 -0
  121. data/test/compass_test.rb +9 -0
  122. data/test/compilation_test.rb +18 -0
  123. data/test/dummy_node_mincer/apple-touch-icon-144-precomposed.png +0 -0
  124. data/test/dummy_node_mincer/application.css.ejs.scss +6 -0
  125. data/test/dummy_node_mincer/manifest.js +87 -0
  126. data/test/dummy_rails/README.rdoc +3 -0
  127. data/test/dummy_rails/Rakefile +6 -0
  128. data/test/dummy_rails/app/assets/images/.keep +0 -0
  129. data/test/dummy_rails/app/assets/javascripts/application.js +2 -0
  130. data/test/dummy_rails/app/assets/stylesheets/application.css.sass +2 -0
  131. data/test/dummy_rails/app/controllers/application_controller.rb +5 -0
  132. data/test/dummy_rails/app/controllers/pages_controller.rb +4 -0
  133. data/test/dummy_rails/app/helpers/application_helper.rb +2 -0
  134. data/test/dummy_rails/app/views/layouts/application.html.erb +14 -0
  135. data/test/dummy_rails/app/views/pages/root.html.slim +41 -0
  136. data/test/dummy_rails/bin/bundle +3 -0
  137. data/test/dummy_rails/bin/rails +4 -0
  138. data/test/dummy_rails/bin/rake +4 -0
  139. data/test/dummy_rails/config.ru +4 -0
  140. data/test/dummy_rails/config/application.rb +30 -0
  141. data/test/dummy_rails/config/boot.rb +5 -0
  142. data/test/dummy_rails/config/environment.rb +5 -0
  143. data/test/dummy_rails/config/environments/development.rb +26 -0
  144. data/test/dummy_rails/config/environments/production.rb +76 -0
  145. data/test/dummy_rails/config/environments/test.rb +30 -0
  146. data/test/dummy_rails/config/initializers/backtrace_silencers.rb +7 -0
  147. data/test/dummy_rails/config/initializers/filter_parameter_logging.rb +4 -0
  148. data/test/dummy_rails/config/initializers/inflections.rb +16 -0
  149. data/test/dummy_rails/config/initializers/mime_types.rb +5 -0
  150. data/test/dummy_rails/config/initializers/secret_token.rb +18 -0
  151. data/test/dummy_rails/config/initializers/session_store.rb +3 -0
  152. data/test/dummy_rails/config/initializers/wrap_parameters.rb +14 -0
  153. data/test/dummy_rails/config/locales/en.yml +3 -0
  154. data/test/dummy_rails/config/locales/es.yml +3 -0
  155. data/test/dummy_rails/config/routes.rb +3 -0
  156. data/test/dummy_rails/db/test.sqlite3 +0 -0
  157. data/test/dummy_rails/lib/assets/.keep +0 -0
  158. data/test/dummy_rails/log/.keep +0 -0
  159. data/test/dummy_rails/public/404.html +58 -0
  160. data/test/dummy_rails/public/422.html +58 -0
  161. data/test/dummy_rails/public/500.html +57 -0
  162. data/test/dummy_rails/public/favicon.ico +0 -0
  163. data/test/dummy_sass_only/Gemfile +4 -0
  164. data/test/dummy_sass_only/compile.rb +13 -0
  165. data/test/dummy_sass_only/import_all.sass +2 -0
  166. data/test/gemfiles/sass_3_2.gemfile +6 -0
  167. data/test/gemfiles/sass_3_3.gemfile +6 -0
  168. data/test/gemfiles/sass_3_4.gemfile +7 -0
  169. data/test/gemfiles/sass_head.gemfile +6 -0
  170. data/test/node_mincer_test.rb +36 -0
  171. data/test/node_sass_test.rb +16 -0
  172. data/test/pages_test.rb +14 -0
  173. data/test/sass_test.rb +26 -0
  174. data/test/sprockets_rails_test.rb +27 -0
  175. data/test/support/dummy_rails_integration.rb +22 -0
  176. data/test/support/integration_test.rb +22 -0
  177. data/test/support/reporting.rb +17 -0
  178. data/test/test_helper.rb +35 -0
  179. data/test/test_helper_rails.rb +6 -0
  180. metadata +484 -0
@@ -0,0 +1,36 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'bootstrap-sass/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "bootstrap-sass-backport"
7
+ s.version = Bootstrap::VERSION
8
+ s.authors = ["Thomas McDonald", 'Michael Deering']
9
+ s.email = ['tom@conceptcoding.co.uk', 'mdeering@mdeering.com']
10
+ s.summary = "Backport to Rails 3 Twitter's Bootstrap, converted to Sass and ready to drop into Rails or Compass"
11
+ s.homepage = "https://github.com/mdeering/bootstrap-sass"
12
+ s.license = 'MIT'
13
+
14
+ s.add_runtime_dependency 'sass', '~> 3.2'
15
+
16
+ # Testing dependencies
17
+ s.add_development_dependency 'minitest', '~> 5.4.0'
18
+ s.add_development_dependency 'minitest-reporters', '~> 1.0.5'
19
+ # Integration testing
20
+ s.add_development_dependency 'capybara'
21
+ s.add_development_dependency 'poltergeist'
22
+ # Dummy Rails app dependencies
23
+ s.add_development_dependency 'actionpack', '>= 4.1.5'
24
+ s.add_development_dependency 'activesupport', '>= 4.1.5'
25
+ s.add_development_dependency 'json', '>= 1.8.1'
26
+ s.add_development_dependency 'sprockets-rails', '>= 2.1.3'
27
+ s.add_development_dependency 'autoprefixer-rails', '~> 1.1'
28
+ s.add_development_dependency 'jquery-rails', '>= 3.1.0'
29
+ s.add_development_dependency 'slim-rails'
30
+ s.add_development_dependency 'uglifier'
31
+ # Converter
32
+ s.add_development_dependency 'term-ansicolor'
33
+
34
+ s.files = `git ls-files`.split("\n")
35
+ s.test_files = `git ls-files -- test/*`.split("\n")
36
+ end
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "bootstrap-sass",
3
+ "version": "3.2.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": [
13
+ "assets/stylesheets/_bootstrap.scss",
14
+ "assets/fonts/bootstrap/glyphicons-halflings-regular.eot",
15
+ "assets/fonts/bootstrap/glyphicons-halflings-regular.svg",
16
+ "assets/fonts/bootstrap/glyphicons-halflings-regular.ttf",
17
+ "assets/fonts/bootstrap/glyphicons-halflings-regular.woff",
18
+ "assets/javascripts/bootstrap/affix.js",
19
+ "assets/javascripts/bootstrap/alert.js",
20
+ "assets/javascripts/bootstrap/button.js",
21
+ "assets/javascripts/bootstrap/carousel.js",
22
+ "assets/javascripts/bootstrap/collapse.js",
23
+ "assets/javascripts/bootstrap/dropdown.js",
24
+ "assets/javascripts/bootstrap/tab.js",
25
+ "assets/javascripts/bootstrap/transition.js",
26
+ "assets/javascripts/bootstrap/scrollspy.js",
27
+ "assets/javascripts/bootstrap/modal.js",
28
+ "assets/javascripts/bootstrap/tooltip.js",
29
+ "assets/javascripts/bootstrap/popover.js"
30
+ ],
31
+ "keywords": [
32
+ "twbs",
33
+ "bootstrap",
34
+ "sass"
35
+ ],
36
+ "license": "MIT",
37
+ "ignore": [
38
+ "**/.*",
39
+ "lib",
40
+ "tasks",
41
+ "templates",
42
+ "test",
43
+ "*.gemspec",
44
+ "Rakefile",
45
+ "Gemfile"
46
+ ],
47
+ "dependencies": {
48
+ "jquery": ">= 1.9.0"
49
+ }
50
+ }
@@ -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-sass",
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.2.x-dev"
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,71 @@
1
+ module Bootstrap
2
+ class << self
3
+ # Inspired by Kaminari
4
+ def load!
5
+ register_compass_extension if compass?
6
+ register_rails_engine if rails?
7
+
8
+ configure_sass
9
+ end
10
+
11
+ # Paths
12
+ def gem_path
13
+ @gem_path ||= File.expand_path '..', File.dirname(__FILE__)
14
+ end
15
+
16
+ def stylesheets_path
17
+ File.join assets_path, 'stylesheets'
18
+ end
19
+
20
+ def fonts_path
21
+ File.join assets_path, 'fonts'
22
+ end
23
+
24
+ def javascripts_path
25
+ File.join assets_path, 'javascripts'
26
+ end
27
+
28
+ def assets_path
29
+ @assets_path ||= File.join gem_path, 'assets'
30
+ end
31
+
32
+ # Environment detection helpers
33
+ def asset_pipeline?
34
+ defined?(::Sprockets)
35
+ end
36
+
37
+ def compass?
38
+ defined?(::Compass)
39
+ end
40
+
41
+ def rails?
42
+ defined?(::Rails)
43
+ end
44
+
45
+ private
46
+
47
+ def configure_sass
48
+ require 'sass'
49
+
50
+ ::Sass.load_paths << stylesheets_path
51
+
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
54
+ end
55
+
56
+ def register_compass_extension
57
+ ::Compass::Frameworks.register(
58
+ 'bootstrap',
59
+ :path => gem_path,
60
+ :stylesheets_directory => stylesheets_path,
61
+ :templates_directory => File.join(gem_path, 'templates')
62
+ )
63
+ end
64
+
65
+ def register_rails_engine
66
+ require 'bootstrap-sass/engine'
67
+ end
68
+ end
69
+ end
70
+
71
+ Bootstrap.load!
@@ -0,0 +1,12 @@
1
+ module Bootstrap
2
+ module Rails
3
+ class Engine < ::Rails::Engine
4
+ initializer 'bootstrap-sass.assets.precompile' do |app|
5
+ %w(stylesheets javascripts fonts images).each do |sub|
6
+ app.config.assets.paths << root.join('assets', sub)
7
+ end
8
+ app.config.assets.precompile << %r(bootstrap/glyphicons-halflings-regular\.(?:eot|svg|ttf|woff)$)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,4 @@
1
+ module Bootstrap
2
+ VERSION = '3.2.0.2'
3
+ BOOTSTRAP_SHA = 'c068162161154a4b85110ea1e7dd3d7897ce2b72'
4
+ end
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "bootstrap-sass",
3
+ "version": "3.2.0",
4
+ "description": "bootstrap-sass is a Sass-powered version of Bootstrap, ready to drop right into your Sass powered applications.",
5
+ "main": "index.js",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git://github.com/twbs/bootstrap-sass"
9
+ },
10
+ "keywords": [
11
+ "bootstrap",
12
+ "sass",
13
+ "css"
14
+ ],
15
+ "contributors": [
16
+ "Thomas McDonald",
17
+ "Tristan Harward",
18
+ "Peter Gumeson",
19
+ "Gleb Mazovetskiy"
20
+ ],
21
+ "license": "MIT",
22
+ "bugs": {
23
+ "url": "https://github.com/twbs/bootstrap-sass/issues"
24
+ },
25
+ "devDependencies": {
26
+ "node-sass": "*",
27
+ "mincer": "*",
28
+ "ejs": "*"
29
+ }
30
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "bootstrap-sass",
3
+ "description": "bootstrap-sass is a Sass-powered version of Bootstrap, ready to drop right into your Sass powered applications",
4
+ "tags": ["bootstrap", "grid", "typography", "buttons", "ui", "responsive-web-design"]
5
+ }
@@ -0,0 +1,34 @@
1
+ require 'find'
2
+ require 'json'
3
+ require 'pathname'
4
+
5
+ namespace :bower do
6
+
7
+ find_files = ->(path) {
8
+ Find.find(Pathname.new(path).relative_path_from(Pathname.new Dir.pwd).to_s).map do |path|
9
+ path if File.file?(path)
10
+ end.compact
11
+ }
12
+
13
+ desc 'update main and version in bower.json'
14
+ task :generate do
15
+ require 'bootstrap-sass'
16
+ Dir.chdir Bootstrap.gem_path do
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
+
22
+ spec['main'] =
23
+ find_files.(File.join(Bootstrap.stylesheets_path, '_bootstrap.scss')) +
24
+ find_files.(Bootstrap.fonts_path) +
25
+ js_paths
26
+
27
+ spec['version'] = Bootstrap::VERSION[0..-3]
28
+
29
+ File.open('bower.json', 'w') do |f|
30
+ f.puts JSON.pretty_generate(spec)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,80 @@
1
+ # coding: utf-8
2
+ # Based on convert script from vwall/compass-twitter-bootstrap gem.
3
+ # https://github.com/vwall/compass-twitter-bootstrap/blob/master/build/convert.rb
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this work except in compliance with the License.
7
+ # You may obtain a copy of the License in the LICENSE file, or at:
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require 'open-uri'
18
+ require 'json'
19
+ require 'strscan'
20
+ require 'forwardable'
21
+ require 'term/ansicolor'
22
+ require 'fileutils'
23
+
24
+ require_relative 'converter/fonts_conversion'
25
+ require_relative 'converter/less_conversion'
26
+ require_relative 'converter/js_conversion'
27
+ require_relative 'converter/logger'
28
+ require_relative 'converter/network'
29
+
30
+ class Converter
31
+ extend Forwardable
32
+ include Network
33
+ include LessConversion
34
+ include JsConversion
35
+ include FontsConversion
36
+
37
+ def initialize(repo: 'twbs/bootstrap', branch: 'master', save_to: {}, cache_path: 'tmp/converter-cache-bootstrap')
38
+ @logger = Logger.new
39
+ @repo = repo
40
+ @branch = branch || 'master'
41
+ @branch_sha = get_branch_sha
42
+ @cache_path = cache_path
43
+ @repo_url = "https://github.com/#@repo"
44
+ @save_to = {
45
+ js: 'assets/javascripts/bootstrap',
46
+ scss: 'assets/stylesheets/bootstrap',
47
+ fonts: 'assets/fonts/bootstrap'}.merge(save_to)
48
+ end
49
+
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) }
61
+
62
+ process_font_assets
63
+ process_stylesheet_assets
64
+ process_javascript_assets
65
+ store_version
66
+ end
67
+
68
+ def save_file(path, content, mode='w')
69
+ dir = File.dirname(path)
70
+ FileUtils.mkdir_p(dir) unless File.directory?(dir)
71
+ File.open(path, mode) { |file| file.write(content) }
72
+ end
73
+
74
+ # Update version.rb file with BOOTSTRAP_SHA
75
+ def store_version
76
+ path = 'lib/bootstrap-sass/version.rb'
77
+ content = File.read(path).sub(/BOOTSTRAP_SHA\s*=\s*['"][\w]+['"]/, "BOOTSTRAP_SHA = '#@branch_sha'")
78
+ File.open(path, 'w') { |f| f.write(content) }
79
+ end
80
+ end
@@ -0,0 +1,38 @@
1
+ # regular string scanner works with bytes
2
+ # this one works with chars and provides #scan_next
3
+ class Converter
4
+ class CharStringScanner
5
+ extend Forwardable
6
+
7
+ def initialize(*args)
8
+ @s = StringScanner.new(*args)
9
+ end
10
+
11
+ def_delegators :@s, :scan_until, :skip_until, :string
12
+
13
+ # advance scanner to pos after the next match of pattern and return the match
14
+ def scan_next(pattern)
15
+ return unless @s.scan_until(pattern)
16
+ @s.matched
17
+ end
18
+
19
+ def pos
20
+ byte_to_str_pos @s.pos
21
+ end
22
+
23
+ def pos=(i)
24
+ @s.pos = str_to_byte_pos i
25
+ i
26
+ end
27
+
28
+ private
29
+
30
+ def byte_to_str_pos(pos)
31
+ @s.string.byteslice(0, pos).length
32
+ end
33
+
34
+ def str_to_byte_pos(pos)
35
+ @s.string.slice(0, pos).bytesize
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,16 @@
1
+ class Converter
2
+ module FontsConversion
3
+ def process_font_assets
4
+ log_status 'Processing fonts...'
5
+ files = read_files('fonts', bootstrap_font_files)
6
+ save_to = @save_to[:fonts]
7
+ files.each do |name, content|
8
+ save_file "#{save_to}/#{name}", content
9
+ end
10
+ end
11
+
12
+ def bootstrap_font_files
13
+ @bootstrap_font_files ||= get_paths_by_type('fonts', /\.(eot|svg|ttf|woff)$/)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,45 @@
1
+ class Converter
2
+ module JsConversion
3
+ def process_javascript_assets
4
+ log_status 'Processing javascripts...'
5
+ save_to = @save_to[:js]
6
+ contents = {}
7
+ read_files('js', bootstrap_js_files).each do |name, file|
8
+ contents[name] = file
9
+ save_file("#{save_to}/#{name}", file)
10
+ end
11
+ log_processed "#{bootstrap_js_files * ' '}"
12
+
13
+ log_status 'Updating javascript manifest'
14
+ manifest = ''
15
+ cat = ''
16
+ bootstrap_js_files.each do |name|
17
+ cat << contents[name] + "\n"
18
+ name = name.gsub(/\.js$/, '')
19
+ manifest << "//= require ./bootstrap/#{name}\n"
20
+ end
21
+ {'assets/javascripts/bootstrap-sprockets.js' => manifest,
22
+ 'assets/javascripts/bootstrap.js' => cat}.each do |path, content|
23
+ save_file path, content
24
+ log_processed path
25
+ end
26
+ end
27
+
28
+ def bootstrap_js_files
29
+ @bootstrap_js_files ||= begin
30
+ files = get_paths_by_type 'js', /\.js$/
31
+ files.sort_by { |f|
32
+ case f
33
+ # tooltip depends on popover and must be loaded earlier
34
+ when /tooltip/ then
35
+ 1
36
+ when /popover/ then
37
+ 2
38
+ else
39
+ 0
40
+ end
41
+ }
42
+ end
43
+ end
44
+ end
45
+ end