wookie-translator 0.1.0

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.
@@ -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