procreate-swatches 0.1.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 +7 -0
- data/.codeclimate.yml +7 -0
- data/.gitignore +16 -0
- data/.rspec +2 -0
- data/.rubocop.yml +8 -0
- data/.ruby-version +1 -0
- data/.travis.yml +19 -0
- data/.yardopts +5 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +102 -0
- data/LICENSE.txt +21 -0
- data/README.md +230 -0
- data/Rakefile +8 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/doc/Procreate/Swatches/ColorsHelper.html +693 -0
- data/doc/Procreate/Swatches/Errors/InvalidFormat.html +220 -0
- data/doc/Procreate/Swatches/Errors/InvalidPath.html +220 -0
- data/doc/Procreate/Swatches/Errors.html +128 -0
- data/doc/Procreate/Swatches/Exporter.html +754 -0
- data/doc/Procreate/Swatches/Parser.html +622 -0
- data/doc/Procreate/Swatches/Wrapper.html +1168 -0
- data/doc/Procreate/Swatches.html +497 -0
- data/doc/Procreate.html +128 -0
- data/doc/_index.html +209 -0
- data/doc/class_list.html +51 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +58 -0
- data/doc/css/style.css +496 -0
- data/doc/file.CODE_OF_CONDUCT.html +146 -0
- data/doc/file.LICENSE.html +70 -0
- data/doc/file.README.html +296 -0
- data/doc/file_list.html +66 -0
- data/doc/frames.html +17 -0
- data/doc/index.html +296 -0
- data/doc/js/app.js +292 -0
- data/doc/js/full_list.js +216 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +275 -0
- data/doc/top-level-namespace.html +110 -0
- data/lib/procreate/swatches/colors_helper.rb +83 -0
- data/lib/procreate/swatches/errors/invalid_format.rb +19 -0
- data/lib/procreate/swatches/errors/invalid_path.rb +16 -0
- data/lib/procreate/swatches/exporter.rb +131 -0
- data/lib/procreate/swatches/parser.rb +82 -0
- data/lib/procreate/swatches/version.rb +8 -0
- data/lib/procreate/swatches/wrapper.rb +155 -0
- data/lib/procreate/swatches.rb +60 -0
- data/procreate-swatches.gemspec +41 -0
- metadata +275 -0
@@ -0,0 +1,275 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
5
|
+
<meta charset="utf-8" />
|
6
|
+
|
7
|
+
<link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" charset="utf-8" />
|
8
|
+
|
9
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
14
|
+
|
15
|
+
<script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
|
16
|
+
|
17
|
+
|
18
|
+
<title>Method List</title>
|
19
|
+
<base id="base_target" target="_parent" />
|
20
|
+
</head>
|
21
|
+
<body>
|
22
|
+
<div id="content">
|
23
|
+
<div class="fixed_header">
|
24
|
+
<h1 id="full_list_header">Method List</h1>
|
25
|
+
<div id="full_list_nav">
|
26
|
+
|
27
|
+
<span><a target="_self" href="class_list.html">
|
28
|
+
Classes
|
29
|
+
</a></span>
|
30
|
+
|
31
|
+
<span><a target="_self" href="method_list.html">
|
32
|
+
Methods
|
33
|
+
</a></span>
|
34
|
+
|
35
|
+
<span><a target="_self" href="file_list.html">
|
36
|
+
Files
|
37
|
+
</a></span>
|
38
|
+
|
39
|
+
</div>
|
40
|
+
|
41
|
+
<div id="search">Search: <input type="text" /></div>
|
42
|
+
</div>
|
43
|
+
|
44
|
+
<ul id="full_list" class="method">
|
45
|
+
|
46
|
+
|
47
|
+
<li class="odd ">
|
48
|
+
<div class="item">
|
49
|
+
<span class='object_link'><a href="Procreate/Swatches/Wrapper.html#<<-instance_method" title="Procreate::Swatches::Wrapper#<< (method)">#<<</a></span>
|
50
|
+
<small>Procreate::Swatches::Wrapper</small>
|
51
|
+
</div>
|
52
|
+
</li>
|
53
|
+
|
54
|
+
|
55
|
+
<li class="even ">
|
56
|
+
<div class="item">
|
57
|
+
<span class='object_link'><a href="Procreate/Swatches/Wrapper.html#==-instance_method" title="Procreate::Swatches::Wrapper#== (method)">#==</a></span>
|
58
|
+
<small>Procreate::Swatches::Wrapper</small>
|
59
|
+
</div>
|
60
|
+
</li>
|
61
|
+
|
62
|
+
|
63
|
+
<li class="odd ">
|
64
|
+
<div class="item">
|
65
|
+
<span class='object_link'><a href="Procreate/Swatches/Wrapper.html#available_color_formats-instance_method" title="Procreate::Swatches::Wrapper#available_color_formats (method)">#available_color_formats</a></span>
|
66
|
+
<small>Procreate::Swatches::Wrapper</small>
|
67
|
+
</div>
|
68
|
+
</li>
|
69
|
+
|
70
|
+
|
71
|
+
<li class="even ">
|
72
|
+
<div class="item">
|
73
|
+
<span class='object_link'><a href="Procreate/Swatches/Exporter.html#call-instance_method" title="Procreate::Swatches::Exporter#call (method)">#call</a></span>
|
74
|
+
<small>Procreate::Swatches::Exporter</small>
|
75
|
+
</div>
|
76
|
+
</li>
|
77
|
+
|
78
|
+
|
79
|
+
<li class="odd ">
|
80
|
+
<div class="item">
|
81
|
+
<span class='object_link'><a href="Procreate/Swatches/Exporter.html#call-class_method" title="Procreate::Swatches::Exporter.call (method)">call</a></span>
|
82
|
+
<small>Procreate::Swatches::Exporter</small>
|
83
|
+
</div>
|
84
|
+
</li>
|
85
|
+
|
86
|
+
|
87
|
+
<li class="even ">
|
88
|
+
<div class="item">
|
89
|
+
<span class='object_link'><a href="Procreate/Swatches/Parser.html#call-instance_method" title="Procreate::Swatches::Parser#call (method)">#call</a></span>
|
90
|
+
<small>Procreate::Swatches::Parser</small>
|
91
|
+
</div>
|
92
|
+
</li>
|
93
|
+
|
94
|
+
|
95
|
+
<li class="odd ">
|
96
|
+
<div class="item">
|
97
|
+
<span class='object_link'><a href="Procreate/Swatches/Parser.html#call-class_method" title="Procreate::Swatches::Parser.call (method)">call</a></span>
|
98
|
+
<small>Procreate::Swatches::Parser</small>
|
99
|
+
</div>
|
100
|
+
</li>
|
101
|
+
|
102
|
+
|
103
|
+
<li class="even ">
|
104
|
+
<div class="item">
|
105
|
+
<span class='object_link'><a href="Procreate/Swatches/Wrapper.html#colors-instance_method" title="Procreate::Swatches::Wrapper#colors (method)">#colors</a></span>
|
106
|
+
<small>Procreate::Swatches::Wrapper</small>
|
107
|
+
</div>
|
108
|
+
</li>
|
109
|
+
|
110
|
+
|
111
|
+
<li class="odd ">
|
112
|
+
<div class="item">
|
113
|
+
<span class='object_link'><a href="Procreate/Swatches.html#export-class_method" title="Procreate::Swatches.export (method)">export</a></span>
|
114
|
+
<small>Procreate::Swatches</small>
|
115
|
+
</div>
|
116
|
+
</li>
|
117
|
+
|
118
|
+
|
119
|
+
<li class="even ">
|
120
|
+
<div class="item">
|
121
|
+
<span class='object_link'><a href="Procreate/Swatches/Parser.html#file_path-instance_method" title="Procreate::Swatches::Parser#file_path (method)">#file_path</a></span>
|
122
|
+
<small>Procreate::Swatches::Parser</small>
|
123
|
+
</div>
|
124
|
+
</li>
|
125
|
+
|
126
|
+
|
127
|
+
<li class="odd ">
|
128
|
+
<div class="item">
|
129
|
+
<span class='object_link'><a href="Procreate/Swatches/Wrapper.html#initialize-instance_method" title="Procreate::Swatches::Wrapper#initialize (method)">#initialize</a></span>
|
130
|
+
<small>Procreate::Swatches::Wrapper</small>
|
131
|
+
</div>
|
132
|
+
</li>
|
133
|
+
|
134
|
+
|
135
|
+
<li class="even ">
|
136
|
+
<div class="item">
|
137
|
+
<span class='object_link'><a href="Procreate/Swatches/Parser.html#initialize-instance_method" title="Procreate::Swatches::Parser#initialize (method)">#initialize</a></span>
|
138
|
+
<small>Procreate::Swatches::Parser</small>
|
139
|
+
</div>
|
140
|
+
</li>
|
141
|
+
|
142
|
+
|
143
|
+
<li class="odd ">
|
144
|
+
<div class="item">
|
145
|
+
<span class='object_link'><a href="Procreate/Swatches/Exporter.html#initialize-instance_method" title="Procreate::Swatches::Exporter#initialize (method)">#initialize</a></span>
|
146
|
+
<small>Procreate::Swatches::Exporter</small>
|
147
|
+
</div>
|
148
|
+
</li>
|
149
|
+
|
150
|
+
|
151
|
+
<li class="even ">
|
152
|
+
<div class="item">
|
153
|
+
<span class='object_link'><a href="Procreate/Swatches/Errors/InvalidPath.html#message-instance_method" title="Procreate::Swatches::Errors::InvalidPath#message (method)">#message</a></span>
|
154
|
+
<small>Procreate::Swatches::Errors::InvalidPath</small>
|
155
|
+
</div>
|
156
|
+
</li>
|
157
|
+
|
158
|
+
|
159
|
+
<li class="odd ">
|
160
|
+
<div class="item">
|
161
|
+
<span class='object_link'><a href="Procreate/Swatches/Errors/InvalidFormat.html#message-instance_method" title="Procreate::Swatches::Errors::InvalidFormat#message (method)">#message</a></span>
|
162
|
+
<small>Procreate::Swatches::Errors::InvalidFormat</small>
|
163
|
+
</div>
|
164
|
+
</li>
|
165
|
+
|
166
|
+
|
167
|
+
<li class="even ">
|
168
|
+
<div class="item">
|
169
|
+
<span class='object_link'><a href="Procreate/Swatches/Wrapper.html#name-instance_method" title="Procreate::Swatches::Wrapper#name (method)">#name</a></span>
|
170
|
+
<small>Procreate::Swatches::Wrapper</small>
|
171
|
+
</div>
|
172
|
+
</li>
|
173
|
+
|
174
|
+
|
175
|
+
<li class="odd ">
|
176
|
+
<div class="item">
|
177
|
+
<span class='object_link'><a href="Procreate/Swatches/Exporter.html#options-instance_method" title="Procreate::Swatches::Exporter#options (method)">#options</a></span>
|
178
|
+
<small>Procreate::Swatches::Exporter</small>
|
179
|
+
</div>
|
180
|
+
</li>
|
181
|
+
|
182
|
+
|
183
|
+
<li class="even ">
|
184
|
+
<div class="item">
|
185
|
+
<span class='object_link'><a href="Procreate/Swatches.html#parse-class_method" title="Procreate::Swatches.parse (method)">parse</a></span>
|
186
|
+
<small>Procreate::Swatches</small>
|
187
|
+
</div>
|
188
|
+
</li>
|
189
|
+
|
190
|
+
|
191
|
+
<li class="odd ">
|
192
|
+
<div class="item">
|
193
|
+
<span class='object_link'><a href="Procreate/Swatches/Wrapper.html#pop-instance_method" title="Procreate::Swatches::Wrapper#pop (method)">#pop</a></span>
|
194
|
+
<small>Procreate::Swatches::Wrapper</small>
|
195
|
+
</div>
|
196
|
+
</li>
|
197
|
+
|
198
|
+
|
199
|
+
<li class="even ">
|
200
|
+
<div class="item">
|
201
|
+
<span class='object_link'><a href="Procreate/Swatches/ColorsHelper.html#prepare_color_for_push-instance_method" title="Procreate::Swatches::ColorsHelper#prepare_color_for_push (method)">#prepare_color_for_push</a></span>
|
202
|
+
<small>Procreate::Swatches::ColorsHelper</small>
|
203
|
+
</div>
|
204
|
+
</li>
|
205
|
+
|
206
|
+
|
207
|
+
<li class="odd ">
|
208
|
+
<div class="item">
|
209
|
+
<span class='object_link'><a href="Procreate/Swatches/Exporter.html#swatches_path-instance_method" title="Procreate::Swatches::Exporter#swatches_path (method)">#swatches_path</a></span>
|
210
|
+
<small>Procreate::Swatches::Exporter</small>
|
211
|
+
</div>
|
212
|
+
</li>
|
213
|
+
|
214
|
+
|
215
|
+
<li class="even ">
|
216
|
+
<div class="item">
|
217
|
+
<span class='object_link'><a href="Procreate/Swatches/ColorsHelper.html#to_chroma_hsv-instance_method" title="Procreate::Swatches::ColorsHelper#to_chroma_hsv (method)">#to_chroma_hsv</a></span>
|
218
|
+
<small>Procreate::Swatches::ColorsHelper</small>
|
219
|
+
</div>
|
220
|
+
</li>
|
221
|
+
|
222
|
+
|
223
|
+
<li class="odd ">
|
224
|
+
<div class="item">
|
225
|
+
<span class='object_link'><a href="Procreate/Swatches/ColorsHelper.html#to_color_json-instance_method" title="Procreate::Swatches::ColorsHelper#to_color_json (method)">#to_color_json</a></span>
|
226
|
+
<small>Procreate::Swatches::ColorsHelper</small>
|
227
|
+
</div>
|
228
|
+
</li>
|
229
|
+
|
230
|
+
|
231
|
+
<li class="even ">
|
232
|
+
<div class="item">
|
233
|
+
<span class='object_link'><a href="Procreate/Swatches/Wrapper.html#to_file-instance_method" title="Procreate::Swatches::Wrapper#to_file (method)">#to_file</a></span>
|
234
|
+
<small>Procreate::Swatches::Wrapper</small>
|
235
|
+
</div>
|
236
|
+
</li>
|
237
|
+
|
238
|
+
|
239
|
+
<li class="odd ">
|
240
|
+
<div class="item">
|
241
|
+
<span class='object_link'><a href="Procreate/Swatches/Wrapper.html#to_json-instance_method" title="Procreate::Swatches::Wrapper#to_json (method)">#to_json</a></span>
|
242
|
+
<small>Procreate::Swatches::Wrapper</small>
|
243
|
+
</div>
|
244
|
+
</li>
|
245
|
+
|
246
|
+
|
247
|
+
<li class="even ">
|
248
|
+
<div class="item">
|
249
|
+
<span class='object_link'><a href="Procreate/Swatches/ColorsHelper.html#to_swatches_json-instance_method" title="Procreate::Swatches::ColorsHelper#to_swatches_json (method)">#to_swatches_json</a></span>
|
250
|
+
<small>Procreate::Swatches::ColorsHelper</small>
|
251
|
+
</div>
|
252
|
+
</li>
|
253
|
+
|
254
|
+
|
255
|
+
<li class="odd ">
|
256
|
+
<div class="item">
|
257
|
+
<span class='object_link'><a href="Procreate/Swatches/Exporter.html#wrapper-instance_method" title="Procreate::Swatches::Exporter#wrapper (method)">#wrapper</a></span>
|
258
|
+
<small>Procreate::Swatches::Exporter</small>
|
259
|
+
</div>
|
260
|
+
</li>
|
261
|
+
|
262
|
+
|
263
|
+
<li class="even ">
|
264
|
+
<div class="item">
|
265
|
+
<span class='object_link'><a href="Procreate/Swatches/Parser.html#wrapper-instance_method" title="Procreate::Swatches::Parser#wrapper (method)">#wrapper</a></span>
|
266
|
+
<small>Procreate::Swatches::Parser</small>
|
267
|
+
</div>
|
268
|
+
</li>
|
269
|
+
|
270
|
+
|
271
|
+
|
272
|
+
</ul>
|
273
|
+
</div>
|
274
|
+
</body>
|
275
|
+
</html>
|
@@ -0,0 +1,110 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6
|
+
<title>
|
7
|
+
Top Level Namespace
|
8
|
+
|
9
|
+
— Documentation by YARD 0.9.16
|
10
|
+
|
11
|
+
</title>
|
12
|
+
|
13
|
+
<link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
|
14
|
+
|
15
|
+
<link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
|
16
|
+
|
17
|
+
<script type="text/javascript" charset="utf-8">
|
18
|
+
pathId = "";
|
19
|
+
relpath = '';
|
20
|
+
</script>
|
21
|
+
|
22
|
+
|
23
|
+
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
|
24
|
+
|
25
|
+
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
|
26
|
+
|
27
|
+
|
28
|
+
</head>
|
29
|
+
<body>
|
30
|
+
<div class="nav_wrap">
|
31
|
+
<iframe id="nav" src="class_list.html?1"></iframe>
|
32
|
+
<div id="resizer"></div>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div id="main" tabindex="-1">
|
36
|
+
<div id="header">
|
37
|
+
<div id="menu">
|
38
|
+
|
39
|
+
<a href="_index.html">Index</a> »
|
40
|
+
|
41
|
+
|
42
|
+
<span class="title">Top Level Namespace</span>
|
43
|
+
|
44
|
+
</div>
|
45
|
+
|
46
|
+
<div id="search">
|
47
|
+
|
48
|
+
<a class="full_list_link" id="class_list_link"
|
49
|
+
href="class_list.html">
|
50
|
+
|
51
|
+
<svg width="24" height="24">
|
52
|
+
<rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
|
53
|
+
<rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
|
54
|
+
<rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
|
55
|
+
</svg>
|
56
|
+
</a>
|
57
|
+
|
58
|
+
</div>
|
59
|
+
<div class="clear"></div>
|
60
|
+
</div>
|
61
|
+
|
62
|
+
<div id="content"><h1>Top Level Namespace
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
</h1>
|
67
|
+
<div class="box_info">
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
</div>
|
80
|
+
|
81
|
+
<h2>Defined Under Namespace</h2>
|
82
|
+
<p class="children">
|
83
|
+
|
84
|
+
|
85
|
+
<strong class="modules">Modules:</strong> <span class='object_link'><a href="Procreate.html" title="Procreate (module)">Procreate</a></span>
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
|
90
|
+
</p>
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
</div>
|
101
|
+
|
102
|
+
<div id="footer">
|
103
|
+
Generated on Sat Apr 27 09:32:32 2019 by
|
104
|
+
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
105
|
+
0.9.16 (ruby-2.4.3).
|
106
|
+
</div>
|
107
|
+
|
108
|
+
</div>
|
109
|
+
</body>
|
110
|
+
</html>
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Procreate
|
4
|
+
module Swatches
|
5
|
+
# Helper module to interact with colors
|
6
|
+
module ColorsHelper
|
7
|
+
# +.swatches+ files can hold a maximum of 30 colors.
|
8
|
+
SWATCHES_MAX_SIZE = 30
|
9
|
+
# Procreate +.swatches+ don't consider the opacity, therefore a default value of 1 is used.
|
10
|
+
SWATCHES_ALPHA = 1
|
11
|
+
SWATCHES_COLOR_SPACE = 0
|
12
|
+
SELECTED_KEYS = %w[hue saturation brightness].freeze
|
13
|
+
|
14
|
+
# Transforms the {https://github.com/jfairbank/chroma Chroma::Color} color be exported to the +.swatches+ file.
|
15
|
+
#
|
16
|
+
# @param [Chroma::Color] color Color
|
17
|
+
#
|
18
|
+
# @return [Hash{hue => Float, saturation => Float, brightness => Float, alpha => Integer, colorSpace => Integer}]
|
19
|
+
#
|
20
|
+
def to_swatches_json(color)
|
21
|
+
hsv_color = color.hsv
|
22
|
+
|
23
|
+
hue = hsv_color.h / 360
|
24
|
+
saturation = hsv_color.s
|
25
|
+
brightness = hsv_color.v
|
26
|
+
|
27
|
+
to_color_json(hue, saturation, brightness)
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# Transforms the HSV (HSB) parameters into
|
32
|
+
# a hash, to be exported to the +.swatches+ file.
|
33
|
+
#
|
34
|
+
# @param [Float, Integer] hue Hue
|
35
|
+
# @param [Float, Integer] saturation Saturation
|
36
|
+
# @param [Float, Integer] brightness Brightness/Value
|
37
|
+
#
|
38
|
+
# @return [Hash{hue => Float, saturation => Float, brightness => Float, alpha => Integer, colorSpace => Integer}]
|
39
|
+
#
|
40
|
+
def to_color_json(hue, saturation, brightness)
|
41
|
+
{
|
42
|
+
hue: hue,
|
43
|
+
saturation: saturation,
|
44
|
+
brightness: brightness,
|
45
|
+
alpha: SWATCHES_ALPHA,
|
46
|
+
colorSpace: SWATCHES_COLOR_SPACE
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# Generates a string formatted to initialize a {https://github.com/jfairbank/chroma Chroma::Color} from HSV values
|
52
|
+
#
|
53
|
+
# @param [Hash{hue => Float, saturation => Float, brightness => Float}] color Color as hash (from parsed +.swatches+ file)
|
54
|
+
#
|
55
|
+
# @return [String] string String formatted to initialize a {https://github.com/jfairbank/chroma Chroma::Color} from HSV values
|
56
|
+
#
|
57
|
+
def to_chroma_hsv(color)
|
58
|
+
hue, saturation, brightness = *color.values_at(*SELECTED_KEYS)
|
59
|
+
hue, saturation, brightness = *[hue * 360, saturation * 100, brightness * 100].map(&:round)
|
60
|
+
|
61
|
+
+"hsv(#{hue}, #{saturation}%, #{brightness}%)"
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
# Checks a "color" before adding it to a {Procreate::Swatches::Wrapper} instance's colors array.
|
66
|
+
#
|
67
|
+
# @param [Chroma::Color, String] color A string or a {https://github.com/jfairbank/chroma Chroma::Color}
|
68
|
+
#
|
69
|
+
# @return [Chroma::Color] Return a {https://github.com/jfairbank/chroma Chroma::Color} if the color is already an instance of {https://github.com/jfairbank/chroma Chroma::Color}, or the string can be converted to one.
|
70
|
+
# @return [nil] Returns nil when {https://github.com/jfairbank/chroma Chroma::Color} can't build a color object from the provided string
|
71
|
+
#
|
72
|
+
def prepare_color_for_push(color)
|
73
|
+
return color if color.is_a?(Chroma::Color)
|
74
|
+
|
75
|
+
begin
|
76
|
+
Chroma::Color.new(color.dup)
|
77
|
+
rescue Chroma::Errors::UnrecognizedColor
|
78
|
+
nil
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Procreate
|
4
|
+
module Swatches
|
5
|
+
#
|
6
|
+
# Errors used for {Procreate::Swatches}
|
7
|
+
#
|
8
|
+
module Errors
|
9
|
+
# Exception raised when the provided file format is invalid.
|
10
|
+
class InvalidFormat < StandardError
|
11
|
+
MESSAGE = 'Invalid file format specified. Accepted file format: `.swatches`.'
|
12
|
+
|
13
|
+
def message
|
14
|
+
MESSAGE
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Procreate
|
4
|
+
module Swatches
|
5
|
+
module Errors
|
6
|
+
# Exception raised when the specified path is invalid.
|
7
|
+
class InvalidPath < StandardError
|
8
|
+
MESSAGE = 'Invalid file path specified.'
|
9
|
+
|
10
|
+
def message
|
11
|
+
MESSAGE
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'tempfile'
|
4
|
+
require 'zip'
|
5
|
+
|
6
|
+
module Procreate
|
7
|
+
module Swatches
|
8
|
+
#
|
9
|
+
# The class that handles the export of a {Procreate::Swatches::Wrapper} to a
|
10
|
+
# +.swatches+ file.
|
11
|
+
#
|
12
|
+
class Exporter
|
13
|
+
include CallableClass
|
14
|
+
|
15
|
+
# @!method self.call
|
16
|
+
# Creates a new instance of {Procreate::Swatches::Exporter} and calls {#call}
|
17
|
+
# Dynamically included by using {https://github.com/laurentzziu/callable_class CallableClass} gem.
|
18
|
+
|
19
|
+
# An instance of {Procreate::Swatches::Wrapper}
|
20
|
+
attr_accessor :wrapper
|
21
|
+
# The computed path of the +.swatches+ file, after the file was exported.
|
22
|
+
attr_reader :swatches_path
|
23
|
+
|
24
|
+
#
|
25
|
+
# Initialize a new {Exporter}
|
26
|
+
#
|
27
|
+
# @param [Procreate::Swatches::Wrapper] wrapper Wrapper instance
|
28
|
+
# @param [Hash] options Options for exporting the wrapper
|
29
|
+
# @option options [String] :export_directory ('Dir.pwd') The export directory for the +.swatches+ file
|
30
|
+
# @option options [String] :file_name ('Wrapper#name') Custom file name for the exported +.swatches+ file. If none is provided, the +name+ of the +wrapper+ instance is used
|
31
|
+
#
|
32
|
+
def initialize(wrapper, options = {})
|
33
|
+
@wrapper = wrapper
|
34
|
+
parse_options(options)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Exports the +.swatches+ file.
|
38
|
+
#
|
39
|
+
# @return [String] swatches_path Path of the exported +.swatches+ file
|
40
|
+
def call
|
41
|
+
zip_content!
|
42
|
+
|
43
|
+
swatches_path
|
44
|
+
end
|
45
|
+
|
46
|
+
alias export call
|
47
|
+
|
48
|
+
# @!attribute [r] options
|
49
|
+
# Export options
|
50
|
+
# @return [Hash] Export options
|
51
|
+
def options
|
52
|
+
parse_options(@options)
|
53
|
+
end
|
54
|
+
|
55
|
+
# @!attribute [w] options
|
56
|
+
# Export options
|
57
|
+
# @return [Hash] Export options
|
58
|
+
def options=(hash)
|
59
|
+
parse_options(hash)
|
60
|
+
end
|
61
|
+
|
62
|
+
# Permitted options. Any other key will be discarded.
|
63
|
+
PERMITTED_OPTIONS = %i[export_directory file_name].freeze
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
DEFAULT_OPTIONS = {
|
68
|
+
export_directory: Dir.pwd
|
69
|
+
}.freeze
|
70
|
+
|
71
|
+
def parse_options(options)
|
72
|
+
@options = DEFAULT_OPTIONS.merge(
|
73
|
+
options.symbolize_keys.slice(*PERMITTED_OPTIONS)
|
74
|
+
)
|
75
|
+
end
|
76
|
+
|
77
|
+
def create_temp_swatches_file!
|
78
|
+
json_content = wrapper.to_json
|
79
|
+
temp_file = Tempfile.new(wrapper.name)
|
80
|
+
temp_file << json_content
|
81
|
+
temp_file.rewind
|
82
|
+
temp_file.path
|
83
|
+
end
|
84
|
+
|
85
|
+
def zip_content!
|
86
|
+
temp_file = create_temp_swatches_file!
|
87
|
+
|
88
|
+
Zip::File.open(generate_unique_filename, Zip::File::CREATE) do |zipfile|
|
89
|
+
zipfile.add(SWATCHES_FILE_NAME, temp_file)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# http://myprogrammingblog.com/2015/01/05/how-to-ensure-that-filename-is-always-unique-ruby/
|
94
|
+
#
|
95
|
+
# Function generates uniq file name from the String passed to it
|
96
|
+
# based on extension and basename
|
97
|
+
#
|
98
|
+
# @return [String] generated file name
|
99
|
+
def generate_unique_filename
|
100
|
+
name = options[:file_name] || wrapper.name
|
101
|
+
# TODO: Sanitize the file name
|
102
|
+
|
103
|
+
filename = "#{name}.swatches"
|
104
|
+
|
105
|
+
related_files = related_file_indexes(filename)
|
106
|
+
|
107
|
+
filename = if related_files.present?
|
108
|
+
"#{name}-#{related_files.max + 1}#{SWATCHES_EXTENSION}"
|
109
|
+
else
|
110
|
+
"#{name}#{SWATCHES_EXTENSION}"
|
111
|
+
end
|
112
|
+
|
113
|
+
@swatches_path = File.join(options[:export_directory], filename)
|
114
|
+
end
|
115
|
+
|
116
|
+
SWATCHES_EXTENSION = '.swatches'
|
117
|
+
|
118
|
+
def related_file_indexes(file_name)
|
119
|
+
name = File.basename(file_name, SWATCHES_EXTENSION)
|
120
|
+
|
121
|
+
existing_swatches_files(file_name).map do |file|
|
122
|
+
file.split('-').last.to_i if File.basename(file).include?(name) && File.extname(file) == SWATCHES_EXTENSION
|
123
|
+
end.compact
|
124
|
+
end
|
125
|
+
|
126
|
+
def existing_swatches_files(file_name)
|
127
|
+
Dir[Pathname.new(File.dirname(file_name)).join('*')]
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|