texture_packer 1.2.0 → 1.3.0

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