# -*- coding: utf-8 -*- # #-- # Copyright (C) 2009-2016 Thomas Leitner # # This file is part of kramdown which is licensed under the MIT. #++ # module Kramdown::Converter::SyntaxHighlighter # Uses Coderay to highlight code blocks and code spans. module Coderay begin require 'coderay' # Highlighting via coderay is available if this constant is +true+. AVAILABLE = true rescue LoadError AVAILABLE = false # :nodoc: end 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.gsub(/-/, '_').to_sym).html(options(converter, :block)).chomp << "\n" else nil end rescue converter.warning("There was an error using CodeRay: #{$!.message}") nil end def self.options(converter, type) prepare_options(converter) converter.data[:syntax_highlighter_coderay][type] end 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 end end