fontist 1.16.0 → 1.17.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 14a836d048cc0ce0d74885f256e3d7cb48466efcadd75008207e1568927ca8cc
4
- data.tar.gz: 468355d3c50412aef7642ad44abf204edbf827a81d3ccfe327f274a90cddedcd
3
+ metadata.gz: 91726c53a66563f2b0a32417d45d246617b85586cc7c9573b24c5b83533c5444
4
+ data.tar.gz: de8e1aba5de04fb720c85a6c98e708dcbae944bf439c15f4dc29c3f27e4d0831
5
5
  SHA512:
6
- metadata.gz: 62e88a6ac1766b61ffe5db70b36f9b0bb8316d80c048d8df8de57e39e3387de1fd60c3cff1094f0b235d7bfab0979d2b4e4ed01eba12125852f745327e8641b1
7
- data.tar.gz: 97338d5eee1a8df78555281d9bc765499f30c86b98913bae5b21729745e5e983ed257e8ee51d543802e69dc734eee64f464dd8b319c534c3b06c768a65267817
6
+ metadata.gz: d05de7120339d223fc716ad1f99a60c80ec54deb37bbe77692cff0295d3ccc4b7263ae5bc2ed2beae3dc82f18f0684d85b47f01ca4c5730e04ec4cb82357be2c
7
+ data.tar.gz: 381a74039161a1e9d5ea9b560afbc9c551083c67462002f9c590da83fe69283fd8d0506983554c19d9f0ded9fba33a3b71a5d7db11a82d3689ebd7b885a9cfc2
data/README.adoc CHANGED
@@ -73,6 +73,10 @@ All commands support the following global options:
73
73
  NOTE: See <<preferred-family-change>> for the differences between
74
74
  "`preferred family`" and "`default family`".
75
75
 
76
+ `-q, --quiet`:: Print as little information as possible, mostly critical errors.
77
+
78
+ `-v, --verbose`:: Set the log level to debug. It prints formulas excluded
79
+ during installation and information for developers of fontist.
76
80
 
77
81
  === Install fonts: `fontist install`
78
82
 
@@ -125,6 +129,12 @@ for the newest version of the font among formulas with size below a limit
125
129
  NOTE: If styles of a font are spread among several formulas, then all
126
130
  available styles from all formulas would be installed.
127
131
 
132
+ NOTE: Some formulas may have the `min_fontist` attribute, which defines the
133
+ minimum version of fontist by which they can be installed. If `fontist` is of a
134
+ older version, then the formula is avoided to use. In order to see which
135
+ formulas were excluded from the search, the `-v, --verbose` option can be
136
+ specified.
137
+
128
138
  Supported options:
129
139
 
130
140
  `-f, [--force]`:: Install even if already installed in system
@@ -969,6 +979,15 @@ $ fontist install --formula ms_truetype
969
979
 
970
980
  WARNING: This section is only for Fontist maintainers.
971
981
 
982
+ === Formulas versioning
983
+
984
+ To add a new attribute, change how formula is treated or completely replace the structure, there are 2 ways to change a formula format:
985
+
986
+ 1. Use the `min_fontist` attribute in a formula. It sets a requirement for fontist to install the formula only if its version is equal or more than a specified version.
987
+ 2. Use a new branch in the formulas repo, e.g. "v2", "v3", "v4", etc. After creating a new branch, it should be defined in https://github.com/fontist/fontist/blob/v1.16.0/lib/fontist.rb#L51[`Fontist.formulas_version`]
988
+
989
+ NOTE: Using a new branch would require all users to re-download the entire formulas repo. Since this method has a significant overhead, the former one (`min_fontist`) should be used whenever possible.
990
+
972
991
  === Dynamically importing formulas from Google Fonts
973
992
 
974
993
  https://fonts.google.com[Google Fonts] provides probably the largest collection
data/fontist.gemspec CHANGED
@@ -38,7 +38,7 @@ Gem::Specification.new do |spec|
38
38
  spec.add_runtime_dependency "git", "~> 1.0"
39
39
  spec.add_runtime_dependency "ttfunk", "~> 1.6"
40
40
  spec.add_runtime_dependency "plist", "~> 3.0"
41
- spec.add_runtime_dependency "excavate", "~> 0.3"
41
+ spec.add_runtime_dependency "excavate", "~> 0.3", '>= 0.3.4'
42
42
  spec.add_runtime_dependency "socksify", "~> 1.7"
43
43
 
44
44
  spec.add_development_dependency "pry", "~> 0.14"
@@ -3,12 +3,19 @@ module Fontist
3
3
  module ClassOptions
4
4
  def handle_class_options(options)
5
5
  Fontist.preferred_family = options[:preferred_family]
6
- Fontist.log_level = options[:quiet] ? :fatal : :info
6
+ Fontist.log_level = log_level(options)
7
7
 
8
8
  if options[:formulas_path]
9
9
  Fontist.formulas_path = Pathname.new(options[:formulas_path])
10
10
  end
11
11
  end
12
+
13
+ def log_level(options)
14
+ return :debug if options[:verbose]
15
+ return :fatal if options[:quiet]
16
+
17
+ :info
18
+ end
12
19
  end
13
20
  end
14
21
  end
data/lib/fontist/cli.rb CHANGED
@@ -25,6 +25,7 @@ module Fontist
25
25
  STATUS_FORMULA_NOT_FOUND = 13
26
26
  STATUS_FONTCONFIG_NOT_FOUND = 14
27
27
  STATUS_FONTCONFIG_FILE_NOT_FOUND = 15
28
+ STATUS_FONTIST_VERSION_ERROR = 15
28
29
 
29
30
  ERROR_TO_STATUS = {
30
31
  Fontist::Errors::UnsupportedFontError => [STATUS_NON_SUPPORTED_FONT_ERROR],
@@ -50,6 +51,7 @@ module Fontist
50
51
  Fontist::Errors::FontconfigNotFoundError => [STATUS_FONTCONFIG_NOT_FOUND],
51
52
  Fontist::Errors::FontconfigFileNotFoundError =>
52
53
  [STATUS_FONTCONFIG_FILE_NOT_FOUND],
54
+ Fontist::Errors::FontistVersionError => [STATUS_FONTIST_VERSION_ERROR],
53
55
  }.freeze
54
56
 
55
57
  def self.exit_on_failure?
@@ -65,6 +67,11 @@ module Fontist
65
67
  type: :boolean,
66
68
  desc: "Hide all messages"
67
69
 
70
+ class_option :verbose,
71
+ aliases: :v,
72
+ type: :boolean,
73
+ desc: "Print debug messages"
74
+
68
75
  class_option :formulas_path, type: :string, desc: "Path to formulas"
69
76
 
70
77
  desc "install FONT", "Install font"
@@ -179,9 +186,10 @@ module Fontist
179
186
  desc "create-formula URL", "Create a new formula with fonts from URL"
180
187
  option :name, desc: "Example: Times New Roman"
181
188
  option :mirror, repeatable: true
182
- option :subarchive, desc: "Subarchive to choose when there are several ones"
183
189
  option :subdir, desc: "Subdirectory to take fonts from, starting with the " \
184
190
  "root dir, e.g.: stixfonts-2.10/fonts/static_otf. May include `fnmatch` patterns."
191
+ option :file_pattern, desc: "File pattern, e.g. '*.otf'. " \
192
+ "Uses `fnmatch` patterns."
185
193
  def create_formula(url)
186
194
  handle_class_options(options)
187
195
  require "fontist/import/create_formula"
@@ -0,0 +1,46 @@
1
+ require "ttfunk"
2
+
3
+ module Fontist
4
+ class CollectionFile
5
+ include Enumerable
6
+
7
+ class << self
8
+ def from_path(path)
9
+ io = ::File.new(path, "rb")
10
+
11
+ yield new(build_collection(io))
12
+ ensure
13
+ io.close
14
+ end
15
+
16
+ private
17
+
18
+ def build_collection(io)
19
+ TTFunk::Collection.new(io)
20
+ rescue StandardError => e
21
+ raise Errors::FontFileError,
22
+ "Font file could not be parsed: #{e.inspect}."
23
+ end
24
+ end
25
+
26
+ def initialize(ttfunk_collection)
27
+ @collection = ttfunk_collection
28
+ end
29
+
30
+ def count
31
+ @collection.count
32
+ end
33
+
34
+ def each
35
+ count.times do |index|
36
+ yield self[index]
37
+ end
38
+
39
+ self
40
+ end
41
+
42
+ def [](index)
43
+ FontFile.from_collection_index(@collection, index)
44
+ end
45
+ end
46
+ end
@@ -18,6 +18,10 @@ module Fontist
18
18
 
19
19
  class FontIndexCorrupted < GeneralError; end
20
20
 
21
+ class FontFileError < GeneralError; end
22
+
23
+ class FontistVersionError < GeneralError; end
24
+
21
25
  class FontNotFoundError < GeneralError; end
22
26
 
23
27
  # for backward compatibility with metanorma,
@@ -0,0 +1,109 @@
1
+ require "ttfunk"
2
+
3
+ module Fontist
4
+ class FontFile
5
+ PLATFORM_MACINTOSH = 1
6
+ PLATFORM_MICROSOFT = 3
7
+
8
+ ENCODING_MAC_ROMAN = 0
9
+ ENCODING_MS_UNICODE_BMP = 1
10
+
11
+ LANGUAGE_MAC_ENGLISH = 0
12
+ LANGUAGE_MS_ENGLISH_AMERICAN = 0x409
13
+
14
+ class << self
15
+ def from_path(path)
16
+ content = File.read(path, mode: "rb")
17
+
18
+ from_content(content)
19
+ end
20
+
21
+ def from_content(content)
22
+ new(build_font(content))
23
+ end
24
+
25
+ def from_collection_index(collection, index)
26
+ new(build_font_from_collection_index(collection, index))
27
+ end
28
+
29
+ private
30
+
31
+ def build_font(content)
32
+ TTFunk::File.new(content)
33
+ rescue StandardError => e
34
+ raise_font_file_error(e)
35
+ end
36
+
37
+ def build_font_from_collection_index(collection, index)
38
+ collection[index]
39
+ rescue StandardError => e
40
+ raise_font_file_error(e)
41
+ end
42
+
43
+ def raise_font_file_error(exception)
44
+ raise Errors::FontFileError,
45
+ "Font file could not be parsed: #{exception.inspect}."
46
+ end
47
+ end
48
+
49
+ def initialize(ttfunk_file)
50
+ @file = ttfunk_file
51
+ end
52
+
53
+ def full_name
54
+ english_name(main_name.font_name)
55
+ end
56
+
57
+ def family
58
+ english_name(main_name.font_family)
59
+ end
60
+
61
+ def subfamily
62
+ english_name(main_name.font_subfamily)
63
+ end
64
+
65
+ def preferred_family
66
+ return if main_name.preferred_family.empty?
67
+
68
+ english_name(main_name.preferred_family)
69
+ end
70
+
71
+ def preferred_subfamily
72
+ return if main_name.preferred_subfamily.empty?
73
+
74
+ english_name(main_name.preferred_subfamily)
75
+ end
76
+
77
+ private
78
+
79
+ def main_name
80
+ @main_name ||= @file.name
81
+ end
82
+
83
+ def english_name(name)
84
+ visible_characters(find_english(name))
85
+ end
86
+
87
+ def find_english(name)
88
+ name.find { |x| microsoft_english?(x) } ||
89
+ name.find { |x| mac_english?(x) } ||
90
+ name.last
91
+ end
92
+
93
+ def microsoft_english?(string)
94
+ string.platform_id == PLATFORM_MICROSOFT &&
95
+ string.encoding_id == ENCODING_MS_UNICODE_BMP &&
96
+ string.language_id == LANGUAGE_MS_ENGLISH_AMERICAN
97
+ end
98
+
99
+ def mac_english?(string)
100
+ string.platform_id == PLATFORM_MACINTOSH &&
101
+ string.encoding_id == ENCODING_MAC_ROMAN &&
102
+ string.language_id == LANGUAGE_MAC_ENGLISH
103
+ end
104
+
105
+ def visible_characters(text)
106
+ text.gsub(/[^[:print:]]/, "").to_s
107
+ end
108
+ end
109
+ end
@@ -10,9 +10,8 @@ module Fontist
10
10
  end
11
11
 
12
12
  def install(confirmation:)
13
- if @formula.license_required && !"yes".casecmp?(confirmation)
14
- raise(Fontist::Errors::LicensingError)
15
- end
13
+ raise_fontist_version_error unless supported_version?
14
+ raise_licensing_error unless license_is_accepted?(confirmation)
16
15
 
17
16
  install_font
18
17
  end
@@ -21,6 +20,33 @@ module Fontist
21
20
 
22
21
  attr_reader :formula
23
22
 
23
+ def supported_version?
24
+ return true unless @formula.min_fontist
25
+
26
+ fontist_version = Gem::Version.new(Fontist::VERSION)
27
+ min_fontist_required = Gem::Version.new(@formula.min_fontist)
28
+
29
+ fontist_version >= min_fontist_required
30
+ end
31
+
32
+ def raise_fontist_version_error
33
+ raise Fontist::Errors::FontistVersionError,
34
+ "Formula requires higher version of fontist. " \
35
+ "Please upgrade fontist.\n" \
36
+ "Minimum required version: #{formula.min_fontist}. " \
37
+ "Current fontist version: #{Fontist::VERSION}."
38
+ end
39
+
40
+ def license_is_accepted?(confirmation)
41
+ return true unless @formula.license_required
42
+
43
+ "yes".casecmp?(confirmation)
44
+ end
45
+
46
+ def raise_licensing_error
47
+ raise(Fontist::Errors::LicensingError)
48
+ end
49
+
24
50
  def install_font
25
51
  fonts_paths = run_in_temp_dir { extract }
26
52
  fonts_paths.empty? ? nil : fonts_paths
@@ -120,6 +120,10 @@ module Fontist
120
120
  @data["platforms"]
121
121
  end
122
122
 
123
+ def min_fontist
124
+ @data["min_fontist"]
125
+ end
126
+
123
127
  def extract
124
128
  Helpers.parse_to_object(@data["extract"])
125
129
  end
@@ -5,66 +5,117 @@ module Fontist
5
5
  def initialize(font_name, size_limit:, version:, smallest:, newest:)
6
6
  @font_name = font_name
7
7
  @size_limit = size_limit || Fontist.formula_size_limit_in_megabytes
8
- @version = version
9
- @smallest = smallest
10
- @newest = newest
8
+
9
+ @options = {}
10
+ @version = @options[:version] = version if version
11
+ @smallest = @options[:smallest] = smallest if smallest
12
+ @newest = @options[:newest] = newest if newest
11
13
  end
12
14
 
13
15
  def call(formulas)
14
16
  return [] if formulas.empty?
15
- return formulas if contain_different_styles?(formulas)
16
- return by_version(formulas) if version_is_passed?
17
- return newest(formulas) if newest_is_passed?
18
- return smallest(formulas) if smallest_is_passed?
19
17
 
20
- default_way(formulas)
18
+ list = filter(formulas)
19
+ return [] if list.empty?
20
+
21
+ choose(list)
21
22
  end
22
23
 
23
24
  private
24
25
 
25
- def version_is_passed?
26
- !@version.nil?
26
+ def filter(formulas)
27
+ list = formulas
28
+
29
+ list = filter_by_passed_version(formulas) if @version
30
+ return [] if list.empty?
31
+
32
+ list = ensure_size_limit(list) if @options.empty?
33
+
34
+ ensure_fontist_version(list)
27
35
  end
28
36
 
29
- def by_version(formulas)
30
- formulas.each do |formula|
31
- fonts = formula.fonts_by_name(@font_name)
32
- fonts.each do |font|
33
- font.styles.each do |style|
34
- version = StyleVersion.new(style.version)
35
- return [formula] if version == passed_version
36
- end
37
+ def ensure_fontist_version(formulas)
38
+ suitable, unsuitable = filter_by_fontist_version(formulas)
39
+ raise_fontist_version_error(unsuitable) if suitable.empty?
40
+
41
+ suitable
42
+ end
43
+
44
+ def filter_by_fontist_version(formulas)
45
+ suitable, unsuitable = formulas.partition do |f|
46
+ f.min_fontist.nil? ||
47
+ Gem::Version.new(Fontist::VERSION) >= Gem::Version.new(f.min_fontist)
48
+ end
49
+
50
+ unless unsuitable.empty?
51
+ print_formulas_with_unsuitable_fontist_version(unsuitable)
52
+ end
53
+
54
+ [suitable, unsuitable]
55
+ end
56
+
57
+ def print_formulas_with_unsuitable_fontist_version(formulas)
58
+ Fontist.ui.debug(
59
+ "Some formulas were excluded from choice, because they require " \
60
+ "higher version of fontist: #{formulas_versions(formulas)}. " \
61
+ "Current fontist version: #{Fontist::VERSION}.",
62
+ )
63
+ end
64
+
65
+ def raise_fontist_version_error(formulas)
66
+ raise Fontist::Errors::FontistVersionError,
67
+ "Suitable formulas require higher version of fontist. " \
68
+ "Please upgrade fontist.\n" \
69
+ "Minimum required version: #{formulas_versions(formulas)}. " \
70
+ "Current fontist version: #{Fontist::VERSION}."
71
+ end
72
+
73
+ def formulas_versions(formulas)
74
+ formulas.map { |f| "#{f.key} (#{f.min_fontist})" }.join(", ")
75
+ end
76
+
77
+ def filter_by_passed_version(formulas)
78
+ formulas.select do |formula|
79
+ contain_passed_version?(formula)
80
+ end
81
+ end
82
+
83
+ def contain_passed_version?(formula)
84
+ fonts = formula.fonts_by_name(@font_name)
85
+ fonts.each do |font|
86
+ font.styles.each do |style|
87
+ version = StyleVersion.new(style.version)
88
+ return true if version == passed_version
37
89
  end
38
90
  end
39
91
 
40
- []
92
+ false
41
93
  end
42
94
 
43
95
  def passed_version
44
96
  @passed_version ||= StyleVersion.new(@version)
45
97
  end
46
98
 
47
- def newest_is_passed?
48
- @newest
49
- end
99
+ def choose(formulas)
100
+ return formulas if contain_different_styles?(formulas)
50
101
 
51
- def newest(formulas)
52
- newest_formulas = filter_by_max_version(formulas)
53
- smallest(newest_formulas)
54
- end
102
+ list = formulas
103
+
104
+ if @options.empty? || @newest
105
+ list = choose_max_version(list)
106
+ end
55
107
 
56
- def smallest_is_passed?
57
- @smallest
108
+ smallest(list)
58
109
  end
59
110
 
60
111
  def smallest(formulas)
61
112
  [choose_smallest_formula(formulas)]
62
113
  end
63
114
 
64
- def default_way(formulas)
65
- size_limited_formulas = filter_by_size_limit(formulas)
66
- raise_size_limit_error if size_limited_formulas.empty?
67
- newest(size_limited_formulas)
115
+ def choose_smallest_formula(formulas)
116
+ formulas.min_by do |formula|
117
+ formula.file_size || 0
118
+ end
68
119
  end
69
120
 
70
121
  def contain_different_styles?(formulas)
@@ -80,6 +131,13 @@ module Fontist
80
131
  styles_by_formula.uniq.size > 1
81
132
  end
82
133
 
134
+ def ensure_size_limit(formulas)
135
+ list = filter_by_size_limit(formulas)
136
+ raise_size_limit_error if list.empty?
137
+
138
+ list
139
+ end
140
+
83
141
  def filter_by_size_limit(formulas)
84
142
  formulas.select do |formula|
85
143
  formula.file_size.nil? || resources_cached?(formula) ||
@@ -97,7 +155,7 @@ module Fontist
97
155
  "(#{@size_limit} MB)."
98
156
  end
99
157
 
100
- def filter_by_max_version(formulas)
158
+ def choose_max_version(formulas)
101
159
  formulas_with_version = detect_formula_version(formulas)
102
160
  max_version = formulas_with_version.map(&:first).max
103
161
  formulas_with_version.select do |version, _formula|
@@ -118,12 +176,6 @@ module Fontist
118
176
  end
119
177
  end
120
178
 
121
- def choose_smallest_formula(formulas)
122
- formulas.min_by do |formula|
123
- formula.file_size || 0
124
- end
125
- end
126
-
127
179
  def resources_cached?(formula)
128
180
  Utils::Cache.new.already_fetched?(
129
181
  formula.resources.flat_map(&:urls),
@@ -40,8 +40,8 @@ module Fontist
40
40
  def extractor
41
41
  @extractor ||=
42
42
  RecursiveExtraction.new(archive,
43
- subarchive: @options[:subarchive],
44
- subdir: @options[:subdir])
43
+ subdir: @options[:subdir],
44
+ file_pattern: @options[:file_pattern])
45
45
  end
46
46
 
47
47
  def archive
@@ -70,7 +70,9 @@ module Fontist
70
70
  end
71
71
 
72
72
  def font
73
- File.basename(@path, ".*") + "." + @extension
73
+ basename = File.basename(@path, ".*").chomp(".#{@extension}")
74
+
75
+ "#{basename}.#{@extension}"
74
76
  end
75
77
 
76
78
  def source_font
@@ -8,9 +8,10 @@ module Fontist
8
8
  LICENSE_PATTERN =
9
9
  /(ofl\.txt|ufl\.txt|licenses?\.txt|license(\.md)?|copying)$/i.freeze
10
10
 
11
- def initialize(archive, subarchive: nil, subdir: nil)
11
+ def initialize(archive, subdir: nil, file_pattern: nil)
12
12
  @archive = archive
13
13
  @subdir = subdir
14
+ @file_pattern = file_pattern
14
15
  @operations = {}
15
16
  @font_files = []
16
17
  @collection_files = []
@@ -72,10 +73,11 @@ module Fontist
72
73
 
73
74
  def extract_data(archive)
74
75
  Excavate::Archive.new(path(archive)).files(recursive_packages: true) do |path|
76
+ Fontist.ui.debug(path)
75
77
  next unless File.file?(path)
76
78
 
77
79
  match_license(path)
78
- match_font(path) if font_directory?(path)
80
+ match_font(path) if font_candidate?(path)
79
81
  end
80
82
  end
81
83
 
@@ -110,6 +112,10 @@ module Fontist
110
112
  end
111
113
  end
112
114
 
115
+ def font_candidate?(path)
116
+ font_directory?(path) && file_pattern?(path)
117
+ end
118
+
113
119
  def font_directory?(path)
114
120
  return true unless subdirectory_pattern
115
121
 
@@ -119,6 +125,12 @@ module Fontist
119
125
  def subdirectory_pattern
120
126
  @subdirectory_pattern ||= "*" + @subdir.chomp("/") if @subdir
121
127
  end
128
+
129
+ def file_pattern?(path)
130
+ return true unless @file_pattern
131
+
132
+ File.fnmatch?(@file_pattern, File.basename(path))
133
+ end
122
134
  end
123
135
  end
124
136
  end
@@ -1,4 +1,5 @@
1
- require "ttfunk"
1
+ require_relative "font_file"
2
+ require_relative "collection_file"
2
3
 
3
4
  module Fontist
4
5
  class SystemIndex
@@ -6,11 +7,11 @@ module Fontist
6
7
 
7
8
  class DefaultFamily
8
9
  def family_name(name)
9
- name.font_family
10
+ name.family
10
11
  end
11
12
 
12
13
  def type(name)
13
- name.font_subfamily
14
+ name.subfamily
14
15
  end
15
16
 
16
17
  def transform_override_keys(dict)
@@ -20,15 +21,11 @@ module Fontist
20
21
 
21
22
  class PreferredFamily
22
23
  def family_name(name)
23
- return name.font_family if name.preferred_family.empty?
24
-
25
- name.preferred_family
24
+ name.preferred_family || name.family
26
25
  end
27
26
 
28
27
  def type(name)
29
- return name.font_subfamily if name.preferred_subfamily.empty?
30
-
31
- name.preferred_subfamily
28
+ name.preferred_subfamily || name.subfamily
32
29
  end
33
30
 
34
31
  def transform_override_keys(dict)
@@ -37,15 +34,6 @@ module Fontist
37
34
  end
38
35
  end
39
36
 
40
- PLATFORM_MACINTOSH = 1
41
- PLATFORM_MICROSOFT = 3
42
-
43
- ENCODING_MAC_ROMAN = 0
44
- ENCODING_MS_UNICODE_BMP = 1
45
-
46
- LANGUAGE_MAC_ENGLISH = 0
47
- LANGUAGE_MS_ENGLISH_AMERICAN = 0x409
48
-
49
37
  ALLOWED_KEYS = %i[path full_name family_name type].freeze
50
38
 
51
39
  def self.system_index
@@ -174,22 +162,26 @@ module Fontist
174
162
  else
175
163
  raise Errors::UnknownFontTypeError.new(path)
176
164
  end
177
- rescue StandardError
165
+ rescue Errors::FontFileError => e
166
+ print_recognition_error(e, path)
167
+ end
168
+
169
+ def print_recognition_error(exception, path)
178
170
  Fontist.ui.error(<<~MSG.chomp)
179
- #{$!.message}
171
+ #{exception.inspect}
180
172
  Warning: File at #{path} not recognized as a font file.
181
173
  MSG
174
+ nil
182
175
  end
183
176
 
184
177
  def detect_file_font(path)
185
- content = File.read(path, mode: "rb")
186
- file = TTFunk::File.new(content)
178
+ file = FontFile.from_path(path)
187
179
 
188
180
  parse_font(file, path)
189
181
  end
190
182
 
191
183
  def detect_collection_fonts(path)
192
- TTFunk::Collection.open(path) do |collection|
184
+ CollectionFile.from_path(path) do |collection|
193
185
  collection.map do |file|
194
186
  parse_font(file, path)
195
187
  end
@@ -197,43 +189,16 @@ module Fontist
197
189
  end
198
190
 
199
191
  def parse_font(file, path)
200
- x = file.name
201
- family_name = english_name(@family.family_name(x))
192
+ family_name = @family.family_name(file)
202
193
 
203
194
  {
204
195
  path: path,
205
- full_name: english_name(x.font_name),
196
+ full_name: file.full_name,
206
197
  family_name: family_name,
207
- type: english_name(@family.type(x)),
198
+ type: @family.type(file),
208
199
  }.merge(override_font_props(path, family_name))
209
200
  end
210
201
 
211
- def english_name(name)
212
- visible_characters(find_english(name))
213
- end
214
-
215
- def find_english(name)
216
- name.find { |x| microsoft_english?(x) } ||
217
- name.find { |x| mac_english?(x) } ||
218
- name.last
219
- end
220
-
221
- def microsoft_english?(string)
222
- string.platform_id == PLATFORM_MICROSOFT &&
223
- string.encoding_id == ENCODING_MS_UNICODE_BMP &&
224
- string.language_id == LANGUAGE_MS_ENGLISH_AMERICAN
225
- end
226
-
227
- def mac_english?(string)
228
- string.platform_id == PLATFORM_MACINTOSH &&
229
- string.encoding_id == ENCODING_MAC_ROMAN &&
230
- string.language_id == LANGUAGE_MAC_ENGLISH
231
- end
232
-
233
- def visible_characters(text)
234
- text.gsub(/[^[:print:]]/, "").to_s
235
- end
236
-
237
202
  def override_font_props(path, font_name)
238
203
  override = Formula.find_by_font_file(path)
239
204
  &.style_override(font_name)&.to_h || {}
@@ -1,3 +1,3 @@
1
1
  module Fontist
2
- VERSION = "1.16.0".freeze
2
+ VERSION = "1.17.1".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fontist
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.16.0
4
+ version: 1.17.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-07-29 00:00:00.000000000 Z
11
+ date: 2023-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: down
@@ -143,6 +143,9 @@ dependencies:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
145
  version: '0.3'
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: 0.3.4
146
149
  type: :runtime
147
150
  prerelease: false
148
151
  version_requirements: !ruby/object:Gem::Requirement
@@ -150,6 +153,9 @@ dependencies:
150
153
  - - "~>"
151
154
  - !ruby/object:Gem::Version
152
155
  version: '0.3'
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: 0.3.4
153
159
  - !ruby/object:Gem::Dependency
154
160
  name: socksify
155
161
  requirement: !ruby/object:Gem::Requirement
@@ -299,8 +305,10 @@ files:
299
305
  - lib/fontist/cache_cli.rb
300
306
  - lib/fontist/cli.rb
301
307
  - lib/fontist/cli/class_options.rb
308
+ - lib/fontist/collection_file.rb
302
309
  - lib/fontist/errors.rb
303
310
  - lib/fontist/font.rb
311
+ - lib/fontist/font_file.rb
304
312
  - lib/fontist/font_installer.rb
305
313
  - lib/fontist/font_path.rb
306
314
  - lib/fontist/fontconfig.rb