coderay 0.7.1.147 → 0.7.2.165
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/coderay +54 -56
- data/demo/suite.rb +54 -54
- data/lib/coderay.rb +187 -187
- data/lib/coderay/duo.rb +29 -29
- data/lib/coderay/encoder.rb +173 -173
- data/lib/coderay/encoders/_map.rb +8 -8
- data/lib/coderay/encoders/count.rb +21 -21
- data/lib/coderay/encoders/debug.rb +46 -46
- data/lib/coderay/encoders/div.rb +20 -20
- data/lib/coderay/encoders/html.rb +249 -245
- data/lib/coderay/encoders/html/classes.rb +73 -73
- data/lib/coderay/encoders/html/css.rb +65 -65
- data/lib/coderay/encoders/html/numerization.rb +122 -122
- data/lib/coderay/encoders/html/output.rb +195 -195
- data/lib/coderay/encoders/null.rb +26 -26
- data/lib/coderay/encoders/page.rb +21 -21
- data/lib/coderay/encoders/span.rb +20 -20
- data/lib/coderay/encoders/statistic.rb +81 -81
- data/lib/coderay/encoders/text.rb +33 -33
- data/lib/coderay/encoders/tokens.rb +44 -44
- data/lib/coderay/encoders/xml.rb +71 -71
- data/lib/coderay/encoders/yaml.rb +22 -22
- data/lib/coderay/helpers/filetype.rb +152 -153
- data/lib/coderay/helpers/gzip_simple.rb +67 -68
- data/lib/coderay/helpers/plugin.rb +297 -297
- data/lib/coderay/helpers/word_list.rb +46 -47
- data/lib/coderay/scanner.rb +238 -238
- data/lib/coderay/scanners/_map.rb +15 -14
- data/lib/coderay/scanners/c.rb +163 -155
- data/lib/coderay/scanners/delphi.rb +131 -129
- data/lib/coderay/scanners/html.rb +174 -167
- data/lib/coderay/scanners/nitro_xhtml.rb +130 -0
- data/lib/coderay/scanners/plaintext.rb +15 -15
- data/lib/coderay/scanners/rhtml.rb +73 -65
- data/lib/coderay/scanners/ruby.rb +404 -397
- data/lib/coderay/scanners/ruby/patterns.rb +216 -216
- data/lib/coderay/scanners/xml.rb +18 -18
- data/lib/coderay/style.rb +20 -20
- data/lib/coderay/styles/_map.rb +3 -3
- data/lib/coderay/styles/cycnus.rb +18 -18
- data/lib/coderay/styles/murphy.rb +18 -18
- data/lib/coderay/tokens.rb +322 -322
- metadata +86 -86
- data/lib/coderay/scanners/nitro_html.rb +0 -125
- data/lib/coderay/scanners/yaml.rb +0 -85
| @@ -1,20 +1,20 @@ | |
| 1 | 
            -
            module CodeRay
         | 
| 2 | 
            -
            module Encoders
         | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
            end
         | 
| 20 | 
            -
            end
         | 
| 1 | 
            +
            module CodeRay
         | 
| 2 | 
            +
            module Encoders
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              load :html
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              class Span < HTML
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                FILE_EXTENSION = 'span.html'
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                register_for :span
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                DEFAULT_OPTIONS = HTML::DEFAULT_OPTIONS.merge({
         | 
| 13 | 
            +
                  :css => :style,
         | 
| 14 | 
            +
                  :wrap => :span,
         | 
| 15 | 
            +
                })
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            end
         | 
| 20 | 
            +
            end
         | 
| @@ -1,81 +1,81 @@ | |
| 1 | 
            -
            module CodeRay
         | 
| 2 | 
            -
            module Encoders
         | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
            Code Statistics
         | 
| 47 | 
            -
             | 
| 48 | 
            -
            Tokens            %8d
         | 
| 49 | 
            -
              Non-Whitespace  %8d
         | 
| 50 | 
            -
            Bytes Total       %8d
         | 
| 51 | 
            -
             | 
| 52 | 
            -
            Token Types (%d):
         | 
| 53 | 
            -
              type                     count     ratio    size (average)
         | 
| 54 | 
            -
            -------------------------------------------------------------
         | 
| 55 | 
            -
            %s
         | 
| 56 | 
            -
             | 
| 57 | 
            -
            # space                    12007   33.81 %     1.7
         | 
| 58 | 
            -
             | 
| 59 | 
            -
              %-20s  %8d  %6.2f %%   %5.1f
         | 
| 60 | 
            -
             | 
| 61 | 
            -
             | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
             | 
| 65 | 
            -
             | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
             | 
| 71 | 
            -
             | 
| 72 | 
            -
             | 
| 73 | 
            -
             | 
| 74 | 
            -
             | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 80 | 
            -
            end
         | 
| 81 | 
            -
            end
         | 
| 1 | 
            +
            module CodeRay
         | 
| 2 | 
            +
            module Encoders
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              # Makes a statistic for the given tokens.
         | 
| 5 | 
            +
              class Statistic < Encoder
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                include Streamable
         | 
| 8 | 
            +
                register_for :stats, :statistic
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                attr_reader :type_stats, :real_token_count
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              protected
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                TypeStats = Struct.new :count, :size
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def setup options
         | 
| 17 | 
            +
                  @type_stats = Hash.new { |h, k| h[k] = TypeStats.new 0, 0 }
         | 
| 18 | 
            +
                  @real_token_count = 0
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                def generate tokens, options
         | 
| 22 | 
            +
                  @tokens = tokens
         | 
| 23 | 
            +
                  super
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def text_token text, kind
         | 
| 27 | 
            +
                  @real_token_count += 1 unless kind == :space
         | 
| 28 | 
            +
                  @type_stats[kind].count += 1
         | 
| 29 | 
            +
                  @type_stats[kind].size += text.size
         | 
| 30 | 
            +
                  @type_stats['TOTAL'].size += text.size
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                # TODO Hierarchy handling
         | 
| 34 | 
            +
                def block_token action, kind
         | 
| 35 | 
            +
                  #@content_type = kind
         | 
| 36 | 
            +
                  @type_stats['open/close'].count += 1
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                def token text, kind
         | 
| 40 | 
            +
                  super
         | 
| 41 | 
            +
                  @type_stats['TOTAL'].count += 1
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                STATS = <<-STATS
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            Code Statistics
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            Tokens            %8d
         | 
| 49 | 
            +
              Non-Whitespace  %8d
         | 
| 50 | 
            +
            Bytes Total       %8d
         | 
| 51 | 
            +
             | 
| 52 | 
            +
            Token Types (%d):
         | 
| 53 | 
            +
              type                     count     ratio    size (average)
         | 
| 54 | 
            +
            -------------------------------------------------------------
         | 
| 55 | 
            +
            %s
         | 
| 56 | 
            +
                  STATS
         | 
| 57 | 
            +
            # space                    12007   33.81 %     1.7
         | 
| 58 | 
            +
                TOKEN_TYPES_ROW = <<-TKR
         | 
| 59 | 
            +
              %-20s  %8d  %6.2f %%   %5.1f
         | 
| 60 | 
            +
                  TKR
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                def finish options
         | 
| 63 | 
            +
                  all = @type_stats['TOTAL']
         | 
| 64 | 
            +
                  all_count, all_size = all.count, all.size
         | 
| 65 | 
            +
                  @type_stats.each do |type, stat|
         | 
| 66 | 
            +
                    stat.size /= stat.count.to_f
         | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
                  types_stats = @type_stats.sort_by { |k, v| [-v.count, k.to_s] }.map do |k, v|
         | 
| 69 | 
            +
                    TOKEN_TYPES_ROW % [k, v.count, 100.0 * v.count / all_count, v.size]
         | 
| 70 | 
            +
                  end.join
         | 
| 71 | 
            +
                  STATS % [
         | 
| 72 | 
            +
                    all_count, @real_token_count, all_size,
         | 
| 73 | 
            +
                    @type_stats.delete_if { |k, v| k.is_a? String }.size,
         | 
| 74 | 
            +
                    types_stats
         | 
| 75 | 
            +
                  ]
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
            end
         | 
| 81 | 
            +
            end
         | 
| @@ -1,33 +1,33 @@ | |
| 1 | 
            -
            module CodeRay
         | 
| 2 | 
            -
            module Encoders
         | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
            end
         | 
| 33 | 
            -
            end
         | 
| 1 | 
            +
            module CodeRay
         | 
| 2 | 
            +
            module Encoders
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              class Text < Encoder
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                include Streamable
         | 
| 7 | 
            +
                register_for :text
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                FILE_EXTENSION = 'txt'
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                DEFAULT_OPTIONS = {
         | 
| 12 | 
            +
                  :separator => ''
         | 
| 13 | 
            +
                }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              protected
         | 
| 16 | 
            +
                def setup options
         | 
| 17 | 
            +
                  super
         | 
| 18 | 
            +
                  @sep = options[:separator]
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                def token text, kind
         | 
| 22 | 
            +
                  return unless text.respond_to? :to_str
         | 
| 23 | 
            +
                  @out << text + @sep
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def finish options
         | 
| 27 | 
            +
                  @out.chomp @sep
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            end
         | 
| 33 | 
            +
            end
         | 
| @@ -1,44 +1,44 @@ | |
| 1 | 
            -
            module CodeRay
         | 
| 2 | 
            -
            module Encoders
         | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
            end
         | 
| 44 | 
            -
            end
         | 
| 1 | 
            +
            module CodeRay
         | 
| 2 | 
            +
            module Encoders
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              # The Tokens encoder converts the tokens to a simple
         | 
| 5 | 
            +
              # readable format. It doesn't use colors and is mainly
         | 
| 6 | 
            +
              # intended for console output.
         | 
| 7 | 
            +
              #
         | 
| 8 | 
            +
              # The tokens are converted with Tokens.write_token.
         | 
| 9 | 
            +
              #
         | 
| 10 | 
            +
              # The format is:
         | 
| 11 | 
            +
              #
         | 
| 12 | 
            +
              #   <token-kind> \t <escaped token-text> \n
         | 
| 13 | 
            +
              #
         | 
| 14 | 
            +
              # Example:
         | 
| 15 | 
            +
              #
         | 
| 16 | 
            +
              #   require 'coderay'
         | 
| 17 | 
            +
              #   puts CodeRay.scan("puts 3 + 4", :ruby).tokens
         | 
| 18 | 
            +
              #
         | 
| 19 | 
            +
              # prints:
         | 
| 20 | 
            +
              #
         | 
| 21 | 
            +
              #   ident   puts
         | 
| 22 | 
            +
              #   space
         | 
| 23 | 
            +
              #   integer 3
         | 
| 24 | 
            +
              #   space
         | 
| 25 | 
            +
              #   operator        +
         | 
| 26 | 
            +
              #   space
         | 
| 27 | 
            +
              #   integer 4
         | 
| 28 | 
            +
              #
         | 
| 29 | 
            +
              class Tokens < Encoder
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                include Streamable
         | 
| 32 | 
            +
                register_for :tokens
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                FILE_EXTENSION = 'tok'
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                protected
         | 
| 37 | 
            +
                def token *args
         | 
| 38 | 
            +
                  @out << CodeRay::Tokens.write_token(*args)
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            end
         | 
| 44 | 
            +
            end
         | 
    
        data/lib/coderay/encoders/xml.rb
    CHANGED
    
    | @@ -1,71 +1,71 @@ | |
| 1 | 
            -
            module CodeRay
         | 
| 2 | 
            -
            module Encoders
         | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 61 | 
            -
             | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
             | 
| 65 | 
            -
             | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
            end
         | 
| 71 | 
            -
            end
         | 
| 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 | 
            +
                  @out = ''
         | 
| 26 | 
            +
                  @doc = REXML::Document.new
         | 
| 27 | 
            +
                  @doc << REXML::XMLDecl.new
         | 
| 28 | 
            +
                  @tab_width = options[:tab_width]
         | 
| 29 | 
            +
                  @root = @node = @doc.add_element('coderay-tokens')
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                def finish options
         | 
| 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
         |