class Blogit::Parsers::MarkdownParser

  require "nokogiri"
  require "blogit/renderers"

  # A String containing the content to be parsed
  attr_reader :content

  def initialize(content)
    @content = content
  end

  # The parsed content
  #
  # Returns an HTML safe String
  def parsed
    ensure_pygments_is_installed if Blogit::configuration.highlight_code_syntax
    markdown.render(content).html_safe
  end


  private


  # The Redcarpet renderer to use
  def renderer
    if Blogit::configuration.highlight_code_syntax
      Blogit::Renderers.choose_highlight_renderer
    else
      Redcarpet::Render::HTML
    end
  end

  # The Redcarpet Markdown handler
  def markdown
    @markdown ||= Redcarpet::Markdown.new(renderer,
      Blogit.configuration.redcarpet_options)
  end


  # Ensures pygments is installed
  #
  # Raises StandardError if pygments is not available on this machine
  def ensure_pygments_is_installed
    warning = <<-WARNING
[blogit] The pygmentize command could not be found in your load path!
         Please either do one of the following:

         $ sudo easy_install Pygments # to install it

         or

         set config.highlight_code_syntax to false in your blogit.rb config file.

WARNING
    raise warning unless which(:pygmentize)
  end

  # Check if an executable exists in the load path
  #
  # Returns nil if no executable is found
  def which(cmd)
    exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
    ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
      exts.each do |ext|
        exe = File.join(path, "#{cmd}#{ext}")
        return exe if File.executable? exe
      end
    end
    return nil
  end

end
