Sha256: 2f90ef9df078126a625f06b1edfaa93b3680738b19dba9058554c908d0b4bf65

Contents?: true

Size: 1.55 KB

Versions: 1

Compression:

Stored size: 1.55 KB

Contents

require 'octopress-codeblock/version'
require 'octopress-code-highlighter'
require 'liquid'

module Octopress
  module Codeblock
    class Tag < Liquid::Block
      CaptionUrlTitle = /(\S[\S\s]*)\s+(https?:\/\/\S+|\/\S+)\s*(.+)?/i
      Caption = /(\S[\S\s]*)/

      def initialize(tag_name, markup, tokens)
        @markup = markup
        super
      end

      def render(context)
        code = super.encode("UTF-8")

        begin
          highlight(code, get_options)
        rescue => e
          CodeHighlighter.highlight_failed(e, "{% codeblock [title] [url] [link text] [lang:language] [start:#] [mark:#,#-#] [linenos:false] %}\ncode\n{% endcodeblock %}", @markup, code)
        end
      end
        
      def get_options
        defaults = { escape: true }
        clean_markup = CodeHighlighter.clean_markup(@markup)

        if clean_markup =~ CaptionUrlTitle
          defaults = {
            title: $2,
            url: $2,
            link_text: $3,
          }
        elsif clean_markup =~ Caption
          defaults = {
            title: $1
          }
        end

        if defaults[:title] =~ /\S[\S\s]*\w+\.(\w+)/
          defaults[:lang] = $1
        end

        CodeHighlighter.parse_markup(@markup, defaults)
      end


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

Liquid::Template.register_tag('codeblock', Octopress::Codeblock::Tag)

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
octopress-codeblock-1.0.0 lib/octopress-codeblock.rb