module Nanoc3::Helpers module SyntaxColorize require 'nanoc3/helpers/capturing' include Nanoc3::Helpers::Capturing def syntax_colorize(lang, type=:ultraviolet, &block) # Capture block data = capture(&block) # Remove whitespace lines = data.split("\n") min_indent = lines.inject(nil) do |memo, line| next memo if line =~ /^\s*$/ next memo if line !~ /^(\s*)/ [ memo, $1.size ].compact.min end lines.each do |line| line[0,min_indent] = '' end data = lines.join("\n") # Process case type when :ultraviolet begin require 'uv' if lang =~ /^(zsh|bash|sh|csh|shell)$/ lang='shell-unix-generic' end filtered_data = Uv.parse(data, 'xhtml', lang, false, 'twilight') rescue LoadError unless $_WARNED_ABOUT_ULTRAVIOLET warn "WARNING: Couldn't load uv; please install the ultraviolet gem. This message will not appear again." end $_WARNED_ABOUT_ULTRAVIOLET = true filtered_data = '
' + h(data) + '
' end # Convert to HTML filtered_data = filtered_data.strip.sub(%r{/ ?>}, '>') # convert to HTML # Add missing in
        filtered_data.sub!(/^\s*(
)\s*/) { |m| "#{m}" }
        filtered_data.sub!(/\s*(<\/pre>)\s*$/) { |m| "#{m}" }
      when :coderay
        # Find filter
        klass = Nanoc3::Filter.named(:coderay)
        filter = klass.new(@item_rep.assigns)
        
        # Filter captured data
        filtered_data = filter.run(data, :language => lang).strip
      else
        raise ArgumentError, "invalid type: #{type}"
      end

      # Append filtered data to buffer
      buffer = eval('_erbout', block.binding)
      buffer << '
' if type == :coderay
      buffer << filtered_data
      buffer << '
' if type == :coderay end end end