fontist 1.11.7 → 1.13.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/.rubocop.yml +1 -18
- data/README.adoc +55 -3
- data/fontist.gemspec +3 -1
- data/lib/fontist/cli/class_options.rb +14 -0
- data/lib/fontist/cli.rb +71 -20
- data/lib/fontist/errors.rb +20 -0
- data/lib/fontist/font.rb +83 -20
- data/lib/fontist/formula.rb +71 -6
- data/lib/fontist/formula_picker.rb +126 -0
- data/lib/fontist/google_cli.rb +1 -9
- data/lib/fontist/import/create_formula.rb +16 -10
- data/lib/fontist/import/files/font_detector.rb +4 -2
- data/lib/fontist/import/formula_builder.rb +24 -15
- data/lib/fontist/import/google/skiplist.yml +1 -0
- data/lib/fontist/import/helpers/system_helper.rb +1 -1
- data/lib/fontist/import/macos.rb +148 -0
- data/lib/fontist/import/manual_formula_builder.rb +24 -0
- data/lib/fontist/import/recursive_extraction.rb +2 -0
- data/lib/fontist/import_cli.rb +17 -0
- data/lib/fontist/indexes/default_family_font_index.rb +4 -1
- data/lib/fontist/repo_cli.rb +6 -0
- data/lib/fontist/style_version.rb +39 -0
- data/lib/fontist/system.yml +1 -0
- data/lib/fontist/update.rb +1 -3
- data/lib/fontist/utils/downloader.rb +5 -8
- data/lib/fontist/utils/system.rb +10 -0
- data/lib/fontist/utils/ui.rb +33 -4
- data/lib/fontist/version.rb +1 -1
- data/lib/fontist.rb +11 -7
- metadata +50 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e0bff9ea15b251c5c03206705574e12cfc9fc4bc779d197d73d20a05977e745
|
4
|
+
data.tar.gz: 33a6538507cc014c1fd4a0b1b11fa908560ae8319e9de13d33120c02a86953b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf17d3b2dd7a687f97db3bd24200d0bd07821bab47ac0c0ce8eeb1156ec1fc95b39660dfb75e6eb13e00080968de1168c83cca7d54caee0c09139d0a167651d6
|
7
|
+
data.tar.gz: 18b6c0294686dcf739b2d1654b8c3e8488d823cb2de1d62659f834c7f8ca443615170d29f3f3bb2b705b27b07cb8a79d80ca6a185d09979c8c0f2f37f8af547f
|
data/.rubocop.yml
CHANGED
@@ -2,21 +2,4 @@ inherit_from:
|
|
2
2
|
- 'https://raw.githubusercontent.com/fontist/oss-guides/master/ci/rubocop.yml'
|
3
3
|
|
4
4
|
AllCops:
|
5
|
-
|
6
|
-
- 'lib/fontist/import/google/fonts_public.pb.rb'
|
7
|
-
- 'lib/fontist/formula_template.rb'
|
8
|
-
|
9
|
-
Rails:
|
10
|
-
Enabled: false
|
11
|
-
|
12
|
-
Layout/LineLength:
|
13
|
-
Exclude:
|
14
|
-
- 'lib/fontist/formulas/**/*.rb'
|
15
|
-
|
16
|
-
Layout/FirstHashElementIndentation:
|
17
|
-
Exclude:
|
18
|
-
- 'lib/fontist/formulas/**/*.rb'
|
19
|
-
|
20
|
-
Layout/HeredocIndentation:
|
21
|
-
Exclude:
|
22
|
-
- 'lib/fontist/formulas/**/*.rb'
|
5
|
+
SuggestExtensions: false
|
data/README.adoc
CHANGED
@@ -117,6 +117,26 @@ NOTE: Specifying the formula's name or the font's filename is not supported.
|
|
117
117
|
|
118
118
|
NOTE: The `install` command is similar to the `Font.install` library call.
|
119
119
|
|
120
|
+
If there are several formulas with a requested font, then `fontist` searches
|
121
|
+
for the newest version of the font among formulas with size below a limit
|
122
|
+
(300 MB). This behavior can be changed with options.
|
123
|
+
|
124
|
+
NOTE: If styles of a font are spread among several formulas, then all
|
125
|
+
available formulas would be installed.
|
126
|
+
|
127
|
+
Supported options:
|
128
|
+
|
129
|
+
-f, [--force]:: Install even if it's already installed in system
|
130
|
+
-F, [--formula]:: Install by formula instead of font
|
131
|
+
-a, [--accept-all-licenses]:: Accept all license agreements
|
132
|
+
-h, [--hide-licenses]:: Hide license texts
|
133
|
+
-p, [--no-progress]:: Hide download progress
|
134
|
+
-V, [--version=VERSION]:: Install particular version of a font
|
135
|
+
-s, [--smallest]:: Install the smallest formula
|
136
|
+
-n, [--newest]:: Install the newest version of a font
|
137
|
+
-S, [--size-limit=N]:: Specify size limit for a formula to be installed
|
138
|
+
(default is 300 MB)
|
139
|
+
|
120
140
|
=== Uninstall fonts
|
121
141
|
|
122
142
|
Uninstalls any font supported by Fontist.
|
@@ -618,7 +638,7 @@ repository https://github.com/fontist/formulas[formulas]:
|
|
618
638
|
|
619
639
|
[source,sh]
|
620
640
|
----
|
621
|
-
cd ~/.fontist/versions/
|
641
|
+
cd ~/.fontist/versions/{last_version}/formulas
|
622
642
|
git add Formulas/google
|
623
643
|
git commit -m "Google Fonts update"
|
624
644
|
git push
|
@@ -640,12 +660,44 @@ They can be updated with:
|
|
640
660
|
[source,sh]
|
641
661
|
----
|
642
662
|
fontist import-sil
|
643
|
-
cd ~/.fontist/formulas
|
644
|
-
git add Formulas/sil
|
663
|
+
cd ~/.fontist/versions/{last_version}/formulas
|
664
|
+
git add Formulas/sil
|
645
665
|
git commit -m "SIL fonts update"
|
646
666
|
git push
|
647
667
|
----
|
648
668
|
|
669
|
+
=== Dynamically importing formulas from macOS
|
670
|
+
|
671
|
+
macOS provides https://support.apple.com/en-om/HT211240#download[fonts] which
|
672
|
+
can be manually downloaded with the Font Book app. When such font is requested,
|
673
|
+
fontist prints information on how to install it.
|
674
|
+
|
675
|
+
In order to know which fonts are available in a current version of macOS,
|
676
|
+
for each version there is a formula containing all supported fonts.
|
677
|
+
|
678
|
+
A new formula can be generated with:
|
679
|
+
|
680
|
+
[source,sh]
|
681
|
+
----
|
682
|
+
fontist import macos --name "Big Sur" --fonts-link "https://support.apple.com/en-om/HT211240#download"
|
683
|
+
cd ~/.fontist/versions/{last_version}/formulas
|
684
|
+
git add Formulas/macos
|
685
|
+
git commit -m "Add Big Sur macOS formula"
|
686
|
+
git push
|
687
|
+
----
|
688
|
+
|
689
|
+
Here `--fonts-link` is a link to a page containing a list of available fonts
|
690
|
+
in the Font Book app.
|
691
|
+
|
692
|
+
If the import is run on a different version of macOS, then a proper version
|
693
|
+
should be set in the `platforms` attribute of the generated formula:
|
694
|
+
|
695
|
+
[source,yaml]
|
696
|
+
----
|
697
|
+
platforms:
|
698
|
+
- macos-20
|
699
|
+
----
|
700
|
+
|
649
701
|
|
650
702
|
== Development
|
651
703
|
|
data/fontist.gemspec
CHANGED
@@ -29,15 +29,17 @@ Gem::Specification.new do |spec|
|
|
29
29
|
|
30
30
|
spec.add_runtime_dependency "down", "~> 5.0"
|
31
31
|
spec.add_runtime_dependency "extract_ttc", "~> 0.1"
|
32
|
+
spec.add_runtime_dependency "nokogiri", "~> 1.0"
|
33
|
+
spec.add_runtime_dependency "sys-uname", "~> 1.2"
|
32
34
|
spec.add_runtime_dependency "thor", "~> 1.0.1"
|
33
35
|
spec.add_runtime_dependency "git", "~> 1.0"
|
34
36
|
spec.add_runtime_dependency "ttfunk", "~> 1.6"
|
37
|
+
spec.add_runtime_dependency "plist", "~> 3.0"
|
35
38
|
spec.add_runtime_dependency "excavate", "~> 0.1"
|
36
39
|
|
37
40
|
spec.add_development_dependency "pry"
|
38
41
|
spec.add_development_dependency "bundler", "~> 2.0"
|
39
42
|
spec.add_development_dependency "gem-release"
|
40
|
-
spec.add_development_dependency "nokogiri", "~> 1.0"
|
41
43
|
spec.add_development_dependency "rake", "~> 13"
|
42
44
|
spec.add_development_dependency "rspec", "~> 3.0"
|
43
45
|
spec.add_development_dependency "rspec-benchmark", "~> 0.6"
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Fontist
|
2
|
+
class CLI < Thor
|
3
|
+
module ClassOptions
|
4
|
+
def handle_class_options(options)
|
5
|
+
Fontist.preferred_family = options[:preferred_family]
|
6
|
+
Fontist.log_level = options[:quiet] ? :fatal : :info
|
7
|
+
|
8
|
+
if options[:formulas_path]
|
9
|
+
Fontist.formulas_path = Pathname.new(options[:formulas_path])
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/fontist/cli.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
require "thor"
|
2
|
+
require "fontist/cli/class_options"
|
2
3
|
require "fontist/repo_cli"
|
4
|
+
require "fontist/import_cli"
|
3
5
|
require "fontist/google_cli"
|
4
6
|
|
5
7
|
module Fontist
|
6
8
|
class CLI < Thor
|
9
|
+
include ClassOptions
|
10
|
+
|
7
11
|
STATUS_SUCCESS = 0
|
8
12
|
STATUS_UNKNOWN_ERROR = 1
|
9
13
|
STATUS_NON_SUPPORTED_FONT_ERROR = 2
|
@@ -15,18 +19,31 @@ module Fontist
|
|
15
19
|
STATUS_REPO_NOT_FOUND = 8
|
16
20
|
STATUS_MAIN_REPO_NOT_FOUND = 9
|
17
21
|
STATUS_REPO_COULD_NOT_BE_UPDATED = 10
|
22
|
+
STATUS_MANUAL_FONT_ERROR = 11
|
23
|
+
STATUS_SIZE_LIMIT_ERROR = 12
|
24
|
+
STATUS_FORMULA_NOT_FOUND = 13
|
18
25
|
|
19
26
|
ERROR_TO_STATUS = {
|
20
27
|
Fontist::Errors::UnsupportedFontError => [STATUS_NON_SUPPORTED_FONT_ERROR],
|
21
28
|
Fontist::Errors::MissingFontError => [STATUS_MISSING_FONT_ERROR],
|
29
|
+
Fontist::Errors::SizeLimitError => [
|
30
|
+
STATUS_SIZE_LIMIT_ERROR,
|
31
|
+
:append,
|
32
|
+
"Please specify higher `--size-limit`, or use the `--newest` or " \
|
33
|
+
"`--smallest` options.",
|
34
|
+
],
|
35
|
+
Fontist::Errors::ManualFontError => [STATUS_MANUAL_FONT_ERROR],
|
22
36
|
Fontist::Errors::LicensingError => [STATUS_LICENSING_ERROR],
|
23
37
|
Fontist::Errors::ManifestCouldNotBeFoundError => [STATUS_MANIFEST_COULD_NOT_BE_FOUND_ERROR,
|
38
|
+
:overwrite,
|
24
39
|
"Manifest could not be found."],
|
25
40
|
Fontist::Errors::ManifestCouldNotBeReadError => [STATUS_MANIFEST_COULD_NOT_BE_READ_ERROR,
|
41
|
+
:overwrite,
|
26
42
|
"Manifest could not be read."],
|
27
43
|
Fontist::Errors::FontIndexCorrupted => [STATUS_FONT_INDEX_CORRUPTED],
|
28
44
|
Fontist::Errors::RepoNotFoundError => [STATUS_REPO_NOT_FOUND],
|
29
45
|
Fontist::Errors::MainRepoNotFoundError => [STATUS_MAIN_REPO_NOT_FOUND],
|
46
|
+
Fontist::Errors::FormulaNotFoundError => [STATUS_FORMULA_NOT_FOUND],
|
30
47
|
}.freeze
|
31
48
|
|
32
49
|
def self.exit_on_failure?
|
@@ -37,21 +54,39 @@ module Fontist
|
|
37
54
|
type: :boolean,
|
38
55
|
desc: "Use Preferred Family when available"
|
39
56
|
|
57
|
+
class_option :quiet,
|
58
|
+
aliases: :q,
|
59
|
+
type: :boolean,
|
60
|
+
desc: "Hide all messages"
|
61
|
+
|
62
|
+
class_option :formulas_path, type: :string, desc: "Path to formulas"
|
63
|
+
|
40
64
|
desc "install FONT", "Install font"
|
41
65
|
option :force, type: :boolean, aliases: :f,
|
42
66
|
desc: "Install even if it's already installed in system"
|
43
|
-
option :
|
44
|
-
|
45
|
-
option :
|
67
|
+
option :formula, type: :boolean, aliases: :F,
|
68
|
+
desc: "Install by formula instead of font"
|
69
|
+
option :accept_all_licenses, type: :boolean,
|
70
|
+
aliases: ["--confirm-license", :a],
|
71
|
+
desc: "Accept all license agreements"
|
72
|
+
option :hide_licenses, type: :boolean, aliases: :h,
|
73
|
+
desc: "Hide license texts"
|
74
|
+
option :no_progress, type: :boolean, aliases: :p,
|
75
|
+
desc: "Hide download progress"
|
76
|
+
option :version, type: :string, aliases: :V,
|
77
|
+
desc: "Specify particular version of a font"
|
78
|
+
option :smallest, type: :boolean, aliases: :s,
|
79
|
+
desc: "Install the smallest formula if several"
|
80
|
+
option :newest, type: :boolean, aliases: :n,
|
81
|
+
desc: "Install the newest version of a font if several"
|
82
|
+
option :size_limit,
|
83
|
+
type: :numeric, aliases: :S,
|
84
|
+
desc: "Specify size limit for formula " \
|
85
|
+
"(default is #{Fontist.formula_size_limit_in_megabytes} MB)"
|
46
86
|
def install(font)
|
47
87
|
handle_class_options(options)
|
48
|
-
|
49
|
-
|
50
|
-
force: options[:force],
|
51
|
-
confirmation: options[:accept_all_licenses] ? "yes" : "no",
|
52
|
-
hide_licenses: options[:hide_licenses],
|
53
|
-
no_progress: options[:no_progress]
|
54
|
-
)
|
88
|
+
confirmation = options[:accept_all_licenses] ? "yes" : "no"
|
89
|
+
Fontist::Font.install(font, options.merge(confirmation: confirmation))
|
55
90
|
success
|
56
91
|
rescue Fontist::Errors::GeneralError => e
|
57
92
|
handle_error(e)
|
@@ -113,8 +148,12 @@ module Fontist
|
|
113
148
|
end
|
114
149
|
|
115
150
|
desc "manifest-install MANIFEST", "Install fonts from MANIFEST (yaml)"
|
116
|
-
option :accept_all_licenses, type: :boolean,
|
117
|
-
|
151
|
+
option :accept_all_licenses, type: :boolean,
|
152
|
+
aliases: ["--confirm-license", :a],
|
153
|
+
desc: "Accept all license agreements"
|
154
|
+
option :hide_licenses, type: :boolean,
|
155
|
+
aliases: :h,
|
156
|
+
desc: "Hide license texts"
|
118
157
|
def manifest_install(manifest)
|
119
158
|
handle_class_options(options)
|
120
159
|
paths = Fontist::Manifest::Install.from_file(
|
@@ -167,24 +206,31 @@ module Fontist
|
|
167
206
|
desc "repo SUBCOMMAND ...ARGS", "Manage custom repositories"
|
168
207
|
subcommand "repo", Fontist::RepoCLI
|
169
208
|
|
209
|
+
desc "import SUBCOMMAND ...ARGS", "Manage imports"
|
210
|
+
subcommand "import", Fontist::ImportCLI
|
211
|
+
|
170
212
|
desc "google SUBCOMMAND ...ARGS", "Manage Google formulas"
|
171
213
|
subcommand "google", Fontist::GoogleCLI
|
172
214
|
|
173
215
|
private
|
174
216
|
|
175
|
-
def handle_class_options(options)
|
176
|
-
Fontist.preferred_family = options[:preferred_family]
|
177
|
-
end
|
178
|
-
|
179
217
|
def success
|
180
218
|
STATUS_SUCCESS
|
181
219
|
end
|
182
220
|
|
183
221
|
def handle_error(exception)
|
184
|
-
status, message = ERROR_TO_STATUS[exception.class]
|
222
|
+
status, mode, message = ERROR_TO_STATUS[exception.class]
|
185
223
|
raise exception unless status
|
186
224
|
|
187
|
-
|
225
|
+
text = if message && mode == :overwrite
|
226
|
+
message
|
227
|
+
elsif message
|
228
|
+
"#{exception.message} #{message}"
|
229
|
+
else
|
230
|
+
exception.message
|
231
|
+
end
|
232
|
+
|
233
|
+
error(text, status)
|
188
234
|
end
|
189
235
|
|
190
236
|
def error(message, status)
|
@@ -205,10 +251,15 @@ module Fontist
|
|
205
251
|
Fontist.ui.say(" #{font.name}")
|
206
252
|
|
207
253
|
styles.each do |style, installed|
|
254
|
+
opts = []
|
255
|
+
opts << "manual" if formula.manual?
|
256
|
+
opts << (installed ? "installed" : "uninstalled")
|
257
|
+
msg = " #{style.type} (#{opts.join(', ')})"
|
258
|
+
|
208
259
|
if installed
|
209
|
-
Fontist.ui.success(
|
260
|
+
Fontist.ui.success(msg)
|
210
261
|
else
|
211
|
-
Fontist.ui.error(
|
262
|
+
Fontist.ui.error(msg)
|
212
263
|
end
|
213
264
|
end
|
214
265
|
end
|
data/lib/fontist/errors.rb
CHANGED
@@ -12,6 +12,16 @@ module Fontist
|
|
12
12
|
# it depends on this exception to automatically download formulas
|
13
13
|
class FormulaIndexNotFoundError < GeneralError; end
|
14
14
|
|
15
|
+
class FormulaNotFoundError < GeneralError
|
16
|
+
def initialize(formula)
|
17
|
+
super(<<~MSG.chomp)
|
18
|
+
Formula '#{formula}' not found locally nor available in the Fontist formula repository.
|
19
|
+
Perhaps it is available at the latest Fontist formula repository.
|
20
|
+
You can update the formula repository using the command `fontist update` and try again.
|
21
|
+
MSG
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
15
25
|
class MainRepoNotFoundError < FormulaIndexNotFoundError; end
|
16
26
|
|
17
27
|
class InvalidResourceError < GeneralError; end
|
@@ -28,6 +38,8 @@ module Fontist
|
|
28
38
|
|
29
39
|
class RepoCouldNotBeUpdatedError < GeneralError; end
|
30
40
|
|
41
|
+
class SizeLimitError < GeneralError; end
|
42
|
+
|
31
43
|
class TamperedFileError < GeneralError; end
|
32
44
|
|
33
45
|
class TimeoutError < GeneralError; end
|
@@ -72,6 +84,14 @@ module Fontist
|
|
72
84
|
end
|
73
85
|
end
|
74
86
|
|
87
|
+
class ManualFontError < FontError
|
88
|
+
def initialize(font, formula)
|
89
|
+
msg = "'#{font}' font is missing.\n\n#{formula.instructions}"
|
90
|
+
|
91
|
+
super(msg, font)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
75
95
|
class UnsupportedFontError < FontError
|
76
96
|
def initialize(font)
|
77
97
|
msg = <<~MSG.chomp
|
data/lib/fontist/font.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "fontist/font_installer"
|
2
2
|
require "fontist/font_path"
|
3
|
+
require "fontist/formula_picker"
|
3
4
|
|
4
5
|
module Fontist
|
5
6
|
class Font
|
@@ -9,6 +10,11 @@ module Fontist
|
|
9
10
|
@hide_licenses = options[:hide_licenses]
|
10
11
|
@no_progress = options[:no_progress] || false
|
11
12
|
@force = options[:force] || false
|
13
|
+
@version = options[:version]
|
14
|
+
@smallest = options[:smallest]
|
15
|
+
@newest = options[:newest]
|
16
|
+
@size_limit = options[:size_limit]
|
17
|
+
@by_formula = options[:formula]
|
12
18
|
|
13
19
|
check_or_create_fontist_path!
|
14
20
|
end
|
@@ -38,21 +44,27 @@ module Fontist
|
|
38
44
|
end
|
39
45
|
|
40
46
|
def find
|
41
|
-
find_system_font || downloadable_font ||
|
47
|
+
find_system_font || downloadable_font || manual_font ||
|
48
|
+
raise_non_supported_font
|
42
49
|
end
|
43
50
|
|
44
51
|
def install
|
45
|
-
|
52
|
+
return install_formula if @by_formula
|
53
|
+
|
54
|
+
(find_system_font unless @force) || download_font || manual_font ||
|
55
|
+
raise_non_supported_font
|
46
56
|
end
|
47
57
|
|
48
58
|
def uninstall
|
49
|
-
uninstall_font || downloadable_font ||
|
59
|
+
uninstall_font || downloadable_font || manual_font ||
|
60
|
+
raise_non_supported_font
|
50
61
|
end
|
51
62
|
|
52
63
|
def status
|
53
64
|
return installed_paths unless @name
|
54
65
|
|
55
|
-
find_system_font || downloadable_font ||
|
66
|
+
find_system_font || downloadable_font || manual_font ||
|
67
|
+
raise_non_supported_font
|
56
68
|
end
|
57
69
|
|
58
70
|
def list
|
@@ -94,12 +106,42 @@ module Fontist
|
|
94
106
|
end
|
95
107
|
end
|
96
108
|
|
109
|
+
def install_formula
|
110
|
+
download_formula || raise_formula_not_found
|
111
|
+
end
|
112
|
+
|
113
|
+
def download_formula
|
114
|
+
formula = Formula.find_by_key(@name)
|
115
|
+
return unless formula
|
116
|
+
return unless formula.downloadable?
|
117
|
+
|
118
|
+
request_formula_installation(formula)
|
119
|
+
end
|
120
|
+
|
121
|
+
def raise_formula_not_found
|
122
|
+
raise Errors::FormulaNotFoundError.new(@name)
|
123
|
+
end
|
124
|
+
|
97
125
|
def font_installer(formula)
|
98
126
|
FontInstaller.new(formula, no_progress: @no_progress)
|
99
127
|
end
|
100
128
|
|
101
|
-
def
|
102
|
-
@
|
129
|
+
def sufficient_formulas
|
130
|
+
@sufficient_formulas ||=
|
131
|
+
FormulaPicker.new(@name,
|
132
|
+
size_limit: @size_limit,
|
133
|
+
version: @version,
|
134
|
+
smallest: @smallest,
|
135
|
+
newest: @newest)
|
136
|
+
.call(downloadable_formulas)
|
137
|
+
end
|
138
|
+
|
139
|
+
def downloadable_formulas
|
140
|
+
@downloadable_formulas ||= formulas.select(&:downloadable?)
|
141
|
+
end
|
142
|
+
|
143
|
+
def manual_formulas
|
144
|
+
@manual_formulas ||= formulas.reject(&:downloadable?)
|
103
145
|
end
|
104
146
|
|
105
147
|
def formulas
|
@@ -108,27 +150,34 @@ module Fontist
|
|
108
150
|
end
|
109
151
|
|
110
152
|
def supported_formula?(formula)
|
111
|
-
formula.platforms.nil?
|
112
|
-
|
153
|
+
return true if formula.platforms.nil?
|
154
|
+
|
155
|
+
formula.platforms.any? do |platform|
|
156
|
+
Utils::System.match?(platform)
|
157
|
+
end
|
113
158
|
end
|
114
159
|
|
115
160
|
def downloadable_font
|
116
|
-
if
|
117
|
-
|
118
|
-
|
161
|
+
return if downloadable_formulas.empty?
|
162
|
+
|
163
|
+
raise Fontist::Errors::MissingFontError.new(name)
|
119
164
|
end
|
120
165
|
|
121
166
|
def download_font
|
122
|
-
return if
|
167
|
+
return if sufficient_formulas.empty?
|
123
168
|
|
124
|
-
|
125
|
-
|
126
|
-
|
169
|
+
sufficient_formulas.flat_map do |formula|
|
170
|
+
request_formula_installation(formula)
|
171
|
+
end
|
172
|
+
end
|
127
173
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
174
|
+
def request_formula_installation(formula)
|
175
|
+
confirmation = check_and_confirm_required_license(formula)
|
176
|
+
paths = font_installer(formula).install(confirmation: confirmation)
|
177
|
+
|
178
|
+
Fontist.ui.say("Fonts installed at:")
|
179
|
+
paths.each do |path|
|
180
|
+
Fontist.ui.say("- #{path}")
|
132
181
|
end
|
133
182
|
end
|
134
183
|
|
@@ -171,6 +220,12 @@ module Fontist
|
|
171
220
|
MSG
|
172
221
|
end
|
173
222
|
|
223
|
+
def manual_font
|
224
|
+
return if manual_formulas.empty?
|
225
|
+
|
226
|
+
raise Fontist::Errors::ManualFontError.new(name, manual_formulas.first)
|
227
|
+
end
|
228
|
+
|
174
229
|
def uninstall_font
|
175
230
|
paths = find_fontist_paths
|
176
231
|
return unless paths
|
@@ -221,7 +276,7 @@ module Fontist
|
|
221
276
|
|
222
277
|
def list_styles(formulas)
|
223
278
|
map_to_hash(formulas) do |formula|
|
224
|
-
map_to_hash(formula.fonts) do |font|
|
279
|
+
map_to_hash(requested_fonts(formula.fonts)) do |font|
|
225
280
|
map_to_hash(font.styles) do |style|
|
226
281
|
installed(style)
|
227
282
|
end
|
@@ -233,6 +288,14 @@ module Fontist
|
|
233
288
|
elements.map { |e| [e, yield(e)] }.to_h
|
234
289
|
end
|
235
290
|
|
291
|
+
def requested_fonts(fonts)
|
292
|
+
return fonts unless @name
|
293
|
+
|
294
|
+
fonts.select do |font|
|
295
|
+
font.name.casecmp?(name)
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
236
299
|
def installed(style)
|
237
300
|
path(style) ? true : false
|
238
301
|
end
|
data/lib/fontist/formula.rb
CHANGED
@@ -45,6 +45,13 @@ module Fontist
|
|
45
45
|
end.flatten
|
46
46
|
end
|
47
47
|
|
48
|
+
def self.find_by_key(key)
|
49
|
+
path = Fontist.formulas_path.join("#{key}.yml")
|
50
|
+
return unless File.exist?(path)
|
51
|
+
|
52
|
+
new_from_file(path)
|
53
|
+
end
|
54
|
+
|
48
55
|
def self.new_from_file(path)
|
49
56
|
data = YAML.load_file(path)
|
50
57
|
new(data, path)
|
@@ -59,12 +66,20 @@ module Fontist
|
|
59
66
|
Indexes::IndexFormula.new(path)
|
60
67
|
end
|
61
68
|
|
69
|
+
def manual?
|
70
|
+
!downloadable?
|
71
|
+
end
|
72
|
+
|
73
|
+
def downloadable?
|
74
|
+
@data.key?("resources")
|
75
|
+
end
|
76
|
+
|
62
77
|
def path
|
63
78
|
@path
|
64
79
|
end
|
65
80
|
|
66
81
|
def key
|
67
|
-
|
82
|
+
key_from_path
|
68
83
|
end
|
69
84
|
|
70
85
|
def description
|
@@ -99,12 +114,28 @@ module Fontist
|
|
99
114
|
Helpers.parse_to_object(@data["extract"])
|
100
115
|
end
|
101
116
|
|
117
|
+
def file_size
|
118
|
+
return unless @data["resources"]
|
119
|
+
|
120
|
+
@data["resources"].values.first["file_size"]&.to_i
|
121
|
+
end
|
122
|
+
|
102
123
|
def resources
|
103
|
-
Helpers.parse_to_object(@data["resources"]
|
124
|
+
Helpers.parse_to_object(@data["resources"]&.values)
|
125
|
+
end
|
126
|
+
|
127
|
+
def instructions
|
128
|
+
@data["instructions"]
|
129
|
+
end
|
130
|
+
|
131
|
+
def fonts_by_name(name)
|
132
|
+
fonts.select do |font|
|
133
|
+
font.name.casecmp?(name)
|
134
|
+
end
|
104
135
|
end
|
105
136
|
|
106
137
|
def fonts
|
107
|
-
@fonts ||= Helpers.parse_to_object(
|
138
|
+
@fonts ||= Helpers.parse_to_object(fonts_by_family)
|
108
139
|
end
|
109
140
|
|
110
141
|
def digest
|
@@ -113,11 +144,46 @@ module Fontist
|
|
113
144
|
|
114
145
|
private
|
115
146
|
|
116
|
-
def
|
147
|
+
def key_from_path
|
117
148
|
escaped = Regexp.escape(Fontist.formulas_path.to_s + "/")
|
118
149
|
@path.sub(Regexp.new("^" + escaped), "").sub(/\.yml$/, "")
|
119
150
|
end
|
120
151
|
|
152
|
+
def fonts_by_family
|
153
|
+
return hash_all_fonts unless Fontist.preferred_family?
|
154
|
+
|
155
|
+
preferred_family_fonts
|
156
|
+
end
|
157
|
+
|
158
|
+
def preferred_family_fonts
|
159
|
+
groups = preferred_family_styles.group_by do |style|
|
160
|
+
style["family_name"]
|
161
|
+
end
|
162
|
+
|
163
|
+
groups.map do |font_name, font_styles|
|
164
|
+
{ "name" => font_name, "styles" => font_styles }
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def preferred_family_styles
|
169
|
+
hash_all_fonts.flat_map do |font|
|
170
|
+
font["styles"].map do |style|
|
171
|
+
style.merge(preferred_style(style))
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def preferred_style(style)
|
177
|
+
{ "family_name" => style["preferred_family_name"] || style["family_name"],
|
178
|
+
"type" => style["preferred_type"] || style["type"],
|
179
|
+
"default_family_name" => style["family_name"],
|
180
|
+
"default_type" => style["type"] }
|
181
|
+
end
|
182
|
+
|
183
|
+
def hash_all_fonts
|
184
|
+
hash_collection_fonts + hash_fonts
|
185
|
+
end
|
186
|
+
|
121
187
|
def hash_collection_fonts
|
122
188
|
return [] unless @data["font_collections"]
|
123
189
|
|
@@ -126,8 +192,7 @@ module Fontist
|
|
126
192
|
"source_font" => coll["source_filename"] }
|
127
193
|
|
128
194
|
coll["fonts"].map do |font|
|
129
|
-
|
130
|
-
"styles" => font["styles"].map { |s| filenames.merge(s) } }
|
195
|
+
font.merge("styles" => font["styles"].map { |s| filenames.merge(s) })
|
131
196
|
end
|
132
197
|
end
|
133
198
|
end
|