view vendor/gems/coderay-1.0.0/lib/coderay/encoders/statistic.rb @ 1082:997f6d7738f7 bug_531

In repo controller entry action, show the page for the file even if it's binary (so user still has access to history etc links). This makes it possible to use the entry action as the default when a file is clicked on
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Thu, 22 Nov 2012 18:04:17 +0000
parents cbb26bc654de
children
line wrap: on
line source
module CodeRay
module Encoders
  
  # Makes a statistic for the given tokens.
  # 
  # Alias: +stats+
  class Statistic < Encoder
    
    register_for :statistic
    
    attr_reader :type_stats, :real_token_count  # :nodoc:
    
    TypeStats = Struct.new :count, :size  # :nodoc:
    
  protected
    
    def setup options
      super
      
      @type_stats = Hash.new { |h, k| h[k] = TypeStats.new 0, 0 }
      @real_token_count = 0
    end
    
    STATS = <<-STATS  # :nodoc:

Code Statistics

Tokens            %8d
  Non-Whitespace  %8d
Bytes Total       %8d

Token Types (%d):
  type                     count     ratio    size (average)
-------------------------------------------------------------
%s
    STATS
    
    TOKEN_TYPES_ROW = <<-TKR  # :nodoc:
  %-20s  %8d  %6.2f %%   %5.1f
    TKR
    
    def finish options
      all = @type_stats['TOTAL']
      all_count, all_size = all.count, all.size
      @type_stats.each do |type, stat|
        stat.size /= stat.count.to_f
      end
      types_stats = @type_stats.sort_by { |k, v| [-v.count, k.to_s] }.map do |k, v|
        TOKEN_TYPES_ROW % [k, v.count, 100.0 * v.count / all_count, v.size]
      end.join
      @out << STATS % [
        all_count, @real_token_count, all_size,
        @type_stats.delete_if { |k, v| k.is_a? String }.size,
        types_stats
      ]
      
      super
    end
    
  public
    
    def text_token text, kind
      @real_token_count += 1 unless kind == :space
      @type_stats[kind].count += 1
      @type_stats[kind].size += text.size
      @type_stats['TOTAL'].size += text.size
      @type_stats['TOTAL'].count += 1
    end
    
    # TODO Hierarchy handling
    def begin_group kind
      block_token ':begin_group', kind
    end
    
    def end_group kind
      block_token ':end_group', kind
    end
    
    def begin_line kind
      block_token ':begin_line', kind
    end
    
    def end_line kind
      block_token ':end_line', kind
    end
    
    def block_token action, kind
      @type_stats['TOTAL'].count += 1
      @type_stats[action].count += 1
      @type_stats[kind].count += 1
    end
    
  end
  
end
end