ecdict 1.2.alpha2 → 1.2.alpha5
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.
- checksums.yaml +4 -4
- data/bin/ecdict +99 -66
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d3b7af98d6ca07e5b9228c8ed515af5250f194b74ff1b5b8a15cc4a53418d48
|
4
|
+
data.tar.gz: 0ac17588afaa66aaddc89b65a870ccebf7d8318dfdc8526f1d2ba804d4624897
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8e715abe0412e94f79739a43cbabd063211d50977c4d7d8dbb49851cdedfd51f9ab4847b91d046a817c64c240baff591a37fd00d7ea45ee13c119c9afce61c8
|
7
|
+
data.tar.gz: ab5ec984d53c633ce72f5a557e5f7f7aab91f395cf24d8706562bbeef5a4efd9d3c653879a28170a0b6ea1dc1b05c819022656e29b97c8977e734a5508940d0e
|
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
|
23
|
-
|
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.
|
36
|
+
ECDICT_GEM_VERSION = "1.2.alpha5"
|
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,8 +84,8 @@ def cyan(str) "\e[36m#{str}\e[0m" end
|
|
65
84
|
|
66
85
|
def check_download_integrity
|
67
86
|
require 'digest'
|
68
|
-
|
69
|
-
sha256 = Digest::SHA256.
|
87
|
+
return false if !File.exists?(ECDICT_RAW_DATA)
|
88
|
+
sha256 = Digest::SHA256.file(ECDICT_RAW_DATA).hexdigest
|
70
89
|
if ECDICT_DICT_SHA256 == sha256
|
71
90
|
true
|
72
91
|
else
|
@@ -75,31 +94,47 @@ def check_download_integrity
|
|
75
94
|
end
|
76
95
|
|
77
96
|
|
78
|
-
def
|
97
|
+
def download_ecdict_raw_data
|
79
98
|
|
80
|
-
if File.exists?(
|
81
|
-
puts "=> 已存在原始数据文件#{
|
99
|
+
if File.exists?(ECDICT_RAW_DATA) && check_download_integrity
|
100
|
+
puts "=> 已存在原始数据文件#{ECDICT_RAW_DATA}, 无需再次下载"
|
82
101
|
else
|
83
102
|
|
84
|
-
if File.exists?(
|
85
|
-
puts "=>
|
86
|
-
FileUtils.rm
|
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)
|
87
123
|
end
|
88
124
|
|
89
125
|
begin
|
90
126
|
puts "=> 使用Git从#{ECDICT_DICT_DOWNLOAD_LINK}获取原始数据库文件"
|
91
|
-
system("git -C #{ECDICT_STORAGE} clone #{ECDICT_DICT_DOWNLOAD_LINK} ")
|
92
|
-
FileUtils.cp(File.join(ECDICT_STORAGE, 'ecdict-data', 'ecdict-csv.7z'), ECDICT_STORAGE)
|
93
|
-
raise "Git
|
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)
|
94
130
|
rescue StandardError => e
|
95
131
|
puts "=> #{e.message}"
|
96
|
-
|
97
|
-
|
132
|
+
FileUtils.rm(ECDICT_RAW_DATA) rescue nil
|
133
|
+
return false
|
98
134
|
else
|
99
135
|
puts "=> 下载完成!"
|
100
136
|
end
|
101
137
|
end
|
102
|
-
|
103
138
|
true
|
104
139
|
end
|
105
140
|
|
@@ -119,12 +154,12 @@ def decompress_7z_to_csv()
|
|
119
154
|
end
|
120
155
|
|
121
156
|
|
122
|
-
File.open(
|
123
|
-
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)"
|
124
159
|
SevenZipRuby::Reader.extract_all(file, ECDICT_STORAGE)
|
125
160
|
end
|
126
161
|
|
127
|
-
puts "=> 已成功解压出ecdict.csv(#{File.size(ECDictCSV)/1024/1024}MB)"
|
162
|
+
puts "=> 已成功解压出ecdict.csv(#{ '%.2f' % (File.size(ECDictCSV)/1024.0/1024) }MB)"
|
128
163
|
true
|
129
164
|
end
|
130
165
|
|
@@ -153,9 +188,6 @@ end
|
|
153
188
|
# 2. create table in the db
|
154
189
|
# 3. insert data from CSV into the table
|
155
190
|
#
|
156
|
-
# exit 1 : create db failed
|
157
|
-
# exit 2 : insert data failed
|
158
|
-
#
|
159
191
|
def generate_sqlite_db()
|
160
192
|
|
161
193
|
# SQLite3::Database.new已经生成了该文件,所以需要提前判断到底是否存在
|
@@ -172,9 +204,6 @@ def generate_sqlite_db()
|
|
172
204
|
end
|
173
205
|
end
|
174
206
|
|
175
|
-
def db_close
|
176
|
-
$DB.close if $DB
|
177
|
-
end
|
178
207
|
|
179
208
|
# 共15个字段,存的时候只需要14个
|
180
209
|
# 1.id 主键,自增
|
@@ -224,9 +253,9 @@ EOF
|
|
224
253
|
rescue Exception => e
|
225
254
|
puts "=> #{e.message}"
|
226
255
|
puts "=> 创建数据库文件#{ECDictDB}失败,或表`ecdict`生成失败"
|
227
|
-
|
256
|
+
close_db
|
228
257
|
File.delete(ECDictDB)
|
229
|
-
|
258
|
+
return false
|
230
259
|
end
|
231
260
|
|
232
261
|
|
@@ -289,24 +318,28 @@ EOF
|
|
289
318
|
rescue Exception => e
|
290
319
|
puts "=> #{e.message}"
|
291
320
|
puts "=> 数据库插入信息失败"
|
321
|
+
close_db
|
292
322
|
File.delete(ECDictDB)
|
293
|
-
|
294
|
-
exit 2
|
323
|
+
return false
|
295
324
|
end
|
296
325
|
puts
|
297
326
|
puts "=> 数据库#{ECDictDB}已完整生成"
|
298
|
-
|
327
|
+
close_db
|
328
|
+
return true
|
299
329
|
end
|
300
330
|
|
301
331
|
|
302
332
|
def download_and_install_ecdict_data
|
303
|
-
|
333
|
+
download_ecdict_raw_data || ( puts("\e[31m=> 下载失败,安装取消!\e[0m") || exit(-1) )
|
304
334
|
decompress_7z_to_csv || ( puts("\e[31m=> 解压失败,安装取消!\e[0m") || exit(-2) )
|
305
335
|
generate_sqlite_db || ( puts("\e[31m=> 生成数据库失败,安装取消!\e[0m") || exit(-3) )
|
306
336
|
puts
|
307
|
-
puts "
|
308
|
-
puts "
|
309
|
-
puts "
|
337
|
+
puts "Hooray! 词典数据下载安装完成! 请尝试使用:\n\n"
|
338
|
+
puts " 1. ecdict word 查询单词 "
|
339
|
+
puts " 2. ecdict -r 进入交互式查询REPL"
|
340
|
+
puts " 3. ecdict -c 中文 搜索中文单词"
|
341
|
+
puts " 4. ecdict -cp 中文 搜索中文短语"
|
342
|
+
puts
|
310
343
|
end
|
311
344
|
|
312
345
|
|
@@ -326,8 +359,8 @@ end
|
|
326
359
|
def reply_once(query)
|
327
360
|
|
328
361
|
if !check_db_integrity
|
329
|
-
puts "ecdict:
|
330
|
-
|
362
|
+
puts "ecdict: 数据库不存在或数据库不完整,请使用`ecdict -i`来下载安装词典数据"
|
363
|
+
close_db_and_exit(1)
|
331
364
|
end
|
332
365
|
|
333
366
|
tables = []
|
@@ -346,8 +379,9 @@ def reply_once(query)
|
|
346
379
|
end
|
347
380
|
|
348
381
|
if rows.empty?
|
349
|
-
puts "ecdict: 未找到结果,请检查单词拼写是否正确"
|
350
|
-
|
382
|
+
puts "ecdict: 未找到结果,请检查单词拼写是否正确"
|
383
|
+
close_db
|
384
|
+
return
|
351
385
|
else
|
352
386
|
line = rows[0]
|
353
387
|
phonetic,trans,definition,exchange = line[0],line[1],line[2],line[3]
|
@@ -393,11 +427,11 @@ def chinese_search(cn_word, support_phrase: false)
|
|
393
427
|
|
394
428
|
if cn_word.empty?
|
395
429
|
puts "ecdict: 请输入要查询的中文,或使用`ecdict -h`查看帮助"
|
396
|
-
|
430
|
+
close_db_and_exit(2)
|
397
431
|
end
|
398
432
|
if !check_db_integrity
|
399
433
|
puts "=> 数据库不存在或数据库不完整,请使用`ecdict -i`来下载安装词典数据"
|
400
|
-
|
434
|
+
close_db_and_exit(1)
|
401
435
|
end
|
402
436
|
|
403
437
|
if support_phrase
|
@@ -418,7 +452,8 @@ def chinese_search(cn_word, support_phrase: false)
|
|
418
452
|
end
|
419
453
|
if rows.empty?
|
420
454
|
puts "ecdict: 未找到相关英文,请不要输入中文短语或短句,仅支持词的搜索"
|
421
|
-
|
455
|
+
close_db
|
456
|
+
return
|
422
457
|
else
|
423
458
|
# 有的时候并不是没有结果,而是被我们过滤掉了,对此确认一下
|
424
459
|
found_a_word = false
|
@@ -471,7 +506,8 @@ def chinese_search(cn_word, support_phrase: false)
|
|
471
506
|
if found_a_word
|
472
507
|
puts
|
473
508
|
else
|
474
|
-
puts "ecdict: 抱歉,为了防止显示内容过多,已将可能的答案过滤了"
|
509
|
+
puts "ecdict: 抱歉,为了防止显示内容过多,已将可能的答案过滤了"
|
510
|
+
puts "ecdict: 您可尝试使用`ecdict -cp`来搜索短语,扩大搜索范围"
|
475
511
|
end
|
476
512
|
# end of else
|
477
513
|
end
|
@@ -541,12 +577,7 @@ def start_ecrepl
|
|
541
577
|
|
542
578
|
if !check_db_integrity
|
543
579
|
puts "ecdict: 数据库不存在或数据库不完整,请使用`ecdict -i`来下载安装词典数据"
|
544
|
-
|
545
|
-
end
|
546
|
-
|
547
|
-
def db_close_and_exit
|
548
|
-
$DB.close if $DB
|
549
|
-
exit 0
|
580
|
+
close_db_and_exit(1)
|
550
581
|
end
|
551
582
|
|
552
583
|
begin
|
@@ -561,7 +592,7 @@ def start_ecrepl
|
|
561
592
|
require 'reline'
|
562
593
|
Reline.completion_proc = lambda do |word|
|
563
594
|
if word.strip.empty?
|
564
|
-
return %w{1
|
595
|
+
return %w{1.输入单词并回车查询含义 2.输入单词时按一次tab键反馈搜索建议 3.输入exit或按Ctrl-C或Ctrl-D退出}
|
565
596
|
end
|
566
597
|
|
567
598
|
max_len = word.length + 4
|
@@ -604,7 +635,8 @@ def start_ecrepl
|
|
604
635
|
while line = Reline.readline("\e[32mecdict> \e[0m", true)
|
605
636
|
case word = line.chomp
|
606
637
|
when 'exit'
|
607
|
-
|
638
|
+
close_db
|
639
|
+
return
|
608
640
|
when ''
|
609
641
|
# NOOP
|
610
642
|
else
|
@@ -612,9 +644,10 @@ def start_ecrepl
|
|
612
644
|
end
|
613
645
|
end
|
614
646
|
rescue Interrupt
|
615
|
-
puts '^C'
|
647
|
+
# puts '^C'
|
616
648
|
`stty #{stty_save}` if stty_save
|
617
|
-
|
649
|
+
close_db
|
650
|
+
return
|
618
651
|
end
|
619
652
|
|
620
653
|
end
|
@@ -624,14 +657,14 @@ end
|
|
624
657
|
# remove everything in #{ECDICT_STORAGE}
|
625
658
|
#
|
626
659
|
def delete_cache
|
627
|
-
|
660
|
+
close_db
|
628
661
|
begin
|
629
662
|
FileUtils.rm_rf(ECDICT_STORAGE)
|
630
663
|
rescue => e
|
631
|
-
puts "
|
632
|
-
puts "
|
664
|
+
puts "ecdict: #{e.message}"
|
665
|
+
puts "ecdict: 清空词典数据失败"
|
633
666
|
else
|
634
|
-
puts "
|
667
|
+
puts "ecdict: 清空词典数据完成"
|
635
668
|
end
|
636
669
|
puts
|
637
670
|
end
|
@@ -644,8 +677,6 @@ end
|
|
644
677
|
def print_version
|
645
678
|
puts <<EOH
|
646
679
|
ecdict (v#{ECDICT_GEM_VERSION}): A courteous cli translator.
|
647
|
-
|
648
|
-
|
649
680
|
EOH
|
650
681
|
|
651
682
|
end
|
@@ -657,12 +688,12 @@ ecdict (v#{ECDICT_GEM_VERSION}): A courteous cli translator.
|
|
657
688
|
|
658
689
|
usage:
|
659
690
|
|
660
|
-
ecdict 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
|
-
|
712
|
+
close_db_and_exit(1)
|
682
713
|
end
|
683
714
|
puts "ecdict: 请输入要查询的词/词组 或使用`ecdict -h`查看帮助"
|
684
|
-
|
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
|