Chris@909: module CodeRay Chris@909: module Encoders Chris@909: Chris@909: # = Debug Encoder Chris@909: # Chris@909: # Fast encoder producing simple debug output. Chris@909: # Chris@909: # It is readable and diff-able and is used for testing. Chris@909: # Chris@909: # You cannot fully restore the tokens information from the Chris@909: # output, because consecutive :space tokens are merged. Chris@909: # Use Tokens#dump for caching purposes. Chris@909: # Chris@909: # See also: Scanners::Debug Chris@909: class Debug < Encoder Chris@909: Chris@909: register_for :debug Chris@909: Chris@909: FILE_EXTENSION = 'raydebug' Chris@909: Chris@909: def initialize options = {} Chris@909: super Chris@909: @opened = [] Chris@909: end Chris@909: Chris@909: def text_token text, kind Chris@909: if kind == :space Chris@909: @out << text Chris@909: else Chris@909: # TODO: Escape ( Chris@909: text = text.gsub(/[)\\]/, '\\\\\0') # escape ) and \ Chris@909: @out << kind.to_s << '(' << text << ')' Chris@909: end Chris@909: end Chris@909: Chris@909: def begin_group kind Chris@909: @opened << kind Chris@909: @out << kind.to_s << '<' Chris@909: end Chris@909: Chris@909: def end_group kind Chris@909: if @opened.last != kind Chris@909: puts @out Chris@909: raise "we are inside #{@opened.inspect}, not #{kind}" Chris@909: end Chris@909: @opened.pop Chris@909: @out << '>' Chris@909: end Chris@909: Chris@909: def begin_line kind Chris@909: @out << kind.to_s << '[' Chris@909: end Chris@909: Chris@909: def end_line kind Chris@909: @out << ']' Chris@909: end Chris@909: Chris@909: end Chris@909: Chris@909: end Chris@909: end