fontist 1.8.3 → 1.8.8
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/rspec.yml +6 -6
- data/fontist.gemspec +7 -10
- data/lib/fontist.rb +4 -0
- data/lib/fontist/cli.rb +11 -22
- data/lib/fontist/errors.rb +1 -0
- data/lib/fontist/font.rb +37 -42
- data/lib/fontist/font_installer.rb +37 -33
- data/lib/fontist/font_path.rb +29 -0
- data/lib/fontist/formula.rb +8 -4
- data/lib/fontist/import/recursive_extraction.rb +30 -110
- data/lib/fontist/index.rb +4 -65
- data/lib/fontist/indexes/base_index.rb +82 -0
- data/lib/fontist/indexes/filename_index.rb +19 -0
- data/lib/fontist/indexes/font_index.rb +21 -0
- data/lib/fontist/indexes/index_formula.rb +36 -0
- data/lib/fontist/manifest/install.rb +3 -2
- data/lib/fontist/utils.rb +0 -4
- data/lib/fontist/utils/cache.rb +1 -1
- data/lib/fontist/utils/downloader.rb +7 -4
- data/lib/fontist/version.rb +1 -1
- metadata +21 -71
- data/lib/fontist/import/extractors.rb +0 -5
- data/lib/fontist/import/extractors/cab_extractor.rb +0 -37
- data/lib/fontist/import/extractors/extractor.rb +0 -19
- data/lib/fontist/import/extractors/ole_extractor.rb +0 -41
- data/lib/fontist/import/extractors/seven_zip_extractor.rb +0 -44
- data/lib/fontist/import/extractors/zip_extractor.rb +0 -31
- data/lib/fontist/index_formula.rb +0 -30
- data/lib/fontist/utils/exe_extractor.rb +0 -75
- data/lib/fontist/utils/msi_extractor.rb +0 -31
- data/lib/fontist/utils/seven_zip_extractor.rb +0 -41
- data/lib/fontist/utils/zip_extractor.rb +0 -52
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7cd7962408633c39bb2cfff2ef8c3c0500842033f80ed7211474eefe98845327
|
|
4
|
+
data.tar.gz: 4630d28fbe5afad9865aeaebfa46e50215eb99cc8e2580466ae1fcb616117cfa
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 57ac2451e5911694725ddd4f7f29bb8693e0be8e4397101f1f90c6a83ba353ea51fc7e2c9c0875e1bc0f4f17a466b9191d2c4017a47e971c9bb620bef0ea4a4c
|
|
7
|
+
data.tar.gz: 6aee6a31dd412af421191cb8cb5ca7793d5071bfcb0101666ef7d591abffcb98a7e9a3990978e7268d4e55fb1f0fa339711bffe801f272e08c133cd3c6783a9b
|
data/.github/workflows/rspec.yml
CHANGED
|
@@ -13,17 +13,17 @@ jobs:
|
|
|
13
13
|
strategy:
|
|
14
14
|
fail-fast: false
|
|
15
15
|
matrix:
|
|
16
|
-
ruby: [ '2.
|
|
16
|
+
ruby: [ '2.4', '2.5', '2.6', '2.7' ]
|
|
17
17
|
os: [ ubuntu-latest, windows-latest, macos-latest ]
|
|
18
18
|
experimental: [ false ]
|
|
19
19
|
include:
|
|
20
|
-
- ruby: '
|
|
20
|
+
- ruby: '3.0'
|
|
21
21
|
os: 'ubuntu-latest'
|
|
22
22
|
experimental: true
|
|
23
|
-
- ruby: '
|
|
23
|
+
- ruby: '3.0'
|
|
24
24
|
os: 'windows-latest'
|
|
25
25
|
experimental: true
|
|
26
|
-
- ruby: '
|
|
26
|
+
- ruby: '3.0'
|
|
27
27
|
os: 'macos-latest'
|
|
28
28
|
experimental: true
|
|
29
29
|
|
|
@@ -37,8 +37,8 @@ jobs:
|
|
|
37
37
|
- uses: actions/cache@v1
|
|
38
38
|
with:
|
|
39
39
|
path: vendor/bundle
|
|
40
|
-
key: bundle-${{ matrix.os }}-${{ matrix.ruby }}-${{ hashFiles('**/*.gemspec') }}
|
|
41
|
-
restore-keys: bundle-${{ matrix.os }}-${{ matrix.ruby }}
|
|
40
|
+
key: bundle-v2-${{ matrix.os }}-${{ matrix.ruby }}-${{ hashFiles('**/*.gemspec') }}
|
|
41
|
+
restore-keys: bundle-v2-${{ matrix.os }}-${{ matrix.ruby }}
|
|
42
42
|
|
|
43
43
|
- if: matrix.os == 'macos-latest'
|
|
44
44
|
run: brew install lcdf-typetools
|
data/fontist.gemspec
CHANGED
|
@@ -5,15 +5,15 @@ require "fontist/version"
|
|
|
5
5
|
Gem::Specification.new do |spec|
|
|
6
6
|
spec.name = "fontist"
|
|
7
7
|
spec.version = Fontist::VERSION
|
|
8
|
-
spec.authors = ["Ribose Inc."
|
|
9
|
-
spec.email = ["
|
|
8
|
+
spec.authors = ["Ribose Inc."]
|
|
9
|
+
spec.email = ["open.source@ribose.com"]
|
|
10
10
|
|
|
11
|
-
spec.summary = %q{
|
|
12
|
-
spec.description = %q{
|
|
11
|
+
spec.summary = %q{Install openly-licensed fonts on Windows, Linux and Mac!}
|
|
12
|
+
spec.description = %q{Install openly-licensed fonts on Windows, Linux and Mac!}
|
|
13
13
|
spec.homepage = "https://github.com/fontist/fontist"
|
|
14
14
|
spec.license = "BSD-2-Clause"
|
|
15
15
|
|
|
16
|
-
spec.post_install_message = "Please run `fontist update` to fetch formulas"
|
|
16
|
+
spec.post_install_message = "Please run `fontist update` to fetch formulas."
|
|
17
17
|
|
|
18
18
|
spec.metadata["homepage_uri"] = spec.homepage
|
|
19
19
|
spec.metadata["source_code_uri"] = "https://github.com/fontist/fontist"
|
|
@@ -28,20 +28,17 @@ Gem::Specification.new do |spec|
|
|
|
28
28
|
spec.test_files = `git ls-files -- {spec}/*`.split("\n")
|
|
29
29
|
|
|
30
30
|
spec.add_runtime_dependency "down", "~> 5.0"
|
|
31
|
-
spec.add_runtime_dependency "libmspack", "~> 0.1.0"
|
|
32
|
-
spec.add_runtime_dependency "rubyzip", "~> 2.3.0"
|
|
33
|
-
spec.add_runtime_dependency "seven_zip_ruby", "~> 1.0"
|
|
34
|
-
spec.add_runtime_dependency "ruby-ole", "~> 1.0"
|
|
35
31
|
spec.add_runtime_dependency "thor", "~> 1.0.1"
|
|
36
32
|
spec.add_runtime_dependency "git", "~> 1.0"
|
|
37
33
|
spec.add_runtime_dependency "ttfunk", "~> 1.0"
|
|
34
|
+
spec.add_runtime_dependency "excavate", "~> 0.1"
|
|
38
35
|
|
|
39
36
|
spec.add_development_dependency "extract_ttc", "~> 0.1"
|
|
40
37
|
spec.add_development_dependency "pry"
|
|
41
38
|
spec.add_development_dependency "bundler", "~> 2.0"
|
|
42
39
|
spec.add_development_dependency "gem-release"
|
|
43
40
|
spec.add_development_dependency "nokogiri", "~> 1.0"
|
|
44
|
-
spec.add_development_dependency "rake", "~>
|
|
41
|
+
spec.add_development_dependency "rake", "~> 13"
|
|
45
42
|
spec.add_development_dependency "rspec", "~> 3.0"
|
|
46
43
|
spec.add_development_dependency "rubocop", "0.75.0"
|
|
47
44
|
spec.add_development_dependency "rubocop-rails"
|
data/lib/fontist.rb
CHANGED
data/lib/fontist/cli.rb
CHANGED
|
@@ -29,12 +29,14 @@ module Fontist
|
|
|
29
29
|
desc "install FONT", "Install font"
|
|
30
30
|
option :force, type: :boolean, aliases: :f,
|
|
31
31
|
desc: "Install even if it's already installed in system"
|
|
32
|
-
option :
|
|
32
|
+
option :accept_all_licenses, type: :boolean, aliases: "--confirm-license", desc: "Accept all license agreements"
|
|
33
|
+
option :hide_licenses, type: :boolean, desc: "Hide license texts"
|
|
33
34
|
def install(font)
|
|
34
35
|
Fontist::Font.install(
|
|
35
36
|
font,
|
|
36
37
|
force: options[:force],
|
|
37
|
-
confirmation: options[:
|
|
38
|
+
confirmation: options[:accept_all_licenses] ? "yes" : "no",
|
|
39
|
+
hide_licenses: options[:hide_licenses]
|
|
38
40
|
)
|
|
39
41
|
success
|
|
40
42
|
rescue Fontist::Errors::GeneralError => e
|
|
@@ -52,12 +54,11 @@ module Fontist
|
|
|
52
54
|
end
|
|
53
55
|
map remove: :uninstall
|
|
54
56
|
|
|
55
|
-
desc "status [FONT]", "Show
|
|
57
|
+
desc "status [FONT]", "Show paths of FONT or all fonts"
|
|
56
58
|
def status(font = nil)
|
|
57
|
-
|
|
58
|
-
return error("No font is installed.", STATUS_MISSING_FONT_ERROR) if
|
|
59
|
+
paths = Fontist::Font.status(font)
|
|
60
|
+
return error("No font is installed.", STATUS_MISSING_FONT_ERROR) if paths.empty?
|
|
59
61
|
|
|
60
|
-
print_formulas(formulas)
|
|
61
62
|
success
|
|
62
63
|
rescue Fontist::Errors::GeneralError => e
|
|
63
64
|
handle_error(e)
|
|
@@ -90,11 +91,13 @@ module Fontist
|
|
|
90
91
|
end
|
|
91
92
|
|
|
92
93
|
desc "manifest-install MANIFEST", "Install fonts from MANIFEST (yaml)"
|
|
93
|
-
option :
|
|
94
|
+
option :accept_all_licenses, type: :boolean, aliases: "--confirm-license", desc: "Accept all license agreements"
|
|
95
|
+
option :hide_licenses, type: :boolean, desc: "Hide license texts"
|
|
94
96
|
def manifest_install(manifest)
|
|
95
97
|
paths = Fontist::Manifest::Install.from_file(
|
|
96
98
|
manifest,
|
|
97
|
-
confirmation: options[:
|
|
99
|
+
confirmation: options[:accept_all_licenses] ? "yes" : "no",
|
|
100
|
+
hide_licenses: options[:hide_licenses]
|
|
98
101
|
)
|
|
99
102
|
|
|
100
103
|
print_yaml(paths)
|
|
@@ -155,20 +158,6 @@ module Fontist
|
|
|
155
158
|
Fontist.ui.say(YAML.dump(object))
|
|
156
159
|
end
|
|
157
160
|
|
|
158
|
-
def print_formulas(formulas)
|
|
159
|
-
formulas.each do |formula, fonts|
|
|
160
|
-
Fontist.ui.success(formula.key)
|
|
161
|
-
|
|
162
|
-
fonts.each do |font, styles|
|
|
163
|
-
Fontist.ui.success(" #{font.name}")
|
|
164
|
-
|
|
165
|
-
styles.each do |style, path|
|
|
166
|
-
Fontist.ui.success(" #{style.type} (#{path})")
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
end
|
|
171
|
-
|
|
172
161
|
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
173
162
|
def print_list(formulas)
|
|
174
163
|
formulas.each do |formula, fonts|
|
data/lib/fontist/errors.rb
CHANGED
|
@@ -14,6 +14,7 @@ module Fontist
|
|
|
14
14
|
class TamperedFileError < GeneralError; end
|
|
15
15
|
class TimeoutError < GeneralError; end
|
|
16
16
|
class UnknownFontTypeError < GeneralError; end
|
|
17
|
+
class UnknownArchiveError < GeneralError; end
|
|
17
18
|
|
|
18
19
|
class FontError < GeneralError
|
|
19
20
|
attr_reader :font, :style
|
data/lib/fontist/font.rb
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
require "fontist/font_installer"
|
|
2
|
+
require "fontist/font_path"
|
|
2
3
|
|
|
3
4
|
module Fontist
|
|
4
5
|
class Font
|
|
5
6
|
def initialize(options = {})
|
|
6
7
|
@name = options[:name]
|
|
7
8
|
@confirmation = options[:confirmation] || "no"
|
|
9
|
+
@hide_licenses = options[:hide_licenses]
|
|
8
10
|
@force = options[:force] || false
|
|
9
11
|
|
|
10
12
|
check_or_create_fontist_path!
|
|
@@ -18,8 +20,8 @@ module Fontist
|
|
|
18
20
|
new(name: name).find
|
|
19
21
|
end
|
|
20
22
|
|
|
21
|
-
def self.install(name,
|
|
22
|
-
new(name: name
|
|
23
|
+
def self.install(name, options = {})
|
|
24
|
+
new(options.merge(name: name)).install
|
|
23
25
|
end
|
|
24
26
|
|
|
25
27
|
def self.uninstall(name)
|
|
@@ -47,9 +49,9 @@ module Fontist
|
|
|
47
49
|
end
|
|
48
50
|
|
|
49
51
|
def status
|
|
50
|
-
return
|
|
52
|
+
return installed_paths unless @name
|
|
51
53
|
|
|
52
|
-
|
|
54
|
+
find_system_font || downloadable_font || raise_non_supported_font
|
|
53
55
|
end
|
|
54
56
|
|
|
55
57
|
def list
|
|
@@ -64,7 +66,7 @@ module Fontist
|
|
|
64
66
|
|
|
65
67
|
private
|
|
66
68
|
|
|
67
|
-
attr_reader :name
|
|
69
|
+
attr_reader :name
|
|
68
70
|
|
|
69
71
|
def find_system_font
|
|
70
72
|
paths = Fontist::SystemFont.find(name)
|
|
@@ -73,9 +75,14 @@ module Fontist
|
|
|
73
75
|
return
|
|
74
76
|
end
|
|
75
77
|
|
|
78
|
+
print_paths(paths)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def print_paths(paths)
|
|
76
82
|
Fontist.ui.say("Fonts found at:")
|
|
77
83
|
paths.each do |path|
|
|
78
|
-
|
|
84
|
+
font_path = FontPath.new(path)
|
|
85
|
+
Fontist.ui.say(font_path.to_s)
|
|
79
86
|
end
|
|
80
87
|
end
|
|
81
88
|
|
|
@@ -94,6 +101,10 @@ module Fontist
|
|
|
94
101
|
@formula ||= Fontist::Formula.find(name)
|
|
95
102
|
end
|
|
96
103
|
|
|
104
|
+
def formulas
|
|
105
|
+
@formulas ||= Fontist::Formula.find_many(name)
|
|
106
|
+
end
|
|
107
|
+
|
|
97
108
|
def downloadable_font
|
|
98
109
|
if formula
|
|
99
110
|
raise Fontist::Errors::MissingFontError.new(name)
|
|
@@ -101,8 +112,10 @@ module Fontist
|
|
|
101
112
|
end
|
|
102
113
|
|
|
103
114
|
def download_font
|
|
104
|
-
if
|
|
105
|
-
|
|
115
|
+
return if formulas.empty?
|
|
116
|
+
|
|
117
|
+
formulas.flat_map do |formula|
|
|
118
|
+
confirmation = check_and_confirm_required_license(formula)
|
|
106
119
|
paths = font_installer(formula).install(confirmation: confirmation)
|
|
107
120
|
|
|
108
121
|
Fontist.ui.say("Fonts installed at:")
|
|
@@ -113,19 +126,24 @@ module Fontist
|
|
|
113
126
|
end
|
|
114
127
|
|
|
115
128
|
def check_and_confirm_required_license(formula)
|
|
116
|
-
|
|
117
|
-
@confirmation = show_license_and_ask_for_input(formula.license)
|
|
129
|
+
return @confirmation unless formula.license_required
|
|
118
130
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
131
|
+
show_license(formula.license) unless @hide_licenses
|
|
132
|
+
return @confirmation if @confirmation.casecmp?("yes")
|
|
133
|
+
|
|
134
|
+
confirmation = ask_for_agreement
|
|
135
|
+
return confirmation if confirmation&.casecmp?("yes")
|
|
136
|
+
|
|
137
|
+
raise Fontist::Errors::LicensingError.new(
|
|
138
|
+
"Fontist will not download these fonts unless you accept the terms."
|
|
139
|
+
)
|
|
125
140
|
end
|
|
126
141
|
|
|
127
|
-
def
|
|
142
|
+
def show_license(license)
|
|
128
143
|
Fontist.ui.say(license_agrement_message(license))
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def ask_for_agreement
|
|
129
147
|
Fontist.ui.ask(
|
|
130
148
|
"\nDo you accept all presented font licenses, and want Fontist " \
|
|
131
149
|
"to download these fonts for you? => TYPE 'Yes' or 'No':"
|
|
@@ -161,37 +179,14 @@ module Fontist
|
|
|
161
179
|
Fontist::FontistFont.find(name)
|
|
162
180
|
end
|
|
163
181
|
|
|
164
|
-
def
|
|
165
|
-
|
|
182
|
+
def installed_paths
|
|
183
|
+
print_paths(SystemFont.font_paths)
|
|
166
184
|
end
|
|
167
185
|
|
|
168
186
|
def all_formulas
|
|
169
187
|
Fontist::Formula.all
|
|
170
188
|
end
|
|
171
189
|
|
|
172
|
-
def font_status
|
|
173
|
-
return unless formula
|
|
174
|
-
|
|
175
|
-
statuses = installed_styles([formula])
|
|
176
|
-
statuses.empty? ? nil : statuses
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
def installed_styles(formulas)
|
|
180
|
-
filter_blank(formulas) do |formula|
|
|
181
|
-
filter_blank(formula.fonts) do |font|
|
|
182
|
-
filter_blank(font.styles) do |style|
|
|
183
|
-
path(style)
|
|
184
|
-
end
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
def filter_blank(elements)
|
|
190
|
-
elements.map { |e| [e, yield(e)] }
|
|
191
|
-
.to_h
|
|
192
|
-
.reject { |_k, v| v.nil? || v.empty? }
|
|
193
|
-
end
|
|
194
|
-
|
|
195
190
|
def path(style)
|
|
196
191
|
font_paths.detect do |path|
|
|
197
192
|
File.basename(path) == style.font
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
require "fontist/utils"
|
|
2
|
+
require "excavate"
|
|
2
3
|
|
|
3
4
|
module Fontist
|
|
4
5
|
class FontInstaller
|
|
5
|
-
include Utils::ZipExtractor
|
|
6
|
-
include Utils::ExeExtractor
|
|
7
|
-
include Utils::MsiExtractor
|
|
8
|
-
include Utils::SevenZipExtractor
|
|
9
|
-
|
|
10
6
|
def initialize(formula)
|
|
11
7
|
@formula = formula
|
|
12
8
|
end
|
|
@@ -16,7 +12,6 @@ module Fontist
|
|
|
16
12
|
raise(Fontist::Errors::LicensingError)
|
|
17
13
|
end
|
|
18
14
|
|
|
19
|
-
reinitialize
|
|
20
15
|
install_font
|
|
21
16
|
end
|
|
22
17
|
|
|
@@ -24,10 +19,6 @@ module Fontist
|
|
|
24
19
|
|
|
25
20
|
attr_reader :formula
|
|
26
21
|
|
|
27
|
-
def reinitialize
|
|
28
|
-
@downloaded = false
|
|
29
|
-
end
|
|
30
|
-
|
|
31
22
|
def install_font
|
|
32
23
|
fonts_paths = run_in_temp_dir { extract }
|
|
33
24
|
fonts_paths.empty? ? nil : fonts_paths
|
|
@@ -46,47 +37,39 @@ module Fontist
|
|
|
46
37
|
end
|
|
47
38
|
|
|
48
39
|
def extract
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
[@formula.extract].flatten.each do |operation|
|
|
52
|
-
resource = extract_by_operation(operation, resource)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
fonts_paths = resource
|
|
40
|
+
archive = download_file(@formula.resources.first)
|
|
56
41
|
|
|
57
|
-
|
|
42
|
+
install_fonts_from_archive(archive)
|
|
58
43
|
end
|
|
59
44
|
|
|
60
|
-
def
|
|
61
|
-
|
|
62
|
-
if operation.options
|
|
63
|
-
send(method, resource, **operation.options.to_h)
|
|
64
|
-
else
|
|
65
|
-
send(method, resource)
|
|
66
|
-
end
|
|
67
|
-
end
|
|
45
|
+
def install_fonts_from_archive(archive)
|
|
46
|
+
Fontist.ui.say(%(Installing font "#{@formula.key}".))
|
|
68
47
|
|
|
69
|
-
|
|
70
|
-
|
|
48
|
+
Array.new.tap do |fonts_paths|
|
|
49
|
+
Excavate::Archive.new(archive.path).files(recursive_packages: true) do |path|
|
|
50
|
+
fonts_paths << install_font_file(path) if font_file?(path)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
71
53
|
end
|
|
72
54
|
|
|
73
55
|
def download_file(source)
|
|
74
56
|
url = source.urls.first
|
|
75
57
|
Fontist.ui.say(%(Downloading font "#{@formula.key}" from #{url}))
|
|
76
58
|
|
|
77
|
-
|
|
59
|
+
Fontist::Utils::Downloader.download(
|
|
78
60
|
url,
|
|
79
61
|
sha: source.sha256,
|
|
80
62
|
file_size: source.file_size,
|
|
81
63
|
progress_bar: true
|
|
82
64
|
)
|
|
65
|
+
end
|
|
83
66
|
|
|
84
|
-
|
|
85
|
-
|
|
67
|
+
def font_file?(path)
|
|
68
|
+
source_file?(path) && font_directory?(path)
|
|
86
69
|
end
|
|
87
70
|
|
|
88
|
-
def
|
|
89
|
-
source_files.include?(
|
|
71
|
+
def source_file?(path)
|
|
72
|
+
source_files.include?(File.basename(path))
|
|
90
73
|
end
|
|
91
74
|
|
|
92
75
|
def source_files
|
|
@@ -97,6 +80,27 @@ module Fontist
|
|
|
97
80
|
end
|
|
98
81
|
end
|
|
99
82
|
|
|
83
|
+
def font_directory?(path)
|
|
84
|
+
return true unless subdirectory_pattern
|
|
85
|
+
|
|
86
|
+
File.fnmatch?(subdirectory_pattern, File.dirname(path))
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def subdirectory_pattern
|
|
90
|
+
@subdirectory_pattern ||= "*" + subdirectories.first.chomp("/") unless subdirectories.empty?
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def subdirectories
|
|
94
|
+
@subdirectories ||= [@formula.extract].flatten.map(&:options).compact.map(&:fonts_sub_dir).compact
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def install_font_file(source)
|
|
98
|
+
target = Fontist.fonts_path.join(target_filename(File.basename(source))).to_s
|
|
99
|
+
FileUtils.mv(source, target)
|
|
100
|
+
|
|
101
|
+
target
|
|
102
|
+
end
|
|
103
|
+
|
|
100
104
|
def target_filename(source_filename)
|
|
101
105
|
target_filenames[source_filename]
|
|
102
106
|
end
|