Class: CodeRay::Encoders::Encoder

Inherits:
Object
  • Object
show all
Extended by:
Plugin
Defined in:
lib/coderay/encoder.rb

Overview

Encoder

The Encoder base class. Together with Scanner and Tokens, it forms the highlighting triad.

Encoder instances take a Tokens object and do something with it.

The most common Encoder is surely the HTML encoder (CodeRay::Encoders::HTML). It highlights the code in a colorful html page. If you want the highlighted code in a div or a span instead, use its subclasses Div and Span.

Direct Known Subclasses

Count, Debug, Filter, HTML, JSON, Null, Statistic, Terminal, Text, XML, YAML

Constant Summary collapse

DEFAULT_OPTIONS =

Subclasses are to store their default options in this constant.

{ }

Instance Attribute Summary collapse

Attributes included from Plugin

#plugin_id

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Plugin

aliases, plugin_host, register_for, title

Constructor Details

#initialize(options = {}) ⇒ Encoder

Creates a new Encoder. options is saved and used for all encode operations, as long as you don’t overwrite it there by passing additional options.

Encoder objects provide three encode methods:

  • encode simply takes a code string and a lang

  • encode_tokens expects a tokens object instead

Each method has an optional options parameter. These are added to the options you passed at creation.



66
67
68
69
# File 'lib/coderay/encoder.rb', line 66

def initialize options = {}
  @options = self.class::DEFAULT_OPTIONS.merge options
  @@CODERAY_TOKEN_INTERFACE_DEPRECATION_WARNING_GIVEN = false
end

Instance Attribute Details

#optionsObject

The options you gave the Encoder at creating.



54
55
56
# File 'lib/coderay/encoder.rb', line 54

def options
  @options
end

#scannerObject

The options you gave the Encoder at creating.



54
55
56
# File 'lib/coderay/encoder.rb', line 54

def scanner
  @scanner
end

Class Method Details

.const_missing(sym) ⇒ Object

If FILE_EXTENSION isn’t defined, this method returns the downcase class name instead.



35
36
37
38
39
40
41
# File 'lib/coderay/encoder.rb', line 35

def const_missing sym
  if sym == :FILE_EXTENSION
    (defined?(@plugin_id) && @plugin_id || name[/\w+$/].downcase).to_s
  else
    super
  end
end

.file_extensionObject

The default file extension for output file of this encoder class.



44
45
46
# File 'lib/coderay/encoder.rb', line 44

def file_extension
  self::FILE_EXTENSION
end

Instance Method Details

#<<(token) ⇒ Object



98
99
100
101
102
103
104
# File 'lib/coderay/encoder.rb', line 98

def << token
  unless @@CODERAY_TOKEN_INTERFACE_DEPRECATION_WARNING_GIVEN
    warn 'Using old Tokens#<< interface.'
    @@CODERAY_TOKEN_INTERFACE_DEPRECATION_WARNING_GIVEN = true
  end
  self.token(*token)
end

#begin_group(kind) ⇒ Object

Starts a token group with the given kind.



134
135
# File 'lib/coderay/encoder.rb', line 134

def begin_group kind
end

#begin_line(kind) ⇒ Object

Starts a new line token group with the given kind.



142
143
# File 'lib/coderay/encoder.rb', line 142

def begin_line kind
end

#encode(code, lang, options = {}) ⇒ Object Also known as: highlight

Encode the given code using the Scanner for lang.



81
82
83
84
85
86
87
# File 'lib/coderay/encoder.rb', line 81

def encode code, lang, options = {}
  options = @options.merge options
  @scanner = Scanners[lang].new code, CodeRay.get_scanner_options(options).update(:tokens => self)
  setup options
  @scanner.tokenize
  finish options
end

#encode_tokens(tokens, options = {}) ⇒ Object

Encode a Tokens object.



72
73
74
75
76
77
78
# File 'lib/coderay/encoder.rb', line 72

def encode_tokens tokens, options = {}
  options = @options.merge options
  @scanner = tokens.scanner if tokens.respond_to? :scanner
  setup options
  compile tokens, options
  finish options
end

#end_group(kind) ⇒ Object

Ends a token group with the given kind.



138
139
# File 'lib/coderay/encoder.rb', line 138

def end_group kind
end

#end_line(kind) ⇒ Object

Ends a new line token group with the given kind.



146
147
# File 'lib/coderay/encoder.rb', line 146

def end_line kind
end

#file_extensionObject

The default file extension for this encoder.



94
95
96
# File 'lib/coderay/encoder.rb', line 94

def file_extension
  self.class.file_extension
end

#text_token(text, kind) ⇒ Object

Called for each text token ([text, kind]), where text is a String.



129
130
131
# File 'lib/coderay/encoder.rb', line 129

def text_token text, kind
  @out << text
end

#token(content, kind) ⇒ Object

Called with content and kind of the currently scanned token. For simple scanners, it’s enougth to implement this method.

By default, it calls text_token, begin_group, end_group, begin_line, or end_line, depending on the content.



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/coderay/encoder.rb', line 111

def token content, kind
  case content
  when String
    text_token content, kind
  when :begin_group
    begin_group kind
  when :end_group
    end_group kind
  when :begin_line
    begin_line kind
  when :end_line
    end_line kind
  else
    raise ArgumentError, 'Unknown token content type: %p, kind = %p' % [content, kind]
  end
end