Method: HexaPDF::Content::Parser#parse

Defined in:
lib/hexapdf/content/parser.rb

#parse(contents, processor = nil, &block) ⇒ Object

Parses the contents and calls the processor object or the given block for each parsed operator.

If a full-blown Processor is not needed (e.g. because the graphics state doesn’t need to be maintained), one can use the block form to handle the parsed objects and their parameters.

Note: The parameters array is reused for each processed operator, so duplicate it if necessary.

Raises:

  • (ArgumentError)


176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# File 'lib/hexapdf/content/parser.rb', line 176

def parse(contents, processor = nil, &block) #:yields: object, params
  raise ArgumentError, "Argument processor or block is needed" if processor.nil? && block.nil?
  if processor.nil?
    block.singleton_class.send(:alias_method, :process, :call)
    processor = block
  end

  tokenizer = Tokenizer.new(contents, raise_on_eos: true)
  params = []
  loop do
    obj = tokenizer.next_object(allow_keyword: true)
    if obj.kind_of?(Tokenizer::Token)
      if obj == 'BI'
        params = parse_inline_image(tokenizer)
      end
      processor.process(obj.to_sym, params)
      params.clear
    else
      params << obj
    end
  end
end