Chris@909
|
1 module CodeRay
|
Chris@909
|
2 module Encoders
|
Chris@909
|
3
|
Chris@909
|
4 # A simple JSON Encoder.
|
Chris@909
|
5 #
|
Chris@909
|
6 # Example:
|
Chris@909
|
7 # CodeRay.scan('puts "Hello world!"', :ruby).json
|
Chris@909
|
8 # yields
|
Chris@909
|
9 # [
|
Chris@909
|
10 # {"type"=>"text", "text"=>"puts", "kind"=>"ident"},
|
Chris@909
|
11 # {"type"=>"text", "text"=>" ", "kind"=>"space"},
|
Chris@909
|
12 # {"type"=>"block", "action"=>"open", "kind"=>"string"},
|
Chris@909
|
13 # {"type"=>"text", "text"=>"\"", "kind"=>"delimiter"},
|
Chris@909
|
14 # {"type"=>"text", "text"=>"Hello world!", "kind"=>"content"},
|
Chris@909
|
15 # {"type"=>"text", "text"=>"\"", "kind"=>"delimiter"},
|
Chris@909
|
16 # {"type"=>"block", "action"=>"close", "kind"=>"string"},
|
Chris@909
|
17 # ]
|
Chris@909
|
18 class JSON < Encoder
|
Chris@909
|
19
|
Chris@909
|
20 begin
|
Chris@909
|
21 require 'json'
|
Chris@909
|
22 rescue LoadError
|
Chris@909
|
23 begin
|
Chris@909
|
24 require 'rubygems' unless defined? Gem
|
Chris@909
|
25 gem 'json'
|
Chris@909
|
26 require 'json'
|
Chris@909
|
27 rescue LoadError
|
Chris@909
|
28 $stderr.puts "The JSON encoder needs the JSON library.\n" \
|
Chris@909
|
29 "Please gem install json."
|
Chris@909
|
30 raise
|
Chris@909
|
31 end
|
Chris@909
|
32 end
|
Chris@909
|
33
|
Chris@909
|
34 register_for :json
|
Chris@909
|
35 FILE_EXTENSION = 'json'
|
Chris@909
|
36
|
Chris@909
|
37 protected
|
Chris@909
|
38 def setup options
|
Chris@909
|
39 super
|
Chris@909
|
40
|
Chris@909
|
41 @first = true
|
Chris@909
|
42 @out << '['
|
Chris@909
|
43 end
|
Chris@909
|
44
|
Chris@909
|
45 def finish options
|
Chris@909
|
46 @out << ']'
|
Chris@909
|
47 end
|
Chris@909
|
48
|
Chris@909
|
49 def append data
|
Chris@909
|
50 if @first
|
Chris@909
|
51 @first = false
|
Chris@909
|
52 else
|
Chris@909
|
53 @out << ','
|
Chris@909
|
54 end
|
Chris@909
|
55
|
Chris@909
|
56 @out << data.to_json
|
Chris@909
|
57 end
|
Chris@909
|
58
|
Chris@909
|
59 public
|
Chris@909
|
60 def text_token text, kind
|
Chris@909
|
61 append :type => 'text', :text => text, :kind => kind
|
Chris@909
|
62 end
|
Chris@909
|
63
|
Chris@909
|
64 def begin_group kind
|
Chris@909
|
65 append :type => 'block', :action => 'open', :kind => kind
|
Chris@909
|
66 end
|
Chris@909
|
67
|
Chris@909
|
68 def end_group kind
|
Chris@909
|
69 append :type => 'block', :action => 'close', :kind => kind
|
Chris@909
|
70 end
|
Chris@909
|
71
|
Chris@909
|
72 def begin_line kind
|
Chris@909
|
73 append :type => 'block', :action => 'begin_line', :kind => kind
|
Chris@909
|
74 end
|
Chris@909
|
75
|
Chris@909
|
76 def end_line kind
|
Chris@909
|
77 append :type => 'block', :action => 'end_line', :kind => kind
|
Chris@909
|
78 end
|
Chris@909
|
79
|
Chris@909
|
80 end
|
Chris@909
|
81
|
Chris@909
|
82 end
|
Chris@909
|
83 end
|