llm_translator 0.0.1

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 (4) hide show
  1. checksums.yaml +7 -0
  2. data/bin/llm_translator +15 -0
  3. data/lib/llm_translator.rb +116 -0
  4. metadata +46 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4ba8b71b3fbec395856782c1d39551cd6c0aae45f929acea782bebff7725b402
4
+ data.tar.gz: 336658ba8016e367826971801cd1ec80f5c0ccac741cbe8bced4ad15b6d137ce
5
+ SHA512:
6
+ metadata.gz: 18a70a5da904a92d758923f935fc0678dd8a8ea8bce9cd84c21c00c43bc766bfb096fb8bc04c3723c348e908f6d0f9a61e6834706cca0a9da4b1a83309f565d5
7
+ data.tar.gz: 163cb0170971b850c49df6a3a1231e623be192ba8211cafd7a0dc804c82ee81c9c39a45f6ae6a67fa42bdec78a5f8d415f4e4fbb481f060488dfbd5669d010ba
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'llm_translator'
4
+
5
+ config = {
6
+ :appkey => '0b53e81a10846a3a',
7
+ :appscr => 'JLKxQO22jBft6w3PgLBh5as5iNJ1w5wS'
8
+ }
9
+
10
+ translator = LlmTranslator.new(config[:appkey], config[:appscr])
11
+ if ARGV[0] == '-f'
12
+ puts(translator.translate_mix_w File::readlines(ARGV[1]).join)
13
+ else
14
+ puts(translator.translate_mix_w ARGV[0])
15
+ end
@@ -0,0 +1,116 @@
1
+ # test code
2
+ require 'digest'
3
+ require 'net/http'
4
+ require 'securerandom'
5
+ require 'json'
6
+
7
+ class LlmTranslator
8
+ attr_accessor :q, :from, :to, :debug
9
+ T_URL_PATH = "https://openapi.youdao.com/api"
10
+ EN_REGEX = /\w+/
11
+ ZH_REGEX = /[\u4e00-\u9fa5]+/
12
+ MIX_EN_ZH_REGEX = /\w+|[^\w]+/
13
+ MIX_ZH_EN_REGEX = /[\u4e00-\u9fa5]+|[^\u4e00-\u9fa5]+/
14
+ ZH_SYMBOL = 'zh-CHS'
15
+ EN_SYMBOL = 'en'
16
+
17
+ def initialize(appkey, appscr, sign_type='v3')
18
+ @appkey = appkey
19
+ @appscr = appscr
20
+ @sign_type = sign_type
21
+ @dict_s_buffer = {}
22
+ @dict_w_buffer = {}
23
+ @debug = false
24
+ end
25
+
26
+ def translate_parsed(q, from=nil, to=nil, ext=nil, voice=nil, strict=nil, vocabld=nil)
27
+ json = translate_request q, from, to
28
+ begin
29
+ JSON.parse json
30
+ rescue => exception
31
+ puts exception
32
+ puts json if @debug
33
+ end
34
+ end
35
+
36
+ def translate_get_w(q, from=nil, to=nil, ext=nil, voice=nil, strict=nil, vocabld=nil)
37
+ return @dict_w_buffer[q] if !@dict_w_buffer[q].nil?
38
+ res = translate_parsed(q, from, to)
39
+ begin
40
+ @dict_w_buffer[q] = res['translation'][0]
41
+ rescue => exception
42
+ puts "havn't result for #{q}"
43
+ puts res.to_json if @debug
44
+ end
45
+ end
46
+
47
+ def translate_get_web_info(q, from=nil, to=nil, ext=nil, voice=nil, strict=nil, vocabld=nil)
48
+ return @dict_s_buffer[q] if !@dict_s_buffer[q].nil?
49
+ res = translate_parsed(q, from, to)
50
+ begin
51
+ @dict_s_buffer[q] = res['web']
52
+ rescue => exception
53
+ puts "havn't result for #{q}"
54
+ puts res.to_json if @debug
55
+ end
56
+ end
57
+
58
+ def translate_mix_w(q)
59
+ if (from == EN_SYMBOL)
60
+ q.scan(MIX_EN_ZH_REGEX).map { |w| w.match?(EN_REGEX) ? snake_style(translate_get_w(w)) : w }.join
61
+ else
62
+ q.scan(MIX_ZH_EN_REGEX).map { |w| w.match?(ZH_REGEX) ? snake_style(translate_get_w(w)) : w }.join
63
+ end
64
+ end
65
+
66
+ def translate_request(q, from=nil, to=nil, ext=nil, voice=nil, strict=nil, vocabld=nil)
67
+ @curtime = Time.now.to_i.to_s
68
+ @q = q
69
+ @from = from
70
+ @to = to
71
+ auto_from_to q if @from.nil? || @to.nil?
72
+ @salt=SecureRandom::uuid
73
+ params = {
74
+ q: @q,
75
+ from: @from,
76
+ to: @to,
77
+ appKey: @appkey,
78
+ salt: @salt,
79
+ sign: LlmTranslator::sign(@appkey, @appscr, LlmTranslator::input(q), @curtime, @salt),
80
+ signType: @sign_type,
81
+ curtime: @curtime
82
+ }
83
+ @uri = URI(T_URL_PATH)
84
+ res = Net::HTTP.post_form(@uri, params)
85
+ res.body if res.is_a?(Net::HTTPSuccess)
86
+ end
87
+
88
+ def self.sign(appkey, appscr, input, curtime=Time.now.utc.to_s, salt=SecureRandom::uuid)
89
+ Digest::SHA256.hexdigest(appkey + input + salt + curtime + appscr)
90
+ end
91
+
92
+ def self.input(q)
93
+ input = q.length > 20 ? q[0,10] + q.length.to_s + q.reverse[0, 10].reverse : q
94
+ end
95
+
96
+ private
97
+ def auto_from_to(q)
98
+ if q.match?ZH_REGEX
99
+ @from = ZH_SYMBOL
100
+ @to = EN_SYMBOL
101
+ else
102
+ @from = EN_SYMBOL
103
+ @to = ZH_SYMBOL
104
+ end
105
+ end
106
+
107
+ def camel_style(s)
108
+ s = s.split(' ').map! {|w| w.capitalize}.join
109
+ s[0] = s[0].downcase
110
+ s
111
+ end
112
+
113
+ def snake_style(s)
114
+ s.split(' ').map {|w| w.downcase}.join('_')
115
+ end
116
+ end
metadata ADDED
@@ -0,0 +1,46 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: llm_translator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Liuliming
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-01-09 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: a simple translator!
14
+ email: 876475897@qq.com
15
+ executables:
16
+ - llm_translator
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/llm_translator
21
+ - lib/llm_translator.rb
22
+ homepage: https://github.com/Beginner125/ruby-center/tree/main/LlmTranslator
23
+ licenses:
24
+ - MIT
25
+ metadata:
26
+ source_code_uri: https://github.com/Beginner125/ruby-center/tree/main/LlmTranslator
27
+ post_install_message:
28
+ rdoc_options: []
29
+ require_paths:
30
+ - lib
31
+ required_ruby_version: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ requirements: []
42
+ rubygems_version: 3.1.4
43
+ signing_key:
44
+ specification_version: 4
45
+ summary: a simple translator!
46
+ test_files: []