免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4695 | 回复: 2
打印 上一主题 下一主题

在线查询英汉对译 V1.66 支持中文/剪切板取词 [复制链接]

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-14 06:52 |只看该作者 |倒序浏览
本帖最后由 523066680 于 2015-06-14 22:35 编辑

测试环境:WIN XP or WIN7 32/64 , Perl v5.16 (ActiveState)

代码保存为UTF8编码格式,查询dict.cn网站的翻译结果
(一直想要一个终端版的翻译工具,挂着其他翻译工具或者开浏览器总感觉耗内存)

V1.3 更新内容
支持剪切板获取,同时可以在终端进行输入(在输入单个字符后自动切换到<STDIN>,节约循环开销)
按 / 或者 ESC 或者 输入exit 退出

V1.60 更新内容
添加了中文输入的判断处理(毕竟Term::ReadKey是逐字节读取,不过还好,Read两个字节后转<STDIN>小事化无)
如果Ctrl+C中文文本,需要确保系统默认输入法为中文,否则可能提取为乱码

V1.65 增加剪切板访问开关(按Tab键切换),修正部分文字、符号判断的BUG





  1. =info
  2.     Code by : 523066680@163.com
  3.        Date : 2015-06-14
  4.     Version : 1.6.6

  5.     按 Tab 键切换剪切板访问开关
  6.     键入 quit/exit 或者 按 ESC 退出
  7. =cut

  8. use            v5.16;    # given
  9. use             utf8;
  10. use           Encode;
  11. use       IO::Handle;
  12. use      LWP::Simple;
  13. use    Term::ReadKey;
  14. use Win32::Clipboard;

  15. use Time::HiRes 'sleep';
  16. ReadMode 4;              #Turn off controls keys

  17. system("");
  18. STDOUT->autoflush(1);
  19. binmode(STDOUT, ":encoding(gbk)");

  20. our $clip = Win32::Clipboard->new();
  21. our $main = "http:\/\/dict.cn";
  22. our $Clip_Access = 1;

  23. my $text;
  24. my $word;
  25. my $key;
  26. my $i = 0;
  27. $clip->Empty();

  28. notice();

  29. MAIN: while (1)
  30. {
  31.     clipboardEvent() if ( $Clip_Access == 1 );
  32.     keyboardEvent();

  33.     print $i == 0 ? "_\b" : " \b";
  34.     $i = 1 - $i;
  35.     sleep 0.2;
  36. }

  37. sub keyboardEvent
  38. {
  39.     my  $word;

  40.     $word = ReadKey(-1);
  41.     given ($word)
  42.     {
  43.         when ( /\r/   ) { break; }        # ReadKey状态下按 Enter = \r
  44.         when ( /\e/   ) { exit ; }        # 按 ESC 退出
  45.         when ( /\t/   ) { switch_CA(); }
  46.         when ( /.{1}/ ) { readContinue($word); }
  47.     }
  48. }

  49. sub switch_CA
  50. {
  51.     our $Clip_Access;
  52.     $Clip_Access = 1 - $Clip_Access;
  53.     notice();
  54. }

  55. sub readContinue
  56. {
  57.     my $word = shift;
  58.     my $LANG;

  59.     if ( ord($word) > 128 )                        #非ANSII即GBK
  60.     {
  61.         $word .= ReadKey(-1);                      #读入后半字节
  62.         if ( $word =~ /^[\xA1-\xA9]/ ) { break; }  #GBK 符号区域
  63.         $LANG = "CHN";
  64.     }
  65.     else
  66.     {   
  67.         if ( $word =~ /[^a-zA-Z]/    ) { break; }
  68.         $LANG = "ENG";
  69.     }

  70.     print " ", decode('gbk', $word);               #首字符输出
  71.     $word .= <STDIN>;
  72.     chomp      $word;
  73.     $word    = decode('gbk', $word);

  74.     if ( $word =~ /^(quit|exit)$/i   ) { exit;  }
  75.     trans($word, $LANG);
  76. }

  77. sub clipboardEvent
  78. {
  79.     our $clip;
  80.     my $text;

  81.     $text = $clip->GetText();
  82.     $text = decode('gbk', $text);

  83.     if ( $text =~ /\p{IsWord}/ )
  84.     {
  85.         #if ($text =~/\W/) { return; }
  86.         #最多匹配3个词
  87.         unless ( $text =~ /^( ?\p{IsWord}+ ?){1,3}$/ )
  88.         {
  89.             return;
  90.         }

  91.         print " $text {Clipboard}\n";
  92.         given ($text)
  93.         {
  94.             when (/\p{han}/) { trans($text, "CHN"); }
  95.             when (/[\w ]+/)  { trans($text, "ENG"); }
  96.         }
  97.         $clip->Empty();
  98.     }
  99. }

  100. sub trans
  101. {
  102.     our $main;
  103.     my  $word = shift;
  104.     my  $type = shift;
  105.     my  $all;
  106.     my  $chk  = 0;

  107.     $word = encode('utf8', $word);
  108.     $all  = get("$main/$word") or warn "$!";

  109.     $chk =
  110.         $type eq 'CHN' ?
  111.             Chn2Eng(\$all) : Eng2Chn(\$all);

  112.     if ($chk == 0)
  113.     {
  114.         print "找不到该单词的翻译信息。\n";
  115.     }

  116.     print "\n";
  117.     notice();
  118. }

  119. sub notice {
  120.     our $enable;
  121.     state $tip =
  122.     {
  123.         0 => "关",
  124.         1 => "开",
  125.     };
  126.     print "\b \b"x80;
  127.     print "(剪切板访问:". $tip->{ $Clip_Access };
  128.     print ") 请输入单词:";
  129. }


  130. sub Chn2Eng
  131. {
  132.     my $ref = shift;
  133.     my $start;
  134.     my $chk = 0;
  135.     for (split("\n", ${$ref}))
  136.     {
  137.         if ( /<div class="layout cn">/i ) { $start = 1; }
  138.         if ( $start == 1 )
  139.         {
  140.             if ( /<li><a href.*>(.*)<\/a><\/li>/i )
  141.             {
  142.                 print $1,"\n";
  143.                 $chk++;
  144.             }
  145.             elsif ( /<\/div>/i )
  146.             {
  147.                 last;
  148.             }
  149.         }
  150.     }
  151.     return $chk;
  152. }

  153. sub Eng2Chn
  154. {
  155.     my $ref = shift;
  156.     my $chk = 0;
  157.     for (split("\n", ${$ref}))
  158.     {
  159.         if (/<li><span>(.*)<\/span>
  160.              <strong>(.*)<\/strong>
  161.             /ix
  162.         ) {
  163.             print $1, $2,"\n";
  164.             $chk++;
  165.         }
  166.     }
  167.     return $chk;
  168. }

复制代码

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
2 [报告]
发表于 2015-06-14 07:21 |只看该作者
本帖最后由 523066680 于 2015-06-14 07:52 编辑

真是郁闷,发帖的时候刚提交,提示禁止URL,结果草稿被清空,重写。
然后URL修改后可以发布了,发现 CODE 部分 $$变成了一个 $

@@ -115 +115 @@
-    for (split("\n", $$ref))
+    for (split("\n", $ref))
@@ -138 +138 @@
-    for (split("\n", $$ref))
+    for (split("\n", $ref))
@@ -149 +149 @@


最后改为 ${$ref} 问题解决  

论坛徽章:
0
3 [报告]
发表于 2015-06-15 10:33 |只看该作者
牛啊,收藏,慢慢学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP