Class: SyntaxHighlighter
- Inherits:
-
Object
- Object
- SyntaxHighlighter
- Defined in:
- lib/glimmer/libui/syntax_highlighter.rb
Instance Attribute Summary collapse
-
#language ⇒ Object
readonly
Returns the value of attribute language.
-
#theme ⇒ Object
readonly
Returns the value of attribute theme.
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize(language:, theme:) ⇒ SyntaxHighlighter
constructor
A new instance of SyntaxHighlighter.
- #lexer ⇒ Object
- #syntax_highlighting(text) ⇒ Object
Constructor Details
#initialize(language:, theme:) ⇒ SyntaxHighlighter
Returns a new instance of SyntaxHighlighter.
16 17 18 19 |
# File 'lib/glimmer/libui/syntax_highlighter.rb', line 16 def initialize(language:, theme:) @language = language @theme = theme end |
Instance Attribute Details
#language ⇒ Object (readonly)
Returns the value of attribute language.
14 15 16 |
# File 'lib/glimmer/libui/syntax_highlighter.rb', line 14 def language @language end |
#theme ⇒ Object (readonly)
Returns the value of attribute theme.
14 15 16 |
# File 'lib/glimmer/libui/syntax_highlighter.rb', line 14 def theme @theme end |
Class Method Details
.languages ⇒ Object
3 4 5 6 |
# File 'lib/glimmer/libui/syntax_highlighter.rb', line 3 def languages require 'rouge' Rouge::Lexer.all.map {|lexer| lexer.tag}.sort end |
.lexers ⇒ Object
8 9 10 11 |
# File 'lib/glimmer/libui/syntax_highlighter.rb', line 8 def lexers require 'rouge' Rouge::Lexer.all.sort_by(&:title) end |
Instance Method Details
#lexer ⇒ Object
21 22 23 24 25 26 27 |
# File 'lib/glimmer/libui/syntax_highlighter.rb', line 21 def lexer require 'rouge' require 'glimmer-dsl-libui/ext/rouge/theme/glimmer' # TODO Try to use Rouge::Lexer.find_fancy('guess', code) in the future to guess the language or otherwise detect it from file extension @lexer ||= Rouge::Lexer.find_fancy(language) @lexer ||= Rouge::Lexer.find_fancy('ruby') # default to Ruby if no lexer is found end |
#syntax_highlighting(text) ⇒ Object
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/glimmer/libui/syntax_highlighter.rb', line 29 def syntax_highlighting(text) return [] if text.to_s.strip.empty? @syntax_highlighting ||= {} # TODO consider memoizing/remembering the last value only to avoid wasting memory unless @syntax_highlighting.keys.include?(text) lex = lexer.lex(text).to_a text_size = 0 @syntax_highlighting[text] = lex.map do |pair| token_type = pair.first token_text = pair.last token_style = Rouge::Theme.find(theme).new.style_for(token_type) {token_type: token_type, token_text: token_text, token_style: token_style} end.each do |hash| hash[:token_index] = text_size # TODO do we really need this? Also, consider renaming to something like token_character_index to clarify it is not the index of the token itself yet its first character text_size += hash[:token_text].size end end @syntax_highlighting[text] end |