ase-palette 0.9.1 → 0.9.2
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 +4 -4
- data/CHANGELOG.md +3 -0
- data/Gemfile.lock +18 -18
- data/README.md +17 -17
- data/ase-palette.gemspec +3 -3
- data/lib/ase-palette/palette.rb +18 -6
- data/lib/ase-palette/palette_binary.rb +63 -37
- data/lib/ase-palette/version.rb +1 -1
- metadata +12 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a8efd3a8b6e4f148e1b6ef04583e55e2c05f6ed3bb9ba236ff0f3c763789c0a2
|
4
|
+
data.tar.gz: 0fd75bad1b0cb5cfa08f9ae199534cbf82d2ba3ddbf1bf634e02fa6290e619f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61b554c482bf803f87cb852743ce3e0ab4a6a547662f516db04d55c05b788782597292afdc59dfb8d5c7a5e334e833330b70b4ffa99534b917102dcafa846c95
|
7
|
+
data.tar.gz: f232f7e71ed8d260c0f21133843666c76d198dfba892c4ba6f807d8df76fcb69d5f451e5dfa2d25e5b1edce1c4159f49d38d92ac11283e0c1009748811aa486b
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,30 +1,30 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
ase-palette (0.9.
|
5
|
-
bindata (~> 2.4.
|
4
|
+
ase-palette (0.9.2)
|
5
|
+
bindata (~> 2.4.10)
|
6
6
|
hex_string (~> 1.0.1)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
bindata (2.4.
|
12
|
-
diff-lcs (1.
|
11
|
+
bindata (2.4.10)
|
12
|
+
diff-lcs (1.5.0)
|
13
13
|
hex_string (1.0.1)
|
14
|
-
rake (
|
15
|
-
rspec (3.
|
16
|
-
rspec-core (~> 3.
|
17
|
-
rspec-expectations (~> 3.
|
18
|
-
rspec-mocks (~> 3.
|
19
|
-
rspec-core (3.
|
20
|
-
rspec-support (~> 3.
|
21
|
-
rspec-expectations (3.
|
14
|
+
rake (13.0.6)
|
15
|
+
rspec (3.10.0)
|
16
|
+
rspec-core (~> 3.10.0)
|
17
|
+
rspec-expectations (~> 3.10.0)
|
18
|
+
rspec-mocks (~> 3.10.0)
|
19
|
+
rspec-core (3.10.1)
|
20
|
+
rspec-support (~> 3.10.0)
|
21
|
+
rspec-expectations (3.10.2)
|
22
22
|
diff-lcs (>= 1.2.0, < 2.0)
|
23
|
-
rspec-support (~> 3.
|
24
|
-
rspec-mocks (3.
|
23
|
+
rspec-support (~> 3.10.0)
|
24
|
+
rspec-mocks (3.10.2)
|
25
25
|
diff-lcs (>= 1.2.0, < 2.0)
|
26
|
-
rspec-support (~> 3.
|
27
|
-
rspec-support (3.
|
26
|
+
rspec-support (~> 3.10.0)
|
27
|
+
rspec-support (3.10.3)
|
28
28
|
|
29
29
|
PLATFORMS
|
30
30
|
ruby
|
@@ -32,8 +32,8 @@ PLATFORMS
|
|
32
32
|
DEPENDENCIES
|
33
33
|
ase-palette!
|
34
34
|
bundler (~> 2.0)
|
35
|
-
rake (~>
|
36
|
-
rspec (~> 3.
|
35
|
+
rake (~> 13.0)
|
36
|
+
rspec (~> 3.10)
|
37
37
|
|
38
38
|
BUNDLED WITH
|
39
39
|
2.0.1
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# ASEPalette
|
1
|
+
# 🎨 ASEPalette
|
2
2
|
|
3
3
|
[<img src="https://img.shields.io/gem/v/ase-palette.svg?color=g" />](https://rubygems.org/gems/ase-palette)
|
4
4
|
[<img src="https://img.shields.io/gem/dt/ase-palette.svg?color=g" />](https://rubygems.org/gems/ase-palette)
|
@@ -15,29 +15,26 @@ gem 'ase-palette'
|
|
15
15
|
|
16
16
|
## Usage
|
17
17
|
|
18
|
-
### Load
|
18
|
+
### 🚀 Load
|
19
19
|
|
20
20
|
```ruby
|
21
21
|
require 'ase-palette'
|
22
22
|
```
|
23
23
|
|
24
|
-
### Write
|
24
|
+
### 📝 Write
|
25
25
|
|
26
26
|
```ruby
|
27
|
-
# Create palette
|
27
|
+
# Create a palette
|
28
28
|
palette = ASEPalette.new
|
29
29
|
|
30
|
-
#
|
31
|
-
|
30
|
+
# Add a color
|
31
|
+
palette.add_color ASEPalette::Color::RGB.new "Red", 255, 0, 0
|
32
32
|
|
33
|
-
# Add color to
|
34
|
-
palette.add_color
|
35
|
-
|
36
|
-
# Add color to group
|
37
|
-
palette.add_color color, group_name: "Group Name"
|
33
|
+
# Add a color to a group
|
34
|
+
palette.add_color ASEPalette::Color::CMYK.new "Yellow", 100, 0, 0, 0, group_name: "My Group"
|
38
35
|
```
|
39
36
|
|
40
|
-
### Read
|
37
|
+
### 📖 Read
|
41
38
|
|
42
39
|
```ruby
|
43
40
|
# Access top-level colors
|
@@ -59,17 +56,17 @@ palette.colors(include_from_groups: true).each do |color|
|
|
59
56
|
end
|
60
57
|
```
|
61
58
|
|
62
|
-
### Edit
|
59
|
+
### 🖋 Edit
|
63
60
|
|
64
61
|
```ruby
|
65
62
|
# Remove a color, including those from groups
|
66
63
|
palette.remove_color_with_name "Red"
|
67
64
|
|
68
|
-
# Remove a group and all of the colors it
|
65
|
+
# Remove a group and all of the colors in it
|
69
66
|
palette.remove_group_with_name "Group Name"
|
70
67
|
```
|
71
68
|
|
72
|
-
### Export
|
69
|
+
### ⬆️ Export
|
73
70
|
|
74
71
|
```ruby
|
75
72
|
# Store file
|
@@ -83,7 +80,7 @@ respond_to do |format|
|
|
83
80
|
end
|
84
81
|
```
|
85
82
|
|
86
|
-
### Import
|
83
|
+
### ⬇️ Import
|
87
84
|
|
88
85
|
```ruby
|
89
86
|
# Open palette from file
|
@@ -100,11 +97,14 @@ puts palette
|
|
100
97
|
# Violet, RGB: 90/0/255, :global
|
101
98
|
# Blue, RGB: 0/0/255, :global
|
102
99
|
# Green, RGB: 50/255/50, :global
|
103
|
-
# Red, RGB: 240/0/20, :global
|
104
100
|
#
|
105
101
|
# Group 2
|
106
102
|
# Orange CMYK, CMYK: 0/80/100/0, :global
|
107
103
|
# Yellow CMYK, CMYK: 0/20/100/0, :global
|
104
|
+
#
|
105
|
+
# Group 3
|
106
|
+
# PANTONE Yellow C, LAB: 89/-1/111, :spot
|
107
|
+
# PANTONE Orange 021 C, LAB: 61/66/85, :spot
|
108
108
|
#
|
109
109
|
# --------------
|
110
110
|
# 7 colors, 2 groups
|
data/ase-palette.gemspec
CHANGED
@@ -37,10 +37,10 @@ Gem::Specification.new do |spec|
|
|
37
37
|
spec.require_paths = ["lib"]
|
38
38
|
spec.required_ruby_version = ">= 2.5.0"
|
39
39
|
|
40
|
-
spec.add_dependency "bindata", "~>2.4.
|
40
|
+
spec.add_dependency "bindata", "~>2.4.10"
|
41
41
|
spec.add_dependency "hex_string", "~>1.0.1"
|
42
42
|
|
43
43
|
spec.add_development_dependency "bundler", "~> 2.0"
|
44
|
-
spec.add_development_dependency "rake", "~>
|
45
|
-
spec.add_development_dependency "rspec", "~> 3.
|
44
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
45
|
+
spec.add_development_dependency "rspec", "~> 3.10"
|
46
46
|
end
|
data/lib/ase-palette/palette.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
module ASEPalette
|
2
|
-
class Palette
|
3
|
-
# TODO: Consider removing 'with_name' from method signatures
|
4
|
-
|
2
|
+
class Palette
|
5
3
|
# Initialize palette
|
6
4
|
def initialize(path = nil)
|
7
5
|
@version_major = 1
|
@@ -71,7 +69,21 @@ module ASEPalette
|
|
71
69
|
raise Error, "A color named #{color.name} already exists"
|
72
70
|
end
|
73
71
|
else
|
74
|
-
raise Error, "Argument 'color'
|
72
|
+
raise Error, "Argument 'color' must be of type #{ASEPalette::Color}"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Add multiple colors to palette
|
77
|
+
# 'colors' must be an array of Color objects
|
78
|
+
# Optionally provide 'group_name' to place color in group
|
79
|
+
# Group will be created if it does not exist
|
80
|
+
def add_colors(colors, group_name: nil)
|
81
|
+
if colors.is_a? Array
|
82
|
+
colors.each do |color|
|
83
|
+
add_color(color, group_name: group_name)
|
84
|
+
end
|
85
|
+
else
|
86
|
+
raise Error, "Argument 'colors' must be of type #{Array}"
|
75
87
|
end
|
76
88
|
end
|
77
89
|
|
@@ -183,13 +195,13 @@ module ASEPalette
|
|
183
195
|
end
|
184
196
|
end
|
185
197
|
|
186
|
-
# Returns
|
198
|
+
# Returns a copied array of all colors in palette,
|
187
199
|
# including those in groups
|
188
200
|
def all_colors
|
189
201
|
@colors + @groups.map { |group| group.colors }.flatten
|
190
202
|
end
|
191
203
|
|
192
|
-
# Determines whether
|
204
|
+
# Determines whether color exists in palette,
|
193
205
|
# including those in groups
|
194
206
|
def color_does_not_exist(name)
|
195
207
|
all_colors.select { |color| color.name == name }.length == 0
|
@@ -20,6 +20,34 @@ module ASEPalette
|
|
20
20
|
|
21
21
|
class ASEBinData < BinData::Record
|
22
22
|
endian :big
|
23
|
+
|
24
|
+
class String16Null < BinData::Primitive
|
25
|
+
endian :big
|
26
|
+
|
27
|
+
uint16 :len, value: -> { data.length / 2 + 1 }
|
28
|
+
string :data, read_length: -> { (len - 1) * 2 }
|
29
|
+
uint16 :null_terminator, value: 0
|
30
|
+
|
31
|
+
# Force UTF-16 string encoding
|
32
|
+
# when anonymous bytes are naively read in,
|
33
|
+
# then encode for UTF-8, which the user expects
|
34
|
+
def get
|
35
|
+
self.data.force_encoding(Encoding::UTF_16BE).encode(Encoding::UTF_8)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Expect to receive UTF-8 string when setting
|
39
|
+
def set(string)
|
40
|
+
self.data = string.encode(Encoding::UTF_16BE)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Calculate total size, in bytes, of:
|
44
|
+
# - UTF-16-encoded string
|
45
|
+
# - uint16 length of string (2 bytes)
|
46
|
+
# - null terminator (2 bytes)
|
47
|
+
def size
|
48
|
+
self.data.length + 4
|
49
|
+
end
|
50
|
+
end
|
23
51
|
|
24
52
|
string :signature, value: "ASEF", read_length: 4
|
25
53
|
uint16 :version_major, initial_value: DEFAULT_VERSION_MAJOR
|
@@ -28,14 +56,17 @@ module ASEPalette
|
|
28
56
|
|
29
57
|
array :blocks, initial_length: -> { block_count } do
|
30
58
|
uint16 :block_type
|
59
|
+
|
31
60
|
uint32 :block_length, value: -> {
|
32
61
|
block_length = 0
|
33
|
-
if block_type ==
|
34
|
-
|
35
|
-
block_length += block_data.name.
|
62
|
+
if block_type == BLOCK_TYPE_GROUP_START ||
|
63
|
+
block_type == BLOCK_TYPE_COLOR
|
64
|
+
block_length += block_data.name.size
|
36
65
|
end
|
37
66
|
if block_type == BLOCK_TYPE_COLOR
|
38
|
-
|
67
|
+
# Add length of color_model string (4 bytes) +
|
68
|
+
# color_type uint16 (2 bytes)
|
69
|
+
block_length += 6
|
39
70
|
case block_data.color_model
|
40
71
|
when COLOR_MODEL_RGB
|
41
72
|
block_length += 4 * 3
|
@@ -44,52 +75,47 @@ module ASEPalette
|
|
44
75
|
when COLOR_MODEL_LAB
|
45
76
|
block_length += 4 * 3
|
46
77
|
end
|
47
|
-
elsif block_type == BLOCK_TYPE_GROUP_START
|
48
|
-
block_length += 4
|
49
78
|
end
|
50
79
|
block_length
|
51
80
|
}
|
81
|
+
|
52
82
|
choice :block_data, selection: -> { block_type } do
|
53
83
|
class BlockGroupStart < BinData::Record
|
54
84
|
endian :big
|
55
|
-
|
56
|
-
string :name, read_length: -> { (name_length - 1) * 2 }
|
57
|
-
uint16 :null_padding, value: 0
|
85
|
+
String16Null :name
|
58
86
|
end
|
59
87
|
class BlockGroupEnd < BinData::Record
|
60
88
|
end
|
61
89
|
class BlockColor < BinData::Record
|
62
90
|
endian :big
|
63
|
-
|
64
|
-
|
65
|
-
|
91
|
+
|
92
|
+
class ColorDataRGB < BinData::Record
|
93
|
+
endian :big
|
94
|
+
float :red, initial_value: 0
|
95
|
+
float :green, initial_value: 0
|
96
|
+
float :blue, initial_value: 0
|
97
|
+
end
|
98
|
+
class ColorDataCMYK < BinData::Record
|
99
|
+
endian :big
|
100
|
+
float :cyan, initial_value: 0
|
101
|
+
float :magenta, initial_value: 0
|
102
|
+
float :yellow, initial_value: 0
|
103
|
+
float :black, initial_value: 0
|
104
|
+
end
|
105
|
+
class ColorDataLAB < BinData::Record
|
106
|
+
endian :big
|
107
|
+
float :lightness, initial_value: 0
|
108
|
+
float :a, initial_value: 0
|
109
|
+
float :b, initial_value: 0
|
110
|
+
end
|
111
|
+
|
112
|
+
String16Null :name
|
66
113
|
string :color_model, read_length: 4
|
67
114
|
choice :color_data, selection: -> { color_model } do
|
68
|
-
class ColorDataRGB < BinData::Record
|
69
|
-
endian :big
|
70
|
-
float :red, initial_value: 0
|
71
|
-
float :green, initial_value: 0
|
72
|
-
float :blue, initial_value: 0
|
73
|
-
end
|
74
|
-
class ColorDataCMYK < BinData::Record
|
75
|
-
endian :big
|
76
|
-
float :cyan, initial_value: 0
|
77
|
-
float :magenta, initial_value: 0
|
78
|
-
float :yellow, initial_value: 0
|
79
|
-
float :black, initial_value: 0
|
80
|
-
end
|
81
|
-
class ColorDataLAB < BinData::Record
|
82
|
-
endian :big
|
83
|
-
float :lightness, initial_value: 0
|
84
|
-
float :a, initial_value: 0
|
85
|
-
float :b, initial_value: 0
|
86
|
-
end
|
87
|
-
|
88
115
|
ColorDataRGB COLOR_MODEL_RGB
|
89
116
|
ColorDataCMYK COLOR_MODEL_CMYK
|
90
117
|
ColorDataLAB COLOR_MODEL_LAB
|
91
|
-
# Grayscale data
|
92
|
-
ColorDataCMYK COLOR_MODEL_GRAY
|
118
|
+
ColorDataCMYK COLOR_MODEL_GRAY # Grayscale data stored in CMYK structure
|
93
119
|
end
|
94
120
|
uint16 :color_type, initial_value: COLOR_TYPE_DEFAULT
|
95
121
|
end
|
@@ -190,7 +216,7 @@ module ASEPalette
|
|
190
216
|
palette.blocks.push({
|
191
217
|
block_type: BLOCK_TYPE_COLOR,
|
192
218
|
block_data: {
|
193
|
-
name: name
|
219
|
+
name: name,
|
194
220
|
color_model: color_model,
|
195
221
|
color_data: color_data,
|
196
222
|
color_type: color_type,
|
@@ -202,7 +228,7 @@ module ASEPalette
|
|
202
228
|
palette.blocks.push({
|
203
229
|
block_type: BLOCK_TYPE_GROUP_START,
|
204
230
|
block_data: {
|
205
|
-
name: name
|
231
|
+
name: name
|
206
232
|
}
|
207
233
|
})
|
208
234
|
end
|
@@ -226,7 +252,7 @@ module ASEPalette
|
|
226
252
|
block_type = block[:block_type]
|
227
253
|
block_data = block[:block_data]
|
228
254
|
if block_type == BLOCK_TYPE_COLOR || block_type == BLOCK_TYPE_GROUP_START
|
229
|
-
block_name = block_data[:name]
|
255
|
+
block_name = block_data[:name]
|
230
256
|
end
|
231
257
|
if block_type == BLOCK_TYPE_COLOR
|
232
258
|
color = { name: block_name }
|
data/lib/ase-palette/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ase-palette
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Becker
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bindata
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.4.
|
19
|
+
version: 2.4.10
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.4.
|
26
|
+
version: 2.4.10
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: hex_string
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,28 +58,28 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '13.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '13.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '3.
|
75
|
+
version: '3.10'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '3.
|
82
|
+
version: '3.10'
|
83
83
|
description: Read and write Adobe Swatch Exchange files.
|
84
84
|
email:
|
85
85
|
- sam@sambecker.com
|
@@ -113,7 +113,7 @@ metadata:
|
|
113
113
|
homepage_uri: https://github.com/sambecker/ase-palette
|
114
114
|
source_code_uri: https://github.com/sambecker/ase-palette
|
115
115
|
changelog_uri: https://github.com/sambecker/ase-palette/blob/master/CHANGELOG.md
|
116
|
-
post_install_message:
|
116
|
+
post_install_message:
|
117
117
|
rdoc_options: []
|
118
118
|
require_paths:
|
119
119
|
- lib
|
@@ -128,8 +128,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
128
|
- !ruby/object:Gem::Version
|
129
129
|
version: '0'
|
130
130
|
requirements: []
|
131
|
-
rubygems_version: 3.
|
132
|
-
signing_key:
|
131
|
+
rubygems_version: 3.3.5
|
132
|
+
signing_key:
|
133
133
|
specification_version: 4
|
134
134
|
summary: Create and manage Adobe ASE palettes.
|
135
135
|
test_files: []
|