annotate vendor/plugins/coderay-0.9.2/lib/coderay/encoders/xml.rb @ 877:e97cef3bd5d0 bug_70

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