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.
- 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:
|