Chris@0
|
1 ($:.unshift '../..'; require 'coderay') unless defined? CodeRay
|
Chris@0
|
2 module CodeRay
|
Chris@0
|
3 module Encoders
|
Chris@0
|
4
|
Chris@0
|
5 # = JSON Encoder
|
Chris@0
|
6 class JSON < Encoder
|
Chris@0
|
7
|
Chris@0
|
8 register_for :json
|
Chris@0
|
9 FILE_EXTENSION = 'json'
|
Chris@0
|
10
|
Chris@0
|
11 protected
|
Chris@0
|
12 def setup options
|
Chris@0
|
13 begin
|
Chris@0
|
14 require 'json'
|
Chris@0
|
15 rescue LoadError
|
Chris@0
|
16 require 'rubygems'
|
Chris@0
|
17 require 'json'
|
Chris@0
|
18 end
|
Chris@0
|
19 @out = []
|
Chris@0
|
20 end
|
Chris@0
|
21
|
Chris@0
|
22 def text_token text, kind
|
Chris@0
|
23 { :type => 'text', :text => text, :kind => kind }
|
Chris@0
|
24 end
|
Chris@0
|
25
|
Chris@0
|
26 def block_token action, kind
|
Chris@0
|
27 { :type => 'block', :action => action, :kind => kind }
|
Chris@0
|
28 end
|
Chris@0
|
29
|
Chris@0
|
30 def finish options
|
Chris@0
|
31 @out.to_json
|
Chris@0
|
32 end
|
Chris@0
|
33
|
Chris@0
|
34 end
|
Chris@0
|
35
|
Chris@0
|
36 end
|
Chris@0
|
37 end
|
Chris@0
|
38
|
Chris@0
|
39 if $0 == __FILE__
|
Chris@0
|
40 $VERBOSE = true
|
Chris@0
|
41 $: << File.join(File.dirname(__FILE__), '..')
|
Chris@0
|
42 eval DATA.read, nil, $0, __LINE__ + 4
|
Chris@0
|
43 end
|
Chris@0
|
44
|
Chris@0
|
45 __END__
|
Chris@0
|
46 require 'test/unit'
|
Chris@0
|
47 $:.delete '.'
|
Chris@0
|
48 require 'rubygems' if RUBY_VERSION < '1.9'
|
Chris@0
|
49
|
Chris@0
|
50 class JSONEncoderTest < Test::Unit::TestCase
|
Chris@0
|
51
|
Chris@0
|
52 def test_json_output
|
Chris@0
|
53 tokens = CodeRay.scan <<-RUBY, :ruby
|
Chris@0
|
54 puts "Hello world!"
|
Chris@0
|
55 RUBY
|
Chris@0
|
56 require 'json'
|
Chris@0
|
57 assert_equal [
|
Chris@0
|
58 {"type"=>"text", "text"=>"puts", "kind"=>"ident"},
|
Chris@0
|
59 {"type"=>"text", "text"=>" ", "kind"=>"space"},
|
Chris@0
|
60 {"type"=>"block", "action"=>"open", "kind"=>"string"},
|
Chris@0
|
61 {"type"=>"text", "text"=>"\"", "kind"=>"delimiter"},
|
Chris@0
|
62 {"type"=>"text", "text"=>"Hello world!", "kind"=>"content"},
|
Chris@0
|
63 {"type"=>"text", "text"=>"\"", "kind"=>"delimiter"},
|
Chris@0
|
64 {"type"=>"block", "action"=>"close", "kind"=>"string"},
|
Chris@0
|
65 {"type"=>"text", "text"=>"\n", "kind"=>"space"}
|
Chris@0
|
66 ], JSON.load(tokens.json)
|
Chris@0
|
67 end
|
Chris@0
|
68
|
Chris@0
|
69 end |