ecdict 1.2.alpha3 → 1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/ecdict +93 -60
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65556d859da91e4cb0c380d0e2ce0281492d5b76c8c19e6f5c2d15e437abc630
|
4
|
+
data.tar.gz: bd7cb7ccef41256d2e9aa77e2071463f72a80cded391535066bcc494ec37d309
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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"
|
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
|
-
|
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
|
97
|
+
def download_ecdict_raw_data
|
78
98
|
|
79
|
-
if File.exists?(
|
80
|
-
puts "=> 已存在原始数据文件#{
|
99
|
+
if File.exists?(ECDICT_RAW_DATA) && check_download_integrity
|
100
|
+
puts "=> 已存在原始数据文件#{ECDICT_RAW_DATA}, 无需再次下载"
|
81
101
|
else
|
82
102
|
|
83
|
-
if File.exists?(
|
84
|
-
puts "=>
|
85
|
-
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)
|
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
|
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
|
-
|
96
|
-
|
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(
|
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
|
-
|
256
|
+
close_db
|
227
257
|
File.delete(ECDictDB)
|
228
|
-
|
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
|
-
|
293
|
-
exit 2
|
323
|
+
return false
|
294
324
|
end
|
295
325
|
puts
|
296
326
|
puts "=> 数据库#{ECDictDB}已完整生成"
|
297
|
-
|
327
|
+
close_db
|
328
|
+
return true
|
298
329
|
end
|
299
330
|
|
300
331
|
|
301
332
|
def download_and_install_ecdict_data
|
302
|
-
|
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:
|
332
|
-
|
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
|
-
|
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
|
-
|
430
|
+
close_db_and_exit(2)
|
399
431
|
end
|
400
432
|
if !check_db_integrity
|
401
433
|
puts "=> 数据库不存在或数据库不完整,请使用`ecdict -i`来下载安装词典数据"
|
402
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
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 "
|
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 => 查询单词
|
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
|
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
|
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:
|
99
|
+
version: '0'
|
100
100
|
requirements: []
|
101
101
|
rubygems_version: 3.3.7
|
102
102
|
signing_key:
|