fontisan 0.2.17 → 0.2.23
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 +6 -0
- data/.rubocop_todo.yml +86 -86
- data/CHANGELOG.md +12 -2
- data/README.adoc +53 -1
- data/docs/.vitepress/config.ts +68 -8
- data/docs/.vitepress/theme/style.css +570 -272
- data/docs/CONVERSION_GUIDE.adoc +31 -8
- data/docs/EXTRACT_TTC_MIGRATION.md +1 -1
- data/docs/WOFF_WOFF2_FORMATS.adoc +53 -0
- data/docs/api/conversion-options.md +37 -14
- data/docs/cli/audit.md +337 -0
- data/docs/cli/convert.md +20 -1
- data/docs/cli/index.md +31 -0
- data/docs/guide/color.md +1 -1
- data/docs/guide/conversion/options.md +32 -3
- data/docs/guide/conversion/ttf-otf.md +1 -1
- data/docs/guide/conversion/type1.md +1 -1
- data/docs/guide/conversion/web.md +91 -32
- data/docs/guide/conversion.md +6 -5
- data/docs/guide/formats/woff.md +35 -11
- data/docs/guide/index.md +2 -2
- data/docs/guide/migrations/extract-ttc.md +1 -1
- data/docs/guide/quick-start.md +4 -4
- data/docs/guide/type1.md +4 -4
- data/docs/guide/woff.md +19 -17
- data/docs/index.md +2 -0
- data/docs/lychee.toml +5 -1
- data/docs/package.json +1 -1
- data/docs/public/robots.txt +4 -0
- data/docs/scripts/post-build.mjs +81 -0
- data/lib/fontisan/base_collection.rb +23 -9
- data/lib/fontisan/binary/structures.rb +0 -2
- data/lib/fontisan/binary.rb +11 -0
- data/lib/fontisan/cldr/aggregator.rb +33 -0
- data/lib/fontisan/cldr/cache_manager.rb +110 -0
- data/lib/fontisan/cldr/config.rb +59 -0
- data/lib/fontisan/cldr/download_error.rb +9 -0
- data/lib/fontisan/cldr/downloader.rb +79 -0
- data/lib/fontisan/cldr/error.rb +8 -0
- data/lib/fontisan/cldr/index.rb +64 -0
- data/lib/fontisan/cldr/index_builder.rb +72 -0
- data/lib/fontisan/cldr/unicode_set_parser.rb +189 -0
- data/lib/fontisan/cldr/unknown_version_error.rb +9 -0
- data/lib/fontisan/cldr/version_resolver.rb +91 -0
- data/lib/fontisan/cldr.rb +23 -0
- data/lib/fontisan/cli/cldr_cli.rb +85 -0
- data/lib/fontisan/cli.rb +31 -2
- data/lib/fontisan/collection/builder.rb +0 -4
- data/lib/fontisan/collection/dfont_builder.rb +0 -4
- data/lib/fontisan/collection/shared_logic.rb +0 -2
- data/lib/fontisan/collection/writer.rb +0 -3
- data/lib/fontisan/collection.rb +15 -0
- data/lib/fontisan/commands/base_command.rb +0 -3
- data/lib/fontisan/commands/convert_command.rb +25 -20
- data/lib/fontisan/commands/dump_table_command.rb +0 -3
- data/lib/fontisan/commands/export_command.rb +0 -4
- data/lib/fontisan/commands/features_command.rb +0 -3
- data/lib/fontisan/commands/instance_command.rb +0 -5
- data/lib/fontisan/commands/ls_command.rb +0 -6
- data/lib/fontisan/commands/optical_size_command.rb +0 -3
- data/lib/fontisan/commands/pack_command.rb +0 -5
- data/lib/fontisan/commands/scripts_command.rb +0 -2
- data/lib/fontisan/commands/subset_command.rb +0 -3
- data/lib/fontisan/commands/unicode_command.rb +0 -3
- data/lib/fontisan/commands/unpack_command.rb +0 -7
- data/lib/fontisan/commands/validate_command.rb +0 -8
- data/lib/fontisan/commands/variable_command.rb +0 -3
- data/lib/fontisan/commands.rb +26 -0
- data/lib/fontisan/config/cldr.yml +22 -0
- data/lib/fontisan/config/conversion_matrix.yml +38 -0
- data/lib/fontisan/constants.rb +19 -0
- data/lib/fontisan/conversion_options.rb +30 -19
- data/lib/fontisan/converters/cff_table_builder.rb +0 -3
- data/lib/fontisan/converters/collection_converter.rb +0 -8
- data/lib/fontisan/converters/conversion_strategy.rb +161 -46
- data/lib/fontisan/converters/format_converter.rb +143 -32
- data/lib/fontisan/converters/glyf_table_builder.rb +0 -2
- data/lib/fontisan/converters/outline_converter.rb +0 -19
- data/lib/fontisan/converters/outline_extraction.rb +0 -5
- data/lib/fontisan/converters/outline_optimizer.rb +0 -5
- data/lib/fontisan/converters/svg_generator.rb +0 -4
- data/lib/fontisan/converters/table_copier.rb +0 -2
- data/lib/fontisan/converters/type1_converter.rb +0 -11
- data/lib/fontisan/converters/woff2_encoder.rb +49 -20
- data/lib/fontisan/converters/woff_writer.rb +211 -282
- data/lib/fontisan/converters.rb +21 -0
- data/lib/fontisan/dfont_collection.rb +29 -10
- data/lib/fontisan/export/exporter.rb +0 -6
- data/lib/fontisan/export/transformers/font_to_ttx.rb +0 -9
- data/lib/fontisan/export/transformers/head_transformer.rb +0 -2
- data/lib/fontisan/export/transformers/hhea_transformer.rb +0 -2
- data/lib/fontisan/export/transformers/maxp_transformer.rb +0 -2
- data/lib/fontisan/export/transformers/name_transformer.rb +0 -2
- data/lib/fontisan/export/transformers/os2_transformer.rb +0 -2
- data/lib/fontisan/export/transformers/post_transformer.rb +0 -2
- data/lib/fontisan/export/transformers.rb +17 -0
- data/lib/fontisan/export.rb +13 -0
- data/lib/fontisan/font_loader.rb +14 -19
- data/lib/fontisan/font_writer.rb +0 -1
- data/lib/fontisan/formatters.rb +9 -0
- data/lib/fontisan/hints/hint_converter.rb +0 -1
- data/lib/fontisan/hints/postscript_hint_applier.rb +0 -9
- data/lib/fontisan/hints/postscript_hint_extractor.rb +0 -2
- data/lib/fontisan/hints/truetype_hint_extractor.rb +0 -2
- data/lib/fontisan/hints.rb +19 -0
- data/lib/fontisan/metrics_calculator.rb +0 -2
- data/lib/fontisan/models/all_scripts_features_info.rb +0 -1
- data/lib/fontisan/models/cldr/language_coverage.rb +31 -0
- data/lib/fontisan/models/cldr.rb +12 -0
- data/lib/fontisan/models/collection_brief_info.rb +0 -1
- data/lib/fontisan/models/collection_info.rb +0 -2
- data/lib/fontisan/models/collection_list_info.rb +0 -1
- data/lib/fontisan/models/collection_validation_report.rb +0 -2
- data/lib/fontisan/models/color_glyph.rb +0 -1
- data/lib/fontisan/models/font_report.rb +0 -1
- data/lib/fontisan/models/ttx/tables.rb +21 -0
- data/lib/fontisan/models/ttx/ttfont.rb +0 -8
- data/lib/fontisan/models/ttx.rb +14 -0
- data/lib/fontisan/models.rb +47 -0
- data/lib/fontisan/open_type_collection.rb +6 -5
- data/lib/fontisan/open_type_font.rb +8 -2
- data/lib/fontisan/open_type_font_extensions.rb +9 -9
- data/lib/fontisan/optimizers/pattern_analyzer.rb +0 -1
- data/lib/fontisan/optimizers.rb +14 -0
- data/lib/fontisan/outline_extractor.rb +0 -2
- data/lib/fontisan/parsers/dfont_parser.rb +0 -1
- data/lib/fontisan/parsers.rb +10 -0
- data/lib/fontisan/pipeline/format_detector.rb +29 -102
- data/lib/fontisan/pipeline/output_writer.rb +11 -9
- data/lib/fontisan/pipeline/strategies/instance_strategy.rb +0 -4
- data/lib/fontisan/pipeline/strategies/named_strategy.rb +0 -4
- data/lib/fontisan/pipeline/strategies/preserve_strategy.rb +0 -2
- data/lib/fontisan/pipeline/strategies.rb +16 -0
- data/lib/fontisan/pipeline/transformation_pipeline.rb +0 -7
- data/lib/fontisan/pipeline/variation_resolver.rb +0 -7
- data/lib/fontisan/pipeline.rb +14 -0
- data/lib/fontisan/sfnt_font.rb +29 -14
- data/lib/fontisan/sfnt_table.rb +0 -4
- data/lib/fontisan/subset/builder.rb +0 -6
- data/lib/fontisan/subset.rb +13 -0
- data/lib/fontisan/svg/font_generator.rb +0 -4
- data/lib/fontisan/svg/glyph_generator.rb +0 -2
- data/lib/fontisan/svg.rb +12 -0
- data/lib/fontisan/tables/cbdt.rb +0 -1
- data/lib/fontisan/tables/cblc.rb +0 -1
- data/lib/fontisan/tables/cff/charset.rb +0 -1
- data/lib/fontisan/tables/cff/charstring.rb +0 -1
- data/lib/fontisan/tables/cff/charstring_rebuilder.rb +0 -4
- data/lib/fontisan/tables/cff/charstrings_index.rb +0 -3
- data/lib/fontisan/tables/cff/dict.rb +0 -1
- data/lib/fontisan/tables/cff/encoding.rb +0 -1
- data/lib/fontisan/tables/cff/header.rb +0 -2
- data/lib/fontisan/tables/cff/hint_operation_injector.rb +0 -2
- data/lib/fontisan/tables/cff/index.rb +0 -1
- data/lib/fontisan/tables/cff/private_dict.rb +0 -2
- data/lib/fontisan/tables/cff/private_dict_writer.rb +0 -2
- data/lib/fontisan/tables/cff/table_builder.rb +0 -6
- data/lib/fontisan/tables/cff/top_dict.rb +0 -2
- data/lib/fontisan/tables/cff.rb +23 -15
- data/lib/fontisan/tables/cff2/charstring_parser.rb +0 -2
- data/lib/fontisan/tables/cff2/table_builder.rb +0 -11
- data/lib/fontisan/tables/cff2/table_reader.rb +0 -2
- data/lib/fontisan/tables/cff2.rb +13 -14
- data/lib/fontisan/tables/cmap.rb +24 -2
- data/lib/fontisan/tables/cmap_table.rb +0 -3
- data/lib/fontisan/tables/colr.rb +0 -1
- data/lib/fontisan/tables/cpal.rb +0 -1
- data/lib/fontisan/tables/cvar.rb +0 -2
- data/lib/fontisan/tables/fvar.rb +0 -1
- data/lib/fontisan/tables/glyf/compound_glyph_resolver.rb +0 -2
- data/lib/fontisan/tables/glyf/glyph_builder.rb +0 -3
- data/lib/fontisan/tables/glyf.rb +0 -6
- data/lib/fontisan/tables/glyf_table.rb +0 -3
- data/lib/fontisan/tables/gpos.rb +0 -2
- data/lib/fontisan/tables/gsub.rb +0 -2
- data/lib/fontisan/tables/gvar.rb +0 -2
- data/lib/fontisan/tables/head.rb +0 -2
- data/lib/fontisan/tables/head_table.rb +0 -3
- data/lib/fontisan/tables/hhea.rb +0 -2
- data/lib/fontisan/tables/hhea_table.rb +0 -3
- data/lib/fontisan/tables/hmtx.rb +0 -2
- data/lib/fontisan/tables/hmtx_table.rb +0 -3
- data/lib/fontisan/tables/hvar.rb +0 -3
- data/lib/fontisan/tables/loca.rb +0 -2
- data/lib/fontisan/tables/loca_table.rb +0 -3
- data/lib/fontisan/tables/maxp.rb +0 -2
- data/lib/fontisan/tables/maxp_table.rb +0 -3
- data/lib/fontisan/tables/mvar.rb +0 -3
- data/lib/fontisan/tables/name.rb +0 -2
- data/lib/fontisan/tables/name_table.rb +0 -3
- data/lib/fontisan/tables/os2_table.rb +0 -3
- data/lib/fontisan/tables/post_table.rb +0 -3
- data/lib/fontisan/tables/sbix.rb +0 -1
- data/lib/fontisan/tables/svg.rb +0 -1
- data/lib/fontisan/tables/variation_common.rb +0 -1
- data/lib/fontisan/tables/vvar.rb +0 -3
- data/lib/fontisan/tables.rb +55 -0
- data/lib/fontisan/true_type_collection.rb +6 -14
- data/lib/fontisan/true_type_font.rb +8 -2
- data/lib/fontisan/true_type_font_extensions.rb +9 -9
- data/lib/fontisan/type1/afm_generator.rb +0 -4
- data/lib/fontisan/type1/conversion_options.rb +0 -2
- data/lib/fontisan/type1/encodings.rb +0 -2
- data/lib/fontisan/type1/generator.rb +0 -8
- data/lib/fontisan/type1/pfa_generator.rb +0 -3
- data/lib/fontisan/type1/pfb_generator.rb +0 -5
- data/lib/fontisan/type1/pfm_generator.rb +0 -4
- data/lib/fontisan/type1.rb +42 -69
- data/lib/fontisan/type1_font.rb +40 -11
- data/lib/fontisan/utilities/checksum_calculator.rb +0 -1
- data/lib/fontisan/utilities.rb +10 -0
- data/lib/fontisan/utils.rb +10 -0
- data/lib/fontisan/validation/collection_validator.rb +0 -2
- data/lib/fontisan/validation.rb +9 -0
- data/lib/fontisan/validators/basic_validator.rb +0 -2
- data/lib/fontisan/validators/font_book_validator.rb +0 -2
- data/lib/fontisan/validators/opentype_validator.rb +0 -2
- data/lib/fontisan/validators/profile_loader.rb +0 -5
- data/lib/fontisan/validators/validator.rb +0 -2
- data/lib/fontisan/validators/web_font_validator.rb +0 -2
- data/lib/fontisan/validators.rb +14 -0
- data/lib/fontisan/variable/delta_applicator.rb +0 -4
- data/lib/fontisan/variable/instancer.rb +0 -3
- data/lib/fontisan/variable/static_font_builder.rb +0 -3
- data/lib/fontisan/variable.rb +16 -0
- data/lib/fontisan/variation/blend_applier.rb +0 -2
- data/lib/fontisan/variation/cache.rb +0 -2
- data/lib/fontisan/variation/converter.rb +0 -3
- data/lib/fontisan/variation/data_extractor.rb +0 -2
- data/lib/fontisan/variation/delta_applier.rb +0 -5
- data/lib/fontisan/variation/inspector.rb +0 -1
- data/lib/fontisan/variation/instance_generator.rb +0 -6
- data/lib/fontisan/variation/instance_writer.rb +0 -5
- data/lib/fontisan/variation/metrics_adjuster.rb +0 -4
- data/lib/fontisan/variation/optimizer.rb +0 -3
- data/lib/fontisan/variation/parallel_generator.rb +0 -3
- data/lib/fontisan/variation/subsetter.rb +0 -4
- data/lib/fontisan/variation/tuple_variation_header.rb +0 -2
- data/lib/fontisan/variation/variable_svg_generator.rb +0 -3
- data/lib/fontisan/variation/variation_context.rb +0 -3
- data/lib/fontisan/variation/variation_preserver.rb +0 -3
- data/lib/fontisan/variation.rb +31 -0
- data/lib/fontisan/version.rb +1 -1
- data/lib/fontisan/woff2.rb +13 -0
- data/lib/fontisan/woff2_font.rb +31 -9
- data/lib/fontisan/woff_font.rb +31 -2
- data/lib/fontisan.rb +121 -196
- metadata +46 -2
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Autoload hub for the Fontisan::Variation namespace.
|
|
4
|
+
|
|
5
|
+
module Fontisan
|
|
6
|
+
module Variation
|
|
7
|
+
autoload :BlendApplier, "fontisan/variation/blend_applier"
|
|
8
|
+
autoload :Cache, "fontisan/variation/cache"
|
|
9
|
+
autoload :CacheKeyBuilder, "fontisan/variation/cache_key_builder"
|
|
10
|
+
autoload :Converter, "fontisan/variation/converter"
|
|
11
|
+
autoload :DataExtractor, "fontisan/variation/data_extractor"
|
|
12
|
+
autoload :DeltaApplier, "fontisan/variation/delta_applier"
|
|
13
|
+
autoload :DeltaParser, "fontisan/variation/delta_parser"
|
|
14
|
+
autoload :Inspector, "fontisan/variation/inspector"
|
|
15
|
+
autoload :InstanceGenerator, "fontisan/variation/instance_generator"
|
|
16
|
+
autoload :InstanceWriter, "fontisan/variation/instance_writer"
|
|
17
|
+
autoload :Interpolator, "fontisan/variation/interpolator"
|
|
18
|
+
autoload :MetricsAdjuster, "fontisan/variation/metrics_adjuster"
|
|
19
|
+
autoload :Optimizer, "fontisan/variation/optimizer"
|
|
20
|
+
autoload :ParallelGenerator, "fontisan/variation/parallel_generator"
|
|
21
|
+
autoload :RegionMatcher, "fontisan/variation/region_matcher"
|
|
22
|
+
autoload :Subsetter, "fontisan/variation/subsetter"
|
|
23
|
+
autoload :TableAccessor, "fontisan/variation/table_accessor"
|
|
24
|
+
autoload :ThreadSafeCache, "fontisan/variation/cache"
|
|
25
|
+
autoload :TupleVariationHeader, "fontisan/variation/tuple_variation_header"
|
|
26
|
+
autoload :Validator, "fontisan/variation/validator"
|
|
27
|
+
autoload :VariableSvgGenerator, "fontisan/variation/variable_svg_generator"
|
|
28
|
+
autoload :VariationContext, "fontisan/variation/variation_context"
|
|
29
|
+
autoload :VariationPreserver, "fontisan/variation/variation_preserver"
|
|
30
|
+
end
|
|
31
|
+
end
|
data/lib/fontisan/version.rb
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Autoload hub for the Fontisan::Woff2 namespace.
|
|
4
|
+
|
|
5
|
+
module Fontisan
|
|
6
|
+
module Woff2
|
|
7
|
+
autoload :Directory, "fontisan/woff2/directory"
|
|
8
|
+
autoload :GlyfTransformer, "fontisan/woff2/glyf_transformer"
|
|
9
|
+
autoload :HmtxTransformer, "fontisan/woff2/hmtx_transformer"
|
|
10
|
+
autoload :TableTransformer, "fontisan/woff2/table_transformer"
|
|
11
|
+
autoload :Woff2Header, "fontisan/woff2/header"
|
|
12
|
+
end
|
|
13
|
+
end
|
data/lib/fontisan/woff2_font.rb
CHANGED
|
@@ -3,15 +3,6 @@
|
|
|
3
3
|
require "bindata"
|
|
4
4
|
require "brotli"
|
|
5
5
|
require "stringio"
|
|
6
|
-
require_relative "constants"
|
|
7
|
-
require_relative "loading_modes"
|
|
8
|
-
require_relative "utilities/checksum_calculator"
|
|
9
|
-
require_relative "woff2/header"
|
|
10
|
-
require_relative "woff2/glyf_transformer"
|
|
11
|
-
require_relative "woff2/hmtx_transformer"
|
|
12
|
-
require_relative "true_type_font"
|
|
13
|
-
require_relative "open_type_font"
|
|
14
|
-
require_relative "error"
|
|
15
6
|
|
|
16
7
|
module Fontisan
|
|
17
8
|
# WOFF2 Table Directory Entry structure
|
|
@@ -82,6 +73,12 @@ module Fontisan
|
|
|
82
73
|
# puts font.header.flavor
|
|
83
74
|
# puts font.table_names
|
|
84
75
|
class Woff2Font
|
|
76
|
+
# High-level pipeline format identifier. Owned by the font class so the
|
|
77
|
+
# conversion pipeline can dispatch without case statements (OCP).
|
|
78
|
+
#
|
|
79
|
+
# @return [Symbol] :woff2
|
|
80
|
+
def format = :woff2
|
|
81
|
+
|
|
85
82
|
# Simple struct for storing file path
|
|
86
83
|
IOSource = Struct.new(:path)
|
|
87
84
|
|
|
@@ -145,6 +142,31 @@ module Fontisan
|
|
|
145
142
|
@table_entries.any? { |entry| entry.tag == tag }
|
|
146
143
|
end
|
|
147
144
|
|
|
145
|
+
# Whether this object represents a font collection rather than a single
|
|
146
|
+
# font. Each font class is the authority on this question.
|
|
147
|
+
#
|
|
148
|
+
# @return [Boolean]
|
|
149
|
+
def collection? = false
|
|
150
|
+
|
|
151
|
+
# Variation profile. WOFF2 wraps a single SFNT font; variation tables, if
|
|
152
|
+
# present on the wrapped font, are reported here.
|
|
153
|
+
#
|
|
154
|
+
# @return [Symbol] :static, :gvar, or :cff2
|
|
155
|
+
def variation_type
|
|
156
|
+
return :static unless has_table?("fvar")
|
|
157
|
+
return :gvar if has_table?("gvar")
|
|
158
|
+
return :cff2 if has_table?("CFF2")
|
|
159
|
+
|
|
160
|
+
:static
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# Outline representation, derived from the wrapped SFNT flavor.
|
|
164
|
+
#
|
|
165
|
+
# @return [Symbol] :truetype or :cff
|
|
166
|
+
def outline_type
|
|
167
|
+
truetype? ? :truetype : :cff
|
|
168
|
+
end
|
|
169
|
+
|
|
148
170
|
# Find table entry by tag
|
|
149
171
|
def find_table_entry(tag)
|
|
150
172
|
@table_entries.find { |entry| entry.tag == tag }
|
data/lib/fontisan/woff_font.rb
CHANGED
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
require "bindata"
|
|
4
4
|
require "zlib"
|
|
5
|
-
require_relative "constants"
|
|
6
|
-
require_relative "utilities/checksum_calculator"
|
|
7
5
|
|
|
8
6
|
module Fontisan
|
|
9
7
|
# WOFF Header structure
|
|
@@ -55,6 +53,12 @@ module Fontisan
|
|
|
55
53
|
# woff.to_ttf("output.ttf") # if TrueType flavored
|
|
56
54
|
# woff.to_otf("output.otf") # if CFF flavored
|
|
57
55
|
class WoffFont < BinData::Record
|
|
56
|
+
# High-level pipeline format identifier. Owned by the font class so the
|
|
57
|
+
# conversion pipeline can dispatch without case statements (OCP).
|
|
58
|
+
#
|
|
59
|
+
# @return [Symbol] :woff
|
|
60
|
+
def format = :woff
|
|
61
|
+
|
|
58
62
|
endian :big
|
|
59
63
|
|
|
60
64
|
woff_header :header
|
|
@@ -142,6 +146,31 @@ module Fontisan
|
|
|
142
146
|
end
|
|
143
147
|
end
|
|
144
148
|
|
|
149
|
+
# Whether this object represents a font collection rather than a single
|
|
150
|
+
# font. Each font class is the authority on this question.
|
|
151
|
+
#
|
|
152
|
+
# @return [Boolean]
|
|
153
|
+
def collection? = false
|
|
154
|
+
|
|
155
|
+
# Variation profile. WOFF wraps a single SFNT font; variation tables, if
|
|
156
|
+
# present on the wrapped font, are reported here.
|
|
157
|
+
#
|
|
158
|
+
# @return [Symbol] :static, :gvar, or :cff2
|
|
159
|
+
def variation_type
|
|
160
|
+
return :static unless has_table?("fvar")
|
|
161
|
+
return :gvar if has_table?("gvar")
|
|
162
|
+
return :cff2 if has_table?("CFF2")
|
|
163
|
+
|
|
164
|
+
:static
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Outline representation, derived from the wrapped SFNT flavor.
|
|
168
|
+
#
|
|
169
|
+
# @return [Symbol] :truetype or :cff
|
|
170
|
+
def outline_type
|
|
171
|
+
truetype? ? :truetype : :cff
|
|
172
|
+
end
|
|
173
|
+
|
|
145
174
|
# Check if font is TrueType flavored
|
|
146
175
|
#
|
|
147
176
|
# @return [Boolean] true if TrueType, false if CFF
|
data/lib/fontisan.rb
CHANGED
|
@@ -39,203 +39,93 @@ Lutaml::Model::Config.configure do |config|
|
|
|
39
39
|
config.xml_adapter_type = :nokogiri
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
-
# Core
|
|
43
|
-
require_relative "fontisan/version"
|
|
44
|
-
require_relative "fontisan/error"
|
|
45
|
-
require_relative "fontisan/constants"
|
|
46
|
-
|
|
47
|
-
# Binary structures and parsers
|
|
48
|
-
require_relative "fontisan/parsers/tag"
|
|
49
|
-
require_relative "fontisan/binary/base_record"
|
|
50
|
-
|
|
51
|
-
# Table parsers
|
|
52
|
-
require_relative "fontisan/tables/head"
|
|
53
|
-
require_relative "fontisan/tables/hhea"
|
|
54
|
-
require_relative "fontisan/tables/hmtx"
|
|
55
|
-
require_relative "fontisan/tables/maxp"
|
|
56
|
-
require_relative "fontisan/tables/loca"
|
|
57
|
-
require_relative "fontisan/tables/glyf"
|
|
58
|
-
require_relative "fontisan/tables/name"
|
|
59
|
-
require_relative "fontisan/tables/os2"
|
|
60
|
-
require_relative "fontisan/tables/post"
|
|
61
|
-
require_relative "fontisan/tables/cmap"
|
|
62
|
-
require_relative "fontisan/tables/fvar"
|
|
63
|
-
require_relative "fontisan/tables/variation_common"
|
|
64
|
-
require_relative "fontisan/tables/hvar"
|
|
65
|
-
require_relative "fontisan/tables/vvar"
|
|
66
|
-
require_relative "fontisan/tables/mvar"
|
|
67
|
-
require_relative "fontisan/tables/gvar"
|
|
68
|
-
require_relative "fontisan/tables/cvar"
|
|
69
|
-
require_relative "fontisan/tables/cff"
|
|
70
|
-
require_relative "fontisan/tables/layout_common"
|
|
71
|
-
require_relative "fontisan/tables/gsub"
|
|
72
|
-
require_relative "fontisan/tables/gpos"
|
|
73
|
-
require_relative "fontisan/tables/colr"
|
|
74
|
-
require_relative "fontisan/tables/cpal"
|
|
75
|
-
require_relative "fontisan/tables/svg"
|
|
76
|
-
require_relative "fontisan/tables/sbix"
|
|
77
|
-
require_relative "fontisan/tables/cblc"
|
|
78
|
-
require_relative "fontisan/tables/cbdt"
|
|
79
|
-
|
|
80
|
-
# Domain objects (BinData::Record)
|
|
81
|
-
require_relative "fontisan/true_type_font"
|
|
82
|
-
require_relative "fontisan/open_type_font"
|
|
83
|
-
require_relative "fontisan/true_type_collection"
|
|
84
|
-
require_relative "fontisan/open_type_collection"
|
|
85
|
-
require_relative "fontisan/woff_font"
|
|
86
|
-
require_relative "fontisan/woff2_font"
|
|
87
|
-
require_relative "fontisan/type1_font"
|
|
88
|
-
|
|
89
|
-
# Font extensions for table-based construction
|
|
90
|
-
require_relative "fontisan/true_type_font_extensions"
|
|
91
|
-
require_relative "fontisan/open_type_font_extensions"
|
|
92
|
-
|
|
93
|
-
# Font loading
|
|
94
|
-
require_relative "fontisan/font_loader"
|
|
95
|
-
|
|
96
|
-
# Utilities
|
|
97
|
-
require_relative "fontisan/metrics_calculator"
|
|
98
|
-
require_relative "fontisan/glyph_accessor"
|
|
99
|
-
require_relative "fontisan/outline_extractor"
|
|
100
|
-
require_relative "fontisan/utilities/checksum_calculator"
|
|
101
|
-
require_relative "fontisan/font_writer"
|
|
102
|
-
|
|
103
|
-
# Information models (Lutaml::Model)
|
|
104
|
-
require_relative "fontisan/models/bitmap_strike"
|
|
105
|
-
require_relative "fontisan/models/bitmap_glyph"
|
|
106
|
-
require_relative "fontisan/models/font_info"
|
|
107
|
-
require_relative "fontisan/models/table_info"
|
|
108
|
-
require_relative "fontisan/models/glyph_info"
|
|
109
|
-
require_relative "fontisan/models/glyph_outline"
|
|
110
|
-
require_relative "fontisan/models/unicode_mappings"
|
|
111
|
-
require_relative "fontisan/models/variable_font_info"
|
|
112
|
-
require_relative "fontisan/models/optical_size_info"
|
|
113
|
-
require_relative "fontisan/models/scripts_info"
|
|
114
|
-
require_relative "fontisan/models/features_info"
|
|
115
|
-
require_relative "fontisan/models/all_scripts_features_info"
|
|
116
|
-
require_relative "fontisan/models/validation_report"
|
|
117
|
-
require_relative "fontisan/models/font_report"
|
|
118
|
-
require_relative "fontisan/models/collection_validation_report"
|
|
119
|
-
require_relative "fontisan/models/font_export"
|
|
120
|
-
require_relative "fontisan/models/collection_font_summary"
|
|
121
|
-
require_relative "fontisan/models/collection_info"
|
|
122
|
-
require_relative "fontisan/models/collection_brief_info"
|
|
123
|
-
require_relative "fontisan/models/collection_list_info"
|
|
124
|
-
require_relative "fontisan/models/font_summary"
|
|
125
|
-
require_relative "fontisan/models/table_sharing_info"
|
|
126
|
-
require_relative "fontisan/models/color_glyph"
|
|
127
|
-
require_relative "fontisan/models/color_layer"
|
|
128
|
-
require_relative "fontisan/models/color_palette"
|
|
129
|
-
require_relative "fontisan/models/svg_glyph"
|
|
130
|
-
|
|
131
|
-
# Validators infrastructure (NEW - DSL-based framework from Week 2+)
|
|
132
|
-
require_relative "fontisan/validators/validator"
|
|
133
|
-
require_relative "fontisan/validators/basic_validator"
|
|
134
|
-
require_relative "fontisan/validators/font_book_validator"
|
|
135
|
-
require_relative "fontisan/validators/opentype_validator"
|
|
136
|
-
require_relative "fontisan/validators/web_font_validator"
|
|
137
|
-
require_relative "fontisan/validators/profile_loader"
|
|
138
|
-
|
|
139
|
-
# Export infrastructure
|
|
140
|
-
require_relative "fontisan/export/table_serializer"
|
|
141
|
-
require_relative "fontisan/export/ttx_generator"
|
|
142
|
-
require_relative "fontisan/export/ttx_parser"
|
|
143
|
-
require_relative "fontisan/export/exporter"
|
|
144
|
-
|
|
145
|
-
# Validation infrastructure (OLD - commented out for new DSL framework)
|
|
146
|
-
# Week 1 deleted these, Week 2-5 building new DSL-based framework
|
|
147
|
-
# require_relative "fontisan/validation/checks/base_check"
|
|
148
|
-
# require_relative "fontisan/validation/check_registry"
|
|
149
|
-
# require_relative "fontisan/validation/profile"
|
|
150
|
-
# require_relative "fontisan/validation/table_validator"
|
|
151
|
-
# require_relative "fontisan/validation/structure_validator"
|
|
152
|
-
# require_relative "fontisan/validation/consistency_validator"
|
|
153
|
-
# require_relative "fontisan/validation/checksum_validator"
|
|
154
|
-
# require_relative "fontisan/validation/validator"
|
|
155
|
-
|
|
156
|
-
# Subsetting infrastructure
|
|
157
|
-
require_relative "fontisan/subset/options"
|
|
158
|
-
require_relative "fontisan/subset/profile"
|
|
159
|
-
require_relative "fontisan/subset/glyph_mapping"
|
|
160
|
-
require_relative "fontisan/subset/table_subsetter"
|
|
161
|
-
require_relative "fontisan/subset/builder"
|
|
162
|
-
|
|
163
|
-
# Collection infrastructure
|
|
164
|
-
require_relative "fontisan/collection/table_analyzer"
|
|
165
|
-
require_relative "fontisan/collection/table_deduplicator"
|
|
166
|
-
require_relative "fontisan/collection/offset_calculator"
|
|
167
|
-
require_relative "fontisan/collection/writer"
|
|
168
|
-
require_relative "fontisan/collection/builder"
|
|
169
|
-
|
|
170
|
-
# Format conversion infrastructure
|
|
171
|
-
require_relative "fontisan/conversion_options"
|
|
172
|
-
require_relative "fontisan/converters/conversion_strategy"
|
|
173
|
-
require_relative "fontisan/converters/table_copier"
|
|
174
|
-
require_relative "fontisan/converters/outline_converter"
|
|
175
|
-
require_relative "fontisan/converters/format_converter"
|
|
176
|
-
|
|
177
|
-
# Variation infrastructure
|
|
178
|
-
require_relative "fontisan/variation/interpolator"
|
|
179
|
-
require_relative "fontisan/variation/region_matcher"
|
|
180
|
-
require_relative "fontisan/variation/data_extractor"
|
|
181
|
-
require_relative "fontisan/variation/instance_generator"
|
|
182
|
-
require_relative "fontisan/variation/metrics_adjuster"
|
|
183
|
-
require_relative "fontisan/variation/converter"
|
|
184
|
-
require_relative "fontisan/variation/variation_preserver"
|
|
185
|
-
require_relative "fontisan/variation/delta_parser"
|
|
186
|
-
require_relative "fontisan/variation/delta_applier"
|
|
187
|
-
require_relative "fontisan/variation/blend_applier"
|
|
188
|
-
require_relative "fontisan/variation/variable_svg_generator"
|
|
189
|
-
|
|
190
|
-
# Pipeline infrastructure
|
|
191
|
-
require_relative "fontisan/pipeline/format_detector"
|
|
192
|
-
require_relative "fontisan/pipeline/variation_resolver"
|
|
193
|
-
require_relative "fontisan/pipeline/output_writer"
|
|
194
|
-
require_relative "fontisan/pipeline/transformation_pipeline"
|
|
195
|
-
|
|
196
|
-
# Optimization infrastructure
|
|
197
|
-
require_relative "fontisan/optimizers/pattern_analyzer"
|
|
198
|
-
require_relative "fontisan/optimizers/subroutine_builder"
|
|
199
|
-
require_relative "fontisan/optimizers/charstring_rewriter"
|
|
200
|
-
require_relative "fontisan/optimizers/subroutine_optimizer"
|
|
201
|
-
require_relative "fontisan/optimizers/subroutine_generator"
|
|
202
|
-
|
|
203
|
-
# Hints infrastructure
|
|
204
|
-
require_relative "fontisan/models/hint"
|
|
205
|
-
require_relative "fontisan/hints/truetype_instruction_analyzer"
|
|
206
|
-
require_relative "fontisan/hints/truetype_instruction_generator"
|
|
207
|
-
require_relative "fontisan/hints/truetype_hint_extractor"
|
|
208
|
-
require_relative "fontisan/hints/truetype_hint_applier"
|
|
209
|
-
require_relative "fontisan/hints/postscript_hint_extractor"
|
|
210
|
-
require_relative "fontisan/hints/postscript_hint_applier"
|
|
211
|
-
require_relative "fontisan/hints/hint_converter"
|
|
212
|
-
require_relative "fontisan/hints/hint_validator"
|
|
213
|
-
|
|
214
|
-
# Commands
|
|
215
|
-
require_relative "fontisan/commands/base_command"
|
|
216
|
-
require_relative "fontisan/commands/info_command"
|
|
217
|
-
require_relative "fontisan/commands/ls_command"
|
|
218
|
-
require_relative "fontisan/commands/tables_command"
|
|
219
|
-
require_relative "fontisan/commands/glyphs_command"
|
|
220
|
-
require_relative "fontisan/commands/unicode_command"
|
|
221
|
-
require_relative "fontisan/commands/variable_command"
|
|
222
|
-
require_relative "fontisan/commands/optical_size_command"
|
|
223
|
-
require_relative "fontisan/commands/scripts_command"
|
|
224
|
-
require_relative "fontisan/commands/features_command"
|
|
225
|
-
require_relative "fontisan/commands/dump_table_command"
|
|
226
|
-
require_relative "fontisan/commands/subset_command"
|
|
227
|
-
require_relative "fontisan/commands/convert_command"
|
|
228
|
-
require_relative "fontisan/commands/pack_command"
|
|
229
|
-
require_relative "fontisan/commands/unpack_command"
|
|
230
|
-
require_relative "fontisan/commands/validate_command"
|
|
231
|
-
|
|
232
|
-
# Formatters
|
|
233
|
-
require_relative "fontisan/formatters/text_formatter"
|
|
234
|
-
|
|
235
|
-
# CLI
|
|
236
|
-
require_relative "fontisan/cli"
|
|
237
|
-
|
|
238
42
|
module Fontisan
|
|
43
|
+
#
|
|
44
|
+
# Each namespace under Fontisan has a hub file at lib/fontisan/<ns>.rb
|
|
45
|
+
# that declares autoloads for its children. This file autoloads those
|
|
46
|
+
# hubs plus the flat Fontisan::* classes. Files are loaded lazily on
|
|
47
|
+
# first reference.
|
|
48
|
+
|
|
49
|
+
# Core
|
|
50
|
+
require "fontisan/version"
|
|
51
|
+
autoload :Constants, "fontisan/constants"
|
|
52
|
+
autoload :LoadingModes, "fontisan/loading_modes"
|
|
53
|
+
autoload :ConversionOptions, "fontisan/conversion_options"
|
|
54
|
+
|
|
55
|
+
# Errors (all defined in fontisan/error)
|
|
56
|
+
autoload :Error, "fontisan/error"
|
|
57
|
+
autoload :InvalidFontError, "fontisan/error"
|
|
58
|
+
autoload :UnsupportedFormatError, "fontisan/error"
|
|
59
|
+
autoload :CorruptedTableError, "fontisan/error"
|
|
60
|
+
autoload :MissingTableError, "fontisan/error"
|
|
61
|
+
autoload :ParseError, "fontisan/error"
|
|
62
|
+
autoload :SubsettingError, "fontisan/error"
|
|
63
|
+
autoload :VariationError, "fontisan/error"
|
|
64
|
+
autoload :InvalidCoordinatesError, "fontisan/error"
|
|
65
|
+
autoload :MissingVariationTableError, "fontisan/error"
|
|
66
|
+
autoload :InvalidAxisError, "fontisan/error"
|
|
67
|
+
autoload :RegionOverlapError, "fontisan/error"
|
|
68
|
+
autoload :DeltaMismatchError, "fontisan/error"
|
|
69
|
+
autoload :InvalidInstanceIndexError, "fontisan/error"
|
|
70
|
+
autoload :CorruptedVariationDataError, "fontisan/error"
|
|
71
|
+
autoload :InvalidVariationDataError, "fontisan/error"
|
|
72
|
+
autoload :VariationDataCorruptedError, "fontisan/error"
|
|
73
|
+
|
|
74
|
+
# Namespace hubs (each hub declares its own child autoloads)
|
|
75
|
+
autoload :Binary, "fontisan/binary"
|
|
76
|
+
autoload :Cldr, "fontisan/cldr"
|
|
77
|
+
autoload :Collection, "fontisan/collection"
|
|
78
|
+
autoload :Commands, "fontisan/commands"
|
|
79
|
+
autoload :Converters, "fontisan/converters"
|
|
80
|
+
autoload :Export, "fontisan/export"
|
|
81
|
+
autoload :Formatters, "fontisan/formatters"
|
|
82
|
+
autoload :Hints, "fontisan/hints"
|
|
83
|
+
autoload :Models, "fontisan/models"
|
|
84
|
+
autoload :Optimizers, "fontisan/optimizers"
|
|
85
|
+
autoload :Parsers, "fontisan/parsers"
|
|
86
|
+
autoload :Pipeline, "fontisan/pipeline"
|
|
87
|
+
autoload :Subset, "fontisan/subset"
|
|
88
|
+
autoload :Svg, "fontisan/svg"
|
|
89
|
+
autoload :Tables, "fontisan/tables"
|
|
90
|
+
autoload :Type1, "fontisan/type1"
|
|
91
|
+
autoload :Utilities, "fontisan/utilities"
|
|
92
|
+
autoload :Utils, "fontisan/utils"
|
|
93
|
+
autoload :Validation, "fontisan/validation"
|
|
94
|
+
autoload :Validators, "fontisan/validators"
|
|
95
|
+
autoload :Variable, "fontisan/variable"
|
|
96
|
+
autoload :Variation, "fontisan/variation"
|
|
97
|
+
autoload :Woff2, "fontisan/woff2"
|
|
98
|
+
|
|
99
|
+
# Flat classes (no inner namespace)
|
|
100
|
+
autoload :BaseCollection, "fontisan/base_collection"
|
|
101
|
+
autoload :Cli, "fontisan/cli"
|
|
102
|
+
autoload :DfontCollection, "fontisan/dfont_collection"
|
|
103
|
+
autoload :FontLoader, "fontisan/font_loader"
|
|
104
|
+
autoload :FontWriter, "fontisan/font_writer"
|
|
105
|
+
autoload :GlyphAccessor, "fontisan/glyph_accessor"
|
|
106
|
+
autoload :MetricsCalculator, "fontisan/metrics_calculator"
|
|
107
|
+
autoload :OpenTypeCollection, "fontisan/open_type_collection"
|
|
108
|
+
autoload :OpenTypeFont, "fontisan/open_type_font"
|
|
109
|
+
autoload :OpenTypeFontExtensions, "fontisan/open_type_font_extensions"
|
|
110
|
+
autoload :OutlineExtractor, "fontisan/outline_extractor"
|
|
111
|
+
autoload :SfntFont, "fontisan/sfnt_font"
|
|
112
|
+
autoload :SfntTable, "fontisan/sfnt_table"
|
|
113
|
+
autoload :TrueTypeCollection, "fontisan/true_type_collection"
|
|
114
|
+
autoload :TrueTypeFont, "fontisan/true_type_font"
|
|
115
|
+
autoload :TrueTypeFontExtensions, "fontisan/true_type_font_extensions"
|
|
116
|
+
autoload :Type1Font, "fontisan/type1_font"
|
|
117
|
+
autoload :CldrCli, "fontisan/cli/cldr_cli"
|
|
118
|
+
autoload :Woff2Font, "fontisan/woff2_font"
|
|
119
|
+
autoload :WoffFont, "fontisan/woff_font"
|
|
120
|
+
|
|
121
|
+
# SFNT offset table and table directory (defined in sfnt_font.rb)
|
|
122
|
+
autoload :OffsetTable, "fontisan/sfnt_font"
|
|
123
|
+
autoload :TableDirectory, "fontisan/sfnt_font"
|
|
124
|
+
|
|
125
|
+
# WOFF headers and table directory entries
|
|
126
|
+
autoload :WoffHeader, "fontisan/woff_font"
|
|
127
|
+
autoload :WoffTableDirectoryEntry, "fontisan/woff_font"
|
|
128
|
+
autoload :Woff2TableDirectoryEntry, "fontisan/woff2_font"
|
|
239
129
|
class << self
|
|
240
130
|
attr_accessor :logger
|
|
241
131
|
|
|
@@ -279,6 +169,41 @@ module Fontisan
|
|
|
279
169
|
Commands::InfoCommand.new(path, brief: brief, font_index: font_index).run
|
|
280
170
|
end
|
|
281
171
|
|
|
172
|
+
# Convert a font to a different format.
|
|
173
|
+
#
|
|
174
|
+
# Delegates to {Commands::ConvertCommand}. Format-specific compression knobs
|
|
175
|
+
# are declared by each strategy (single source of truth) and forwarded
|
|
176
|
+
# through the transformation pipeline.
|
|
177
|
+
#
|
|
178
|
+
# WOFF uses zlib and runs on every browser that supports web fonts (IE9+,
|
|
179
|
+
# all evergreen browsers). WOFF2 uses Brotli for ~30% smaller output but
|
|
180
|
+
# requires modern browsers — use WOFF when legacy support matters.
|
|
181
|
+
#
|
|
182
|
+
# @param path [String] Input font file
|
|
183
|
+
# @param to [Symbol, String] Target format: :ttf, :otf, :type1, :woff,
|
|
184
|
+
# :woff2, :svg, :ttc, :otc, :dfont
|
|
185
|
+
# @param output [String] Output font file path
|
|
186
|
+
# @param opts [Hash] Conversion options. Format-specific knobs:
|
|
187
|
+
# - WOFF: :zlib_level (0–9, default 6), :uncompressed (bool),
|
|
188
|
+
# :compression_threshold (bytes)
|
|
189
|
+
# - WOFF2: :brotli_quality (0–11, default 11), :transform_tables (bool)
|
|
190
|
+
# - Variable fonts: :coordinates, :instance_index, :preserve_variation
|
|
191
|
+
# - Collections: :target_format ("preserve"|"ttf"|"otf")
|
|
192
|
+
# @return [Hash] Result hash with :success, :output_path, source/target
|
|
193
|
+
# format, input/output sizes, and variation strategy.
|
|
194
|
+
#
|
|
195
|
+
# @example TTF → WOFF2 (modern browsers)
|
|
196
|
+
# Fontisan.convert("f.ttf", to: :woff2, output: "f.woff2", brotli_quality: 11)
|
|
197
|
+
#
|
|
198
|
+
# @example TTF → WOFF (legacy browsers, max zlib)
|
|
199
|
+
# Fontisan.convert("f.ttf", to: :woff, output: "f.woff", zlib_level: 9)
|
|
200
|
+
#
|
|
201
|
+
# @example WOFF with no compression (legal per WOFF 1.0 §5.1)
|
|
202
|
+
# Fontisan.convert("f.ttf", to: :woff, output: "f.woff", uncompressed: true)
|
|
203
|
+
def self.convert(path, to:, output:, **)
|
|
204
|
+
Commands::ConvertCommand.new(path, { to: to, output: output, ** }).run
|
|
205
|
+
end
|
|
206
|
+
|
|
282
207
|
# Validate a font file using specified profile
|
|
283
208
|
#
|
|
284
209
|
# Validates fonts against quality checks, structural integrity, and OpenType
|