initial commit
[gitredmine.git] / vendor / plugins / coderay-0.7.6.227 / lib / coderay / encoders / .svn / text-base / xml.rb.svn-base
blobdffa98c360d7c808799cc03f93b3b38f40bf4099
1 module CodeRay
2 module Encoders
4   # = XML Encoder
5   #
6   # Uses REXML. Very slow.
7   class XML < Encoder
9     include Streamable
10     register_for :xml
12     FILE_EXTENSION = 'xml'
14     require 'rexml/document'
16     DEFAULT_OPTIONS = {
17       :tab_width => 8,
18       :pretty => -1,
19       :transitive => false,
20     }
22   protected
24     def setup options
25       @doc = REXML::Document.new
26       @doc << REXML::XMLDecl.new
27       @tab_width = options[:tab_width]
28       @root = @node = @doc.add_element('coderay-tokens')
29     end
31     def finish options
32       @doc.write @out, options[:pretty], options[:transitive], true
33       @out
34     end
35     
36     def text_token text, kind
37       if kind == :space
38         token = @node
39       else
40         token = @node.add_element kind.to_s
41       end
42       text.scan(/(\x20+)|(\t+)|(\n)|[^\x20\t\n]+/) do |space, tab, nl|
43         case
44         when space
45           token << REXML::Text.new(space, true)
46         when tab
47           token << REXML::Text.new(tab, true)
48         when nl
49           token << REXML::Text.new(nl, true)
50         else
51           token << REXML::Text.new($&)
52         end
53       end
54     end
56     def open_token kind
57       @node = @node.add_element kind.to_s
58     end
60     def close_token kind
61       if @node == @root
62         raise 'no token to close!'
63       end
64       @node = @node.parent
65     end
67   end
69 end
70 end