Chris@0: module CodeRay Chris@0: module Encoders Chris@0: Chris@0: # Makes a statistic for the given tokens. Chris@0: class Statistic < Encoder Chris@0: Chris@0: include Streamable Chris@0: register_for :stats, :statistic Chris@0: Chris@0: attr_reader :type_stats, :real_token_count Chris@0: Chris@0: protected Chris@0: Chris@0: TypeStats = Struct.new :count, :size Chris@0: Chris@0: def setup options Chris@0: @type_stats = Hash.new { |h, k| h[k] = TypeStats.new 0, 0 } Chris@0: @real_token_count = 0 Chris@0: end Chris@0: Chris@0: def generate tokens, options Chris@0: @tokens = tokens Chris@0: super Chris@0: end Chris@0: Chris@0: def text_token text, kind Chris@0: @real_token_count += 1 unless kind == :space Chris@0: @type_stats[kind].count += 1 Chris@0: @type_stats[kind].size += text.size Chris@0: @type_stats['TOTAL'].size += text.size Chris@0: @type_stats['TOTAL'].count += 1 Chris@0: end Chris@0: Chris@0: # TODO Hierarchy handling Chris@0: def block_token action, kind Chris@0: @type_stats['TOTAL'].count += 1 Chris@0: @type_stats['open/close'].count += 1 Chris@0: end Chris@0: Chris@0: STATS = <<-STATS Chris@0: Chris@0: Code Statistics Chris@0: Chris@0: Tokens %8d Chris@0: Non-Whitespace %8d Chris@0: Bytes Total %8d Chris@0: Chris@0: Token Types (%d): Chris@0: type count ratio size (average) Chris@0: ------------------------------------------------------------- Chris@0: %s Chris@0: STATS Chris@0: # space 12007 33.81 % 1.7 Chris@0: TOKEN_TYPES_ROW = <<-TKR Chris@0: %-20s %8d %6.2f %% %5.1f Chris@0: TKR Chris@0: Chris@0: def finish options Chris@0: all = @type_stats['TOTAL'] Chris@0: all_count, all_size = all.count, all.size Chris@0: @type_stats.each do |type, stat| Chris@0: stat.size /= stat.count.to_f Chris@0: end Chris@0: types_stats = @type_stats.sort_by { |k, v| [-v.count, k.to_s] }.map do |k, v| Chris@0: TOKEN_TYPES_ROW % [k, v.count, 100.0 * v.count / all_count, v.size] Chris@0: end.join Chris@0: STATS % [ Chris@0: all_count, @real_token_count, all_size, Chris@0: @type_stats.delete_if { |k, v| k.is_a? String }.size, Chris@0: types_stats Chris@0: ] Chris@0: end Chris@0: Chris@0: end Chris@0: Chris@0: end Chris@0: end