Class: Asciidoctor::PDF::IndexCatalog

Inherits:
Object
  • Object
show all
Includes:
TextTransformer
Defined in:
lib/asciidoctor/pdf/index_catalog.rb

Constant Summary collapse

LeadingAlphaRx =
/^\p{Alpha}/

Constants included from TextTransformer

TextTransformer::BareClassRx, TextTransformer::ContiguousCharsRx, TextTransformer::Hyphen, TextTransformer::LowerAlphaChars, TextTransformer::PCDATAFilterRx, TextTransformer::SmallCapsChars, TextTransformer::SoftHyphen, TextTransformer::TagFilterRx, TextTransformer::WordRx, TextTransformer::XMLMarkupRx

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from TextTransformer

#capitalize_words, #capitalize_words_pcdata, #hyphenate_words, #hyphenate_words_pcdata, #lowercase_pcdata, #smallcaps, #smallcaps_pcdata, #transform_text, #uppercase_pcdata

Constructor Details

#initializeIndexCatalog

Returns a new instance of IndexCatalog.



15
16
17
18
19
20
# File 'lib/asciidoctor/pdf/index_catalog.rb', line 15

def initialize
  @categories = {}
  @start_page_number = 1
  @dests = {}
  @sequence = 0
end

Instance Attribute Details

#start_page_numberObject

Returns the value of attribute start_page_number.



13
14
15
# File 'lib/asciidoctor/pdf/index_catalog.rb', line 13

def start_page_number
  @start_page_number
end

Instance Method Details

#categoriesObject



103
104
105
# File 'lib/asciidoctor/pdf/index_catalog.rb', line 103

def categories
  @categories.values.sort
end

#empty?Boolean

Returns:

  • (Boolean)


99
100
101
# File 'lib/asciidoctor/pdf/index_catalog.rb', line 99

def empty?
  @categories.empty?
end

#find_category(name) ⇒ Object



56
57
58
# File 'lib/asciidoctor/pdf/index_catalog.rb', line 56

def find_category name
  @categories[name]
end

#find_primary_term(name) ⇒ Object



60
61
62
63
64
65
66
# File 'lib/asciidoctor/pdf/index_catalog.rb', line 60

def find_primary_term name
  @categories.each_value do |category|
    term = category.terms.find {|candidate| candidate.name == name }
    return term if term
  end
  nil
end

#init_category(name) ⇒ Object



51
52
53
54
# File 'lib/asciidoctor/pdf/index_catalog.rb', line 51

def init_category name
  name = '@' unless LeadingAlphaRx.match? name
  @categories[name] ||= IndexTermCategory.new name
end


68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/asciidoctor/pdf/index_catalog.rb', line 68

def link_associations group = nil
  if group
    group.terms.each do |term|
      associations = term.associations
      if (see_name = associations[:see])
        see_name = FormattedString.new see_name
        term.see = (find_primary_term see_name) || (UnresolvedIndexTerm.new see_name)
      elsif (see_also_names = associations[:see_also])
        term.see_also = see_also_names.map do |see_also_name|
          see_also_name = FormattedString.new see_also_name
          (find_primary_term see_also_name) || (UnresolvedIndexTerm.new see_also_name)
        end
      end
      link_associations term unless term.leaf?
    end
  else
    @categories.each_value {|category| link_associations category }
  end
end


92
93
94
95
96
97
# File 'lib/asciidoctor/pdf/index_catalog.rb', line 92

def link_dest_to_page anchor, physical_page_number
  if (dest = @dests[anchor])
    virtual_page_number = (dest[:page_sortable] = physical_page_number) - (@start_page_number - 1)
    dest[:page] = (virtual_page_number < 1 ? (RomanNumeral.new physical_page_number, :lower) : virtual_page_number).to_s
  end
end

#next_anchor_nameObject



22
23
24
# File 'lib/asciidoctor/pdf/index_catalog.rb', line 22

def next_anchor_name
  %(__indexterm-#{@sequence += 1})
end

#store_dest(dest) ⇒ Object



88
89
90
# File 'lib/asciidoctor/pdf/index_catalog.rb', line 88

def store_dest dest
  @dests[dest[:anchor]] = dest
end

#store_primary_term(name, dest = nil, assoc = {}) ⇒ Object



36
37
38
39
# File 'lib/asciidoctor/pdf/index_catalog.rb', line 36

def store_primary_term name, dest = nil, assoc = {}
  store_dest dest if dest
  (init_category name.chr.upcase).store_term name, dest, assoc
end

#store_secondary_term(primary_name, secondary_name, dest = nil, assoc = {}) ⇒ Object



41
42
43
44
# File 'lib/asciidoctor/pdf/index_catalog.rb', line 41

def store_secondary_term primary_name, secondary_name, dest = nil, assoc = {}
  store_dest dest if dest
  (store_primary_term primary_name).store_term secondary_name, dest, assoc
end

#store_term(names, dest, assoc = {}) ⇒ Object



26
27
28
29
30
31
32
33
34
# File 'lib/asciidoctor/pdf/index_catalog.rb', line 26

def store_term names, dest, assoc = {}
  if (num_terms = (names = names.map {|name| FormattedString.new name }).size) == 1
    store_primary_term names[0], dest, assoc
  elsif num_terms == 2
    store_secondary_term names[0], names[1], dest, assoc
  elsif num_terms > 2
    store_tertiary_term names[0], names[1], names[2], dest, assoc
  end
end

#store_tertiary_term(primary_name, secondary_name, tertiary_name, dest, assoc = {}) ⇒ Object



46
47
48
49
# File 'lib/asciidoctor/pdf/index_catalog.rb', line 46

def store_tertiary_term primary_name, secondary_name, tertiary_name, dest, assoc = {}
  store_dest dest
  (store_secondary_term primary_name, secondary_name).store_term tertiary_name, dest, assoc
end