texture_packer 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8dc38cd32c0b72a13abfdf07a46d636efba1b851
4
- data.tar.gz: 8dbb0c5b77dab3c9efaa3eb8c5c29ba73fb0b786
3
+ metadata.gz: 41c159bf066da74aab198997c1f78a2ecc6c6bf6
4
+ data.tar.gz: 6d5473a3b14ccb99cdb030d638f50446d2e95c97
5
5
  SHA512:
6
- metadata.gz: '0049b77322f41e5de83714b099b59982de5fb75334df7d8015f47d144f95851e3ef407c4b15cb758677cd399375005d9b2a772af9477012d2f2bd36a5942c067'
7
- data.tar.gz: fb284485f416de0e4a75719f4ba705a078695eab063f70e46e6c7f6103ed922464775417c71eafba40d0f609f6d4da676910f81b75c9520297fe89f440727746
6
+ metadata.gz: 94f61a4db7e19bc00b685ce7c3d7c84bd7f11318e868fa172ea9804aecaa29580a99e17be97dcb8f987db69007b25f3806db2cf5967f5f5e6e3552ca14fb57be
7
+ data.tar.gz: 1c36f77fa566bcf998b1b174831618d4f8cfb4aaeca13cf1b607c7b55d9577bdb2421464663558057c5befb0cd0c1b89d83b9418fe39a88e13e91e747ec55130
@@ -0,0 +1,25 @@
1
+ sudo: false
2
+ env:
3
+ global:
4
+ - CC_TEST_REPORTER_ID=48b7540803d9734cab527ea1b3281271d44588243af0098fd3ac34f539940322
5
+ language: ruby
6
+ rvm:
7
+ - 2.3
8
+ - 2.6
9
+ - 2.7
10
+ gemfile:
11
+ - gemfiles/Gemfile.gemfile
12
+ before_install:
13
+ - if `ruby -e 'exit(RUBY_VERSION.to_f < 2.7)'`; then
14
+ gem i rubygems-update -v '< 3' && update_rubygems;
15
+ gem install bundler -v '< 2';
16
+ fi
17
+ - gem --version
18
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
19
+ - chmod +x ./cc-test-reporter
20
+ - ./cc-test-reporter before-build
21
+ script:
22
+ - bundle exec rake test
23
+ after_script:
24
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
25
+
data/README.md CHANGED
@@ -1 +1,7 @@
1
1
  # texture_packer
2
+
3
+ [![Gem Version](https://img.shields.io/gem/v/texture_packer.svg?style=flat)](https://rubygems.org/gems/texture_packer)
4
+ [![Build Status](https://api.travis-ci.com/khiav223577/texture_packer.svg?branch=master)](https://travis-ci.com/khiav223577/texture_packer)
5
+ [![RubyGems](http://img.shields.io/gem/dt/texture_packer.svg?style=flat)](https://rubygems.org/gems/texture_packer)
6
+ [![Code Climate](https://codeclimate.com/github/khiav223577/texture_packer/badges/gpa.svg)](https://codeclimate.com/github/khiav223577/texture_packer)
7
+ [![Test Coverage](https://codeclimate.com/github/khiav223577/texture_packer/badges/coverage.svg)](https://codeclimate.com/github/khiav223577/texture_packer/coverage)
@@ -2,6 +2,7 @@
2
2
  require 'yaml'
3
3
  require 'pathname'
4
4
  require 'fileutils'
5
+ require 'texture_packer'
5
6
  # ----------------------------------------------------------------
6
7
  # ● 載入 yaml
7
8
  # ----------------------------------------------------------------
@@ -30,23 +31,16 @@ end
30
31
 
31
32
  exec_cmd('TexturePacker packer.tps')
32
33
 
33
- def get_mixin(func, css)
34
- return "@mixin #{func}{ #{css} }\n"
35
- end
36
-
37
34
  if File.exists?('packed_mobile.css') # 向下相容
38
35
  exec_cmd('mv packed_mobile.css packed_m.css')
39
36
  exec_cmd('mv packed_mobile.png packed_m.png')
40
37
  end
41
- $has_mobile = true if File.exists?('packed_m.css')
38
+ has_mobile = true if File.exists?('packed_m.css')
42
39
 
43
40
  # ----------------------------------------------------------------
44
41
  # ● 由路徑計算 class 名字
45
42
  # ----------------------------------------------------------------
46
43
  dir_name = File.expand_path(Dir.pwd).gsub(/.*\/Texture-Packer\/.*?\/(.*)/, '\1')
47
- base_dir_name = File.basename(dir_name)
48
- theme = base_dir_name[/[^_]+$/]
49
- dir_without_theme = base_dir_name[0...-(theme.size + 1)]
50
44
 
51
45
  output_paths_mapping = Dir['*.css'].map do |path|
52
46
  name = File.basename(path, '.css')
@@ -54,103 +48,8 @@ output_paths_mapping = Dir['*.css'].map do |path|
54
48
  end.to_h
55
49
 
56
50
  content = output_paths_mapping.map{|_, path| File.read("#{path}.css") }.join
57
-
58
- Dir['images/**/'].map{|s| s[/images\/(.*)\//, 1] }.compact.map{|s| "#{s.gsub('/', '-')}-" }.each do |path| #"images/aaa/bbb/ccc.png" => "aaa-bbb-"
59
- content.gsub!(path, path.gsub('-', '_')) #aaa-bbb => aaa_bbb
60
- end
61
-
62
- data = {}
63
- content.gsub!(/-disabled \{/, ':disabled {') #-disabled => :disabled
64
- loop{ break if content.gsub!(/-([\w]+)((?:[^\w][\w]+)*) \{/, '[\1]\2 {') == nil }
65
- output0 = content
66
- output0.sub!(/(\/\*(.|\n)*?\*\/)/, '') #去掉註解
67
- output0 = $1 + "\n"
68
- # puts content
69
- def extract_rule!(content)
70
- content.sub!(/^\.([a-zA-Z0-9_-]+)((?:\:\w+|\[\w+\])*) \{(.*?)\}/, '') #抓 rule
71
- return [$1, $2, $3] #$1 = selector, $2 = prefix, $3 = css
72
- end
73
- def split_prefixs(selector)
74
- selector.sub!(/^\.([a-zA-Z0-9_-]+)(:\w+|\[\w+\])?/, '') #抓 rule
75
- end
76
- loop do
77
- selector, prefix, css = extract_rule!(content)
78
- break if selector == nil
79
- next if selector == "sprite"
80
- prefixs = prefix.scan(/\[\w+\]|\:\w+/) #[m]:disabled => ['[m]', ':disabled']
81
- prefixs.map! do |prefix|
82
- case prefix
83
- when '[active]' ; ':active' # 因為 TexturePacker 會把 xxx-active-hover 轉成 xxx-active:hover 而不是 xxx:active:hover
84
- when '[hover]' ; ':hover'
85
- else ; prefix
86
- end
87
- end
88
- # p [selector, prefix, css]
89
- (data[selector] ||= {})[prefixs] = "#{css};"
90
- end
91
- # data = {selector => {nil => 'xxx', ':disabeld' => 'xxx', '[m]' => 'xxx'}}
92
- output1 = "" #mixin的output
93
- output_paths_mapping.map do |kind, name|
94
- if kind == nil
95
- output1 += get_mixin("#{base_dir_name}_sprite", "background-image: image-url('#{dir_name}.png');")
96
- else
97
- output1 += get_mixin("#{base_dir_name}_sprite_#{kind}", "background-image: image-url('#{dir_name}_#{kind}.png');")
98
- end
99
- end
100
- output2 = "" #scss的output
101
- output2 += "body[theme='#{theme}']{\n"
102
- output2 += " .#{dir_without_theme}_sprite{\n"
103
- if $has_mobile
104
- output2 += " @include desktop{ @include #{base_dir_name}_sprite; }\n"
105
- output2 += " @include mobile{ @include #{base_dir_name}_sprite_m; }\n"
106
- elsif output_paths_mapping.size > 1
107
- output2 += output_paths_mapping.map do |kind, name|
108
- next " @include #{base_dir_name}_sprite;\n" if kind == nil
109
- next " &[kind=\"#{kind}\"] { @include #{base_dir_name}_sprite_#{kind}; }\n"
110
- end.join
111
- else
112
- output2 += " @include #{base_dir_name}_sprite;\n"
113
- end
114
- # output2 += " &.split_mobile{ @include mobile{ @include #{base_dir_name}_sprite_m; }}\n" if $has_mobile
115
- class CssRule
116
- def initialize
117
- @hash = {}
118
- end
119
- def add(prefixs, css)
120
- if prefixs.size > 0
121
- (@hash[prefixs.first] ||= CssRule.new).add(prefixs[1..-1], css)
122
- else
123
- @css = css
124
- end
125
- end
126
- def generate_css
127
- inner_css = @hash.map do |prefix, obj|
128
- case
129
- when (prefix == nil || prefix == '')
130
- [obj.generate_css]
131
- when prefix[0] == ':'
132
- ["&#{prefix}, &.#{prefix[1..-1]}{ ", obj.generate_css, " }"]
133
- when prefix == '[m]'
134
- ["@include mobile{ ", obj.generate_css, " }"]
135
- else
136
- ["&#{prefix}{ ", obj.generate_css, " }"]
137
- end
138
- end
139
- inner = inner_css.size == 0 ? '' : " #{inner_css.join('')}"
140
- return "#{@css}#{inner}"
141
- end
142
- end
143
- for selector, css_data in data
144
- func = "#{base_dir_name}_#{selector}"
145
- rules = CssRule.new
146
- css_data.each{|prefixs, css| #EX: prefixs == [':hover']
147
- rules.add(prefixs, css)
148
- }
149
- output1 << get_mixin(func, rules.generate_css)
150
- output2 << " &.#{selector} { @include #{func}; }\n"
151
- end
152
- output2 += " }\n"
153
- output2 += "}\n"
51
+ packer = TexturePacker.new(dir_name, output_paths_mapping, content, has_mobile)
52
+ output0, output1, output2 = packer.parse!
154
53
  output = output0 + output1 + output2
155
54
 
156
55
  # ----------------------------------------------------------------
@@ -167,17 +66,17 @@ write_to_file('packed.scss', output)
167
66
  # ----------------------------------------------------------------
168
67
  if SETTING['project_dir']
169
68
  css_pre_lines = ["@import './mixin.scss';"]
170
- css_pre_lines.unshift("@import 'global_mixins';") if $has_mobile
69
+ css_pre_lines.unshift("@import 'global_mixins';") if has_mobile
171
70
 
172
71
  sub_dirs = dir_name.split(File::Separator)[0...-1]
173
- css_path = Pathname.new(SETTING['project_dir']).join('app', 'assets', 'stylesheets', 'packed_sprites', *sub_dirs, dir_without_theme)
72
+ css_path = Pathname.new(SETTING['project_dir']).join('app', 'assets', 'stylesheets', 'packed_sprites', *sub_dirs, packer.dir_without_theme)
174
73
  img_path = Pathname.new(SETTING['project_dir']).join('app', 'assets', 'images', *sub_dirs)
175
74
  FileUtils.mkdir_p(css_path)
176
75
  FileUtils.mkdir_p(img_path)
177
76
  write_to_file(css_path.join('mixin.scss'), output1)
178
77
  write_to_file(css_path.join('ocean.scss'), "#{css_pre_lines.join("\n")}\n\n#{output2}")
179
78
  output_paths_mapping.each do |_, path|
180
- FileUtils.cp("#{path}-fs8.png", img_path.join("#{path.sub('packed', base_dir_name)}.png"))
79
+ FileUtils.cp("#{path}-fs8.png", img_path.join("#{path.sub('packed', packer.base_dir_name)}.png"))
181
80
  exec_cmd("pngquant #{path}.png --force")
182
81
  end
183
82
  end
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ group :test do
4
+ gem 'simplecov'
5
+ end
6
+
7
+ gemspec path: '../'
@@ -0,0 +1,134 @@
1
+ require 'texture_packer/version'
2
+
3
+ class TexturePacker
4
+ attr_reader :base_dir_name
5
+ attr_reader :dir_without_theme
6
+
7
+ def initialize(dir_name, output_paths_mapping, content, has_mobile)
8
+ @output_paths_mapping = output_paths_mapping
9
+ @content = content.dup
10
+ @has_mobile = has_mobile
11
+
12
+ @dir_name = dir_name
13
+ @base_dir_name = File.basename(@dir_name)
14
+ @theme = @base_dir_name[/[^_]+$/]
15
+ @dir_without_theme = @base_dir_name[0...-(@theme.size + 1)]
16
+ end
17
+
18
+ def parse!
19
+ Dir['images/**/'].map{|s| s[/images\/(.*)\//, 1] }.compact.map{|s| "#{s.gsub('/', '-')}-" }.each do |path| #"images/aaa/bbb/ccc.png" => "aaa-bbb-"
20
+ @content.gsub!(path, path.gsub('-', '_')) #aaa-bbb => aaa_bbb
21
+ end
22
+
23
+ data = {}
24
+ @content.gsub!(/-disabled \{/, ':disabled {') #-disabled => :disabled
25
+ loop{ break if @content.gsub!(/-([\w]+)((?:[^\w][\w]+)*) \{/, '[\1]\2 {') == nil }
26
+ output0 = @content
27
+ output0.sub!(/(\/\*(.|\n)*?\*\/)/, '') #去掉註解
28
+ output0 = $1 + "\n"
29
+
30
+ loop do
31
+ selector, prefix, css = extract_rule!
32
+ break if selector == nil
33
+ next if selector == "sprite"
34
+ prefixs = prefix.scan(/\[\w+\]|\:\w+/) #[m]:disabled => ['[m]', ':disabled']
35
+ prefixs.map! do |prefix|
36
+ case prefix
37
+ when '[active]' ; ':active' # 因為 TexturePacker 會把 xxx-active-hover 轉成 xxx-active:hover 而不是 xxx:active:hover
38
+ when '[hover]' ; ':hover'
39
+ else ; prefix
40
+ end
41
+ end
42
+ # p [selector, prefix, css]
43
+ (data[selector] ||= {})[prefixs] = "#{css};"
44
+ end
45
+ # data = {selector => {nil => 'xxx', ':disabeld' => 'xxx', '[m]' => 'xxx'}}
46
+ output1 = "" #mixin的output
47
+ @output_paths_mapping.map do |kind, name|
48
+ if kind == nil
49
+ output1 += get_mixin("#{base_dir_name}_sprite", "background-image: image-url('#{@dir_name}.png');")
50
+ else
51
+ output1 += get_mixin("#{base_dir_name}_sprite_#{kind}", "background-image: image-url('#{@dir_name}_#{kind}.png');")
52
+ end
53
+ end
54
+ output2 = "" #scss的output
55
+ output2 += "body[theme='#{@theme}']{\n"
56
+ output2 += " .#{@dir_without_theme}_sprite{\n"
57
+ if @has_mobile
58
+ output2 += " @include desktop{ @include #{base_dir_name}_sprite; }\n"
59
+ output2 += " @include mobile{ @include #{base_dir_name}_sprite_m; }\n"
60
+ elsif @output_paths_mapping.size > 1
61
+ output2 += @output_paths_mapping.map do |kind, name|
62
+ next " @include #{base_dir_name}_sprite;\n" if kind == nil
63
+ next " &[kind=\"#{kind}\"] { @include #{base_dir_name}_sprite_#{kind}; }\n"
64
+ end.join
65
+ else
66
+ output2 += " @include #{base_dir_name}_sprite;\n"
67
+ end
68
+ # output2 += " &.split_mobile{ @include mobile{ @include #{base_dir_name}_sprite_m; }}\n" if @has_mobile
69
+ for selector, css_data in data
70
+ func = "#{base_dir_name}_#{selector}"
71
+ rules = CssRule.new
72
+ css_data.each{|prefixs, css| #EX: prefixs == [':hover']
73
+ rules.add(prefixs, css)
74
+ }
75
+ output1 << get_mixin(func, rules.generate_css)
76
+ output2 << " &.#{parse_language_selector!(selector)} { @include #{func}; }\n"
77
+ end
78
+ output2 += " }\n"
79
+ output2 += "}\n"
80
+ return [output0, output1, output2]
81
+ end
82
+
83
+ def extract_rule!
84
+ @content.sub!(/^\.([a-zA-Z0-9_-]+)((?:\:\w+|\[\w+\])*) \{(.*?)\}/, '') #抓 rule
85
+ return [$1, $2, $3] #$1 = selector, $2 = prefix, $3 = css
86
+ end
87
+
88
+ def get_mixin(func, css)
89
+ return "@mixin #{func}{ #{css} }\n"
90
+ end
91
+
92
+ def parse_language_selector!(selector)
93
+ language_parsed_array = selector.scan(/_(?:tw|cn|en)\z/)
94
+ return selector if language_parsed_array.count.zero? # 如果沒有語言分類就回傳原本的 selector
95
+
96
+ case language_parsed_array[0]
97
+ when '_tw'
98
+ return selector.gsub('_tw', ':lang(zh-TW)')
99
+ when '_cn'
100
+ return selector.gsub('_cn', ':lang(zh-CN)')
101
+ when '_en'
102
+ return selector.gsub('_en', ':lang(en)')
103
+ end
104
+ end
105
+
106
+ class CssRule
107
+ def initialize
108
+ @hash = {}
109
+ end
110
+ def add(prefixs, css)
111
+ if prefixs.size > 0
112
+ (@hash[prefixs.first] ||= CssRule.new).add(prefixs[1..-1], css)
113
+ else
114
+ @css = css
115
+ end
116
+ end
117
+ def generate_css
118
+ inner_css = @hash.map do |prefix, obj|
119
+ case
120
+ when (prefix == nil || prefix == '')
121
+ [obj.generate_css]
122
+ when prefix[0] == ':'
123
+ ["&#{prefix}, &.#{prefix[1..-1]}{ ", obj.generate_css, " }"]
124
+ when prefix == '[m]'
125
+ ["@include mobile{ ", obj.generate_css, " }"]
126
+ else
127
+ ["&#{prefix}{ ", obj.generate_css, " }"]
128
+ end
129
+ end
130
+ inner = inner_css.size == 0 ? '' : " #{inner_css.join('')}"
131
+ return "#{@css}#{inner}"
132
+ end
133
+ end
134
+ end
@@ -1,3 +1,3 @@
1
- module TexturePacker
2
- VERSION = "1.2.0"
1
+ class TexturePacker
2
+ VERSION = "1.3.0"
3
3
  end
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.executables = ['pack_scss']
28
28
  spec.require_paths = ["lib"]
29
29
 
30
- spec.add_development_dependency "bundler", "~> 1.11"
31
- spec.add_development_dependency "minitest", "~> 5.0"
30
+ spec.add_development_dependency 'bundler', '>= 1.17', '< 3.x'
31
+ spec.add_development_dependency 'rake', '~> 12.0'
32
+ spec.add_development_dependency 'minitest', '~> 5.0'
32
33
  end
metadata CHANGED
@@ -1,29 +1,49 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: texture_packer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - khiav reoy
8
8
  autorequire:
9
9
  bindir: executables
10
10
  cert_chain: []
11
- date: 2019-08-08 00:00:00.000000000 Z
11
+ date: 2020-02-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '1.17'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 3.x
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '1.17'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 3.x
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
15
35
  requirement: !ruby/object:Gem::Requirement
16
36
  requirements:
17
37
  - - "~>"
18
38
  - !ruby/object:Gem::Version
19
- version: '1.11'
39
+ version: '12.0'
20
40
  type: :development
21
41
  prerelease: false
22
42
  version_requirements: !ruby/object:Gem::Requirement
23
43
  requirements:
24
44
  - - "~>"
25
45
  - !ruby/object:Gem::Version
26
- version: '1.11'
46
+ version: '12.0'
27
47
  - !ruby/object:Gem::Dependency
28
48
  name: minitest
29
49
  requirement: !ruby/object:Gem::Requirement
@@ -47,11 +67,14 @@ extensions: []
47
67
  extra_rdoc_files: []
48
68
  files:
49
69
  - ".gitignore"
70
+ - ".travis.yml"
50
71
  - CODE_OF_CONDUCT.md
51
72
  - LICENSE.txt
52
73
  - README.md
53
74
  - Rakefile
54
75
  - executables/pack_scss
76
+ - gemfiles/Gemfile.gemfile
77
+ - lib/texture_packer.rb
55
78
  - lib/texture_packer/version.rb
56
79
  - texture_packer.gemspec
57
80
  homepage: https://github.com/khiav223577/texture_packer