Saturday, May 16, 2009

perl로 만드는 win util / gdkdoc.pl

perl에는 perldoc이라고 하는 프로그램을 자체로 가지고 있기 때문에 이를 이용하면 콘솔에서 도움말을 볼 수 있습니다.
이 함수는 어떻게 쓰는 거지, 이 패키지는 어떤 함수를 가지고 있지 할 때, 간단하게 살펴볼 수 있으니 매우 편리합니다.

저는 가끔 groovy를 작성합니다. 특별히 프로젝트로 하는 것도 아니지만, 이 groovy, 뭔가 물건이 될 것 같거든요. 작성할 때는 일반 에디터(emeditor)를 사용합니다. eclipse나, IDEA를 사용해서 작성하려면 너무 무거운 느낌이에요. 웹에서 발견한 어떤 샘플을 돌려보는데, 자바프로젝트를 진행하고 있지도 않으니 eclipse라던 지를 실행시키는 데만도 시간이 걸리죠. 그래서 간단히 작성하는, 늘 띄워져 있는 emeditor로 작성합니다.

도움말은 브라우저를 사용하죠. 그런데 perldoc처럼 콘솔에서 볼 수 있는 도움말이 있으면 좋겠다고 생각해 봤습니다. 그래서 작성해 봤습니다.

아이디어는 한번에 도움말 페이지를 가져오도록 site: 옵션을 주어 google의 검색에서 사이트를 groovy.codehaus.org%2Fgroovy-jdk 로 하고, 아마도(!) 가장 위에 있는 아이템이 api 도움말일 것이라고 생각해 구글의 "I'm feeling lucky"으로 바로 열도록 했습니다.

이때 조금 헤맸는데, 코딩해 실행해보니 403을 리턴한다고 하는 것입니다. telnet으로 get으로 request를 보내면 제대로 302 redirect가 받아지는데 말이죠.
해결한 방법은 UserAgent의 설정이었습니다. 소스를 보시죠.

#!perl
use LWP::UserAgent;
use Win32::Console::ANSI;
use Term::ANSIColor;
my $browser = LWP::UserAgent->new;
$browser->agent( 'Mozilla/4.0 (compatible; MSIE 5.12; Mac_PowerPC)' );
my $URL='http://www.google.co.kr/search?complete=1&hl=ko&q=site%3Agroovy.codehaus.org%2Fgroovy-jdk+' . $ARGV[0] . '&btnI=I%27m+Feeling+Lucky&lr=&aq=f';
my $request = HTTP::Request->new;
my $response = $browser->get($URL);
die "Can't get $url -- ", $response->status_line unless $response->is_success;
my $result = $response->content;
$result =~ s/\<[^\>]*\>//g;
$result =~ s/^\s*$>//g;
$result =~ s/\n\n/\n/gm;
$result =~ s/\n\n/\n/gm;
$result =~ s/\n\n/\n/gm;
$result =~ s/(^\(.*\)$)//g;
foreach $line (split "\n", $result) {
if ($line =~ /\(.*\)/) {
print colored( $line, "bold yellow"), "\n";
}
else {
print $line, "\n";
}
}
__END__
Win32::Console::ANSI 는 default가 아니니 인스톨해줘야해요.

보시면 아시겠지만, 괄호가 들어간 라인은 함수의 설명이라고 생각해 노란색으로 표시하게 했습니다. (너무 길어서 "| more"로 보시면 ANSI color값은 없어져 버립니다.)

약 30줄 정도 되는 지저분한 코드입니다만, 그럭저럭 쓸만할 것 같습니다. 좀 더 뼈와 살을 붙이면, 제대로 된 툴이 될 것 같아요. 예를 들면 parameter가 없으면, 클래스 리스트를 보여준다던 지, 리눅스 환경이면 리눅스용 패키지를 use하게 한다던 지 말이죠.




아마 이런 종류의 여러 아류작을 만들 것 같습니다.

No comments: