diff --git a/wc.rb b/wc.rb index 47d5ba9..cd3d2c6 100644 --- a/wc.rb +++ b/wc.rb @@ -4,12 +4,12 @@ require 'optparse' def main options, filenames = parse_options - file_details = collect_file_stats(filenames) - total_stats = calculate_total_stats(file_details) - max_widths = calculate_max_widths(total_stats) + file_stats = collect_file_stats(filenames) + total_stat = calculate_total_stat(file_stats) + max_widths = calculate_max_widths(total_stat) - file_details.each { |file_stats| print_stats(file_stats, max_widths, options) } - print_stats(total_stats, max_widths, options) if filenames.size > 1 + file_stats << total_stat if filenames.size > 1 + file_stats.each { |file_stat| puts format_result(file_stat, max_widths, options).join(' ') } end def parse_options @@ -27,32 +27,34 @@ end def collect_file_stats(filenames) filenames.map do |filename| text = filename.empty? ? ARGF.read : File.read(filename) - { filename: filename, lines: text.lines.count, words: text.split.size, bytes: text.bytesize } + { + filename: filename, + lines: text.lines.count, + words: text.split.size, + bytes: text.bytesize + } end end -def calculate_total_stats(file_details) - total_stats = { filename: '合計', lines: 0, words: 0, bytes: 0 } - file_details.each do |stats| - total_stats[:lines] += stats[:lines] - total_stats[:words] += stats[:words] - total_stats[:bytes] += stats[:bytes] +def calculate_total_stat(file_stats) + total_stat = { filename: '合計', lines: 0, words: 0, bytes: 0 } + file_stats.each do |stats| + total_stat[:lines] += stats[:lines] + total_stat[:words] += stats[:words] + total_stat[:bytes] += stats[:bytes] end - total_stats + total_stat end -def calculate_max_widths(total_stats) - %i[lines words bytes].to_h { |key| [key, total_stats[key].to_s.length] } +def calculate_max_widths(total_stat) + %i[lines words bytes].to_h { |key| [key, total_stat[key].to_s.length] } end def format_result(stats, max_widths, options) - %i[lines words bytes].filter_map do |key| + result = %i[lines words bytes].filter_map do |key| stats[key].to_s.rjust(max_widths[key]) if options[key] end -end - -def print_stats(stats, max_widths, options) - puts (format_result(stats, max_widths, options) << stats[:filename]).join(' ') + result << stats[:filename] end main