ecdict 1.2.alpha3 → 1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/bin/ecdict +93 -60
  3. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 333ca8bfcd36397b8dcbc4d73052e497ff76f3e243aeca6af93828a3e45e9f20
4
- data.tar.gz: b8250c7e80b76b0f42d3e46e2dc01fc23b69d2c8546fb71323801cf97f24fcd1
3
+ metadata.gz: 65556d859da91e4cb0c380d0e2ce0281492d5b76c8c19e6f5c2d15e437abc630
4
+ data.tar.gz: bd7cb7ccef41256d2e9aa77e2071463f72a80cded391535066bcc494ec37d309
5
5
  SHA512:
6
- metadata.gz: 9c57d33dcc3503908527f3af5afcd7175073ff1225d3a81e004f723e18445f27b1d1f7a5808711bda4984aac396801f19d2cd10941e2301b4fa2bf1f9dea295b
7
- data.tar.gz: 3df6d4d09ca0e9494a5a1e290665cce693a198ab1ddb270018dc571414dd87e830630272178283afe75d25e538166c06d2076edf324a5e42f156107de5498e59
6
+ metadata.gz: 9496f766abef8779f58e4e4d755cf424ed33f6b6915f5c061d2b36a2e84907a318c2802912193e2d62766a917665927d4e462f01a38372bace44e6ba94dae4a1
7
+ data.tar.gz: 65e8fbc1e88028e92c8e37976201e554427aa875791335f5b44ebaa3482e846a35dae975344c40f2dd6c8c46d91ceb946d06324097465dabb8287ffa169b1dd6
data/bin/ecdict CHANGED
@@ -15,16 +15,25 @@
15
15
  # 1. ecdict installer
16
16
  # 2. ecdict cmd
17
17
  # 3. ecdict repl
18
+ #
19
+ # Exit -1: 下载原始数据失败
20
+ # Exit -2: 解压原始数据至CSV失败
21
+ # EXit -3: 从CSV生成数据库失败
22
+ # Exit 1: 无词典
23
+ # Exit 2: 缺少参数
24
+ #
25
+ # 未搜索到结果并不认为是错误
18
26
  # ------------------------------------------------------
19
27
 
20
28
  require 'sqlite3'
21
29
 
22
- ECDICT_STORAGE = File.expand_path("~/.local/share/ecdict")
23
- ECDictRAWDATA = File.join(ECDICT_STORAGE, 'ecdict-csv.7z')
30
+ ECDICT_STORAGE = File.expand_path("~/.local/share/ecdict")
31
+ ECDICT_RAW_DATA = File.join(ECDICT_STORAGE, 'ecdict-csv.7z')
32
+
24
33
  ECDictDB = File.join(ECDICT_STORAGE, 'ecdict.db')
25
34
  ECDictCSV = File.join(ECDICT_STORAGE, 'ecdict.csv')
26
35
 
27
- ECDICT_GEM_VERSION = "1.2.alpha3"
36
+ ECDICT_GEM_VERSION = "1.2"
28
37
 
29
38
  # 这个版本是我从上游下载的CSV后自己压缩的
30
39
  # 这个文件的实际创建日期(上游作者创建)是2017/06/04
@@ -38,6 +47,16 @@ require 'fileutils'
38
47
  FileUtils.mkdir_p(ECDICT_STORAGE)
39
48
  $DB = SQLite3::Database.new ECDictDB
40
49
 
50
+ def close_db
51
+ $DB.close if $DB
52
+ end
53
+
54
+ def close_db_and_exit(num = 0)
55
+ close_db
56
+ exit num
57
+ end
58
+
59
+
41
60
 
42
61
  ####################
43
62
  # helper: for color
@@ -65,7 +84,8 @@ def cyan(str) "\e[36m#{str}\e[0m" end
65
84
 
66
85
  def check_download_integrity
67
86
  require 'digest'
68
- sha256 = Digest::SHA256.file(ECDictRAWDATA).hexdigest
87
+ return false if !File.exists?(ECDICT_RAW_DATA)
88
+ sha256 = Digest::SHA256.file(ECDICT_RAW_DATA).hexdigest
69
89
  if ECDICT_DICT_SHA256 == sha256
70
90
  true
71
91
  else
@@ -74,31 +94,47 @@ def check_download_integrity
74
94
  end
75
95
 
76
96
 
77
- def download_ecdict_data
97
+ def download_ecdict_raw_data
78
98
 
79
- if File.exists?(ECDictRAWDATA) && check_download_integrity
80
- puts "=> 已存在原始数据文件#{ECDictRAWDATA}, 无需再次下载"
99
+ if File.exists?(ECDICT_RAW_DATA) && check_download_integrity
100
+ puts "=> 已存在原始数据文件#{ECDICT_RAW_DATA}, 无需再次下载"
81
101
  else
82
102
 
83
- if File.exists?(ECDictRAWDATA)
84
- puts "=> 删除已存在但不完整的数据"
85
- FileUtils.rm ECDictRAWDATA
103
+ if File.exists?(ECDICT_RAW_DATA)
104
+ puts "=> 删除已存在但不完整的原始数据文件"
105
+ FileUtils.rm ECDICT_RAW_DATA
106
+ end
107
+
108
+ # 若已经有拉取的仓库,先检查里面的数据是否可用
109
+ raw_data_git_dir = File.join(ECDICT_STORAGE, 'ecdict-data')
110
+ raw_data_git_dir_data = File.join(raw_data_git_dir, 'ecdict-csv.7z')
111
+
112
+ if Dir.exists?(raw_data_git_dir)
113
+ if File.exists?(raw_data_git_dir_data)
114
+ FileUtils.cp(raw_data_git_dir_data, ECDICT_STORAGE)
115
+ if check_download_integrity
116
+ puts "=> 从已经Git pull到的仓库中获取原始数据文件"
117
+ return true
118
+ else
119
+ FileUtils.rm ECDICT_RAW_DATA
120
+ end
121
+ end
122
+ FileUtils.rm_rf(raw_data_git_dir)
86
123
  end
87
124
 
88
125
  begin
89
126
  puts "=> 使用Git从#{ECDICT_DICT_DOWNLOAD_LINK}获取原始数据库文件"
90
- system("git -C #{ECDICT_STORAGE} clone #{ECDICT_DICT_DOWNLOAD_LINK} ")
91
- FileUtils.cp(File.join(ECDICT_STORAGE, 'ecdict-data', 'ecdict-csv.7z'), ECDICT_STORAGE)
92
- raise "Git拉取仓库数据不完整!" if !check_download_integrity
127
+ ret = system("git -C #{ECDICT_STORAGE} clone #{ECDICT_DICT_DOWNLOAD_LINK} ")
128
+ FileUtils.cp(File.join(ECDICT_STORAGE, 'ecdict-data', 'ecdict-csv.7z'), ECDICT_STORAGE) rescue nil
129
+ raise "Git拉取仓库过程失败,原始数据文件不完整!" if (ret != true || !check_download_integrity)
93
130
  rescue StandardError => e
94
131
  puts "=> #{e.message}"
95
- puts "=> Git获取原始数据库文件失败"
96
- FileUtils.rm(ECDictRAWDATA)
132
+ FileUtils.rm(ECDICT_RAW_DATA) rescue nil
133
+ return false
97
134
  else
98
135
  puts "=> 下载完成!"
99
136
  end
100
137
  end
101
-
102
138
  true
103
139
  end
104
140
 
@@ -118,12 +154,12 @@ def decompress_7z_to_csv()
118
154
  end
119
155
 
120
156
 
121
- File.open(ECDictRAWDATA, "rb") do |file|
122
- puts "=> 正在解压ecdict-csv.7z(#{file.size/1024/1024}MB)"
157
+ File.open(ECDICT_RAW_DATA, "rb") do |file|
158
+ puts "=> 正在解压ecdict-csv.7z(#{ '%.2f' % (file.size/1024.0/1024) }MB)"
123
159
  SevenZipRuby::Reader.extract_all(file, ECDICT_STORAGE)
124
160
  end
125
161
 
126
- puts "=> 已成功解压出ecdict.csv(#{File.size(ECDictCSV)/1024/1024}MB)"
162
+ puts "=> 已成功解压出ecdict.csv(#{ '%.2f' % (File.size(ECDictCSV)/1024.0/1024) }MB)"
127
163
  true
128
164
  end
129
165
 
@@ -152,9 +188,6 @@ end
152
188
  # 2. create table in the db
153
189
  # 3. insert data from CSV into the table
154
190
  #
155
- # exit 1 : create db failed
156
- # exit 2 : insert data failed
157
- #
158
191
  def generate_sqlite_db()
159
192
 
160
193
  # SQLite3::Database.new已经生成了该文件,所以需要提前判断到底是否存在
@@ -171,9 +204,6 @@ def generate_sqlite_db()
171
204
  end
172
205
  end
173
206
 
174
- def db_close
175
- $DB.close if $DB
176
- end
177
207
 
178
208
  # 共15个字段,存的时候只需要14个
179
209
  # 1.id 主键,自增
@@ -223,9 +253,9 @@ EOF
223
253
  rescue Exception => e
224
254
  puts "=> #{e.message}"
225
255
  puts "=> 创建数据库文件#{ECDictDB}失败,或表`ecdict`生成失败"
226
- db_close
256
+ close_db
227
257
  File.delete(ECDictDB)
228
- exit 1
258
+ return false
229
259
  end
230
260
 
231
261
 
@@ -288,18 +318,19 @@ EOF
288
318
  rescue Exception => e
289
319
  puts "=> #{e.message}"
290
320
  puts "=> 数据库插入信息失败"
321
+ close_db
291
322
  File.delete(ECDictDB)
292
- db_close
293
- exit 2
323
+ return false
294
324
  end
295
325
  puts
296
326
  puts "=> 数据库#{ECDictDB}已完整生成"
297
- db_close
327
+ close_db
328
+ return true
298
329
  end
299
330
 
300
331
 
301
332
  def download_and_install_ecdict_data
302
- download_ecdict_data || ( puts("\e[31m=> 下载失败,安装取消!\e[0m") || exit(-1) )
333
+ download_ecdict_raw_data || ( puts("\e[31m=> 下载失败,安装取消!\e[0m") || exit(-1) )
303
334
  decompress_7z_to_csv || ( puts("\e[31m=> 解压失败,安装取消!\e[0m") || exit(-2) )
304
335
  generate_sqlite_db || ( puts("\e[31m=> 生成数据库失败,安装取消!\e[0m") || exit(-3) )
305
336
  puts
@@ -328,8 +359,8 @@ end
328
359
  def reply_once(query)
329
360
 
330
361
  if !check_db_integrity
331
- puts "ecdict: 数据库不存在或数据库不完整,请使用ecdict -i来下载安装词典数据"
332
- exit -1
362
+ puts "ecdict: 数据库不存在或数据库不完整,请使用`ecdict -i`来下载安装词典数据"
363
+ close_db_and_exit(1)
333
364
  end
334
365
 
335
366
  tables = []
@@ -348,8 +379,9 @@ def reply_once(query)
348
379
  end
349
380
 
350
381
  if rows.empty?
351
- puts "ecdict: 未找到结果,请检查单词拼写是否正确",""
352
- exit 2
382
+ puts "ecdict: 未找到结果,请检查单词拼写是否正确"
383
+ close_db
384
+ return
353
385
  else
354
386
  line = rows[0]
355
387
  phonetic,trans,definition,exchange = line[0],line[1],line[2],line[3]
@@ -395,11 +427,11 @@ def chinese_search(cn_word, support_phrase: false)
395
427
 
396
428
  if cn_word.empty?
397
429
  puts "ecdict: 请输入要查询的中文,或使用`ecdict -h`查看帮助"
398
- exit 1
430
+ close_db_and_exit(2)
399
431
  end
400
432
  if !check_db_integrity
401
433
  puts "=> 数据库不存在或数据库不完整,请使用`ecdict -i`来下载安装词典数据"
402
- exit -1
434
+ close_db_and_exit(1)
403
435
  end
404
436
 
405
437
  if support_phrase
@@ -420,7 +452,8 @@ def chinese_search(cn_word, support_phrase: false)
420
452
  end
421
453
  if rows.empty?
422
454
  puts "ecdict: 未找到相关英文,请不要输入中文短语或短句,仅支持词的搜索"
423
- exit 2
455
+ close_db
456
+ return
424
457
  else
425
458
  # 有的时候并不是没有结果,而是被我们过滤掉了,对此确认一下
426
459
  found_a_word = false
@@ -473,7 +506,8 @@ def chinese_search(cn_word, support_phrase: false)
473
506
  if found_a_word
474
507
  puts
475
508
  else
476
- puts "ecdict: 抱歉,为了防止显示内容过多,已将可能的答案过滤了",""
509
+ puts "ecdict: 抱歉,为了防止显示内容过多,已将可能的答案过滤了"
510
+ puts "ecdict: 您可尝试使用`ecdict -cp`来搜索短语,扩大搜索范围"
477
511
  end
478
512
  # end of else
479
513
  end
@@ -543,12 +577,7 @@ def start_ecrepl
543
577
 
544
578
  if !check_db_integrity
545
579
  puts "ecdict: 数据库不存在或数据库不完整,请使用`ecdict -i`来下载安装词典数据"
546
- exit -1
547
- end
548
-
549
- def db_close_and_exit
550
- $DB.close if $DB
551
- exit 0
580
+ close_db_and_exit(1)
552
581
  end
553
582
 
554
583
  begin
@@ -563,7 +592,7 @@ def start_ecrepl
563
592
  require 'reline'
564
593
  Reline.completion_proc = lambda do |word|
565
594
  if word.strip.empty?
566
- return %w{1.输入单词查询 2.输入exit或按Ctrl-C退出}
595
+ return %w{1.输入单词并回车查询含义 2.输入单词时按一次tab键反馈搜索建议 3.输入exit或按Ctrl-C或Ctrl-D退出}
567
596
  end
568
597
 
569
598
  max_len = word.length + 4
@@ -606,7 +635,8 @@ def start_ecrepl
606
635
  while line = Reline.readline("\e[32mecdict> \e[0m", true)
607
636
  case word = line.chomp
608
637
  when 'exit'
609
- db_close_and_exit
638
+ close_db
639
+ return
610
640
  when ''
611
641
  # NOOP
612
642
  else
@@ -614,9 +644,10 @@ def start_ecrepl
614
644
  end
615
645
  end
616
646
  rescue Interrupt
617
- puts '^C'
647
+ # puts '^C'
618
648
  `stty #{stty_save}` if stty_save
619
- db_close_and_exit
649
+ close_db
650
+ return
620
651
  end
621
652
 
622
653
  end
@@ -626,14 +657,14 @@ end
626
657
  # remove everything in #{ECDICT_STORAGE}
627
658
  #
628
659
  def delete_cache
629
-
660
+ close_db
630
661
  begin
631
662
  FileUtils.rm_rf(ECDICT_STORAGE)
632
663
  rescue => e
633
- puts "=> #{e.message}"
634
- puts "=> 清空词典数据失败"
664
+ puts "ecdict: #{e.message}"
665
+ puts "ecdict: 清空词典数据失败"
635
666
  else
636
- puts "=> 清空词典数据完成"
667
+ puts "ecdict: 清空词典数据完成"
637
668
  end
638
669
  puts
639
670
  end
@@ -657,12 +688,12 @@ ecdict (v#{ECDICT_GEM_VERSION}): A courteous cli translator.
657
688
 
658
689
  usage:
659
690
 
660
- ecdict word => 查询单词 word
661
- ecdict -r => 启动ecdict repl交互式查询,输入exit或Ctrl-C退出
662
- ecdict -c 中文 => 搜索中文对应的英文单词
663
- ecdict -cp 中文 => 搜索中文对应的英文单词以及短语(结果可能很多)
691
+ ecdict word => 查询单词word
692
+ ecdict -r => 启动ecdict repl交互式查询,输入exit或Ctrl-C/D退出
693
+ ecdict -c 中文 => 搜索中文单词对应的英文单词
694
+ ecdict -cp 中文 => 搜索中文短语对应的英文短语
664
695
  ecdict -i => 下载ecdict词典数据并安装
665
- ecdict -v => 打印此Gem与词典版本号
696
+ ecdict -v => 打印此Gem版本号
666
697
  ecdict -h => 打印此帮助
667
698
  ecdict -d => 清空词典数据
668
699
 
@@ -678,10 +709,10 @@ end
678
709
  if ARGV.empty?
679
710
  if !check_db_integrity
680
711
  puts "ecdict: 数据库不存在或数据库不完整,请使用`ecdict -i`来下载安装词典数据"
681
- exit -1
712
+ close_db_and_exit(1)
682
713
  end
683
714
  puts "ecdict: 请输入要查询的词/词组 或使用`ecdict -h`查看帮助"
684
- exit 1
715
+ close_db_and_exit(2)
685
716
  end
686
717
 
687
718
  query = ARGV.shift
@@ -697,3 +728,5 @@ else
697
728
  reply_once(query)
698
729
  end
699
730
 
731
+ # ensure close db
732
+ close_db
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ecdict
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.alpha3
4
+ version: '1.2'
5
5
  platform: ruby
6
6
  authors:
7
7
  - ccmywish
@@ -94,9 +94,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
94
94
  version: '0'
95
95
  required_rubygems_version: !ruby/object:Gem::Requirement
96
96
  requirements:
97
- - - ">"
97
+ - - ">="
98
98
  - !ruby/object:Gem::Version
99
- version: 1.3.1
99
+ version: '0'
100
100
  requirements: []
101
101
  rubygems_version: 3.3.7
102
102
  signing_key: