summaryrefslogtreecommitdiff
path: root/jni/ruby/lib/rdoc/token_stream.rb
diff options
context:
space:
mode:
authorJari Vetoniemi <jari.vetoniemi@indooratlas.com>2020-03-16 18:49:26 +0900
committerJari Vetoniemi <jari.vetoniemi@indooratlas.com>2020-03-30 00:39:06 +0900
commitfcbf63e62c627deae76c1b8cb8c0876c536ed811 (patch)
tree64cb17de3f41a2b6fef2368028fbd00349946994 /jni/ruby/lib/rdoc/token_stream.rb
Fresh start
Diffstat (limited to 'jni/ruby/lib/rdoc/token_stream.rb')
-rw-r--r--jni/ruby/lib/rdoc/token_stream.rb95
1 files changed, 95 insertions, 0 deletions
diff --git a/jni/ruby/lib/rdoc/token_stream.rb b/jni/ruby/lib/rdoc/token_stream.rb
new file mode 100644
index 0000000..b46b7da
--- /dev/null
+++ b/jni/ruby/lib/rdoc/token_stream.rb
@@ -0,0 +1,95 @@
+##
+# 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.
+
+module RDoc::TokenStream
+
+ ##
+ # Converts +token_stream+ to HTML wrapping various tokens with
+ # <tt><span></tt> elements. The following tokens types are wrapped in spans
+ # with the given class names:
+ #
+ # TkCONSTANT :: 'ruby-constant'
+ # TkKW :: 'ruby-keyword'
+ # TkIVAR :: 'ruby-ivar'
+ # TkOp :: 'ruby-operator'
+ # TkId :: 'ruby-identifier'
+ # TkNode :: 'ruby-node'
+ # TkCOMMENT :: 'ruby-comment'
+ # TkREGEXP :: 'ruby-regexp'
+ # TkSTRING :: 'ruby-string'
+ # TkVal :: 'ruby-value'
+ #
+ # Other token types are not wrapped in spans.
+
+ def self.to_html token_stream
+ token_stream.map do |t|
+ next unless t
+
+ style = case t
+ when RDoc::RubyToken::TkCONSTANT then 'ruby-constant'
+ when RDoc::RubyToken::TkKW then 'ruby-keyword'
+ when RDoc::RubyToken::TkIVAR then 'ruby-ivar'
+ when RDoc::RubyToken::TkOp then 'ruby-operator'
+ when RDoc::RubyToken::TkId then 'ruby-identifier'
+ when RDoc::RubyToken::TkNode then 'ruby-node'
+ when RDoc::RubyToken::TkCOMMENT then 'ruby-comment'
+ when RDoc::RubyToken::TkREGEXP then 'ruby-regexp'
+ when RDoc::RubyToken::TkSTRING then 'ruby-string'
+ when RDoc::RubyToken::TkVal then 'ruby-value'
+ end
+
+ text = CGI.escapeHTML t.text
+
+ if style then
+ "<span class=\"#{style}\">#{text}</span>"
+ else
+ text
+ end
+ end.join
+ end
+
+ ##
+ # Adds +tokens+ to the collected tokens
+
+ def add_tokens(*tokens)
+ tokens.flatten.each { |token| @token_stream << token }
+ end
+
+ alias add_token add_tokens
+
+ ##
+ # Starts collecting tokens
+
+ def collect_tokens
+ @token_stream = []
+ end
+
+ alias start_collecting_tokens collect_tokens
+
+ ##
+ # Remove the last token from the collected tokens
+
+ def pop_token
+ @token_stream.pop
+ end
+
+ ##
+ # Current token stream
+
+ def token_stream
+ @token_stream
+ end
+
+ ##
+ # Returns a string representation of the token stream
+
+ def tokens_to_s
+ token_stream.compact.map { |token| token.text }.join ''
+ end
+
+end
+