#!/usr/bin/perl
use 5.014 ; 
use warnings ; 
use Encode qw[ encode_utf8 decode_utf8 ]; 
use Term::ANSIColor qw[ :constants color ] ; 
$Term::ANSIColor::AUTORESET = 1 ; 

use Getopt::Std ; 
getopts '=:' , \my %o ; 

my @givecolor = map { color ( $_ ) } 
 ( 
    'dark white' , 'faint bold red', # 'dark on_bright_red black', # 0 1 
    'red ', 'bright_red' , 'yellow' ,  # 2 3 4
    'green', 'bright_blue',  'bold magenta', # 5 6 7 
    'white', 'bold bright_white' # 8 9 
 ) ;

$o{'='} //= 1 if exists $o{'='} ; 
$o{'='} //= 0 ;
my $c = 0 ; # 行数のカウント

while ( <> ) { 
   $c ++ ; 
   do { print $_ ; next } if $c <= $o{'='} ; 
	$_ = decode_utf8 $_ ;
	my @cha = split /([0-9]|\e\[[\d;]*m)/, $_ , -1 ;  # "\e" = "\x1b" 
	#my @cha = split /([0-9])/, $_ , -1 ; 
	my $prevnum = 0 ; # 直前の文字が数字だったどうかのフラグ
	for ( @cha ) { 
		if ( m/^[0-9]$/ ) { 
			$prevnum = 1 ;
			#$_ = color ( 'reset' ) . $givecolor [ $_ ] . $_ ;
			$_ = $givecolor [ $_ ] . $_ ;
		} elsif ( $prevnum -- ) {
			$_ = color ('reset') . $_ ;
		}
	}
	my $out = join '' , @cha ; 
	print encode_utf8 ( $out ) ;
}

## ヘルプの扱い
sub VERSION_MESSAGE {}
sub HELP_MESSAGE {
  use FindBin qw[ $Script ] ; 
  $ARGV[1] //= '' ;
  open my $FH , '<' , $0 ;
  while(<$FH>){
    s/\$0/$Script/g ;
    print $_ if s/^=head1// .. s/^=cut// and $ARGV[1] =~ /^o(p(t(i(o(ns?)?)?)?)?)?$/i ? m/^\s+\-/ : 1;
  }
  close $FH ;
  exit 0 ;
}

=encoding utf8

=head1

コマンド

  $0 

   数字に、電気抵抗のカラーコードに似た色を被せる。
   このコマンドは、標準入力または指定されたファイルから中身を読み取り、その中から
   数値(0,1,2,3,4,5,6,7,8,9の10文字)を見つけて、世界的に使われている電気抵抗器の
   カラーコードに応じた色を着色する。この結果、数値の多いデータが非常に見やすくなる
   場合がある。

 文字 電気抵抗器カーコード 実際にこのコマンドが着色する色(カラーコードと異なる場合)
 0 黒 → 暗い灰色とする(8の灰色より暗い)。
 1 茶 
 2 赤 
 3 橙 
 4 黄 
 5 緑 
 6 青 
 7 紫 
 8 灰 
 9 白 → 明るい白(標準の白よりも明るい)

オプション: このセクションでは N は数値を表す。
   -= N : 先頭 N 行は、着色しない。

利用例: 
   resistorcc --help | resistorcc  # このコマンドのヘルプの数値の部分のみが着色される
   seq 10 | resistorcc 
  
開発メモ: 
   * 基本の8色と、DARKとBRIGHTとの組み合わせを使い回している。256色が使える場合の指定が可能としたい。
   * このプログラムがutf8を前提にしていることは問題あるかも。
   * cat ?? | resistorcc | resistorcc のように2回重ねて実行してもレイアウトが崩れないようにしたが、バイト数がどんどん膨らむ。
   * 入力行数、着色した行数、着色した文字の数をSTDERRに出力しても良いかも。

=cut
