konjac 0.0.1 → 0.0.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.
data/.autotest ADDED
@@ -0,0 +1,2 @@
1
+ require "autotest/fsevent"
2
+ require "autotest/growl"
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
- *.gem
2
- .bundle
3
- Gemfile.lock
4
- pkg/*
1
+ *.gem
2
+ .bundle
3
+ .DS_Store
4
+ Gemfile.lock
5
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source "http://rubygems.org"
2
-
3
- # Specify your gem's dependencies in konjac.gemspec
4
- gemspec
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in konjac.gemspec
4
+ gemspec
data/LICENSE CHANGED
@@ -1,19 +1,19 @@
1
- Copyright (c) 2012 Bryan McKelvey
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining a copy of
4
- this software and associated documentation files (the "Software"), to deal in
5
- the Software without restriction, including without limitation the rights to
6
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
- of the Software, and to permit persons to whom the Software is furnished to do
8
- so, subject to the following conditions:
9
-
10
- The above copyright notice and this permission notice shall be included in all
11
- copies or substantial portions of the Software.
12
-
13
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
- SOFTWARE.
1
+ Copyright (c) 2012 Bryan McKelvey
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
data/README.md CHANGED
@@ -1,36 +1,112 @@
1
- konjac
2
- ======
3
-
4
- A Ruby command-line utility for translating files using a YAML wordlist
5
-
6
- Usage
7
- -----
8
-
9
- Create a file in `~/.konjac/` called `dict.yml`. The file should have the
10
- following format:
11
-
12
- languages:
13
- en:
14
- - english
15
- - eng
16
- ja:
17
- - japanese
18
- - jpn
19
-
20
- ...
21
-
22
- terms:
23
- -
24
- en: japanese
25
- ja: nihongo
26
- -
27
- en: book
28
- ja: hon
29
-
30
- Name
31
- ----
32
-
33
- *Hon'yaku* means "translation" in Japanese. This utility relies on a YAML
34
- wordlist. *Konnyaku* (Japanese for "konjac") rhymes with *hon'yaku* and is a
35
- type of yam. Also, Doraemon had something called a *hon'yaku konnyaku* that
36
- allowed one to listen to animals. But I digress.
1
+ konjac
2
+ ======
3
+
4
+ A Ruby command-line utility for translating files using a YAML wordlist
5
+
6
+ Installation
7
+ ------------
8
+
9
+ ### Stable
10
+
11
+ With [Ruby](http://www.ruby-lang.org/en/downloads/) installed, run the
12
+ following in your terminal:
13
+
14
+ gem install konjac
15
+
16
+ ### Development
17
+
18
+ With Ruby and [Git](http://help.github.com/set-up-git-redirect) installed,
19
+ navigate in your command line to a directory of your choice, then run:
20
+
21
+ git clone git://github.com/brymck/konjac.git
22
+ cd konjac
23
+ rake install
24
+
25
+ Usage
26
+ -----
27
+
28
+ Create a file in `~/.konjac/` called `dict.yml`. The file should have the
29
+ following format:
30
+
31
+ ### Languages
32
+
33
+ All languages for use within a particular dictionary file file must be described
34
+
35
+ languages:
36
+ en:
37
+ - english
38
+ - eng
39
+ ja:
40
+ - japanese
41
+ - jpn
42
+
43
+ ...
44
+
45
+ terms:
46
+ -
47
+ en: japanese
48
+ ja: nihongo
49
+ -
50
+ en: book
51
+ ja: hon
52
+
53
+ You can then translate a file using the command line like so:
54
+
55
+ konjac translate *.txt from japanese to english
56
+
57
+
58
+ Example
59
+ -------
60
+
61
+ ~/.konjac/dict.yml:
62
+
63
+ -
64
+ en: I
65
+ ja: 僕
66
+ -
67
+ en: like
68
+ ja: 好き
69
+ -
70
+ en:
71
+ en: dog
72
+ ja: 犬
73
+ ja:
74
+ ja: 犬
75
+ en: dogs?
76
+ - # Periods
77
+ en:
78
+ en: ". "
79
+ ja: 。
80
+ ja:
81
+ ja: 。
82
+ en: !ruby/regexp '/\.\s?/'
83
+ - # Spaces between non-ASCII characters
84
+ en:
85
+ en: " "
86
+ ja: !ruby/regexp '/\s{2,}/'
87
+ ja:
88
+ ja: "\\1\\2"
89
+ en: !ruby/regexp '/([^a-z])\s([^a-z])/'
90
+
91
+ ~/.konjac/test_en.txt
92
+
93
+ I like dogs.
94
+
95
+ Run
96
+
97
+ konjac translate ~/.konjac/test_en.txt into japanese
98
+
99
+ ~/.konjac/test_ja.txt (result):
100
+
101
+ 僕好き犬。
102
+
103
+ Now, obviously that does require some fiddling to make it more grammatical, but
104
+ it's a start (=> `僕は犬が好きだ。`)
105
+
106
+ Name
107
+ ----
108
+
109
+ *Hon'yaku* means "translation" in Japanese. This utility relies on a YAML
110
+ wordlist. *Konnyaku* (Japanese for "konjac") rhymes with *hon'yaku* and is a
111
+ type of yam. Also, Doraemon had something called a *hon'yaku konnyaku* that
112
+ allowed one to listen to animals. But I digress.
data/Rakefile CHANGED
@@ -1 +1 @@
1
- require "bundler/gem_tasks"
1
+ require "bundler/gem_tasks"
data/bin/konjac CHANGED
@@ -1,13 +1,13 @@
1
- #!/usr/bin/env ruby -Ku
2
- require "konjac"
3
- begin
4
- Konjac::CLI.start
5
- rescue Interrupt => e
6
- # Konjac.ui.error "\nQuitting..."
7
- # Konjac.ui.debug e.backtrace.join("\n")
8
- exit 1
9
- rescue SystemExit => e
10
- exit e.status
11
- rescue Exception => e
12
- raise e
13
- end
1
+ #!/usr/bin/env ruby -Ku
2
+ require "konjac"
3
+ begin
4
+ Konjac::CLI.start
5
+ rescue Interrupt => e
6
+ # Konjac.ui.error "\nQuitting..."
7
+ # Konjac.ui.debug e.backtrace.join("\n")
8
+ exit 1
9
+ rescue SystemExit => e
10
+ exit e.status
11
+ rescue Exception => e
12
+ raise e
13
+ end
data/konjac.gemspec CHANGED
@@ -1,24 +1,28 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "konjac/version"
4
-
5
- Gem::Specification.new do |s|
6
- s.name = "konjac"
7
- s.version = Konjac::VERSION
8
- s.authors = ["Bryan McKelvey"]
9
- s.email = ["bryan.mckelvey@gmail.com"]
10
- s.homepage = "http://brymck.herokuapp.com/"
11
- s.summary = %q{A Ruby command-line utility for translating files using a YAML wordlist}
12
- s.description = %q{A Ruby command-line utility for translating files using a YAML wordlist}
13
-
14
- s.rubyforge_project = "konjac"
15
-
16
- s.files = `git ls-files`.split("\n")
17
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
- s.require_paths = ["lib"]
20
-
21
- # specify any dependencies here; for example:
22
- s.add_development_dependency "rspec"
23
- s.add_runtime_dependency "trollop"
24
- end
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "konjac/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "konjac"
7
+ s.version = Konjac::VERSION
8
+ s.authors = ["Bryan McKelvey"]
9
+ s.email = ["bryan.mckelvey@gmail.com"]
10
+ s.homepage = "http://brymck.herokuapp.com/"
11
+ s.summary = %q{A Ruby command-line utility for translating files using a YAML wordlist}
12
+ s.description = %q{A Ruby command-line utility for translating files using a YAML wordlist}
13
+
14
+ s.rubyforge_project = "konjac"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ s.add_development_dependency "bundler"
23
+ s.add_development_dependency "rspec"
24
+ s.add_development_dependency "sdoc"
25
+ s.add_development_dependency "autotest"
26
+ s.add_development_dependency "autotest-fsevent"
27
+ s.add_development_dependency "autotest-growl"
28
+ end
data/lib/konjac/cli.rb CHANGED
@@ -1,60 +1,66 @@
1
- module Konjac
2
- module CLI
3
- class << self
4
- def start
5
- show_help if ARGV.empty?
6
-
7
- # Subcommand
8
- case ARGV.shift
9
- when "translate"
10
- translate
11
- when "add"
12
- when "help"
13
- show_help
14
- else
15
- raise ArgumentError.new("Valid commands are translate or add")
16
- end
17
- end
18
-
19
- def show_help
20
- puts "Help"
21
- exit 0
22
- end
23
-
24
- private
25
-
26
- def translate
27
- from_index = ARGV.index("from")
28
- to_index = ARGV.index("to")
29
-
30
- # Get the to and from languages and delete them from ARGV
31
- unless from_index.nil? || to_index.nil?
32
- if from_index < to_index
33
- ARGV.delete_at to_index
34
- to_lang = ARGV.delete_at(to_index)
35
- ARGV.delete_at from_index
36
- from_lang = ARGV.delete_at(from_index)
37
- else
38
- ARGV.delete_at to_index
39
- to_lang = ARGV.delete_at(to_index)
40
- ARGV.delete_at from_index
41
- from_lang = ARGV.delete_at(from_index)
42
- end
43
- else
44
- puts "You must supply both a to and from language"
45
- puts "Example: konjac translate foo.txt from english to japanese"
46
- exit 1
47
- end
48
-
49
- # Get a list of files to translate
50
- files = []
51
- while !ARGV.empty?
52
- files += Dir.glob(File.expand_path(ARGV.shift))
53
- end
54
- files.uniq!
55
-
56
- Translator.translate files, from_lang, to_lang
57
- end
58
- end
59
- end
60
- end
1
+ module Konjac
2
+ module CLI
3
+ class << self
4
+ def start
5
+ show_help if ARGV.empty?
6
+
7
+ # Subcommand
8
+ case ARGV.shift
9
+ when "translate"
10
+ translate
11
+ when "add"
12
+ when "help"
13
+ show_help
14
+ else
15
+ raise ArgumentError.new("Valid commands are translate or add")
16
+ end
17
+ end
18
+
19
+ def show_help
20
+ puts "Help"
21
+ exit 0
22
+ end
23
+
24
+ private
25
+
26
+ def translate
27
+ # Get from language
28
+ from_index = ARGV.index("from")
29
+ unless from_index.nil?
30
+ ARGV.delete_at from_index
31
+ from_lang = ARGV.delete_at(from_index)
32
+ end
33
+
34
+ # Get to language
35
+ to_index = ARGV.index("to") || ARGV.index("into")
36
+ if to_index.nil?
37
+ raise Exception::InvalidLanguageError.new("You must supply a to language")
38
+ else
39
+ ARGV.delete_at to_index
40
+ to_lang = ARGV.delete_at(to_index)
41
+ end
42
+
43
+ # Get a list of files to translate
44
+ files = []
45
+ while !ARGV.empty?
46
+ files += Dir.glob(File.expand_path(ARGV.shift))
47
+ end
48
+ raise Exception::FileNotFoundError.new("File not found") if files.empty?
49
+ files.uniq!
50
+
51
+ # Determine from language from first filename if not overridden
52
+ if from_lang.nil?
53
+ from_lang = Utils.extract_language_code_from_filename(files[0])
54
+ if from_lang.nil?
55
+ raise Exception::InvalidLanguageError.new("You must supply a to language")
56
+ end
57
+ end
58
+
59
+ from_lang = Language.find(from_lang).to_s
60
+ to_lang = Language.find(to_lang).to_s
61
+
62
+ Translator.translate files, from_lang, to_lang
63
+ end
64
+ end
65
+ end
66
+ end
@@ -1,58 +1,118 @@
1
- require "yaml"
2
-
3
- module Konjac
4
- module Dictionary
5
- class << self
6
- def load(from_lang, to_lang, opts = {})
7
- opts = { :force => false }.merge(opts)
8
- return @pairs if loaded? && !opts[:force]
9
-
10
-
11
- dict_dir = File.expand_path("~/.konjac/")
12
- dict_path = dict_dir + "/dict.yml"
13
-
14
- unless File.file?(dict_path)
15
- FileUtils.mkpath dict_dir
16
- FileUtils.touch dict_path
17
- end
18
-
19
- @dictionary = ::YAML.load_file(dict_path)
20
-
21
- # Parse languages
22
- from_lang = parse_language(from_lang)
23
- to_lang = parse_language(to_lang)
24
-
25
- # Build a list of search and replace pairs
26
- @pairs = []
27
- @dictionary["terms"].each do |term|
28
- if term.has_key?(from_lang) && term.has_key?(to_lang)
29
- @pairs << [term[from_lang], term[to_lang]]
30
- end
31
- end
32
-
33
- @loaded = true
34
- @pairs
35
- end
36
-
37
- private
38
-
39
- def loaded?
40
- !!@loaded
41
- end
42
-
43
- def parse_language(lang)
44
- if @dictionary["languages"].has_key?(lang)
45
- return lang
46
- else
47
- @dictionary["languages"].each do |main, alternatives|
48
- return main if alternatives.include?(lang)
49
- end
50
-
51
- # If no match is found, give an error message and exit
52
- raise Exceptions::InvalidLanguageError.new("No match found for language \"#{lang}\"")
53
- exit 1
54
- end
55
- end
56
- end
57
- end
58
- end
1
+ require "yaml"
2
+
3
+ module Konjac
4
+ module Dictionary
5
+ class << self
6
+ attr_accessor :from_lang, :to_lang, :path
7
+
8
+ def load(from_lang, to_lang, opts = {})
9
+ # Set defaults for optional arguments
10
+ opts = { :force => false, :name => "dict" }.merge(opts)
11
+
12
+ # Allow both symbol and string arguments for languages
13
+ from_lang = from_lang.to_s
14
+ to_lang = to_lang.to_s
15
+
16
+ # Build a regex template for the from language
17
+ from_template = build_regex_template(from_lang)
18
+
19
+ # Get full path from name
20
+ full_path = File.expand_path("~/.konjac/#{opts[:name]}.yml")
21
+
22
+ return @pairs if loaded?(from_lang, to_lang, full_path) || opts[:force]
23
+
24
+ # Save variables to cache so we can avoid repetitive requests
25
+ cache_load from_lang, to_lang, opts
26
+
27
+ # Make sure dictionary exists and load
28
+ verify_dictionary_exists full_path
29
+ @dictionary = ::YAML.load_file(full_path)
30
+
31
+ # Build a list of search and replace pairs
32
+ @pairs = []
33
+ @dictionary.each do |term|
34
+ if term.has_key?(to_lang)
35
+ # Build to term depending on whether it's a hash for complex
36
+ # matches or a simple string
37
+ if term[to_lang].is_a?(Hash)
38
+ to_term = term[to_lang][to_lang]
39
+
40
+ if term[to_lang].has_key?(from_lang)
41
+ from_term = term[to_lang][from_lang]
42
+ end
43
+ else
44
+ to_term = term[to_lang]
45
+ end
46
+
47
+ # Build from term if it doesn't already exist
48
+ if term.has_key?(from_lang) && from_term.nil?
49
+ from_term = term[from_lang]
50
+ end
51
+
52
+ unless from_term.nil?
53
+ # Build a regular expression if it isn't already one
54
+ # Note that this will apply word boundary rules, so to avoid them
55
+ # create a regular expression in the dictionary file
56
+ unless from_term.is_a?(Regexp)
57
+ from_term = Regexp.new(from_template % from_term)
58
+ end
59
+
60
+ @pairs << [ from_term, to_term ]
61
+ end
62
+ end
63
+ end
64
+
65
+ @pairs
66
+ end
67
+
68
+ # Verifies whether the dictionary exists on the specified path, creating
69
+ # a blank file if it doesn't
70
+ def verify_dictionary_exists(full_path)
71
+ unless File.file?(full_path)
72
+ FileUtils.mkpath File.dirname(full_path)
73
+ FileUtils.touch full_path
74
+ end
75
+ end
76
+
77
+ # Tests whether the same from language, to language and dictionary path
78
+ # have been loaded before
79
+ def loaded?(from_lang, to_lang, full_path)
80
+ (@from_lang == from_lang) &&
81
+ (@to_lang == to_lang ) &&
82
+ (@path == full_path)
83
+ end
84
+
85
+ # Builds a regular expression template for the language depending on
86
+ # whether that language has word boundaries
87
+ def build_regex_template(lang)
88
+ if Language.has_spaces?(lang)
89
+ "\\b%s\\b"
90
+ else
91
+ "%s"
92
+ end
93
+ end
94
+
95
+ private
96
+
97
+ def parse_language(lang)
98
+ if @dictionary["languages"].has_key?(lang)
99
+ return lang
100
+ else
101
+ @dictionary["languages"].each do |main, alternatives|
102
+ return main if alternatives.include?(lang)
103
+ end
104
+
105
+ # If no match is found, give an error message and exit
106
+ raise Exceptions::InvalidLanguageError.new("No match found for language \"#{lang}\"")
107
+ exit 1
108
+ end
109
+ end
110
+
111
+ def cache_load(from_lang, to_lang, opts)
112
+ @from_lang = from_lang
113
+ @to_lang = to_lang
114
+ @path = path
115
+ end
116
+ end
117
+ end
118
+ end
@@ -1,5 +1,6 @@
1
- module Konjac
2
- module Exceptions
3
- class InvalidLanguageError < StandardError; end
4
- end
5
- end
1
+ module Konjac
2
+ module Exception
3
+ class FileNotFoundError < StandardError; end
4
+ class InvalidLanguageError < StandardError; end
5
+ end
6
+ end
@@ -0,0 +1,256 @@
1
+ module Konjac
2
+ module Language
3
+ class << self
4
+ LANGUAGES_WITHOUT_SPACES = [:ar, :he, :ja, :zh]
5
+ LIST = {
6
+ :ab => [:abkhazian, :abk],
7
+ :aa => [:afar, :aar],
8
+ :af => [:afrikaans, :afr],
9
+ :ak => [:akan, :aka],
10
+ :sq => [:albanian, :alb, :sqi],
11
+ :am => [:amharic, :amh],
12
+ :ar => [:arabic, :ara],
13
+ :an => [:aragonese, :arg],
14
+ :hy => [:armenian, :arm, :hye],
15
+ :as => [:assamese, :asm],
16
+ :av => [:avaric, :ava],
17
+ :ae => [:avestan, :ave],
18
+ :ay => [:aymara, :aym],
19
+ :az => [:azerbaijani, :aze],
20
+ :bm => [:bambara, :bam],
21
+ :ba => [:bashkir, :bak],
22
+ :eu => [:basque, :baq, :eus],
23
+ :be => [:belarusian, :bel],
24
+ :bn => [:bengali, :ben],
25
+ :bh => [:bihari, :bih],
26
+ :bi => [:bislama, :bis],
27
+ :nb => [:bokmal, :nob],
28
+ :bs => [:bosnian, :bos],
29
+ :br => [:breton, :bre],
30
+ :bg => [:bulgarian, :bul],
31
+ :my => [:burmese, :bur, :mya],
32
+ :es => [:castilian, :spa],
33
+ :ca => [:catalan, :cat],
34
+ :km => [:central_khmer, :khm],
35
+ :ch => [:chamorro, :cha],
36
+ :ce => [:chechen, :che],
37
+ :ny => [:chewa, :nya],
38
+ :ny => [:chichewa, :nya],
39
+ :zh => [:chinese, :chi, :zho],
40
+ :za => [:chuang, :zha],
41
+ :cv => [:chuvash, :chv],
42
+ :kw => [:cornish, :cor],
43
+ :co => [:corsican, :cos],
44
+ :cr => [:cree, :cre],
45
+ :hr => [:croatian, :hrv],
46
+ :cs => [:czech, :cze, :ces],
47
+ :da => [:danish, :dan],
48
+ :dv => [:dhivehi, :div],
49
+ :dv => [:divehi, :div],
50
+ :nl => [:dutch, :dut, :nld],
51
+ :dz => [:dzongkha, :dzo],
52
+ :en => [:english, :eng],
53
+ :eo => [:esperanto, :epo],
54
+ :et => [:estonian, :est],
55
+ :ee => [:ewe, :ewe],
56
+ :fo => [:faroese, :fao],
57
+ :fj => [:fijian, :fij],
58
+ :fi => [:finnish, :fin],
59
+ :nl => [:flemish, :dut, :nld],
60
+ :fr => [:french, :fre, :fra],
61
+ :ff => [:fulah, :ful],
62
+ :gd => [:gaelic, :gla],
63
+ :gl => [:galician, :glg],
64
+ :lg => [:ganda, :lug],
65
+ :ka => [:georgian, :geo, :kat],
66
+ :de => [:german, :ger, :deu],
67
+ :ki => [:gikuyu, :kik],
68
+ :el => [:greek, :gre, :ell],
69
+ :kl => [:greenlandic, :kal],
70
+ :gn => [:guarani, :grn],
71
+ :gu => [:gujarati, :guj],
72
+ :ht => [:haitian, :hat],
73
+ :ht => [:haitian_creole, :hat],
74
+ :ha => [:hausa, :hau],
75
+ :he => [:hebrew, :heb],
76
+ :hz => [:herero, :her],
77
+ :hi => [:hindi, :hin],
78
+ :ho => [:hiri_motu, :hmo],
79
+ :hu => [:hungarian, :hun],
80
+ :is => [:icelandic, :ice, :isl],
81
+ :io => [:ido, :ido],
82
+ :ig => [:igbo, :ibo],
83
+ :id => [:indonesian, :ind],
84
+ :ia => [:interlingua, :ina],
85
+ :ie => [:interlingue, :ile],
86
+ :iu => [:inuktitut, :iku],
87
+ :ik => [:inupiaq, :ipk],
88
+ :ga => [:irish, :gle],
89
+ :it => [:italian, :ita],
90
+ :ja => [:japanese, :jpn],
91
+ :jv => [:javanese, :jav],
92
+ :kl => [:kalaallisut, :kal],
93
+ :kn => [:kannada, :kan],
94
+ :kr => [:kanuri, :kau],
95
+ :ks => [:kashmiri, :kas],
96
+ :kk => [:kazakh, :kaz],
97
+ :ki => [:kikuyu, :kik],
98
+ :rw => [:kinyarwanda, :kin],
99
+ :ky => [:kirghiz, :kir],
100
+ :kv => [:komi, :kom],
101
+ :kg => [:kongo, :kon],
102
+ :ko => [:korean, :kor],
103
+ :kj => [:kuanyama, :kua],
104
+ :ku => [:kurdish, :kur],
105
+ :kj => [:kwanyama, :kua],
106
+ :ky => [:kyrgyz, :kir],
107
+ :lo => [:lao, :lao],
108
+ :la => [:latin, :lat],
109
+ :lv => [:latvian, :lav],
110
+ :lb => [:letzeburgesch, :ltz],
111
+ :li => [:limburgan, :lim],
112
+ :li => [:limburger, :lim],
113
+ :li => [:limburgish, :lim],
114
+ :ln => [:lingala, :lin],
115
+ :lt => [:lithuanian, :lit],
116
+ :lu => [:luba_katanga, :lub],
117
+ :lb => [:luxembourgish, :ltz],
118
+ :mk => [:macedonian, :mac, :mkd],
119
+ :mg => [:malagasy, :mlg],
120
+ :ms => [:malay, :may, :msa],
121
+ :ml => [:malayalam, :mal],
122
+ :dv => [:maldivian, :div],
123
+ :mt => [:maltese, :mlt],
124
+ :gv => [:manx, :glv],
125
+ :mi => [:maori, :mao, :mri],
126
+ :mr => [:marathi, :mar],
127
+ :mh => [:marshallese, :mah],
128
+ :ro => [:moldavian, :rum, :ron],
129
+ :ro => [:moldovan, :rum, :ron],
130
+ :mn => [:mongolian, :mon],
131
+ :na => [:nauru, :nau],
132
+ :nv => [:navaho, :nav],
133
+ :nv => [:navajo, :nav],
134
+ :ng => [:ndonga, :ndo],
135
+ :ne => [:nepali, :nep],
136
+ :nd => [:north_ndebele, :nde],
137
+ :se => [:northern_sami, :sme],
138
+ :no => [:norwegian, :nor],
139
+ :ii => [:nuosu, :iii],
140
+ :ny => [:nyanja, :nya],
141
+ :nn => [:nynorsk, :nno],
142
+ :ie => [:occidental, :ile],
143
+ :oc => [:occitan, :oci],
144
+ :oj => [:ojibwa, :oji],
145
+ :cu => [:old_church_slavonic, :chu],
146
+ :or => [:oriya, :ori],
147
+ :om => [:oromo, :orm],
148
+ :os => [:ossetian, :oss],
149
+ :os => [:ossetic, :oss],
150
+ :pi => [:pali, :pli],
151
+ :pa => [:panjabi, :pan],
152
+ :ps => [:pashto, :pus],
153
+ :fa => [:persian, :per, :fas],
154
+ :pl => [:polish, :pol],
155
+ :pt => [:portuguese, :por],
156
+ :pa => [:punjabi, :pan],
157
+ :ps => [:pushto, :pus],
158
+ :qu => [:quechua, :que],
159
+ :ro => [:romanian, :rum, :ron],
160
+ :rm => [:romansh, :roh],
161
+ :rn => [:rundi, :run],
162
+ :ru => [:russian, :rus],
163
+ :sm => [:samoan, :smo],
164
+ :sg => [:sango, :sag],
165
+ :sa => [:sanskrit, :san],
166
+ :sc => [:sardinian, :srd],
167
+ :gd => [:scottish_gaelic, :gla],
168
+ :sr => [:serbian, :srp],
169
+ :sn => [:shona, :sna],
170
+ :ii => [:sichuan_yi, :iii],
171
+ :sd => [:sindhi, :snd],
172
+ :si => [:sinhala, :sin],
173
+ :si => [:sinhalese, :sin],
174
+ :sk => [:slovak, :slo, :slk],
175
+ :sl => [:slovenian, :slv],
176
+ :so => [:somali, :som],
177
+ :st => [:sotho, :sot],
178
+ :nr => [:south_ndebele, :nbl],
179
+ :es => [:spanish, :spa],
180
+ :su => [:sundanese, :sun],
181
+ :sw => [:swahili, :swa],
182
+ :ss => [:swati, :ssw],
183
+ :sv => [:swedish, :swe],
184
+ :tl => [:tagalog, :tgl],
185
+ :ty => [:tahitian, :tah],
186
+ :tg => [:tajik, :tgk],
187
+ :ta => [:tamil, :tam],
188
+ :tt => [:tatar, :tat],
189
+ :te => [:telugu, :tel],
190
+ :th => [:thai, :tha],
191
+ :bo => [:tibetan, :tib, :bod],
192
+ :ti => [:tigrinya, :tir],
193
+ :to => [:tonga, :ton],
194
+ :ts => [:tsonga, :tso],
195
+ :tn => [:tswana, :tsn],
196
+ :tr => [:turkish, :tur],
197
+ :tk => [:turkmen, :tuk],
198
+ :tw => [:twi, :twi],
199
+ :ug => [:uighur, :uig],
200
+ :uk => [:ukrainian, :ukr],
201
+ :ur => [:urdu, :urd],
202
+ :ug => [:uyghur, :uig],
203
+ :uz => [:uzbek, :uzb],
204
+ :ca => [:valencian, :cat],
205
+ :ve => [:venda, :ven],
206
+ :vi => [:vietnamese, :vie],
207
+ :vo => [:volapuk, :vol],
208
+ :wa => [:walloon, :wln],
209
+ :cy => [:welsh, :wel, :cym],
210
+ :fy => [:western_frisian, :fry],
211
+ :wo => [:wolof, :wol],
212
+ :xh => [:xhosa, :xho],
213
+ :yi => [:yiddish, :yid],
214
+ :yo => [:yoruba, :yor],
215
+ :za => [:zhuang, :zha],
216
+ :zu => [:zulu, :zul]
217
+ }
218
+
219
+ # Finds the two-letter code for the specified language
220
+ def find(lang)
221
+ # Allow function to accept both symbol and string arguments
222
+ lang = lang.to_sym
223
+
224
+ if LIST.has_key?(lang)
225
+ # Shortcut for two-letter language codes
226
+ return lang
227
+ else
228
+ # Breaks away automatically if a match is found
229
+ LIST.each do |two_letter_code, alt_names|
230
+ return two_letter_code if alt_names.include?(lang)
231
+ end
232
+
233
+ # Return nil if nothing found
234
+ raise Exception::InvalidLanguageError.new("Language not found: #{lang}")
235
+ end
236
+ end
237
+
238
+ # Determine whether the specified language has spaces or not
239
+ def has_spaces?(two_letter_code)
240
+ !LANGUAGES_WITHOUT_SPACES.include?(two_letter_code)
241
+ end
242
+
243
+ private
244
+
245
+ # Convert to underscore case
246
+ def underscore(str)
247
+ str.to_s. # allow symbols and strings
248
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). # underscore-delimit caps
249
+ gsub(/([a-z\d])\s?([A-Z])/,'\1_\2'). # underscore-delimit words
250
+ tr("-", "_"). # dashes to underscores
251
+ downcase. # everything lowercase
252
+ to_sym # convert to symbol
253
+ end
254
+ end
255
+ end
256
+ end
@@ -1,33 +1,24 @@
1
- module Konjac
2
- module Translator
3
- class << self
4
- def translate(files, from_lang, to_lang)
5
- pairs = Dictionary.load(from_lang, to_lang)
6
-
7
- files.each do |source|
8
- # Read in file and replace matches in content
9
- content = File.read(source)
10
- pairs.each do |pair|
11
- content.gsub! pair[0], pair[1]
12
- end
13
-
14
- # Write changed content to file
15
- File.open(build_converted_file_name(source), "w") do |file|
16
- file.puts content
17
- end
18
- end
19
- end
20
-
21
- private
22
-
23
- # Build converted file name by appending "_converted" to the file name
24
- def build_converted_file_name(source)
25
- dirname = File.dirname(source)
26
- basename = File.basename(source, ".*")
27
- extname = File.extname(source)
28
-
29
- "#{dirname}/#{basename}_converted#{extname}"
30
- end
31
- end
32
- end
33
- end
1
+ # coding: utf-8
2
+ module Konjac
3
+ module Translator
4
+ class << self
5
+ def translate(files, from_lang, to_lang)
6
+ pairs = Dictionary.load(from_lang, to_lang)
7
+
8
+ files.each do |source|
9
+ # Read in file and replace matches in content
10
+ content = File.read(source)
11
+ pairs.each do |pair|
12
+ search, replace = pair
13
+ content.gsub! search, replace
14
+ end
15
+
16
+ # Write changed content to file
17
+ File.open(Utils.build_converted_file_name(source, from_lang, to_lang), "w") do |file|
18
+ file.puts content
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,29 @@
1
+ module Konjac
2
+ module Utils
3
+ class << self
4
+ # Extracts the two letter language code from a filename
5
+ def extract_language_code_from_filename(name)
6
+ match = File.basename(name, ".*").match(/_([a-z]{2})/i)
7
+
8
+ if match.nil?
9
+ nil
10
+ else
11
+ match[1]
12
+ end
13
+ end
14
+
15
+ # Build converted file name by appending "_converted" to the file name
16
+ def build_converted_file_name(source, from_lang, to_lang)
17
+ # Get components of filename
18
+ dirname = File.dirname(source)
19
+ basename = File.basename(source, ".*")
20
+ extname = File.extname(source)
21
+
22
+ # Blank out the from language
23
+ basename.sub! Regexp.new("_#{from_lang}", "i"), ""
24
+
25
+ "#{dirname}/#{basename}_#{to_lang}#{extname}"
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,3 +1,3 @@
1
- module Konjac
2
- VERSION = "0.0.1"
3
- end
1
+ module Konjac
2
+ VERSION = "0.0.2"
3
+ end
data/lib/konjac.rb CHANGED
@@ -1,10 +1,12 @@
1
- require "konjac/version"
2
- autoload :FileUtils, "fileutils"
3
-
4
- module Konjac
5
- autoload :CLI, "konjac/cli"
6
- autoload :Dictionary, "konjac/dictionary"
7
- autoload :Exceptions, "konjac/exceptions"
8
- autoload :Manager, "konjac/manager"
9
- autoload :Translator, "konjac/translator"
10
- end
1
+ require "konjac/version"
2
+ autoload :FileUtils, "fileutils"
3
+
4
+ module Konjac
5
+ # Set up autoload for all modules
6
+ autoload :CLI, "konjac/cli"
7
+ autoload :Dictionary, "konjac/dictionary"
8
+ autoload :Exception, "konjac/exception"
9
+ autoload :Language, "konjac/language"
10
+ autoload :Translator, "konjac/translator"
11
+ autoload :Utils, "konjac/utils"
12
+ end
@@ -0,0 +1,9 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe Dictionary do
4
+ before :each do
5
+
6
+ end
7
+
8
+ it "should correctly load YAML"
9
+ end
@@ -0,0 +1,31 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe Language do
4
+ it "should find English" do
5
+ Language.find(:english).should == :en
6
+ Language.find(:eng).should == :en
7
+ end
8
+
9
+ it "should find Japanese" do
10
+ Language.find(:japanese).should == :ja
11
+ Language.find(:jpn).should == :ja
12
+ end
13
+
14
+ it "should return equal results for both strings and symbols" do
15
+ Language.find(:english).should == Language.find("english")
16
+ end
17
+
18
+ it "should accurately underscore languages" do
19
+ # underscore is a private method
20
+ Language.__send__(:underscore, "English").should == :english
21
+ Language.__send__(:underscore, "Western Frisian").should == :western_frisian
22
+ end
23
+
24
+ it "should know that English has spaces" do
25
+ Language.has_spaces?(:en).should == true
26
+ end
27
+
28
+ it "should know that Japanese does not have spaces" do
29
+ Language.has_spaces?(:ja).should == false
30
+ end
31
+ end
@@ -0,0 +1,3 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
2
+ require "konjac"
3
+ include Konjac
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + "/spec_helper"
2
+
3
+ describe Utils do
4
+ it "should extract the correct language from a filename" do
5
+ Utils.extract_language_code_from_filename("test_en.txt").should == "en"
6
+ end
7
+
8
+ it "should correctly rename a file according to its target language" do
9
+ Utils.build_converted_file_name("./test_en.txt", "en", "ja").should == "./test_ja.txt"
10
+ Utils.build_converted_file_name("./test.txt", "en", "ja").should == "./test_ja.txt"
11
+ Utils.build_converted_file_name("./test_fr.txt", "en", "ja").should == "./test_fr_ja.txt"
12
+ end
13
+ 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.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-10 00:00:00.000000000 Z
12
+ date: 2012-01-12 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: &70101261736900 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *70101261736900
14
25
  - !ruby/object:Gem::Dependency
15
26
  name: rspec
16
- requirement: &23263176 !ruby/object:Gem::Requirement
27
+ requirement: &70101261736280 !ruby/object:Gem::Requirement
17
28
  none: false
18
29
  requirements:
19
30
  - - ! '>='
@@ -21,18 +32,51 @@ dependencies:
21
32
  version: '0'
22
33
  type: :development
23
34
  prerelease: false
24
- version_requirements: *23263176
35
+ version_requirements: *70101261736280
25
36
  - !ruby/object:Gem::Dependency
26
- name: trollop
27
- requirement: &23231568 !ruby/object:Gem::Requirement
37
+ name: sdoc
38
+ requirement: &70101261735680 !ruby/object:Gem::Requirement
28
39
  none: false
29
40
  requirements:
30
41
  - - ! '>='
31
42
  - !ruby/object:Gem::Version
32
43
  version: '0'
33
- type: :runtime
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70101261735680
47
+ - !ruby/object:Gem::Dependency
48
+ name: autotest
49
+ requirement: &70101261734760 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70101261734760
58
+ - !ruby/object:Gem::Dependency
59
+ name: autotest-fsevent
60
+ requirement: &70101261733460 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70101261733460
69
+ - !ruby/object:Gem::Dependency
70
+ name: autotest-growl
71
+ requirement: &70101261732860 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
34
78
  prerelease: false
35
- version_requirements: *23231568
79
+ version_requirements: *70101261732860
36
80
  description: A Ruby command-line utility for translating files using a YAML wordlist
37
81
  email:
38
82
  - bryan.mckelvey@gmail.com
@@ -41,7 +85,9 @@ executables:
41
85
  extensions: []
42
86
  extra_rdoc_files: []
43
87
  files:
88
+ - .autotest
44
89
  - .gitignore
90
+ - .rspec
45
91
  - Gemfile
46
92
  - LICENSE
47
93
  - README.md
@@ -51,10 +97,15 @@ files:
51
97
  - lib/konjac.rb
52
98
  - lib/konjac/cli.rb
53
99
  - lib/konjac/dictionary.rb
54
- - lib/konjac/exceptions.rb
55
- - lib/konjac/manager.rb
100
+ - lib/konjac/exception.rb
101
+ - lib/konjac/language.rb
56
102
  - lib/konjac/translator.rb
103
+ - lib/konjac/utils.rb
57
104
  - lib/konjac/version.rb
105
+ - spec/dictionary_spec.rb
106
+ - spec/language_spec.rb
107
+ - spec/spec_helper.rb
108
+ - spec/utils_spec.rb
58
109
  homepage: http://brymck.herokuapp.com/
59
110
  licenses: []
60
111
  post_install_message:
@@ -75,8 +126,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
75
126
  version: '0'
76
127
  requirements: []
77
128
  rubyforge_project: konjac
78
- rubygems_version: 1.8.11
129
+ rubygems_version: 1.8.10
79
130
  signing_key:
80
131
  specification_version: 3
81
132
  summary: A Ruby command-line utility for translating files using a YAML wordlist
82
- test_files: []
133
+ test_files:
134
+ - spec/dictionary_spec.rb
135
+ - spec/language_spec.rb
136
+ - spec/spec_helper.rb
137
+ - spec/utils_spec.rb
File without changes