konjac 0.1.4 → 0.1.5
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.
- data/README.md +4 -4
- data/konjac.gemspec +5 -3
- data/lib/konjac/cli.rb +92 -72
- data/lib/konjac/dictionary.rb +38 -11
- data/lib/konjac/exception.rb +0 -1
- data/lib/konjac/translator.rb +24 -6
- data/lib/konjac/utils.rb +12 -0
- data/lib/konjac/version.rb +1 -1
- data/lib/konjac/word.rb +84 -80
- data/spec/cli_spec.rb +7 -17
- data/spec/dictionary_spec.rb +3 -3
- data/spec/language_spec.rb +6 -0
- data/spec/utils_spec.rb +49 -0
- metadata +44 -24
- data/lib/konjac/cli/sub_command.rb +0 -20
- data/lib/konjac/cli/sub_command_manager.rb +0 -77
data/README.md
CHANGED
@@ -53,20 +53,20 @@ Usage
|
|
53
53
|
|
54
54
|
Translate all text files in the current directory from Japanese into English:
|
55
55
|
|
56
|
-
konjac translate *.txt from japanese to english
|
56
|
+
konjac translate *.txt --from japanese --to english
|
57
57
|
|
58
58
|
Utilize a document's implied language (English) and translate into Japanese:
|
59
59
|
|
60
|
-
konjac translate test_en.txt
|
60
|
+
konjac translate test_en.txt --to japanese
|
61
61
|
|
62
62
|
Use multiple dictionaries:
|
63
63
|
|
64
|
-
konjac translate financial_report_en.txt
|
64
|
+
konjac translate financial_report_en.txt --to japanese --using finance
|
65
65
|
|
66
66
|
Extract text from a DOCX document (creates a plain-text `test.konjac` file from
|
67
67
|
`test.docx`):
|
68
68
|
|
69
|
-
konjac
|
69
|
+
konjac export test
|
70
70
|
|
71
71
|
Import tags file back into DOCX document (file created is named
|
72
72
|
`test_imported.docx`):
|
data/konjac.gemspec
CHANGED
@@ -19,10 +19,12 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
21
|
s.add_runtime_dependency "nokogiri"
|
22
|
-
s.
|
23
|
-
s.
|
24
|
-
s.add_development_dependency "sdoc"
|
22
|
+
s.add_runtime_dependency "term-ansicolor"
|
23
|
+
s.add_runtime_dependency "trollop"
|
25
24
|
s.add_development_dependency "autotest"
|
26
25
|
s.add_development_dependency "autotest-fsevent"
|
27
26
|
s.add_development_dependency "autotest-growl"
|
27
|
+
s.add_development_dependency "bundler"
|
28
|
+
s.add_development_dependency "rspec"
|
29
|
+
s.add_development_dependency "sdoc"
|
28
30
|
end
|
data/lib/konjac/cli.rb
CHANGED
@@ -1,94 +1,114 @@
|
|
1
|
+
require "term/ansicolor"
|
2
|
+
require "trollop"
|
3
|
+
|
1
4
|
module Konjac
|
2
5
|
module CLI
|
3
|
-
|
4
|
-
|
6
|
+
class Color
|
7
|
+
extend Term::ANSIColor
|
8
|
+
end
|
5
9
|
|
6
10
|
class << self
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
@valid_commands.add :import, [:i, :m], "Import text back into a DOCX file" do
|
16
|
-
Word.import_docx_tags(ARGV)
|
17
|
-
end
|
18
|
-
@valid_commands.add :translate, [:t], "Translate a file" do
|
19
|
-
translate
|
20
|
-
end
|
21
|
-
end
|
11
|
+
SUB_COMMANDS = {
|
12
|
+
"edit" => "Edit the tags file for a .docx file",
|
13
|
+
"export" => "Export text tags from a .docx file",
|
14
|
+
"import" => "Import text tags into a .docx file",
|
15
|
+
"translate" => "Translate a file according to ~/.konjac/dict.yml"
|
16
|
+
}
|
17
|
+
BANNER = <<-eos
|
18
|
+
#{Color.bold "%s"}
|
22
19
|
|
23
|
-
|
24
|
-
|
25
|
-
|
20
|
+
#{Color.bold "Usage:"}
|
21
|
+
konjac %s [#{Color.underscore "options"}] <filenames>+%s
|
22
|
+
where [#{Color.underscore "options"}] are:
|
23
|
+
eos
|
26
24
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
25
|
+
def start
|
26
|
+
global_opts = Trollop::options do
|
27
|
+
version "konjac #{Konjac::VERSION} (c) 2012 Bryan McKelvey"
|
28
|
+
banner BANNER % [
|
29
|
+
"konjac is a Ruby command-line utility for translating files " +
|
30
|
+
"using a YAML wordlist",
|
31
|
+
"[#{Color.underscore "subcommand"}]",
|
32
|
+
"\n\nwhere [#{Color.underscore "subcommand"}] is any one of:\n%s\n" %
|
33
|
+
Konjac::CLI.describe_subcommands
|
34
|
+
]
|
35
|
+
opt :dry_run, "Don't actually do anything", :short => "n"
|
36
|
+
opt :quiet, "Suppress error messages"
|
37
|
+
stop_on SUB_COMMANDS.keys
|
34
38
|
end
|
35
39
|
|
36
|
-
|
40
|
+
# Get subcommand
|
41
|
+
cmd = ARGV.shift
|
42
|
+
sc_banner = BANNER % [SUB_COMMANDS[cmd], cmd, ""]
|
43
|
+
cmd_opts = case cmd
|
44
|
+
when "edit"
|
45
|
+
Trollop::options do
|
46
|
+
banner sc_banner
|
47
|
+
opt :editor, "A command indicating which editor to use (e.g. vi %s)"
|
48
|
+
end
|
49
|
+
Word.edit_docx_tags ARGV, opts
|
50
|
+
when "extract", "export"
|
51
|
+
Trollop::options do
|
52
|
+
banner sc_banner
|
53
|
+
end
|
54
|
+
Word.extract_docx_tags ARGV
|
55
|
+
when "import"
|
56
|
+
Trollop::options do
|
57
|
+
banner sc_banner
|
58
|
+
end
|
59
|
+
Word.import_docx_tags ARGV
|
60
|
+
when "translate"
|
61
|
+
opts = Trollop::options do
|
62
|
+
banner sc_banner
|
63
|
+
opt :from, "The language from which to translate", :type => :string
|
64
|
+
opt :to, "The language into which to translate", :type => :string
|
65
|
+
opt :using, "The names of dictionaries to use", :type => :string,
|
66
|
+
:default => "dict", :multi => true
|
67
|
+
opt :use_cache, "Use cached dictionary", :default => false
|
68
|
+
opt :word, "Translate a word or phrase", :default => false
|
69
|
+
end
|
70
|
+
result = translate(ARGV, opts)
|
71
|
+
puts result if opts[:word]
|
72
|
+
else
|
73
|
+
Trollop::die "unknown subcommand #{cmd.inspect}"
|
74
|
+
end
|
37
75
|
end
|
38
76
|
|
39
|
-
|
40
|
-
|
77
|
+
# Describe the subcommands available to the command line interface
|
78
|
+
def describe_subcommands
|
79
|
+
text = []
|
80
|
+
leftcol_width = SUB_COMMANDS.keys.map(&:length).max
|
81
|
+
SUB_COMMANDS.each do |sc, desc|
|
82
|
+
text << " %#{leftcol_width}s: %s" % [sc, desc]
|
83
|
+
end
|
84
|
+
text.join "\n"
|
41
85
|
end
|
42
86
|
|
43
87
|
private
|
88
|
+
|
89
|
+
def translate(files, opts = {})
|
90
|
+
to_lang = Language.find(opts[:to]).to_s
|
44
91
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
unless using_index.nil?
|
49
|
-
ARGV.delete_at using_index
|
50
|
-
dictionaries = []
|
51
|
-
while ARGV.length > using_index && !["from", "to", "into"].include?(ARGV[using_index])
|
52
|
-
dictionaries << ARGV.delete_at(using_index)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
# Get from language
|
57
|
-
from_index = ARGV.index("from")
|
58
|
-
unless from_index.nil?
|
59
|
-
ARGV.delete_at from_index
|
60
|
-
from_lang = ARGV.delete_at(from_index)
|
61
|
-
end
|
62
|
-
|
63
|
-
# Get to language
|
64
|
-
to_index = ARGV.index("to") || ARGV.index("into")
|
65
|
-
if to_index.nil?
|
66
|
-
raise InvalidLanguageError.new("You must supply a to language")
|
92
|
+
if opts[:word]
|
93
|
+
from_lang = Language.find(opts[:from]).to_s
|
94
|
+
Translator.translate_word ARGV[0].dup, from_lang, to_lang, opts
|
67
95
|
else
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
# Get a list of files to translate
|
73
|
-
files = []
|
74
|
-
while !ARGV.empty?
|
75
|
-
files += Dir.glob(File.expand_path(ARGV.shift))
|
76
|
-
end
|
77
|
-
raise FileNotFoundError.new("File not found") if files.empty?
|
78
|
-
files.uniq!
|
96
|
+
# Get a list of files to translate
|
97
|
+
parsed_files = Utils.parse_files(files)
|
98
|
+
raise FileNotFoundError.new("File not found") if parsed_files.empty?
|
79
99
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
100
|
+
# Determine from language from first filename if not supplied
|
101
|
+
if opts[:from].nil?
|
102
|
+
opts[:from] = Utils.extract_language_code_from_filename(parsed_files[0])
|
103
|
+
if opts[:from].nil?
|
104
|
+
raise InvalidLanguageError.new("You must supply a from language")
|
105
|
+
end
|
85
106
|
end
|
86
|
-
end
|
87
107
|
|
88
|
-
|
89
|
-
to_lang = Language.find(to_lang).to_s
|
108
|
+
from_lang = Language.find(opts[:from]).to_s
|
90
109
|
|
91
|
-
|
110
|
+
Translator.translate_files parsed_files, from_lang, to_lang, opts
|
111
|
+
end
|
92
112
|
end
|
93
113
|
end
|
94
114
|
end
|
data/lib/konjac/dictionary.rb
CHANGED
@@ -7,28 +7,29 @@ module Konjac
|
|
7
7
|
|
8
8
|
BLANK = /^\s*$/
|
9
9
|
|
10
|
-
def load(from_lang, to_lang,
|
11
|
-
# Set defaults for optional arguments
|
12
|
-
opts = { :force => false }.merge(opts)
|
13
|
-
dictionaries = ["dict"] if dictionaries.nil?
|
14
|
-
|
10
|
+
def load(from_lang, to_lang, opts = {})
|
15
11
|
# Allow both symbol and string arguments for languages
|
16
12
|
from_lang = from_lang.to_s
|
17
13
|
to_lang = to_lang.to_s
|
18
14
|
|
19
15
|
# Ignore everything if we've been here before
|
20
|
-
return @pairs if loaded?(from_lang, to_lang,
|
16
|
+
return @pairs if loaded?(from_lang, to_lang, opts[:using])
|
17
|
+
|
18
|
+
if opts[:use_cache]
|
19
|
+
@pairs = load_serialized(from_lang, to_lang, opts[:using])
|
20
|
+
return @pairs unless @pairs.nil?
|
21
|
+
end
|
21
22
|
|
22
23
|
# Build a regex template for the from language
|
23
24
|
from_template = build_regex_template(from_lang)
|
24
25
|
to_template = build_replacement_template(from_lang, to_lang)
|
25
26
|
|
26
27
|
# Save variables to cache so we can avoid repetitive requests
|
27
|
-
cache_load from_lang, to_lang,
|
28
|
+
cache_load from_lang, to_lang, opts[:using]
|
28
29
|
|
29
30
|
# Make sure dictionary exists and load
|
30
31
|
@dictionary = []
|
31
|
-
|
32
|
+
opts[:using].each do |dict|
|
32
33
|
if dict =~ /[\/.]/
|
33
34
|
sub_dictionaries = Dir.glob(File.expand_path(dict))
|
34
35
|
else
|
@@ -49,6 +50,7 @@ module Konjac
|
|
49
50
|
@pairs << pair unless pair.nil?
|
50
51
|
end
|
51
52
|
|
53
|
+
save_serialized from_lang, to_lang, dictionaries, @pairs
|
52
54
|
@pairs
|
53
55
|
end
|
54
56
|
|
@@ -104,9 +106,10 @@ module Konjac
|
|
104
106
|
# Tests whether the same from language, to language and dictionary path
|
105
107
|
# have been loaded before
|
106
108
|
def loaded?(from_lang, to_lang, dictionaries)
|
107
|
-
(@from_lang == from_lang) &&
|
108
|
-
(@to_lang == to_lang
|
109
|
-
(@dictionaries == dictionaries)
|
109
|
+
(@from_lang == from_lang ) &&
|
110
|
+
(@to_lang == to_lang ) &&
|
111
|
+
(@dictionaries == dictionaries) &&
|
112
|
+
!@pairs.nil?
|
110
113
|
end
|
111
114
|
|
112
115
|
# Builds a regular expression template for the language depending on
|
@@ -152,6 +155,30 @@ module Konjac
|
|
152
155
|
@to_lang = to_lang
|
153
156
|
@dictionaries = dictionaries
|
154
157
|
end
|
158
|
+
|
159
|
+
def load_serialized(from_lang, to_lang, dictionaries)
|
160
|
+
file_name = File.expand_path("~/.konjac/marshal/%s_%s_%s" %
|
161
|
+
[from_lang, to_lang, dictionaries.join("_")])
|
162
|
+
if File.exists?(file_name)
|
163
|
+
Marshal.load file_name
|
164
|
+
else
|
165
|
+
nil
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def save_serialized(from_lang, to_lang, dictionaries, pairs)
|
170
|
+
file_name = File.expand_path("~/.konjac/marshal/%s_%s_%s" %
|
171
|
+
[from_lang, to_lang, dictionaries.join("_")])
|
172
|
+
|
173
|
+
# Create directory structure if necessary
|
174
|
+
unless File.exists?(file_name)
|
175
|
+
FileUtils.mkdir_p File.dirname(file_name)
|
176
|
+
end
|
177
|
+
|
178
|
+
File.open(file_name, "w") do |file|
|
179
|
+
Marshal.dump(pairs, file)
|
180
|
+
end
|
181
|
+
end
|
155
182
|
end
|
156
183
|
end
|
157
184
|
end
|
data/lib/konjac/exception.rb
CHANGED
data/lib/konjac/translator.rb
CHANGED
@@ -2,16 +2,13 @@
|
|
2
2
|
module Konjac
|
3
3
|
module Translator
|
4
4
|
class << self
|
5
|
-
def
|
6
|
-
|
5
|
+
def translate_files(files, from_lang, to_lang, opts = {})
|
6
|
+
load_dictionary from_lang, to_lang, opts
|
7
7
|
|
8
8
|
files.each do |source|
|
9
9
|
# Read in file and replace matches in content
|
10
10
|
content = File.read(source)
|
11
|
-
|
12
|
-
search, replace = pair
|
13
|
-
content.gsub! search, replace
|
14
|
-
end
|
11
|
+
content = translate_content(content)
|
15
12
|
|
16
13
|
# Write changed content to file
|
17
14
|
File.open(Utils.build_converted_file_name(source, from_lang, to_lang), "w") do |file|
|
@@ -19,6 +16,27 @@ module Konjac
|
|
19
16
|
end
|
20
17
|
end
|
21
18
|
end
|
19
|
+
|
20
|
+
def translate_word(word, from_lang, to_lang, opts = {})
|
21
|
+
load_dictionary from_lang, to_lang, opts
|
22
|
+
|
23
|
+
translate_content word
|
24
|
+
end
|
25
|
+
|
26
|
+
def translate_content(content)
|
27
|
+
@pairs.each do |pair|
|
28
|
+
search, replace = pair
|
29
|
+
content.gsub! search, replace
|
30
|
+
end
|
31
|
+
|
32
|
+
content
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def load_dictionary(from_lang, to_lang, opts)
|
38
|
+
@pairs = Dictionary.load(from_lang, to_lang, opts)
|
39
|
+
end
|
22
40
|
end
|
23
41
|
end
|
24
42
|
end
|
data/lib/konjac/utils.rb
CHANGED
@@ -24,6 +24,18 @@ module Konjac
|
|
24
24
|
|
25
25
|
"#{dirname}/#{basename}_#{to_lang}#{extname}"
|
26
26
|
end
|
27
|
+
|
28
|
+
# Parses a list of files
|
29
|
+
def parse_files(files, ext = nil)
|
30
|
+
files = [files] unless files.is_a?(Array)
|
31
|
+
parsed_files = []
|
32
|
+
while !files.empty?
|
33
|
+
file = files.shift
|
34
|
+
file = file.sub(/\.[^\\\/]*$/, "") + ext unless ext.nil?
|
35
|
+
parsed_files += Dir.glob(File.expand_path(file))
|
36
|
+
end
|
37
|
+
parsed_files.uniq
|
38
|
+
end
|
27
39
|
end
|
28
40
|
end
|
29
41
|
end
|
data/lib/konjac/version.rb
CHANGED
data/lib/konjac/word.rb
CHANGED
@@ -5,103 +5,107 @@ module Konjac
|
|
5
5
|
class << self
|
6
6
|
# Extracts the text content from a Microsoft Word 2003+ Document
|
7
7
|
def import_docx_tags(files)
|
8
|
-
files.
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
nodes[tag.index].content = tag.translated
|
29
|
-
end
|
8
|
+
sub_files = Utils.force_extension(files, ".docx")
|
9
|
+
sub_files.each do |sub_file|
|
10
|
+
# Build the list of paths we need to work with
|
11
|
+
dirname = File.dirname(sub_file)
|
12
|
+
basename = File.basename(sub_file, ".*")
|
13
|
+
orig_docx = "#{dirname}/#{basename}.docx"
|
14
|
+
new_path = "#{dirname}/#{basename}_imported.docx"
|
15
|
+
xml_path = "#{dirname}/#{basename}.xml"
|
16
|
+
tags_path = "#{dirname}/#{basename}.konjac"
|
17
|
+
out_path = "#{dirname}/word/document.xml"
|
18
|
+
|
19
|
+
# Open the original XML file and the updated tags
|
20
|
+
writer = Nokogiri::XML(File.read(xml_path))
|
21
|
+
nodes = writer.xpath("//w:t")
|
22
|
+
tags = TagManager.new(tags_path)
|
23
|
+
|
24
|
+
# Overwrite each <w:t> tag's content with the new tag
|
25
|
+
tags.all.each do |tag|
|
26
|
+
if tag.translated?
|
27
|
+
nodes[tag.index].content = tag.translated
|
30
28
|
end
|
29
|
+
end
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
# Create a directory for word/document.xml if necessary
|
32
|
+
unless File.directory?("#{dirname}/word")
|
33
|
+
FileUtils.mkdir "#{dirname}/word"
|
34
|
+
end
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
36
|
+
# Write the modified XML to a file
|
37
|
+
File.open(out_path, "w") do |file|
|
38
|
+
file.write writer.to_xml.gsub(/\n\s*/, "").sub(/\?></, "?>\n<")
|
39
|
+
end
|
41
40
|
|
42
|
-
|
43
|
-
|
41
|
+
# Copy the original file
|
42
|
+
FileUtils.cp orig_docx, new_path
|
44
43
|
|
45
|
-
|
46
|
-
|
47
|
-
end
|
44
|
+
# Add the new document XML to the copied file
|
45
|
+
system "cd #{dirname} && zip -q #{new_path} word/document.xml"
|
48
46
|
end
|
49
47
|
end
|
50
48
|
|
51
49
|
# Extracts the text content from a Microsoft Word 2003+ Document
|
52
50
|
def extract_docx_tags(files)
|
53
|
-
files.
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
node.at_xpath("w:t").content
|
81
|
-
|
82
|
-
|
83
|
-
rescue
|
84
|
-
end
|
51
|
+
sub_files = Utils.force_extension(files, ".docx")
|
52
|
+
sub_files.each do |sub_file|
|
53
|
+
# Build a list of all the paths we're working with
|
54
|
+
dirname = File.dirname(sub_file)
|
55
|
+
basename = File.basename(sub_file, ".*")
|
56
|
+
orig_docx = "#{dirname}/#{basename}.docx"
|
57
|
+
xml_path = "#{dirname}/#{basename}_orig.xml"
|
58
|
+
clean_path = "#{dirname}/#{basename}.xml"
|
59
|
+
tags_path = "#{dirname}/#{basename}.konjac"
|
60
|
+
|
61
|
+
# Unzip the DOCX's word/document.xml file and pipe the output into
|
62
|
+
# an XML with the same base name as the DOCX
|
63
|
+
system "unzip -p #{orig_docx} word/document.xml > #{xml_path}"
|
64
|
+
|
65
|
+
# Read in the XML file and extract the content from each <w:t> tag
|
66
|
+
cleaner = Nokogiri::XML(File.read(xml_path))
|
67
|
+
File.open(tags_path, "w") do |tags_file|
|
68
|
+
# Remove all grammar and spellcheck tags
|
69
|
+
cleaner.xpath("//w:proofErr").remove
|
70
|
+
|
71
|
+
nodes = cleaner.xpath("//w:r")
|
72
|
+
prev = nil
|
73
|
+
nodes.each do |node|
|
74
|
+
unless prev.nil?
|
75
|
+
if (prev.next_sibling == node) && compare_nodes(prev, node)
|
76
|
+
begin
|
77
|
+
node.at_xpath("w:t").content = prev.at_xpath("w:t").content +
|
78
|
+
node.at_xpath("w:t").content
|
79
|
+
prev.remove
|
80
|
+
rescue
|
85
81
|
end
|
86
82
|
end
|
87
|
-
|
88
|
-
prev = node
|
89
|
-
end
|
90
|
-
|
91
|
-
# Write the tags file
|
92
|
-
index = 0
|
93
|
-
cleaner.xpath("//w:t").each do |node|
|
94
|
-
tags_file.puts "[[KJ-%i]]%s" % [index, additional_info(node)]
|
95
|
-
tags_file.puts "> %s" % node.content
|
96
|
-
index += 1
|
97
83
|
end
|
84
|
+
|
85
|
+
prev = node
|
98
86
|
end
|
99
87
|
|
100
|
-
# Write the
|
101
|
-
|
102
|
-
|
88
|
+
# Write the tags file
|
89
|
+
index = 0
|
90
|
+
cleaner.xpath("//w:t").each do |node|
|
91
|
+
tags_file.puts "[[KJ-%i]]%s" % [index, additional_info(node)]
|
92
|
+
tags_file.puts "> %s" % node.content
|
93
|
+
index += 1
|
103
94
|
end
|
104
95
|
end
|
96
|
+
|
97
|
+
# Write the cleaned-up XML to a file for inspection
|
98
|
+
File.open(clean_path, "w") do |xml|
|
99
|
+
xml.puts cleaner.to_xml
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# Opens the .konjac tag files for the specified DOCX files
|
105
|
+
def edit_docx_tags(files)
|
106
|
+
sub_files = Utils.force_extension(files, ".konjac")
|
107
|
+
sub_files.each do |sub_file|
|
108
|
+
system "$EDITOR #{sub_file}"
|
105
109
|
end
|
106
110
|
end
|
107
111
|
|
data/spec/cli_spec.rb
CHANGED
@@ -12,7 +12,7 @@ describe CLI do
|
|
12
12
|
|
13
13
|
it "should fail on an invalid subcommand" do
|
14
14
|
set_argv "invalid"
|
15
|
-
lambda { CLI.start }.should raise_error
|
15
|
+
lambda { CLI.start }.should raise_error SystemExit
|
16
16
|
end
|
17
17
|
|
18
18
|
describe "temporary files" do
|
@@ -32,25 +32,15 @@ describe CLI do
|
|
32
32
|
@english.rewind
|
33
33
|
|
34
34
|
# Set ARGV
|
35
|
-
set_argv "translate",
|
36
|
-
@
|
35
|
+
set_argv "translate", "-t", "japanese", "-u", @dictionary.path,
|
36
|
+
@english.path
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should correctly translate English text" do
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
File.read(converted_path).should == "I like 犬.\n"
|
45
|
-
ensure
|
46
|
-
@dictionary.close!
|
47
|
-
@english.close!
|
48
|
-
File.delete converted_path
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
it "should return the name of the sub_command" do
|
53
|
-
CLI.start.should == :translate
|
40
|
+
CLI.start
|
41
|
+
converted_path = Utils.build_converted_file_name(@english.path, "en", "ja")
|
42
|
+
File.read(@english.path).should == "I like dogs."
|
43
|
+
File.read(converted_path).should == "I like 犬.\n"
|
54
44
|
end
|
55
45
|
end
|
56
46
|
end
|
data/spec/dictionary_spec.rb
CHANGED
@@ -37,7 +37,7 @@ describe Dictionary do
|
|
37
37
|
|
38
38
|
describe "when converting from English to Japanese" do
|
39
39
|
before :each do
|
40
|
-
Dictionary.load "en", "ja", [@dictionary.path]
|
40
|
+
Dictionary.load "en", "ja", { :using => [@dictionary.path] }
|
41
41
|
end
|
42
42
|
|
43
43
|
it "should correctly load a simple term" do
|
@@ -68,7 +68,7 @@ describe Dictionary do
|
|
68
68
|
|
69
69
|
describe "when converting from Japanese to English" do
|
70
70
|
before :each do
|
71
|
-
Dictionary.load "ja", "en", [@dictionary.path]
|
71
|
+
Dictionary.load "ja", "en", { :using => [@dictionary.path] }
|
72
72
|
end
|
73
73
|
|
74
74
|
it "should add whitespace to term replacement" do
|
@@ -78,7 +78,7 @@ describe Dictionary do
|
|
78
78
|
|
79
79
|
describe "when converting from English to Spanish" do
|
80
80
|
before :each do
|
81
|
-
Dictionary.load "en", "es", [@dictionary.path]
|
81
|
+
Dictionary.load "en", "es", { :using => [@dictionary.path] }
|
82
82
|
end
|
83
83
|
|
84
84
|
it "should not add whitespace to term replacement" do
|
data/spec/language_spec.rb
CHANGED
@@ -6,6 +6,12 @@ describe Language do
|
|
6
6
|
Language.find(:eng).should == :en
|
7
7
|
end
|
8
8
|
|
9
|
+
it "should find French" do
|
10
|
+
Language.find(:french).should == :fr
|
11
|
+
Language.find(:fre).should == :fr
|
12
|
+
Language.find(:fra).should == :fr
|
13
|
+
end
|
14
|
+
|
9
15
|
it "should find Japanese" do
|
10
16
|
Language.find(:japanese).should == :ja
|
11
17
|
Language.find(:jpn).should == :ja
|
data/spec/utils_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require File.dirname(__FILE__) + "/spec_helper"
|
2
|
+
require "tempfile"
|
2
3
|
|
3
4
|
describe Utils do
|
4
5
|
it "should extract the correct language from a filename" do
|
@@ -10,4 +11,52 @@ describe Utils do
|
|
10
11
|
Utils.build_converted_file_name("./test.txt", "en", "ja").should == "./test_ja.txt"
|
11
12
|
Utils.build_converted_file_name("./test_fr.txt", "en", "ja").should == "./test_fr_ja.txt"
|
12
13
|
end
|
14
|
+
|
15
|
+
describe "when forcing an extension" do
|
16
|
+
before :each do
|
17
|
+
@konjac = Tempfile.new(["test", ".konjac"])
|
18
|
+
@kon2 = Tempfile.new(["test2", ".konjac"])
|
19
|
+
@docx = Tempfile.new(["test", ".docx"])
|
20
|
+
@doc2 = Tempfile.new(["test2", ".docx"])
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should work when the user does not specify an extension" do
|
24
|
+
files_found = Utils.parse_files("#{Dir.tmpdir}/*", ".konjac")
|
25
|
+
files_found.should include @konjac.path
|
26
|
+
files_found.should include @kon2.path
|
27
|
+
files_found.should_not include @docx.path
|
28
|
+
files_found.should_not include @doc2.path
|
29
|
+
files_found = Utils.parse_files("#{Dir.tmpdir}/*", ".docx")
|
30
|
+
files_found.should include @docx.path
|
31
|
+
files_found.should include @doc2.path
|
32
|
+
files_found.should_not include @konjac.path
|
33
|
+
files_found.should_not include @kon2.path
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should work when the user does specify an extension" do
|
37
|
+
files_found = Utils.parse_files("#{Dir.tmpdir}/*.docx", ".konjac")
|
38
|
+
files_found.should include @konjac.path
|
39
|
+
files_found.should include @kon2.path
|
40
|
+
files_found.should_not include @docx.path
|
41
|
+
files_found.should_not include @doc2.path
|
42
|
+
files_found = Utils.parse_files("#{Dir.tmpdir}/*.docx", ".docx")
|
43
|
+
files_found.should include @docx.path
|
44
|
+
files_found.should include @doc2.path
|
45
|
+
files_found.should_not include @konjac.path
|
46
|
+
files_found.should_not include @kon2.path
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should work when the user supplies wildcards" do
|
50
|
+
files_found = Utils.parse_files("#{Dir.tmpdir}/*.*", ".konjac")
|
51
|
+
files_found.should include @konjac.path
|
52
|
+
files_found.should include @kon2.path
|
53
|
+
files_found.should_not include @docx.path
|
54
|
+
files_found.should_not include @doc2.path
|
55
|
+
files_found = Utils.parse_files("#{Dir.tmpdir}/*.*", ".docx")
|
56
|
+
files_found.should include @docx.path
|
57
|
+
files_found.should include @doc2.path
|
58
|
+
files_found.should_not include @konjac.path
|
59
|
+
files_found.should_not include @kon2.path
|
60
|
+
end
|
61
|
+
end
|
13
62
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: konjac
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-01-
|
12
|
+
date: 2012-01-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
16
|
-
requirement: &
|
16
|
+
requirement: &70250662109380 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,32 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70250662109380
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
requirement: &
|
26
|
+
name: term-ansicolor
|
27
|
+
requirement: &70250662108960 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70250662108960
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: trollop
|
38
|
+
requirement: &70250662108540 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70250662108540
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: autotest
|
49
|
+
requirement: &70250662124620 !ruby/object:Gem::Requirement
|
28
50
|
none: false
|
29
51
|
requirements:
|
30
52
|
- - ! '>='
|
@@ -32,10 +54,10 @@ dependencies:
|
|
32
54
|
version: '0'
|
33
55
|
type: :development
|
34
56
|
prerelease: false
|
35
|
-
version_requirements: *
|
57
|
+
version_requirements: *70250662124620
|
36
58
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
38
|
-
requirement: &
|
59
|
+
name: autotest-fsevent
|
60
|
+
requirement: &70250662124060 !ruby/object:Gem::Requirement
|
39
61
|
none: false
|
40
62
|
requirements:
|
41
63
|
- - ! '>='
|
@@ -43,10 +65,10 @@ dependencies:
|
|
43
65
|
version: '0'
|
44
66
|
type: :development
|
45
67
|
prerelease: false
|
46
|
-
version_requirements: *
|
68
|
+
version_requirements: *70250662124060
|
47
69
|
- !ruby/object:Gem::Dependency
|
48
|
-
name:
|
49
|
-
requirement: &
|
70
|
+
name: autotest-growl
|
71
|
+
requirement: &70250662123300 !ruby/object:Gem::Requirement
|
50
72
|
none: false
|
51
73
|
requirements:
|
52
74
|
- - ! '>='
|
@@ -54,10 +76,10 @@ dependencies:
|
|
54
76
|
version: '0'
|
55
77
|
type: :development
|
56
78
|
prerelease: false
|
57
|
-
version_requirements: *
|
79
|
+
version_requirements: *70250662123300
|
58
80
|
- !ruby/object:Gem::Dependency
|
59
|
-
name:
|
60
|
-
requirement: &
|
81
|
+
name: bundler
|
82
|
+
requirement: &70250662122840 !ruby/object:Gem::Requirement
|
61
83
|
none: false
|
62
84
|
requirements:
|
63
85
|
- - ! '>='
|
@@ -65,10 +87,10 @@ dependencies:
|
|
65
87
|
version: '0'
|
66
88
|
type: :development
|
67
89
|
prerelease: false
|
68
|
-
version_requirements: *
|
90
|
+
version_requirements: *70250662122840
|
69
91
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
71
|
-
requirement: &
|
92
|
+
name: rspec
|
93
|
+
requirement: &70250662122420 !ruby/object:Gem::Requirement
|
72
94
|
none: false
|
73
95
|
requirements:
|
74
96
|
- - ! '>='
|
@@ -76,10 +98,10 @@ dependencies:
|
|
76
98
|
version: '0'
|
77
99
|
type: :development
|
78
100
|
prerelease: false
|
79
|
-
version_requirements: *
|
101
|
+
version_requirements: *70250662122420
|
80
102
|
- !ruby/object:Gem::Dependency
|
81
|
-
name:
|
82
|
-
requirement: &
|
103
|
+
name: sdoc
|
104
|
+
requirement: &70250662121920 !ruby/object:Gem::Requirement
|
83
105
|
none: false
|
84
106
|
requirements:
|
85
107
|
- - ! '>='
|
@@ -87,7 +109,7 @@ dependencies:
|
|
87
109
|
version: '0'
|
88
110
|
type: :development
|
89
111
|
prerelease: false
|
90
|
-
version_requirements: *
|
112
|
+
version_requirements: *70250662121920
|
91
113
|
description: A Ruby command-line utility for translating files using a YAML wordlist
|
92
114
|
email:
|
93
115
|
- bryan.mckelvey@gmail.com
|
@@ -107,8 +129,6 @@ files:
|
|
107
129
|
- konjac.gemspec
|
108
130
|
- lib/konjac.rb
|
109
131
|
- lib/konjac/cli.rb
|
110
|
-
- lib/konjac/cli/sub_command.rb
|
111
|
-
- lib/konjac/cli/sub_command_manager.rb
|
112
132
|
- lib/konjac/dictionary.rb
|
113
133
|
- lib/konjac/exception.rb
|
114
134
|
- lib/konjac/language.rb
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Konjac
|
2
|
-
module CLI
|
3
|
-
class SubCommand
|
4
|
-
attr :name, :aliases, :description
|
5
|
-
|
6
|
-
def initialize(name, aliases, description, &block)
|
7
|
-
@name, @aliases, @description = name, aliases, description
|
8
|
-
@block = block
|
9
|
-
end
|
10
|
-
|
11
|
-
def alias_text
|
12
|
-
@aliases.join ", "
|
13
|
-
end
|
14
|
-
|
15
|
-
def execute
|
16
|
-
@block.call
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,77 +0,0 @@
|
|
1
|
-
module Konjac
|
2
|
-
module CLI
|
3
|
-
class SubCommandManager
|
4
|
-
def initialize
|
5
|
-
@sub_commands ||= []
|
6
|
-
end
|
7
|
-
|
8
|
-
def add(name, aliases, description, &block)
|
9
|
-
@sub_commands << SubCommand.new(name, aliases, description, &block)
|
10
|
-
end
|
11
|
-
|
12
|
-
def execute(sub_command)
|
13
|
-
sub_command = sub_command.to_sym
|
14
|
-
|
15
|
-
@sub_commands.each do |sc|
|
16
|
-
if sc.name == sub_command || sc.aliases.include?(sub_command)
|
17
|
-
sc.execute
|
18
|
-
return sc.name
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
return nil
|
23
|
-
end
|
24
|
-
|
25
|
-
def all
|
26
|
-
@sub_commands
|
27
|
-
end
|
28
|
-
|
29
|
-
def get_lengths
|
30
|
-
@lengths = { :name => 8, :aliases => 7, :description => 11 }
|
31
|
-
|
32
|
-
@sub_commands.each do |sc|
|
33
|
-
if sc.name.length > @lengths[:name]
|
34
|
-
@lengths[:name] = sc.name.length
|
35
|
-
end
|
36
|
-
if sc.alias_text.length > @lengths[:aliases]
|
37
|
-
@lengths[:aliases] = sc.alias_text.length
|
38
|
-
end
|
39
|
-
if sc.description.length > @lengths[:description]
|
40
|
-
@lengths[:description] = sc.description.length
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def to_s
|
46
|
-
get_lengths
|
47
|
-
text = "\n"
|
48
|
-
|
49
|
-
header_lines = "%s %s %s\n" % [
|
50
|
-
"-" * @lengths[:name],
|
51
|
-
"-" * @lengths[:aliases],
|
52
|
-
"-" * @lengths[:description]
|
53
|
-
]
|
54
|
-
|
55
|
-
# Create headers
|
56
|
-
text << header_lines
|
57
|
-
text << "%s %s %s\n" % [
|
58
|
-
"Commands".ljust(@lengths[:name]),
|
59
|
-
"Aliases".ljust(@lengths[:aliases]),
|
60
|
-
"Description".ljust(@lengths[:description])
|
61
|
-
]
|
62
|
-
text << header_lines
|
63
|
-
|
64
|
-
# Write descriptions of each subcommand
|
65
|
-
@sub_commands.each do |sc|
|
66
|
-
text << "%s %s %s\n" % [
|
67
|
-
sc.name.to_s.ljust(@lengths[:name]),
|
68
|
-
sc.alias_text.to_s.ljust(@lengths[:aliases]),
|
69
|
-
sc.description.to_s.ljust(@lengths[:description])
|
70
|
-
]
|
71
|
-
end
|
72
|
-
|
73
|
-
text
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|