wookie-translator 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
@@ -0,0 +1 @@
1
+ wookie-translator
@@ -0,0 +1 @@
1
+ 1.9.3-p125
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
@@ -0,0 +1 @@
1
+ lib/**/*.rb --title WookieTranslator --private --protected
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in WookieTranslator.gemspec
4
+ gemspec
@@ -0,0 +1,70 @@
1
+ # WookieTranslator
2
+
3
+ *2012/04/01*
4
+
5
+ This gem is based on http://selarips.free.fr/wookieetranslator/ and built after
6
+ a tweet from [@MikeSwole](https://twitter.com/#!/MikeSwole/status/185882254432677888).
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ gem 'wookie-translator'
13
+
14
+ And then execute:
15
+
16
+ $ bundle
17
+
18
+ Or install it yourself as:
19
+
20
+ $ gem install wookie-translator
21
+
22
+ ## Usage
23
+
24
+ The gem comes with a command line interface:
25
+
26
+ $ wookie -e "enter your text here!"
27
+ $ wookie -w "wowhaoworc rooohurc aowokao acworcwo!"
28
+
29
+ You may also use the gem's API:
30
+
31
+ require 'wookie-translator'
32
+ t = Wookie::Translator.new
33
+ wookie = t.to_wookie "Hello World."
34
+ english = t.from_wookie wookie #=> "hello world."
35
+
36
+ If you want to use another wookie dialect, you want to inherit from
37
+ `Wookie::Dialect::Base` and implement the methods `#to_wookie` and `#from_wookie`:
38
+
39
+ require 'wookie-translator'
40
+ class ReverseWookie < Wookie::Dialect::Base
41
+ def to_wookie(english)
42
+ english.reverse
43
+ end
44
+
45
+ def from_wookie(wookie)
46
+ wookie.reverse
47
+ end
48
+ end
49
+
50
+ t = Wookie::Translator.new(dialect: ReverseWookie)
51
+ wookie = t.to_wookie "Hello World." #=> ".dlroW olleH"
52
+ english = t.from_wookie wookie #=> "Hello World."
53
+
54
+ ## Contributing
55
+
56
+ The wookie translator lacks of translations for the three main dialects:
57
+ Shyriiwook, Xaczik and Thykarann. If you are a native speaker (or at least
58
+ familiar with one of those dialects), you're encouraged to follow these steps:
59
+
60
+ 1. Fork it
61
+ 2. Create your dialect branch (`git checkout -b dialect-X`)
62
+ 3. Build a new dialect class
63
+ 4. Commit your changes (`git commit -am 'Added missing dialect'`)
64
+ 5. Push to the branch (`git push origin dialect-X`)
65
+ 6. Create new Pull Request
66
+
67
+ ## License
68
+
69
+ This code is public domain. Remember that »Wookie« and »Star Wars« are courtesy
70
+ of [LucasArts](http://www.lucasarts.com/).
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require "rspec/core/rake_task"
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task default: :spec
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'wookie'
4
+ begin
5
+ Wookie::CLI.new(ARGV).run
6
+ rescue => e
7
+ $stderr.puts "An error occured: #{e.message}"
8
+ raise
9
+ exit 1
10
+ end
11
+ exit 0
@@ -0,0 +1,10 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Wookie
4
+ # Semantic version
5
+ VERSION = '0.1.0'
6
+
7
+ autoload :Translator, 'wookie/translator'
8
+ autoload :Dialect, 'wookie/dialect'
9
+ autoload :CLI, 'wookie/cli'
10
+ end
@@ -0,0 +1,89 @@
1
+ require 'optparse'
2
+
3
+ # Command line interface for this gem.
4
+ #
5
+ # == Usage
6
+ #
7
+ # wookie [options] string
8
+ # wookie [options] -
9
+ #
10
+ # == Common Options
11
+ #
12
+ # +-w+ or +--from-wookie+::
13
+ # Translate from wookiespeak to english.
14
+ #
15
+ # +-e+ or +--to-wookie+::
16
+ # Translate from english to wookiespeak.
17
+ #
18
+ # +-dDIALECT+ or +--dialect DIALECT+::
19
+ # Use a specific dialect (default and currently only available option: simple).
20
+ #
21
+ # +-v+ or +--version+::
22
+ # Prints the version and exits.
23
+ #
24
+ # == Read from STDIN
25
+ #
26
+ # When the option +-+ is given, any non-option argument is ignored and reads from STDIN.
27
+ #
28
+ # == Examples
29
+ #
30
+ # $ wookie -e 'Hello World!'
31
+ # acwoananoo ohoorcanwa!
32
+ # $ wookie -w 'acwoananoo ohoorcanwa!' --dialect simple
33
+ # hello world!
34
+ # $ echo 'rchurhro ahc raohwocooscwo :-)' | wookie -w -
35
+ # ruby is awesome :-)
36
+ class Wookie::CLI
37
+
38
+ # Initializes the command line interface with the command line parameters (or
39
+ # any given argument array). See above.
40
+ #
41
+ # @param [Array] argv The command line arguments (`ARGV` is substituted, if `nil`).
42
+ def initialize(argv)
43
+ @argv = argv || ARGV
44
+ @options = {
45
+ use_stdin: false,
46
+ dialect: :simple
47
+ }
48
+ OptionParser.new do |opts|
49
+ opts.banner = "Usage: wookie [options] string\n wookie [options] -"
50
+ opts.separator ""
51
+ opts.separator "Common Options"
52
+ opts.on('-w', '--from-wookie', 'Translate from wookiespeak to english') do
53
+ @options[:translation] = :from_wookie
54
+ end
55
+ opts.on('-e', '--to-wookie', 'Translate from english to wookiespeak') do
56
+ @options[:translation] = :to_wookie
57
+ end
58
+ opts.on('-d', '--dialect DIALECT', [:simple], 'Use a specific dialect (defaults to simple)', 'Currently available: simple') do |dialect|
59
+ @options[:dialect] = dialect
60
+ end
61
+ opts.on('-v', '--version', 'Prints the version and exits') do
62
+ puts "Wookie Translator v#{Wookie::VERSION}.\nThis software is public domain."
63
+ exit 0
64
+ end
65
+ opts.separator ""
66
+ opts.separator "Read from STDIN"
67
+ opts.separator ' - When given, ignore any non-option arguments'
68
+ opts.separator ' and read from STDIN.'
69
+ end.parse!(@argv)
70
+ end
71
+
72
+ # Actually executes the arguments and prints a translation.
73
+ # @return [void]
74
+ def run
75
+ dialect = case @options[:dialect]
76
+ when :simple
77
+ @options[:dialect] = Wookie::Dialect::Simple
78
+ else
79
+ raise ArgumentError, "Unknown dialact."
80
+ end
81
+ string = if @argv.include?('-')
82
+ ARGF.read
83
+ else
84
+ @argv.join(' ')
85
+ end
86
+ t = Wookie::Translator.new(dialect: dialect)
87
+ puts t.send(@options[:translation], string)
88
+ end
89
+ end
@@ -0,0 +1,45 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Wookie::Dialect
4
+
5
+ # Basic class to be inherited from, when building new dialects.
6
+ # Though currently not implemented, a future version of the {Wookie::Translator}
7
+ # may check, if any given dialect is actually a subclass of {Wookie::Dialect::Base}.
8
+ class Base
9
+
10
+ # Keeps track of available subclasses.
11
+ # @param [Class] sub The subclass.
12
+ def self.inherited(sub)
13
+ @@subclasses ||= []
14
+ @@subclasses << sub
15
+ end
16
+
17
+ # Returns the known subclasses
18
+ # @return [Array] A list of known subclasses.
19
+ def self.subclasses
20
+ @@subclasses
21
+ end
22
+
23
+ # Translates an english string to wookiespeack.
24
+ #
25
+ # @note Must be implemented in the sub class.
26
+ # @param [String] The string to be translated.
27
+ # @return [String] The translation.
28
+ # @raise NotImplementedError
29
+ def to_wookie(str)
30
+ raise NotImplementedError
31
+ end
32
+
33
+ # Translates a wookiespeak string to english.
34
+ #
35
+ # @note Must be implemented in the sub class.
36
+ # @param [String] The string to be translated.
37
+ # @return [String] The translation.
38
+ # @raise NotImplementedError
39
+ def from_wookie(str)
40
+ raise NotImplementedError
41
+ end
42
+ end
43
+
44
+ autoload :Simple, 'wookie/dialects/simple'
45
+ end
@@ -0,0 +1,60 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Wookie::Dialect
4
+
5
+ # A simple wookie dialect found on the net. Works case insensitive (i.e. any
6
+ # string to be translated will be converted to downcase).
7
+ #
8
+ # @see http://selarips.free.fr/wookieetranslator/
9
+ class Simple < Base
10
+ # The basic lookup table.
11
+ LOOKUP = {
12
+ 'a' => 'ra', 'b' => 'rh', 'c' => 'oa', 'd' => 'wa', 'e' => 'wo', 'f' => 'ww',
13
+ 'g' => 'rr', 'h' => 'ac', 'i' => 'ah', 'j' => 'sh', 'k' => 'or', 'l' => 'an',
14
+ 'm' => 'sc', 'n' => 'wh', 'o' => 'oo', 'p' => 'ak', 'q' => 'rq', 'r' => 'rc',
15
+ 's' => 'c', 't' => 'ao', 'u' => 'hu', 'v' => 'ho', 'w' => 'oh', 'x' => 'k',
16
+ 'y' => 'ro', 'z' => 'uf'
17
+ }.freeze
18
+
19
+ # A short code is defined by a length of 1 of a lookup value.
20
+ SHORT_CODES = LOOKUP.map{|_,v| v if v.length == 1 }.compact.join
21
+
22
+ # Translates an english string to wookiespeack.
23
+ #
24
+ # @param [String] The string to be translated.
25
+ # @return [String] The translation.
26
+ def to_wookie(str)
27
+ wookie = ''
28
+ str.downcase.each_char do |c|
29
+ wookie << (LOOKUP[c].nil? ? c : LOOKUP[c])
30
+ end
31
+ wookie
32
+ end
33
+
34
+ # Translates a wookiespeak string to english.
35
+ #
36
+ # @param [String] The string to be translated.
37
+ # @return [String] The translation.
38
+ def from_wookie(str)
39
+ chars = str.downcase.split('')
40
+ lookup = Hash[ LOOKUP.to_a.map(&:reverse) ]
41
+ english = ''
42
+ offset = 0
43
+ while offset < chars.length
44
+ cur = chars[offset]
45
+ nxt = chars[offset,2].join
46
+ if lookup.keys.include?(cur)
47
+ english << lookup[cur]
48
+ elsif lookup.keys.include?(nxt)
49
+ english << lookup[nxt]
50
+ offset += 1
51
+ else
52
+ english << cur
53
+ end
54
+ offset += 1
55
+ end
56
+ english
57
+ end
58
+
59
+ end
60
+ end
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ # Translates a given string either from wookie to english or vice versa.
4
+ class Wookie::Translator
5
+
6
+ # Contructor, defines the dialect ({Wookie::Dialect::Simple} by default).
7
+ # @param [Hash] options The instance options.
8
+ # @option options [#to_wookie,#from_wookie] :dialect A wookie dialect.
9
+ def initialize(options={ dialect: Wookie::Dialect::Simple })
10
+ @dialect = options[:dialect].new
11
+ end
12
+
13
+ # Translates an english string to wookiespeak using the dialect given to the
14
+ # initializer.
15
+ #
16
+ # @param [#to_s] str The string to be translated.
17
+ # @return [String] The translated string.
18
+ def to_wookie(str)
19
+ @dialect.to_wookie(str.to_s)
20
+ end
21
+
22
+ # Translates a string from wookiespeak to english using the dialect given to
23
+ # the initializer.
24
+ #
25
+ # @param [#to_s] str The string to be translated.
26
+ # @return [String] The english translation.
27
+ def from_wookie(str)
28
+ @dialect.from_wookie(str.to_s)
29
+ end
30
+ end
@@ -0,0 +1,7 @@
1
+ require 'wookie'
2
+
3
+ RSpec.configure do |config|
4
+ config.treat_symbols_as_metadata_keys_with_true_values = true
5
+ config.run_all_when_everything_filtered = true
6
+ config.filter_run :focus
7
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ class IdentityDialect < Wookie::Dialect::Base
5
+ def to_wookie(str); str; end
6
+ def from_wookie(str); str; end
7
+ end
8
+
9
+ describe Wookie::Translator do
10
+ before do
11
+ @t = Wookie::Translator.new(dialect: IdentityDialect)
12
+ @english = 'enter your text here!'
13
+ @wookie = 'wowhaoworc rooohurc aowokao acworcwo!'
14
+ end
15
+
16
+ it "translates english to english" do
17
+ @t.to_wookie(@english).should eq(@english)
18
+ end
19
+
20
+ it "translates wookie to wookie" do
21
+ @t.from_wookie(@wookie).should eq(@wookie)
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe Wookie::Dialect::Simple do
5
+ before do
6
+ @dialect = Wookie::Dialect::Simple.new
7
+ @english = 'enter your text here!'
8
+ @wookie = 'wowhaoworc rooohurc aowokao acworcwo!'
9
+ end
10
+
11
+ it "should have a distinct set of short codes" do
12
+ Wookie::Dialect::Simple::SHORT_CODES.should eq("ck")
13
+ end
14
+
15
+ it "translates to wookie" do
16
+ @dialect.to_wookie(@english).should eq(@wookie)
17
+ end
18
+
19
+ it "translates back to english" do
20
+ @dialect.from_wookie(@wookie).should eq(@english)
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe Wookie::Translator do
5
+ before do
6
+ @english = 'enter your text here!'
7
+ @wookie = 'wowhaoworc rooohurc aowokao acworcwo!'
8
+ end
9
+
10
+ it "should load the default dialect, if not otherwise specified" do
11
+ t = Wookie::Translator.new
12
+ t.to_wookie(@english).should eq(@wookie)
13
+ t.from_wookie(@wookie).should eq(@english)
14
+ end
15
+
16
+ it "should translate with the simple default dialect (hash form)" do
17
+ t = Wookie::Translator.new dialect: Wookie::Dialect::Simple
18
+ t.to_wookie(@english).should eq(@wookie)
19
+ t.from_wookie(@wookie).should eq(@english)
20
+ end
21
+
22
+ it "should raise a NotImplementedError if using an incomplete dialect" do
23
+ t = Wookie::Translator.new dialect: Wookie::Dialect::Base
24
+ expect {
25
+ t.to_wookie(@english).should eq(@wookie)
26
+ }.to raise_error(NotImplementedError)
27
+ expect {
28
+ t.from_wookie(@wookie).should eq(@english)
29
+ }.to raise_error(NotImplementedError)
30
+ end
31
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/wookie', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Dominik Menke\n"]
6
+ gem.email = ['wookie-translator@dmke.org']
7
+ gem.description = 'Translates an english string to wookie speak and vice versa.'
8
+ gem.summary = gem.description
9
+ gem.homepage = 'https://github.com/dmke/wookie-translator'
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = 'wookie-translator'
15
+ gem.require_paths = ['lib']
16
+ gem.version = Wookie::VERSION
17
+
18
+ gem.add_development_dependency 'rspec', '~> 2.0'
19
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: wookie-translator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - ! 'Dominik Menke
9
+
10
+ '
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+ date: 2012-03-31 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rspec
18
+ requirement: &18289820 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: '2.0'
24
+ type: :development
25
+ prerelease: false
26
+ version_requirements: *18289820
27
+ description: Translates an english string to wookie speak and vice versa.
28
+ email:
29
+ - wookie-translator@dmke.org
30
+ executables:
31
+ - wookie
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - .gitignore
36
+ - .rbenv-gemsets
37
+ - .rbenv-version
38
+ - .rspec
39
+ - .yardopts
40
+ - Gemfile
41
+ - README.md
42
+ - Rakefile
43
+ - bin/wookie
44
+ - lib/wookie.rb
45
+ - lib/wookie/cli.rb
46
+ - lib/wookie/dialect.rb
47
+ - lib/wookie/dialects/simple.rb
48
+ - lib/wookie/translator.rb
49
+ - spec/spec_helper.rb
50
+ - spec/wookie/identity_dialect_spec.rb
51
+ - spec/wookie/simple_dialect_spec.rb
52
+ - spec/wookie/translator_spec.rb
53
+ - wookie-translator.gemspec
54
+ homepage: https://github.com/dmke/wookie-translator
55
+ licenses: []
56
+ post_install_message:
57
+ rdoc_options: []
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ segments:
67
+ - 0
68
+ hash: 785250080120456516
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ! '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ segments:
76
+ - 0
77
+ hash: 785250080120456516
78
+ requirements: []
79
+ rubyforge_project:
80
+ rubygems_version: 1.8.11
81
+ signing_key:
82
+ specification_version: 3
83
+ summary: Translates an english string to wookie speak and vice versa.
84
+ test_files:
85
+ - spec/spec_helper.rb
86
+ - spec/wookie/identity_dialect_spec.rb
87
+ - spec/wookie/simple_dialect_spec.rb
88
+ - spec/wookie/translator_spec.rb