Class: Fontisan::Converters::WoffWriter

Inherits:
Object
  • Object
show all
Includes:
ConversionStrategy
Defined in:
lib/fontisan/converters/woff_writer.rb

Overview

WOFF font writer for creating WOFF files from TTF/OTF fonts

[‘WoffWriter`](lib/fontisan/converters/woff_writer.rb) handles conversion from TrueType/OpenType fonts to WOFF format using zlib compression. This implements the WOFF 1.0 specification for web font optimization.

**WOFF Format Features:**

  • Individual table compression with zlib

  • Optional metadata block (compressed XML)

  • Optional private data block

  • Proper header and table directory structure

  • Cross-platform compatibility

**Compression Strategy:**

  • Each table is compressed individually for optimal ratios

  • Tables smaller than compression threshold remain uncompressed

  • Metadata and private data are compressed when present

  • All data is properly aligned and padded

Examples:

Converting TTF to WOFF

writer = Fontisan::Converters::WoffWriter.new
woff_data = writer.write_font(ttf_font, metadata: )
File.write("output.woff", woff_data)

With compression options

writer = Fontisan::Converters::WoffWriter.new(
  compression_level: 9,  # Maximum compression
  compression_threshold: 100  # Bytes - tables smaller than this stay uncompressed
)
woff_data = writer.write_font(ttf_font)

Constant Summary collapse

WOFF_SIGNATURE =

WOFF signature constant

0x774F4646
WOFF_VERSION_MAJOR =

WOFF version 1.0

1
WOFF_VERSION_MINOR =
0
DEFAULT_COMPRESSION_LEVEL =

Default compression settings

6
DEFAULT_COMPRESSION_THRESHOLD =

bytes - don’t compress smaller tables

100

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ConversionStrategy

#supports?, #validate

Constructor Details

#initialize(options = {}) ⇒ WoffWriter

Initialize writer with compression options

Parameters:

  • options (Hash) (defaults to: {})

    Writer options

Options Hash (options):

  • :compression_level (Integer)

    zlib compression level (0-9)

  • :compression_threshold (Integer)

    minimum table size to compress

  • :metadata_xml (String)

    optional metadata XML

  • :private_data (String)

    optional private data



72
73
74
75
76
77
78
79
# File 'lib/fontisan/converters/woff_writer.rb', line 72

def initialize(options = {})
  @compression_level = options[:compression_level] || DEFAULT_COMPRESSION_LEVEL
  @compression_threshold = options[:compression_threshold] || DEFAULT_COMPRESSION_THRESHOLD
  @metadata_xml = options[:metadata_xml]
  @private_data = options[:private_data]

  validate_compression_level!
end

Instance Attribute Details

#compression_levelObject

Compression level (0-9, where 9 is maximum)



54
55
56
# File 'lib/fontisan/converters/woff_writer.rb', line 54

def compression_level
  @compression_level
end

#compression_thresholdObject

Minimum table size to compress (bytes)



57
58
59
# File 'lib/fontisan/converters/woff_writer.rb', line 57

def compression_threshold
  @compression_threshold
end

#metadata_xmlObject

Optional metadata XML



60
61
62
# File 'lib/fontisan/converters/woff_writer.rb', line 60

def 
  @metadata_xml
end

#private_dataObject

Optional private data



63
64
65
# File 'lib/fontisan/converters/woff_writer.rb', line 63

def private_data
  @private_data
end

Instance Method Details

#convert(font, options = {}) ⇒ String

Convert font to WOFF format

Parameters:

  • font (TrueTypeFont, OpenTypeFont)

    Source font

  • options (Hash) (defaults to: {})

    Additional options for this conversion

Returns:

  • (String)

    WOFF file data as binary string

Raises:

  • (ArgumentError)

    if font is invalid



87
88
89
90
91
92
93
94
95
# File 'lib/fontisan/converters/woff_writer.rb', line 87

def convert(font, options = {})
  validate_font(font)

  # Override instance options with per-conversion options
   = options[:metadata_xml] || @metadata_xml
  private_data = options[:private_data] || @private_data

  write_font(font, metadata: , private_data: private_data)
end

#supported_conversionsArray<Array<Symbol>>

Get supported conversions

Returns:

  • (Array<Array<Symbol>>)

    Supported conversion pairs



100
101
102
103
104
105
# File 'lib/fontisan/converters/woff_writer.rb', line 100

def supported_conversions
  [
    %i[ttf woff],
    %i[otf woff],
  ]
end

#write_font(font, metadata: nil, private_data: nil) ⇒ String

Write font data to WOFF format

Parameters:

  • font (TrueTypeFont, OpenTypeFont)

    Source font

  • metadata (String, nil) (defaults to: nil)

    Optional metadata XML

  • private_data (String, nil) (defaults to: nil)

    Optional private data

Returns:

  • (String)

    WOFF file data



113
114
115
116
117
118
119
120
121
122
# File 'lib/fontisan/converters/woff_writer.rb', line 113

def write_font(font, metadata: nil, private_data: nil)
  # Collect all table data from font
  tables_data = collect_tables_data(font)

  # Compress tables
  compressed_tables = compress_tables(tables_data)

  # Build WOFF file
  build_woff_file(compressed_tables, font, , private_data)
end