Class: Ucode::Glyphs::EmbeddedFonts::Catalog

Inherits:
Object
  • Object
show all
Defined in:
lib/ucode/glyphs/embedded_fonts/catalog.rb

Overview

Composes PdfIndexer + CodepointMapper to build a global {codepoint => FontEntry} index from a Code Charts PDF.

Responsibilities split cleanly:

* {PdfIndexer} — subprocess + dict parsing → Array<RawFontDescriptor>
* {CodepointMapper} — 3-path codepoint→GID strategy → {cp => gid}
* {Catalog} (this class) — composes both into FontEntry objects
and exposes the public lookup interface

When multiple fonts cover the same codepoint, the first font discovered wins. Discovery order follows mutool info's page-major listing, so earlier blocks' fonts win — the expected behavior.

Instance Method Summary collapse

Constructor Details

#initialize(source, block_range: nil, force_positional_for_font_ids: Set.new, correlator_configs: {}) ⇒ Catalog

Returns a new instance of Catalog.

Parameters:

  • source (PdfSource)
  • block_range (Range<Integer>, nil) (defaults to: nil)

    codepoint scope the caller is extracting. When present, drops an intrinsic strategy's result if it has zero in-block intersection, letting positional strategies take over (the U1F200 class of failure where the font's CMap encoded composing ideographs rather than the specimens). nil = legacy mode (intrinsic result always trusted).

  • force_positional_for_font_ids (Set<Integer>) (defaults to: Set.new)

    Type0 font object IDs that always trigger positional attribution regardless of intrinsic success. Escape hatch for partial-overlap cases.

  • correlator_configs (Hash{Integer=>ContentStreamCorrelator::Config}) (defaults to: {})

    maps a Type0 font's PDF object ID to the pillar-2 config to use when the font has no /ToUnicode CMap. Empty by default.



35
36
37
38
39
40
41
42
43
# File 'lib/ucode/glyphs/embedded_fonts/catalog.rb', line 35

def initialize(source, block_range: nil,
               force_positional_for_font_ids: Set.new,
               correlator_configs: {})
  @source = source
  @block_range = block_range
  @force_positional_for_font_ids = force_positional_for_font_ids
  @correlator_configs = correlator_configs
  @index = nil
end

Instance Method Details

#codepointsArray<Integer>

Returns every codepoint this PDF covers.

Returns:

  • (Array<Integer>)

    every codepoint this PDF covers



57
58
59
# File 'lib/ucode/glyphs/embedded_fonts/catalog.rb', line 57

def codepoints
  index.keys
end

#font_countInteger

Returns number of Type0 fonts with non-empty maps.

Returns:

  • (Integer)

    number of Type0 fonts with non-empty maps



67
68
69
# File 'lib/ucode/glyphs/embedded_fonts/catalog.rb', line 67

def font_count
  font_entries.size
end

#font_entriesArray<FontEntry>

Returns every font entry (one per Type0 font).

Returns:

  • (Array<FontEntry>)

    every font entry (one per Type0 font)



72
73
74
# File 'lib/ucode/glyphs/embedded_fonts/catalog.rb', line 72

def font_entries
  @font_entries ||= build_font_entries
end

#indexHash{Integer=>FontEntry}

Returns frozen codepoint → entry map.

Returns:

  • (Hash{Integer=>FontEntry})

    frozen codepoint → entry map



46
47
48
# File 'lib/ucode/glyphs/embedded_fonts/catalog.rb', line 46

def index
  @index ||= build_index.freeze
end

#lookup(codepoint) ⇒ FontEntry?

Parameters:

  • codepoint (Integer)

Returns:



52
53
54
# File 'lib/ucode/glyphs/embedded_fonts/catalog.rb', line 52

def lookup(codepoint)
  index[codepoint]
end

#sizeInteger

Returns number of codepoints covered.

Returns:

  • (Integer)

    number of codepoints covered



62
63
64
# File 'lib/ucode/glyphs/embedded_fonts/catalog.rb', line 62

def size
  index.size
end