fontist 1.4.0 → 1.5.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 +4 -4
- data/README.md +176 -6
- data/bin/fontist +1 -1
- data/fontist.gemspec +1 -0
- data/lib/fontist.rb +1 -0
- data/lib/fontist/cli.rb +39 -1
- data/lib/fontist/errors.rb +2 -0
- data/lib/fontist/font.rb +12 -3
- data/lib/fontist/formula.rb +16 -1
- data/lib/fontist/formula_template.rb +25 -20
- data/lib/fontist/import/files/collection_file.rb +5 -6
- data/lib/fontist/import/formula_builder.rb +45 -4
- data/lib/fontist/import/helpers/system_helper.rb +4 -1
- data/lib/fontist/manifest.rb +2 -0
- data/lib/fontist/manifest/common.rb +60 -0
- data/lib/fontist/manifest/install.rb +36 -0
- data/lib/fontist/manifest/locations.rb +13 -0
- data/lib/fontist/system_font.rb +43 -6
- data/lib/fontist/version.rb +1 -1
- metadata +20 -3
- data/bin/stripttc +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 398c687688ac621dd160d7245b073764e5203ec1993b4d0db185e9b1ba82ec78
|
4
|
+
data.tar.gz: 20222086aaa6372fcab4c4f8726821bbeffc1808f939b498bfb369130da9218c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 60cae1ca82451a485a94ef95c9472dfe78e7dc8d30df79b3bcf44eb9c4861826ab6f59f8caf030008af2278bed8b2eb0a6ac061e8556c73949fb359b0bfc85c8
|
7
|
+
data.tar.gz: b702b24e7da4f8ac71ad0fa347a50e73d09171954b986fc2c0cbf8cd206642aed6b770de7e32db4f86e2e409289d401cd9c7d09fe64f775769c38b03038b585e
|
data/README.md
CHANGED
@@ -132,6 +132,182 @@ The return values are ` OpenStruct` object, so you can easily do any other
|
|
132
132
|
operation you would do in any ruby object.
|
133
133
|
|
134
134
|
|
135
|
+
### Manifest
|
136
|
+
|
137
|
+
#### Locations
|
138
|
+
|
139
|
+
Fontist lets find font locations from a YAML manifest of the following format:
|
140
|
+
|
141
|
+
```yml
|
142
|
+
Segoe UI:
|
143
|
+
- Regular
|
144
|
+
- Bold
|
145
|
+
Roboto Mono:
|
146
|
+
- Regular
|
147
|
+
```
|
148
|
+
|
149
|
+
Calling the following code returns a nested hash with font paths.
|
150
|
+
|
151
|
+
```ruby
|
152
|
+
Fontist::Manifest::Locations.call(manifest_path)
|
153
|
+
```
|
154
|
+
|
155
|
+
```ruby
|
156
|
+
{"Segoe UI"=>
|
157
|
+
{"Regular"=>["/Users/user/.fontist/fonts/SEGOEUI.TTF"],
|
158
|
+
"Bold"=>["/Users/user/.fontist/fonts/SEGOEUIB.TTF"]},
|
159
|
+
"Roboto Mono"=>
|
160
|
+
{"Regular"=>[]}}
|
161
|
+
```
|
162
|
+
|
163
|
+
#### Install
|
164
|
+
|
165
|
+
Fontist lets not only to get font locations but also to install fonts from the
|
166
|
+
manifest:
|
167
|
+
|
168
|
+
```ruby
|
169
|
+
Fontist::Manifest::Install.call(manifest, confirmation: "yes")
|
170
|
+
```
|
171
|
+
|
172
|
+
It will install fonts and return their locations:
|
173
|
+
|
174
|
+
```ruby
|
175
|
+
{"Segoe UI"=>
|
176
|
+
{"Regular"=>["/Users/user/.fontist/fonts/SEGOEUI.TTF"],
|
177
|
+
"Bold"=>["/Users/user/.fontist/fonts/SEGOEUIB.TTF"]},
|
178
|
+
"Roboto Mono"=>
|
179
|
+
{"Regular"=>["/Users/user/.fontist/fonts/RobotoMono-VariableFont_wght.ttf"]}}
|
180
|
+
```
|
181
|
+
|
182
|
+
### CLI
|
183
|
+
|
184
|
+
These commands makes possible to operate with fonts via command line. The CLI
|
185
|
+
properly supports exit status, so in a case of error it returns a status code
|
186
|
+
higher or equal than 1.
|
187
|
+
|
188
|
+
All searches are case-insensitive for ease of use.
|
189
|
+
|
190
|
+
#### Install
|
191
|
+
|
192
|
+
The `install` command is similar to the `Font.install` call. It first checks
|
193
|
+
whether this font is already installed, and if not, then installs the font and
|
194
|
+
returns its paths. Font or formula could be specified as a name.
|
195
|
+
|
196
|
+
```
|
197
|
+
$ fontist install "segoe ui"
|
198
|
+
These fonts are found or installed:
|
199
|
+
/Users/user/.fontist/fonts/SEGOEUI.TTF
|
200
|
+
/Users/user/.fontist/fonts/SEGOEUIB.TTF
|
201
|
+
/Users/user/.fontist/fonts/SEGOEUII.TTF
|
202
|
+
/Users/user/.fontist/fonts/SEGOEUIZ.TTF
|
203
|
+
```
|
204
|
+
|
205
|
+
#### Uninstall
|
206
|
+
|
207
|
+
Uninstalls any font supported by Fontist. Returns paths of an uninstalled font,
|
208
|
+
or prints an error telling that the font isn't installed or could not be found
|
209
|
+
in Fontist formulas. Aliased as `remove`.
|
210
|
+
|
211
|
+
```
|
212
|
+
$ fontist uninstall "segoe ui"
|
213
|
+
These fonts are removed:
|
214
|
+
/Users/user/.fontist/fonts/SEGOEUII.TTF
|
215
|
+
/Users/user/.fontist/fonts/SEGOEUIZ.TTF
|
216
|
+
/Users/user/.fontist/fonts/SEGOEUIB.TTF
|
217
|
+
/Users/user/.fontist/fonts/SEGOEUI.TTF
|
218
|
+
```
|
219
|
+
|
220
|
+
#### Status
|
221
|
+
|
222
|
+
Prints installed font paths grouped by formula and font.
|
223
|
+
|
224
|
+
```
|
225
|
+
$ fontist status "segoe ui"
|
226
|
+
Fontist::Formulas::SegoeUIFont
|
227
|
+
Segoe UI
|
228
|
+
Regular (/Users/user/.fontist/fonts/SEGOEUI.TTF)
|
229
|
+
Bold (/Users/user/.fontist/fonts/SEGOEUIB.TTF)
|
230
|
+
Italic (/Users/user/.fontist/fonts/SEGOEUII.TTF)
|
231
|
+
Bold Italic (/Users/user/.fontist/fonts/SEGOEUIZ.TTF)
|
232
|
+
```
|
233
|
+
|
234
|
+
#### List
|
235
|
+
|
236
|
+
Lists installation status of fonts supported by Fontist.
|
237
|
+
|
238
|
+
```
|
239
|
+
$ fontist list "segoe ui"
|
240
|
+
Fontist::Formulas::SegoeUIFont
|
241
|
+
Segoe UI
|
242
|
+
Regular (installed)
|
243
|
+
Bold (installed)
|
244
|
+
Italic (installed)
|
245
|
+
Bold Italic (installed)
|
246
|
+
```
|
247
|
+
|
248
|
+
```
|
249
|
+
$ fontist list "roboto mono"
|
250
|
+
Fontist::Formulas::RobotoMonoFont
|
251
|
+
Roboto Mono
|
252
|
+
Regular (uninstalled)
|
253
|
+
Italic (uninstalled)
|
254
|
+
```
|
255
|
+
|
256
|
+
#### Locations from manifest
|
257
|
+
|
258
|
+
Returns locations of fonts specified in a YAML file as an input.
|
259
|
+
|
260
|
+
For example, if there is a file `manifest.yml`:
|
261
|
+
|
262
|
+
```yml
|
263
|
+
Segoe UI:
|
264
|
+
- Regular
|
265
|
+
- Bold
|
266
|
+
Roboto Mono:
|
267
|
+
- Regular
|
268
|
+
```
|
269
|
+
|
270
|
+
Then the command will return the following YAML output:
|
271
|
+
|
272
|
+
```yml
|
273
|
+
$ fontist manifest-locations manifest.yml
|
274
|
+
---
|
275
|
+
Segoe UI:
|
276
|
+
Regular:
|
277
|
+
- "/Users/user/.fontist/fonts/SEGOEUI.TTF"
|
278
|
+
Bold:
|
279
|
+
- "/Users/user/.fontist/fonts/SEGOEUIB.TTF"
|
280
|
+
Roboto Mono:
|
281
|
+
Regular: []
|
282
|
+
```
|
283
|
+
|
284
|
+
Since Segoe UI is installed, but Roboto Mono is not.
|
285
|
+
|
286
|
+
#### Install from manifest
|
287
|
+
|
288
|
+
Install fonts from a YAML manifest:
|
289
|
+
|
290
|
+
```yml
|
291
|
+
$ fontist manifest-install --confirm-license manifest.yml
|
292
|
+
---
|
293
|
+
Segoe UI:
|
294
|
+
Regular:
|
295
|
+
- "/Users/user/.fontist/fonts/SEGOEUI.TTF"
|
296
|
+
Bold:
|
297
|
+
- "/Users/user/.fontist/fonts/SEGOEUIB.TTF"
|
298
|
+
Roboto Mono:
|
299
|
+
Regular:
|
300
|
+
- "/Users/user/.fontist/fonts/RobotoMono-VariableFont_wght.ttf"
|
301
|
+
```
|
302
|
+
|
303
|
+
#### Help
|
304
|
+
|
305
|
+
List of all commands could be seen by:
|
306
|
+
|
307
|
+
```
|
308
|
+
fontist help
|
309
|
+
```
|
310
|
+
|
135
311
|
## Development
|
136
312
|
|
137
313
|
We are following Sandi Metz's Rules for this gem, you can read the
|
@@ -197,12 +373,6 @@ git commit -m "Google Fonts update"
|
|
197
373
|
git push
|
198
374
|
```
|
199
375
|
|
200
|
-
### TTC extraction
|
201
|
-
|
202
|
-
The stripttc script is used for extraction of TTC files. It's taken from the
|
203
|
-
https://github.com/DavidBarts/getfonts repository, and placed in the bin/
|
204
|
-
directory.
|
205
|
-
|
206
376
|
## Contributing
|
207
377
|
|
208
378
|
First, thank you for contributing! We love pull requests from everyone. By
|
data/bin/fontist
CHANGED
data/fontist.gemspec
CHANGED
@@ -35,6 +35,7 @@ Gem::Specification.new do |spec|
|
|
35
35
|
spec.add_runtime_dependency "thor", "~> 1.0.1"
|
36
36
|
spec.add_runtime_dependency "git", "~> 1.0"
|
37
37
|
|
38
|
+
spec.add_development_dependency "extract_ttc", "~> 0.1"
|
38
39
|
spec.add_development_dependency "pry"
|
39
40
|
spec.add_development_dependency "bundler", "~> 2.0"
|
40
41
|
spec.add_development_dependency "rake", "~> 12.3.3"
|
data/lib/fontist.rb
CHANGED
data/lib/fontist/cli.rb
CHANGED
@@ -5,9 +5,15 @@ module Fontist
|
|
5
5
|
STATUS_SUCCESS = 0
|
6
6
|
STATUS_ERROR = 1
|
7
7
|
|
8
|
+
def self.exit_on_failure?
|
9
|
+
false
|
10
|
+
end
|
11
|
+
|
8
12
|
desc "install FONT", "Install font by font or formula"
|
13
|
+
option :force, type: :boolean, aliases: :f,
|
14
|
+
desc: "Install even if it's already installed in system"
|
9
15
|
def install(font)
|
10
|
-
fonts_paths = Fontist::Font.install(font)
|
16
|
+
fonts_paths = Fontist::Font.install(font, force: options[:force])
|
11
17
|
Fontist.ui.success("These fonts are found or installed:")
|
12
18
|
Fontist.ui.success(fonts_paths.join("\n"))
|
13
19
|
STATUS_SUCCESS
|
@@ -60,6 +66,34 @@ module Fontist
|
|
60
66
|
STATUS_SUCCESS
|
61
67
|
end
|
62
68
|
|
69
|
+
desc "manifest-locations MANIFEST",
|
70
|
+
"Get locations of fonts from MANIFEST (yaml)"
|
71
|
+
def manifest_locations(manifest)
|
72
|
+
paths = Fontist::Manifest::Locations.call(manifest)
|
73
|
+
print_yaml(paths)
|
74
|
+
success
|
75
|
+
rescue Fontist::Errors::ManifestCouldNotBeFoundError
|
76
|
+
error("Manifest could not be found.")
|
77
|
+
rescue Fontist::Errors::ManifestCouldNotBeReadError
|
78
|
+
error("Manifest could not be read.")
|
79
|
+
end
|
80
|
+
|
81
|
+
desc "manifest-install MANIFEST", "Install fonts from MANIFEST (yaml)"
|
82
|
+
option :confirm_license, type: :boolean, desc: "Confirm license agreement"
|
83
|
+
def manifest_install(manifest)
|
84
|
+
paths = Fontist::Manifest::Install.call(
|
85
|
+
manifest,
|
86
|
+
confirmation: options[:confirm_license] ? "yes" : "no"
|
87
|
+
)
|
88
|
+
|
89
|
+
print_yaml(paths)
|
90
|
+
success
|
91
|
+
rescue Fontist::Errors::ManifestCouldNotBeFoundError
|
92
|
+
error("Manifest could not be found.")
|
93
|
+
rescue Fontist::Errors::ManifestCouldNotBeReadError
|
94
|
+
error("Manifest could not be read.")
|
95
|
+
end
|
96
|
+
|
63
97
|
desc "create-formula URL", "Create a new formula with fonts from URL"
|
64
98
|
option :name, desc: "Example: Times New Roman"
|
65
99
|
option :mirror, repeatable: true
|
@@ -81,6 +115,10 @@ module Fontist
|
|
81
115
|
STATUS_ERROR
|
82
116
|
end
|
83
117
|
|
118
|
+
def print_yaml(object)
|
119
|
+
Fontist.ui.say(YAML.dump(object))
|
120
|
+
end
|
121
|
+
|
84
122
|
def print_formulas(formulas)
|
85
123
|
formulas.each do |formula, fonts|
|
86
124
|
Fontist.ui.success(formula.installer)
|
data/lib/fontist/errors.rb
CHANGED
@@ -9,5 +9,7 @@ module Fontist
|
|
9
9
|
class MissingAttributeError < StandardError; end
|
10
10
|
class FontNotFoundError < StandardError; end
|
11
11
|
class BinaryCallError < StandardError; end
|
12
|
+
class ManifestCouldNotBeReadError < StandardError; end
|
13
|
+
class ManifestCouldNotBeFoundError < StandardError; end
|
12
14
|
end
|
13
15
|
end
|
data/lib/fontist/font.rb
CHANGED
@@ -3,6 +3,7 @@ module Fontist
|
|
3
3
|
def initialize(options = {})
|
4
4
|
@name = options.fetch(:name, nil)
|
5
5
|
@confirmation = options.fetch(:confirmation, "no")
|
6
|
+
@force = options.fetch(:force, false)
|
6
7
|
|
7
8
|
check_or_create_fontist_path!
|
8
9
|
end
|
@@ -15,8 +16,12 @@ module Fontist
|
|
15
16
|
new(name: name).find
|
16
17
|
end
|
17
18
|
|
18
|
-
def self.install(name, confirmation: "no")
|
19
|
-
new(name: name, confirmation: confirmation).install
|
19
|
+
def self.install(name, confirmation: "no", force: false)
|
20
|
+
new(name: name, confirmation: confirmation, force: force).install
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.try_install(name, confirmation: "no")
|
24
|
+
new(name: name, confirmation: confirmation).try_install
|
20
25
|
end
|
21
26
|
|
22
27
|
def self.uninstall(name)
|
@@ -38,11 +43,15 @@ module Fontist
|
|
38
43
|
end
|
39
44
|
|
40
45
|
def install
|
41
|
-
find_system_font || download_font || raise(
|
46
|
+
(find_system_font unless @force) || download_font || raise(
|
42
47
|
Fontist::Errors::NonSupportedFontError
|
43
48
|
)
|
44
49
|
end
|
45
50
|
|
51
|
+
def try_install
|
52
|
+
download_font
|
53
|
+
end
|
54
|
+
|
46
55
|
def uninstall
|
47
56
|
uninstall_font || downloadable_font || raise(
|
48
57
|
Fontist::Errors::NonSupportedFontError
|
data/lib/fontist/formula.rb
CHANGED
@@ -2,6 +2,7 @@ module Fontist
|
|
2
2
|
class Formula
|
3
3
|
def initialize(options = {})
|
4
4
|
@font_name = options.fetch(:font_name, nil)
|
5
|
+
@style_name = options.fetch(:style_name, nil)
|
5
6
|
|
6
7
|
check_and_register_font_formulas
|
7
8
|
end
|
@@ -18,6 +19,10 @@ module Fontist
|
|
18
19
|
new(font_name: name).find_fonts
|
19
20
|
end
|
20
21
|
|
22
|
+
def self.find_styles(font, style)
|
23
|
+
new(font_name: font, style_name: style).find_styles
|
24
|
+
end
|
25
|
+
|
21
26
|
def all
|
22
27
|
@all ||= Fontist::Registry.instance.formulas
|
23
28
|
end
|
@@ -32,9 +37,19 @@ module Fontist
|
|
32
37
|
fonts.empty? ? nil : fonts
|
33
38
|
end
|
34
39
|
|
40
|
+
def find_styles
|
41
|
+
formulas.values.flat_map do |formula|
|
42
|
+
formula.fonts.flat_map do |f|
|
43
|
+
f.styles.select do |s|
|
44
|
+
f.name.casecmp?(font_name) && s.type.casecmp?(style_name)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
35
50
|
private
|
36
51
|
|
37
|
-
attr_reader :font_name
|
52
|
+
attr_reader :font_name, :style_name
|
38
53
|
|
39
54
|
def find_formula
|
40
55
|
find_by_key || find_by_font_name || find_by_font || []
|
@@ -2,9 +2,10 @@ module Fontist
|
|
2
2
|
class FormulaTemplate
|
3
3
|
def self.create_formula_class(formula)
|
4
4
|
Class.new(FontFormula) do |klass|
|
5
|
-
|
5
|
+
first_font = (formula.fonts || formula.font_collections.first.fonts).first
|
6
|
+
cleanname = first_font.name.gsub(/ /, "")
|
6
7
|
resource_name = formula.resources.to_h.keys.first
|
7
|
-
font_filename =
|
8
|
+
font_filename = first_font.styles.first.font
|
8
9
|
|
9
10
|
key formula.key&.to_sym || formula.name.gsub(/ /, "_").downcase.to_sym
|
10
11
|
display_progress_bar formula.display_progress_bar if formula.display_progress_bar
|
@@ -31,22 +32,24 @@ module Fontist
|
|
31
32
|
end
|
32
33
|
end
|
33
34
|
|
34
|
-
formula.fonts
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
35
|
+
if formula.fonts
|
36
|
+
formula.fonts.each do |font|
|
37
|
+
provides_font(
|
38
|
+
font.name,
|
39
|
+
match_styles_from_file: font.styles.map do |style|
|
40
|
+
{
|
41
|
+
family_name: style.family_name,
|
42
|
+
style: style.type,
|
43
|
+
full_name: style.full_name,
|
44
|
+
post_script_name: style.post_script_name,
|
45
|
+
version: style.version,
|
46
|
+
description: style.description,
|
47
|
+
filename: style.font,
|
48
|
+
copyright: style.copyright,
|
49
|
+
}
|
50
|
+
end
|
51
|
+
)
|
52
|
+
end
|
50
53
|
end
|
51
54
|
|
52
55
|
klass.define_method :extract do
|
@@ -61,8 +64,10 @@ module Fontist
|
|
61
64
|
end
|
62
65
|
end
|
63
66
|
|
64
|
-
formula.fonts
|
65
|
-
|
67
|
+
if formula.fonts
|
68
|
+
formula.fonts.each do |font|
|
69
|
+
match_fonts(resource, font.name)
|
70
|
+
end
|
66
71
|
end
|
67
72
|
|
68
73
|
if formula.font_collections
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require "extract_ttc"
|
1
2
|
require "fontist/import/helpers/system_helper"
|
2
3
|
require_relative "../otf/font_file"
|
3
4
|
|
@@ -5,8 +6,6 @@ module Fontist
|
|
5
6
|
module Import
|
6
7
|
module Files
|
7
8
|
class CollectionFile
|
8
|
-
STRIP_TTC_BINARY = Fontist.root_path.join("bin", "stripttc")
|
9
|
-
|
10
9
|
attr_reader :fonts
|
11
10
|
|
12
11
|
def initialize(path)
|
@@ -37,10 +36,10 @@ module Fontist
|
|
37
36
|
end
|
38
37
|
|
39
38
|
def extract_ttfs(tmp_dir)
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
filenames = ExtractTtc.extract(@path)
|
40
|
+
filenames.map do |filename|
|
41
|
+
File.join(tmp_dir, filename)
|
42
|
+
end
|
44
43
|
end
|
45
44
|
end
|
46
45
|
end
|
@@ -39,7 +39,7 @@ module Fontist
|
|
39
39
|
|
40
40
|
def group_fonts
|
41
41
|
files = (@font_files + @font_collection_files.map(&:fonts)).flatten
|
42
|
-
raise FontNotFoundError, "No font found" if files.empty?
|
42
|
+
raise Errors::FontNotFoundError, "No font found" if files.empty?
|
43
43
|
|
44
44
|
files
|
45
45
|
end
|
@@ -55,10 +55,51 @@ module Fontist
|
|
55
55
|
def resources
|
56
56
|
filename = name.gsub(" ", "_") + "." + @extractor.extension
|
57
57
|
|
58
|
-
|
59
|
-
|
58
|
+
{ filename => resource_options }
|
59
|
+
end
|
60
|
+
|
61
|
+
def resource_options
|
62
|
+
urls = []
|
63
|
+
sha = []
|
64
|
+
downloads do |url, path|
|
65
|
+
urls << url
|
66
|
+
sha << Digest::SHA256.file(path).to_s
|
67
|
+
end
|
68
|
+
|
69
|
+
sha = prepare_sha256(sha)
|
70
|
+
|
71
|
+
{ urls: urls, sha256: sha }
|
72
|
+
end
|
73
|
+
|
74
|
+
def downloads
|
75
|
+
yield @url, @archive
|
76
|
+
|
77
|
+
mirrors.each do |url|
|
78
|
+
path = download(url)
|
79
|
+
next unless path
|
80
|
+
|
81
|
+
yield url, path
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def mirrors
|
86
|
+
@options[:mirror] || []
|
87
|
+
end
|
88
|
+
|
89
|
+
def download(url)
|
90
|
+
Fontist::Utils::Downloader.download(url, progress_bar: true).path
|
91
|
+
rescue Errors::InvalidResourceError
|
92
|
+
Fontist.ui.say("WARN: a mirror is not found '#{url}'")
|
93
|
+
nil
|
94
|
+
end
|
95
|
+
|
96
|
+
def prepare_sha256(input)
|
97
|
+
output = input.uniq
|
98
|
+
return output.first if output.size == 1
|
60
99
|
|
61
|
-
|
100
|
+
checksums = output.join(", ")
|
101
|
+
Fontist.ui.say("WARN: SHA256 differs (#{checksums})")
|
102
|
+
output
|
62
103
|
end
|
63
104
|
|
64
105
|
def font_collections
|
@@ -4,7 +4,10 @@ module Fontist
|
|
4
4
|
module SystemHelper
|
5
5
|
class << self
|
6
6
|
def run(command)
|
7
|
-
|
7
|
+
unless ENV.fetch("TEST_ENV", "") === "CI"
|
8
|
+
Fontist.ui.say("Run `#{command}`")
|
9
|
+
end
|
10
|
+
|
8
11
|
result = `#{command}`
|
9
12
|
unless $CHILD_STATUS.to_i.zero?
|
10
13
|
raise Errors::BinaryCallError,
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Fontist
|
2
|
+
module Manifest
|
3
|
+
class Common
|
4
|
+
def initialize(manifest)
|
5
|
+
@manifest = manifest
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.call(manifest)
|
9
|
+
new(manifest).call
|
10
|
+
end
|
11
|
+
|
12
|
+
def call
|
13
|
+
font_names.zip(font_paths).to_h
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def font_names
|
19
|
+
fonts.keys
|
20
|
+
end
|
21
|
+
|
22
|
+
def fonts
|
23
|
+
@fonts ||= begin
|
24
|
+
unless File.exist?(@manifest)
|
25
|
+
raise Fontist::Errors::ManifestCouldNotBeFoundError
|
26
|
+
end
|
27
|
+
|
28
|
+
fonts = YAML.load_file(@manifest)
|
29
|
+
unless fonts.is_a?(Hash)
|
30
|
+
raise Fontist::Errors::ManifestCouldNotBeReadError
|
31
|
+
end
|
32
|
+
|
33
|
+
fonts
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def font_paths
|
38
|
+
fonts.map do |font, styles|
|
39
|
+
styles_to_ary = [styles].flatten
|
40
|
+
style_paths_map(font, styles_to_ary)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def style_paths_map(font, names)
|
45
|
+
paths = style_paths(font, names)
|
46
|
+
names.zip(paths).to_h
|
47
|
+
end
|
48
|
+
|
49
|
+
def style_paths(font, names)
|
50
|
+
names.map do |style|
|
51
|
+
file_paths(font, style)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def file_paths(_font, _style)
|
56
|
+
raise NotImplementedError.new("Implement #file_paths in child class")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require_relative "common"
|
2
|
+
|
3
|
+
module Fontist
|
4
|
+
module Manifest
|
5
|
+
class Install < Common
|
6
|
+
def initialize(manifest, confirmation: "no")
|
7
|
+
@manifest = manifest
|
8
|
+
@confirmation = confirmation
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.call(manifest, confirmation: "no")
|
12
|
+
new(manifest, confirmation: confirmation).call
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def file_paths(font, style)
|
18
|
+
paths = find_installed_font(font, style)
|
19
|
+
return paths unless paths.empty?
|
20
|
+
|
21
|
+
install_font(font)
|
22
|
+
find_installed_font(font, style)
|
23
|
+
end
|
24
|
+
|
25
|
+
def find_installed_font(font, style)
|
26
|
+
Fontist::SystemFont.find_with_style(font, style)
|
27
|
+
end
|
28
|
+
|
29
|
+
def install_font(font)
|
30
|
+
Fontist::Font.try_install(font, confirmation: @confirmation)
|
31
|
+
rescue Fontist::Errors::LicensingError
|
32
|
+
[] # try to install other fonts
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/fontist/system_font.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Fontist
|
2
2
|
class SystemFont
|
3
|
-
def initialize(font:, sources: nil)
|
3
|
+
def initialize(font:, style: nil, sources: nil)
|
4
4
|
@font = font
|
5
|
+
@style = style
|
5
6
|
@user_sources = sources || []
|
6
7
|
end
|
7
8
|
|
@@ -9,6 +10,10 @@ module Fontist
|
|
9
10
|
new(font: font, sources: sources).find
|
10
11
|
end
|
11
12
|
|
13
|
+
def self.find_with_style(font, style)
|
14
|
+
new(font: font, style: style).find_with_style
|
15
|
+
end
|
16
|
+
|
12
17
|
def find
|
13
18
|
paths = grep_font_paths(font)
|
14
19
|
paths = lookup_using_font_name || [] if paths.empty?
|
@@ -16,9 +21,16 @@ module Fontist
|
|
16
21
|
paths.empty? ? nil : paths
|
17
22
|
end
|
18
23
|
|
24
|
+
def find_with_style
|
25
|
+
paths = lookup_using_font_and_style
|
26
|
+
return paths unless paths.empty?
|
27
|
+
|
28
|
+
grep_font_paths(font, style)
|
29
|
+
end
|
30
|
+
|
19
31
|
private
|
20
32
|
|
21
|
-
attr_reader :font, :user_sources
|
33
|
+
attr_reader :font, :style, :user_sources
|
22
34
|
|
23
35
|
def normalize_default_paths
|
24
36
|
@normalize_default_paths ||= default_sources["paths"].map do |path|
|
@@ -30,15 +42,27 @@ module Fontist
|
|
30
42
|
end
|
31
43
|
end
|
32
44
|
|
33
|
-
def grep_font_paths(font)
|
45
|
+
def grep_font_paths(font, style = nil)
|
46
|
+
pattern = prepare_pattern(font, style)
|
47
|
+
|
34
48
|
paths = font_paths.map { |path| [File.basename(path), path] }.to_h
|
35
49
|
files = paths.keys
|
36
|
-
matched = files.grep(
|
50
|
+
matched = files.grep(pattern)
|
37
51
|
paths.values_at(*matched).compact
|
38
52
|
end
|
39
53
|
|
54
|
+
def prepare_pattern(font, style = nil)
|
55
|
+
style = nil if style&.casecmp?("regular")
|
56
|
+
|
57
|
+
s = [font, style].compact.map { |x| Regexp.quote(x) }
|
58
|
+
.join(".*")
|
59
|
+
.gsub("\\ ", "\s?") # space independent
|
60
|
+
|
61
|
+
Regexp.new(s, Regexp::IGNORECASE)
|
62
|
+
end
|
63
|
+
|
40
64
|
def font_paths
|
41
|
-
Dir.glob((
|
65
|
+
@font_paths ||= Dir.glob((
|
42
66
|
user_sources +
|
43
67
|
normalize_default_paths +
|
44
68
|
[fontist_fonts_path.join("**")]
|
@@ -54,7 +78,6 @@ module Fontist
|
|
54
78
|
@fontist_fonts_path ||= Fontist.fonts_path
|
55
79
|
end
|
56
80
|
|
57
|
-
|
58
81
|
def user_os
|
59
82
|
Fontist::Utils::System.user_os
|
60
83
|
end
|
@@ -71,5 +94,19 @@ module Fontist
|
|
71
94
|
def default_sources
|
72
95
|
@default_sources ||= YAML.load(system_path_file)["system"][user_os.to_s]
|
73
96
|
end
|
97
|
+
|
98
|
+
def lookup_using_font_and_style
|
99
|
+
styles = Formula.find_styles(font, style)
|
100
|
+
filenames = styles.map(&:font)
|
101
|
+
filenames.flat_map do |filename|
|
102
|
+
search_font_paths(filename)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def search_font_paths(filename)
|
107
|
+
font_paths.select do |path|
|
108
|
+
File.basename(path) == filename
|
109
|
+
end
|
110
|
+
end
|
74
111
|
end
|
75
112
|
end
|
data/lib/fontist/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fontist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-10
|
12
|
+
date: 2020-11-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: down
|
@@ -109,6 +109,20 @@ dependencies:
|
|
109
109
|
- - "~>"
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '1.0'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: extract_ttc
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - "~>"
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0.1'
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - "~>"
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0.1'
|
112
126
|
- !ruby/object:Gem::Dependency
|
113
127
|
name: pry
|
114
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -250,7 +264,6 @@ files:
|
|
250
264
|
- bin/import_google
|
251
265
|
- bin/rspec
|
252
266
|
- bin/setup
|
253
|
-
- bin/stripttc
|
254
267
|
- fontist.gemspec
|
255
268
|
- lib/fontist.rb
|
256
269
|
- lib/fontist/cli.rb
|
@@ -292,6 +305,10 @@ files:
|
|
292
305
|
- lib/fontist/import/recursive_extraction.rb
|
293
306
|
- lib/fontist/import/template_helper.rb
|
294
307
|
- lib/fontist/import/text_helper.rb
|
308
|
+
- lib/fontist/manifest.rb
|
309
|
+
- lib/fontist/manifest/common.rb
|
310
|
+
- lib/fontist/manifest/install.rb
|
311
|
+
- lib/fontist/manifest/locations.rb
|
295
312
|
- lib/fontist/registry.rb
|
296
313
|
- lib/fontist/system.yml
|
297
314
|
- lib/fontist/system_font.rb
|
data/bin/stripttc
DELETED
Binary file
|