Class: Origami::XRef::Subsection

Inherits:
Object
  • Object
show all
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.



147
148
149
150
# File 'lib/origami/xreftable.rb', line 147

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.



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

def range
  @range
end

Class Method Details

.parse(stream) ⇒ Object

:nodoc:



152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/origami/xreftable.rb', line 152

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.



180
181
182
# File 'lib/origami/xreftable.rb', line 180

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

#each(&b) ⇒ Object

Processes each XRef in the subsection.



187
188
189
# File 'lib/origami/xreftable.rb', line 187

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.



194
195
196
197
198
199
200
201
# File 'lib/origami/xreftable.rb', line 194

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:



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

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

#sizeObject

The number of entries in the subsection.



206
207
208
# File 'lib/origami/xreftable.rb', line 206

def size
    @entries.size
end

#to_sObject

Outputs self into PDF code.



213
214
215
216
217
218
219
220
# File 'lib/origami/xreftable.rb', line 213

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

    section
end