Class: Origami::XRef::Subsection

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/origami/xreftable.rb

Overview

Class representing a cross-reference subsection. A subsection contains a continute set of XRef.

Constant Summary collapse

@@regexp =
Regexp.new("(?<start>\\d+) (?<size>\\d+)" + WHITESPACES + "(\\r?\\n|\\r\\n?)")

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(start, entries = []) ⇒ Subsection

Creates a new XRef subsection.

start

The number of the first object referenced in the subsection.

entries

An array of XRef.


138
139
140
141
# File 'lib/origami/xreftable.rb', line 138

def initialize(start, entries = [])
    @entries = entries.dup
    @range = Range.new(start, start + entries.size - 1)
end

Instance Attribute Details

#rangeObject (readonly)

Returns the value of attribute range


131
132
133
# File 'lib/origami/xreftable.rb', line 131

def range
  @range
end

Class Method Details

.parse(stream) ⇒ Object

:nodoc:


143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/origami/xreftable.rb', line 143

def self.parse(stream) #:nodoc:
    if stream.scan(@@regexp).nil?
      raise InvalidXRefSubsectionError, "Bad subsection format"
    end

    start = stream['start'].to_i
    size = stream['size'].to_i

    xrefs = []
    size.times do
      xrefs << XRef.parse(stream)
    end

    XRef::Subsection.new(start, xrefs)
end

Instance Method Details

#[](no) ⇒ Object

Returns XRef associated with a given object.

no

The Object number.


171
172
173
# File 'lib/origami/xreftable.rb', line 171

def [](no)
    @entries[no - @range.begin]
end

#each(&b) ⇒ Object

Processes each XRef in the subsection.


178
179
180
# File 'lib/origami/xreftable.rb', line 178

def each(&b)
    @entries.each(&b)
end

#each_with_numberObject

Processes each XRef in the subsection, passing the XRef and the object number to the block.


185
186
187
188
189
190
191
192
# File 'lib/origami/xreftable.rb', line 185

def each_with_number
    return enum_for(__method__) { self.size } unless block_given?

    counter = @range.to_enum
    @entries.each do |entry|
        yield(entry, counter.next)
    end
end

#has_object?(no) ⇒ Boolean

Returns whether this subsection contains information about a particular object.

no

The Object number.

Returns:


163
164
165
# File 'lib/origami/xreftable.rb', line 163

def has_object?(no)
    @range.include?(no)
end

#sizeObject

The number of entries in the subsection.


197
198
199
# File 'lib/origami/xreftable.rb', line 197

def size
    @entries.size
end

#to_sObject

Outputs self into PDF code.


204
205
206
207
208
209
210
211
# File 'lib/origami/xreftable.rb', line 204

def to_s
    section = "#{@range.begin} #{@range.end - @range.begin + 1}" + EOL
    @entries.each do |xref|
        section << xref.to_s
    end

    section
end