_plugins/kramdown-with-pygments/kramdown_pygments.rb (78 lines of code) (raw):

# We define the an additional option for the kramdown parser to look for module Kramdown module Options define(:kramdown_default_lang, Symbol, nil, <<EOF) Sets the default language for highlighting code blocks If no language is set for a code block, the default language is used instead. The value has to be one of the languages supported by pygments or nil if no default language should be used. Default: nil Used by: PygmentsHtml converter EOF end end # This class is a plugin for kramdown, to make it use pygments instead of coderay # It has nothing to do with Jekyll, it is simply used by the custom converter below module Kramdown module Converter class PygmentsHtml < Html begin require 'pygments' rescue LoadError STDERR.puts 'You are missing a library required for syntax highlighting. Please run:' STDERR.puts ' $ [sudo] gem install pygments' raise FatalException.new("Missing dependency: Pygments") end def convert_codeblock(el, indent) attr = el.attr.dup lang = extract_code_language!(attr) || @options[:kramdown_default_lang] code = pygmentize(el.value, lang) code_attr = {} code_attr['class'] = "language-#{lang}" if lang "#{' '*indent}<div class=\"highlight\"><pre#{html_attributes(attr)}><code#{html_attributes(code_attr)}>#{code}</code></pre></div>\n" end def convert_codespan(el, indent) attr = el.attr.dup lang = extract_code_language!(attr) || @options[:kramdown_default_lang] code = pygmentize(el.value, lang) if lang attr['class'] = "highlight" if attr.has_key?('class') attr['class'] += " language-#{lang}" else attr['class'] = "language-#{lang}" end end "<code#{html_attributes(attr)}>#{code}</code>" end def pygmentize(code, lang) if lang Pygments.highlight(code, :lexer => lang, :options => { :startinline => true, :encoding => 'utf-8', :nowrap => true }) else escape_html(code) end end end end end # This class is the actual custom Jekyll converter. class Jekyll::Converters::Markdown::KramdownPygments def initialize(config) require 'kramdown' @config = config rescue LoadError STDERR.puts 'You are missing a library required for Markdown. Please run:' STDERR.puts ' $ [sudo] gem install kramdown' raise FatalException.new("Missing dependency: kramdown") end def convert(content) html = Kramdown::Document.new(content, { :auto_ids => @config['kramdown']['auto_ids'], :footnote_nr => @config['kramdown']['footnote_nr'], :entity_output => @config['kramdown']['entity_output'], :toc_levels => @config['kramdown']['toc_levels'], :smart_quotes => @config['kramdown']['smart_quotes'], :kramdown_default_lang => @config['kramdown']['default_lang'], :input => @config['kramdown']['input'] }).to_pygments_html return html; end end