logaling-command 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,3 +1,9 @@
1
+ = 0.1.5 / 2012-05-02
2
+
3
+ * TMX形式の用語集をインポートできるようにしました。
4
+
5
+ * loga import mozilla_japan すると訳語が空のエントリが複数登録される不具合を修正しました。
6
+
1
7
  = 0.1.4 / 2012-03-29
2
8
 
3
9
  * インデックス時にオフラインインデックスを利用することで速度が改善されました。(groonga >= 2.0.0)
@@ -74,7 +74,7 @@ module Logaling::Command
74
74
  @dotfile_path = options["logaling-config"] ? options["logaling-config"] : find_dotfile
75
75
  @project_config_path = File.join(@dotfile_path, 'config')
76
76
  @config.load(@project_config_path)
77
- register
77
+ register_and_index
78
78
  end
79
79
  say "Successfully created #{logaling_config_path}"
80
80
  else
@@ -84,29 +84,39 @@ module Logaling::Command
84
84
 
85
85
  desc 'import', 'Import external glossary'
86
86
  method_option "list", type: :boolean, default: false
87
- def import(external_glossary=nil)
87
+ def import(external_glossary=nil, *args)
88
88
  require "logaling/external_glossary"
89
89
  Logaling::ExternalGlossary.load
90
90
  if options["list"]
91
91
  Logaling::ExternalGlossary.list.each {|glossary| say "#{glossary.name.bright} : #{glossary.description}" }
92
92
  else
93
- @repository.import(Logaling::ExternalGlossary.get(external_glossary))
94
- @repository.index
93
+ case external_glossary
94
+ when 'tmx'
95
+ glossary_info = initialize_import_parameter(args)
96
+ check_import_parameter(glossary_info)
97
+ @repository.import_tmx(Logaling::ExternalGlossary.get(external_glossary), glossary_info)
98
+ @repository.index
99
+ else
100
+ @repository.import(Logaling::ExternalGlossary.get(external_glossary))
101
+ @repository.index
102
+ end
95
103
  end
96
104
  rescue Logaling::CommandFailed => e
97
105
  say e.message
98
106
  rescue Logaling::ExternalGlossaryNotFound
99
107
  say "'#{external_glossary}' can't find in import list."
100
108
  say "Try 'loga import --list' and confirm import list."
109
+ rescue Logaling::GlossaryNotFound => e
110
+ say e.message
101
111
  end
102
112
 
103
113
  desc 'register', 'Register .logaling'
104
114
  def register
105
- @config.check_required_option("glossary" => "input glossary name '-g <glossary name>'")
115
+ raise Logaling::CommandFailed, "Can't use '-g <glossary>' option." if options["glossary"]
116
+ @config.check_required_option("glossary" => "Do 'loga register' at project directory.")
106
117
  raise Logaling::CommandFailed, "Try 'loga new' first." unless File.exist?(@dotfile_path)
107
118
 
108
- @repository.register(@dotfile_path, @config.glossary)
109
- @repository.index
119
+ register_and_index
110
120
  say "#{@config.glossary} is now registered to logaling."
111
121
  rescue Logaling::CommandFailed => e
112
122
  say e.message
@@ -116,7 +126,8 @@ module Logaling::Command
116
126
 
117
127
  desc 'unregister', 'Unregister .logaling'
118
128
  def unregister
119
- @config.check_required_option("glossary" => "input glossary name '-g <glossary name>'")
129
+ raise Logaling::CommandFailed, "Can't use '-g <glossary>' option." if options["glossary"]
130
+ @config.check_required_option("glossary" => "Do 'loga unregister' at project directory.")
120
131
 
121
132
  @repository.unregister(@config.glossary)
122
133
  @repository.index
@@ -132,7 +143,7 @@ module Logaling::Command
132
143
  def config(key, value)
133
144
  if options["global"]
134
145
  unless File.exist?(@logaling_home)
135
- FileUtils.mkdir_p(@logaling_home) rescue raise Logaling::CommandFailed, "Imput existing directory as logaling-home."
146
+ FileUtils.mkdir_p(@logaling_home) rescue raise Logaling::CommandFailed, "Input existing directory as logaling-home."
136
147
  end
137
148
  config_path = File.join(@logaling_home, "config")
138
149
  else
@@ -378,7 +389,7 @@ module Logaling::Command
378
389
 
379
390
  def check_logaling_home_exists
380
391
  unless File.exist?(@logaling_home)
381
- raise Logaling::CommandFailed, "Imput existing directory as logaling-home."
392
+ raise Logaling::CommandFailed, "Input existing directory as logaling-home."
382
393
  end
383
394
  end
384
395
 
@@ -408,5 +419,29 @@ module Logaling::Command
408
419
  puts("\n]") if i == last-1
409
420
  end
410
421
  end
422
+
423
+ def check_import_parameter(glossary_info)
424
+ unless glossary_info[:name] && glossary_info[:url]
425
+ raise Logaling::CommandFailed, "Do 'loga import tmx <glossary name> <url or path>'"
426
+ end
427
+ end
428
+
429
+ def initialize_import_parameter(arr)
430
+ glossary_info = {}
431
+ url = arr[1]
432
+ if url && !URI.parse(url).host
433
+ url = File::expand_path(url)
434
+ end
435
+ glossary_info[:name] = arr[0]
436
+ glossary_info[:url] = url
437
+ glossary_info[:source_language] = arr[2]
438
+ glossary_info[:target_language] = arr[3]
439
+ glossary_info
440
+ end
441
+
442
+ def register_and_index
443
+ @repository.register(@dotfile_path, @config.glossary)
444
+ @repository.index
445
+ end
411
446
  end
412
447
  end
@@ -17,6 +17,6 @@
17
17
 
18
18
  module Logaling
19
19
  module Command
20
- VERSION = "0.1.4"
20
+ VERSION = "0.1.5"
21
21
  end
22
22
  end
@@ -32,7 +32,7 @@ module Logaling
32
32
  doc.css("dl[@class='terminology en-ja']").each do |dl|
33
33
  dl.children.each_slice(2) do |dt, dd|
34
34
  dd.text.split("|").each do |ddt|
35
- ddt = ddt.gsub(/\s/, '')
35
+ ddt = ddt.gsub(/\s|\u{a0}/, '')
36
36
  unless ddt.empty?
37
37
  csv << [dust_to_tilda(dt.text), dust_to_tilda(ddt)]
38
38
  end
@@ -0,0 +1,58 @@
1
+ # Copyright (C) 2012 Miho SUZUKI
2
+ #
3
+ # This program is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ require 'open-uri'
17
+ require 'nokogiri'
18
+ module Logaling
19
+ class Tmx < ExternalGlossary
20
+ description 'TMX 1.4b formatted glossary (http://www.gala-global.org/oscarStandards/tmx/)'
21
+ source_language 'en'
22
+ target_language 'ja'
23
+ output_format 'csv'
24
+
25
+ private
26
+ def convert_to_csv(csv, glossary_info)
27
+ doc = ::Nokogiri::XML(open(glossary_info[:url], "r"))
28
+ tu_nodes = doc.xpath('//tmx/body/tu')
29
+ tu_nodes.each do |tu|
30
+ original = ""
31
+ translation = ""
32
+ notes = []
33
+ tu.children.each do |tuv|
34
+ if tuv.name == "tuv"
35
+ lang = convert_language_code_iso_639(tuv["lang"])
36
+ if lang == glossary_info[:source_language]
37
+ tuv.children.each do |child|
38
+ original = child.text.strip if child.name == "seg"
39
+ notes << child.text.strip if child.name == "note"
40
+ end
41
+ elsif lang == glossary_info[:target_language]
42
+ tuv.children.each do |child|
43
+ translation = child.text.strip if child.name == "seg"
44
+ notes << child.text.strip if child.name == "note"
45
+ end
46
+ end
47
+ end
48
+ end
49
+ csv << [original, translation, notes.join(" | ")] if original && translation
50
+ end
51
+ end
52
+
53
+ def convert_language_code_iso_639(code)
54
+ # use two-letter codes
55
+ code.downcase.sub(/-.*\z/, "")
56
+ end
57
+ end
58
+ end
@@ -14,6 +14,8 @@
14
14
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
15
15
 
16
16
  require 'active_support/inflector'
17
+ require 'open-uri'
18
+ require 'net/http'
17
19
 
18
20
  class Logaling::ExternalGlossary
19
21
  class << self
@@ -66,13 +68,22 @@ class Logaling::ExternalGlossary
66
68
  end
67
69
  end
68
70
 
69
- def import
70
- File.open(import_file_name, "w") do |output|
71
+ def import(glossary_info=nil)
72
+ if glossary_info && glossary_info[:url]
73
+ unless file_exists?(glossary_info[:url])
74
+ raise Logaling::GlossaryNotFound, "Failed open url/path <#{glossary_info[:url]}>"
75
+ end
76
+ end
77
+ File.open(import_file_name(glossary_info), "w") do |output|
71
78
  output_format = self.class.output_format
72
79
  output_format = output_format.to_s if output_format.is_a?(Symbol)
73
80
  case output_format
74
81
  when "csv"
75
- convert_to_csv(CSV.new(output))
82
+ if glossary_info
83
+ convert_to_csv(CSV.new(output), glossary_info)
84
+ else
85
+ convert_to_csv(CSV.new(output))
86
+ end
76
87
  else
77
88
  raise UnsupportedFormat, "unsupported format: <#{output_format}>"
78
89
  end
@@ -80,8 +91,28 @@ class Logaling::ExternalGlossary
80
91
  end
81
92
 
82
93
  private
83
- def import_file_name
84
- [self.class.name, self.class.source_language,
85
- self.class.target_language, self.class.output_format].join('.')
94
+ def import_file_name(glossary_info=nil)
95
+ if glossary_info
96
+ glossary_info[:name] ||= self.class.name
97
+ glossary_info[:source_language] ||= self.class.source_language
98
+ glossary_info[:target_language] ||= self.class.target_language
99
+
100
+ [glossary_info[:name], glossary_info[:source_language],
101
+ glossary_info[:target_language], self.class.output_format].join('.')
102
+ else
103
+ [self.class.name, self.class.source_language,
104
+ self.class.target_language, self.class.output_format].join('.')
105
+ end
106
+ end
107
+
108
+ def file_exists?(url_org)
109
+ url = URI.parse(url_org)
110
+ if url.host
111
+ Net::HTTP.start(url.host, url.port) do |http|
112
+ http.head(url.request_uri).code == "200"
113
+ end
114
+ else
115
+ File.exist?(url_org)
116
+ end
86
117
  end
87
118
  end
@@ -108,7 +108,7 @@ module Logaling
108
108
  {:key=>"source_term", :order=>'ascending'},
109
109
  {:key=>"target_term", :order=>'ascending'}])
110
110
 
111
- options = {:width => 100,
111
+ options = {:width => 5000,
112
112
  :html_escape => true,
113
113
  :normalize => true}
114
114
  snippet = records_selected.expression.snippet(["<snippet>", "</snippet>"], options)
@@ -144,7 +144,7 @@ module Logaling
144
144
  {:key=>"source_term", :order=>'ascending'},
145
145
  {:key=>"target_term", :order=>'ascending'}])
146
146
 
147
- options = {:width => 100,
147
+ options = {:width => 5000,
148
148
  :html_escape => true,
149
149
  :normalize => true}
150
150
  snippet = records_selected.expression.snippet(["<snippet>", "</snippet>"], options)
@@ -54,6 +54,17 @@ module Logaling
54
54
  raise Logaling::CommandFailed, "Failed import #{glossary.class.name} to #{cache_path}."
55
55
  end
56
56
 
57
+ def import_tmx(glossary, glossary_info)
58
+ FileUtils.mkdir_p(cache_path) unless File.exist?(cache_path)
59
+ Dir.chdir(cache_path) do
60
+ glossary.import(glossary_info)
61
+ end
62
+ rescue Logaling::GlossaryNotFound => e
63
+ raise e
64
+ rescue
65
+ raise Logaling::CommandFailed, "Failed import_tmx #{glossary.class.name} to #{cache_path}."
66
+ end
67
+
57
68
  def lookup(source_term, glossary_source, dictionary=false)
58
69
  raise GlossaryDBNotFound unless File.exist?(logaling_db_home)
59
70
 
@@ -90,6 +90,7 @@ describe Logaling::Command::Application do
90
90
  context "when can not find .logaling" do
91
91
  before(:all) do
92
92
  FileUtils.rm_rf(logaling_config)
93
+ base_options["glossary"] = nil
93
94
  @stdout = capture(:stdout) {command.register}
94
95
  end
95
96
 
@@ -97,8 +98,8 @@ describe Logaling::Command::Application do
97
98
  Dir[File.join(logaling_home, "projects", "*")].size.should == @n_projects
98
99
  end
99
100
 
100
- it "print message \"Try 'loga new' first.\"" do
101
- @stdout.should be_include "Try 'loga new' first.\n"
101
+ it "print message \"Do 'loga register' at project directory.\"" do
102
+ @stdout.should be_include "Do 'loga register' at project directory."
102
103
  end
103
104
  end
104
105
 
@@ -131,13 +132,14 @@ describe Logaling::Command::Application do
131
132
  @stdout = capture(:stdout) {command.unregister}
132
133
  end
133
134
 
134
- it "should print message 'input glossary name ...'" do
135
- @stdout.should be_include "input glossary name"
135
+ it "should print message 'Do \'loga unregister\' at ...'" do
136
+ @stdout.should be_include "Do 'loga unregister' at project directory."
136
137
  end
137
138
  end
138
139
 
139
140
  context "and call with option" do
140
141
  before do
142
+ command.options = base_options.merge("glossary" => nil)
141
143
  command.new('spec', 'en', 'ja')
142
144
  @stdout = capture(:stdout) {command.unregister}
143
145
  end
@@ -150,6 +152,7 @@ describe Logaling::Command::Application do
150
152
  context 'when find .logaling' do
151
153
  context 'and .logaling registered' do
152
154
  before do
155
+ command.options = base_options.merge("glossary" => nil)
153
156
  command.new('spec', 'en', 'ja')
154
157
  command.register
155
158
  command.unregister
@@ -163,7 +166,7 @@ describe Logaling::Command::Application do
163
166
 
164
167
  context "and .logaling is not registered" do
165
168
  before do
166
- command.options = base_options.merge("no-register" => true)
169
+ command.options = base_options.merge("no-register" => true, "glossary" => nil)
167
170
  command.new('spec', 'en', 'ja')
168
171
  @stdout = capture(:stdout) {command.unregister}
169
172
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logaling-command
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,11 +13,11 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2012-03-29 00:00:00.000000000Z
16
+ date: 2012-05-02 00:00:00.000000000Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: thor
20
- requirement: &2154363820 !ruby/object:Gem::Requirement
20
+ requirement: &2161067140 !ruby/object:Gem::Requirement
21
21
  none: false
22
22
  requirements:
23
23
  - - ! '>='
@@ -25,10 +25,10 @@ dependencies:
25
25
  version: 0.14.6
26
26
  type: :runtime
27
27
  prerelease: false
28
- version_requirements: *2154363820
28
+ version_requirements: *2161067140
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: bundler
31
- requirement: &2154363340 !ruby/object:Gem::Requirement
31
+ requirement: &2161066660 !ruby/object:Gem::Requirement
32
32
  none: false
33
33
  requirements:
34
34
  - - ! '>='
@@ -36,10 +36,10 @@ dependencies:
36
36
  version: '1.0'
37
37
  type: :runtime
38
38
  prerelease: false
39
- version_requirements: *2154363340
39
+ version_requirements: *2161066660
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: rroonga
42
- requirement: &2154362860 !ruby/object:Gem::Requirement
42
+ requirement: &2161066180 !ruby/object:Gem::Requirement
43
43
  none: false
44
44
  requirements:
45
45
  - - ! '>='
@@ -47,10 +47,10 @@ dependencies:
47
47
  version: 1.3.0
48
48
  type: :runtime
49
49
  prerelease: false
50
- version_requirements: *2154362860
50
+ version_requirements: *2161066180
51
51
  - !ruby/object:Gem::Dependency
52
52
  name: rainbow
53
- requirement: &2154362480 !ruby/object:Gem::Requirement
53
+ requirement: &2161065800 !ruby/object:Gem::Requirement
54
54
  none: false
55
55
  requirements:
56
56
  - - ! '>='
@@ -58,10 +58,10 @@ dependencies:
58
58
  version: '0'
59
59
  type: :runtime
60
60
  prerelease: false
61
- version_requirements: *2154362480
61
+ version_requirements: *2161065800
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: nokogiri
64
- requirement: &2154362020 !ruby/object:Gem::Requirement
64
+ requirement: &2161065340 !ruby/object:Gem::Requirement
65
65
  none: false
66
66
  requirements:
67
67
  - - ! '>='
@@ -69,10 +69,10 @@ dependencies:
69
69
  version: '0'
70
70
  type: :runtime
71
71
  prerelease: false
72
- version_requirements: *2154362020
72
+ version_requirements: *2161065340
73
73
  - !ruby/object:Gem::Dependency
74
74
  name: activesupport
75
- requirement: &2154361600 !ruby/object:Gem::Requirement
75
+ requirement: &2161064920 !ruby/object:Gem::Requirement
76
76
  none: false
77
77
  requirements:
78
78
  - - ! '>='
@@ -80,10 +80,10 @@ dependencies:
80
80
  version: '0'
81
81
  type: :runtime
82
82
  prerelease: false
83
- version_requirements: *2154361600
83
+ version_requirements: *2161064920
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: rake
86
- requirement: &2154361180 !ruby/object:Gem::Requirement
86
+ requirement: &2153870360 !ruby/object:Gem::Requirement
87
87
  none: false
88
88
  requirements:
89
89
  - - ! '>='
@@ -91,10 +91,10 @@ dependencies:
91
91
  version: '0'
92
92
  type: :development
93
93
  prerelease: false
94
- version_requirements: *2154361180
94
+ version_requirements: *2153870360
95
95
  - !ruby/object:Gem::Dependency
96
96
  name: rspec
97
- requirement: &2154360760 !ruby/object:Gem::Requirement
97
+ requirement: &2153869940 !ruby/object:Gem::Requirement
98
98
  none: false
99
99
  requirements:
100
100
  - - ! '>='
@@ -102,7 +102,7 @@ dependencies:
102
102
  version: '0'
103
103
  type: :development
104
104
  prerelease: false
105
- version_requirements: *2154360760
105
+ version_requirements: *2153869940
106
106
  description: A command line interface for logaling.
107
107
  email:
108
108
  - koji.shimada@enishi-tech.com
@@ -135,6 +135,7 @@ files:
135
135
  - lib/logaling/external_glossaries/gnome_project.rb
136
136
  - lib/logaling/external_glossaries/mozilla_japan.rb
137
137
  - lib/logaling/external_glossaries/postgresql_manual.rb
138
+ - lib/logaling/external_glossaries/tmx.rb
138
139
  - lib/logaling/external_glossary.rb
139
140
  - lib/logaling/glossary.rb
140
141
  - lib/logaling/glossary_db.rb