=begin This file is part of Origami, PDF manipulation framework for Ruby Copyright (C) 2016 Guillaume Delugré. Origami is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Origami is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Origami. If not, see . =end module Origami class InvalidReferenceError < Error #:nodoc: end # # Class representing a Reference Object. # Reference are like symbolic links pointing to a particular object into the file. # class Reference include Origami::Object TOKENS = [ "(?\\d+)" + WHITESPACES + "(?\\d+)" + WHITESPACES + "R" ] #:nodoc: REGEXP_TOKEN = Regexp.new(TOKENS.first, Regexp::MULTILINE) @@regexp = Regexp.new(WHITESPACES + TOKENS.first + WHITESPACES) attr_accessor :refno, :refgen def initialize(refno, refgen) super() @refno, @refgen = refno, refgen end def self.parse(stream, parser = nil) #:nodoc: offset = stream.pos if stream.scan(@@regexp).nil? raise InvalidReferenceError, "Bad reference to indirect objet format" end no = stream['no'].to_i gen = stream['gen'].to_i ref = Reference.new(no, gen) ref.file_offset = offset ref end def solve doc = self.document if doc.nil? raise InvalidReferenceError, "Not attached to any document" end target = doc.get_object(self) if target.nil? and not Origami::OPTIONS[:ignore_bad_references] raise InvalidReferenceError, "Cannot resolve reference : #{self.to_s}" end target or Null.new end def hash #:nodoc: self.to_a.hash end def <=>(ref) #:nodoc self.to_a <=> ref.to_a end # # Compares to Reference object. # def ==(ref) return false unless ref.is_a?(Reference) self.to_a == ref.to_a end alias eql? == # # Returns a Ruby array with the object number and the generation this reference is pointing to. # def to_a [@refno, @refgen] end def to_s #:nodoc: super("#{@refno} #{@refgen} R") end # # Returns self. # def value self end def self.native_type ; Reference end end end