Chris@0: ($:.unshift '../..'; require 'coderay') unless defined? CodeRay Chris@0: module CodeRay Chris@0: module Encoders Chris@0: Chris@0: # = JSON Encoder Chris@0: class JSON < Encoder Chris@0: Chris@0: register_for :json Chris@0: FILE_EXTENSION = 'json' Chris@0: Chris@0: protected Chris@0: def setup options Chris@0: begin Chris@0: require 'json' Chris@0: rescue LoadError Chris@0: require 'rubygems' Chris@0: require 'json' Chris@0: end Chris@0: @out = [] Chris@0: end Chris@0: Chris@0: def text_token text, kind Chris@0: { :type => 'text', :text => text, :kind => kind } Chris@0: end Chris@0: Chris@0: def block_token action, kind Chris@0: { :type => 'block', :action => action, :kind => kind } Chris@0: end Chris@0: Chris@0: def finish options Chris@0: @out.to_json Chris@0: end Chris@0: Chris@0: end Chris@0: Chris@0: end Chris@0: end Chris@0: Chris@0: if $0 == __FILE__ Chris@0: $VERBOSE = true Chris@0: $: << File.join(File.dirname(__FILE__), '..') Chris@0: eval DATA.read, nil, $0, __LINE__ + 4 Chris@0: end Chris@0: Chris@0: __END__ Chris@0: require 'test/unit' Chris@0: $:.delete '.' Chris@0: require 'rubygems' if RUBY_VERSION < '1.9' Chris@0: Chris@0: class JSONEncoderTest < Test::Unit::TestCase Chris@0: Chris@0: def test_json_output Chris@0: tokens = CodeRay.scan <<-RUBY, :ruby Chris@0: puts "Hello world!" Chris@0: RUBY Chris@0: require 'json' Chris@0: assert_equal [ Chris@0: {"type"=>"text", "text"=>"puts", "kind"=>"ident"}, Chris@0: {"type"=>"text", "text"=>" ", "kind"=>"space"}, Chris@0: {"type"=>"block", "action"=>"open", "kind"=>"string"}, Chris@0: {"type"=>"text", "text"=>"\"", "kind"=>"delimiter"}, Chris@0: {"type"=>"text", "text"=>"Hello world!", "kind"=>"content"}, Chris@0: {"type"=>"text", "text"=>"\"", "kind"=>"delimiter"}, Chris@0: {"type"=>"block", "action"=>"close", "kind"=>"string"}, Chris@0: {"type"=>"text", "text"=>"\n", "kind"=>"space"} Chris@0: ], JSON.load(tokens.json) Chris@0: end Chris@0: Chris@0: end