diff options
author | Gleb Mazovetskiy <glex.spb@gmail.com> | 2013-12-18 21:46:31 +0400 |
---|---|---|
committer | Gleb Mazovetskiy <glex.spb@gmail.com> | 2013-12-18 21:46:31 +0400 |
commit | 694e4cfc7f1cd618e9fafc9e5a6d9a1066235dc4 (patch) | |
tree | 2e93521433de9c542e0bd17461ce3c948c3217ae | |
parent | b9bb1967d3e8c3e0f95a6253273affbd6e80eba9 (diff) |
update converter
-rw-r--r-- | lib/bootstrap-sass/version.rb | 2 | ||||
-rw-r--r-- | tasks/converter/less_conversion.rb | 48 |
2 files changed, 34 insertions, 16 deletions
diff --git a/lib/bootstrap-sass/version.rb b/lib/bootstrap-sass/version.rb index 5d90f194..f05868fc 100644 --- a/lib/bootstrap-sass/version.rb +++ b/lib/bootstrap-sass/version.rb @@ -1,4 +1,4 @@ module Bootstrap VERSION = '3.0.3.0' - BOOTSTRAP_SHA = '6d03173a1aad98e75f7d33e65b411c519176c59a' + BOOTSTRAP_SHA = '671fb7020bdaa807da6be2e23b779c65cb52a4d6' end diff --git a/tasks/converter/less_conversion.rb b/tasks/converter/less_conversion.rb index 22e386b4..f5ae53b7 100644 --- a/tasks/converter/less_conversion.rb +++ b/tasks/converter/less_conversion.rb @@ -9,9 +9,9 @@ require_relative 'char_string_scanner' class Converter module LessConversion # Some regexps for matching bits of SCSS: - selector_char = '\[\]$\w\-{}#,.:&>@' + SELECTOR_CHAR = '\[\]$\w\-{}#,.:&>@' # 1 selector (the part before the {) - SELECTOR_RE = /[#{selector_char}]+[#{selector_char}\s]*/ + SELECTOR_RE = /[#{SELECTOR_CHAR}]+[#{SELECTOR_CHAR}\s]*/ # 1 // comment COMMENT_RE = %r((?:^[ \t]*//[^\n]*\n)) # 1 {, except when part of @{ and #{ @@ -56,10 +56,12 @@ class Converter end file = varargify_mixin_definitions(file, *VARARG_MIXINS) file = deinterpolate_vararg_mixins(file) - file = parameterize_mixin_parent_selector file, 'responsive-(in)?visibility' - file = parameterize_mixin_parent_selector file, 'input-size' + %w(responsive-(in)?visibility input-size).each do |mixin| + file = parameterize_mixin_parent_selector file, mixin + end file = replace_ms_filters(file) - file = replace_all file, /\.\$state/, '.#{$state}' + file = replace_all file, /(?<=[.-])\$state/, '#{$state}' + file = replace_rules(file, ' .list-group-item-') { |rule| extract_nested_rule rule, 'a&' } file = replace_all file, /,\s*\.open \.dropdown-toggle& \{(.*?)\}/m, " {\\1}\n .open & { &.dropdown-toggle {\\1} }" file = convert_grid_mixins file @@ -67,6 +69,8 @@ class Converter file = apply_mixin_parent_selector(file, '&\.(visible|hidden)') file = apply_mixin_parent_selector(file, '(?<!&)\.(visible|hidden)') file = replace_rules(file, ' @media') { |r| unindent(r, 2) } + when 'type.less' + file = extract_nested_rule file, ' a&:' when 'variables.less' file = insert_default_vars(file) file = <<-SCSS + file @@ -78,7 +82,8 @@ $bootstrap-sass-asset-helper: true !default; # extract .close { button& {...} } rule file = extract_nested_rule file, 'button&' when 'dropdowns.less' - file = replace_all file, /(\s*)@extend \.pull-right-dropdown-menu;/, "\\1right: 0;\\1left: auto;" + file = replace_all file, /(\s*)@extend \.dropdown-menu-right;/, '\1right: 0;\1left: auto;' + file = replace_all file, /(\s*)@extend \.dropdown-menu-left;/, '\left: 0;\right: auto;' when 'forms.less' file = extract_nested_rule file, 'textarea&' file = apply_mixin_parent_selector(file, '\.input-(?:sm|lg)') @@ -89,7 +94,7 @@ $bootstrap-sass-asset-helper: true !default; when 'thumbnails.less' file = extract_nested_rule file, 'a&' when 'glyphicons.less' - file = replace_all file, /\#\{(url\(.*?\))}/, '\1' + file = replace_all file, /\#\{(url\(.*?\))}/, '\1' file = replace_rules(file, '@font-face') { |rule| rule = replace_all rule, /(\$icon-font-\w+)/, '#{\1}' replace_asset_url rule, :font @@ -136,7 +141,7 @@ $bootstrap-sass-asset-helper: true !default; else '.col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}' end - body = (css =~ /\$list \{\n(.*?)\n[ ]*\}/m) && $1 + body = (css =~ /\$list \{\n(.*?)\n[ ]*\}/m) && $1 unindent <<-SASS, 8 // [converter] Grid converted to use SASS cycles (LESS uses recursive nested mixin defs not supported by SASS) #{mxn_def.strip} @@ -266,7 +271,7 @@ $bootstrap-sass-asset-helper: true !default; def parameterize_mixin_parent_selector(file, rule_sel) log_transform rule_sel param = '$parent' - replace_rules(file, '^[ \t]*@mixin\s*' + rule_sel) do |mxn_css| + replace_rules(file, '^\s*@mixin\s*' + rule_sel) do |mxn_css| mxn_css.sub! /(?=@mixin)/, "// [converter] $parent hack\n" # insert param into mixin def mxn_css.sub!(/(@mixin [\w-]+)\(([\$\w\-,\s]*)\)/) { "#{$1}(#{param}#{', ' if $2 && !$2.empty?}#{$2})" } @@ -309,7 +314,7 @@ $bootstrap-sass-asset-helper: true !default; replace_rules file, '\s*' + rule_sel, comments: false do |rule, rule_pos, css| body = unwrap_rule_block(rule.dup).strip next rule unless body =~ /^@include \w+/m || body =~ /^@media/ && body =~ /\{\s*@include/ - rule =~ /(#{COMMENT_RE}*)(#{SELECTOR_RE})\{/ + rule =~ /(#{COMMENT_RE}*)([#{SELECTOR_CHAR}]+?)\s*#{RULE_OPEN_BRACE_RE}/ cmt, sel = $1, $2.strip # take one up selector chain if this is an &. selector if sel.start_with?('&') @@ -334,12 +339,13 @@ $bootstrap-sass-asset-helper: true !default; end # Replaces the following: - # .mixin() -> @include mixin() - # #scope > .mixin() -> @include scope-mixin() + # .mixin() -> @include mixin() + # #scope > .mixin() -> @include scope-mixin() + # &:extend(.mixin all) -> @include mixin() def replace_mixins(less, mixin_names) mixin_pattern = /(\s+)(([#|\.][\w-]+\s*>\s*)*)\.([\w-]+\(.*\))(?!\s\{)/ - less.gsub(mixin_pattern) do |match| + less = less.gsub(mixin_pattern) do |match| matches = match.scan(mixin_pattern).flatten scope = matches[1] || '' if scope != '' @@ -352,6 +358,18 @@ $bootstrap-sass-asset-helper: true !default; "#{matches.first}@extend .#{scope}#{matches.last.gsub(/\(\)/, '')}" end end + + #require 'byebug'; byebug + less.gsub /&:extend\((#{SELECTOR_RE}) all\)/ do + selector = $1 + selector =~ /\.([\w-]+)/ + mixin = $1 + if mixin && mixin_names.include?(mixin) + "@include #{mixin}()" + else + "@extend #{selector}" + end + end end # change Microsoft filters to SASS calling convention @@ -484,7 +502,7 @@ $bootstrap-sass-asset-helper: true !default; options = {comments: true}.merge(options || {}) less = less.dup s = CharStringScanner.new(less) - rule_re = /(?:#{rule_prefix}[^{]*#{RULE_OPEN_BRACE_RE})/ + rule_re = /(?:#{rule_prefix}[#{SELECTOR_CHAR})=(\s]*?#{RULE_OPEN_BRACE_RE})/ if options[:comments] rule_start_re = /(?:#{COMMENT_RE}*)^#{rule_re}/ else @@ -564,7 +582,7 @@ $bootstrap-sass-asset-helper: true !default; # get the pos of css def at pos (search backwards) def css_def_pos(css, pos, depth = -1) to = open_brace_pos(css, pos, depth) - prev_def = to - (css[0..to].reverse.index('}') || to) + 1 + prev_def = to - (css[0..to].reverse.index(RULE_CLOSE_BRACE_RE_REVERSE) || to) + 1 from = prev_def + 1 + (css[prev_def + 1..-1] =~ %r(^\s*[^\s/])) (from..to - 1) end |