這裏顯示兩個版本的差異處。
| 下次修改 | 前次修改 | ||
|
perl:yahoo_dictionary [2007/01/12 15:04] wenpei 建立 |
perl:yahoo_dictionary [2007/04/15 02:41] (目前版本) wenpei FourDollars version |
||
|---|---|---|---|
| 行 76: | 行 76: | ||
| } | } | ||
| print "\n"; | print "\n"; | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | ===== FourDollars 進化版 ===== | ||
| + | * 只有支援 UTF-8 | ||
| + | * 一次能查詢多個單字 | ||
| + | * 具 Shell-like | ||
| + | <code> | ||
| + | #!/usr/bin/perl | ||
| + | # Shih-Yuan Lee <fourdollars@gmail.com> | ||
| + | # http://fd.idv.tw | ||
| + | |||
| + | use Term::ANSIColor qw(:constants); | ||
| + | use LWP::Simple; | ||
| + | use strict; | ||
| + | use warnings; | ||
| + | |||
| + | my $debug = 0; | ||
| + | my $trigger = 0; | ||
| + | |||
| + | if ($#ARGV == -1) { | ||
| + | print "<Yahoo!奇摩字典> "; | ||
| + | while (<>) { | ||
| + | chomp; | ||
| + | if ("$_" eq '') { | ||
| + | print "<Yahoo!奇摩字典> "; | ||
| + | next; | ||
| + | } | ||
| + | ydict($_); | ||
| + | print "<Yahoo!奇摩字典> "; | ||
| + | } | ||
| + | } else { | ||
| + | while ($#ARGV != -1) { | ||
| + | if ($trigger) { | ||
| + | print "\n"; | ||
| + | } else { | ||
| + | $trigger = 1; | ||
| + | } | ||
| + | ydict(shift); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | sub ydict | ||
| + | { | ||
| + | my $p = shift; | ||
| + | die if !$p; | ||
| + | my $html = get("http://tw.dictionary.yahoo.com/search?ei=UTF-8&p=$p"); | ||
| + | $html =~ s/\r//g; | ||
| + | $html =~ s/\n//g; | ||
| + | |||
| + | if ($html =~ m{<em class="warning">}) { | ||
| + | if ($html =~ m{<em class="warning">.*?>(\S+)<.*?</em>}) { | ||
| + | my $q = $1; | ||
| + | print BOLD . YELLOW . "拼字檢查: $p -> $q" . RESET . "\n\n"; | ||
| + | return ydict($q); | ||
| + | } else { | ||
| + | print BOLD . YELLOW . "查無此字: $p\n" . RESET; | ||
| + | return; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | print BOLD . YELLOW . "$p 的查詢結果:" . RESET . "\n\n"; | ||
| + | |||
| + | while ($html =~ m{<div class="break"></div>}) { | ||
| + | my $block = $`; | ||
| + | $html = $'; | ||
| + | parser($block); | ||
| + | } | ||
| + | parser($html); | ||
| + | } | ||
| + | |||
| + | sub parser | ||
| + | { | ||
| + | my $html = shift; | ||
| + | if ($html =~ m{<h2>(.*?)</h2>}) { | ||
| + | my $line = $1; | ||
| + | $line =~ s,<sup>,[,g; | ||
| + | $line =~ s,</sup>,],g; | ||
| + | $line =~ s/<[^>]+>//g; | ||
| + | $line =~ s/^\s+//; | ||
| + | $line =~ s/\s+$//; | ||
| + | print "<h2>" if $debug; | ||
| + | print BOLD."$line".RESET."\n"; | ||
| + | } | ||
| + | parsermore($html); | ||
| + | } | ||
| + | |||
| + | sub parsermore | ||
| + | { | ||
| + | my $i = 0; | ||
| + | my $flag = 0; | ||
| + | my $html = shift; | ||
| + | while ($html =~ m{<div class=(p\w+|chinese)>(.*?)</div>}i) | ||
| + | { | ||
| + | my $type = $1; | ||
| + | my $line = $2; | ||
| + | my $color = RESET; | ||
| + | my $bold = BOLD; | ||
| + | my $reset = RESET; | ||
| + | $html = $'; | ||
| + | $line =~ s/^\s+//; | ||
| + | $line =~ s/\s+$//; | ||
| + | print "type=$type\nline=$line\n" if $debug; | ||
| + | if ($type eq 'pcixin') | ||
| + | { | ||
| + | $flag = 0; | ||
| + | $i = 0; | ||
| + | $color = BOLD . RED; | ||
| + | next if not ($line); | ||
| + | print "<pcixin>\n" if $debug; | ||
| + | } | ||
| + | elsif ($type eq 'pchi') | ||
| + | { | ||
| + | $color = GREEN; | ||
| + | $reset = RESET.$color; | ||
| + | $line = " $line"; | ||
| + | print "<pchi>\n" if $debug; | ||
| + | } | ||
| + | elsif ($type eq 'peng') | ||
| + | { | ||
| + | $color = CYAN; | ||
| + | $reset = RESET.$color; | ||
| + | $line = " $line"; | ||
| + | print "<peng>\n" if $debug; | ||
| + | } | ||
| + | elsif ($type eq 'chinese') | ||
| + | { | ||
| + | my $num = $line =~ s/<br>/\n /g; | ||
| + | $line = " $line"; | ||
| + | print "<chinese>\n" if $debug; | ||
| + | } | ||
| + | elsif ($type eq 'pexplain') | ||
| + | { | ||
| + | if ($flag == 0) { | ||
| + | $i++; | ||
| + | if ($line =~ m{<li>}) { | ||
| + | my $reval; | ||
| + | do { | ||
| + | $reval = $line =~ s/<li>/ $i. /; | ||
| + | $i++; | ||
| + | } while ($reval); | ||
| + | my $num = $line =~ s/<br>/\n/g; | ||
| + | $i = 0; | ||
| + | } else { | ||
| + | $line = " $i. $line"; | ||
| + | print "<pexplain 1>\n" if $debug; | ||
| + | } | ||
| + | } else { | ||
| + | $line = " $line" if ($line); | ||
| + | print "<pexplain 2>\n" if $debug; | ||
| + | } | ||
| + | } | ||
| + | elsif ($type eq 'ptitle') | ||
| + | { | ||
| + | $flag = 1; | ||
| + | $color = BOLD . BLUE; | ||
| + | next if ($line =~ m{KK} && $line =~ m{DJ}); | ||
| + | print "<ptitle>\n" if $debug; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | $color = BOLD . BLUE; | ||
| + | print "<others>\n" if $debug; | ||
| + | next; | ||
| + | } | ||
| + | $line =~ s,<b>,$bold,g; | ||
| + | $line =~ s,</b>,$reset,g; | ||
| + | $line =~ s,<sup>,[,g; | ||
| + | $line =~ s,</sup>,],g; | ||
| + | $line =~ s/<[^>]+>//g; | ||
| + | print $color."$line".RESET."\n"; | ||
| + | } | ||
| } | } | ||
| </code> | </code> | ||