fontist 1.9.0 → 1.11.1
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/.github/workflows/metanorma.yml +5 -2
- data/README.adoc +758 -0
- data/README.md +30 -5
- data/exe/fontist +24 -2
- data/fontist.gemspec +2 -0
- data/lib/fontist.rb +29 -5
- data/lib/fontist/cli.rb +24 -1
- data/lib/fontist/errors.rb +2 -0
- data/lib/fontist/font.rb +8 -3
- data/lib/fontist/formula.rb +2 -12
- data/lib/fontist/import/files/collection_file.rb +10 -1
- data/lib/fontist/import/formula_builder.rb +14 -5
- data/lib/fontist/import/google_import.rb +4 -0
- data/lib/fontist/import/otf/font_file.rb +17 -4
- data/lib/fontist/import/otf_style.rb +10 -2
- data/lib/fontist/import/otfinfo/template.erb +6 -0
- data/lib/fontist/index.rb +7 -4
- data/lib/fontist/indexes/default_family_font_index.rb +21 -0
- data/lib/fontist/indexes/font_index.rb +8 -13
- data/lib/fontist/indexes/preferred_family_font_index.rb +24 -0
- data/lib/fontist/repo.rb +6 -0
- data/lib/fontist/repo_cli.rb +10 -1
- data/lib/fontist/system_font.rb +6 -11
- data/lib/fontist/system_index.rb +108 -29
- data/lib/fontist/update.rb +78 -0
- data/lib/fontist/utils/downloader.rb +15 -6
- data/lib/fontist/version.rb +1 -1
- metadata +20 -3
- data/lib/fontist/fontist_font.rb +0 -24
data/README.md
CHANGED
@@ -399,16 +399,20 @@ bin/rspec
|
|
399
399
|
All formulas are kept in the [formulas][fontist-formulas] repository. If you'd
|
400
400
|
like to add a new one or change any existing, please refer to its documentation.
|
401
401
|
|
402
|
-
###
|
402
|
+
### Private repos
|
403
403
|
|
404
404
|
There is an ability to use private fonts via private fontist repo. Fontist repo
|
405
405
|
is a git repo which contains YAML formula files. Formulas can be created
|
406
406
|
manually (see [examples](https://github.com/fontist/formulas/tree/master/Formulas)),
|
407
407
|
or [auto-generated from an archive](#auto-generate-a-formula).
|
408
408
|
|
409
|
-
A
|
409
|
+
A repo can be either HTTPS or SSH Git repo. In case of SSH, a corresponding SSH key
|
410
|
+
should be setup with ssh-agent in order to access this private repo.
|
410
411
|
|
411
|
-
|
412
|
+
The `repo setup` command fetches a repo's formulas, and saves repo's name and url
|
413
|
+
for later use.
|
414
|
+
|
415
|
+
Internally all repos are stored at `~/.fontist/formulas/Formulas/private`.
|
412
416
|
|
413
417
|
```sh
|
414
418
|
fontist repo setup NAME URL
|
@@ -418,15 +422,24 @@ E.g.
|
|
418
422
|
|
419
423
|
```sh
|
420
424
|
fontist repo setup acme https://example.com/acme/formulas.git
|
425
|
+
# or
|
426
|
+
fontist repo setup acme git@example.com:acme/formulas.git
|
427
|
+
```
|
428
|
+
|
429
|
+
Then you can just install fonts from this repo:
|
430
|
+
|
431
|
+
```sh
|
432
|
+
fontist install "private font"
|
421
433
|
```
|
422
434
|
|
423
|
-
|
435
|
+
There is no need in any additional command to be run, but if you add new
|
436
|
+
formulas to your repo, you can fetch them with the `repo update` command:
|
424
437
|
|
425
438
|
```sh
|
426
439
|
fontist repo update acme
|
427
440
|
```
|
428
441
|
|
429
|
-
If there is a need to avoid using
|
442
|
+
If there is a need to avoid using private formulas, the repo can be removed with:
|
430
443
|
|
431
444
|
```sh
|
432
445
|
fontist repo remove acme
|
@@ -511,6 +524,18 @@ git commit -m "SIL fonts update"
|
|
511
524
|
git push
|
512
525
|
```
|
513
526
|
|
527
|
+
### Using with proxy
|
528
|
+
|
529
|
+
`fontist` can read proxy settings from environemnt variables:
|
530
|
+
|
531
|
+
* `HTTP_PROXY`
|
532
|
+
* `SOCKS_PROXY`
|
533
|
+
|
534
|
+
Also because `fontist` uses git under the hood, proxy must be configured in `~/.gitconfig` separately.
|
535
|
+
Check [nice guide](https://gist.github.com/evantoli/f8c23a37eb3558ab8765) about how it can be configured for more details
|
536
|
+
|
537
|
+
Also as for regular URL you can pass username and password, like `http://username:password@example.com/` for SOCKS it's similar
|
538
|
+
|
514
539
|
### Releasing
|
515
540
|
|
516
541
|
Releasing is done automatically with GitHub Action. Just bump and tag with `gem-release`.
|
data/exe/fontist
CHANGED
@@ -3,5 +3,27 @@
|
|
3
3
|
require "fontist"
|
4
4
|
require "fontist/cli"
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
fontist_cli = proc {
|
7
|
+
status_code = Fontist::CLI.start(ARGV)
|
8
|
+
exit status_code.is_a?(Integer) ? status_code : 1
|
9
|
+
}
|
10
|
+
|
11
|
+
if ENV["SOCKS_PROXY"]
|
12
|
+
require "socksify"
|
13
|
+
require "uri"
|
14
|
+
begin
|
15
|
+
proxy = URI.parse(ENV["SOCKS_PROXY"])
|
16
|
+
if proxy.userinfo
|
17
|
+
user, pass = proxy.userinfo.split(":")
|
18
|
+
TCPSocket::socks_username = user
|
19
|
+
TCPSocket::socks_password = pass
|
20
|
+
end
|
21
|
+
Socksify::proxy(proxy.host, proxy.port, &fontist_cli)
|
22
|
+
rescue URI::InvalidURIError
|
23
|
+
warn "Value of ENV.SOCKS_PROXY=#{ENV['SOCKS_PROXY']} is invalid! Droping it"
|
24
|
+
ENV.delete("SOCKS_PROXY")
|
25
|
+
fontist_cli.call
|
26
|
+
end
|
27
|
+
else
|
28
|
+
fontist_cli.call
|
29
|
+
end
|
data/fontist.gemspec
CHANGED
data/lib/fontist.rb
CHANGED
@@ -11,7 +11,6 @@ require "fontist/repo"
|
|
11
11
|
require "fontist/font"
|
12
12
|
require "fontist/formula"
|
13
13
|
require "fontist/system_font"
|
14
|
-
require "fontist/fontist_font"
|
15
14
|
require "fontist/manifest"
|
16
15
|
require "fontist/helpers"
|
17
16
|
|
@@ -65,15 +64,32 @@ module Fontist
|
|
65
64
|
end
|
66
65
|
|
67
66
|
def self.system_index_path
|
68
|
-
Fontist.fontist_path.join("system_index.yml")
|
67
|
+
Fontist.fontist_path.join("system_index.default_family.yml")
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.system_preferred_family_index_path
|
71
|
+
Fontist.fontist_path.join("system_index.preferred_family.yml")
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.fontist_index_path
|
75
|
+
Fontist.fontist_path.join("fontist_index.default_family.yml")
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.fontist_preferred_family_index_path
|
79
|
+
Fontist.fontist_path.join("fontist_index.preferred_family.yml")
|
69
80
|
end
|
70
81
|
|
71
82
|
def self.formula_index_path
|
72
|
-
|
83
|
+
Fontist.formula_index_dir.join("formula_index.default_family.yml")
|
73
84
|
end
|
74
85
|
|
75
|
-
def self.
|
76
|
-
@
|
86
|
+
def self.formula_preferred_family_index_path
|
87
|
+
@formula_preferred_family_index_path ||
|
88
|
+
Fontist.formula_index_dir.join("formula_index.preferred_family.yml")
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.formula_preferred_family_index_path=(path)
|
92
|
+
@formula_preferred_family_index_path = path
|
77
93
|
end
|
78
94
|
|
79
95
|
def self.formula_filename_index_path
|
@@ -88,4 +104,12 @@ module Fontist
|
|
88
104
|
def self.formula_index_dir
|
89
105
|
Fontist.fontist_path
|
90
106
|
end
|
107
|
+
|
108
|
+
def self.preferred_family?
|
109
|
+
!!@preferred_family
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.preferred_family=(bool)
|
113
|
+
@preferred_family = bool
|
114
|
+
end
|
91
115
|
end
|
data/lib/fontist/cli.rb
CHANGED
@@ -13,6 +13,7 @@ module Fontist
|
|
13
13
|
STATUS_FONT_INDEX_CORRUPTED = 7
|
14
14
|
STATUS_REPO_NOT_FOUND = 8
|
15
15
|
STATUS_MAIN_REPO_NOT_FOUND = 9
|
16
|
+
STATUS_REPO_COULD_NOT_BE_UPDATED = 10
|
16
17
|
|
17
18
|
ERROR_TO_STATUS = {
|
18
19
|
Fontist::Errors::UnsupportedFontError => [STATUS_NON_SUPPORTED_FONT_ERROR],
|
@@ -31,6 +32,10 @@ module Fontist
|
|
31
32
|
false
|
32
33
|
end
|
33
34
|
|
35
|
+
class_option :preferred_family,
|
36
|
+
type: :boolean,
|
37
|
+
desc: "Use Preferred Family when available"
|
38
|
+
|
34
39
|
desc "install FONT", "Install font"
|
35
40
|
option :force, type: :boolean, aliases: :f,
|
36
41
|
desc: "Install even if it's already installed in system"
|
@@ -38,6 +43,7 @@ module Fontist
|
|
38
43
|
option :hide_licenses, type: :boolean, desc: "Hide license texts"
|
39
44
|
option :no_progress, type: :boolean, desc: "Hide download progress"
|
40
45
|
def install(font)
|
46
|
+
handle_class_options(options)
|
41
47
|
Fontist::Font.install(
|
42
48
|
font,
|
43
49
|
force: options[:force],
|
@@ -52,6 +58,7 @@ module Fontist
|
|
52
58
|
|
53
59
|
desc "uninstall/remove FONT", "Uninstall font by font or formula"
|
54
60
|
def uninstall(font)
|
61
|
+
handle_class_options(options)
|
55
62
|
fonts_paths = Fontist::Font.uninstall(font)
|
56
63
|
Fontist.ui.success("These fonts are removed:")
|
57
64
|
Fontist.ui.success(fonts_paths.join("\n"))
|
@@ -63,6 +70,7 @@ module Fontist
|
|
63
70
|
|
64
71
|
desc "status [FONT]", "Show paths of FONT or all fonts"
|
65
72
|
def status(font = nil)
|
73
|
+
handle_class_options(options)
|
66
74
|
paths = Fontist::Font.status(font)
|
67
75
|
return error("No font is installed.", STATUS_MISSING_FONT_ERROR) if paths.empty?
|
68
76
|
|
@@ -73,6 +81,7 @@ module Fontist
|
|
73
81
|
|
74
82
|
desc "list [FONT]", "List installation status of FONT or fonts in fontist"
|
75
83
|
def list(font = nil)
|
84
|
+
handle_class_options(options)
|
76
85
|
formulas = Fontist::Font.list(font)
|
77
86
|
print_list(formulas)
|
78
87
|
success
|
@@ -82,14 +91,19 @@ module Fontist
|
|
82
91
|
|
83
92
|
desc "update", "Update formulas"
|
84
93
|
def update
|
94
|
+
handle_class_options(options)
|
85
95
|
Formula.update_formulas_repo
|
86
|
-
Fontist.ui.
|
96
|
+
Fontist.ui.success("Formulas have been successfully updated.")
|
87
97
|
success
|
98
|
+
rescue Fontist::Errors::RepoCouldNotBeUpdatedError => e
|
99
|
+
Fontist.ui.error(e.message)
|
100
|
+
STATUS_REPO_COULD_NOT_BE_UPDATED
|
88
101
|
end
|
89
102
|
|
90
103
|
desc "manifest-locations MANIFEST",
|
91
104
|
"Get locations of fonts from MANIFEST (yaml)"
|
92
105
|
def manifest_locations(manifest)
|
106
|
+
handle_class_options(options)
|
93
107
|
paths = Fontist::Manifest::Locations.from_file(manifest)
|
94
108
|
print_yaml(paths)
|
95
109
|
success
|
@@ -101,6 +115,7 @@ module Fontist
|
|
101
115
|
option :accept_all_licenses, type: :boolean, aliases: "--confirm-license", desc: "Accept all license agreements"
|
102
116
|
option :hide_licenses, type: :boolean, desc: "Hide license texts"
|
103
117
|
def manifest_install(manifest)
|
118
|
+
handle_class_options(options)
|
104
119
|
paths = Fontist::Manifest::Install.from_file(
|
105
120
|
manifest,
|
106
121
|
confirmation: options[:accept_all_licenses] ? "yes" : "no",
|
@@ -120,6 +135,7 @@ module Fontist
|
|
120
135
|
option :subdir, desc: "Subdirectory to take fonts from, starting with the " \
|
121
136
|
"root dir, e.g.: stixfonts-2.10/fonts/static_otf. May include `fnmatch` patterns."
|
122
137
|
def create_formula(url)
|
138
|
+
handle_class_options(options)
|
123
139
|
require "fontist/import/create_formula"
|
124
140
|
name = Fontist::Import::CreateFormula.new(url, options).call
|
125
141
|
Fontist.ui.say("#{name} formula has been successfully created")
|
@@ -137,6 +153,8 @@ module Fontist
|
|
137
153
|
desc: "Updates indexes in the main repo (for backward " \
|
138
154
|
"compatibility with versions prior to 1.9)"
|
139
155
|
def rebuild_index
|
156
|
+
handle_class_options(options)
|
157
|
+
|
140
158
|
if options[:main_repo]
|
141
159
|
Fontist::Index.rebuild_for_main_repo
|
142
160
|
else
|
@@ -149,6 +167,7 @@ module Fontist
|
|
149
167
|
|
150
168
|
desc "import-sil", "Import formulas from SIL"
|
151
169
|
def import_sil
|
170
|
+
handle_class_options(options)
|
152
171
|
require "fontist/import/sil_import"
|
153
172
|
Fontist::Import::SilImport.new.call
|
154
173
|
end
|
@@ -158,6 +177,10 @@ module Fontist
|
|
158
177
|
|
159
178
|
private
|
160
179
|
|
180
|
+
def handle_class_options(options)
|
181
|
+
Fontist.preferred_family = options[:preferred_family]
|
182
|
+
end
|
183
|
+
|
161
184
|
def success
|
162
185
|
STATUS_SUCCESS
|
163
186
|
end
|
data/lib/fontist/errors.rb
CHANGED
data/lib/fontist/font.rb
CHANGED
@@ -166,7 +166,7 @@ module Fontist
|
|
166
166
|
end
|
167
167
|
|
168
168
|
def uninstall_font
|
169
|
-
paths =
|
169
|
+
paths = find_fontist_paths
|
170
170
|
return unless paths
|
171
171
|
|
172
172
|
paths.each do |path|
|
@@ -176,8 +176,13 @@ module Fontist
|
|
176
176
|
paths
|
177
177
|
end
|
178
178
|
|
179
|
-
def
|
180
|
-
Fontist::
|
179
|
+
def find_fontist_paths
|
180
|
+
fonts = Fontist::SystemIndex.fontist_index.find(name, nil)
|
181
|
+
return unless fonts
|
182
|
+
|
183
|
+
fonts.map do |font|
|
184
|
+
font[:path]
|
185
|
+
end
|
181
186
|
end
|
182
187
|
|
183
188
|
def installed_paths
|
data/lib/fontist/formula.rb
CHANGED
@@ -1,22 +1,12 @@
|
|
1
1
|
require "fontist/index"
|
2
2
|
require "fontist/helpers"
|
3
|
+
require "fontist/update"
|
3
4
|
require "git"
|
4
5
|
|
5
6
|
module Fontist
|
6
7
|
class Formula
|
7
8
|
def self.update_formulas_repo
|
8
|
-
|
9
|
-
FileUtils.mkdir_p(dir) unless File.exist?(dir)
|
10
|
-
|
11
|
-
if Dir.exist?(Fontist.formulas_repo_path)
|
12
|
-
Git.open(Fontist.formulas_repo_path).pull
|
13
|
-
else
|
14
|
-
Git.clone(Fontist.formulas_repo_url,
|
15
|
-
Fontist.formulas_repo_path,
|
16
|
-
depth: 1)
|
17
|
-
end
|
18
|
-
|
19
|
-
Index.rebuild
|
9
|
+
Update.call
|
20
10
|
end
|
21
11
|
|
22
12
|
def self.all
|
@@ -11,7 +11,7 @@ module Fontist
|
|
11
11
|
def initialize(path)
|
12
12
|
@path = path
|
13
13
|
@fonts = read
|
14
|
-
@extension =
|
14
|
+
@extension = detect_extension
|
15
15
|
end
|
16
16
|
|
17
17
|
def filename
|
@@ -46,6 +46,15 @@ module Fontist
|
|
46
46
|
File.join(tmp_dir, filename)
|
47
47
|
end
|
48
48
|
end
|
49
|
+
|
50
|
+
def detect_extension
|
51
|
+
base_extension = "ttc"
|
52
|
+
|
53
|
+
file_extension = File.extname(File.basename(@path)).sub(/^\./, "")
|
54
|
+
return file_extension if file_extension.casecmp?(base_extension)
|
55
|
+
|
56
|
+
base_extension
|
57
|
+
end
|
49
58
|
end
|
50
59
|
end
|
51
60
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require "shellwords"
|
1
2
|
require_relative "text_helper"
|
2
3
|
|
3
4
|
module Fontist
|
@@ -5,7 +6,7 @@ module Fontist
|
|
5
6
|
class FormulaBuilder
|
6
7
|
FORMULA_ATTRIBUTES = %i[name description homepage resources
|
7
8
|
font_collections fonts extract copyright
|
8
|
-
license_url open_license].freeze
|
9
|
+
license_url open_license command].freeze
|
9
10
|
|
10
11
|
attr_accessor :archive,
|
11
12
|
:url,
|
@@ -49,7 +50,7 @@ module Fontist
|
|
49
50
|
end
|
50
51
|
|
51
52
|
def homepage
|
52
|
-
both_fonts.first
|
53
|
+
both_fonts.map(&:homepage).compact.first
|
53
54
|
end
|
54
55
|
|
55
56
|
def resources
|
@@ -129,7 +130,7 @@ module Fontist
|
|
129
130
|
|
130
131
|
fonts = groups.map do |name, group|
|
131
132
|
{ name: name,
|
132
|
-
styles: group
|
133
|
+
styles: styles_from_files(group, style_type) }
|
133
134
|
end
|
134
135
|
|
135
136
|
fonts.sort_by do |x|
|
@@ -137,16 +138,20 @@ module Fontist
|
|
137
138
|
end
|
138
139
|
end
|
139
140
|
|
141
|
+
def styles_from_files(files, style_type)
|
142
|
+
files.map(&style_type).sort_by { |x| x[:type] }
|
143
|
+
end
|
144
|
+
|
140
145
|
def extract
|
141
146
|
@extractor.operations
|
142
147
|
end
|
143
148
|
|
144
149
|
def copyright
|
145
|
-
both_fonts.first
|
150
|
+
both_fonts.map(&:copyright).compact.first
|
146
151
|
end
|
147
152
|
|
148
153
|
def license_url
|
149
|
-
both_fonts.first
|
154
|
+
both_fonts.map(&:license_url).compact.first
|
150
155
|
end
|
151
156
|
|
152
157
|
def open_license
|
@@ -161,6 +166,10 @@ module Fontist
|
|
161
166
|
|
162
167
|
TextHelper.cleanup(@license_text)
|
163
168
|
end
|
169
|
+
|
170
|
+
def command
|
171
|
+
Shellwords.shelljoin(ARGV)
|
172
|
+
end
|
164
173
|
end
|
165
174
|
end
|
166
175
|
end
|
@@ -156,6 +156,10 @@ module Fontist
|
|
156
156
|
h.merge!(family_name: style.family_name,
|
157
157
|
type: style.style,
|
158
158
|
full_name: style.full_name)
|
159
|
+
if style.preferred_family_name
|
160
|
+
h[:preferred_family_name] = style.preferred_family_name
|
161
|
+
end
|
162
|
+
h[:preferred_type] = style.preferred_style if style.preferred_style
|
159
163
|
h.merge!(style.to_h.select do |k, _|
|
160
164
|
%i(post_script_name version description copyright).include?(k)
|
161
165
|
end.compact)
|
@@ -10,7 +10,8 @@ module Fontist
|
|
10
10
|
otfinfo: Otfinfo::OtfinfoRequirement.new,
|
11
11
|
}.freeze
|
12
12
|
|
13
|
-
STYLE_ATTRIBUTES = %i[family_name type
|
13
|
+
STYLE_ATTRIBUTES = %i[family_name type preferred_family_name
|
14
|
+
preferred_type full_name post_script_name
|
14
15
|
version description copyright font
|
15
16
|
source_font].freeze
|
16
17
|
|
@@ -35,11 +36,19 @@ module Fontist
|
|
35
36
|
end
|
36
37
|
|
37
38
|
def family_name
|
38
|
-
info["
|
39
|
+
info["Family"]
|
39
40
|
end
|
40
41
|
|
41
42
|
def type
|
42
|
-
info["
|
43
|
+
info["Subfamily"]
|
44
|
+
end
|
45
|
+
|
46
|
+
def preferred_family_name
|
47
|
+
info["Preferred family"]
|
48
|
+
end
|
49
|
+
|
50
|
+
def preferred_type
|
51
|
+
info["Preferred subfamily"]
|
43
52
|
end
|
44
53
|
|
45
54
|
def full_name
|
@@ -97,7 +106,11 @@ module Fontist
|
|
97
106
|
end
|
98
107
|
|
99
108
|
def detect_extension
|
100
|
-
Files::FontDetector.standard_extension(@path)
|
109
|
+
detected = Files::FontDetector.standard_extension(@path)
|
110
|
+
file_extension = File.extname(File.basename(@path)).sub(/^\./, "")
|
111
|
+
return file_extension if file_extension.casecmp?(detected)
|
112
|
+
|
113
|
+
detected
|
101
114
|
end
|
102
115
|
end
|
103
116
|
end
|