Sha256: 8f1395824befc359d96c47361c84cdac1bccd808fe4b7f8f325b54648154bce4

Contents?: true

Size: 1.74 KB

Versions: 4

Compression:

Stored size: 1.74 KB

Contents

require 'octopress-codefence/version'
require 'octopress-pygments'
require 'jekyll-page-hooks'

module Jekyll
  class Codefence < PageHooks
    def pre_render(page)
      page.content = Octopress::Codefence.new(page.content, page.ext, page.site.config['pygments_aliases']).render
    end
  end
end

module Octopress
  class Codefence
    AllOptions = /([^\s]+)\s+(.+?)\s+(https?:\/\/\S+|\/\S+)\s*(.+)?/i
    LangCaption = /([^\s]+)\s*(.+)?/i

    def initialize(input, ext=nil, aliases=nil)
      @input   = input
      @ext     = ext
      @aliases = aliases
    end
    
    def render
      @input.encode!("UTF-8")
      @input.gsub /^`{3}(.+?)`{3}/m do
        str = $1.to_s
        str.gsub /([^\n]+)?\n(.+?)\Z/m do
          markup = $1 || ''
          code = $2.to_s
          begin
            get_code(code, get_options(markup))
          rescue MentosError => e
            markup = "```#{markup}"
            Pygments.highlight_failed(e, "```[language] [title] [url] [link text] [linenos:false] [start:#] [mark:#,#-#]\ncode\n```", markup, code)
          end
        end
      end
    end

    def get_options(markup)
      defaults = { escape: true }
      clean_markup = Pygments.clean_markup(markup)

      if clean_markup =~ AllOptions
        defaults = {
          lang: $1,
          title: $2,
          url: $3,
          link_text: $4,
        }
      elsif clean_markup =~ LangCaption
        defaults = {
          lang: $1,
          title: $2
        }
      end
      Pygments.parse_markup(markup, defaults)
    end


    def get_code(code, options)
      options[:aliases] = @aliases || {}
      code = Pygments.highlight(code, options)
      code = "<notextile>#{code}</notextile>" if !@ext.nil? and @ext.match(/textile/)
      code
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
octopress-codefence-1.3.2 lib/octopress-codefence.rb
octopress-codefence-1.3.1 lib/octopress-codefence.rb
octopress-codefence-1.3.0 lib/octopress-codefence.rb
octopress-codefence-1.2.1 lib/octopress-codefence.rb