comparison vendor/plugins/coderay-0.9.2/lib/coderay/encoders/.svn/text-base/xml.rb.svn-base @ 0:513646585e45

* Import Redmine trunk SVN rev 3859
author Chris Cannam
date Fri, 23 Jul 2010 15:52:44 +0100
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:513646585e45
1 module CodeRay
2 module Encoders
3
4 # = XML Encoder
5 #
6 # Uses REXML. Very slow.
7 class XML < Encoder
8
9 include Streamable
10 register_for :xml
11
12 FILE_EXTENSION = 'xml'
13
14 require 'rexml/document'
15
16 DEFAULT_OPTIONS = {
17 :tab_width => 8,
18 :pretty => -1,
19 :transitive => false,
20 }
21
22 protected
23
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
30
31 def finish options
32 @out = ''
33 @doc.write @out, options[:pretty], options[:transitive], true
34 @out
35 end
36
37 def text_token text, kind
38 if kind == :space
39 token = @node
40 else
41 token = @node.add_element kind.to_s
42 end
43 text.scan(/(\x20+)|(\t+)|(\n)|[^\x20\t\n]+/) do |space, tab, nl|
44 case
45 when space
46 token << REXML::Text.new(space, true)
47 when tab
48 token << REXML::Text.new(tab, true)
49 when nl
50 token << REXML::Text.new(nl, true)
51 else
52 token << REXML::Text.new($&)
53 end
54 end
55 end
56
57 def open_token kind
58 @node = @node.add_element kind.to_s
59 end
60
61 def close_token kind
62 if @node == @root
63 raise 'no token to close!'
64 end
65 @node = @node.parent
66 end
67
68 end
69
70 end
71 end