fontist 0.3.0 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/macosx.yml +1 -1
- data/.github/workflows/ubuntu.yml +1 -1
- data/.gitignore +4 -2
- data/README.md +91 -5
- data/lib/fontist.rb +26 -12
- data/lib/fontist/errors.rb +3 -1
- data/lib/fontist/font.rb +78 -0
- data/lib/fontist/font_formula.rb +123 -0
- data/lib/fontist/formula.rb +90 -0
- data/lib/fontist/formulas.rb +10 -3
- data/lib/fontist/formulas/andale_font.rb +80 -0
- data/lib/fontist/formulas/arial_black_font.rb +79 -0
- data/lib/fontist/formulas/cleartype_fonts.rb +227 -0
- data/lib/fontist/formulas/comic_font.rb +78 -0
- data/lib/fontist/formulas/courier_font.rb +81 -0
- data/lib/fontist/formulas/euphemia_font.rb +85 -0
- data/lib/fontist/formulas/georgia_font.rb +80 -0
- data/lib/fontist/formulas/impact_font.rb +78 -0
- data/lib/fontist/formulas/montserrat_font.rb +132 -0
- data/lib/fontist/formulas/ms_truetype_fonts.rb +125 -0
- data/lib/fontist/formulas/open_sans_fonts.rb +263 -0
- data/lib/fontist/formulas/overpass_font.rb +73 -0
- data/lib/fontist/formulas/source_fonts.rb +109 -0
- data/lib/fontist/formulas/stix_fonts.rb +108 -0
- data/lib/fontist/formulas/tahoma_font.rb +147 -0
- data/lib/fontist/formulas/webding_font.rb +78 -0
- data/lib/fontist/registry.rb +42 -0
- data/lib/fontist/{data/source.yml → system.yml} +5 -6
- data/lib/fontist/system_font.rb +27 -11
- data/lib/fontist/utils.rb +9 -0
- data/lib/fontist/utils/downloader.rb +75 -0
- data/lib/fontist/utils/dsl.rb +77 -0
- data/lib/fontist/utils/exe_extractor.rb +72 -0
- data/lib/fontist/utils/zip_extractor.rb +38 -0
- data/lib/fontist/version.rb +1 -1
- data/spec/fontist/font_formula_spec.rb +67 -0
- data/spec/fontist/font_spec.rb +87 -0
- data/spec/fontist/formula_spec.rb +67 -0
- data/spec/fontist/formulas/andale_font_spec.rb +29 -0
- data/spec/fontist/formulas/arial_black_font_spec.rb +29 -0
- data/spec/fontist/formulas/cleartype_fonts_spec.rb +38 -0
- data/spec/fontist/formulas/comic_font_spec.rb +29 -0
- data/spec/fontist/formulas/courier_font_spec.rb +29 -0
- data/spec/fontist/formulas/euphemia_font_spec.rb +29 -0
- data/spec/fontist/formulas/georgia_font_spec.rb +29 -0
- data/spec/fontist/formulas/impact_font_spec.rb +29 -0
- data/spec/fontist/formulas/montserrat_font_spec.rb +29 -0
- data/spec/fontist/formulas/ms_truetype_fonts_spec.rb +29 -0
- data/spec/fontist/formulas/open_sans_fonts_spec.rb +29 -0
- data/spec/fontist/formulas/overpass_font_spec.rb +29 -0
- data/spec/fontist/formulas/source_fonts_spec.rb +31 -0
- data/spec/fontist/formulas/stix_fonts_spec.rb +29 -0
- data/spec/fontist/formulas/tahoma_font_spec.rb +29 -0
- data/spec/fontist/formulas/webding_font_spec.rb +29 -0
- data/spec/fontist/registry_spec.rb +47 -0
- data/spec/fontist/system_font_spec.rb +17 -1
- data/spec/fontist/{downloader_spec.rb → utils/downloader_spec.rb} +6 -5
- data/spec/spec_helper.rb +4 -2
- data/spec/support/fontist_helper.rb +4 -2
- metadata +50 -20
- data/lib/fontist/data/formulas/ms_vista.yml +0 -39
- data/lib/fontist/data/formulas/source_font.yml +0 -51
- data/lib/fontist/downloader.rb +0 -70
- data/lib/fontist/finder.rb +0 -47
- data/lib/fontist/formulas/base.rb +0 -25
- data/lib/fontist/formulas/ms_vista.rb +0 -74
- data/lib/fontist/formulas/source_font.rb +0 -48
- data/lib/fontist/installer.rb +0 -47
- data/lib/fontist/source.rb +0 -58
- data/spec/fontist/finder_spec.rb +0 -41
- data/spec/fontist/formulas/ms_vista_spec.rb +0 -27
- data/spec/fontist/formulas/source_font_spec.rb +0 -18
- data/spec/fontist/installer_spec.rb +0 -48
- data/spec/fontist/source_spec.rb +0 -24
@@ -1,51 +0,0 @@
|
|
1
|
-
source_font:
|
2
|
-
agreement: ""
|
3
|
-
|
4
|
-
fonts:
|
5
|
-
- SourceCodePro-Black.ttf
|
6
|
-
- SourceCodePro-BlackIt.ttf
|
7
|
-
- SourceCodePro-Bold.ttf
|
8
|
-
- SourceCodePro-BoldIt.ttf
|
9
|
-
- SourceCodePro-ExtraLight.ttf
|
10
|
-
- SourceCodePro-ExtraLightIt.ttf
|
11
|
-
- SourceCodePro-It.ttf
|
12
|
-
- SourceCodePro-Light.ttf
|
13
|
-
- SourceCodePro-LightIt.ttf
|
14
|
-
- SourceCodePro-Medium.ttf
|
15
|
-
- SourceCodePro-MediumIt.ttf
|
16
|
-
- SourceCodePro-Regular.ttf
|
17
|
-
- SourceCodePro-Semibold
|
18
|
-
- SourceCodePro-SemiboldIt.ttf
|
19
|
-
- SourceSansPro-Black.ttf
|
20
|
-
- SourceSansPro-BlackIt.ttf
|
21
|
-
- SourceSansPro-Bold.ttf
|
22
|
-
- SourceSansPro-BoldIt.ttf
|
23
|
-
- SourceSansPro-ExtraLight.ttf
|
24
|
-
- SourceSansPro-ExtraLightIt.ttf
|
25
|
-
- SourceSansPro-It.ttf
|
26
|
-
- SourceSansPro-Light.ttf
|
27
|
-
- SourceSansPro-LightIt.ttf
|
28
|
-
- SourceSansPro-Medium.ttf
|
29
|
-
- SourceSansPro-MediumIt.ttf
|
30
|
-
- SourceSansPro-Regular.ttf
|
31
|
-
- SourceSansPro-Semibold.ttf
|
32
|
-
- SourceSansPro-SemiboldIt.ttf
|
33
|
-
- SourceSerifPro-Black.ttf
|
34
|
-
- SourceSerifPro-BlackIt.ttf
|
35
|
-
- SourceSerifPro-Bold.ttf
|
36
|
-
- SourceSerifPro-BoldIt.ttf
|
37
|
-
- SourceSerifPro-ExtraLight.ttf
|
38
|
-
- SourceSerifPro-ExtraLightIt.ttf
|
39
|
-
- SourceSerifPro-It.ttf
|
40
|
-
- SourceSerifPro-Light.ttf
|
41
|
-
- SourceSerifPro-LightIt.ttf
|
42
|
-
- SourceSerifPro-Medium.ttf
|
43
|
-
- SourceSerifPro-MediumIt.ttf
|
44
|
-
- SourceSerifPro-Regular.ttf
|
45
|
-
- SourceSerifPro-Semibold.ttf
|
46
|
-
- SourceSerifPro-SemiboldIt.ttf
|
47
|
-
|
48
|
-
file_size: "101440249"
|
49
|
-
sha: "0107b5d4ba305cb4dff2ba19138407aa2153632a2c41592f74d20cd0d0261bfd"
|
50
|
-
urls:
|
51
|
-
- https://github.com/fontist/source-fonts/releases/download/v1.0/source-fonts-1.0.zip
|
data/lib/fontist/downloader.rb
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
require "down"
|
2
|
-
require "digest"
|
3
|
-
|
4
|
-
module Fontist
|
5
|
-
class Downloader
|
6
|
-
def initialize(file, file_size: nil, sha: nil, progress: nil)
|
7
|
-
@sha = sha
|
8
|
-
@file = file
|
9
|
-
@progress = progress
|
10
|
-
@file_size = file_size || default_file_size
|
11
|
-
end
|
12
|
-
|
13
|
-
def download
|
14
|
-
file = download_file
|
15
|
-
verify_file_checksum(file) || raise_invalid_file
|
16
|
-
end
|
17
|
-
|
18
|
-
def verify_file_checksum(file)
|
19
|
-
file if Digest::SHA256.file(file) === sha
|
20
|
-
end
|
21
|
-
|
22
|
-
def raise_invalid_file
|
23
|
-
raise(Fontist::Errors::TemparedFileError)
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.download(file, options = {})
|
27
|
-
new(file, options).download
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
attr_reader :file, :sha, :file_size
|
33
|
-
|
34
|
-
def default_file_size
|
35
|
-
5 * byte_to_megabyte
|
36
|
-
end
|
37
|
-
|
38
|
-
def byte_to_megabyte
|
39
|
-
@byte_to_megabyte ||= 1024 * 1024
|
40
|
-
end
|
41
|
-
|
42
|
-
def download_path
|
43
|
-
options[:download_path] || Fontist.root_path.join("tmp")
|
44
|
-
end
|
45
|
-
|
46
|
-
def download_file
|
47
|
-
bar = ProgressBar.new(file_size / byte_to_megabyte)
|
48
|
-
|
49
|
-
Down.download(
|
50
|
-
@file,
|
51
|
-
progress_proc: -> (progress) {
|
52
|
-
bar.increment(progress / byte_to_megabyte) if @progress === true
|
53
|
-
}
|
54
|
-
)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
class ProgressBar
|
59
|
-
def initialize(total)
|
60
|
-
@counter = 1
|
61
|
-
@total = total
|
62
|
-
end
|
63
|
-
|
64
|
-
def increment(progress)
|
65
|
-
complete = sprintf("%#.2f%%", ((@counter.to_f / @total.to_f) * 100))
|
66
|
-
print "\r\e[0KDownloads: #{@counter}MB/#{@total}MB (#{complete})"
|
67
|
-
@counter = progress
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
data/lib/fontist/finder.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
module Fontist
|
2
|
-
class Finder
|
3
|
-
def initialize(name)
|
4
|
-
@name = name
|
5
|
-
end
|
6
|
-
|
7
|
-
def self.find(name)
|
8
|
-
new(name).find
|
9
|
-
end
|
10
|
-
|
11
|
-
def find
|
12
|
-
find_system_font || downloadable_font || raise_invalid_error
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
|
17
|
-
attr_reader :name
|
18
|
-
|
19
|
-
def find_system_font
|
20
|
-
Fontist::SystemFont.find(name)
|
21
|
-
end
|
22
|
-
|
23
|
-
def remote_source
|
24
|
-
Fontist::Source.formulas.to_h.select do |key, value|
|
25
|
-
!value.fonts.grep(/#{name}/i).empty?
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def downloadable_font
|
30
|
-
unless remote_source.empty?
|
31
|
-
raise(
|
32
|
-
Fontist::Errors::MissingFontError,
|
33
|
-
"Fonts are missing, please run" \
|
34
|
-
"Fontist::Installer.download(name, confirmation: 'yes') to " \
|
35
|
-
"download these fonts"
|
36
|
-
)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def raise_invalid_error
|
41
|
-
raise(
|
42
|
-
Fontist::Errors::NonSupportedFontError,
|
43
|
-
"Could not find the #{name} font in any of the supported downlodable"
|
44
|
-
)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
module Fontist
|
2
|
-
module Formulas
|
3
|
-
class Base
|
4
|
-
def initialize(font_name, confirmation:, **options)
|
5
|
-
@font_name = font_name
|
6
|
-
@confirmation = confirmation || "no"
|
7
|
-
@force_download = options.fetch(:force_download, false)
|
8
|
-
@fonts_path = options.fetch(:fonts_path, Fontist.fonts_path)
|
9
|
-
|
10
|
-
check_user_license_agreement
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.fetch_font(font_name, confirmation: nil, **options)
|
14
|
-
new(font_name, options.merge(confirmation: confirmation)).fetch
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
attr_reader :font_name, :confirmation, :fonts_path, :force_download
|
20
|
-
|
21
|
-
def check_user_license_agreement
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,74 +0,0 @@
|
|
1
|
-
require "fontist/downloader"
|
2
|
-
|
3
|
-
module Fontist
|
4
|
-
module Formulas
|
5
|
-
class MsVista < Base
|
6
|
-
def fetch
|
7
|
-
fonts = extract_ppviewer_fonts
|
8
|
-
paths = fonts.grep(/#{font_name}/i)
|
9
|
-
paths.empty? ? nil : paths
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def check_user_license_agreement
|
15
|
-
unless source.agreement === confirmation
|
16
|
-
raise(Fontist::Errors::LicensingError)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def decompressor
|
21
|
-
@decompressor ||= (
|
22
|
-
require "libmspack"
|
23
|
-
LibMsPack::CabDecompressor.new
|
24
|
-
)
|
25
|
-
end
|
26
|
-
|
27
|
-
def extract_ppviewer_fonts
|
28
|
-
Array.new.tap do |fonts|
|
29
|
-
cabbed_fonts.each do |font|
|
30
|
-
font_path = fonts_path.join(font.filename).to_s
|
31
|
-
decompressor.extract(font, font_path)
|
32
|
-
|
33
|
-
fonts.push(font_path)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def extract_ppviewer_cab_file
|
39
|
-
if !File.exists?(ppviewer_cab) || force_download
|
40
|
-
exe_file = decompressor.search(download_exe_file.path)
|
41
|
-
decompressor.extract(exe_file.files.next, ppviewer_cab)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def cabbed_fonts
|
46
|
-
extract_ppviewer_cab_file
|
47
|
-
grep_cabbed_fonts(decompressor.search(ppviewer_cab).files) || []
|
48
|
-
end
|
49
|
-
|
50
|
-
def grep_cabbed_fonts(file)
|
51
|
-
Array.new.tap do |fonts|
|
52
|
-
while file
|
53
|
-
fonts.push(file) if file.filename.match(/.tt|.TT/)
|
54
|
-
file = file.next
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def source
|
60
|
-
@source ||= Fontist::Source.formulas.msvista
|
61
|
-
end
|
62
|
-
|
63
|
-
def download_exe_file
|
64
|
-
Fontist::Downloader.download(
|
65
|
-
source.urls.first, file_size: source.file_size.to_i, sha: source.sha
|
66
|
-
)
|
67
|
-
end
|
68
|
-
|
69
|
-
def ppviewer_cab
|
70
|
-
@ppviewer_cab ||= Fontist.assets_path.join("ppviewer.cab").to_s
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
require "zip"
|
2
|
-
|
3
|
-
module Fontist
|
4
|
-
module Formulas
|
5
|
-
class SourceFont < Formulas::Base
|
6
|
-
def fetch
|
7
|
-
paths = extract_fonts.grep(/#{font_name}/i)
|
8
|
-
paths.empty? ? nil : paths
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def source
|
14
|
-
@source ||= Fontist::Source.formulas.source_font
|
15
|
-
end
|
16
|
-
|
17
|
-
def extract_fonts
|
18
|
-
zip_file = download_file
|
19
|
-
unzip_fonts(zip_file)
|
20
|
-
end
|
21
|
-
|
22
|
-
def unzip_fonts(file)
|
23
|
-
Zip.on_exists_proc = true
|
24
|
-
|
25
|
-
Array.new.tap do |fonts|
|
26
|
-
Zip::File.open(file) do |zip_file|
|
27
|
-
zip_file.glob("fonts/*.ttf").each do |entry|
|
28
|
-
filename = entry.name.gsub("fonts/", "")
|
29
|
-
|
30
|
-
if filename
|
31
|
-
font_path = fonts_path.join(filename)
|
32
|
-
fonts.push(font_path.to_s)
|
33
|
-
|
34
|
-
entry.extract(font_path)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def download_file
|
42
|
-
Fontist::Downloader.download(
|
43
|
-
source.urls.first, file_size: source.file_size.to_i, sha: source.sha
|
44
|
-
)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
data/lib/fontist/installer.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
module Fontist
|
2
|
-
class Installer
|
3
|
-
def initialize(font_name:, confirmation:, **options)
|
4
|
-
@font_name = font_name
|
5
|
-
@confirmation = confirmation.downcase
|
6
|
-
@options = options
|
7
|
-
end
|
8
|
-
|
9
|
-
def download
|
10
|
-
find_system_font || download_font || raise(
|
11
|
-
Fontist::Errors::NonSupportedFontError
|
12
|
-
)
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.download(font_name, confirmation:)
|
16
|
-
new(font_name: font_name, confirmation: confirmation).download
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
attr_reader :font_name, :confirmation, :options
|
22
|
-
|
23
|
-
def downloaders
|
24
|
-
{
|
25
|
-
msvista: Fontist::Formulas::MsVista,
|
26
|
-
source_front: Fontist::Formulas::SourceFont,
|
27
|
-
}
|
28
|
-
end
|
29
|
-
|
30
|
-
def find_system_font
|
31
|
-
Fontist::SystemFont.find(font_name)
|
32
|
-
end
|
33
|
-
|
34
|
-
def download_font
|
35
|
-
if !font_sources.empty?
|
36
|
-
downloader = downloaders[font_sources.first]
|
37
|
-
downloader.fetch_font(font_name, confirmation: confirmation)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def font_sources
|
42
|
-
@font_sources ||= Fontist::Source.formulas.to_h.select do |key, value|
|
43
|
-
!value.fonts.grep(/#{font_name}/i).empty?
|
44
|
-
end.keys
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
data/lib/fontist/source.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
require "yaml"
|
2
|
-
require "json"
|
3
|
-
require "ostruct"
|
4
|
-
|
5
|
-
module Fontist
|
6
|
-
class Source
|
7
|
-
def self.all
|
8
|
-
new.all
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.formulas
|
12
|
-
new.formulas
|
13
|
-
end
|
14
|
-
|
15
|
-
def all
|
16
|
-
source_data
|
17
|
-
end
|
18
|
-
|
19
|
-
def formulas
|
20
|
-
formulas_data
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def source_data
|
26
|
-
@source_data ||= parse_to_object(yaml_data)
|
27
|
-
end
|
28
|
-
|
29
|
-
def parse_to_object(data)
|
30
|
-
JSON.parse(data.to_json, object_class: OpenStruct)
|
31
|
-
end
|
32
|
-
|
33
|
-
def formulas_data
|
34
|
-
@formulas_data ||= parse_to_object(load_formulas)
|
35
|
-
end
|
36
|
-
|
37
|
-
def load_formulas
|
38
|
-
Hash.new.tap do |formulas|
|
39
|
-
source_data.remote.formulas.map do |formula_file|
|
40
|
-
formula_data = yaml_data(formula_file)
|
41
|
-
|
42
|
-
if formula_data
|
43
|
-
key = formula_data.keys.first
|
44
|
-
formulas[key] = formula_data[key]
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def yaml_file(file)
|
51
|
-
Fontist.data_path.join(file)
|
52
|
-
end
|
53
|
-
|
54
|
-
def yaml_data(file_name = "source.yml")
|
55
|
-
YAML.load(File.open(yaml_file(file_name)))
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
data/spec/fontist/finder_spec.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe Fontist::Finder do
|
4
|
-
describe ".find" do
|
5
|
-
context "with valid font name" do
|
6
|
-
it "returns the fonts path" do
|
7
|
-
name = "DejaVuSerif.ttf"
|
8
|
-
stub_system_font_finder_to_fixture(name)
|
9
|
-
dejavu_ttf = Fontist::Finder.find(name)
|
10
|
-
|
11
|
-
expect(dejavu_ttf.first).to include(name)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
context "with downloadable ms vista font" do
|
16
|
-
it "returns missing font error" do
|
17
|
-
name = "CALIBRI.TTF"
|
18
|
-
allow(Fontist::SystemFont).to receive(:find).and_return(nil)
|
19
|
-
|
20
|
-
expect {
|
21
|
-
Fontist::Finder.find(name)
|
22
|
-
}.to raise_error(Fontist::Errors::MissingFontError)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
context "with invalid font name" do
|
27
|
-
it "raise an missing font error" do
|
28
|
-
font_name = "InvalidFont.ttf"
|
29
|
-
|
30
|
-
expect {
|
31
|
-
Fontist::Finder.find(font_name)
|
32
|
-
}.to raise_error(Fontist::Errors::NonSupportedFontError)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def stub_system_font_finder_to_fixture(name)
|
38
|
-
allow(Fontist::SystemFont).to receive(:find).
|
39
|
-
and_return(["spec/fixtures/fonts/#{name}"])
|
40
|
-
end
|
41
|
-
end
|