Module: Kramdown::Converter::SyntaxHighlighter::Coderay

Defined in:
lib/kramdown/converter/syntax_highlighter/coderay.rb

Overview

Uses Coderay to highlight code blocks and code spans.

Constant Summary collapse

VERSION =
'1.0.0'

Class Method Summary collapse

Class Method Details

.call(converter, text, lang, type, call_opts) ⇒ Object



108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/kramdown/converter/syntax_highlighter/coderay.rb', line 108

def self.call(converter, text, lang, type, call_opts)
  return nil unless converter.options[:enable_coderay]
  if type == :span && lang
    ::CodeRay.scan(text, lang.to_sym).html(options(converter, :span)).chomp
  elsif type == :block && (lang || options(converter, :default_lang))
    lang ||= call_opts[:default_lang] = options(converter, :default_lang)
    ::CodeRay.scan(text, lang.to_s.tr('-', '_').to_sym).html(options(converter, :block)).chomp << "\n"
  else
    nil
  end
rescue StandardError
  converter.warning("There was an error using CodeRay: #{$!.message}")
  nil
end

.options(converter, type) ⇒ Object



123
124
125
126
# File 'lib/kramdown/converter/syntax_highlighter/coderay.rb', line 123

def self.options(converter, type)
  prepare_options(converter)
  converter.data[:syntax_highlighter_coderay][type]
end

.prepare_options(converter) ⇒ Object



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'lib/kramdown/converter/syntax_highlighter/coderay.rb', line 128

def self.prepare_options(converter)
  return if converter.data.key?(:syntax_highlighter_coderay)

  cache = converter.data[:syntax_highlighter_coderay] = {}

  opts = converter.options[:syntax_highlighter_opts].dup
  span_opts = (opts.delete(:span) || {}).dup
  block_opts = (opts.delete(:block) || {}).dup
  [span_opts, block_opts].each do |hash|
    hash.keys.each do |k|
      hash[k.kind_of?(String) ? ::Kramdown::Options.str_to_sym(k) : k] = hash.delete(k)
    end
  end

  cache[:default_lang] = converter.options[:coderay_default_lang] || opts.delete(:default_lang)
  cache[:span] = {
    css: converter.options[:coderay_css],
  }.update(opts).update(span_opts).update(wrap: :span)
  cache[:block] = {
    wrap: converter.options[:coderay_wrap],
    line_numbers: converter.options[:coderay_line_numbers],
    line_number_start: converter.options[:coderay_line_number_start],
    tab_width: converter.options[:coderay_tab_width],
    bold_every: converter.options[:coderay_bold_every],
    css: converter.options[:coderay_css],
  }.update(opts).update(block_opts)

  [:css, :wrap, :line_numbers].each do |key|
    [:block, :span].each do |type|
      cache[type][key] = cache[type][key].to_sym if cache[type][key].kind_of?(String)
    end
  end
end