module RDoc::TokenStream

A TokenStream is a list of tokens, gathered during the parse of some entity (say a method). Entities populate these streams by being registered with the lexer. Any class can collect tokens by including TokenStream. From the outside, you use such an object by calling the start_collecting_tokens method, followed by calls to add_token and pop_token.

Public Class Methods

Converts token_stream to HTML wrapping various tokens with <span> elements. Some tokens types are wrapped in spans with the given class names. Other token types are not wrapped in spans.

# File lib/rdoc/token_stream.rb, line 18
def self.to_html(token_stream)
  token_stream.map do |t|
    next unless t

    style = case t[:kind]
            when :operator   then 'ruby-operator'
            when :keyword    then 'ruby-keyword'
            when :constant   then 'ruby-constant'
            when :ivar       then 'ruby-ivar'
            when :comment    then 'ruby-comment'
            when :value      then 'ruby-value'
            when :string     then 'ruby-string'
            when :symbol     then 'ruby-value'
            when :x_string   then 'ruby-string'
            when :regexp     then 'ruby-regexp'
            when :identifier then 'ruby-identifier'
            end

    text = t[:text]

    text = CGI.escapeHTML text

    if style
      end_with_newline = text.end_with?("\n")
      text = text.chomp if end_with_newline
      "<span class=\"#{style}\">#{text}</span>#{"\n" if end_with_newline}"
    else
      text
    end
  end.join
end

Public Instance Methods

Adds one token to the collected tokens

# File lib/rdoc/token_stream.rb, line 60
def add_token(token)
  token_stream.push(token)
end

Adds tokens to the collected tokens

# File lib/rdoc/token_stream.rb, line 53
def add_tokens(tokens)
  token_stream.concat(tokens)
end

Starts collecting tokens

The optional loader is called once on first access and its result is reused.

# File lib/rdoc/token_stream.rb, line 69
def collect_tokens(language, loader: nil)
  @token_stream = []
  @token_stream_loader = loader
  @token_stream_language = language
end
Also aliased as: start_collecting_tokens

Remove the last token from the collected tokens

# File lib/rdoc/token_stream.rb, line 80
def pop_token
  token_stream.pop
end

Returns the source language of the token stream as a string

Returns ‘c’ or ‘ruby’

# File lib/rdoc/token_stream.rb, line 107
def source_language
  @token_stream_language == :c ? 'c' : 'ruby'
end

Current token stream

# File lib/rdoc/token_stream.rb, line 87
def token_stream
  if @token_stream_loader
    @token_stream = @token_stream_loader.call
    @token_stream_loader = nil
  end
  @token_stream
end

Returns a string representation of the token stream

# File lib/rdoc/token_stream.rb, line 98
def tokens_to_s
  (token_stream or return '').compact.map { |token| token[:text] }.join ''
end