Class: RubyRich::Syntax

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_rich/syntax.rb

Defined Under Namespace

Classes: AnsiFormatter

Constant Summary collapse

LANGUAGE_ALIASES =

支持的语言别名映射

{
  'rb' => 'ruby',
  'py' => 'python',
  'js' => 'javascript',
  'ts' => 'typescript',
  'sh' => 'shell',
  'bash' => 'shell',
  'zsh' => 'shell',
  'yml' => 'yaml',
  'md' => 'markdown'
}.freeze
THEME_COLORS =

语法高亮主题颜色映射

{
  # Rouge token types to ANSI colors
  'Comment' => "\e[90m",           # Bright black (gray)
  'Comment.Single' => "\e[90m",
  'Comment.Multiline' => "\e[90m",
  'Comment.Preproc' => "\e[95m",   # Bright magenta
  
  'Keyword' => "\e[94m",           # Bright blue
  'Keyword.Constant' => "\e[94m",
  'Keyword.Declaration' => "\e[94m",
  'Keyword.Namespace' => "\e[94m",
  'Keyword.Pseudo' => "\e[94m",
  'Keyword.Reserved' => "\e[94m",
  'Keyword.Type' => "\e[94m",
  
  'Literal' => "\e[96m",           # Bright cyan
  'Literal.Date' => "\e[96m",
  'Literal.Number' => "\e[93m",    # Bright yellow
  'Literal.Number.Bin' => "\e[93m",
  'Literal.Number.Float' => "\e[93m",
  'Literal.Number.Hex' => "\e[93m",
  'Literal.Number.Integer' => "\e[93m",
  'Literal.Number.Oct' => "\e[93m",
  
  'Literal.String' => "\e[92m",    # Bright green
  'Literal.String.Affix' => "\e[92m",
  'Literal.String.Backtick' => "\e[92m",
  'Literal.String.Char' => "\e[92m",
  'Literal.String.Doc' => "\e[92m",
  'Literal.String.Double' => "\e[92m",
  'Literal.String.Escape' => "\e[96m",
  'Literal.String.Heredoc' => "\e[92m",
  'Literal.String.Interpol' => "\e[96m",
  'Literal.String.Other' => "\e[92m",
  'Literal.String.Regex' => "\e[91m",  # Bright red
  'Literal.String.Single' => "\e[92m",
  'Literal.String.Symbol' => "\e[95m", # Bright magenta
  
  'Name' => "\e[97m",              # Bright white
  'Name.Attribute' => "\e[93m",    # Bright yellow
  'Name.Builtin' => "\e[96m",      # Bright cyan
  'Name.Builtin.Pseudo' => "\e[96m",
  'Name.Class' => "\e[93m",        # Bright yellow
  'Name.Constant' => "\e[93m",
  'Name.Decorator' => "\e[95m",    # Bright magenta
  'Name.Entity' => "\e[93m",
  'Name.Exception' => "\e[91m",    # Bright red
  'Name.Function' => "\e[96m",     # Bright cyan
  'Name.Property' => "\e[96m",
  'Name.Label' => "\e[95m",
  'Name.Namespace' => "\e[93m",
  'Name.Other' => "\e[97m",
  'Name.Tag' => "\e[94m",          # Bright blue
  'Name.Variable' => "\e[97m",
  'Name.Variable.Class' => "\e[97m",
  'Name.Variable.Global' => "\e[97m",
  'Name.Variable.Instance' => "\e[97m",
  
  'Operator' => "\e[91m",          # Bright red
  'Operator.Word' => "\e[94m",     # Bright blue
  
  'Punctuation' => "\e[97m",       # Bright white
  
  'Error' => "\e[101m\e[97m",      # Red background, white text
  'Generic.Deleted' => "\e[91m",   # Bright red
  'Generic.Emph' => "\e[3m",       # Italic
  'Generic.Error' => "\e[91m",     # Bright red
  'Generic.Heading' => "\e[1m\e[94m", # Bold bright blue
  'Generic.Inserted' => "\e[92m",  # Bright green
  'Generic.Output' => "\e[90m",    # Bright black (gray)
  'Generic.Prompt' => "\e[1m",     # Bold
  'Generic.Strong' => "\e[1m",     # Bold
  'Generic.Subheading' => "\e[95m", # Bright magenta
  'Generic.Traceback' => "\e[91m"  # Bright red
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(theme: :default) ⇒ Syntax

Returns a new instance of Syntax.



99
100
101
# File 'lib/ruby_rich/syntax.rb', line 99

def initialize(theme: :default)
  @theme = theme
end

Class Method Details

.highlight(code, language = nil, theme: :default) ⇒ Object



95
96
97
# File 'lib/ruby_rich/syntax.rb', line 95

def self.highlight(code, language = nil, theme: :default)
  new(theme: theme).highlight(code, language)
end

Instance Method Details

#highlight(code, language = nil) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/ruby_rich/syntax.rb', line 103

def highlight(code, language = nil)
  return code if code.nil? || code.empty?
  
  # 检测或规范化语言
  language = detect_language(code) if language.nil?
  language = normalize_language(language) if language
  
  # 如果无法检测语言,返回原始代码
  return code unless language
  
  begin
    lexer = Rouge::Lexer.find(language)
    return code unless lexer
    
    # 使用自定义格式化器
    formatter = AnsiFormatter.new
    formatter.format(lexer.lex(code))
  rescue => e
    # 如果高亮失败,返回原始代码
    code
  end
end

#list_languagesObject



126
127
128
# File 'lib/ruby_rich/syntax.rb', line 126

def list_languages
  Rouge::Lexer.all.map(&:tag).sort
end