diff options
| author | no author <noone@nowhere> | 2005-09-26 02:58:54 +0000 | 
|---|---|---|
| committer | no author <noone@nowhere> | 2005-09-26 02:58:54 +0000 | 
| commit | 84b8431608174e74a4c0d2394eb330a6621bc74b (patch) | |
| tree | ffc2bd7ce21708a9147247c80b0e7fc7728ea063 /lib/coderay/scanners/rubylex.rb | |
| download | coderay-84b8431608174e74a4c0d2394eb330a6621bc74b.tar.gz | |
New Repository, initial import
Diffstat (limited to 'lib/coderay/scanners/rubylex.rb')
| -rw-r--r-- | lib/coderay/scanners/rubylex.rb | 102 | 
1 files changed, 102 insertions, 0 deletions
| diff --git a/lib/coderay/scanners/rubylex.rb b/lib/coderay/scanners/rubylex.rb new file mode 100644 index 0000000..2e69d39 --- /dev/null +++ b/lib/coderay/scanners/rubylex.rb @@ -0,0 +1,102 @@ +require 'rubygems'
 +require_gem 'rubylexer'
 +require 'rubylexer.rb'
 +
 +module CodeRay module Scanners
 +
 +	class RubyLex < Scanner
 +		
 +		register_for :rubylex
 +
 +		class FakeFile < String
 +
 +			def initialize(*)
 +				super
 +				@pos = 0
 +			end
 +			
 +			attr_accessor :pos
 +			
 +			def read x
 +				pos = @pos
 +				@pos += x
 +				self[pos ... @pos]
 +			end
 +
 +			def getc
 +				pos = @pos
 +				@pos += 1
 +				self[pos]||-1
 +			end
 +
 +			def eof?
 +				@pos == size
 +			end
 +
 +			def each_byte
 +				until eof?
 +					yield getc
 +				end
 +			end
 +			
 +			def method_missing meth, *args
 +				raise NoMethodError, '%s%s' % [meth, args]
 +			end
 +
 +		end
 +
 +	private
 +		Translate = {
 +			:ignore => :comment,
 +			:varname => :ident,
 +			:number => :integer,
 +			:ws => :space,
 +			:escnl => :space,
 +			:keyword => :reserved,
 +			:methname => :method,
 +			:renderexactlystring => :regexp,
 +			:string => :string,
 +		}
 +
 +		def scan_tokens tokens, options
 +			require 'tempfile'
 +			Tempfile.open('~coderay_tempfile') do |file|
 +				file.binmode
 +				file.write code
 +				file.rewind
 +				lexer = RubyLexer.new 'code', file
 +				loop do
 +					begin
 +						tok = lexer.get1token
 +					rescue => kaboom
 +						err = <<-EOE
 +	ERROR!!!
 +#{kaboom.inspect}
 +#{kaboom.backtrace.join("\n")}
 +						EOE
 +						tokens << [err, :error]
 +						Kernel.raise
 +					end
 +					break if tok.is_a? EoiToken
 +					next if tok.is_a? FileAndLineToken
 +					kind = tok.class.name[/(.*?)Token$/,1].downcase.to_sym
 +					kind = Translate.fetch kind, kind
 +					text = tok.ident
 +					case kind
 +					when :hereplaceholder
 +						text = tok.ender
 +						kind = :string
 +					when :herebody, :outlinedherebody
 +						text = tok.ident.ident
 +						kind = :string
 +					end
 +					text = text.inspect unless text.is_a? String
 +					p token if kind == :error
 +					tokens << [text.dup, kind]
 +				end
 +			end
 +			tokens
 +		end
 +	end
 +
 +end end
 | 
